class FlowwowController extends Controller
{
+ const SUBJECT_INDEX = [
+ '/^Новый_оплаченный_заказ$/' => 1,
+ '/^Заказ_№\d+_принят!$/' => 2,
+ '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/' => 3,
+ '/^Заказ_№\d+_отменён$/' => 4,
+ '/^Изменения_в_заказе_№\d+$/' => 5,
+ ];
+
/**
* Экшен для генерации и отображения XML-фида.
*
{
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';
$subjectPatterns = [
'/^Новый_оплаченный_заказ$/',
'/^Заказ_№\d+_принят!$/',
- // '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/',
- // '/^Заказ_№\d+_отменён$/',
- // '/^Изменения_в_заказе_№\d+$/',
+ '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/',
+ '/^Заказ_№\d+_отменён$/',
+ '/^Изменения_в_заказе_№\d+$/',
];
if ($emails) {
$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) {
$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'];
]
];
+ 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;
//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()