From: fomichev Date: Fri, 21 Mar 2025 12:54:53 +0000 (+0300) Subject: Измение и дебагинг X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=4c0e59bd1187f6904c68f1c0f2f5bc0020f02809;p=erp24_rep%2Fyii-erp24%2F.git Измение и дебагинг --- diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 31af7280..5af8ebaa 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -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 ""'; + $searchCriteria .= ''; } else { $username = 'flow@bazacvetov24.ru'; $password = 'ctqamxqeshgxwsgn'; - $searchCriteria .= 'FROM ""'; + $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 + ) + ); + } + } } }