From: fomichev Date: Mon, 24 Mar 2025 11:43:47 +0000 (+0300) Subject: Запись писем X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=c1a3cc534f58898bdea33783cc99c6c24d3ed10a;p=erp24_rep%2Fyii-erp24%2F.git Запись писем --- diff --git a/erp24/commands/MarketplaceController.php b/erp24/commands/MarketplaceController.php index a1af78ca..11d0ec3c 100644 --- a/erp24/commands/MarketplaceController.php +++ b/erp24/commands/MarketplaceController.php @@ -34,9 +34,13 @@ class MarketplaceController extends Controller */ public $oldMail; /** - * @var int|null передаем 0 (false), чтобы забирать все письма а не только непросмотренные UNSEEN + * @var int|null передаем 1 (true), чтобы забирать все письма SEEN */ public $seen; + /** + * @var int|null передаем 1 (true), чтобы забирать все письма UNSEEN + */ + public $unseen; public function actionYandex() { $infoForMarketplace = MarketplaceService::infoForMarketplace(2); @@ -94,6 +98,7 @@ class MarketplaceController extends Controller $since = (bool)($this->since ?? 0); $oldMail = (bool)($this->oldMail ?? 0); $seen = (bool)($this->seen ?? 0); + $unseen = (bool)($this->unseen ?? 0); $countMessages = 0; $count = 0; @@ -102,7 +107,7 @@ class MarketplaceController extends Controller $this->stdout($message . "\n", BaseConsole::FG_YELLOW); }; - $messages = MarketplaceService::getFlowwowOrdersFromMail($date, $since, $oldMail, $progressCallback, $seen); + $messages = MarketplaceService::getFlowwowOrdersFromMail($date, $since, $oldMail, $progressCallback, $seen, $unseen); $countMessages = count($messages); $count = MarketplaceService::processMessages($messages); @@ -122,6 +127,7 @@ class MarketplaceController extends Controller $options[] = 'since'; $options[] = 'oldMail'; $options[] = 'seen'; + $options[] = 'unseen'; return $options; } diff --git a/erp24/media/controllers/FlowwowController.php b/erp24/media/controllers/FlowwowController.php index 76ea851b..d1170115 100644 --- a/erp24/media/controllers/FlowwowController.php +++ b/erp24/media/controllers/FlowwowController.php @@ -78,13 +78,1080 @@ class FlowwowController extends Controller set_time_limit(300); Yii::$app->response->format = Response::FORMAT_JSON; - $html = ''; + $html = ' + + + + + =D0=9D=D0=BE=D0=B2=D1=8B=D0=B9 = +=D0=BE=D0=BF=D0=BB=D0=B0=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9 = +=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7 + + + + + + + + + + + + +
  +
+ + + + + + + + + +
+ + 3D"Logo" + +
+ + + + +
+

+ =D0=9D=D0=BE=D0=B2=D1=8B=D0=B9 = +=D0=BE=D0=BF=D0=BB=D0=B0=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9 = +=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7 =E2=84=9613785415 = +

+

+ = +=D0=9F=D0=BE=D0=B6=D0=B0=D0=BB=D1=83=D0=B9=D1=81=D1=82=D0=B0, = +=D0=BF=D0=B5=D1=80=D0=B5=D0=B9=D0=B4=D0=B8=D1=82=D0=B5 =D0=BF=D0=BE = +=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B5, =D1=87=D1=82=D0=BE=D0=B1=D1=8B = +=D0=BF=D1=80=D0=B8=D0=BD=D1=8F=D1=82=D1=8C = +=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7 =D0=B8=D0=BB=D0=B8 = +=D0=BE=D1=82=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D1=8C=D1=81=D1=8F = +=D0=BE=D1=82 =D0=BD=D0=B5=D0=B3=D0=BE.

+ + + + + + + +
+ + + + + + +
+ + = +=D0=9F=D0=B5=D1=80=D0=B5=D0=B9=D1=82=D0=B8 =D0=B2 = +=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7 = + +
+
+ + + +

+ =D0=94=D0=B5=D1=82=D0=B0=D0=BB=D0=B8 = +=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D0=B0

+ + + + + + + + + + + + + + +
+ 3D"img" + +

+ =D0=91=D1=83=D0=BA=D0=B5=D1=82 = +=D0=B8=D0=B7 35 =D1=80=D0=BE=D0=B7 =D0=9A=D0=B5=D0=BD=D0=B8=D1=8F = +=D0=BC=D0=B8=D0=BA=D1=81

+

+ 1 =D1=88=D1=82. = +

+
+

+ 5 990₽ = +

+
+ 3D"img" + +

+ = +=D0=9E=D1=82=D0=BA=D1=80=D1=8B=D1=82=D0=BA=D0=B0 = +

+

+ 1 =D1=88=D1=82. = +

+
+

+ 0₽ = +

+
+ + + + + + + + + =20 + + + + + + +
+

+ = +=D0=94=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B0 = +

+ = +

+ = +=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B0=D1=82=D0=B5=D0=BB=D1=8E = +=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D1=82=D1=81=D1=8F = +=D1=81=D0=BC=D1=81 =D1=81 = +=D0=BF=D1=80=D0=BE=D1=81=D1=8C=D0=B1=D0=BE=D0=B9 = +=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D1=8C = +=D0=B0=D0=B4=D1=80=D0=B5=D1=81 =D0=B8 =D0=B2=D1=80=D0=B5=D0=BC=D1=8F = +=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B8. = +

+ = +
+

+ 350₽ = +

+
+

+ =D0=98=D1=82=D0=BE=D0=B3=D0=BE = +=D0=BE=D0=BF=D0=BB=D0=B0=D1=87=D0=B5=D0=BD=D0=BE = +

+
+

+ 6 340₽ = +

+
+

+ =D0=92=D0=B0=D0=B6=D0=BD=D0=BE = +=D1=80=D0=B5=D0=B0=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C = +=D0=BD=D0=B0 =D0=B7=D0=B0=D0=BA=D0=B0=D0=B7 =D0=BA=D0=B0=D0=BA = +=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE = +=D0=B1=D1=8B=D1=81=D1=82=D1=80=D0=B5=D0=B5
+ =D0=9A=D0=BB=D0=B8=D0=B5=D0=BD=D1=82 = +=D1=83=D0=B6=D0=B5 =D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B8=D0=BB = +=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7 =D0=B8 =D0=B6=D0=B4=D0=B5=D1=82 = +=D0=BF=D1=80=D0=B8=D0=BD=D1=8F=D1=82=D0=B8=D1=8F = +=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D0=B0. =D0=B5=D1=81=D0=BB=D0=B8 = +=D0=B2=D1=8B = +=D0=BF=D1=80=D0=BE=D0=B8=D0=B3=D0=BD=D0=BE=D1=80=D0=B8=D1=80=D1=83=D0=B5=D1= +=82=D0=B5 =D0=B7=D0=B0=D0=BA=D0=B0=D0=B7, =D1=82=D0=BE = +=D0=BC=D0=B0=D0=B3=D0=B0=D0=B7=D0=B8=D0=BD = +=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D1=82 = +=D1=88=D1=82=D1=80=D0=B0=D1=84, =D1=82=D0=B0=D0=BA =D0=B6=D0=B5 = +=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE = +=D0=B1=D1=83=D0=B4=D0=B5=D1=82 =D1=81=D0=BA=D1=80=D1=8B=D1=82 = +=D0=BE=D1=82 =D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=BE=D0=B2. = +=D0=9F=D0=BE=D0=BC=D0=BD=D0=B8=D1=82=D0=B5, =D0=BE=D1=82 = +=D0=B2=D0=B0=D1=81 =D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D1=82 = +=D1=80=D0=B5=D0=BF=D1=83=D1=82=D0=B0=D1=86=D0=B8=D1=8F = +=D0=B2=D0=B0=D1=88=D0=B5=D0=B3=D0=BE = +=D0=BC=D0=B0=D0=B3=D0=B0=D0=B7=D0=B8=D0=BD=D0=B0 =D0=B8 = +=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0.

+
+
+ + +
+ + + + =20 + + + + + + + + + + =20 +
+ + + + + + + + + + + +
+ + + + +
+ + + + + +
+ + + + +
+ +
+
+ + + + +
+ = + + = + + = + + = + + = +
+ = + + = +
+
+
+
+
+ + + + +
+
+ + = +=D0=A0=D0=B0=D1=81=D1=81=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D0=BC = +=D0=BA=D0=B0=D0=BA = +=D1=80=D0=B0=D0=B7=D0=B2=D0=B8=D0=B2=D0=B0=D1=82=D1=8C = +=D1=81=D0=B2=D0=BE=D0=B9 =D0=B1=D1=80=D0=B5=D0=BD=D0=B4 =D0=B8 = +=D0=BF=D1=80=D0=B8=D0=B2=D0=BB=D0=B5=D1=87=D1=8C = +=D0=BF=D0=BE=D0=BA=D1=83=D0=BF=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9 = + +
+
+
+
+ + + +
+
+ + + + + + + +
+ + + + +
+ + + + + +
+ + + + +
+ +
+
+ + + + +
+ = + + = + + = + + = + + = +
+ = + + = +
+
+
+
+
+ + + + +
+
+ =D0=9E=D0=B1=D0=BC=D0=B5=D0=BD=D0=B8=D0=B2= +=D0=B0=D0=B9=D1=82=D0=B5=D1=81=D1=8C = +=D0=BE=D0=BF=D1=8B=D1=82=D0=BE=D0=BC =D0=B2 = +=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=B5 = +=D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D1=82=D0= +=B5=D0=BB=D0=B5=D0=B9 +
+
+
+
+ + + + + + + +
+ + + + +
+ + + + + +
+ + + + +
+ +
+
+ + + + +
+ = + + = + + = + + = + + = +
+ = + + = +
+
+
+
+
+ + + + +
+
+ =D0=97=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8= + =D0=B0=D0=BD=D0=BA=D0=B5=D1=82=D1=83 =D0=B8 = +=D0=BE=D1=82=D0=BA=D1=80=D0=BE=D0=B9 =D1=81=D0=B2=D0=BE=D0=B9 = +=D1=81=D0=BE=D0=B1=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9 = +=D0=BC=D0=B0=D0=B3=D0=B0=D0=B7=D0=B8=D0=BD FMART +
+
+
+
+ + + + +
+ =D0=9F=D0=BE=D0=BB=D0=B5=D0=B7=D0=BD=D1=8B=D0=B9 = +=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BD=D1=82 + + + 3D"VK" + + + 3D"Zen" + + =20 + =20 +
+ + + + + + + + + +
+ =D0=A1=D0=BA=D0=B0=D1=87=D0=B0=D1=82=D1=8C = +=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5 + + + 3D"App + + + 3D"Google + +
+ + + =D0=A6=D0=B5=D0=BD=D1=82=D1=80 = +=D0=BF=D0=BE=D0=BC=D0=BE=D1=89=D0=B8 + +
+
+ + + +   + + + 3D"" + + +'; //$html = quoted_printable_decode($html); if (!empty($html)) { + $html = quoted_printable_decode($html); + $html = preg_replace('/\s+/', ' ', $html); + // Декодируем HTML-сущности $html = html_entity_decode($html, ENT_COMPAT, 'UTF-8'); - $doc = new HtmlDomParser($html); - + $doc = new HtmlDomParser($html); + $orderNumber = ''; $main = $doc->findOneOrFalse("body"); if ($main !== false) { @@ -95,16 +1162,20 @@ class FlowwowController extends Controller } } $orderDetails['number'] = $orderNumber; + $orderDetails['date'] = date('Y-m-d H:m:s'); $deliveryText = ''; - $commentText = ''; $clientText = ''; - $recipientText = ''; $orderItems = []; - $deliveryBlock = $main->findOne('p:contains("Доставить")'); + $linkBlock = $main->findOneOrFalse('a:contains("Перейти в заказ ")'); + if ($linkBlock) { + $link = $linkBlock->getAttribute('href'); + $orderDetails['orderLink'] = $link; + } + $deliveryBlock = $main->findOne('p:contains("Доставить")'); $pickupBlock = $main->findOne('p:contains("Самовывоз")'); if ($deliveryBlock && $deliveryBlock->nextNonWhitespaceSibling()) { @@ -129,8 +1200,6 @@ class FlowwowController extends Controller $orderDetails['comment'] = trim($commentText); } - - $clientBlock = $main->findOne('p:contains("Клиент")'); $senderBlock = $main->findOne('p:contains("Отправитель")'); @@ -163,53 +1232,73 @@ class FlowwowController extends Controller $orderDetails['recipient'] = $recipientText; } - - $itemsBlock = $main->findOneOrFalse('h2:contains("Детали заказа")') ? $main->findOne('h2:contains("Детали заказа")') : $main->findOneOrFalse('p:contains("Детали заказа")'); + $itemsBlock = false; + if ($main->findOneOrFalse('table h2:contains("Детали заказа")') != false) { + $itemsBlock = $main->findOneOrFalse('table h2:contains("Детали заказа")'); + } elseif ($main->findOneOrFalse('table p:contains("Детали заказа")') != false) { + $itemsBlock = $main->findOneOrFalse('table 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) { - Yii::warning('Строка заказа: ' . json_encode($itemsRow->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__); + // Yii::warning('Строка заказа: ' . json_encode($itemsRow->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__); $itemData = [ 'name' => '', 'count' => '', 'price' => '', ]; - // Извлекаем название и количество из второго $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())))); } - // Извлекаем цену из третьего 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); - $sumRow = $sumBlock->find('tr'); + + $sumBlock = $main->findOneOrFalse('p:contains("Итого оплачено")'); + + if ($sumBlock) { + $sumBlock = $sumBlock->parentNode()->nextNonWhitespaceSibling(); + $totalSum = (float)trim( + str_replace(["\u{00A0}", '₽', ' '], + '', + strip_tags(preg_replace('/\s+/', ' ', $sumBlock->innerText()))) + ); + } - $sumTds = $sumRow->find('td'); - if (count($sumTds) >= 2) { - $totalSum = (float)trim(str_replace(["\u{00A0}", '₽' , ' '], '', strip_tags(preg_replace('/\s+/', ' ', $sumTds[1]->innerText())))); + $deliverySum = 0; + $devSumBlock = $main->findOneOrFalse('p:contains("Доставка")'); + + if ($devSumBlock) { + $devSumBlock = $devSumBlock->parentNode()->nextNonWhitespaceSibling(); + $deliverySum = (float)trim( + str_replace(["\u{00A0}", '₽', ' '], + '', + strip_tags(preg_replace('/\s+/', ' ', $devSumBlock->innerText()))) + ); } + $orderDetails['items'] = $orderItems; - $orderDetails['totalSum'] = $totalSum; + $orderDetails['deliverySum'] = $deliverySum; + $orderDetails['totalSum'] = $totalSum; } - + $order[$orderNumber] = $orderDetails; } - $order[$orderNumber] = $orderDetails; + return [ 'success' => true, 'order' => $order diff --git a/erp24/migrations/m250321_134458_create_marketplace_flowwow_emails_table.php b/erp24/migrations/m250321_134458_create_marketplace_flowwow_emails_table.php index 15deea5e..dd05fb63 100644 --- a/erp24/migrations/m250321_134458_create_marketplace_flowwow_emails_table.php +++ b/erp24/migrations/m250321_134458_create_marketplace_flowwow_emails_table.php @@ -19,7 +19,11 @@ class m250321_134458_create_marketplace_flowwow_emails_table extends Migration $this->createTable(self::TABLE_NAME, [ 'id' => $this->bigPrimaryKey()->comment('ID'), 'subject' => $this->string()->notNull()->comment('Тема письма'), - 'subject_pattern' => $this->string()->null()->comment('Шаблон темы письма'), + 'email_status' => $this + ->integer(1) + ->notNull() + ->defaultValue(0) + ->comment('Статус письма - разобрано - 1, не разобрано - 2'), 'from' => $this->string(255)->notNull()->comment('Отправитель письма'), 'to' => $this->string()->notNull()->comment('Получатель письма'), 'date' => $this->dateTime()->notNull()->comment('Дата письма'), diff --git a/erp24/records/MarketplaceFlowwowEmails.php b/erp24/records/MarketplaceFlowwowEmails.php index e148ff52..42f33a22 100644 --- a/erp24/records/MarketplaceFlowwowEmails.php +++ b/erp24/records/MarketplaceFlowwowEmails.php @@ -9,7 +9,7 @@ use Yii; * * @property int $id ID * @property string $subject Тема письма - * @property string|null $subject_pattern Шаблон темы письма + * @property int|null $email_status Статус письма - разобрано - 1, не разобрано - 2 * @property string $from Отправитель письма * @property string $to Получатель письма * @property string $date Дата письма @@ -34,11 +34,12 @@ class MarketplaceFlowwowEmails extends \yii\db\ActiveRecord public function rules() { return [ - [['subject_pattern'], 'default', 'value' => null], + [['email_status'], 'default', 'value' => 0], [['subject', 'from', 'to', 'date', 'body'], 'required'], [['date', 'created_at'], 'safe'], [['body'], 'string'], - [['subject', 'subject_pattern', 'from', 'to'], 'string', 'max' => 255], + [['email_status'], 'integer'], + [['subject', 'from', 'to'], 'string', 'max' => 255], ]; } @@ -50,7 +51,7 @@ class MarketplaceFlowwowEmails extends \yii\db\ActiveRecord return [ 'id' => 'ID', 'subject' => 'Тема письма', - 'subject_pattern' => 'Шаблон темы письма', + 'email_status' => 'Статус письма', 'from' => 'Отправитель письма', 'to' => 'Получатель письма', 'date' => 'Дата письма', diff --git a/erp24/records/MarketplaceFlowwowEmailsSearch.php b/erp24/records/MarketplaceFlowwowEmailsSearch.php index a0426ab5..13f2e814 100644 --- a/erp24/records/MarketplaceFlowwowEmailsSearch.php +++ b/erp24/records/MarketplaceFlowwowEmailsSearch.php @@ -17,8 +17,8 @@ class MarketplaceFlowwowEmailsSearch extends MarketplaceFlowwowEmails public function rules() { return [ - [['id'], 'integer'], - [['subject', 'subject_pattern', 'from', 'to', 'date', 'body', 'created_at'], 'safe'], + [['id', 'email_status'], 'integer'], + [['subject', 'from', 'to', 'date', 'body', 'created_at', 'email_status'], 'safe'], ]; } @@ -65,7 +65,7 @@ class MarketplaceFlowwowEmailsSearch extends MarketplaceFlowwowEmails ]); $query->andFilterWhere(['ilike', 'subject', $this->subject]) - ->andFilterWhere(['ilike', 'subject_pattern', $this->subject_pattern]) + ->andFilterWhere(['email_status' => $this->email_status]) ->andFilterWhere(['ilike', 'from', $this->from]) ->andFilterWhere(['ilike', 'to', $this->to]) ->andFilterWhere(['ilike', 'body', $this->body]); diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index a2d48528..c6d3e58d 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -78,11 +78,11 @@ class MarketplaceService ] ]; - const SUBJECT_NEW = '/^Новый_оплаченный_заказ$/'; - const SUBJECT_APPROVED = '/^Заказ_№\d+_принят!$/'; - const SUBJECT_CANCELLED = '/^Заказ_№\d+_отменён$/'; - const SUBJECT_CHANGED = '/^Изменения_в_заказе_№\d+$/'; - const SUBJECT_DELIVERED = '/^Flowwow. Заказ_выполнен._Напишите_отзыв_о_клиенте$/'; + const SUBJECT_NEW = '/^Новый оплаченный заказ$/'; + const SUBJECT_APPROVED = '/^Заказ №\d+ принят!$/'; + const SUBJECT_CANCELLED = '/^Заказ №\d+ отменён$/'; + const SUBJECT_CHANGED = '/^Изменения в заказе №\d+$/'; + const SUBJECT_DELIVERED = '/^Flowwow. Заказ выполнен. Напишите отзыв о клиенте$/'; const SUBJECT_INDEX = [ @@ -1350,7 +1350,8 @@ class MarketplaceService $useSince = false, $useAlternateMailbox = false, $progressCallback = null, - $seen = false + $seen = false, + $unseen = false ) { imap_errors(); imap_alerts(); @@ -1364,7 +1365,7 @@ class MarketplaceService imap_timeout(IMAP_CLOSETIMEOUT, 120); $searchCriteria = ''; - $searchCriteria .= ($useSince ? 'SINCE ' : 'ON '); + $searchCriteria = ($useSince ? 'SINCE ' : 'ON '); if (!$date) { $date = date('d-M-Y'); @@ -1374,7 +1375,13 @@ class MarketplaceService $searchCriteria .= '"' . $date . '" '; } - $searchCriteria .= ($seen ? 'SEEN ' : 'UNSEEN '); + if ($seen) { + $searchCriteria .= 'SEEN '; + } + + if ($unseen) { + $searchCriteria .= 'UNSEEN '; + } $subjectPatterns = [ self::SUBJECT_NEW, @@ -1418,6 +1425,9 @@ class MarketplaceService $messages = []; foreach ($folders as $folder) { + if ($folder == '{imap.yandex.ru:993/imap/ssl}Drafts') { + continue; + } $inbox = imap_open($folder, $username, $password); if (!$inbox) { @@ -1441,9 +1451,24 @@ class MarketplaceService $overview = imap_fetch_overview($inbox, $email_number, 0); $structure = imap_fetchstructure($inbox, $email_number); $htmlMessage = ''; + if (!isset($overview[0]->subject)) { + continue; + } $subject = mb_decode_mimeheader($overview[0]->subject); + // $subject = mb_convert_encoding($subject, 'UTF-8', mb_detect_encoding($subject, 'UTF-8, ISO-8859-1, Windows-1251', true)); + $subject = str_replace('_', ' ', $subject); + $from = mb_decode_mimeheader($overview[0]->from); - $to = mb_decode_mimeheader($overview[0]->to); + if (isset($overview[0]->to)) { + $to = mb_decode_mimeheader($overview[0]->to); + } else { + if ($useAlternateMailbox) { + $to = 'Zakaz-bazacvetov24@yandex.ru'; + } else { + $to = 'flow@bazacvetov24.ru'; + } + } + $date = date('Y-m-d H:i:s', strtotime(mb_decode_mimeheader($overview[0]->date))); if (isset($structure->parts) && count($structure->parts)) { foreach ($structure->parts as $partNum => $part) { @@ -1459,7 +1484,7 @@ class MarketplaceService if (preg_match($pattern, $subject)) { $subjectIndex = self::SUBJECT_INDEX[$pattern]; if ($savedEmail !== null) { - $savedEmail->subject_pattern = $pattern; + $savedEmail->email_status = 1; $savedEmail->save(); } $messages[] = [ @@ -1470,20 +1495,23 @@ class MarketplaceService 'date' => $date, 'body' => $htmlMessage, ]; - 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 ($unseen) { + 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) { @@ -1525,7 +1553,7 @@ class MarketplaceService if (!$exists) { $email = new MarketplaceFlowwowEmails(); $email->subject = $subject; - $email->subject_pattern = $subjectPattern; + $email->email_status = 0; $email->from = $from; $email->to = $to; $email->date = $date; @@ -1538,7 +1566,6 @@ class MarketplaceService Yii::error('Письмо не сохранено' . json_encode($email->errors), __METHOD__); return null; } - } } @@ -1549,7 +1576,7 @@ class MarketplaceService if ($progressCallback) { call_user_func($progressCallback, "DEBUG: " . $message); } - Yii::info($message, 'imap_debug'); + Yii::warning($message, 'imap_debug'); } } @@ -1629,7 +1656,8 @@ class MarketplaceService $deliveryText = ''; $clientText = ''; $orderItems = []; - + $totalSum = 0; + $deliverySum = 0; $linkBlock = $main->findOneOrFalse('a:contains("Перейти в заказ ")'); if ($linkBlock) { @@ -1731,18 +1759,43 @@ class MarketplaceService // Добавляем данные в массив $orderItems[] = $itemData; } - $totalSum = 0; - $sumBlock = $itemsBlock->parentNode()->nextNonWhitespaceSibling(); - $sumRow = $sumBlock->find('tr'); - $sumTds = $sumRow->find('td'); - if ($sumTds && count($sumTds) >= 2) { - $totalSum = (float)trim(str_replace(["\u{00A0}", '₽' , ' '], '', strip_tags(preg_replace('/\s+/', ' ', $sumTds[1]->innerText())))); + $sumBlock = $main->findOneOrFalse('p:contains("Итого оплачено")'); + + if ($sumBlock) { + $sumBlock = $sumBlock->parentNode()->nextNonWhitespaceSibling(); + $totalSum = (float)trim + ( + str_replace( + ["\u{00A0}", '₽', ' '], + '', + strip_tags + ( + preg_replace + ( + '/\s+/', + ' ', + $sumBlock->innerText() + ) + ) + ) + ); + } + + $devSumBlock = $main->findOneOrFalse('p:contains("Доставка")'); + + if ($devSumBlock) { + $devSumBlock = $devSumBlock->parentNode()->nextNonWhitespaceSibling(); + $deliverySum = (float)trim( + str_replace(["\u{00A0}", '₽', ' '], + '', + strip_tags(preg_replace('/\s+/', ' ', $devSumBlock->innerText()))) + ); } - $orderDetails['items'] = $orderItems; - $orderDetails['totalSum'] = $totalSum; } - + $orderDetails['items'] = $orderItems; + $orderDetails['deliverySum'] = $deliverySum; + $orderDetails['totalSum'] = $totalSum; $order[$orderNumber] = $orderDetails; return $order; } @@ -1875,7 +1928,7 @@ class MarketplaceService $marketplaceOrder->updated_at = date('Y-m-d H:i:s'); $marketplaceOrder->warehouse_guid = (string)$campaignId; $marketplaceOrder->total = $order['totalSum']; - $marketplaceOrder->delivery_total = 0; + $marketplaceOrder->delivery_total = $order['deliverySum']; $marketplaceOrder->buyer_total_before_discount = $order['totalSum']; $marketplaceOrder->tax_system = 'UNKNOWN'; $marketplaceOrder->payment_type = 'UNKNOWN'; diff --git a/erp24/views/marketplace-flowwow-emails/_form.php b/erp24/views/marketplace-flowwow-emails/_form.php index 9bc491a2..b8fedb1d 100644 --- a/erp24/views/marketplace-flowwow-emails/_form.php +++ b/erp24/views/marketplace-flowwow-emails/_form.php @@ -14,7 +14,7 @@ use yii\widgets\ActiveForm; field($model, 'subject')->textInput(['maxlength' => true]) ?> - field($model, 'subject_pattern')->textInput(['maxlength' => true]) ?> + field($model, 'email_status')->textInput(['type' => 'number', 'readonly' => true]) ?> field($model, 'from')->textInput(['maxlength' => true]) ?> diff --git a/erp24/views/marketplace-flowwow-emails/_search.php b/erp24/views/marketplace-flowwow-emails/_search.php index dbae3951..1b75aad8 100644 --- a/erp24/views/marketplace-flowwow-emails/_search.php +++ b/erp24/views/marketplace-flowwow-emails/_search.php @@ -19,7 +19,7 @@ use yii\widgets\ActiveForm; field($model, 'subject') ?> - field($model, 'subject_pattern') ?> + field($model, 'email_status') ?> field($model, 'from') ?> diff --git a/erp24/views/marketplace-flowwow-emails/index.php b/erp24/views/marketplace-flowwow-emails/index.php index 07861ce3..a5ec2d45 100644 --- a/erp24/views/marketplace-flowwow-emails/index.php +++ b/erp24/views/marketplace-flowwow-emails/index.php @@ -10,16 +10,15 @@ use yii\grid\GridView; /** @var yii_app\records\MarketplaceFlowwowEmailsSearch $searchModel */ /** @var yii\data\ActiveDataProvider $dataProvider */ -$this->title = 'Marketplace Flowwow Emails'; +$this->title = 'Письма по заказам Flowwow'; $this->params['breadcrumbs'][] = $this->title; ?> -
+
+ 'btn btn-primary my-4']) ?>

title) ?>

-

- 'btn btn-success']) ?> -

+ render('_search', ['model' => $searchModel]); ?> @@ -31,14 +30,15 @@ $this->params['breadcrumbs'][] = $this->title; 'id', 'subject', - 'subject_pattern', + 'email_status', 'from', 'to', - //'date', + 'date', //'body:ntext', - //'created_at', + 'created_at', [ - 'class' => ActionColumn::className(), + 'template' => '{view}', + 'class' => ActionColumn::class, 'urlCreator' => function ($action, MarketplaceFlowwowEmails $model, $key, $index, $column) { return Url::toRoute([$action, 'id' => $model->id]); } diff --git a/erp24/views/marketplace-flowwow-emails/view.php b/erp24/views/marketplace-flowwow-emails/view.php index 2e94d5d4..7acb820b 100644 --- a/erp24/views/marketplace-flowwow-emails/view.php +++ b/erp24/views/marketplace-flowwow-emails/view.php @@ -6,32 +6,22 @@ use yii\widgets\DetailView; /** @var yii\web\View $this */ /** @var yii_app\records\MarketplaceFlowwowEmails $model */ -$this->title = $model->id; +$this->title = 'Письмо' . $model->subject . ' от ' . $model->date; $this->params['breadcrumbs'][] = ['label' => 'Marketplace Flowwow Emails', 'url' => ['index']]; $this->params['breadcrumbs'][] = $this->title; \yii\web\YiiAsset::register($this); ?> -
- +
+ 'btn btn-primary my-4']) ?>

title) ?>

-

- $model->id], ['class' => 'btn btn-primary']) ?> - $model->id], [ - 'class' => 'btn btn-danger', - 'data' => [ - 'confirm' => 'Are you sure you want to delete this item?', - 'method' => 'post', - ], - ]) ?> -

$model, 'attributes' => [ 'id', 'subject', - 'subject_pattern', + 'email_status', 'from', 'to', 'date',