}
- $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 [
--- /dev/null
+<?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;
+ }
+ */
+}
* @property int $created_by
* @property int $updated_at
* @property int $updated_by
+ * @property string $account_email Почта привязанная к магазину
*/
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 уже используется.'],
];
}
'created_at' => 'Дата создания записи',
'created_by' => 'Автор создания записи',
'updated_at' => 'Дата изменения записи',
- 'updated_by' => 'Автор изменения записи'
+ 'updated_by' => 'Автор изменения записи',
+ 'account_email' => 'Почта привязанная к магазину'
];
}
);
}
+ /**
+ * Получает 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']);
}
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()
$statusId = self::getOrCreateStatus($statusCode, $statuses, $statusCodes);
$substatusId = self::getOrCreateStatus($substatusCode, $statuses, $statusCodes);
-
$marketplaceOrder = MarketplaceOrders::find()
->where(['marketplace_order_id' => (string)$number])
->one();
'Ошибка сохранения элеиента: ' . json_encode($orderItem->getErrors(), JSON_UNESCAPED_UNICODE)
);
}
-
}
}
]) ?>
</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">
}
],
'warehouse_guid',
+ 'account_email',
[
'attribute' => 'firm',
'value' => function ($model) {
<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>