Consolidate bank analyzer bank selection and classification updates

This commit is contained in:
A R R R Associates
2026-07-13 13:52:41 +05:30
parent 31f7c8fd3e
commit afb098aa75
5 changed files with 518 additions and 113 deletions
+57 -10
View File
@@ -1,6 +1,5 @@
from __future__ import annotations
import shutil
from pathlib import Path
from fastapi import APIRouter, File, Form, Request, UploadFile
@@ -13,6 +12,8 @@ from app.core.security.csrf import get_or_create_csrf_token, validate_csrf
from app.core.security.session_auth import get_current_user
from app.core.templating import templates
from app.modules.core.rbac.deps import get_user_permissions, get_user_roles
from .parsers.registry import BANK_OPTIONS
from .service import can_use, create_job, save_uploads, analyze_job, resolve_owned_job, delete_job
router = APIRouter(prefix="/tools/bank-statement-analyzer", tags=["bank-statement-analyzer-ui"])
@@ -26,6 +27,10 @@ def _ctx(request, db, user, **extra):
"current_user_permissions": get_user_permissions(db, user.id),
"csrf_token": get_or_create_csrf_token(request),
"title": "Bank Statement Analyzer",
"bank_options": BANK_OPTIONS,
"selected_bank": "auto",
"financial_year": "",
"classification_enabled": True,
}
data.update(extra)
return data
@@ -48,15 +53,29 @@ def index(request: Request):
user, roles, denied = _auth(request, db)
if denied:
return denied
return templates.TemplateResponse("modules/bank_statement_analyzer/templates/bank_statement_analyzer/index.html", _ctx(request, db, user, error=""))
return templates.TemplateResponse(
"modules/bank_statement_analyzer/templates/bank_statement_analyzer/index.html",
_ctx(request, db, user, error=""),
)
finally:
db.close()
@router.post("/analyze")
async def analyze(request: Request, csrf_token: str = Form(...), customer_name: str = Form(""), account_number: str = Form(""), statements: list[UploadFile] = File(...)):
async def analyze(
request: Request,
csrf_token: str = Form(...),
bank_selection: str = Form("auto"),
financial_year: str = Form(""),
customer_name: str = Form(""),
account_number: str = Form(""),
enable_classification: str | None = Form(None),
statements: list[UploadFile] = File(...),
):
db = CommonSessionLocal()
job_dir: Path | None = None
selected_bank = bank_selection if bank_selection in dict(BANK_OPTIONS) else "auto"
classification_enabled = enable_classification == "1"
try:
user, roles, denied = _auth(request, db)
if denied:
@@ -65,16 +84,39 @@ async def analyze(request: Request, csrf_token: str = Form(...), customer_name:
job_id, input_dir, output_dir = create_job(user, roles)
job_dir = input_dir.parent
paths = await save_uploads(statements, input_dir)
summary = analyze_job(user=user, roles=roles, job_id=job_id, paths=paths, output_dir=output_dir, customer_override=customer_name, account_override=account_number)
return templates.TemplateResponse("modules/bank_statement_analyzer/templates/bank_statement_analyzer/result.html", _ctx(request, db, user, summary=summary))
summary = analyze_job(
user=user,
roles=roles,
job_id=job_id,
paths=paths,
output_dir=output_dir,
customer_override=customer_name,
account_override=account_number,
bank_selection=selected_bank,
financial_year=financial_year,
classification_enabled=classification_enabled,
)
return templates.TemplateResponse(
"modules/bank_statement_analyzer/templates/bank_statement_analyzer/result.html",
_ctx(request, db, user, summary=summary),
)
except Exception as exc:
if job_dir and job_dir.exists():
# Failed jobs are retained for the configured short retention period for troubleshooting/retry.
pass
user = get_current_user(request, db=db)
if not user:
return RedirectResponse("/login", status_code=303)
return templates.TemplateResponse("modules/bank_statement_analyzer/templates/bank_statement_analyzer/index.html", _ctx(request, db, user, error=str(exc)), status_code=400)
return templates.TemplateResponse(
"modules/bank_statement_analyzer/templates/bank_statement_analyzer/index.html",
_ctx(
request,
db,
user,
error=str(exc),
selected_bank=selected_bank,
financial_year=financial_year,
classification_enabled=classification_enabled,
),
status_code=400,
)
finally:
db.close()
@@ -93,7 +135,12 @@ def download(job_id: str, request: Request):
output = job / "Output" / meta["output_file"]
if not output.is_file():
return not_found_response(request, "Analysis workbook not found.")
return FileResponse(path=output, filename="Bank_Statement_Analysis.xlsx", media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", background=BackgroundTask(delete_job, job))
return FileResponse(
path=output,
filename="Bank_Statement_Analysis.xlsx",
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
background=BackgroundTask(delete_job, job),
)
finally:
db.close()