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

Bank Statement Analyzer

Upload any number of PDF statements for the same client and choose how the same Bank Analyzer should be used: Analyze Only, Prepare Accounting Entries, or Bank Reconciliation. Multi-bank statements are analysed together for conservative contra detection; existing analysis/export behaviour remains available.

My Analysis Jobs
{% if error %}
Analysis could not be submitted.
{{ error }}
{% endif %}
Purpose of this bank run

Accounting Entries and Bank Reconciliation require an ERP client. Analyze Only can still be used as a standalone job.

{% if analyzer_clients %}

When a client is selected, the analyzer validates every statement owner against the client name, trade name, business-unit names, registration legal/trade names and branch names. On successful analysis, newly uploaded source PDFs and the generated workbook are archived using the existing Engagement Documents storage pipeline. Previously stored PDFs selected for reuse remain linked to their existing document/version and are not duplicated.

{% endif %}

Keep Auto Detect or select a bank for direct parser validation.

Multi-bank contra detection: when the client has more than one bank account, upload all relevant statements in the same analysis job. There is no fixed statement-count limit unless your administrator configures one. The analyzer pairs only conservative equal-and-opposite transfers across different account numbers and keeps every pair reviewable.

Select any number of new statements. They can be combined with previously stored statements below.

Reuse bank statements already stored for this client

Existing BANK_STATEMENT documents are reused from Engagement Documents/local storage and are not archived again as duplicates.

{% for row in stored_bank_statements or [] %} {% else %}
Select an ERP client to load previously stored bank statements.
{% endfor %}
Queue limits
Maximum three processing jobs across all users. Each user may have up to three queued or processing jobs. Completed workbooks and original uploaded statements remain available for 24 hours. Failed-job statements are also retained for 24 hours for debugging.
{% 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 }}
Inter-bank contra pairs
{{ active_job.summary.contra_pairs or 0 }}
{% if active_job.summary.stored_statement_reuse_count %}
Reused {{ active_job.summary.stored_statement_reuse_count }} statement(s) from existing Engagement Documents without creating duplicate source documents.
{% endif %}{% if active_job.summary.statement_overlap_warnings %}
Overlapping statement periods detected
{% for warning in active_job.summary.statement_overlap_warnings %}
{{ warning.message }}
{% endfor %}
Transactions are still deduplicated by the existing analyzer rules; verify overlapping-period coverage before reconciliation.
{% endif %}
Download Excel{% for file in active_job.original_files %}Download Statement {{ file.index }}{% endfor %}Analyze Another Bank

The workbook and original statement{{ 's' if active_job.file_count != 1 else '' }} remain available until {{ active_job.expires_at or '24 hours after completion' }}.

{% elif active_job.status == 'failed' %}
Analysis failed.
{{ active_job.error_message }}
{% if active_job.original_files %}
{% for file in active_job.original_files %}Download Statement {{ file.index }}{% endfor %}

Original statement{{ 's are' if active_job.file_count != 1 else ' is' }} retained until {{ active_job.expires_at or '24 hours after failure' }} for debugging.

{% endif %}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 %} {% if active_job.status == 'completed' and active_job.purpose in ['accounting_entries','bank_reconciliation'] %}
Accounting import: {{ active_job.accounting_import_status|replace('_',' ')|title }}{% if active_job.summary.client_id %} · Open accounting queue{% 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 %}