From 1cb70440112b5ce569a054805eff230c0edeba18 Mon Sep 17 00:00:00 2001 From: fomichev Date: Tue, 18 Mar 2025 17:46:46 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81=D1=8B?= =?utf8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA?= =?utf8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/media/controllers/FlowwowController.php | 30 +++- erp24/services/MarketplaceService.php | 140 ++++++++---------- 2 files changed, 88 insertions(+), 82 deletions(-) diff --git a/erp24/media/controllers/FlowwowController.php b/erp24/media/controllers/FlowwowController.php index de352994..b4e365b3 100644 --- a/erp24/media/controllers/FlowwowController.php +++ b/erp24/media/controllers/FlowwowController.php @@ -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']; diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 186b349e..6c6dded6 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -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() -- 2.39.5