Import ClientFlow production v4928.1.5.132.4
This commit is contained in:
@@ -105,16 +105,28 @@ def jasmin_document_lifecycle(item: Dict[str, Any]) -> Dict[str, Any]:
|
||||
if isinstance(line, dict)
|
||||
).strip()
|
||||
text_blob = " ".join([status_desc, status_code, line_status]).casefold()
|
||||
external_type = _as_text(item.get("external_type"))
|
||||
is_invoice = external_type == "jasmin_invoice"
|
||||
is_deleted = _field_bool(record, "isDeleted", "deleted")
|
||||
is_draft = _field_bool(record, "isDraft")
|
||||
is_completed = _field_bool(record, "statusWasCompleted", "wasCompleted", "completed")
|
||||
# Quotations/proformas must be open because importing an old converted quote
|
||||
# can replace the active proposal. Invoices are different: a valid issued
|
||||
# invoice may be Open, Completed or Paid and still belongs as a downstream
|
||||
# document of the same process. Only destructive/cancelled invoice states
|
||||
# should block operator association.
|
||||
closed_terms = {
|
||||
"closed", "close", "fechado", "fechada", "completed", "complete", "concluido", "concluído",
|
||||
"concluida", "concluída", "converted", "convertido", "convertida", "cancelled", "canceled",
|
||||
"cancelado", "cancelada", "anulado", "anulada", "void", "deleted", "apagado", "apagada",
|
||||
}
|
||||
invoice_block_terms = {
|
||||
"cancelled", "canceled", "cancelado", "cancelada", "anulado", "anulada",
|
||||
"void", "deleted", "apagado", "apagada",
|
||||
}
|
||||
open_terms = {"open", "aberto", "aberta", "active", "ativo", "ativa"}
|
||||
has_closed_term = any(term in text_blob for term in closed_terms)
|
||||
has_invoice_block_term = any(term in text_blob for term in invoice_block_terms)
|
||||
has_open_term = any(term in text_blob for term in open_terms)
|
||||
# In Jasmin quotations observed in production, documentStatus=1 +
|
||||
# documentStatusDescription=Open means valid/open. Keep code 1 as a weak
|
||||
@@ -123,16 +135,23 @@ def jasmin_document_lifecycle(item: Dict[str, Any]) -> Dict[str, Any]:
|
||||
invalid_reasons: List[str] = []
|
||||
if is_deleted:
|
||||
invalid_reasons.append("deleted")
|
||||
if is_completed:
|
||||
invalid_reasons.append("completed")
|
||||
if has_closed_term:
|
||||
invalid_reasons.append("closed_status")
|
||||
if is_draft:
|
||||
invalid_reasons.append("draft")
|
||||
if is_invoice:
|
||||
if has_invoice_block_term:
|
||||
invalid_reasons.append("cancelled_or_void_invoice")
|
||||
else:
|
||||
if is_completed:
|
||||
invalid_reasons.append("completed")
|
||||
if has_closed_term:
|
||||
invalid_reasons.append("closed_status")
|
||||
is_open = (has_open_term or code_open) and not invalid_reasons
|
||||
is_valid = is_open and _as_text(item.get("external_type")) in {"jasmin_quotation", "jasmin_proforma"}
|
||||
is_valid = (
|
||||
(external_type in {"jasmin_quotation", "jasmin_proforma"} and is_open)
|
||||
or (is_invoice and not invalid_reasons)
|
||||
)
|
||||
if not is_valid and not invalid_reasons:
|
||||
invalid_reasons.append("not_open_or_not_quotation")
|
||||
invalid_reasons.append("not_open_or_supported_jasmin_document")
|
||||
label = status_desc or ("Open" if is_open else "Unknown")
|
||||
return {
|
||||
"status_label": label,
|
||||
@@ -559,10 +578,11 @@ def find_jasmin_document_candidates_for_opportunity(opportunity_id: str, *, limi
|
||||
|
||||
# If the opportunity already has a Jasmin quotation/proforma, do not show
|
||||
# older/equal still-open quotations as actionable candidates. They caused
|
||||
# operators to import ORC.137 after ORC.158 already existed. Newer valid
|
||||
# documents still appear as replacement candidates.
|
||||
# operators to import ORC.137 after ORC.158 already existed. Downstream
|
||||
# invoices are not replacement proposals; keep them visible so operators
|
||||
# can associate the issued invoice to the same process.
|
||||
recency_key = _jasmin_item_recency_tuple(item)
|
||||
if current_latest_key and recency_key <= current_latest_key:
|
||||
if _as_text(item.get("external_type")) in {"jasmin_quotation", "jasmin_proforma"} and current_latest_key and recency_key <= current_latest_key:
|
||||
hidden_old_count += 1
|
||||
continue
|
||||
|
||||
|
||||
Reference in New Issue
Block a user