]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Переписывание логики
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 18 Mar 2025 14:46:46 +0000 (17:46 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 18 Mar 2025 14:46:46 +0000 (17:46 +0300)
erp24/media/controllers/FlowwowController.php
erp24/services/MarketplaceService.php

index de352994369145c654de0009ef8e670df23aa444..b4e365b3d646164c5ee0e16ca337995715c580f0 100644 (file)
@@ -11,6 +11,14 @@ use yii\web\Response;
 
 class FlowwowController extends Controller
 {
+    const SUBJECT_INDEX = [
+        '/^Новый_оплаченный_заказ$/' => 1,
+        '/^Заказ_№\d+_принят!$/' => 2,
+        '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/' => 3,
+        '/^Заказ_№\d+_отменён$/' => 4,
+        '/^Изменения_в_заказе_№\d+$/' => 5,
+    ];
+
     /**
      * Экшен для генерации и отображения XML-фида.
      *
@@ -47,6 +55,10 @@ class FlowwowController extends Controller
     {
         set_time_limit(300);
         Yii::$app->response->format = Response::FORMAT_JSON;
+        $hostname = '{imap.yandex.ru:993/imap/ssl}INBOX';
+        $username = 'flow@bazacvetov24.ru';
+        $password = 'ctqamxqeshgxwsgn';
+
         $hostname = '{imap.yandex.ru:993/imap/ssl}INBOX';
         $username = 'Zakaz-bazacvetov24@yandex.ru';
         $password = 'jyxnwwwvgpwhzbdu';
@@ -72,9 +84,9 @@ class FlowwowController extends Controller
         $subjectPatterns = [
             '/^Новый_оплаченный_заказ$/',
             '/^Заказ_№\d+_принят!$/',
-            //  '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/',
-            //   '/^Заказ_№\d+_отменён$/',
-            //  '/^Изменения_в_заказе_№\d+$/',
+            '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/',
+            '/^Заказ_№\d+_отменён$/',
+            '/^Изменения_в_заказе_№\d+$/',
         ];
 
         if ($emails) {
@@ -83,10 +95,13 @@ class FlowwowController extends Controller
                 $structure = imap_fetchstructure($inbox, $email_number);
                 $htmlMessage = '';
                 $subject = mb_decode_mimeheader($overview[0]->subject);
+                $from = mb_decode_mimeheader($overview[0]->from);
+                $to = mb_decode_mimeheader($overview[0]->to);
                 $date = date('Y-m-d H:i:s', strtotime(mb_decode_mimeheader($overview[0]->date)));
                 Yii::warning('Тема: ' . json_encode($subject, JSON_UNESCAPED_UNICODE), __METHOD__);
                 foreach ($subjectPatterns as $pattern) {
                     if (preg_match($pattern, $subject)) {
+                        $subjectIndex = self::SUBJECT_INDEX[$pattern];
                         Yii::warning('Тема прошла: ' . json_encode($subject, JSON_UNESCAPED_UNICODE), __METHOD__);
                         if (isset($structure->parts) && count($structure->parts)) {
                             foreach ($structure->parts as $partNum => $part) {
@@ -100,16 +115,21 @@ class FlowwowController extends Controller
 
                         $messages[] = [
                             'subject' => $subject,
+                            'subject_index' => $subjectIndex,
+                            'from' => $from,
+                            'to' => $to,
                             'date' => $date,
-                            'body' => $htmlMessage,
+                            //'body' => $htmlMessage,
                         ];
-                        break;
+                        //break;
                     }
                 }
                 // imap_setflag_full($inbox, $email_number, "\\Seen");
             }
         }
         imap_close($inbox);
+        usort($messages, fn($a, $b) => $a['subject_index'] <=> $b['subject_index']);
+        return $messages;
         if ($messages) {
             foreach ($messages as $message) {
                 $html = $message['body'];
index 186b349e331bd54370e62e17e3343fdb307031a8..6c6dded66d9d9320e4aaff26f7365f3ee123ff0b 100644 (file)
@@ -77,6 +77,14 @@ class MarketplaceService
         ]
     ];
 
+    const SUBJECT_INDEX = [
+        '/^Новый_оплаченный_заказ$/' => 1,
+        '/^Заказ_№\d+_принят!$/' => 2,
+        '/^Заказ_№\d+_отменён$/' => 3,
+        '/^Изменения_в_заказе_№\d+$/' => 4,
+        '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/' => 5,
+    ];
+
     public static function infoForMarketplace(int $marketId) {
         if (!array_key_exists($marketId, MarketplaceStore::getWarehouseId()))
             return;
@@ -1349,104 +1357,82 @@ class MarketplaceService
         //Yii::warning(' Состояние ящика: ' . print_r($inboxInfo, true), __METHOD__);
         $emails = imap_search($inbox, 'ON "14-Feb-2025" FROM "info@flowwow.com" ');
 
-        $orders = [];
+        $messages = [];
+
+        $subjectPatterns = [
+            '/^Новый_оплаченный_заказ$/',
+            '/^Заказ_№\d+_принят!$/',
+            '/^Заказ_№\d+_отменён$/',
+            '/^Изменения_в_заказе_№\d+$/',
+            '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/',
+        ];
+
         if ($emails) {
             foreach ($emails as $email_number) {
                 $overview = imap_fetch_overview($inbox, $email_number, 0);
-
                 $structure = imap_fetchstructure($inbox, $email_number);
                 $htmlMessage = '';
                 $subject = mb_decode_mimeheader($overview[0]->subject);
-                $date = mb_decode_mimeheader($overview[0]->date);
-                $date = date('Y-m-d H:i:s', strtotime($date));
-
-                if ($subject == 'Новый_оплаченный_заказ') {
-                    if (isset($structure->parts) && count($structure->parts)) {
-                        foreach ($structure->parts as $partNum => $part) {
-                            if ($part->subtype == 'HTML') {
-                                $htmlMessage = imap_fetchbody($inbox, $email_number, $partNum + 1);
-                                $htmlMessage = quoted_printable_decode($htmlMessage);
-                                break;
-                            }
-                        }
-                    }
-
-                    $orderNumber = null;
-                    $items = [];
-                    $totalSum = 0;
-
-                    try {
-                        if (!empty($htmlMessage)) {
-                            $htmlMessage = html_entity_decode($htmlMessage, ENT_QUOTES | ENT_HTML5, 'UTF-8');
-
-                            $doc = new HtmlDomParser($htmlMessage);
-
-                            $main = $doc->findOneOrFalse("body");
-
-                            if ($main !== false) {
-                                $orderTitleNode = $main->findOne("h1");
-
-                                if ($orderTitleNode && preg_match('/№(\d+)/', $orderTitleNode->innertext, $matches)) {
-                                    $orderNumber = (int)$matches[1];
-                                }
-
-                                // Извлечение товаров
-                                $elements = $main->findOne("p:contains('Детали заказа')")->parentNode();
-                                if ($elements) {
-                                    foreach ($elements->findMultiOrFalse("tr") as $itemRow) {
-                                        $img = $itemRow->findOne("td img");
-                                        $nameNode = $itemRow->findOne("td:nth-child(2) p");
-                                        if (!$img || !trim($nameNode->plaintext)) continue;
-
-                                        $name = trim($nameNode->plaintext);
-
-                                        // Количество
-                                        $countNode = $itemRow->findOne("td:nth-child(2) p[style*='#8C8C8C']");
-                                        $countText = $countNode ? $countNode->plaintext : '1';
-                                        $count = (int) filter_var($countText, FILTER_SANITIZE_NUMBER_INT);
-
-                                        // Цена
-                                        $priceNode = $itemRow->findOne("td:nth-child(3) p");
-                                        $priceText = $priceNode ? $priceNode->plaintext : '0';
-                                        $price = (float) str_replace([' ', '₽'], '', $priceText);
-
-                                        $items[] = ['name' => $name, 'count' => $count, 'price' => $price];
-                                    }
-                                }
-
-                                // Общая сумма
-                                $totalSumNodes = $elements->parentNode()->getElementsByTagName('table');
-                                $totalSumNode = ($totalSumNodes[3])->findOne("tr:contains('Итого оплачено')");
-                                if ($totalSumNode) {
-                                    $totalSum = (float) str_replace([' ', '₽'], '', trim(($totalSumNode->findMulti("td"))[1]->plaintext));
+                $from = mb_decode_mimeheader($overview[0]->from);
+                $to = mb_decode_mimeheader($overview[0]->to);
+                $date = date('Y-m-d H:i:s', strtotime(mb_decode_mimeheader($overview[0]->date)));
+                foreach ($subjectPatterns as $pattern) {
+                    if (preg_match($pattern, $subject)) {
+                        $subjectIndex = self::SUBJECT_INDEX[$pattern];
+                        if (isset($structure->parts) && count($structure->parts)) {
+                            foreach ($structure->parts as $partNum => $part) {
+                                if ($part->subtype == 'HTML') {
+                                    $htmlMessage = imap_fetchbody($inbox, $email_number, $partNum + 1);
+                                    $htmlMessage = quoted_printable_decode($htmlMessage);
+                                    break;
                                 }
                             }
                         }
-                    } catch (\Exception $e) {
-                        Yii::error('Ошибка: ' . json_encode($e->getMessage(), JSON_UNESCAPED_UNICODE) . " " .  $e->getLine() . " " .  json_encode($e->getTrace(), JSON_UNESCAPED_UNICODE), __METHOD__);
-                    }
 
-                    if ($orderNumber !== null) {
-                        $orders[$orderNumber] =  [
-                                'items'     => $items,
-                                'totalSum'  => $totalSum,
-                                'number'    => $orderNumber,
-                                'date'      => $date,
+                        $messages[] = [
+                            'subject' => $subject,
+                            'subject_index' => $subjectIndex,
+                            'from' => $from,
+                            'to' => $to,
+                            'date' => $date,
+                            'body' => $htmlMessage,
                         ];
                     }
+                }
+                // imap_setflag_full($inbox, $email_number, "\\Seen");
+            }
+        }
+        imap_close($inbox);
+        usort($messages, fn($a, $b) => $a['subject_index'] <=> $b['subject_index']);
+        return $messages;
+    }
 
-                    Yii::warning('HTML Тело письма: ' . json_encode($orders, JSON_UNESCAPED_UNICODE), __METHOD__);
 
+    public static function processMessages(array $messages)
+    {
+        if ($messages) {
+            foreach ($messages as $message) {
+                if ($message['subject_index'] == 1) {
+                } elseif ($message['subject_index'] == 2) {
+                } elseif ($message['subject_index'] == 3) {
+                } elseif ($message['subject_index'] == 4) {
+                } elseif ($message['subject_index'] == 5) {
                 }
 
-                // imap_setflag_full($inbox, $email_number, "\\Seen");
+
+                $html = $message['body'];
+                $orderNumber = null;
+                $items = [];
+                $totalSum = 0;
+                if (!empty($html)) {
+                    $html = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
+                }
             }
         }
-        imap_close($inbox);
-        return $orders;
     }
 
 
+
     public static function processFlowwowOrders(array $allOrders)
     {
         $statuses = MarketplaceOrderStatusTypes::find()