Добавить next action для складской атрибуции поставщика
This commit is contained in:
+7
-3
@@ -4,6 +4,7 @@ exports.composeInventoryReply = composeInventoryReply;
|
||||
const replyContracts_1 = require("./replyContracts");
|
||||
const inventoryReplyPresentation_1 = require("./inventoryReplyPresentation");
|
||||
const INVENTORY_TRACE_EVIDENCE_ROW_LIMIT = 3;
|
||||
const INVENTORY_SUPPLIER_ATTRIBUTION_NEXT_ACTION = "Следующий шаг: чтобы сузить доказательство до партии, проверьте партионный/серийный учет или детализацию по выбранной номенклатуре, поступлению и последующему движению.";
|
||||
function cleanupInventoryRequestedParty(value) {
|
||||
const cleaned = String(value ?? "")
|
||||
.replace(/\s*(?:->|=>|→)\s*(?:товар|позици|номенклатур|покупател|buyer|customer|item|product|sku)[\s\S]*$/iu, "")
|
||||
@@ -519,7 +520,8 @@ function composeInventoryReply(intent, rows, options, deps) {
|
||||
`Поставщиков, выделенных в остальных операциях: ${deps.formatNumberWithDots(observedCounterparties.length)}.`
|
||||
]);
|
||||
(0, inventoryReplyPresentation_1.appendInventoryBulletSection)(lines, "Ограничения:", [
|
||||
"Без партионного учета это проверка доступного закупочного следа по складскому срезу, а не юридическое доказательство владельца каждой партии."
|
||||
"Без партионного учета это проверка доступного закупочного следа по складскому срезу, а не юридическое доказательство владельца каждой партии.",
|
||||
INVENTORY_SUPPLIER_ATTRIBUTION_NEXT_ACTION
|
||||
]);
|
||||
if (unresolvedRows.length > 0) {
|
||||
(0, inventoryReplyPresentation_1.appendInventorySection)(lines, "Опорные документы:", deps.formatInventoryTraceRows(unresolvedRows, unresolvedDocumentPreviewLimit));
|
||||
@@ -556,7 +558,8 @@ function composeInventoryReply(intent, rows, options, deps) {
|
||||
`Закупочных документов / операций в выборке: ${deps.formatNumberWithDots(summary.documents.length)} / ${deps.formatNumberWithDots(purchaseRows.length)}.`
|
||||
]);
|
||||
(0, inventoryReplyPresentation_1.appendInventoryBulletSection)(lines, "Ограничения:", [
|
||||
"Без партионного учета этот ответ показывает закупочный след текущего остатка, но не доказывает владельца каждой конкретной партии."
|
||||
"Без партионного учета этот ответ показывает закупочный след текущего остатка, но не доказывает владельца каждой конкретной партии.",
|
||||
INVENTORY_SUPPLIER_ATTRIBUTION_NEXT_ACTION
|
||||
]);
|
||||
if (observedCounterparties.length > 0) {
|
||||
lines.push(`- Найденные поставщики: ${inventoryPartyLeadList(observedCounterparties)}.`);
|
||||
@@ -586,7 +589,8 @@ function composeInventoryReply(intent, rows, options, deps) {
|
||||
`Закупочных документов / операций в выборке: ${deps.formatNumberWithDots(summary.documents.length)} / ${deps.formatNumberWithDots(purchaseRows.length)}.`
|
||||
]);
|
||||
(0, inventoryReplyPresentation_1.appendInventoryBulletSection)(lines, "Ограничения:", [
|
||||
"Без партионного учета этот ответ показывает закупочный след текущего остатка, но не доказывает владельца каждой конкретной партии."
|
||||
"Без партионного учета этот ответ показывает закупочный след текущего остатка, но не доказывает владельца каждой конкретной партии.",
|
||||
INVENTORY_SUPPLIER_ATTRIBUTION_NEXT_ACTION
|
||||
]);
|
||||
if (observedCounterparties.length > 0) {
|
||||
lines.push(`- Найденные поставщики: ${inventoryPartyLeadList(observedCounterparties)}.`);
|
||||
|
||||
@@ -48,6 +48,8 @@ interface InventoryTraceSummary {
|
||||
}
|
||||
|
||||
const INVENTORY_TRACE_EVIDENCE_ROW_LIMIT = 3;
|
||||
const INVENTORY_SUPPLIER_ATTRIBUTION_NEXT_ACTION =
|
||||
"Следующий шаг: чтобы сузить доказательство до партии, проверьте партионный/серийный учет или детализацию по выбранной номенклатуре, поступлению и последующему движению.";
|
||||
|
||||
interface InventoryAgingByItemAggregate {
|
||||
item: string;
|
||||
@@ -712,7 +714,8 @@ export function composeInventoryReply(
|
||||
`Поставщиков, выделенных в остальных операциях: ${deps.formatNumberWithDots(observedCounterparties.length)}.`
|
||||
]);
|
||||
appendInventoryBulletSection(lines, "Ограничения:", [
|
||||
"Без партионного учета это проверка доступного закупочного следа по складскому срезу, а не юридическое доказательство владельца каждой партии."
|
||||
"Без партионного учета это проверка доступного закупочного следа по складскому срезу, а не юридическое доказательство владельца каждой партии.",
|
||||
INVENTORY_SUPPLIER_ATTRIBUTION_NEXT_ACTION
|
||||
]);
|
||||
if (unresolvedRows.length > 0) {
|
||||
appendInventorySection(
|
||||
@@ -763,7 +766,8 @@ export function composeInventoryReply(
|
||||
`Закупочных документов / операций в выборке: ${deps.formatNumberWithDots(summary.documents.length)} / ${deps.formatNumberWithDots(purchaseRows.length)}.`
|
||||
]);
|
||||
appendInventoryBulletSection(lines, "Ограничения:", [
|
||||
"Без партионного учета этот ответ показывает закупочный след текущего остатка, но не доказывает владельца каждой конкретной партии."
|
||||
"Без партионного учета этот ответ показывает закупочный след текущего остатка, но не доказывает владельца каждой конкретной партии.",
|
||||
INVENTORY_SUPPLIER_ATTRIBUTION_NEXT_ACTION
|
||||
]);
|
||||
if (observedCounterparties.length > 0) {
|
||||
lines.push(`- Найденные поставщики: ${inventoryPartyLeadList(observedCounterparties)}.`);
|
||||
@@ -808,7 +812,8 @@ export function composeInventoryReply(
|
||||
`Закупочных документов / операций в выборке: ${deps.formatNumberWithDots(summary.documents.length)} / ${deps.formatNumberWithDots(purchaseRows.length)}.`
|
||||
]);
|
||||
appendInventoryBulletSection(lines, "Ограничения:", [
|
||||
"Без партионного учета этот ответ показывает закупочный след текущего остатка, но не доказывает владельца каждой конкретной партии."
|
||||
"Без партионного учета этот ответ показывает закупочный след текущего остатка, но не доказывает владельца каждой конкретной партии.",
|
||||
INVENTORY_SUPPLIER_ATTRIBUTION_NEXT_ACTION
|
||||
]);
|
||||
if (observedCounterparties.length > 0) {
|
||||
lines.push(`- Найденные поставщики: ${inventoryPartyLeadList(observedCounterparties)}.`);
|
||||
|
||||
@@ -900,6 +900,8 @@ describe("address reply builders regressions", () => {
|
||||
expect(firstLine).toContain("ВИЗАНТИЯ");
|
||||
expect(text.indexOf(firstLine)).toBeLessThan(text.indexOf("Что проверили:"));
|
||||
expect(text).toContain("однозначная атрибуция части текущего остатка не подтверждена: 1 закупочных операций без явно выделенного поставщика.");
|
||||
expect(text).toContain("Следующий шаг:");
|
||||
expect(text).toContain("проверьте партионный/серийный учет");
|
||||
expect(text).not.toContain("Часть закупочных операций");
|
||||
expect(text.match(/^\d+\./gmu)?.length ?? 0).toBeLessThanOrEqual(3);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user