fix(paradizweb): parse natural-date phrases and complete booking data extraction

This commit is contained in:
OpenClaw Assistant
2026-03-03 00:41:24 +03:00
parent 5cdaec3cad
commit 1d95b6de57

View File

@@ -149,16 +149,42 @@ function extractBookingFields(text) {
if (phone) out.phone = phone;
if (email) out.email = email;
const guestM = t.match(/(?:фио|меня зовут|я)\s*[:\-]?\s*([А-ЯЁA-Z][а-яёa-z]+(?:\s+[А-ЯЁA-Z][а-яёa-z]+){1,2})/i);
const guestM = t.match(/(?:фио|меня зовут|я)\s*[:\-]?\s*([А-ЯЁA-Z][а-яёa-z]+(?:\s+[А-ЯЁA-Z][а-яёa-z]+){1,2})/i)
|| t.match(/^\s*([А-ЯЁ][а-яё]+\s+[А-ЯЁ][а-яё]+(?:\s+[А-ЯЁ][а-яё]+)?)/);
if (guestM) out.guest = guestM[1].trim();
const guestsM = t.match(/(\d+)\s*(?:взросл|гост)/i);
const guestsM = t.match(/(\d+)\s*(?:взросл|гост|чел|человек)/i);
if (guestsM) out.guests = Number(guestsM[1]);
const dateRangeM = t.match(/(?:с|заезд)\s*(\d{1,2})[./](\d{1,2}).*?(?:по|выезд|до)\s*(\d{1,2})[./](\d{1,2})/i);
if (dateRangeM) {
out.checkin = toIsoDate(dateRangeM[1], dateRangeM[2]);
out.checkout = toIsoDate(dateRangeM[3], dateRangeM[4]);
const dateRangeNumM = t.match(/(?:с|заезд)\s*(\d{1,2})[./](\d{1,2}).*?(?:по|выезд|до)\s*(\d{1,2})[./](\d{1,2})/i);
if (dateRangeNumM) {
out.checkin = toIsoDate(dateRangeNumM[1], dateRangeNumM[2]);
out.checkout = toIsoDate(dateRangeNumM[3], dateRangeNumM[4]);
} else {
const months = {
'январ':1,'феврал':2,'март':3,'апрел':4,'ма':5,'июн':6,'июл':7,'август':8,'сентябр':9,'октябр':10,'ноябр':11,'декабр':12
};
const dateRangeWordM = t.match(/(?:с|заезд)\s*(\d{1,2})\s+([а-яё]+).*?(?:по|до|выезд)\s*(\d{1,2})\s+([а-яё]+)/i);
if (dateRangeWordM) {
const m1w = dateRangeWordM[2].toLowerCase();
const m2w = dateRangeWordM[4].toLowerCase();
const m1 = Object.entries(months).find(([k]) => m1w.startsWith(k))?.[1];
const m2 = Object.entries(months).find(([k]) => m2w.startsWith(k))?.[1];
if (m1 && m2) {
out.checkin = toIsoDate(dateRangeWordM[1], m1);
out.checkout = toIsoDate(dateRangeWordM[3], m2);
}
} else {
const dateRangeOneMonthM = t.match(/(?:с|заезд)\s*(\d{1,2})\s*(?:по|до|выезд)\s*(\d{1,2})\s+([а-яё]+)/i);
if (dateRangeOneMonthM) {
const mw = dateRangeOneMonthM[3].toLowerCase();
const m = Object.entries(months).find(([k]) => mw.startsWith(k))?.[1];
if (m) {
out.checkin = toIsoDate(dateRangeOneMonthM[1], m);
out.checkout = toIsoDate(dateRangeOneMonthM[2], m);
}
}
}
}
if (/домик\s*эконом/i.test(t)) out.room = 'Домик Эконом';