Add live progress for historical Purchase and Sales sync

This commit is contained in:
A R R R Associates
2026-08-23 12:00:21 +05:30
parent 6910b5b6b5
commit 4c6546f48d
5 changed files with 348 additions and 3 deletions
@@ -4,7 +4,7 @@ import json
from datetime import date, datetime, timezone
from fastapi import APIRouter, Form, Request
from fastapi.responses import RedirectResponse
from fastapi.responses import JSONResponse, RedirectResponse
from sqlalchemy import select
from app.core.db.common import CommonSessionLocal
@@ -14,6 +14,7 @@ from app.modules.accounting.historical_learning_models import AccountingHistoric
from app.modules.accounting.historical_learning_service import active_natures, classifiable_ledgers, evidence_rows, ingest_completed_run, ledger_mappings, party_suggestions, remove_ledger_mapping, save_ledger_mapping
from app.modules.accounting.ui import _accounting_storage_payload, _find_visible_client, _require_partner, _visible_clients
from app.modules.accounting.historical_sync_support import eligible_tally_workstations, resolve_workstation_company, workstation_companies
from app.modules.accounting.historical_progress import historical_run_status
from app.modules.core.rbac.deps import get_user_permissions, get_user_roles
from app.modules.core.rbac.permission_guard import require_permission
from app.modules.documents.agent_jobs import enqueue_agent_job
@@ -60,7 +61,7 @@ def historical_learning(request: Request, client_id: int | None=None, collected:
return templates.TemplateResponse("modules/accounting/templates/accounting/historical_learning.html", {
"request":request,"current_user":user,"current_user_roles":get_user_roles(db,user.id),"current_user_permissions":get_user_permissions(db,user.id),"csrf_token":get_or_create_csrf_token(request),
"title":"Historical Tally Learning","clients":clients,"selected_client":selected,"workstations":workstations,"workstation_companies":{w.id:workstation_companies(w) for w in workstations},
"runs":runs,"evidence":evid,"classifiable_ledgers":ledgers,"suggestions":suggestions,"mappings":mappings,"natures":active_natures(db,scope.tenant_id),
"runs":runs,"latest_run":runs[0] if runs else None,"evidence":evid,"classifiable_ledgers":ledgers,"suggestions":suggestions,"mappings":mappings,"natures":active_natures(db,scope.tenant_id),
"date_from":df,"date_to":dt,"collected":bool(collected),"mapped":bool(mapped),"error":error,
})
finally: db.close()
@@ -128,3 +129,30 @@ def unmap_ledger(request: Request, client_id: int=Form(...), mapping_id: int=For
remove_ledger_mapping(db,tenant_id=scope.tenant_id,client_id=client.id,mapping_id=mapping_id)
return RedirectResponse(url=f"/tools/accounting/historical-learning?client_id={client_id}",status_code=303)
finally: db.close()
@router.get("/run/{run_id}/status")
def run_status(request: Request, run_id: int):
db = CommonSessionLocal()
try:
user, response = _require_partner(request, db, "accounting.learning.view")
if response:
return JSONResponse({"ok": False, "error": "Access denied."}, status_code=403)
clients, scope = _visible_clients(db, request, user)
visible_client_ids = {int(c.id) for c in clients}
run = db.get(AccountingHistoricalLearningRun, int(run_id))
if (
not run
or int(run.tenant_id) != int(scope.tenant_id)
or int(run.client_id) not in visible_client_ids
):
return JSONResponse({"ok": False, "error": "Historical Purchase run not found."}, status_code=404)
if run.status not in {"completed", "failed"}:
ingest_completed_run(db, run)
return JSONResponse({"ok": True, **historical_run_status(db, run)})
finally:
db.close()