Implement document reconciliation v2

This commit is contained in:
plx
2026-08-05 23:55:33 +00:00
parent 4a60607503
commit 29382ec6c1
25 changed files with 2082 additions and 343 deletions

View File

@@ -141,35 +141,23 @@ def get_workflow_context(opportunity_id: str) -> Dict[str, Any]:
WHERE opportunity_id = CAST(:opportunity_id AS UUID)
"""), {"opportunity_id": str(opportunity_id)}).scalar() or 0
jasmin_doc_counts = conn.execute(text("""
SELECT
count(*) FILTER (WHERE document_kind = 'quotation') AS quotation_count,
count(*) FILTER (WHERE document_kind = 'proforma') AS proforma_count,
count(*) FILTER (WHERE document_kind = 'invoice') AS invoice_count,
bool_or(
document_kind = 'invoice'
AND COALESCE(is_active, TRUE) IS TRUE
AND COALESCE(role, 'current') IN ('current','accepted')
AND (
status IN ('sent','issued_sent')
OR COALESCE(payload, '{}'::jsonb) ? 'clientflow_invoice_sent_evidence'
OR COALESCE(payload, '{}'::jsonb) ? 'invoice_sent_at'
)
) AS invoice_sent_evidence
FROM commercial_documents
WHERE opportunity_id = CAST(:opportunity_id AS UUID)
AND system = 'jasmin'
"""), {"opportunity_id": str(opportunity_id)}).mappings().first()
current_invoices = conn.execute(text("""
SELECT id::text, document_number, external_id, status, payload
FROM commercial_documents
WHERE opportunity_id = CAST(:opportunity_id AS UUID)
AND document_kind = 'invoice'
AND COALESCE(is_active, TRUE) IS TRUE
AND COALESCE(role, 'current') IN ('current','accepted','actual','active','')
"""), {"opportunity_id": str(opportunity_id)}).mappings().all()
from app.document_reconciliation_service import resolve_document_links, select_valid_primary
resolved_documents = [row for row in resolve_document_links(str(opportunity_id), conn=conn)
if row.get("system") == "jasmin"]
primaries = [row for row in resolved_documents
if row.get("relationship") == "PRIMARY" and
str(row.get("jasmin_status") or row.get("status") or "").upper() not in {"CANCELLED", "CANCELED"}]
jasmin_doc_counts = {
"quotation_count": sum(row.get("document_kind") == "quotation" for row in primaries),
"proforma_count": sum(row.get("document_kind") == "proforma" for row in primaries),
"invoice_count": sum(row.get("document_kind") == "invoice" for row in primaries),
"invoice_sent_evidence": any(row.get("document_kind") == "invoice" and (
row.get("status") in {"sent", "issued_sent"} or
"clientflow_invoice_sent_evidence" in (row.get("payload") or {}) or
"invoice_sent_at" in (row.get("payload") or {})) for row in primaries),
}
current_primary_invoice = select_valid_primary(resolved_documents, "invoice")
current_invoices = [current_primary_invoice] if current_primary_invoice else []
invoice_tasks = conn.execute(text("""
SELECT id::text, action_code, action, note, status, metadata