АРЧ АП11 - Архитектура после регресса: Архитектура: сделать confirmed payables и receivables snapshots business-first без нумерованного report framing

This commit is contained in:
2026-04-18 16:09:55 +03:00
parent 49f291a14b
commit 53e9151d5a
5 changed files with 287 additions and 119 deletions
@@ -509,10 +509,10 @@ describe("address compose stage utf8 headers", () => {
);
expect(reply.responseType).toBe("FACTUAL_LIST");
expect(reply.text).toContain("Итого по предварительному срезу открытых договоров");
expect(reply.text).toContain("Блок 1. Статус результата");
expect(reply.text).toContain("Результат: предварительный список договоров с возможными незакрытыми расчетами.");
expect(reply.text).toContain("Блок 4. Основной список (коммерческие договоры)");
expect(reply.text).toContain("Коротко: по предварительному срезу открытых договоров");
expect(reply.text).toContain("Это shortlist на проверку");
expect(reply.text).toContain("Основной список (коммерческие договоры)");
expect(reply.text).not.toContain("Блок 1");
expect(reply.semantics?.result_mode).toBe("heuristic_candidates");
expect(reply.semantics?.balance_confirmed).toBe(false);
});
@@ -539,12 +539,13 @@ describe("address compose stage utf8 headers", () => {
);
expect(reply.responseType).toBe("FACTUAL_LIST");
expect(reply.text).toContain("Собран подтвержденный срез открытых договоров");
expect(reply.text).toContain("Результат: подтвержденный срез договоров с открытыми взаиморасчетами на дату.");
expect(reply.text).toContain("Управленческий вид: по каждому договору показаны чистый остаток и состав по типам открытых расчетов.");
expect(reply.text).toContain("Базовая единица детализации: одна строка = один договор, один контрагент и один тип открытого остатка.");
expect(reply.text).toContain("Блок 4. Чистый открытый остаток по договорам");
expect(reply.text).toContain("Блок 6. Коммерческие кредиторские компоненты");
expect(reply.text).toContain("Коротко: на 31.03.2020 подтверждено открытых договоров");
expect(reply.text).toContain("Это подтвержденный срез договоров с открытыми взаиморасчетами на дату.");
expect(reply.text).toContain("По каждому договору показаны чистый остаток и состав по типам открытых расчетов.");
expect(reply.text).toContain("Одна строка = один договор, один контрагент и один тип открытого остатка.");
expect(reply.text).toContain("Чистый открытый остаток по договорам");
expect(reply.text).toContain("Коммерческие кредиторские компоненты");
expect(reply.text).not.toContain("Блок 1");
expect(reply.semantics?.result_mode).toBe("confirmed_balance");
expect(reply.semantics?.balance_confirmed).toBe(true);
});
@@ -586,15 +587,74 @@ describe("address compose stage utf8 headers", () => {
}
);
expect(reply.text).toContain("Блок 4. Чистый открытый остаток по договорам");
expect(reply.text).toContain("Блок 5. Коммерческие дебиторские компоненты");
expect(reply.text).toContain("Блок 6. Коммерческие кредиторские компоненты");
expect(reply.text).toContain("Блок 10. Спорные/некачественно нормализованные позиции");
expect(reply.text).toContain("Чистый открытый остаток по договорам");
expect(reply.text).toContain("Коммерческие дебиторские компоненты");
expect(reply.text).toContain("Коммерческие кредиторские компоненты");
expect(reply.text).toContain("Спорные и некачественно нормализованные позиции");
expect(reply.text).not.toContain("Блок 1");
expect(reply.text).toContain("брутто компонентов");
expect(reply.text).not.toContain("счета: 62.01; 0");
expect(reply.text).toContain("договор не похож на устойчивый договорный реквизит");
});
it("renders confirmed payables snapshot business-first without numbered report framing", () => {
const reply = composeFactualReply(
"payables_confirmed_as_of_date",
[
{
period: "2020-05-31T23:59:59Z",
registrator: "Остатки на дату",
account_dt: "",
account_kt: "60.01",
amount: 125000,
analytics: ["ООО Ромашка", "Договор №19/15"]
}
],
{
asOfDate: "2020-05-31",
useRubCurrency: true
}
);
expect(reply.responseType).toBe("FACTUAL_LIST");
expect(reply.text).toContain("Коротко: подтвержденный долг к оплате на 31.05.2020");
expect(reply.text).toContain("Это подтвержденный срез обязательств к оплате");
expect(reply.text).toContain("Что учтено");
expect(reply.text).toContain("Сводка");
expect(reply.text).toContain("Категории обязательств");
expect(reply.text).toContain("Подтвержденные позиции к оплате");
expect(reply.text).not.toContain("Блок 1");
});
it("renders confirmed receivables snapshot business-first without numbered report framing", () => {
const reply = composeFactualReply(
"receivables_confirmed_as_of_date",
[
{
period: "2020-05-31T23:59:59Z",
registrator: "Остатки на дату",
account_dt: "62.01",
account_kt: "",
amount: 84000,
analytics: ["ООО Ромашка", "Договор №19/15"]
}
],
{
asOfDate: "2020-05-31",
useRubCurrency: true
}
);
expect(reply.responseType).toBe("FACTUAL_LIST");
expect(reply.text).toContain("Коротко: подтвержденная дебиторская задолженность на 31.05.2020");
expect(reply.text).toContain("Это подтвержденный срез дебиторской задолженности");
expect(reply.text).toContain("Что учтено");
expect(reply.text).toContain("Сводка");
expect(reply.text).toContain("Категории дебиторской задолженности");
expect(reply.text).toContain("Подтвержденные позиции к получению");
expect(reply.text).not.toContain("Блок 1");
});
it("renders period coverage summary for management profile intent", () => {
const reply = composeFactualReply("period_coverage_profile", [
{
@@ -3284,12 +3344,13 @@ describe("address query limited taxonomy and stage diagnostics", { timeout: 1500
expect(reply.toLowerCase()).toContain("shortlist");
} else {
expect(result?.debug.balance_confirmed).toBe(true);
expect(reply).toContain("Итого подтвержденный долг");
expect(reply).toMatch(/Блок\s+(?:\*\*1\*\*|1)\.\s+Статус результата/u);
expect(reply).toMatch(/\n\nБлок\s+(?:\*\*2\*\*|2)\.\s+Что учтено/u);
expect(reply).toMatch(/\n\nБлок\s+(?:\*\*3\*\*|3)\.\s+Сводка/u);
expect(reply).toMatch(/\n\nБлок\s+(?:\*\*4\*\*|4)\.\s+Категории обязательств/u);
expect(reply).toMatch(/\n\nБлок\s+(?:\*\*5\*\*|5)\.\s+Подтвержденные позиции к оплате/u);
expect(reply).toContain("Коротко: подтвержденный долг к оплате");
expect(reply).toContain("Это подтвержденный срез обязательств к оплате");
expect(reply).toMatch(/\n\nЧто учтено/u);
expect(reply).toMatch(/\n\nСводка/u);
expect(reply).toMatch(/\n\nКатегории обязательств/u);
expect(reply).toMatch(/\n\nПодтвержденные позиции к оплате/u);
expect(reply).not.toContain("Блок 1");
expect(reply).not.toContain("эвристический");
}
});