}
}
- public static function getFlowwowOrdersFromMail()
+ public static function getFlowwowOrdersFromMail($date = null, $useSince = false, $useAlternateMailbox = false, $progressCallback = null, $seen = false)
{
set_time_limit(300);
-
- $hostname = '{imap.yandex.ru:993/imap/ssl}INBOX';
- $username = 'Zakaz-bazacvetov24@yandex.ru';
- $password = 'jyxnwwwvgpwhzbdu';
-
- /*$hostname = '{imap.yandex.ru:993/imap/ssl}INBOX';
- $username = 'flow@bazacvetov24.ru';
- $password = 'ctqamxqeshgxwsgn';*/
-
// Устанавливаем таймауты IMAP
imap_timeout(IMAP_OPENTIMEOUT, 120);
imap_timeout(IMAP_READTIMEOUT, 120);
imap_timeout(IMAP_WRITETIMEOUT, 120);
imap_timeout(IMAP_CLOSETIMEOUT, 120);
- $inbox = imap_open($hostname, $username, $password);
- if (!$inbox) {
- Yii::error('Ошибка подключения: ' . imap_last_error(), __METHOD__);
- return ['success' => false];
+ $searchCriteria = '';
+ $searchCriteria .= ($useSince ? 'SINCE ' : 'ON ');
+
+
+ if (!$date) {
+ $date = date('d-M-Y');
+ $searchCriteria .= '"' . $date . '" ';
+ } else {
+ $date = date('d-M-Y', strtotime($date));
+ $searchCriteria .= '"' . $date . '" ';
}
- //$inboxInfo = imap_mailboxmsginfo($inbox);
- //Yii::warning(' Состояние ящика: ' . print_r($inboxInfo, true), __METHOD__);
- $emails = imap_search($inbox, 'ON "14-Feb-2025" FROM "info@flowwow.com" ');
- //$emails = imap_search($inbox, 'ON "18-Mar-2025" FROM "info@flowwow.com" ');
- $messages = [];
+ $searchCriteria .= ($seen ? 'SEEN ' : 'UNSEEN ');
$subjectPatterns = [
self::SUBJECT_NEW,
self::SUBJECT_DELIVERED,
];
- 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);
- $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;
+ $hostname = '{imap.yandex.ru:993/imap/ssl}';
+ if ($useAlternateMailbox) {
+ $username = 'Zakaz-bazacvetov24@yandex.ru';
+ $password = 'jyxnwwwvgpwhzbdu';
+ $searchCriteria .= 'FROM "<info@flowwow.com>"';
+ } else {
+ $username = 'flow@bazacvetov24.ru';
+ $password = 'ctqamxqeshgxwsgn';
+ $searchCriteria .= 'FROM "<info@flowwow.com>"';
+ }
+
+ if ($progressCallback) {
+ call_user_func($progressCallback, "Строка поиска: {$searchCriteria}");
+ }
+
+ if ($progressCallback) {
+ call_user_func($progressCallback, "Подключение к почтовому ящику...");
+ }
+ $inbox = imap_open($hostname . 'INBOX', $username, $password);
+ if (!$inbox) {
+ Yii::error('Ошибка подключения: ' . imap_last_error(), __METHOD__);
+ }
+ if ($progressCallback) {
+ call_user_func($progressCallback, "Получение списка папок...");
+ }
+ $folders = imap_list($inbox, $hostname, '*');
+ imap_close($inbox);
+
+ $messages = [];
+
+ foreach ($folders as $folder) {
+ $inbox = imap_open($folder, $username, $password);
+ if (!$inbox) {
+ Yii::error('Ошибка подключения: ' . imap_last_error(), __METHOD__);
+ }
+ if ($progressCallback) {
+ call_user_func($progressCallback, "Поиск писем в папке: $folder...");
+ }
+
+ $emails = imap_search($inbox, $searchCriteria);
+
+ if ($emails) {
+ if ($progressCallback) {
+ call_user_func($progressCallback, "Найдено " . count($emails) . " писем.");
+ }
+ foreach ($emails as $index => $email_number) {
+ $overview = imap_fetch_overview($inbox, $email_number, 0);
+ $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)));
+ 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);
+ break;
+ }
}
}
- }
- $messages[] = [
- 'subject' => $subject,
- 'subject_index' => $subjectIndex,
- 'from' => $from,
- 'to' => $to,
- 'date' => $date,
- 'body' => $htmlMessage,
- ];
+ $messages[] = [
+ 'subject' => $subject,
+ 'subject_index' => $subjectIndex,
+ 'from' => $from,
+ 'to' => $to,
+ 'date' => $date,
+ 'body' => $htmlMessage,
+ ];
+ }
+ }
+ imap_setflag_full($inbox, $email_number, "\\Seen");
+ if ($progressCallback) {
+ call_user_func($progressCallback, "От: " . $from . " тема " . $subject . " от " . $date);
+ call_user_func($progressCallback, "Обработано писем: " . ($index + 1) . " из " . count($emails));
}
}
- // imap_setflag_full($inbox, $email_number, "\\Seen");
}
+ imap_close($inbox);
}
- imap_close($inbox);
+
usort($messages, fn($a, $b) => $a['subject_index'] <=> $b['subject_index']);
return $messages;
}
$clientText = '';
$recipientText = '';
$orderItems = [];
+ $orderLink = '';
+
+ $linkBlock = $main->findOneOrFalse('a:contains("Перейти в заказ ")');
+ if ($linkBlock) {
+ $link = $linkBlock->getAttribute('href');
+ $orderDetails['orderLink'] = $link;
+ }
$deliveryBlock = $main->findOne('p:contains("Доставить")');
$itemsBlock = false;
if ($main->findOneOrFalse('table h2:contains("Детали заказа")') != false) {
$itemsBlock = $main->findOneOrFalse('table h2:contains("Детали заказа")');
- Yii::warning('Детали заказа 1: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
+ // Yii::warning('Детали заказа 1: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
} elseif ($main->findOneOrFalse('table p:contains("Детали заказа")') != false) {
$itemsBlock = $main->findOneOrFalse('table p:contains("Детали заказа")');
- Yii::warning('Детали заказа 2: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
+ // Yii::warning('Детали заказа 2: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
}
if ($itemsBlock) {
$marketplaceOrder = self::createOrder($orderDetails, $campaignId, $statusId, $substatusId);
if ($marketplaceOrder->save()) {
$newOrdersCount += 1;
- self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId);
+ self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails);
self::saveOrderItems($orderDetails, $marketplaceOrder->id, $marketplaceOrder->warehouse_guid);
} else {
Yii::error(
}
}
} else {
- if ($index == self::SUBJECT_APPROVED || $index == self::SUBJECT_CHANGED) {
+ if ($index == self::SUBJECT_INDEX[self::SUBJECT_APPROVED] || $index == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) {
//заказ принят или изменен
$marketplaceOrder->status_id = $statusId;
$marketplaceOrder->substatus_id = $substatusId;
+
if ($marketplaceOrder->raw_data !== json_encode($orderDetails, JSON_UNESCAPED_UNICODE)) {
$marketplaceOrder->raw_data = json_encode($orderDetails, JSON_UNESCAPED_UNICODE);
}
if ($marketplaceOrder->save()) {
- self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId);
+ self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails);
} else {
Yii::error('Не удалось обновить заказ' . json_encode($marketplaceOrder->getErrors(), JSON_UNESCAPED_UNICODE));
}
$marketplaceOrder->status_id = $statusId;
$marketplaceOrder->substatus_id = $substatusId;
if ($marketplaceOrder->save()) {
- self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId);
+ self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails);
} else {
Yii::error('Не удалось обновить заказ' . json_encode($marketplaceOrder->getErrors(), JSON_UNESCAPED_UNICODE));
}
return $marketplaceOrder;
}
- private static function createOrUpdateStatusHistory($orderId, $statusId, $substatusId)
+ 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)
+ $statusHistoryRecord->substatus_id !== (int)$substatusId ||
+ $order['date'] !== $statusHistoryRecord->date_from
+ )
) {
$statusHistoryRecord->active = 0;
$statusHistoryRecord->date_end = date('Y-m-d H:i:s');
$newStatusHistoryRecord->substatus_id = (int)$substatusId;
$newStatusHistoryRecord->active = 1;
$newStatusHistoryRecord->initiator = "ERP";
- $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
+ $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(
$history->substatus_id = $substatusId;
$history->active = 1;
$history->initiator = "ERP";
- $history->date_from = date('Y-m-d H:i:s');
+ $history->date_from = date('Y-m-d H:i:s', strtotime($order['date']));
$history->date_end = '2100-01-01 00:00:00';
if (!$history->save()) {