242 lines
12 KiB
TypeScript
242 lines
12 KiB
TypeScript
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");
|
||
});
|
||
});
|