import { describe, expect, it } from "vitest"; import { runAddressDecomposeStage } from "../src/services/address_runtime/decomposeStage"; describe("inventory root frame regressions", () => { it("restores inventory root frame for restatement on the same period after foreign domain drift", () => { const result = runAddressDecomposeStage( "ладно ок. покажи мне еще раз позиции на складе на тот же период рассмотрения", { previous_intent: "customer_revenue_and_payments", previous_filters: { organization: "ООО \\Альтернатива Плюс\\" }, previous_anchor_type: "organization", previous_anchor_value: "ООО \\Альтернатива Плюс\\", root_intent: "inventory_on_hand_as_of_date", root_filters: { organization: "ООО \\Альтернатива Плюс\\", period_from: "2022-02-01", period_to: "2022-02-28", as_of_date: "2022-02-28" }, root_anchor_type: "organization", root_anchor_value: "ООО \\Альтернатива Плюс\\", current_frame_kind: "generic" } ); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("inventory_on_hand_as_of_date"); expect(result?.intent.reasons).toContain("intent_restored_to_inventory_root_frame"); expect(result?.filters.extracted_filters.organization).toBe("ООО \\Альтернатива Плюс\\"); expect(result?.filters.extracted_filters.period_from).toBe("2022-02-01"); expect(result?.filters.extracted_filters.period_to).toBe("2022-02-28"); expect(result?.filters.extracted_filters.as_of_date).toBe("2022-02-28"); expect(result?.filters.warnings).toContain("period_from_from_followup_context"); expect(result?.filters.warnings).toContain("period_to_from_followup_context"); }); it("promotes selected-object provenance slang with 'где мы взяли это' into inventory provenance", () => { const result = runAddressDecomposeStage( 'По выбранному объекту "Зеркало для инвалидов поворотное травмобезопасное": где мы взяли это говнище?', { previous_intent: "inventory_on_hand_as_of_date", previous_filters: { organization: "ООО \\Альтернатива Плюс\\", warehouse: "Основной склад", period_from: "2022-02-01", period_to: "2022-02-28", as_of_date: "2022-02-28" }, previous_anchor_type: "unknown", previous_anchor_value: null } ); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("inventory_purchase_provenance_for_item"); expect(result?.filters.extracted_filters.item).toBe("Зеркало для инвалидов поворотное травмобезопасное"); expect( result?.baseReasons?.includes("intent_adjusted_to_inventory_followup_context") || result?.intent.reasons.includes("inventory_selected_object_provenance_signal_detected") ).toBe(true); }); it("does not restore inventory root when the follow-up is an explicit receivables root query", () => { const result = runAddressDecomposeStage("покажи кто нам должен денег на май 2017", { previous_intent: "inventory_sale_trace_for_item", previous_filters: { item: "Четки Пост (84*117)", as_of_date: "2020-05-31", period_from: "2020-05-01", period_to: "2020-05-31" }, previous_anchor_type: "item", previous_anchor_value: "Четки Пост (84*117)", root_intent: "inventory_on_hand_as_of_date", root_filters: { period_from: "2020-05-01", period_to: "2020-05-31", as_of_date: "2020-05-31" }, root_anchor_type: "unknown", root_anchor_value: null, current_frame_kind: "inventory_drilldown" }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("receivables_confirmed_as_of_date"); expect(result?.intent.reasons).not.toContain("intent_restored_to_inventory_root_frame"); expect(result?.filters.extracted_filters.as_of_date).toBe("2017-05-31"); }); it("keeps selected-object loose documents wording in the inventory document contour", () => { const result = runAddressDecomposeStage( 'По выбранному объекту "Четки Пост (84*117)": меня четки интересуют покажи документы все по ним и все операции', { previous_intent: "inventory_on_hand_as_of_date", previous_filters: { as_of_date: "2020-05-31", period_from: "2020-05-01", period_to: "2020-05-31" }, previous_anchor_type: "unknown", previous_anchor_value: null } ); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("inventory_purchase_documents_for_item"); expect(result?.intent.intent).not.toBe("bank_operations_by_counterparty"); expect(result?.filters.extracted_filters.item).toBe("Четки Пост (84*117)"); }); it("restores stock snapshot intent for selected-object restatement on the previously reviewed date", () => { const result = runAddressDecomposeStage( 'По выбранному объекту "Столешница 600*3050*26 альмандин": покажи еще раз остатки на дату которую до этого рассматривали', { previous_intent: "inventory_purchase_documents_for_item", previous_filters: { item: "Столешница 600*3050*26 альмандин", organization: 'ООО "Альтернатива Плюс"', as_of_date: "2019-05-31" }, previous_anchor_type: "item", previous_anchor_value: "Столешница 600*3050*26 альмандин", root_intent: "inventory_on_hand_as_of_date", root_filters: { organization: 'ООО "Альтернатива Плюс"', period_from: "2019-05-01", period_to: "2019-05-31", as_of_date: "2019-05-31" }, root_anchor_type: "organization", root_anchor_value: 'ООО "Альтернатива Плюс"', current_frame_kind: "inventory_drilldown" } ); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("inventory_on_hand_as_of_date"); expect(result?.intent.reasons).toContain("intent_restored_to_inventory_root_frame"); expect(result?.filters.extracted_filters.item).toBe("Столешница 600*3050*26 альмандин"); expect(result?.filters.extracted_filters.organization).toBe('ООО "Альтернатива Плюс"'); expect(result?.filters.extracted_filters.as_of_date).toBe("2019-05-31"); expect(result?.baseReasons).toContain("address_followup_context_applied"); }); it("restores inventory root frame for 'покажи еще раз остатки на эту же дату' after item documents drilldown", () => { const result = runAddressDecomposeStage("покажи еще раз остатки на эту же дату", { previous_intent: "inventory_purchase_documents_for_item", previous_filters: { item: "Столешница 600*3050*26 альмандин", organization: 'ООО "Альтернатива Плюс"', as_of_date: "2021-03-31" }, previous_anchor_type: "item", previous_anchor_value: "Столешница 600*3050*26 альмандин", root_intent: "inventory_on_hand_as_of_date", root_filters: { organization: 'ООО "Альтернатива Плюс"', period_from: "2021-03-01", period_to: "2021-03-31", as_of_date: "2021-03-31" }, root_anchor_type: "organization", root_anchor_value: 'ООО "Альтернатива Плюс"', current_frame_kind: "inventory_drilldown" }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("inventory_on_hand_as_of_date"); expect(result?.intent.reasons).toContain("intent_restored_to_inventory_root_frame"); expect(result?.filters.extracted_filters.organization).toBe('ООО "Альтернатива Плюс"'); expect(result?.filters.extracted_filters.as_of_date).toBe("2021-03-31"); expect(result?.filters.extracted_filters.period_from).toBe("2021-03-01"); expect(result?.filters.extracted_filters.period_to).toBe("2021-03-31"); expect(result?.filters.extracted_filters.item).toBeUndefined(); }); it("restores inventory root frame for root-context-only month follow-up after drilldown", () => { const result = runAddressDecomposeStage("остатки на июль 2019", { previous_filters: { organization: 'ООО "Альтернатива Плюс"', as_of_date: "2020-03-31", period_from: "2020-03-01", period_to: "2020-03-31" }, previous_anchor_type: null, previous_anchor_value: null, root_intent: "inventory_on_hand_as_of_date", root_filters: { organization: 'ООО "Альтернатива Плюс"', as_of_date: "2020-03-31", period_from: "2020-03-01", period_to: "2020-03-31" }, root_context_only: true, current_frame_kind: "inventory_root" }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("inventory_on_hand_as_of_date"); expect(result?.intent.reasons).toContain("intent_restored_to_inventory_root_frame"); expect(result?.filters.extracted_filters.organization).toBe('ООО "Альтернатива Плюс"'); expect(result?.filters.extracted_filters.period_from).toBe("2019-07-01"); expect(result?.filters.extracted_filters.period_to).toBe("2019-07-31"); expect(result?.filters.extracted_filters.as_of_date).toBe("2019-07-31"); }); it("keeps the freshest previous date when inventory root restore follows a receivables step", () => { const result = runAddressDecomposeStage("остатки по складу на эту же дату", { previous_intent: "receivables_confirmed_as_of_date", target_intent: "inventory_on_hand_as_of_date", previous_filters: { organization: 'ООО "Альтернатива Плюс"', as_of_date: "2020-03-31", period_from: "2020-03-01", period_to: "2020-03-31" }, previous_anchor_type: "organization", previous_anchor_value: 'ООО "Альтернатива Плюс"', root_intent: "inventory_on_hand_as_of_date", root_filters: { organization: 'ООО "Альтернатива Плюс"', as_of_date: "2021-03-31", period_from: "2021-03-01", period_to: "2021-03-31" }, root_anchor_type: "organization", root_anchor_value: 'ООО "Альтернатива Плюс"', root_context_only: true, current_frame_kind: "inventory_root" }); expect(result).not.toBeNull(); expect(result?.intent.intent).toBe("inventory_on_hand_as_of_date"); expect(result?.intent.reasons).toContain("intent_restored_to_inventory_root_frame"); expect(result?.filters.extracted_filters.organization).toBe('ООО "Альтернатива Плюс"'); expect(result?.filters.extracted_filters.as_of_date).toBe("2020-03-31"); expect(result?.filters.extracted_filters.period_from).toBe("2020-03-01"); expect(result?.filters.extracted_filters.period_to).toBe("2020-03-31"); }); });