Изменение отображения в поиске
This commit is contained in:
parent
fab290eacd
commit
21cec0c5b4
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
// Запись ответа
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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['Валюта'];
|
||||
}
|
||||
|
|
|
@ -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} должен быть массивом'
|
||||
]
|
||||
]
|
||||
);
|
||||
|
|
|
@ -43,13 +43,15 @@ class Terminal extends Document
|
|||
'city',
|
||||
'strt',
|
||||
'hous',
|
||||
'offs',
|
||||
'dell'
|
||||
'offs'
|
||||
],
|
||||
'string'
|
||||
],
|
||||
[
|
||||
'hndl',
|
||||
[
|
||||
'dell',
|
||||
'hndl'
|
||||
],
|
||||
'int'
|
||||
],
|
||||
[
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
|||
<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>
|
||||
|
|
|
@ -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,45 +62,80 @@
|
|||
}
|
||||
}
|
||||
|
||||
// Инициализация буфера с HTML поставок
|
||||
$supplies_html = '';
|
||||
|
||||
// Инициализация блокировщика для пустого блока (на случай, если нет поставок, чтобы не было дубликатов вывода)
|
||||
$empty_block = false;
|
||||
|
||||
// Инициализация счётчика поставок
|
||||
$supplies_amount = count($row['supplies']);
|
||||
|
||||
// Инициализация указателя номера цикла
|
||||
$supply_iterator = 1;
|
||||
?>
|
||||
|
||||
<?php
|
||||
// Инициализация артикула
|
||||
$catn = $supply['catn'] ?? $supply['onec']['Артикул'];
|
||||
<?php foreach ($row['supplies'] as $supply) : ?>
|
||||
<?php
|
||||
// Инициализация переменных
|
||||
extract($supply);
|
||||
|
||||
// Инициализация цены
|
||||
$price_raw = $cost;
|
||||
$price = $price_raw . ' ' . $supply_edge_product[0]['onec']['Цены']['Цена']['Валюта'];
|
||||
// Инициализация цены
|
||||
$price_raw = $cost;
|
||||
$price = $price_raw . ' ' . $supply_edge_product[0]['onec']['Цены']['Цена']['Валюта'];
|
||||
|
||||
// Инициализация количества
|
||||
$amount_raw = $amount = $supply['amnt'] ?? $supply_edge_product[0]['onec']['Количество'];
|
||||
if (empty($amount_raw) || $amount_raw < 1) {
|
||||
// Уже не используется
|
||||
$amount = 'Под заказ';
|
||||
} else {
|
||||
$amount .= ' шт';
|
||||
}
|
||||
// Инициализация количества
|
||||
$amount_raw = $amount = $supply['amnt'] ?? $supply_edge_product[0]['onec']['Количество'];
|
||||
if (empty($amount_raw) || $amount_raw < 1) {
|
||||
// Уже не используется
|
||||
$amount = 'Под заказ';
|
||||
} else {
|
||||
$amount .= ' шт';
|
||||
}
|
||||
|
||||
// Инициализация доставки// Инициализация доставки
|
||||
if (isset($delivery['error'])) {
|
||||
// Не удалось рассчитать доставку
|
||||
// Инициализация доставки
|
||||
if (isset($delivery['error']) || $delivery === '?') {
|
||||
// Не удалось рассчитать доставку
|
||||
|
||||
$delivery = '?';
|
||||
} else {
|
||||
// Удалось рассчитать доставку
|
||||
$delivery = '?';
|
||||
} else {
|
||||
// Удалось рассчитать доставку
|
||||
|
||||
$delivery = (DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp() - time()) / 60 / 60 / 24 + 1;
|
||||
}
|
||||
// Инициализация типа доставки
|
||||
$delivery_type = $delivery['type'] ?? 'auto';
|
||||
|
||||
// Инициализация индекса аккаунта
|
||||
$index = $account['indx'] ?? 'Неизвестен';
|
||||
// Инициализация индикатора
|
||||
$delivery_icon = match ($delivery_type) {
|
||||
'avia' => '<i class="mr-1 fas fa-plane"></i>',
|
||||
default => '<i class="mr-1 fas fa-truck"></i>'
|
||||
};
|
||||
|
||||
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 .= <<<HTML
|
||||
<div class="row my-auto m-0 h-100 text-right">
|
||||
// Инициализация индекса аккаунта
|
||||
$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 $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;
|
||||
} 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');">
|
||||
// Запись блокировщика
|
||||
$empty_block = true;
|
||||
} else {
|
||||
// Есть в наличии
|
||||
|
||||
$supplies_html .= <<<HTML
|
||||
<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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
});
|
||||
|
|
Reference in New Issue