{% extends "ui/templates/base/layout.html" %} {% block content %}

Bank Statement Analyzer

Upload supported PDF statements. Up to three analyses run globally at one time; additional jobs are queued safely.

My Analysis Jobs
{% if error %}
Analysis could not be submitted.
{{ error }}
{% endif %}
Automatic layout detection

The validated template engine runs first. Existing bank-specific parsers are used automatically when the layout template cannot be reconciled.

Queue limits
Maximum three processing jobs across all users. Each user may have up to three queued or processing jobs. Completed workbooks remain available for 24 hours.
{% if active_job %}

Current Analysis

You may leave this page. The job continues in the background.

{{ active_job.status|title }}
Files
{{ active_job.file_count }}
Queue position
{{ active_job.queue_position or '—' }}
Estimated wait
{{ active_job.estimated_wait or '—' }}
Progress
{{ active_job.progress_percent }}%
{% if active_job.status == 'completed' %}

Analysis completed

Statements
{{ active_job.summary.statement_count or 0 }}
Transactions extracted
{{ active_job.summary.rows_extracted or 0 }}
Exact duplicates
{{ active_job.summary.exact_duplicate_rows or 0 }}
Review items
{{ active_job.summary.review_items or 0 }}

The workbook remains available until {{ active_job.expires_at or '24 hours after completion' }}.

{% elif active_job.status == 'failed' %}
Analysis failed.
{{ active_job.error_message }}
Analyze another statement
{% else %}
{% if active_job.status == 'queued' %}Your job is queued. You may safely leave this page and return through My Analysis Jobs.{% else %}Your statements are being processed.{% endif %}
{% endif %}
{% endif %} {% if recent_jobs %}

Recent Analyses

View all
{% for item in recent_jobs %}{% endfor %}
SubmittedBankFilesStatusAction
{{ item.submitted_at }}{{ item.selected_bank|replace('_',' ')|title }}{{ item.file_count }}{{ item.status|title }}{% if item.queue_position %} · Position {{ item.queue_position }}{% endif %}View
{% endif %}
{% if active_job and active_job.status in ['queued','processing'] %}{% endif %} {% endblock %}