From 1ca403a5f5e27a52d783a83e9ee9406b688490f6 Mon Sep 17 00:00:00 2001 From: Aleksey Filippov Date: Mon, 2 Mar 2026 18:01:39 +0300 Subject: [PATCH] fix(ERP-251): improve delivery address parsing from FlowWow emails MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit parseAddressFromDeliveryText() did a naive comma-split on raw deliveryText, treating date/time fragments and instructions like "Уточните адрес доставки у получателя" as address fields. This caused house field to exceed the 16-char DB column limit. Now strips delivery type prefix, date/time patterns, and non-address phrases before splitting. Handles 1-2 part addresses gracefully instead of requiring 3+ comma-separated parts. Co-Authored-By: Claude Opus 4.6 --- erp24/services/MarketplaceService.php | 35 +++++++++++++++++++++------ 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index ce53564d..e3ce7061 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -3294,14 +3294,39 @@ class MarketplaceService $latitude = 0.0; $longitude = 0.0; - $parts = explode(',', $text); + // Убираем префикс типа доставки + $cleaned = preg_replace('/^(Доставка|Самовывоз)\s*:\s*/ui', '', $text); + + // Убираем дату/время: "сегодня, 2 марта 2026 в 17:30—18:00" и аналогичные паттерны + $cleaned = preg_replace('/(?:сегодня|завтра|послезавтра)\s*,?\s*/ui', '', $cleaned); + $cleaned = preg_replace('/\d{1,2}\s+[а-яА-Я]+\s+\d{4}/u', '', $cleaned); + $cleaned = preg_replace('/[вс]\s+\d{1,2}:\d{2}(?:—\d{1,2}:\d{2})?\s*/u', '', $cleaned); + + // Убираем служебные фразы, которые не являются адресом + $cleaned = preg_replace('/Уточните\s+адрес\s+доставки\s+у\s+получателя/ui', '', $cleaned); + + // Чистим оставшиеся запятые и пробелы + $cleaned = preg_replace('/,\s*,/', ',', $cleaned); + $cleaned = trim($cleaned, " ,\t\n\r"); + + if ($cleaned === '') { + return compact('city', 'street', 'house', 'latitude', 'longitude'); + } + + $parts = explode(',', $cleaned); $parts = array_map('trim', $parts); + $parts = array_values(array_filter($parts, fn($p) => $p !== '')); $count = count($parts); if ($count >= 3) { $city = $parts[$count - 3]; $street = $parts[$count - 2]; $house = $parts[$count - 1]; + } elseif ($count === 2) { + $city = $parts[0]; + $street = $parts[1]; + } elseif ($count === 1) { + $city = $parts[0]; } switch (mb_strtolower($city)) { @@ -3315,13 +3340,7 @@ class MarketplaceService break; } - return [ - 'city' => $city, - 'street' => $street, - 'house' => $house, - 'latitude' => $latitude, - 'longitude' => $longitude, - ]; + return compact('city', 'street', 'house', 'latitude', 'longitude'); } -- 2.39.5