]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
fix(ERP-251): improve delivery address parsing from FlowWow emails
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Mon, 2 Mar 2026 15:01:39 +0000 (18:01 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Mon, 2 Mar 2026 15:01:39 +0000 (18:01 +0300)
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 <noreply@anthropic.com>
erp24/services/MarketplaceService.php

index ce53564d3c9a2493e55046634b564b1d04c2cd65..e3ce7061b045ed810c18a15581d6c44f70609c10 100644 (file)
@@ -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');
     }