Изменение отображения в поиске

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-06-07 03:49:13 +10:00
parent fab290eacd
commit 21cec0c5b4
14 changed files with 343 additions and 221 deletions

View File

@ -150,23 +150,26 @@ 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 (!is_null($supplies)) {
// Переданы поставки для записи
// Инициализация корзины
if (!$model = Order::search($account)) {
// Корзина не найдена (текущий заказ)
@ -178,17 +181,8 @@ class OrderController extends Controller
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;
}
$model->writeSupply($supply_id, $delivery_type, (int) $amount) or yii::$app->response->statusCode = 500;
return $return;
}

View File

@ -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 {
/**

View File

@ -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;
}
$row = $connections;
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['supplies'] = array_merge($connections, $buffer_connections);
}
// Запись ответа

View File

@ -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;

View File

@ -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();
}
}

View File

@ -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_raw; $i++) {
// Обработка поставок
for ($i = 0; $i < $amount; $i++) {
// Создание рёбер соразмерно запросу (добавление нескольких продуктов в корзину)
// Запись ребра: ЗАКАЗ -> ПОСТАВКА
if (!$supply_model = Supply::searchByCatn($supply_raw) or !OrderEdgeSupply::write($this->readId(), $supply_model->readId(), 'write')) {
if (!$supply_model = Supply::searchById($supply_id) or !$order_edge_supply = OrderEdgeSupply::write($this->readId(), $supply_model->readId(), 'write')) {
// Поставка не найдена или запись ребра не удалась
continue;
} else {
// Ребро создано (товар подключен к заказу)
// Постинкрементация счётчика добавленных товаров
$amount++;
// Обновление счётчика добавленных товаров
$amount_buffer++;
// Запись типа доставки
$order_edge_supply->dlvr = [
'type' => $delivery_type
];
$order_edge_supply->update();
// Запись в журнал
$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,11 +397,14 @@ class Order extends Document implements DocumentInterface
// Поиск привязанного товара
$connection['product'] = Product::searchBySupplyId($connection['supply']['_id']);
if (empty($connection['order_edge_supply']['dlvr']) || $connection['order_edge_supply']['dlvr']['type'] === 'auto') {
// Доставка автоматическая
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],
$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),
@ -396,19 +412,25 @@ class Order extends Document implements DocumentInterface
count($connection['order_edge_supply'])
);
} catch (Exception $e) {
$connection['delivery']['auto']['error'] = true;
$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']['auto'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['auto']['price']['all'] ?? $connection['delivery']['auto']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0;
$connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0;
} else {
// Доставка самолётом
try {
// Инициализация доставки Dellin (автоматическая)
// Инициализация доставки Dellin (самолётом)
$connection['delivery']['avia'] = Dellin::calcDeliveryAdvanced(
explode('_', $connection['account']['opts']['delivery_from_terminal'])[1],
explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1],
$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),
@ -419,11 +441,16 @@ class Order extends Document implements DocumentInterface
} 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['currency'] = $cost['Валюта'];

View File

@ -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} должен быть массивом'
]
]
);

View File

@ -43,13 +43,15 @@ class Terminal extends Document
'city',
'strt',
'hous',
'offs',
'dell'
'offs'
],
'string'
],
[
'hndl',
[
'dell',
'hndl'
],
'int'
],
[

View File

@ -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 Ширина ()
* @param int $y Высота ()
@ -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
{

View File

@ -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;
// Инициализация цены
$cost_auto = $connection['cost']['auto'] . ' ' . $connection['currency'];
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();
}
// Инициализация доставки
if (isset($connection['delivery']['avia']['error'])) {
// Не удалось рассчитать доставку
// Инициализация времени
$delivery_avia = '?';
$delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1;
// Инициализация цены
$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;
<input id="cart_list_amnt_{$connection['supply']['catn']}" class="form-control text-center" type="text" value="{$connection['amount']}" onchange="return cart_list_amount_update('{$connection['supply']['catn']}', this)" aria-invalid="false">
</div>
<div class="col-2 my-auto text-right">
<a type="button" onclick="return false;">$delivery_auto дн</a>
<a type="button" onclick="return false;">$delivery_avia дн</a>
<a type="button" onclick="return false;">$delivery дн</a>
</div>
<div class="col-2 my-auto mr-3 text-right">
$cost_auto
$cost_avia
$cost
</div>
</div>
<div class="dropdown-divider"></div>

View File

@ -31,13 +31,14 @@
<?php
// Инициализация
extract($row[0]);
extract($row);
$name ?? $name = 'Без названия';
// $dscr ?? $dscr = 'Описание';
$catg ?? $catg = 'Категория';
$covr = null;
$catn ?? $catn = 'Неизвестно';
// Инициализация обложки
$covr = null;
foreach ($imgs ?? [] as $img) {
// Перебор изображений для обложки
@ -61,12 +62,23 @@
}
}
// Инициализация буфера с HTML поставок
$supplies_html = '';
// Инициализация блокировщика для пустого блока (на случай, если нет поставок, чтобы не было дубликатов вывода)
$empty_block = false;
// Инициализация счётчика поставок
$supplies_amount = count($row['supplies']);
// Инициализация указателя номера цикла
$supply_iterator = 1;
?>
<?php foreach ($row['supplies'] as $supply) : ?>
<?php
// Инициализация артикула
$catn = $supply['catn'] ?? $supply['onec']['Артикул'];
// Инициализация переменных
extract($supply);
// Инициализация цены
$price_raw = $cost;
@ -81,25 +93,49 @@
$amount .= ' шт';
}
// Инициализация доставки// Инициализация доставки
if (isset($delivery['error'])) {
// Инициализация доставки
if (isset($delivery['error']) || $delivery === '?') {
// Не удалось рассчитать доставку
$delivery = '?';
} else {
// Удалось рассчитать доставку
$delivery = (DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp() - time()) / 60 / 60 / 24 + 1;
// Инициализация типа доставки
$delivery_type = $delivery['type'] ?? 'auto';
// Инициализация индикатора
$delivery_icon = match ($delivery_type) {
'avia' => '<i class="mr-1 fas fa-plane"></i>',
default => '<i class="mr-1 fas fa-truck"></i>'
};
// Инициализация времени
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;
}
// Инициализация индекса аккаунта
$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 .= <<<HTML
<div class="row my-auto m-0 h-100 text-right">
<div class="row $supply_class_modifier m-0 h-100 text-right">
<a class="col-auto ml-auto my-auto text-dark" href="/order/new/custom" role="button" onclick="return false;">
<small>
Заказать поиск у оператора
@ -107,41 +143,42 @@
</a>
</div>
HTML;
// Запись блокировщика
$empty_block = true;
} else {
// Есть в наличии
$supplies_html .= <<<HTML
<div class="row my-auto m-0 h-100 text-right">
<small class="col-1 my-auto ml-auto pl-2 pr-0">
$index
</small>
<small class="col-1 my-auto pl-2 pr-0">
$amount
</small>
<small class="col-1 my-auto pl-2 pr-0 mr-2">
$delivery дн
</small>
<b class="col-2 my-auto">
$price
</b>
<a class="col-1 h-100 text-dark d-flex button_white rounded" title="Добавить $catn в корзину" role="button" onclick="return cart_write('$catn');">
<div class="row $supply_class_modifier m-0 text-right">
<div class="col-5 mr-4"></div>
<small class="col-1 ml-2 my-auto pl-2 pr-0">$index</small>
<small class="col-1 my-auto pl-2 pr-0 text-center">$amount</small>
<small class="col-auto mr-2 my-auto pl-2 pr-0 text-left">$delivery_icon $delivery дн</small>
<b class="col-2 ml-auto my-auto">$price</b>
<a class="col-1 ml-0 py-2 text-dark d-flex button_white rounded" title="Добавить $catn в корзину" role="button" onclick="return cart_write('{$supply['_id']}', '$delivery_type');">
<i class="fas fa-cart-arrow-down pr-1 m-auto"></i>
</a>
</div>
HTML;
}
// Обновление счётчика
++$supply_iterator;
?>
<?php endforeach ?>
<div class="col pb-2">
<div class="row p-2 rounded">
<img class="ml-0 h-100 img-fluid rounded" src="<?= $covr ?>" />
<div class="col-3 ml-3 p-0 d-flex flex-column">
<div class="col-3 ml-3 p-0 d-flex flex-column row_fixed_height">
<a class="my-auto text-dark" href="/product/<?= $catn ?>">
<h5 class="m-0"><?= $name ?></h5>
<h6 class="m-0"><small><?= $catn ?></small></h6>
</a>
</div>
<div class="col-1 ml-2 p-0 d-flex flex-column">
<div class="col-1 ml-2 p-0 d-flex flex-column row_fixed_height">
<a class="my-auto text-dark" href="/product/<?= $catn ?>">
<small><?= $catg ?></small>
</a>

View File

@ -38,7 +38,7 @@ if (isset($history) && $history) {
foreach ($response as $row) {
// Перебор найденных данных
$catn = $row[0]['supply']['catn'];
$catn = $row['catn'];
echo <<<HTML
<a class="dropdown-item button_white text-dark" href="/product/$catn">$catn</a>

View File

@ -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 {

View File

@ -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
});