Этап 4 добивка двух хвостов: settlement polarity и чистое разделение month_close / RBP в live acceptance

This commit is contained in:
2026-03-29 16:30:10 +03:00
parent f74e7b697a
commit c82ebd70b7
12 changed files with 705 additions and 19 deletions
@@ -848,12 +848,25 @@ export function resolveDomainPolarityGuard(input: {
(/(?:сч[её]т\s*62|по\s*62|счет\s*62|РїРѕ\s*62)/i.test(lower) ? 1 : 0);
let polarity: DomainPolarity = "mixed_or_unresolved";
if (supplierScore > 0 && customerScore === 0) {
polarity = "supplier_payable";
} else if (customerScore > 0 && supplierScore === 0) {
polarity = "customer_receivable";
if (supplierScore > 0 || customerScore > 0) {
if (supplierScore >= customerScore + 2) {
polarity = "supplier_payable";
} else if (customerScore >= supplierScore + 2) {
polarity = "customer_receivable";
} else if (prefixes.has("60") && !prefixes.has("62")) {
polarity = "supplier_payable";
} else if (prefixes.has("62") && !prefixes.has("60")) {
polarity = "customer_receivable";
}
}
const unresolved = polarity === "mixed_or_unresolved";
const reasonCodes = unresolved ? ["unresolved_supplier_customer_polarity"] : [];
if (unresolved && supplierScore > 0 && customerScore > 0) {
reasonCodes.push("supplier_customer_signals_conflict");
}
if (unresolved && supplierScore === 0 && customerScore === 0) {
reasonCodes.push("supplier_customer_signals_absent");
}
return {
applied: true,
polarity,
@@ -868,7 +881,7 @@ export function resolveDomainPolarityGuard(input: {
rejected_problem_units: 0,
rejected_evidence: 0,
critical_contradiction: unresolved,
reason_codes: unresolved ? ["unresolved_supplier_customer_polarity"] : []
reason_codes: uniqueStrings(reasonCodes)
};
}