]
];
+ const SUBJECT_NEW = '/^Новый_оплаченный_заказ$/';
+ const SUBJECT_APPROVED = '/^Заказ_№\d+_принят!$/';
+ const SUBJECT_CANCELLED = '/^Заказ_№\d+_отменён$/';
+ const SUBJECT_CHANGED = '/^Изменения_в_заказе_№\d+$/';
+ const SUBJECT_DELIVERED = '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/';
+
+
const SUBJECT_INDEX = [
- '/^Новый_оплаченный_заказ$/' => 1,
- '/^Заказ_№\d+_принят!$/' => 2,
- '/^Заказ_№\d+_отменён$/' => 3,
- '/^Изменения_в_заказе_№\d+$/' => 4,
- '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/' => 5,
+ self::SUBJECT_NEW => 1,
+ self::SUBJECT_APPROVED => 2,
+ self::SUBJECT_CHANGED => 3,
+ self::SUBJECT_CANCELLED => 4,
+ self::SUBJECT_DELIVERED => 5,
];
public static function infoForMarketplace(int $marketId) {
$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);
//$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 = [];
$subjectPatterns = [
- '/^Новый_оплаченный_заказ$/',
- '/^Заказ_№\d+_принят!$/',
- '/^Заказ_№\d+_отменён$/',
- '/^Изменения_в_заказе_№\d+$/',
- '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/',
+ self::SUBJECT_NEW,
+ self::SUBJECT_APPROVED,
+ self::SUBJECT_CHANGED,
+ self::SUBJECT_CANCELLED,
+ self::SUBJECT_DELIVERED,
];
if ($emails) {
foreach ($structure->parts as $partNum => $part) {
if ($part->subtype == 'HTML') {
$htmlMessage = imap_fetchbody($inbox, $email_number, $partNum + 1);
- $htmlMessage = quoted_printable_decode($htmlMessage);
+ // $htmlMessage = quoted_printable_decode($htmlMessage);
break;
}
}
$count = 0;
if ($messages) {
foreach ($messages as $message) {
- if ($message['subject_index'] == 1) {
- $order = self::getOrdersDataFromMessage($message);
- $count += self::processFlowwowOrders($order);
-
- } elseif ($message['subject_index'] == 2) {
- $order = self::getOrdersDataFromMessage($message);
- $count += self::processFlowwowOrders($order);
-
- } elseif ($message['subject_index'] == 3) {
- $order = self::getOrdersDataFromMessage($message);
-
- } elseif ($message['subject_index'] == 4) {
- $order = self::getOrdersDataFromMessage($message);
-
- } elseif ($message['subject_index'] == 5) {
- $order = self::getOrdersDataFromMessage($message);
-
+ $store = MarketplaceStore::getWarehouseGuidByAccountEmail($message['to']) ?? 206008;
+ // Yii::warning('Message' . json_encode($message, JSON_UNESCAPED_UNICODE));
+ $order = self::getOrdersDataFromMessage($message);
+ Yii::warning('Order' . json_encode($order, JSON_UNESCAPED_UNICODE));
+ if ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_NEW]) {
+ $statusCode = 'PROCESSING';
+ $substatusCode = 'STARTED';
+ } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_APPROVED]) {
+ $statusCode = 'PROCESSING';
+ $substatusCode = 'APPROVED';
+ } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CANCELLED]) {
+ $statusCode = 'CANCELLED';
+ $substatusCode = 'USER_CHANGED_MIND';
+ } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) {
+ $statusCode = 'PROCESSING';
+ $substatusCode = 'CHANGED';
+ } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_DELIVERED]) {
+ $statusCode = 'DELIVERED';
+ $substatusCode = 'DELIVERY_SERVICE_DELIVERED';
+ } else {
+ $statusCode = 'PROCESSING';
+ $substatusCode = 'STARTED';
}
-
-
-
+ $count += self::processFlowwowOrders($order, $store, $statusCode, $substatusCode, $message['subject_index']);
}
}
return $count;
}
-
public static function getOrdersDataFromMessage($message) {
$html = $message['body'];
+ // Yii::warning('Message body' . $html);
$orderDetails = null;
$order = null;
if (!empty($html)) {
- $html = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
+ $html = quoted_printable_decode($html);
+ $html = preg_replace('/\s+/', ' ', $html);
+ // Декодируем HTML-сущности
+ $html = html_entity_decode($html, ENT_COMPAT, 'UTF-8');
- $doc = new HtmlDomParser($html);
+ // Удаляем лишние пробелы и переносы строк
+ // $html = preg_replace('/\s+/', ' ', $html);
+ // Yii::warning('Message body' . $html);
+ $doc = new HtmlDomParser($html);
+ $orderNumber = '';
$main = $doc->findOneOrFalse("body");
if ($main !== false) {
}
}
$orderDetails['number'] = $orderNumber;
+ $orderDetails['date'] = $message['date'];
$deliveryText = '';
$commentText = '';
$clientText = '';
$orderDetails['recipient'] = $recipientText;
}
+ $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__);
+ } elseif ($main->findOneOrFalse('table p:contains("Детали заказа")') != false) {
+ $itemsBlock = $main->findOneOrFalse('table p:contains("Детали заказа")');
+ Yii::warning('Детали заказа 2: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
+ }
- $itemsBlock = $main->findOneOrFalse('h2:contains("Детали заказа")') ? $main->findOne('h2:contains("Детали заказа")') : $main->findOneOrFalse('p:contains("Детали заказа")');
if ($itemsBlock) {
- $itemsTable = $itemsBlock->parentNode()->find('table', 2);
+ Yii::warning('Детали заказа 3: ' . json_encode($itemsBlock->parentNode()->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
+ // $itemsTable = $itemsBlock->parentNode()->find('table', 2);
+ $itemsTable = $itemsBlock->parentNode();
$itemsRows = $itemsTable->find('tr');
foreach ($itemsRows as $itemsRow) {
'price' => '',
];
-
// Извлекаем название и количество из второго <td>
$tds = $itemsRow->find('td');
if (count($tds) >= 2) {
$itemData['name'] = trim(str_replace("\u{00A0}", ' ', strip_tags(preg_replace('/\s+/', ' ',$tds[1]->find('p', 0)->innerText()))));
$itemData['count'] = trim(str_replace(["\u{00A0}", 'шт.'], '', strip_tags(preg_replace('/\s+/', '', $tds[1]->find('p', 1)->innerText()))));
}
-
// Извлекаем цену из третьего <td>
if (count($tds) >= 3) {
$itemData['price'] = (float)trim(str_replace(["\u{00A0}", '₽' , ' '], '', strip_tags(preg_replace('/\s+/', ' ', $tds[2]->find('p', 0)->innerText()))));
}
-
-
// Добавляем данные в массив
$orderItems[] = $itemData;
}
$totalSum = 0;
- $sumBlock = $itemsBlock->parentNode()->find('table', 3);
+ $sumBlock = $itemsBlock->parentNode()->nextNonWhitespaceSibling();
$sumRow = $sumBlock->find('tr');
$sumTds = $sumRow->find('td');
- if (count($sumTds) >= 2) {
+ if ($sumTds && count($sumTds) >= 2) {
$totalSum = (float)trim(str_replace(["\u{00A0}", '₽' , ' '], '', strip_tags(preg_replace('/\s+/', ' ', $sumTds[1]->innerText()))));
-
}
$orderDetails['items'] = $orderItems;
$orderDetails['totalSum'] = $totalSum;
}
-
-
- public static function processFlowwowOrders(array $allOrders)
+ public static function processFlowwowOrders($order, $store, $statusCode, $substatusCode, $index)
{
$statuses = MarketplaceOrderStatusTypes::find()
->select(['id', 'code'])
$statuses = ArrayHelper::map($statuses, 'code', 'id');
$statusCodes = array_unique(array_keys($statuses));
$newOrdersCount = 0;
- $campaignId = 206008;
+ $campaignId = $store;
- foreach ($allOrders as $number => $order) {
- $statusCode = 'PROCESS';
- $substatusCode = 'STARTED';
+ $orderNumber = key($order);
+ $orderDetails = reset($order);
- $statusId = self::getOrCreateStatus($statusCode, $statuses, $statusCodes);
- $substatusId = self::getOrCreateStatus($substatusCode, $statuses, $statusCodes);
-
- $marketplaceOrder = MarketplaceOrders::find()
- ->where(['marketplace_order_id' => (string)$number])
- ->one();
-
- if (!$marketplaceOrder) {
- Yii::warning("Номер " . json_encode($number, JSON_UNESCAPED_UNICODE));
- Yii::warning("Заказ " . json_encode($order, JSON_UNESCAPED_UNICODE));
+ $statusId = self::getOrCreateStatus($statusCode, $statuses, $statusCodes);
+ $substatusId = self::getOrCreateStatus($substatusCode, $statuses, $statusCodes);
+ Yii::warning("Статус " . $statusId);
+ Yii::warning("Субстатус " . $substatusId);
+ $marketplaceOrder = MarketplaceOrders::find()
+ ->where(['marketplace_order_id' => (string)$orderNumber])
+ ->one();
- $marketplaceOrder = self::createOrder($order, $campaignId, $statusId, $substatusId);
+ if (!$marketplaceOrder) {
+ Yii::warning("Номер " . json_encode($orderNumber, JSON_UNESCAPED_UNICODE));
+ Yii::warning("Заказ " . json_encode($orderDetails, JSON_UNESCAPED_UNICODE));
+ if ($index == self::SUBJECT_INDEX[self::SUBJECT_NEW]) {
+ $marketplaceOrder = self::createOrder($orderDetails, $campaignId, $statusId, $substatusId);
if ($marketplaceOrder->save()) {
- $newOrdersCount += 1;
- self::createStatusHistory($marketplaceOrder->id, $statusId, $substatusId);
- self::saveOrderItems($order, $marketplaceOrder->id, $marketplaceOrder->warehouse_guid);
-
+ $newOrdersCount += 1;
+ self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId);
+ self::saveOrderItems($orderDetails, $marketplaceOrder->id, $marketplaceOrder->warehouse_guid);
} else {
- Yii::error(
- 'Ошибка сохранения заказа: ' . json_encode(
- $marketplaceOrder->getErrors(),
- JSON_UNESCAPED_UNICODE
- )
- );
+ Yii::error(
+ 'Ошибка сохранения заказа: ' . json_encode(
+ $marketplaceOrder->getErrors(),
+ JSON_UNESCAPED_UNICODE
+ )
+ );
+ }
+ }
+ } else {
+ if ($index == self::SUBJECT_APPROVED || $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);
+ } 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);
+ } else {
+ Yii::error('Не удалось обновить заказ' . json_encode($marketplaceOrder->getErrors(), JSON_UNESCAPED_UNICODE));
}
}
}
+
return $newOrdersCount;
}
return $marketplaceOrder;
}
- private static function createStatusHistory($orderId, $statusId, $substatusId)
+ private static function createOrUpdateStatusHistory($orderId, $statusId, $substatusId)
{
- $history = new MarketplaceOrderStatusHistory();
- $history->order_id = $orderId;
- $history->status_id = $statusId;
- $history->substatus_id = $substatusId;
- $history->active = 1;
- $history->initiator = "ERP";
- $history->date_from = date('Y-m-d H:i:s');
- $history->date_end = '2100-01-01 00:00:00';
- $history->save();
+ $statusHistoryRecord = MarketplaceOrderStatusHistory::find()->where(['order_id' => $orderId])->andWhere(['active' => 1])->one();
+ if (
+ $statusHistoryRecord &&
+ ($statusHistoryRecord->status_id !== (int)$statusId ||
+ $statusHistoryRecord->substatus_id !== (int)$substatusId)
+ ) {
+ $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');
+ $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 {
+ $history = new MarketplaceOrderStatusHistory();
+ $history->order_id = $orderId;
+ $history->status_id = $statusId;
+ $history->substatus_id = $substatusId;
+ $history->active = 1;
+ $history->initiator = "ERP";
+ $history->date_from = date('Y-m-d H:i:s');
+ $history->date_end = '2100-01-01 00:00:00';
+
+ if (!$history->save()) {
+ Yii::error(
+ 'Ошибка сохранения новой истории статуса: ' . json_encode(
+ $history->getErrors(),
+ JSON_UNESCAPED_UNICODE
+ )
+ );
+ }
+ }
}
+
+
private static function saveOrderItems($order, $orderId, $warehouseGuid)
{
$items = $order['items'];