ДОМЕНЫ - ВОПРОСЫ - НДС: развести as-of и tax-period intent, ускорить и стабилизировать VAT source probe, починить M23 тесты
This commit is contained in:
@@ -602,6 +602,44 @@ function hasForecastTaxSignal(text: string): boolean {
|
||||
return hasForecastLexeme && hasTaxLexeme;
|
||||
}
|
||||
|
||||
function hasVatLiabilityConfirmedTaxPeriodSignal(text: string): boolean {
|
||||
const hasVatLexeme = /(?:ндс|vat)/iu.test(text);
|
||||
if (!hasVatLexeme) {
|
||||
return false;
|
||||
}
|
||||
const hasPaymentCue =
|
||||
/(?:к\s+уплате|надо|нужно|заплатить|уплатить|плат[её]ж|платежку|в\s+налогов|в\s+бюджет|должн[аы]?\s+заплатить)/iu.test(
|
||||
text
|
||||
);
|
||||
if (!hasPaymentCue) {
|
||||
return false;
|
||||
}
|
||||
const hasAsOfCue = /(?:на\s+дат|по\s+состоянию|на\s+конец|as\s+of)/iu.test(text);
|
||||
if (hasAsOfCue) {
|
||||
return false;
|
||||
}
|
||||
const hasTaxAuthorityCue = /(?:в\s+налогов|в\s+бюджет|декларац|налогов(?:ый|ую)\s+период)/iu.test(text);
|
||||
const hasQuarterCue = /(?:\b[1-4]\s*(?:квартал|кв\.?)\b|квартал|кв\.?)/iu.test(text);
|
||||
const hasZaPeriodCue =
|
||||
/(?:за\s+(?:\d{4}|январ|феврал|март|апрел|май|июн|июл|август|сентябр|октябр|ноябр|декабр|квартал|кв\.?|месяц|год|период))/iu.test(
|
||||
text
|
||||
);
|
||||
const hasExplicitDayDate =
|
||||
/\b(?:\d{1,2}[./-]\d{1,2}[./-](?:\d{2}|\d{4})|(?:19|20)\d{2}[./-]\d{1,2}[./-]\d{1,2})\b/u.test(text);
|
||||
const hasMonthYearNaCue =
|
||||
/(?:на\s+(?:январ|феврал|март|апрел|май|июн|июл|август|сентябр|октябр|ноябр|декабр)\S*\s+(?:19|20)\d{2})/iu.test(
|
||||
text
|
||||
);
|
||||
const hasHowMuchCue = /(?:сколько|скока|скок)/iu.test(text);
|
||||
|
||||
// "На март 2020" и конкретная дата без налогового контекста чаще означают as-of срез.
|
||||
if (!hasTaxAuthorityCue && !hasZaPeriodCue && !hasQuarterCue && (hasMonthYearNaCue || hasExplicitDayDate)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return hasTaxAuthorityCue || hasZaPeriodCue || hasQuarterCue || (hasHowMuchCue && hasTaxAuthorityCue);
|
||||
}
|
||||
|
||||
function hasVatPayableConfirmedSignal(text: string): boolean {
|
||||
const hasVatLexeme = /(?:ндс|vat)/iu.test(text);
|
||||
if (!hasVatLexeme) {
|
||||
@@ -1503,6 +1541,14 @@ function hasAccountNumberAnchor(text: string): boolean {
|
||||
export function resolveAddressIntent(userMessage: string): AddressIntentResolution {
|
||||
const text = String(userMessage ?? "").trim().toLowerCase();
|
||||
|
||||
if (hasVatLiabilityConfirmedTaxPeriodSignal(text)) {
|
||||
return {
|
||||
intent: "vat_liability_confirmed_for_tax_period",
|
||||
confidence: "high",
|
||||
reasons: ["vat_liability_confirmed_tax_period_signal_detected"]
|
||||
};
|
||||
}
|
||||
|
||||
if (hasForecastTaxSignal(text)) {
|
||||
return {
|
||||
intent: "vat_payable_forecast",
|
||||
|
||||
Reference in New Issue
Block a user