ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов Stage 3.7 ХВОСТЫ фикс маршрутов по домену задолжностей
This commit is contained in:
@@ -270,6 +270,7 @@ const COUNTERPARTY_ACTIVITY_LIFECYCLE_HINTS = [
|
||||
"кто ушел",
|
||||
"кто ушёл",
|
||||
"только один раз",
|
||||
"дольше всего",
|
||||
"дольше всех",
|
||||
"долгоживущие контрагенты",
|
||||
"регулярные поставщики",
|
||||
@@ -661,14 +662,27 @@ function hasCounterpartyPopulationAndRolesSignal(text: string): boolean {
|
||||
}
|
||||
|
||||
function hasLifecycleSegmentationSignal(text: string): boolean {
|
||||
return /(?:вперв|нов(?:ые|ых|ые\s+контрагент|ые\s+клиент|ые\s+заказчик)|исчез|ушед|ушл|пропал|отвал|только\s+один\s+раз|ровно\s+один\s+раз|однораз|дольше\s+всех|долгожив|самые\s+старые|старые\s+по\s+сотрудничеству|регуляр|эпизодич|разов(?:ые|ой|ые\s+поставщик)|давно\s+не\s+использ|неиспольз|потом\s+перестал)/iu.test(
|
||||
return /(?:вперв|нов(?:ые|ых|ые\s+контрагент|ые\s+клиент|ые\s+заказчик)|исчез|ушед|ушл|пропал|отвал|только\s+один\s+раз|ровно\s+один\s+раз|однораз|дольше\s+всех|дольше\s+всего|долгожив|самые\s+старые|старые\s+по\s+сотрудничеству|регуляр|эпизодич|разов(?:ые|ой|ые\s+поставщик)|давно\s+не\s+использ|неиспольз|потом\s+перестал)/iu.test(
|
||||
text
|
||||
);
|
||||
}
|
||||
|
||||
function hasCounterpartyDebtLongevitySignal(text: string): boolean {
|
||||
const hasCounterpartyLexeme =
|
||||
/(?:заказчик(?:ов|а|и)?|клиент(?:ов|а|ы)?|покупател(?:ей|я|и)?|контрагент(?:ов|а|ы)?|customer(?:s)?|client(?:s)?|counterpart(?:y|ies)|buyer(?:s)?)/iu.test(
|
||||
text
|
||||
);
|
||||
const hasDebtLexeme = /(?:долг(?:и|ов|а|у)?|задолж(?:енность|енности|енностям|ал|али)?|просроч|хвост)/iu.test(text);
|
||||
const hasLongevityCue =
|
||||
/(?:долгожив|долгожител|несколько\s+месяц|по\s+годам|дольше|лет|год(?:ам|а|у|ы)?|на\s+этот\s+момент|длительн)/iu.test(
|
||||
text
|
||||
);
|
||||
return hasCounterpartyLexeme && hasDebtLexeme && hasLongevityCue;
|
||||
}
|
||||
|
||||
function hasCounterpartyActivityLifecycleSignal(text: string): boolean {
|
||||
const hasPaymentRiskLexeme =
|
||||
/(?:не\s+плат(?:ит|ят|ил|или)|без\s+оплат|оплат(?:ы|а)?\s+нет|нет\s+оплат|задерж(?:ива|к)|просроч|долг|задолж)/iu.test(
|
||||
/(?:не\s+плат(?:ит|ят|ил|или)|без\s+оплат|оплат(?:ы|а)?\s+нет|нет\s+оплат|задерж(?:ива|к)|просроч|задолж|\bдолг(?:и|ов|а|у)?\b)/iu.test(
|
||||
text
|
||||
);
|
||||
if (hasPaymentRiskLexeme) {
|
||||
@@ -680,14 +694,14 @@ function hasCounterpartyActivityLifecycleSignal(text: string): boolean {
|
||||
if (hasAny(text, COUNTERPARTY_ACTIVITY_LIFECYCLE_HINTS)) {
|
||||
return true;
|
||||
}
|
||||
if (/(?:сколько|скока|скок)\s+/iu.test(text)) {
|
||||
if (/(?:сколько|скока|скок)\s+/iu.test(text) && !hasLifecycleSegmentationSignal(text)) {
|
||||
return false;
|
||||
}
|
||||
const hasCounterpartyLexeme = /(?:заказчик(?:ов|а|и)?|клиент(?:ов|а|ы)?|покупател(?:ей|я|и)?|контрагент(?:ов|а|ы)?|поставщик(?:ов|а|и)?|customer(?:s)?|client(?:s)?|counterpart(?:y|ies)|supplier(?:s)?|vendor(?:s)?)/iu.test(
|
||||
text
|
||||
);
|
||||
const hasActivityLexeme =
|
||||
/(?:работал(?:и)?|активн(?:ые|ых|а|о)?|сотрудничал(?:и)?|были\s+в\s+работе|active|использ(?:овал(?:и|ось)?|уются|ован(?:ы|о)?))/iu.test(
|
||||
/(?:работал(?:и)?|работа(?:ет|ют)|активн(?:ые|ых|а|о)?|сотрудничал(?:и)?|были\s+в\s+работе|active|использ(?:овал(?:и|ось)?|уются|ован(?:ы|о)?))/iu.test(
|
||||
text
|
||||
);
|
||||
const hasTimeWindowLexeme =
|
||||
@@ -936,9 +950,9 @@ function hasOpenContractsListSignal(text: string): boolean {
|
||||
|
||||
function hasSupplierTailRiskSignal(text: string): boolean {
|
||||
const hasSupplier = /(?:поставщик|supplier|vendor)/iu.test(text);
|
||||
const hasTail = /(?:хвост|висят|незакрыт|задолж|долг|просроч)/iu.test(text);
|
||||
const hasTail = /(?:хвост|висят|незакрыт|не\s+закрыв|задолж|долг|просроч|сч[её]т)/iu.test(text);
|
||||
const hasRisk = /(?:систематич|регулярн|проблем|тревог|не\s+разов|больше\s+похож)/iu.test(text);
|
||||
const hasPeriodCue = /(?:на\s+конец\s+(?:месяц|период)|конец\s+месяц|пару\s+месяц|несколько\s+месяц)/iu.test(text);
|
||||
const hasPeriodCue = /(?:на\s+конец\s+(?:месяц|период)|конец\s+месяц|пару\s+месяц|несколько\s+месяц|больше\s+месяц)/iu.test(text);
|
||||
return hasSupplier && hasTail && (hasRisk || hasPeriodCue);
|
||||
}
|
||||
|
||||
@@ -948,11 +962,30 @@ function hasReceivablesLatencyRiskSignal(text: string): boolean {
|
||||
const hasPayment = /(?:оплат|платеж|платёж|payment)/iu.test(text);
|
||||
const hasShipment = /(?:отправк|отгруз|реализ|shipment|delivery)/iu.test(text);
|
||||
const hasDelay = /(?:длинн|долг|просроч|задерж|висят|тревог|too\s+long|late)/iu.test(text);
|
||||
const hasNonPayment = /(?:не\s+плат(?:ит|ят|ил|или)|без\s+оплат|оплат(?:ы|а)?\s+нет|нет\s+оплат|неоплач)/iu.test(text);
|
||||
const hasPeriodOrRiskCue = /(?:за\s+текущ|на\s+конец|тревог|просроч|задерж|долг|длинн)/iu.test(text);
|
||||
const hasOverdueDeadlineCue =
|
||||
/(?:срок(?:и|а)?(?:\s+оплат[ыы]?)?[\s\S]{0,24}(?:прош|выш|истек|истёк)|срок(?:и|а)?\s+давно\s+прошл|давно\s+пора\s+оплат|давно\s+не\s+оплач)/iu.test(
|
||||
text
|
||||
);
|
||||
const hasNonPayment = /(?:не\s+плат(?:ит|ят|ил|или)|не\s+оплат|не\s+оплач|без\s+оплат|оплат(?:ы|а)?\s+нет|нет\s+оплат|неоплач)/iu.test(text);
|
||||
const hasPaymentShipmentImbalance =
|
||||
/(?:оплач(?:ено|ен[аоы]?|ивать|ивать)?\s+меньше[\s\S]{0,36}отгруж|недоплат[\s\S]{0,36}отгруж|отгруж[\s\S]{0,36}оплач(?:ено|ено\s+меньше))/iu.test(
|
||||
text
|
||||
);
|
||||
const hasNegativeSaldoRisk = /(?:сальд[оа]\s+(?:уже\s+)?отрицат|минусов(?:ое|ой)\s+сальдо|сальдо\s+в\s+минус)/iu.test(text);
|
||||
const hasPeriodOrRiskCue =
|
||||
/(?:за\s+текущ|на\s+конец|тревог|просроч|задерж|долг|длинн|несколько\s+месяц|больше\s+месяц)/iu.test(text) ||
|
||||
hasOverdueDeadlineCue ||
|
||||
hasNegativeSaldoRisk;
|
||||
const hasBetweenShipmentAndPayment =
|
||||
/между[\s\S]{0,80}(?:отправк|отгруз|реализ)[\s\S]{0,80}(?:оплат|платеж|платёж|payment)/iu.test(text);
|
||||
if (hasBuyer && hasPayment && ((hasShipment && hasDelay) || hasBetweenShipmentAndPayment)) {
|
||||
if (
|
||||
hasBuyer &&
|
||||
hasPayment &&
|
||||
((hasShipment && (hasDelay || hasOverdueDeadlineCue)) || hasBetweenShipmentAndPayment || hasPaymentShipmentImbalance)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
if ((hasBuyer || hasCounterparty) && hasPaymentShipmentImbalance) {
|
||||
return true;
|
||||
}
|
||||
return (hasBuyer || hasCounterparty) && hasNonPayment && hasPeriodOrRiskCue;
|
||||
@@ -961,24 +994,50 @@ function hasReceivablesLatencyRiskSignal(text: string): boolean {
|
||||
function hasSettlementGapSignal(text: string): boolean {
|
||||
const hasPayment = /(?:платеж|платёж|оплат|списани|поступлен|payment)/iu.test(text);
|
||||
const hasDocument = /(?:док(?:и|умент|ументы|ументов)|docs?|documents?)/iu.test(text);
|
||||
const hasShipment = /(?:отгруз|реализ|shipment|delivery|товар|услуг)/iu.test(text);
|
||||
const hasAdvance = /(?:аванс|предоплат)/iu.test(text);
|
||||
const hasClosureLexeme = /(?:закрыти|взаиморасч|акт|сч[её]т(?:ов|а|ы)?)/iu.test(text);
|
||||
const hasNoDocumentForClosing =
|
||||
/(?:нет|без)\s+(?:док(?:и|умент|ументы|ументов)|закрывающ)/iu.test(text) &&
|
||||
/(?:закрыти|взаиморасч|акт)/iu.test(text);
|
||||
hasClosureLexeme;
|
||||
const hasNoDocumentForClosingReversed =
|
||||
/(?:док(?:и|умент|ументы|ументов)|закрывающ)[\s\S]{0,48}(?:нет|без)/iu.test(text) &&
|
||||
/(?:закрыти|взаиморасч|акт)/iu.test(text);
|
||||
hasClosureLexeme;
|
||||
const hasNoPayments =
|
||||
/(?:нет|без)\s+(?:оплат|платеж|платёж|payment)/iu.test(text) ||
|
||||
/(?:оплат|платеж|платёж|payment)\s+нет/iu.test(text);
|
||||
const hasDocsWithoutPayments = hasDocument && hasNoPayments;
|
||||
const hasPaymentsWithoutClosingDocs = hasPayment && (hasNoDocumentForClosing || hasNoDocumentForClosingReversed);
|
||||
const hasPaymentsWithoutSettlementClosure =
|
||||
hasPayment &&
|
||||
/(?:без|нет)\s+закрыти(?:я|й)?(?:\s+взаиморасч[её]тов)?/iu.test(text) &&
|
||||
hasClosureLexeme;
|
||||
const hasShipmentWithoutClosingDocs =
|
||||
hasShipment &&
|
||||
(hasNoDocumentForClosing ||
|
||||
hasNoDocumentForClosingReversed ||
|
||||
/(?:без|нет)\s+док(?:и|умент(?:ов|ы|а)?)\s+(?:для\s+)?(?:их\s+)?закрыти/u.test(text));
|
||||
const hasClosingWithoutSupportingDocs =
|
||||
hasClosureLexeme &&
|
||||
/(?:без|нет)\s+подтверждающ(?:их|его|ие)?\s+док(?:и|умент(?:ов|ы|а)?)/iu.test(text);
|
||||
const hasAdvanceStuckRisk =
|
||||
/(?:зависш(?:ий|ие|ая|ие\s+аванс)|давно\s+пора\s+закрыть|пора\s+закрывать|перепривяз(?:ать|к)|списыв(?:ать|ани|ан)|нереальн)/iu.test(
|
||||
text
|
||||
);
|
||||
const hasUnclosedAdvanceGap =
|
||||
hasAdvance &&
|
||||
(/(?:не\s+закрыт|незакрыт|долго\s+не\s+закрыт|давно\s+не\s+закрыт)/iu.test(text) ||
|
||||
(/(?:не\s+закрыт|незакрыт|долго\s+не\s+закрыт|давно\s+не\s+закрыт|давно\s+пора\s+закрыть)/iu.test(text) ||
|
||||
hasAdvanceStuckRisk ||
|
||||
hasNoDocumentForClosing ||
|
||||
hasNoDocumentForClosingReversed);
|
||||
return hasPaymentsWithoutClosingDocs || hasDocsWithoutPayments || hasUnclosedAdvanceGap;
|
||||
return (
|
||||
hasPaymentsWithoutClosingDocs ||
|
||||
hasPaymentsWithoutSettlementClosure ||
|
||||
hasDocsWithoutPayments ||
|
||||
hasShipmentWithoutClosingDocs ||
|
||||
hasClosingWithoutSupportingDocs ||
|
||||
hasUnclosedAdvanceGap
|
||||
);
|
||||
}
|
||||
|
||||
function hasReconciliationMismatchSignal(text: string): boolean {
|
||||
@@ -1376,6 +1435,14 @@ export function resolveAddressIntent(userMessage: string): AddressIntentResoluti
|
||||
};
|
||||
}
|
||||
|
||||
if (hasCounterpartyDebtLongevitySignal(text)) {
|
||||
return {
|
||||
intent: "list_receivables_counterparties",
|
||||
confidence: "medium",
|
||||
reasons: ["receivables_debt_lifecycle_signal_detected"]
|
||||
};
|
||||
}
|
||||
|
||||
if (hasSupplierTailRiskSignal(text)) {
|
||||
return {
|
||||
intent: "list_payables_counterparties",
|
||||
@@ -1410,6 +1477,7 @@ export function resolveAddressIntent(userMessage: string): AddressIntentResoluti
|
||||
|
||||
if (
|
||||
hasAny(text, OPEN_ITEMS_HINTS) &&
|
||||
!hasCounterpartyDebtLongevitySignal(text) &&
|
||||
/(?:контраг|договор|контракт|counterparty|contract|покупател|клиент|заказчик|customer|client|buyer|supplier|поставщик)/iu.test(
|
||||
text
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user