Open-World: добавить возрастной сигнал открытых расчетов

This commit is contained in:
2026-05-04 08:52:43 +03:00
parent 7294eca381
commit 9b26bd05ef
9 changed files with 353 additions and 15 deletions
@@ -361,8 +361,8 @@ describe("assistant MCP discovery answer adapter", () => {
},
{
rows: [
{ Period: "2020-12-31T00:00:00", Amount: 100000, Counterparty: "Клиент А", Contract: "Договор А" },
{ Period: "2020-12-31T00:00:00", Amount: 50000, Counterparty: "Поставщик А", Contract: "Договор Б" }
{ Period: "2020-12-31T00:00:00", Amount: 100000, Counterparty: "Клиент А", Contract: "Договор А от 10.02.2019" },
{ Period: "2020-12-31T00:00:00", Amount: 50000, Counterparty: "Поставщик А", Contract: "Договор Б от 15.03.2020" }
]
},
{ rows: [] },
@@ -380,12 +380,16 @@ describe("assistant MCP discovery answer adapter", () => {
expect(draft.headline).toContain("долговой срез");
expect(draft.headline).toContain("качество открытых расчетов");
expect(draft.headline).toContain("возрастной сигнал открытых расчетов");
expect(draft.confirmed_lines.join("\n")).toContain("Долговой срез на 2020-12-31");
expect(draft.confirmed_lines.join("\n")).toContain("Качество открытых расчетов на 2020-12-31");
expect(draft.confirmed_lines.join("\n")).toContain("Возрастной сигнал открытых расчетов");
expect(draft.confirmed_lines.join("\n")).toContain("не due-date анализ");
expect(draft.confirmed_lines.join("\n")).toContain("нетто");
expect(draft.unknown_lines.join("\n")).toContain("due-date");
expect(draft.reason_codes).toContain("answer_contains_business_overview_debt_position");
expect(draft.reason_codes).toContain("answer_contains_business_overview_open_settlement_quality");
expect(draft.reason_codes).toContain("answer_contains_business_overview_debt_age_signal");
expect(draft.must_not_claim).toContain("Do not present a debt-position snapshot as debt aging, overdue debt, or credit-quality analysis.");
expect(draft.must_not_claim).toContain("Do not present open-settlement concentration as contractual due-date aging or confirmed overdue debt.");
});
@@ -326,8 +326,8 @@ describe("assistant MCP discovery pilot executor", () => {
},
{
rows: [
{ Period: "2020-12-31T00:00:00", Amount: 90000, Counterparty: "Клиент А", Contract: "Договор А" },
{ Period: "2020-12-31T00:00:00", Amount: 30000, Counterparty: "Клиент Б", Contract: "Договор Б" }
{ Period: "2020-12-31T00:00:00", Amount: 90000, Counterparty: "Клиент А", Contract: "Договор А от 10.02.2019" },
{ Period: "2020-12-31T00:00:00", Amount: 30000, Counterparty: "Клиент Б", Contract: "Договор Б от 15.03.2020" }
]
},
{ rows: [] },
@@ -368,16 +368,31 @@ describe("assistant MCP discovery pilot executor", () => {
unique_contracts: 2,
concentration_top_contract_pct: 75
});
expect(result.derived_business_overview?.debt_open_settlement_quality?.age_signal).toMatchObject({
contracts_with_start_date: 2,
oldest_start_date: "2019-02-10",
latest_start_date: "2020-03-15",
max_age_days: 690
});
expect(result.derived_business_overview?.debt_open_settlement_quality?.age_signal?.top_aged_contracts[0]).toMatchObject({
contract: "Договор А от 10.02.2019",
start_date: "2019-02-10",
age_days: 690,
total_amount: 90000
});
expect(result.derived_business_overview?.missing_signal_families).not.toContain("debt_position");
expect(result.derived_business_overview?.missing_signal_families).not.toContain("debt_open_settlement_quality");
expect(result.derived_business_overview?.missing_signal_families).toContain("debt_due_date_aging_quality");
expect(result.evidence.confirmed_facts.join("\n")).toContain("Долговая позиция на 2020-12-31");
expect(result.evidence.confirmed_facts.join("\n")).toContain("Качество открытых расчетов на 2020-12-31");
expect(result.evidence.confirmed_facts.join("\n")).toContain("Возрастной сигнал открытых расчетов");
expect(result.evidence.confirmed_facts.join("\n")).toContain("не due-date анализ");
expect(result.evidence.unknown_facts.join("\n")).toContain("due-date");
expect(result.reason_codes).toContain("pilot_business_overview_debt_query_mcp_executed");
expect(result.reason_codes).toContain("pilot_derived_business_overview_debt_position_from_confirmed_rows");
expect(result.reason_codes).toContain("pilot_business_overview_open_contracts_query_mcp_executed");
expect(result.reason_codes).toContain("pilot_derived_business_overview_open_settlement_quality_from_confirmed_rows");
expect(result.reason_codes).toContain("pilot_derived_business_overview_debt_age_signal_from_contract_dates");
expect(deps.executeAddressMcpQuery).toHaveBeenCalledTimes(9);
const receivablesCall = deps.executeAddressMcpQuery.mock.calls[3]?.[0];
const payablesCall = deps.executeAddressMcpQuery.mock.calls[4]?.[0];