]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Измение и дебагинг
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 21 Mar 2025 12:54:53 +0000 (15:54 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 21 Mar 2025 12:54:53 +0000 (15:54 +0300)
erp24/services/MarketplaceService.php

index 31af728005f101b8f466f67f795b3f9019348e4e..5af8ebaa72269ffdedcc09b74a759ac15dbc3152 100644 (file)
@@ -1351,6 +1351,10 @@ class MarketplaceService
         $progressCallback = null,
         $seen = false
     ) {
+        imap_errors();
+        imap_alerts(); 
+        $debugMode = true;
+
         set_time_limit(300);
         // Устанавливаем таймауты IMAP
         imap_timeout(IMAP_OPENTIMEOUT, 120);
@@ -1383,11 +1387,11 @@ class MarketplaceService
         if ($useAlternateMailbox) {
             $username = 'Zakaz-bazacvetov24@yandex.ru';
             $password = 'jyxnwwwvgpwhzbdu';
-            $searchCriteria .= 'FROM "<info@flowwow.com>"';
+            $searchCriteria .= '';
         } else {
             $username = 'flow@bazacvetov24.ru';
             $password = 'ctqamxqeshgxwsgn';
-            $searchCriteria .= 'FROM "<info@flowwow.com>"';
+            $searchCriteria .= '';
         }
 
         if ($progressCallback) {
@@ -1397,10 +1401,13 @@ class MarketplaceService
         if ($progressCallback) {
             call_user_func($progressCallback, "Подключение к почтовому ящику...");
         }
+        self::imap_debug_log("Открытие соединения: {$hostname} INBOX с почтой: {$username}", $debugMode, $progressCallback);
         $inbox = imap_open($hostname . 'INBOX', $username, $password);
         if (!$inbox) {
+            self::imap_debug_log("Попытка не удалась: " . imap_last_error(), $debugMode, $progressCallback);
             Yii::error('Ошибка подключения: ' . imap_last_error(), __METHOD__);
         }
+        self::check_imap_errors($debugMode, $progressCallback);
         if ($progressCallback) {
             call_user_func($progressCallback, "Получение списка папок...");
         }
@@ -1411,16 +1418,21 @@ class MarketplaceService
 
         foreach ($folders as $folder) {
             $inbox = imap_open($folder, $username, $password);
+
             if (!$inbox) {
+                self::imap_debug_log("Соединение не удалось: " . imap_last_error(), $debugMode, $progressCallback);
                 Yii::error('Ошибка подключения: ' . imap_last_error(), __METHOD__);
             }
+            self::check_imap_errors($debugMode, $progressCallback);
             if ($progressCallback) {
                 call_user_func($progressCallback, "Поиск писем в папке: $folder...");
             }
-
+            self::imap_debug_log("Поисковой запрос: {$searchCriteria}", $debugMode, $progressCallback);
             $emails = imap_search($inbox, $searchCriteria);
-
+           // $emails = imap_search($inbox, 'ON "05-Mar-2025"');
+            self::check_imap_errors($debugMode, $progressCallback);
             if ($emails) {
+                self::imap_debug_log("Найдено " . count($emails) . " писем в " . $folder, $debugMode, $progressCallback);
                 if ($progressCallback) {
                     call_user_func($progressCallback, "Найдено " . count($emails) . " писем.");
                 }
@@ -1454,21 +1466,75 @@ class MarketplaceService
                             ];
                         }
                     }
-                    imap_setflag_full($inbox, $email_number, "\\Seen");
+                    self::imap_debug_log("Установка флага SEEN для сообшения #" . $email_number, $debugMode, $progressCallback);
+                    $result = imap_setflag_full($inbox, $email_number, "\\Seen");
+                    if (!$result) {
+                        self::imap_debug_log("Не удалось установить SEEN flag: " . imap_last_error(), $debugMode, $progressCallback);
+                    } else {
+                        self::imap_debug_log("SEEN установлен успешно", $debugMode, $progressCallback);
+                    }
+                    self::check_imap_errors($debugMode, $progressCallback);
+
+                    $overview_after = imap_fetch_overview($inbox, $email_number, 0);
+                    if (isset($overview_after[0]->seen) && $overview_after[0]->seen) {
+                        self::imap_debug_log("Сообщение #" . $email_number . "  помечено SEEN", $debugMode, $progressCallback);
+                    } else {
+                        self::imap_debug_log("WARNING: Сообщение #" . $email_number . " не удалось пометить как  SEEN", $debugMode, $progressCallback);
+                    }
+
                     if ($progressCallback) {
                         call_user_func($progressCallback, "От: " . $from . " тема " . $subject . " от " . $date);
                         call_user_func($progressCallback, "Обработано писем: " . ($index + 1) . " из " . count($emails));
                     }
                 }
+            } else {
+                self::imap_debug_log("В папке не найдено писем по критирию " . $folder . "", $debugMode, $progressCallback);
+
+                $last_status = imap_status($inbox, $folder, SA_ALL);
+                if ($last_status) {
+                    self::imap_debug_log("Статус папки на почте: " . print_r($last_status, true), $debugMode, $progressCallback);
+                } else {
+                    self::imap_debug_log("Не удалось получить статус папки", $debugMode, $progressCallback);
+                }
             }
             imap_close($inbox);
+
         }
 
-        usort($messages, fn($a, $b) => $a['subject_index'] <=> $b['subject_index']);
+        //usort($messages, fn($a, $b) => $a['subject_index'] <=> $b['subject_index']);
+        usort($messages, fn($a, $b) => strtotime($a['date']) <=> strtotime($b['date']));
         return $messages;
     }
 
 
+    public static function imap_debug_log($message, $debugMode, $progressCallback) {
+
+        if ($debugMode) {
+            if ($progressCallback) {
+                call_user_func($progressCallback, "DEBUG: " . $message);
+            }
+            Yii::info($message, 'imap_debug');
+        }
+    }
+
+    public static function check_imap_errors($debugMode, $progressCallback) {
+        $errors = imap_errors();
+        $alerts = imap_alerts();
+
+        if ($errors) {
+            foreach ($errors as $error) {
+                self::imap_debug_log("IMAP ERROR: " . $error, $debugMode, $progressCallback);
+            }
+        }
+
+        if ($alerts) {
+            foreach ($alerts as $alert) {
+                self::imap_debug_log("IMAP ALERT: " . $alert, $debugMode, $progressCallback);
+            }
+        }
+    }
+
+
     public static function processMessages(array $messages)
     {
         $count = 0;
@@ -1690,11 +1756,10 @@ class MarketplaceService
                 }
             }
         } else {
-            if ($index == self::SUBJECT_INDEX[self::SUBJECT_APPROVED] || $index == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) {
-                //заказ принят или изменен
-                $marketplaceOrder->status_id = $statusId;
-                $marketplaceOrder->substatus_id = $substatusId;
-
+            $marketplaceOrder->status_id = $statusId;
+            $marketplaceOrder->substatus_id = $substatusId;
+            if ($index == self::SUBJECT_INDEX[self::SUBJECT_APPROVED] ) {
+                //заказ принят
                 if ($marketplaceOrder->raw_data !== json_encode($orderDetails, JSON_UNESCAPED_UNICODE)) {
                     $marketplaceOrder->raw_data = json_encode($orderDetails, JSON_UNESCAPED_UNICODE);
                 }
@@ -1703,10 +1768,37 @@ class MarketplaceService
                 } else {
                     Yii::error('Не удалось обновить заказ' . json_encode($marketplaceOrder->getErrors(), JSON_UNESCAPED_UNICODE));
                 }
+            } elseif ($index == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) {
+                $oldRawData = json_decode($marketplaceOrder->raw_data,true, 512, JSON_UNESCAPED_UNICODE);
+                $isChanged = false;
+                // заказ изменен
+                if (isset($orderDetails['comment']) && (!isset($oldRawData['comment']) || $orderDetails['comment'] != $oldRawData['comment'])) {
+                    $oldRawData['comment'] = $orderDetails['comment'];
+                    $isChanged = true;
+                }
+                if (isset($orderDetails['delivery']) && (!isset($oldRawData['delivery']) || $orderDetails['delivery'] != $oldRawData['delivery'])) {
+                    $oldRawData['delivery'] = $orderDetails['delivery'];
+                    $isChanged = true;
+                }
+                if (isset($orderDetails['client']) && (!isset($oldRawData['client']) || $orderDetails['client'] != $oldRawData['client'])) {
+                    $oldRawData['client'] = $orderDetails['client'];
+                    $isChanged = true;
+                }
+                if (isset($orderDetails['recipient']) && (!isset($oldRawData['recipient']) || $orderDetails['recipient'] != $oldRawData['recipient'])) {
+                    $oldRawData['recipient'] = $orderDetails['recipient'];
+                    $isChanged = true;
+                }
+                if ($isChanged) {
+                    $marketplaceOrder->raw_data = json_encode($oldRawData, JSON_UNESCAPED_UNICODE);
+                    if ($marketplaceOrder->save()) {
+                        self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails);
+                    } else {
+                        Yii::error('Не удалось обновить заказ' . json_encode($marketplaceOrder->getErrors(), JSON_UNESCAPED_UNICODE));
+                    }
+                }
             } else {
                 // отмена или успешное выполнение
-                $marketplaceOrder->status_id = $statusId;
-                $marketplaceOrder->substatus_id = $substatusId;
+
                 if ($marketplaceOrder->save()) {
                     self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails);
                 } else {
@@ -1768,34 +1860,7 @@ class MarketplaceService
     private static function createOrUpdateStatusHistory($orderId, $statusId, $substatusId, $order)
     {
         $statusHistoryRecord = MarketplaceOrderStatusHistory::find()->where(['order_id' => $orderId])->andWhere(['active' => 1])->one();
-        if (
-            $statusHistoryRecord &&
-            ($statusHistoryRecord->status_id !== (int)$statusId ||
-                $statusHistoryRecord->substatus_id !== (int)$substatusId ||
-                $order['date'] !== $statusHistoryRecord->date_from
-            )
-        ) {
-            $statusHistoryRecord->active = 0;
-            $statusHistoryRecord->date_end = date('Y-m-d H:i:s');
-            $statusHistoryRecord->save();
-
-            $newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
-            $newStatusHistoryRecord->order_id = $orderId;
-            $newStatusHistoryRecord->status_id = (int)$statusId;
-            $newStatusHistoryRecord->substatus_id = (int)$substatusId;
-            $newStatusHistoryRecord->active = 1;
-            $newStatusHistoryRecord->initiator = "ERP";
-            $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s', strtotime($order['date']));
-            $newStatusHistoryRecord->date_end = date('Y-m-d H:i:s', strtotime("2100-01-01"));
-            if (!$newStatusHistoryRecord->save()) {
-                Yii::error(
-                    'Ошибка сохранения новой истории статуса: ' . json_encode(
-                        $newStatusHistoryRecord->getErrors(),
-                        JSON_UNESCAPED_UNICODE
-                    )
-                );
-            }
-        } else {
+        if (!$statusHistoryRecord) {
             $history = new MarketplaceOrderStatusHistory();
             $history->order_id = $orderId;
             $history->status_id = $statusId;
@@ -1813,6 +1878,34 @@ class MarketplaceService
                     )
                 );
             }
+
+        } else {
+            if (
+                ($statusHistoryRecord->status_id !== (int)$statusId ||
+                $statusHistoryRecord->substatus_id !== (int)$substatusId) ||
+                (strtotime($order['date']) > strtotime($statusHistoryRecord->date_from))
+                ) {
+                $statusHistoryRecord->active = 0;
+                $statusHistoryRecord->date_end = date('Y-m-d H:i:s');
+                $statusHistoryRecord->save();
+
+                $newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
+                $newStatusHistoryRecord->order_id = $orderId;
+                $newStatusHistoryRecord->status_id = (int)$statusId;
+                $newStatusHistoryRecord->substatus_id = (int)$substatusId;
+                $newStatusHistoryRecord->active = 1;
+                $newStatusHistoryRecord->initiator = "ERP";
+                $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s', strtotime($order['date']));
+                $newStatusHistoryRecord->date_end = date('Y-m-d H:i:s', strtotime("2100-01-01"));
+                if (!$newStatusHistoryRecord->save()) {
+                    Yii::error(
+                        'Ошибка сохранения новой истории статуса: ' . json_encode(
+                            $newStatusHistoryRecord->getErrors(),
+                            JSON_UNESCAPED_UNICODE
+                        )
+                    );
+                }
+            }
         }
     }