import { describe, expect, it } from "vitest"; import { runAddressDecomposeStage } from "../src/services/address_runtime/decomposeStage"; describe("address follow-up temporal regressions", () => { it("replaces VAT month-only follow-up with the previous follow-up year", () => { const result = runAddressDecomposeStage("а на март", { previous_intent: "vat_payable_confirmed_as_of_date", previous_filters: { period_from: "2019-05-01", period_to: "2019-05-31", as_of_date: "2019-05-31" }, previous_anchor_type: "unknown", previous_anchor_value: null }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("vat_payable_confirmed_as_of_date"); expect(result?.filters.extracted_filters.period_from).toBe("2019-03-01"); expect(result?.filters.extracted_filters.period_to).toBe("2019-03-31"); expect(result?.filters.extracted_filters.as_of_date).toBe("2019-03-31"); expect(result?.baseReasons).toContain("period_derived_from_followup_context_year"); }); it("replaces VAT month-only follow-up with a later month from the same inherited year", () => { const result = runAddressDecomposeStage("на сентябрь", { previous_intent: "vat_payable_confirmed_as_of_date", previous_filters: { period_from: "2019-05-01", period_to: "2019-05-31", as_of_date: "2019-05-31" }, previous_anchor_type: "unknown", previous_anchor_value: null }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("vat_payable_confirmed_as_of_date"); expect(result?.filters.extracted_filters.period_from).toBe("2019-09-01"); expect(result?.filters.extracted_filters.period_to).toBe("2019-09-30"); expect(result?.filters.extracted_filters.as_of_date).toBe("2019-09-30"); expect(result?.baseReasons).toContain("period_derived_from_followup_context_year"); }); it("inherits the previous VAT period for 'за этот период' follow-up", () => { const result = runAddressDecomposeStage("какой НДС мы должны примерно заплатить за этот период", { previous_intent: "vat_payable_confirmed_as_of_date", previous_filters: { period_from: "2017-05-01", period_to: "2017-05-31", as_of_date: "2017-05-31" }, previous_anchor_type: "unknown", previous_anchor_value: null }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("vat_payable_confirmed_as_of_date"); expect(result?.filters.extracted_filters.period_from).toBe("2017-05-01"); expect(result?.filters.extracted_filters.period_to).toBe("2017-05-31"); expect(result?.filters.extracted_filters.as_of_date).toBe("2017-05-31"); expect(result?.baseReasons).toContain("period_from_from_followup_context"); }); it("keeps inherited period when a follow-up retargets from receivables into VAT for the same period", () => { const result = runAddressDecomposeStage("а какой НДС мы должны примерно заплатить за этот период", { previous_intent: "receivables_confirmed_as_of_date", target_intent: "vat_payable_confirmed_as_of_date", previous_filters: { period_from: "2017-05-01", period_to: "2017-05-31", as_of_date: "2017-05-31" }, previous_anchor_type: "organization", previous_anchor_value: 'ООО "Альтернатива Плюс"' }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("vat_payable_confirmed_as_of_date"); expect(result?.filters.extracted_filters.period_from).toBe("2017-05-01"); expect(result?.filters.extracted_filters.period_to).toBe("2017-05-31"); expect(result?.filters.extracted_filters.as_of_date).toBe("2017-05-31"); }); it("uses follow-up target intent for short debt mirror like 'а нам?'", () => { const result = runAddressDecomposeStage("а нам?", { previous_intent: "payables_confirmed_as_of_date", target_intent: "receivables_confirmed_as_of_date", previous_filters: { as_of_date: "2026-04-16" }, previous_anchor_type: "organization", previous_anchor_value: 'ООО "Альтернатива Плюс"' }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("receivables_confirmed_as_of_date"); expect(result?.filters.extracted_filters.as_of_date).toBe("2026-04-16"); }); it("keeps same-date inventory pivot anchored to the previous VAT date", () => { const result = runAddressDecomposeStage("какие остатки по складу на эту же дату", { previous_intent: "vat_payable_confirmed_as_of_date", previous_filters: { period_from: "2019-09-01", period_to: "2019-09-30", as_of_date: "2019-09-30" }, previous_anchor_type: "unknown", previous_anchor_value: null }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("inventory_on_hand_as_of_date"); expect(result?.filters.extracted_filters.as_of_date).toBe("2019-09-30"); expect(result?.filters.extracted_filters.warehouse).toBeUndefined(); expect(result?.baseReasons).toContain("as_of_date_from_followup_context"); }); });