$progressCallback = null,
$seen = false
) {
+ imap_errors();
+ imap_alerts();
+ $debugMode = true;
+
set_time_limit(300);
// Устанавливаем таймауты IMAP
imap_timeout(IMAP_OPENTIMEOUT, 120);
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) {
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, "Получение списка папок...");
}
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) . " писем.");
}
];
}
}
- 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;
}
}
} 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);
}
} 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 {
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;
)
);
}
+
+ } 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
+ )
+ );
+ }
+ }
}
}