]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Добавление поля email в marketplace_store
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 19 Mar 2025 08:21:24 +0000 (11:21 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 19 Mar 2025 08:21:24 +0000 (11:21 +0300)
erp24/media/controllers/FlowwowController.php
erp24/migrations/m250319_072505_add_column_account_email_to_marketplace_store_table.php [new file with mode: 0644]
erp24/records/MarketplaceStore.php
erp24/services/MarketplaceService.php
erp24/views/marketplace-store/_form.php
erp24/views/marketplace-store/index.php
erp24/views/marketplace-store/view.php

index b4e365b3d646164c5ee0e16ca337995715c580f0..49539eb745b5403896148fd6a4df646af52d1ac1 100644 (file)
@@ -410,46 +410,49 @@ class FlowwowController extends Controller
             }
 
 
-            $itemsBlock = $main->findOneOrFalse('h2:contains("Детали заказа")') ? $main->findOne('h2:contains("Детали заказа")') : $main->findOne('p:contains("Детали заказа")');
-            $itemsTable = $itemsBlock->parentNode()->find('table', 2);
-
-            $itemsRows = $itemsTable->find('tr');
-            foreach ($itemsRows as $itemsRow) {
-                Yii::warning('Строка заказа: ' . json_encode($itemsRow->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
-                $itemData = [
-                    'name' => '',
-                    'count' => '',
-                    '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()))));
-                }
+            $itemsBlock = $main->findOneOrFalse('h2:contains("Детали заказа")') ? $main->findOne('h2:contains("Детали заказа")') : $main->findOneOrFalse('p:contains("Детали заказа")');
+            if ($itemsBlock) {
+                $itemsTable = $itemsBlock->parentNode()->find('table', 2);
+
+                $itemsRows = $itemsTable->find('tr');
+                foreach ($itemsRows as $itemsRow) {
+                    Yii::warning('Строка заказа: ' . json_encode($itemsRow->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
+                    $itemData = [
+                        'name' => '',
+                        'count' => '',
+                        '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()))));
-                }
+                    // Извлекаем цену из третьего <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);
-            $sumRow = $sumBlock->find('tr');
+                    // Добавляем данные в массив
+                    $orderItems[] = $itemData;
+                }
+                $totalSum = 0;
+                $sumBlock = $itemsBlock->parentNode()->find('table', 3);
+                $sumRow = $sumBlock->find('tr');
 
                 $sumTds = $sumRow->find('td');
                 if (count($sumTds) >= 2) {
                     $totalSum = (float)trim(str_replace(["\u{00A0}", '₽' , ' '], '', strip_tags(preg_replace('/\s+/', ' ', $sumTds[1]->innerText()))));
 
                 }
-            $orderDetails['items'] = $orderItems;
-            $orderDetails['totalSum'] =  $totalSum;
+                $orderDetails['items'] = $orderItems;
+                $orderDetails['totalSum'] =  $totalSum;
+            }
+
         }
         $order[$orderNumber] = $orderDetails;
         return [
diff --git a/erp24/migrations/m250319_072505_add_column_account_email_to_marketplace_store_table.php b/erp24/migrations/m250319_072505_add_column_account_email_to_marketplace_store_table.php
new file mode 100644 (file)
index 0000000..ca68198
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+use yii\db\Migration;
+
+class m250319_072505_add_column_account_email_to_marketplace_store_table extends Migration
+{
+    const TABLE_NAME  = 'erp24.marketplace_store';
+    /**
+     * {@inheritdoc}
+     */
+    public function safeUp()
+    {
+        $table = $this->db->schema->getTableSchema(self::TABLE_NAME);
+        if ($table === null) {
+            return;
+        }
+
+        if ($table->getColumn('account_email') === null) {
+            $this->addColumn(
+                self::TABLE_NAME,
+                'account_email',
+                $this->string()->null()->comment('Почта привязанная к магазину')
+            );
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function safeDown()
+    {
+        if ($this->db->schema->getTableSchema(self::TABLE_NAME) === null) {
+            return;
+        }
+
+        if ($this->db->schema->getTableSchema(self::TABLE_NAME)->getColumn('account_email') !== null) {
+            $this->dropColumn(self::TABLE_NAME, 'account_email');
+        }
+    }
+
+    /*
+    // Use up()/down() to run migration code without a transaction.
+    public function up()
+    {
+
+    }
+
+    public function down()
+    {
+        echo "m250319_072505_add_column_account_email_to_marketplace_store_table cannot be reverted.\n";
+
+        return false;
+    }
+    */
+}
index 36884a4beab5b64b4feed5f0d32935e9eb42648e..7137cfd37f4c7ec4944df63e15273675b6829d5f 100644 (file)
@@ -20,6 +20,7 @@ use yii\db\Expression;
  * @property int $created_by
  * @property int $updated_at
  * @property int $updated_by
+ * @property string $account_email Почта привязанная к магазину
  */
 class MarketplaceStore extends \yii\db\ActiveRecord
 {
@@ -39,9 +40,10 @@ class MarketplaceStore extends \yii\db\ActiveRecord
         return [
             [['store_id', 'guid', 'warehouse_id', 'warehouse_guid', 'firm'], 'required'],
             [['store_id'], 'exist', 'targetClass' => CityStore::class, 'targetAttribute' => 'id'],
-            [['name', 'guid', 'firm', 'warehouse_guid',], 'string'],
+            [['name', 'guid', 'firm', 'warehouse_guid', 'account_email'], 'string'],
             [['created_at', 'updated_at'], 'datetime', 'format' => 'php:Y-m-d H:i:s'],
             [['store_id', 'created_by', 'updated_by', 'warehouse_id',], 'integer'],
+            ['account_email', 'unique', 'message' => 'Этот email уже используется.'],
 
         ];
     }
@@ -79,7 +81,8 @@ class MarketplaceStore extends \yii\db\ActiveRecord
             'created_at' => 'Дата создания записи',
             'created_by' => 'Автор создания записи',
             'updated_at' => 'Дата изменения записи',
-            'updated_by' => 'Автор изменения записи'
+            'updated_by' => 'Автор изменения записи',
+            'account_email' => 'Почта привязанная к магазину'
         ];
     }
 
@@ -90,6 +93,18 @@ class MarketplaceStore extends \yii\db\ActiveRecord
         );
     }
 
+    /**
+     * Получает warehouse_guid по account_email.
+     *
+     * @param string $accountEmail
+     * @return string|null
+     */
+    public static function getWarehouseGuidByAccountEmail($accountEmail)
+    {
+        $model = self::findOne(['account_email' => $accountEmail]);
+        return $model ? $model->warehouse_guid : null;
+    }
+
     public function getStore() {
         return $this->hasOne(CityStore::class, ['id' => 'store_id']);
     }
index 6c6dded66d9d9320e4aaff26f7365f3ee123ff0b..8b3dbfb7593dda68bde920b6eafc155548733237 100644 (file)
@@ -1410,29 +1410,172 @@ class MarketplaceService
 
     public static function processMessages(array $messages)
     {
+        $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);
+
+                }
+
+
+
+            }
+        }
+        return $count;
+    }
+
+    
+    public static function getOrdersDataFromMessage($message) {
+        $html = $message['body'];
+        $orderDetails = null;
+        $order = null;
+        if (!empty($html)) {
+            $html = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
+
+            $doc = new HtmlDomParser($html);
+
+            $main = $doc->findOneOrFalse("body");
+
+            if ($main !== false) {
+                $orderTitleNode = $main->findOne("h1");
+
+                if ($orderTitleNode && preg_match('/№(\d+)/', $orderTitleNode->innertext, $matches)) {
+                    $orderNumber = (int)$matches[1];
                 }
+            }
+            $orderDetails['number'] = $orderNumber;
+            $deliveryText = '';
+            $commentText = '';
+            $clientText = '';
+            $recipientText = '';
+            $orderItems = [];
+
+
+            $deliveryBlock = $main->findOne('p:contains("Доставить")');
+            $pickupBlock = $main->findOne('p:contains("Самовывоз")');
+
+            if ($deliveryBlock && $deliveryBlock->nextNonWhitespaceSibling()) {
+                $deliveryBlock = $deliveryBlock->nextNonWhitespaceSibling();
+                $deliveryText = "Доставка: " . strip_tags($deliveryBlock->innerText());
+                $deliveryText = preg_replace('/\s+/', ' ', $deliveryText);
+            } elseif ($pickupBlock && $pickupBlock->nextNonWhitespaceSibling()) {
+                $pickupBlock = $pickupBlock->nextNonWhitespaceSibling();
+                $deliveryText = "Самовывоз: " . strip_tags($pickupBlock->innerText());
+                $deliveryText = preg_replace('/\s+/', ' ', $deliveryText);
+            }
+
+            if ($deliveryText) {
+                Yii::warning('Текст заказа: ' . $deliveryText, __METHOD__);
+                $orderDetails['delivery'] = trim($deliveryText);
+            }
 
+            $commentBlock = $main->findOne('p:contains("Комментарий")');
+            if ($commentBlock && $commentBlock->nextNonWhitespaceSibling()) {
+                $commentBlock = $commentBlock->nextNonWhitespaceSibling();
+                $commentText = preg_replace('/\s+/', ' ', $commentBlock->innerText());
+                $orderDetails['comment'] = trim($commentText);
+            }
+
+            $clientBlock = $main->findOne('p:contains("Клиент")');
+            $senderBlock = $main->findOne('p:contains("Отправитель")');
 
-                $html = $message['body'];
-                $orderNumber = null;
-                $items = [];
+            if ($clientBlock && $clientBlock->nextNonWhitespaceSibling()) {
+                $clientBlock = $clientBlock->nextNonWhitespaceSibling();
+                $clientText = "Клиент: " . strip_tags($clientBlock->innerText());
+                $phoneLink = $clientBlock->find('a', 0);
+                if ($phoneLink) {
+                    $clientText .= ' ' . preg_replace('/tel:/', ' ', $phoneLink->getAttribute('href'));
+                }
+            } elseif ($senderBlock && $senderBlock->nextNonWhitespaceSibling()) {
+                $senderBlock = $senderBlock->nextNonWhitespaceSibling();
+                $clientText = "Отправитель: " . strip_tags($senderBlock->innerText());
+                $phoneLink = $senderBlock->find('a', 0);
+                if ($phoneLink) {
+                    $clientText .= ' ' . preg_replace('/tel:/', ' ', $phoneLink->getAttribute('href'));
+                }
+            }
+
+            if ($clientText) {
+                $orderDetails['client'] =  str_replace('Позвонить', '', $clientText);
+            }
+
+            $recipientBlock = $main->findOne('p:contains("Получатель")');
+            if ($recipientBlock && $recipientBlock->nextNonWhitespaceSibling()) {
+                $recipientBlock = $recipientBlock->nextNonWhitespaceSibling();
+                $recipientText = strip_tags(
+                        str_replace('Позвонить', '', $recipientBlock->innerText())
+                    ) . ' ' . preg_replace('/tel:/', ' ', $recipientBlock->find('a', 0)->getAttribute('href'));
+                $orderDetails['recipient'] = $recipientText;
+            }
+
+
+            $itemsBlock = $main->findOneOrFalse('h2:contains("Детали заказа")') ? $main->findOne('h2:contains("Детали заказа")') : $main->findOneOrFalse('p:contains("Детали заказа")');
+            if ($itemsBlock) {
+                $itemsTable = $itemsBlock->parentNode()->find('table', 2);
+
+                $itemsRows = $itemsTable->find('tr');
+                foreach ($itemsRows as $itemsRow) {
+                    Yii::warning('Строка заказа: ' . json_encode($itemsRow->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
+                    $itemData = [
+                        'name' => '',
+                        'count' => '',
+                        '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;
-                if (!empty($html)) {
-                    $html = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
+                $sumBlock = $itemsBlock->parentNode()->find('table', 3);
+                $sumRow = $sumBlock->find('tr');
+
+                $sumTds = $sumRow->find('td');
+                if (count($sumTds) >= 2) {
+                    $totalSum = (float)trim(str_replace(["\u{00A0}", '₽' , ' '], '', strip_tags(preg_replace('/\s+/', ' ', $sumTds[1]->innerText()))));
+
                 }
+                $orderDetails['items'] = $orderItems;
+                $orderDetails['totalSum'] =  $totalSum;
             }
+
+            $order[$orderNumber] = $orderDetails;
+            return $order;
         }
+        return [];
     }
 
 
 
+
     public static function processFlowwowOrders(array $allOrders)
     {
         $statuses = MarketplaceOrderStatusTypes::find()
@@ -1452,7 +1595,6 @@ class MarketplaceService
             $statusId = self::getOrCreateStatus($statusCode, $statuses, $statusCodes);
             $substatusId = self::getOrCreateStatus($substatusCode, $statuses, $statusCodes);
 
-
             $marketplaceOrder = MarketplaceOrders::find()
                 ->where(['marketplace_order_id' => (string)$number])
                 ->one();
@@ -1567,7 +1709,6 @@ class MarketplaceService
                     'Ошибка сохранения элеиента: ' . json_encode($orderItem->getErrors(), JSON_UNESCAPED_UNICODE)
                 );
             }
-            
         }
     }
 
index d10ffe70fcc7d883afb66be2781a88536a08b8fd..91e3a012b76597fcb90e081aef7c9667c50b1db1 100644 (file)
@@ -29,6 +29,7 @@ use yii\widgets\ActiveForm;
             ]) ?>
     </div>
     <?= $form->field($model, 'warehouse_guid')->textInput(['type' => 'integer']) ?>
+    <?= $form->field($model, 'account_email')->textInput() ?>
     <?= $form->field($model, 'firm')->dropDownList($firms, ['prompt' => 'Выберите юр лицо']) ?>
 
     <div class="form-group">
index 5284725a32bb268235b4801dffd260aa90adcad5..55f28de2e3c9edf4ec0376b640f10e3693970121 100644 (file)
@@ -36,6 +36,7 @@ $this->params['breadcrumbs'][] = $this->title;
                 }
             ],
             'warehouse_guid',
+            'account_email',
             [
                 'attribute' => 'firm',
                 'value' => function ($model) {
index 27bb02d995b0b01c47aa2185609c904a1f8b523e..8d7c5424d6877e54817b591c0d54235eecf75ead 100644 (file)
@@ -43,6 +43,10 @@ $this->params['breadcrumbs'][] = $this->title;
             <th>GUID склада в данном маркетплейсе</th>
             <td><?= Html::encode($model->warehouse_guid) ?></td>
         </tr>
+        <tr>
+            <th>Адрес электронной почты уведомлений для магазина</th>
+            <td><?= Html::encode($model->account_email) ?></td>
+        </tr>
         <tr>
             <th>Юридическое Лицо</th>
             <td><?= Html::encode($firms[$model->firm]) ?></td>