diff --git a/mirzaev/skillparts/system/controllers/OrderController.php b/mirzaev/skillparts/system/controllers/OrderController.php index e431ac6..6a8493d 100644 --- a/mirzaev/skillparts/system/controllers/OrderController.php +++ b/mirzaev/skillparts/system/controllers/OrderController.php @@ -150,45 +150,39 @@ class OrderController extends Controller // Инициализация входных данных $account = yii::$app->user->identity; - $supplies = yii::$app->request->post('supplies'); + $supply_id = yii::$app->request->post('supply_id'); + $amount = yii::$app->request->post('amount') ?? 1; + $delivery_type = yii::$app->request->post('delivery_type'); + // Запись настроек ответа в буфер yii::$app->response->format = Response::FORMAT_JSON; + if (empty($supply_id) || empty($delivery_type)) { + // Не выполнены условия для выполнения + + // 501 Not Implemented + yii::$app->response->statusCode = 501; + } + // Инициализация возврата по умолчанию $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (is_null($supplies)) { - // 501 Not Implemented - yii::$app->response->statusCode = 501; + // Инициализация корзины + if (!$model = Order::search($account)) { + // Корзина не найдена (текущий заказ) + + // Инициализация + $model = new Order(); + $model->save() or throw new Exception('Не удалось инициализировать заказ'); + + // Запись ребра: АККАУНТ -> ЗАКАЗ + AccountEdgeOrder::write($account->readId(), $model->readId(), 'current') or $model->addError('errors', 'Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ'); } - if (!is_null($supplies)) { - // Переданы поставки для записи - - if (!$model = Order::search($account)) { - // Корзина не найдена (текущий заказ) - - // Инициализация - $model = new Order(); - $model->save() or throw new Exception('Не удалось инициализировать заказ'); - - // Запись ребра: АККАУНТ -> ЗАКАЗ - AccountEdgeOrder::write($account->readId(), $model->readId(), 'current') or $model->addError('errors', 'Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ'); - } - - // Проверка входных данных - if (!is_array($supplies)) { - // Неверные входные данные - - // Запись ошибки - $model->addError('errors', 'Переменная должна быть массивом'); - } - - // Если запись не удалась, то вернуть код: 500 Internal Server Error - $model->writeSupply($supplies) or yii::$app->response->statusCode = 500; - } + // Если запись не удалась, то вернуть код: 500 Internal Server Error + $model->writeSupply($supply_id, $delivery_type, (int) $amount) or yii::$app->response->statusCode = 500; return $return; } diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php index 0b4dcbc..d4fb16c 100644 --- a/mirzaev/skillparts/system/controllers/ProfileController.php +++ b/mirzaev/skillparts/system/controllers/ProfileController.php @@ -105,9 +105,10 @@ class ProfileController extends Controller // Инициализация is_array($model->opts) || $model->opts = []; - // Запись + // Запись в буфер $model->opts = array_merge($model->opts, $vars['opts']); + // Запись в базу данных $model->update(); } else { /** diff --git a/mirzaev/skillparts/system/controllers/SearchController.php b/mirzaev/skillparts/system/controllers/SearchController.php index 23d45f6..09866f9 100644 --- a/mirzaev/skillparts/system/controllers/SearchController.php +++ b/mirzaev/skillparts/system/controllers/SearchController.php @@ -165,6 +165,9 @@ class SearchController extends Controller select: '{supply, supply_edge_product}' ); + // Инициализация буфера + $buffer_connections = []; + if (count($connections) === 11) { // Если в базе данных хранится много поставок @@ -179,15 +182,16 @@ class SearchController extends Controller $connection['account'] = Account::searchBySupplyId($connection['supply_edge_product'][0]['_from']); try { - // Инициализация доставки + // Инициализация доставки (автоматическая) $connection['delivery'] = Dellin::calcDeliveryAdvanced( - explode('_', $connection['account']['opts']['delivery_from_terminal'])[1], - explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1], + $buffer['account']['opts']['delivery_from_terminal'], + yii::$app->user->identity->opts['delivery_to_terminal'], (int) ($connection['product']['wght'] ?? 0), (int) ($connection['product']['dmns']['x'] ?? 0), (int) ($connection['product']['dmns']['y'] ?? 0), (int) ($connection['product']['dmns']['z'] ?? 0) ); + $buffer['delivery']['type'] = 'auto'; } catch (Exception $e) { $connection['delivery']['error'] = true; @@ -196,9 +200,47 @@ class SearchController extends Controller // Инициализация цены (цена поставки + цена доставки + наша наценка) $connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply_edge_product'][0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0); + + // Инициализация версии для рассчета доставки по воздуху + $buffer = $connection; + + try { + // Инициализация доставки Dellin (самолётом) + $buffer['delivery'] = Dellin::calcDeliveryAdvanced( + $buffer['account']['opts']['delivery_from_terminal'], + yii::$app->user->identity->opts['delivery_to_terminal'], + (int) ($buffer['product']['wght'] ?? 0), + (int) ($buffer['product']['dmns']['x'] ?? 0), + (int) ($buffer['product']['dmns']['y'] ?? 0), + (int) ($buffer['product']['dmns']['z'] ?? 0), + avia: true + ); + $buffer['delivery']['type'] = 'avia'; + } catch (Exception $e) { + $buffer['delivery']['error'] = true; + + // var_dump($e->getMessage()); + // var_dump($e->getTrace()); + // var_dump($e->getFile()); + // die; + + // var_dump(json_decode($e->getMessage(), true)['errors']); + // die; + } + + if (!isset($buffer['delivery']['error']) || $buffer['delivery']['error'] !== true) { + // Если рассчиталась доставка самолётом + + // Инициализация цены (цена поставки + цена доставки + наша наценка) + $buffer['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $buffer['supply_edge_product'][0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($buffer['delivery']['price']['all'] ?? $buffer['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0); + + // Запись в буфер + $buffer_connections[] = $buffer; + } } - $row = $connections; + // Запись обработанных данных + $row['supplies'] = array_merge($connections, $buffer_connections); } // Запись ответа diff --git a/mirzaev/skillparts/system/models/Account.php b/mirzaev/skillparts/system/models/Account.php index 69dba75..3219d1d 100644 --- a/mirzaev/skillparts/system/models/Account.php +++ b/mirzaev/skillparts/system/models/Account.php @@ -362,14 +362,14 @@ class Account extends Document implements IdentityInterface, PartnerInterface foreach ($city->data['terminals']['terminal'] as $termial) { // Перебор терминалов - if (in_array('id_'.$termial['id'], $list, true)) { + if (in_array($termial['id'], $list, true)) { // Если встретился дубликат (исполняется очень часто) continue; } // Запись - empty($termial['id']) or $list['id_'.$termial['id']] = $city->data['name'] . ' (' . $termial['address'] . ')'; + $list[$termial['id']] = $city->data['name'] . ' (' . $termial['address'] . ')'; } } @@ -393,15 +393,16 @@ class Account extends Document implements IdentityInterface, PartnerInterface foreach ($terminals as $terminal) { // Перебор городов - if (in_array('id_' . $terminal->dell, $list, true)) { + if (in_array($terminal->dell, $list, true)) { // Если встретился дубликат (исполняется очень часто) continue; } // Запись - empty($terminal->cntr) && empty($terminal->city) && empty($terminal->strt) && empty($terminal->hous) - or $list['id_' . $terminal->dell] = "$terminal->city ($terminal->strt, $terminal->hous, $terminal->offs)"; + // empty($terminal->cntr) && + empty($terminal->city) && empty($terminal->strt) && empty($terminal->hous) + or $list[$terminal->dell] = "$terminal->city ($terminal->strt, $terminal->hous" . (empty($terminal->offs) ? ')' : ", $terminal->offs)"); } return $this->syncListWithSettings($list, 'delivery_to_terminal'); @@ -431,18 +432,18 @@ class Account extends Document implements IdentityInterface, PartnerInterface unset($list[$this->opts[$var]]); // Сохранение параметра в начале массива - $list = array_merge([$this->opts[$var] => $buffer], $list); + $list = [$this->opts[$var] => $buffer] + $list; } else { // Совпадение не найдено // Сохранение параметра из данных аккаунта в начале массива - $list = array_merge([$this->opts[$var] => $this->opts[$var]], $list); + $list = [$this->opts[$var] => $this->opts[$var]] + $list; } } else { // Параметр $var не найден в настройках аккаунта // Сохранение параметра из данных аккаунта в начале массива - $list = array_merge(['Выберите' => 'Выберите'], $list); + $list = ['Выберите' => 'Выберите'] + $list; } return $list; diff --git a/mirzaev/skillparts/system/models/Dellin.php b/mirzaev/skillparts/system/models/Dellin.php index f3d2a57..c4ebcce 100644 --- a/mirzaev/skillparts/system/models/Dellin.php +++ b/mirzaev/skillparts/system/models/Dellin.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace app\models; +use ArangoDBClient\Document as ArangoDBDocument; + class Dellin extends Document { public static function collectionName(): string @@ -33,9 +35,26 @@ class Dellin extends Document /** * Поиск по идентификатору города + * + * @param string $id Идентификатор города */ public static function searchByCityId(string $id): ?static { return static::findOne(['data["id"]' => $id]); } + + /** + * Поиск по идентификатору терминала + * + * @param string $id Идентификатор терминала + * @param bool $terminal_data_only Запрос только данных терминала + */ + public static function searchByTerminalId(string $id, bool $terminal_data_only = false): bool|static|array|null|ArangoDBDocument + { + if ($terminal_data_only) { + return static::find()->foreach(['terminal' => self::collectionName() . '.data["terminals"]["terminal"]'])->where(['terminal["id"] == "' . $id . '"'])->select('terminal')->createCommand()->execute()->getAll()[0]; + } + + return static::find()->foreach(['terminal' => self::collectionName() . '.data["terminals"]["terminal"]'])->where(['terminal["id"] == "' . $id . '"'])->one(); + } } diff --git a/mirzaev/skillparts/system/models/Order.php b/mirzaev/skillparts/system/models/Order.php index 2eb065e..0385aee 100644 --- a/mirzaev/skillparts/system/models/Order.php +++ b/mirzaev/skillparts/system/models/Order.php @@ -100,35 +100,31 @@ class Order extends Document implements DocumentInterface } /** - * Запись товара + * Запись товара к заказу * * $supply = [ Supply $supply, int $amount = 1 ] * - * @param Supply|array $supply Поставка + * @param string $supply_id Идентификатор поставки + * @param string $delivery_type Тип доставки + * @param int $amount Количество * @param Account $trgt Заказчик * * @return int Количество записанных поставок * * @todo Создать параметр разделителя для администрации */ - public function writeSupply(Supply|string|array $supply, Account $trgt = null): int + public function writeSupply(string $supply_id, string $delivery_type, int $amount = 1, Account $trgt = null): int { // Инициализация $trgt ?? $trgt = yii::$app->user->identity ?? throw new Exception('Не удалось инициализировать заказчика'); - if ($supply instanceof Supply) { - // Передана инстанция класса поставки или второй элемент массива не является числом - - // Унификация входных данных - $supply = [$supply->catn => 1]; - } - + // Проверка корзины if (is_null($this->_key)) { // Корзина не инициализирована - // Инициализация + // Инициализация корзины if (!$this->save()) { - // Инициализация заказа не удалась + // Инициализация корзины (активного заказа) не удалась throw new Exception('Ошибка при записи заказа в базу данных'); } @@ -142,43 +138,46 @@ class Order extends Document implements DocumentInterface } // Инициализация - $amount = 0; + $amount_buffer = 0; - foreach (is_array($supply) ? $supply : [$supply => 1] as $supply_raw => $amount_raw) { - // Перебор поставок + // Обработка поставок + for ($i = 0; $i < $amount; $i++) { + // Создание рёбер соразмерно запросу (добавление нескольких продуктов в корзину) - for ($i = 0; $i < $amount_raw; $i++) { - // Создание рёбер соразмерно запросу (добавление нескольких продуктов в корзину) + // Запись ребра: ЗАКАЗ -> ПОСТАВКА + if (!$supply_model = Supply::searchById($supply_id) or !$order_edge_supply = OrderEdgeSupply::write($this->readId(), $supply_model->readId(), 'write')) { + // Поставка не найдена или запись ребра не удалась - // Запись ребра: ЗАКАЗ -> ПОСТАВКА - if (!$supply_model = Supply::searchByCatn($supply_raw) or !OrderEdgeSupply::write($this->readId(), $supply_model->readId(), 'write')) { - // Поставка не найдена или запись ребра не удалась + continue; + } else { + // Ребро создано (товар подключен к заказу) - continue; - } else { - // Ребро создано (товар подключен к заказу) + // Обновление счётчика добавленных товаров + $amount_buffer++; - // Постинкрементация счётчика добавленных товаров - $amount++; + // Запись типа доставки + $order_edge_supply->dlvr = [ + 'type' => $delivery_type + ]; + $order_edge_supply->update(); - // Запись в журнал - $this->journal('write', ['target' => $supply_model->readId()]); - } + // Запись в журнал + $this->journal('write', ['target' => $supply_model->readId()]); } } - if ($amount === 0) { + if ($amount_buffer === 0) { // Отправка уведомления self::notification('Неудачная попытка добавить товар в корзину'); - } else if ($amount === 1) { + } else if ($amount_buffer === 1) { // Отправка уведомления self::notification('Товар ' . $supply_model->catn . ' добавлен в корзину'); } else { // Отправка уведомления - self::notification('Добавлено ' . $amount . ' товаров в корзину'); + self::notification('Добавлено ' . $amount_buffer . ' товаров в корзину'); } - return $amount; + return $amount_buffer; } /** @@ -321,6 +320,14 @@ class Order extends Document implements DocumentInterface select: '{supply, order_edge_supply}' ); + + // Разделение поставок по типам доставки + // foreach ($connections as $key => &$connection) { + // // Перебор поставок + + // $connection + // } + // Инициализация реестра дубликатов $registry = []; @@ -328,7 +335,10 @@ class Order extends Document implements DocumentInterface foreach ($connections as $key => &$connection) { // Перебор поставок - if (in_array($connection['supply']['catn'], $registry)) { + if (in_array([ + 'catn' => $connection['supply']['catn'], + 'type' => $connection['order_edge_supply'][0]['dlvr']['type'] ?? 'auto' + ], $registry)) { // Если данная поставка найдена в реестре // Удаление @@ -350,7 +360,10 @@ class Order extends Document implements DocumentInterface $amount++; // Запись в реестр - $registry[] = $connection_for_check['supply']['catn']; + $registry[] = [ + 'catn' => $connection_for_check['supply']['catn'], + 'type' => $connection['order_edge_supply'][0]['dlvr']['type'] ?? 'auto' + ]; } } @@ -384,47 +397,61 @@ class Order extends Document implements DocumentInterface // Поиск привязанного товара $connection['product'] = Product::searchBySupplyId($connection['supply']['_id']); - try { - // Инициализация доставки Dellin (автоматическая) - $connection['delivery']['auto'] = Dellin::calcDeliveryAdvanced( - explode('_', $connection['account']['opts']['delivery_from_terminal'])[1], - explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1], - (int) ($connection['product']['wght'] ?? 0), - (int) ($connection['product']['dmns']['x'] ?? 0), - (int) ($connection['product']['dmns']['y'] ?? 0), - (int) ($connection['product']['dmns']['z'] ?? 0), - count($connection['order_edge_supply']) - ); - } catch (Exception $e) { - $connection['delivery']['auto']['error'] = true; + if (empty($connection['order_edge_supply']['dlvr']) || $connection['order_edge_supply']['dlvr']['type'] === 'auto') { + // Доставка автоматическая - // var_dump(json_decode($e->getMessage(), true)['errors']); die; + try { + // Инициализация доставки Dellin (автоматическая) + $connection['delivery'] = Dellin::calcDeliveryAdvanced( + $connection['account']['opts']['delivery_from_terminal'], + yii::$app->user->identity->opts['delivery_to_terminal'], + (int) ($connection['product']['wght'] ?? 0), + (int) ($connection['product']['dmns']['x'] ?? 0), + (int) ($connection['product']['dmns']['y'] ?? 0), + (int) ($connection['product']['dmns']['z'] ?? 0), + count($connection['order_edge_supply']) + ); + } catch (Exception $e) { + $connection['delivery']['error'] = true; + + // var_dump($e->getMessage()); + // var_dump($e->getTrace()); + // var_dump($e->getFile()); die; + + // var_dump(json_decode($e->getMessage(), true)['errors']); die; + } + + // Запись цены (цена поставки + цена доставки + наша наценка) + $connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0; + } else { + // Доставка самолётом + + try { + // Инициализация доставки Dellin (самолётом) + $connection['delivery']['avia'] = Dellin::calcDeliveryAdvanced( + $connection['account']['opts']['delivery_from_terminal'], + yii::$app->user->identity->opts['delivery_to_terminal'], + (int) ($connection['product']['wght'] ?? 0), + (int) ($connection['product']['dmns']['x'] ?? 0), + (int) ($connection['product']['dmns']['y'] ?? 0), + (int) ($connection['product']['dmns']['z'] ?? 0), + count($connection['order_edge_supply']), + avia: true + ); + } catch (Exception $e) { + $connection['delivery']['avia']['error'] = true; + + // var_dump($e->getMessage()); + // var_dump($e->getTrace()); + // var_dump($e->getFile()); die; + + // var_dump(json_decode($e->getMessage(), true)['errors']); die; + } + + // Запись цены (цена поставки + цена доставки + наша наценка) + $connection['cost']['avia'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['avia']['price']['all'] ?? $connection['delivery']['avia']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0; } - // Запись цены (цена поставки + цена доставки + наша наценка) - $connection['cost']['auto'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['auto']['price']['all'] ?? $connection['delivery']['auto']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0; - - try { - // Инициализация доставки Dellin (автоматическая) - $connection['delivery']['avia'] = Dellin::calcDeliveryAdvanced( - explode('_', $connection['account']['opts']['delivery_from_terminal'])[1], - explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1], - (int) ($connection['product']['wght'] ?? 0), - (int) ($connection['product']['dmns']['x'] ?? 0), - (int) ($connection['product']['dmns']['y'] ?? 0), - (int) ($connection['product']['dmns']['z'] ?? 0), - count($connection['order_edge_supply']), - avia: true - ); - } catch (Exception $e) { - $connection['delivery']['avia']['error'] = true; - - // var_dump(json_decode($e->getMessage(), true)['errors']); die; - } - - // Запись цены (цена поставки + цена доставки + наша наценка) - $connection['cost']['avia'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['avia']['price']['all'] ?? $connection['delivery']['avia']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0; - // Запись валюты $connection['currency'] = $cost['Валюта']; } diff --git a/mirzaev/skillparts/system/models/OrderEdgeSupply.php b/mirzaev/skillparts/system/models/OrderEdgeSupply.php index b0c896c..c40d059 100644 --- a/mirzaev/skillparts/system/models/OrderEdgeSupply.php +++ b/mirzaev/skillparts/system/models/OrderEdgeSupply.php @@ -26,7 +26,8 @@ class OrderEdgeSupply extends Edge 'comm', 'cost', 'time', - 'stts' + 'stts', + 'dlvr' ] ); } @@ -42,7 +43,8 @@ class OrderEdgeSupply extends Edge 'comm' => 'Комментарий', 'cost' => 'Цена', 'time' => 'Время', - 'stts' => 'Статус' + 'stts' => 'Статус', + 'dlvr' => 'Доставка' ] ); } @@ -76,6 +78,11 @@ class OrderEdgeSupply extends Edge 'time', 'integer', 'message' => '{attribute} должно быть числом' + ], + [ + 'dlvr', + 'arrayValidator', + 'message' => '{attribute} должен быть массивом' ] ] ); diff --git a/mirzaev/skillparts/system/models/Terminal.php b/mirzaev/skillparts/system/models/Terminal.php index 09c5231..46c1749 100644 --- a/mirzaev/skillparts/system/models/Terminal.php +++ b/mirzaev/skillparts/system/models/Terminal.php @@ -43,13 +43,15 @@ class Terminal extends Document 'city', 'strt', 'hous', - 'offs', - 'dell' + 'offs' ], 'string' ], [ - 'hndl', + [ + 'dell', + 'hndl' + ], 'int' ], [ diff --git a/mirzaev/skillparts/system/models/connection/Dellin.php b/mirzaev/skillparts/system/models/connection/Dellin.php index c0e8531..d3f8ea8 100644 --- a/mirzaev/skillparts/system/models/connection/Dellin.php +++ b/mirzaev/skillparts/system/models/connection/Dellin.php @@ -13,7 +13,6 @@ use GuzzleHttp\Client as Guzzle; use GuzzleHttp\Exception\ClientException as GuzzleException; use Exception; -use phpDocumentor\Reflection\Types\Nullable; class Dellin extends Model { @@ -62,8 +61,8 @@ class Dellin extends Model * Рассчет нескольких товаров идет через простое перемножение результатов доставки одного товара * В API всегда идет рассчет для одного товара, так было решено * - * @param string $from Номер КЛАДР - * @param string $to Номер КЛАДР + * @param string $from Идентификатор терминала Dellin + * @param string $to Идентификатор терминала Dellin * @param int $weight Вес (г) * @param int $x Ширина (cм) * @param int $y Высота (cм) @@ -80,6 +79,10 @@ class Dellin extends Model return self::handle(function () use ($from, $to, $weight, $x, $y, $z, $amount, $avia) { // Всё готово к работе + // Инициализация + $from = DellinModel::searchByTerminalId($from, terminal_data_only: true); + $to = DellinModel::searchByTerminalId($to, terminal_data_only: true); + // Значения по умолчанию, если указан 0 $x === 0 and $x = 25; $y === 0 and $y = 55; @@ -131,11 +134,11 @@ class Dellin extends Model $query['delivery']['deliveryType']['type'] = 'small'; $query['delivery']['derival']['variant'] = 'address'; - $query['delivery']['derival']['address']['search'] = $from; + $query['delivery']['derival']['address']['search'] = $from->fullAddress; $query['delivery']['derival']['time']['worktimeStart'] = '08:00'; $query['delivery']['derival']['time']['worktimeEnd'] = '20:00'; $query['delivery']['arrival']['variant'] = 'address'; - $query['delivery']['arrival']['address']['search'] = $to; + $query['delivery']['arrival']['address']['search'] = $to->fullAddress; $query['delivery']['arrival']['time']['worktimeStart'] = '08:00'; $query['delivery']['arrival']['time']['worktimeEnd'] = '20:00'; } else { @@ -155,9 +158,9 @@ class Dellin extends Model } $query['delivery']['derival']['variant'] = 'terminal'; - $query['delivery']['derival']['terminalID'] = $from; + $query['delivery']['derival']['terminalID'] = $from->id; $query['delivery']['arrival']['variant'] = 'terminal'; - $query['delivery']['arrival']['terminalID'] = $to; + $query['delivery']['arrival']['terminalID'] = $to->id; } // Инициализация @@ -222,10 +225,12 @@ class Dellin extends Model /** * Рассчет доставки * - * @param string $from Номер КЛАДР - * @param string $to Номер КЛАДР + * @param string $from Идентификатор терминала Dellin + * @param string $to Идентификатор терминала Dellin * * @return string + * + * @deprecated */ public static function calcDelivery(string $from, string $to): array { diff --git a/mirzaev/skillparts/system/views/cart/index.php b/mirzaev/skillparts/system/views/cart/index.php index fe147c3..86de859 100644 --- a/mirzaev/skillparts/system/views/cart/index.php +++ b/mirzaev/skillparts/system/views/cart/index.php @@ -40,41 +40,27 @@ use DateTime; // Перебор поставок // Инициализация доставки - if (isset($connection['delivery']['auto']['error'])) { + if (isset($connection['delivery']['error'])) { // Не удалось рассчитать доставку // Инициализация времени - $delivery_auto = '?'; + $delivery = '?'; // Инициализация цены - $cost_auto = '?'; + $cost = '?'; } else { // Удалось рассчитать доставку // Инициализация времени - $delivery_auto = ceil((DateTime::createFromFormat('Y-m-d', $connection['delivery']['auto']['orderDates']['arrivalToOspReceiver'])->getTimestamp() - time()) / 60 / 60 / 24) + 1; + try { + $delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $connection['delivery']['orderDates']['giveoutFromOspReceiver'])->getTimestamp(); + } catch(Exception $e) { + $delivery_converted = DateTime::createFromFormat('Y-m-d', $connection['delivery']['orderDates']['arrivalToOspReceiver'])->getTimestamp(); + } + $delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1; // Инициализация цены - $cost_auto = $connection['cost']['auto'] . ' ' . $connection['currency']; - } - - // Инициализация доставки - if (isset($connection['delivery']['avia']['error'])) { - // Не удалось рассчитать доставку - - // Инициализация времени - $delivery_avia = '?'; - - // Инициализация цены - $cost_avia = '?'; - } else { - // Удалось рассчитать доставку - - // Инициализация времени - $delivery_avia = ceil((DateTime::createFromFormat('Y-m-d H:i:s', $connection['delivery']['avia']['orderDates']['giveoutFromOspReceiver'])->getTimestamp() - time()) / 60 / 60 / 24) + 1; - - // Инициализация цены - $cost_avia = $connection['cost']['avia'] . ' ' . $connection['currency']; + $cost = $connection['cost'] . ' ' . $connection['currency']; } // Инициализация комментария @@ -97,12 +83,10 @@ use DateTime;
- $delivery_auto дн - $delivery_avia дн + $delivery дн
- $cost_auto - $cost_avia + $cost
diff --git a/mirzaev/skillparts/system/views/search/index.php b/mirzaev/skillparts/system/views/search/index.php index 8377343..9077352 100644 --- a/mirzaev/skillparts/system/views/search/index.php +++ b/mirzaev/skillparts/system/views/search/index.php @@ -31,13 +31,14 @@ - + getTimestamp() - time()) / 60 / 60 / 24 + 1; - } + // Инициализация типа доставки + $delivery_type = $delivery['type'] ?? 'auto'; - // Инициализация индекса аккаунта - $index = $account['indx'] ?? 'Неизвестен'; + // Инициализация индикатора + $delivery_icon = match ($delivery_type) { + 'avia' => '', + default => '' + }; - if ($amount_raw < 1 || $price_raw < 1) { - // Нет в наличии или цена 0 рублей + // Инициализация времени + try { + $delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp(); + } catch (Exception $e) { + $delivery_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp(); + } + $delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1; + } - $supplies_html .= << + // Инициализация индекса аккаунта + $index = $account['indx'] ?? 'Неизвестен'; + + // Инициализация модификатора класса + if ($supplies_amount > $supply_iterator) { + $supply_class_modifier = 'mb-1'; + } else { + $supply_class_modifier = ''; + } + + if ($amount_raw < 1 || $price_raw < 1) { + // Нет в наличии или цена 0 рублей + + if ($empty_block) continue; + + $supplies_html .= << Заказать поиск у оператора @@ -107,41 +143,42 @@ HTML; - } else { - // Есть в наличии - $supplies_html .= << - - $index - - - $amount - - - $delivery дн - - - $price - - + // Запись блокировщика + $empty_block = true; + } else { + // Есть в наличии + + $supplies_html .= << +
+ $index + $amount + $delivery_icon $delivery дн + $price +
HTML; - } - ?> + } + + // Обновление счётчика + ++$supply_iterator; + ?> + +
-
+ -
+
diff --git a/mirzaev/skillparts/system/views/search/panel.php b/mirzaev/skillparts/system/views/search/panel.php index 8f8e6bd..56c0f78 100644 --- a/mirzaev/skillparts/system/views/search/panel.php +++ b/mirzaev/skillparts/system/views/search/panel.php @@ -38,7 +38,7 @@ if (isset($history) && $history) { foreach ($response as $row) { // Перебор найденных данных - $catn = $row[0]['supply']['catn']; + $catn = $row['catn']; echo <<$catn diff --git a/mirzaev/skillparts/system/web/css/pages/search.css b/mirzaev/skillparts/system/web/css/pages/search.css index dc378ba..fa7bbb4 100644 --- a/mirzaev/skillparts/system/web/css/pages/search.css +++ b/mirzaev/skillparts/system/web/css/pages/search.css @@ -1,14 +1,17 @@ -#page_search nav>div, -#page_search section>div>div { - height : 65px; +#page_search nav>div, #page_search section>div>div { + /* height : 65px; */ background-color: #fff; - border-right : 0 solid #fff; - transition : 100ms ease-in; + border-right: 0 solid #fff; + transition: 100ms ease-in; +} + +#page_search .row_fixed_height { + height: calc(65px - 1rem); } #page_search section>div>div>img { object-fit: cover; - width : calc(65px - 1rem); + width: calc(65px - 1rem); } /* #page_search nav > div, #page_search section > div:hover > div { @@ -27,4 +30,4 @@ #page_search .search_card .search_card_cart_icon { font-size: larger; -} \ No newline at end of file +} diff --git a/mirzaev/skillparts/system/web/js/cart.js b/mirzaev/skillparts/system/web/js/cart.js index cd40168..7498914 100644 --- a/mirzaev/skillparts/system/web/js/cart.js +++ b/mirzaev/skillparts/system/web/js/cart.js @@ -1,19 +1,19 @@ /** * Записать в корзину (создать корзину, если не существует) */ -function cart_write(catn, amount = 1) { +function cart_write(supply_id, delivery_type, amount = 1) { // Инициализация let data = {}; - data[catn] = amount; + data['supply_id'] = supply_id; + data['amount'] = amount; + data['delivery_type'] = delivery_type; + data['_csrf'] = yii.getCsrfToken() $.ajax({ url: '/order/write', type: 'post', dataType: 'json', - data: { - '_csrf': yii.getCsrfToken(), - 'supplies': data - }, + data: data, success: cart_response_success, error: cart_response_error });