залупа

This commit is contained in:
root 2022-08-04 13:37:24 +00:00
parent 3ec9b920d2
commit 4fafe85639
40 changed files with 32019 additions and 773 deletions

View File

@ -86,7 +86,8 @@ class CartController extends Controller
$account = Account::initAccount(); $account = Account::initAccount();
// Поиск корзины (текущего заказа) // Поиск корзины (текущего заказа)
$data = Order::searchByType()[0] ?? null; $data = Order::searchSmart()[0] ?? null;
if (empty($data['order'])) { if (empty($data['order'])) {
// Корзина не инициализирована // Корзина не инициализирована
@ -105,7 +106,7 @@ class CartController extends Controller
} }
// Инициализация содержимого корзины // Инициализация содержимого корзины
$data['supplies'] = $data['order']->supplies(10, $page, test: true); $data['supplies'] = $data['order']->supplies(10, $page);
// Инициализация данных списка для выбора терминала // Инициализация данных списка для выбора терминала
$delivery_to_terminal_list = $account->genListTerminalsTo(); $delivery_to_terminal_list = $account->genListTerminalsTo();
@ -163,7 +164,7 @@ class CartController extends Controller
goto end; goto end;
} }
if ($edges = OrderEdgeSupply::searchBySupplyCatnAndProd($catn, $prod, Order::searchByType())) { if ($edges = OrderEdgeSupply::searchBySupplyCatnAndProd($catn, $prod, Order::searchByType()[0]['order'])) {
// Рёбра найдены (связи заказа с поставкой) // Рёбра найдены (связи заказа с поставкой)
// Инициализация // Инициализация

File diff suppressed because it is too large Load Diff

View File

@ -143,6 +143,7 @@ class SearchController extends Controller
'dscr' => 'dscr', 'dscr' => 'dscr',
'catg' => 'catg', 'catg' => 'catg',
'imgs' => 'imgs', 'imgs' => 'imgs',
'name' => 'name',
'prod' => 'prod', 'prod' => 'prod',
'dmns' => 'dmns', 'dmns' => 'dmns',
'stts' => 'stts' 'stts' => 'stts'

View File

@ -11,6 +11,68 @@ class AccountEdgeOrder extends Edge
return 'account_edge_order'; return 'account_edge_order';
} }
/**
* Свойства
*/
public function attributes(): array
{
return array_merge(
parent::attributes(),
[
'stts'
]
);
}
/**
* Метки свойств
*/
public function attributeLabels(): array
{
return array_merge(
parent::attributeLabels(),
[
'stts' => 'Статус'
]
);
}
/**
* Правила
*/
public function rules(): array
{
return array_merge(
parent::rules(),
[
[
[
'stts'
],
'string'
]
]
);
}
/**
* Перед сохранением
*
* @todo Подождать обновление от ебаного Yii2 и добавить
* проверку типов передаваемых параметров
*/
public function beforeSave($data): bool
{
if (parent::beforeSave($data)) {
if ($this->isNewRecord) {
$this->stts = 'current';
}
return true;
}
return false;
}
/** /**
* Поиск по идентификатору заказа * Поиск по идентификатору заказа
* *
@ -23,22 +85,4 @@ class AccountEdgeOrder extends Edge
{ {
return self::find()->where(['_to' => $order_id])->limit($limit)->all(); return self::find()->where(['_to' => $order_id])->limit($limit)->all();
} }
/**
* Генерация ярлыка на русском языке для статуса заказа
*
* @param string $status Статус заказа
*
* @return string Ярлык статуса на русском языке
*/
public static function statusToRussian(string $status = ''): string
{
return match ($status) {
'requested' => 'Запрошен',
'accepted' => 'Ожидается отправка',
'going' => 'Доставляется',
'completed' => 'Завершен',
default => 'Обрабатывается'
};
}
} }

View File

@ -120,7 +120,7 @@ abstract class Edge extends Document
// Настройка // Настройка
$edge->_from = $_from; $edge->_from = $_from;
$edge->_to = $_to; $edge->_to = $_to;
$edge->type = $type; if (isset($type)) $edge->type = $type;
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
if (is_int($key)) { if (is_int($key)) {

View File

@ -96,7 +96,7 @@ class Order extends Document implements DocumentInterface
public function connect(Account $account): ?AccountEdgeOrder public function connect(Account $account): ?AccountEdgeOrder
{ {
// Запись ребра: АККАУНТ -> ЗАКАЗ // Запись ребра: АККАУНТ -> ЗАКАЗ
return AccountEdgeOrder::write($account->readId(), $this->readId(), 'current') ?? throw new Exception('Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ'); return AccountEdgeOrder::write($account->readId(), $this->readId(), data: ['stts' => 'current']) ?? throw new Exception('Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ');
} }
/** /**
@ -263,9 +263,9 @@ class Order extends Document implements DocumentInterface
* *
* @todo Привести в порядок * @todo Привести в порядок
*/ */
public static function searchByType( public static function searchSmart(
Account|string $account = null, Account|string $account = null,
string $type = 'current', string $stts = 'current',
string|null $search = null, string|null $search = null,
int $limit = 1, int $limit = 1,
int $page = 1, int $page = 1,
@ -276,24 +276,28 @@ class Order extends Document implements DocumentInterface
bool $count = false bool $count = false
): int|array|null { ): int|array|null {
// Инициализация аккаунта // Инициализация аккаунта
if (empty($account) && isset(yii::$app->user->identity)) { if (empty($account)) {
// Данные не переданы // Не получен аккаунт
$subquery_where = [ $subquery_where = [
[ [
'account._id' => yii::$app->user->identity->readId() 'account._id' => Account::initAccount()->readId()
] ]
]; ];
} else if ($account instanceof Account) { } else if ($account instanceof Account) {
// Передан аккаунт // Получен аккаунт
$subquery_where = [ if (Account::isMinimalAuthorized(Account::initAccount())) {
[ $subquery_where = [
'account._id' => $account->readId() [
] 'account._id' => $account->readId()
]; ]
];
} else {
throw new Exception('У вас нет прав на обработку другого пользователя');
}
} else if (str_contains($account, '@all')) { } else if (str_contains($account, '@all')) {
// Запрос на обработку всех аккаунтов // Получен запрос на обработку всех аккаунтов
$subquery_where = []; $subquery_where = [];
} else { } else {
@ -301,11 +305,11 @@ class Order extends Document implements DocumentInterface
} }
// Инициализация типа заказа // Инициализация типа заказа
if (strcasecmp($type, 'all') !== 0) { if (strcasecmp($stts, '@all') !== 0) {
// Если не указан поиск всех заказов // Если не указан поиск всех заказов
$subquery_where[] = [ $subquery_where[] = [
'account_edge_order.type' => $type 'account_edge_order.stts' => $stts
]; ];
} }
@ -409,7 +413,7 @@ class Order extends Document implements DocumentInterface
* @todo В будущем возможно заказ не только поставок реализовать * @todo В будущем возможно заказ не только поставок реализовать
* Переписать реестр и проверку на дубликаты, не понимаю как они работают * Переписать реестр и проверку на дубликаты, не понимаю как они работают
*/ */
public function supplies(int $limit = 1, int $page = 1, string|null $search = null, bool $count = false, $test = false): Supply|int|array|null public function supplies(int $limit = 1, int $page = 1, string|null $search = null, bool $count = false): Supply|int|array|null
{ {
// Инициализация аккаунта // Инициализация аккаунта
$account = Account::initAccount(); $account = Account::initAccount();
@ -564,17 +568,32 @@ class Order extends Document implements DocumentInterface
*/ */
public static function checkSuppliesStts(array $order_edge_supply): bool public static function checkSuppliesStts(array $order_edge_supply): bool
{ {
foreach ($order_edge_supply as $edge) { if (isset($order_edge_supply['_key'])) {
// Перебор поставок // Получено ребро: ЗАКАЗ -> ПОСТАВКА
if (empty($edge['stts']) || $edge['stts'] !== 'accepted') { if (empty($order_edge_supply['stts']) || $order_edge_supply['stts'] === 'processing' || $order_edge_supply['stts'] === 'requested') {
// Найдена неподтверждённая поставка // Найдена неподтверждённая поставка
return false; return false;
} }
return true;
} else if (isset($order_edge_supply[0]['_key'])) {
// Получен массив (подразумевается, что с рёбрами: ЗАКАЗ -> ПОСТАВКА)
foreach ($order_edge_supply as $edge) {
// Перебор поставок
if (empty($edge['stts']) || $edge['stts'] === 'processing' || $edge['stts'] === 'requested') {
// Найдена неподтверждённая поставка
return false;
}
}
return true;
} }
return true; return false;
} }
/** /**
@ -737,6 +756,47 @@ class Order extends Document implements DocumentInterface
*/ */
public static function count(int $limit = 500, bool $supplies = false): int public static function count(int $limit = 500, bool $supplies = false): int
{ {
return (int) self::searchByType(supplies: $supplies, type: $supplies ? 'current' : 'all', limit: $limit, count: true); return (int) self::searchSmart(supplies: $supplies, stts: $supplies ? 'current' : '@all', limit: $limit, count: true);
}
/**
* Генерация ярлыка на русском языке для статуса заказа
*
* @param string|null $status Статус заказа
*
* @return string Ярлык статуса на русском языке
*/
public static function statusToRussian(?string $status = 'processing'): string
{
return match ($status) {
'processing' => 'Обрабатывается',
'requested' => 'Запрошен',
'accepted' => 'Ожидается отправка',
'going' => 'Доставляется',
'ready' => 'Готов к выдаче',
'completed' => 'Завершен',
'reserved' => 'Резервирован',
default => 'Обрабатывается'
};
}
/**
* Генерация списка статусов на русском языке
*
* @param string|null $active Активный статус, который выведется первым в списке
*
* @return string Лист статусов на русском языке
*/
public static function statusListInRussian(?string $active = 'processing'): array
{
return [(empty($active) ? 'processing' : $active) => static::statusToRussian($active)] + [
'processing' => 'Обрабатывается',
'requested' => 'Запрошен',
'accepted' => 'Ожидается отправка',
'going' => 'Доставляется',
'ready' => 'Готов к выдаче',
'completed' => 'Завершен',
'reserved' => 'Резервирован'
];
} }
} }

View File

@ -14,7 +14,6 @@ class OrderEdgeSupply extends Edge
return 'order_edge_supply'; return 'order_edge_supply';
} }
/** /**
* Свойства * Свойства
*/ */
@ -118,7 +117,7 @@ class OrderEdgeSupply extends Edge
/** /**
* Поиск поставки по артикулу * Поиск по данным поставки
* *
* @param string $catn Артикул * @param string $catn Артикул
* @param Order $order Заказ * @param Order $order Заказ
@ -126,7 +125,7 @@ class OrderEdgeSupply extends Edge
* *
* @return array Поставки * @return array Поставки
*/ */
public static function searchBySupplyCatnAndProd(string $catn, string $prod, Order $order = null, int $limit = 10): array public static function searchBySupplyData(string $catn, string $prod, ?string $delivery = null, ?Order $order = null, int $limit = 10): array
{ {
if ($supply = Supply::searchByCatnAndProd($catn, $prod)) { if ($supply = Supply::searchByCatnAndProd($catn, $prod)) {
// Поставка найдена // Поставка найдена
@ -134,6 +133,12 @@ class OrderEdgeSupply extends Edge
if (isset($order)) { if (isset($order)) {
// Поиск только по определённому заказу // Поиск только по определённому заказу
if (isset($delivery)) {
// Поиск только по определённым типам доставки
return self::find()->where(['_from' => $order->readId(), '_to' => $supply->readId(), 'order_edge_supply.dlvr.type' => $delivery])->limit($limit)->all();
}
return self::find()->where(['_from' => $order->readId(), '_to' => $supply->readId()])->limit($limit)->all(); return self::find()->where(['_from' => $order->readId(), '_to' => $supply->readId()])->limit($limit)->all();
} }
@ -143,21 +148,21 @@ class OrderEdgeSupply extends Edge
return []; return [];
} }
/** /**
* Генерация ярлыка на русском языке для статуса заказа поставки * Генерация ярлыка на русском языке для статуса заказа
* *
* @param string $status Статус заказа поставки * @param string|null $status Статус заказа
* *
* @return string Ярлык статуса на русском языке * @return string Ярлык статуса на русском языке
*/ */
public static function statusToRussian(string $status = ''): string public static function statusToRussian(?string $status = 'processing'): string
{ {
return match ($status) { return match ($status) {
'requested' => 'Запрошен', 'requested' => 'Запрошен',
'accepted' => 'Ожидается отправка', 'accepted' => 'Ожидается отправка',
'going' => 'Доставляется', 'going' => 'Доставляется',
'completed' => 'Завершен', 'completed' => 'Завершен',
'processing' => 'Обрабатывается',
default => 'Обрабатывается' default => 'Обрабатывается'
}; };
} }

Binary file not shown.

View File

@ -1 +1 @@
<p class="my-2 mx-3" href="/orders#<?= $order ?>">Данные заказа #<?= $order ?> изменены: <?= $target ?> с <?= $from ?> на <?= $to ?></p> <p class="my-2 mx-3" href="/orders#<?= $order ?>"><b>#<?= $order ?>:</b> <?= mb_convert_case($target, MB_CASE_LOWER, "UTF-8") ?><?php if (!empty($to)) : ?><?php if (!empty($from)) : ?> с "<?= mb_convert_case($from, MB_CASE_LOWER, "UTF-8") ?>"<?php endif ?> на "<?= mb_convert_case($to, MB_CASE_LOWER, "UTF-8") ?>"<?php endif ?></p>

View File

@ -42,18 +42,18 @@ if (empty($window)) {
<input type="radio" id="orders_panel_moderation" name="main_panel" <?= $window === 'orders_panel_moderation' ? 'checked' : null ?> /> <input type="radio" id="orders_panel_moderation" name="main_panel" <?= $window === 'orders_panel_moderation' ? 'checked' : null ?> />
<article> <article>
<div class="orders_panel_moderation_menu mb-3"> <div class="orders_panel_moderation_menu mb-3">
<label class="btn btn-sm button_white mb-0 mr-2" for="orders_panel_moderation_all">Все</label> <label class="btn btn-sm button_white mb-0" onclick="return orders_read('@last', '@all', null, null, 'orders_panel_moderation');">Все</label>
<label class="btn btn-sm button_white mb-0 mr-2" for="orders_panel_moderation_requested">Запрошены</label> <?php foreach(Order::statusListInRussian() as $id => $label) : ?>
<label class="btn btn-sm button_white mb-0 mr-2" for="orders_panel_moderation_handled">Обрабатываются</label> <label class="btn btn-sm button_white mb-0 ml-2" onclick="return orders_read('@last', '<?= $id ?>', null, null, 'orders_panel_moderation');"><?= $label ?></label>
<label class="btn btn-sm button_white mb-0" for="orders_panel_moderation_completed">Завершены</label> <?php endforeach ?>
</div> </div>
<?php if (!empty($moderator_data)) : ?> <?php if (!empty($moderator_data)) : ?>
<?php foreach ($moderator_data as $moderator_data) : ?> <?php foreach ($moderator_data as $moderator_data) : ?>
<div id="<?= $moderator_data['order']->_key ?>_panel" class="page_order_panel mb-3 py-3 px-4 rounded"> <div id="<?= $moderator_data['order']->_key ?>_panel" class="page_order_panel mb-2 py-3 px-4 rounded">
<h5 class="row mt-1 mb-3"> <h5 class="row mt-1 mb-3">
<?php <?php
// Инициализация времени отправки заказа // Инициализация времени отправки заказа
$date = null; $date = time();
foreach ($moderator_data['order']->jrnl as $entry) { foreach ($moderator_data['order']->jrnl as $entry) {
// Перебор записей в журнале // Перебор записей в журнале
@ -76,18 +76,18 @@ if (empty($window)) {
// Конвертация данных из буфера // Конвертация данных из буфера
$date = [ $date = [
'H:i' => (new DateTime())->setTimestamp($date)->setTimezone(new DateTimeZone($timezone))->format('H:i'), 'H:i' => (new DateTime())->setTimestamp($date)->setTimezone(new DateTimeZone($timezone))->format('H:i'),
'm.d.Y' => (new DateTime())->setTimestamp($date)->setTimezone(new DateTimeZone($timezone))->format('m.d.Y') 'm.d.Y' => (new DateTime())->setTimestamp($date)->setTimezone(new DateTimeZone($timezone))->format('d.m.Y')
]; ];
?> ?>
<p class="col-auto ml-1 font-weight-bold">#<?= $moderator_data['order']->_key ?></p> <p class="col-auto ml-1 font-weight-bold">#<?= $moderator_data['order']->_key ?></p>
<p class="col-auto mr-1 font-weight-bold"> <p class="col-auto mr-1 font-weight-bold">
<span class="mr-2"><?= $date['H:i'] ?? 'Неизвестно' ?></span> <span><small><small><?= $date['H:i'] ?? 'Неизвестно' ?></small></small></span>
<span><?= $date['m.d.Y'] ?? 'Неизвестно' ?></span> <span><?= $date['m.d.Y'] ?? 'Неизвестно' ?></span>
</p> </p>
</h5> </h5>
<div class="dropdown-divider mb-3"></div> <div class="dropdown-divider mb-3"></div>
<div class="row px-2"> <div class="row px-3">
<div id="orders_panel_supplies_<?= $moderator_data['order']->_key ?>" class="col-3 unselectable"> <div id="orders_panel_supplies_<?= $moderator_data['order']->_key ?>" class="col-3 unselectable">
<?php if (!empty($moderator_data['supplies'])) : ?> <?php if (!empty($moderator_data['supplies'])) : ?>
<?php <?php
@ -128,21 +128,18 @@ if (empty($window)) {
if ($supply['amount'] > 0) { if ($supply['amount'] > 0) {
// Пройдена проверка на количество поставок в заказе // Пройдена проверка на количество поставок в заказе
// if (Order::checkSuppliesStts($order_edge_supply)) { if (Order::checkSuppliesStts($supply['edge'])) $status = "<span id=\"{$moderator_data['order']->_key}_{$prod}_{$catn}_{$delivery}_supply_stts_indicator_icon\" class=\"ml-auto my-auto fas fa-check\"></span>";
// $status = '<span id="' . $supply['catn'] . '_auto_supply_stts_indicator_icon" class="ml-auto my-auto fas fa-check"></span>'; else $status = '';
// } else {
$status = '';
// }
// Инициализация иконки // Инициализация иконки
$icon = $delivery === 'avia' ? 'fa-plane' : 'fa-truck'; $icon = $delivery === 'avia' ? 'fa-plane' : 'fa-truck';
// Генерация HTML // Генерация HTML
echo <<<HTML echo <<<HTML
<a id="{$prod}_{$catn}_{$delivery}_supply" class="row mb-2 p-2 px-0 rounded row_supply" type="button" onclick="return orders_supply_edit('{$prod}_{$catn}_{$delivery}', {$moderator_data['order']->_key});"> <a id="{$moderator_data['order']->_key}_{$prod}_{$catn}_{$delivery}_supply" class="row mb-2 p-2 px-0 rounded row_supply" type="button" onclick="return orders_supply_edit('{$moderator_data['order']->_key}', '$prod', '$catn', '$delivery');">
<img class="col-auto px-0 h-100 img-fluid rounded" src="$covr" /> <img class="col-auto px-0 h-100 img-fluid rounded" src="$covr" />
<p id="{$prod}_{$catn}_{$delivery}_supply_stts_indicator" class="col d-flex text-dark"> <p id="{$moderator_data['order']->_key}_{$prod}_{$catn}_{$delivery}_supply_stts_indicator" class="col d-flex text-dark">
{$catn} x{$supply['amount']} {$catn}
<small class="ml-2 my-auto fas $icon"></small> <small class="ml-2 my-auto fas $icon"></small>
$status $status
</p> </p>
@ -166,9 +163,30 @@ if (empty($window)) {
<p class="my-auto">Выберите поставку</p> <p class="my-auto">Выберите поставку</p>
</div> </div>
<div id="orders_panel_info_<?= $moderator_data['order']->_key ?>" class="col-3 d-flex flex-column"> <div id="orders_panel_info_<?= $moderator_data['order']->_key ?>" class="col-3 d-flex flex-column">
<p class="row mt-0 mb-3 px-2"><b>Статус:</b> <span class="ml-auto"><?= AccountEdgeOrder::statusToRussian(AccountEdgeOrder::searchByOrder($moderator_data['order']->readId())['stts'] ?? '') ?></span></p> <?php $form = ActiveForm::begin([
<a id="<?= $moderator_data['order']->_key ?>_button" class="row mt-auto mb-0 text-center text-white btn button_blue button_clean disabled" type="button" onclick="return order_accept('<?= $moderator_data['order']->_key ?>');">Подтвердить</a> 'id' => 'form_profile_settings',
</div> 'action' => false,
'fieldConfig' => [
'template' => '{label}{input}',
],
'options' => [
'onsubmit' => 'return false;',
'class' => 'row'
]
]);
// Инициализация ребра до заказа
$account_edge_order = AccountEdgeOrder::searchByOrder($moderator_data['order']->readId())[0];
?>
<?= $form->field($account_edge_order, 'stts', ['options' => ['class' => "mb-1 w-100"]])
->dropDownList(Order::statusListInRussian($account_edge_order->stts), [
'onChange' => "return orders_status_edit('{$moderator_data['order']->_key}', this);",
'data-old-value' => $account_edge_order->stts
])->label(false); ?>
<small class="d-block mb-1 w-100 text-center"><b>Покупатель будет уведомлён</b></small>
<?php ActiveForm::end(); ?>
</div>
</div> </div>
<script defer> <script defer>
document.addEventListener( document.addEventListener(
@ -192,13 +210,15 @@ if (empty($window)) {
<?php endif ?> <?php endif ?>
<article class="page_order_panel mt-3 py-3 px-4 rounded <?= $account_type ?? false ? '' : 'd-block'; ?>"> <article class="page_order_panel mt-3 py-3 px-4 rounded <?= $account_type ?? false ? '' : 'd-block'; ?>">
<div class="row mt-2 mb-2"> <div class="row mt-2 mb-3">
<h4 class="col ml-4"><i class="fas fa-list mr-2"></i>Заказы</h4> <h4 class="col-auto mx-auto mb-0">Заказы</h4>
<div class="col-auto orders_panel_menu ml-auto text-right"> </div>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', 'all');">Все</a> <div class="row mb-3">
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', 'requested');">Запрошенные</a> <div class="col-auto orders_panel_menu mx-auto">
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', 'accepted');">Активные</a> <a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', '@all');">Все</a>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0" type="button" onclick="return orders_read('@last', 'completed');">Завершенные</a> <?php foreach(Order::statusListInRussian() as $id => $label) : ?>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', '<?= $id ?>');"><?= $label ?></a>
<?php endforeach ?>
</div> </div>
</div> </div>
<div class="row mb-4 px-3"> <div class="row mb-4 px-3">
@ -225,11 +245,8 @@ if (empty($window)) {
<input id="orders_period_calendar" class="pl-0 h-100 form_clean_full text-center" type="text" /><i class="ml-2 fas fa-calendar-alt my-auto"></i> <input id="orders_period_calendar" class="pl-0 h-100 form_clean_full text-center" type="text" /><i class="ml-2 fas fa-calendar-alt my-auto"></i>
</div> </div>
</div> </div>
<div class="col mb-4 list rounded"> <div class="col mb-2 list rounded">
<div class="row py-3 text-center"> <div class="row py-3 text-center">
<!-- <div class="pl-3 mr-1">
<input id="checkbox_cart_all" type="checkbox" onchange="return cart_list_checkbox(this);" />
</div> -->
<span class="col-2"><b>Артикул</b></span> <span class="col-2"><b>Артикул</b></span>
<span class="col-3"><b>Статус</b></span> <span class="col-3"><b>Статус</b></span>
<span class="col-3"><b>Поступление</b></span> <span class="col-3"><b>Поступление</b></span>
@ -245,9 +262,9 @@ if (empty($window)) {
// Перебор заказов // Перебор заказов
// Инициализация ребра: АККАУНТ -> ЗАКАЗ // Инициализация ребра: АККАУНТ -> ЗАКАЗ
$edge = AccountEdgeOrder::searchByOrder($moderator_data['order']->readId()); $account_edge_order = AccountEdgeOrder::searchByOrder($data['order']->readId())[0];
if (isset($edge['stts']) && ($order['stts'] === 'reserved' || $edge['stts'] === 'current')) { if (isset($account_edge_order->stts) && ($account_edge_order['stts'] === 'reserved' || $account_edge_order->stts === 'current')) {
// Заказ был резервирован (отменён) или это активный заказ (несформированный, в корзине) // Заказ был резервирован (отменён) или это активный заказ (несформированный, в корзине)
continue; continue;
@ -285,9 +302,12 @@ if (empty($window)) {
if (isset($data['supplies'])) { if (isset($data['supplies'])) {
// Найдены поставки // Найдены поставки
// Инициализация максимального срока доставки // Инициализация максимального срока доставки поставок
$delivery_max = 0; $delivery_max = 0;
// Инициализация общего количества поставок
$amount_max = 0;
// Инициализация поставок // Инициализация поставок
foreach ($data['supplies'] as $prod => $list) { foreach ($data['supplies'] as $prod => $list) {
// Перебор поставок // Перебор поставок
@ -296,85 +316,90 @@ if (empty($window)) {
foreach ($deliveries as $delivery => $supply) { foreach ($deliveries as $delivery => $supply) {
// Перебор заказов // Перебор заказов
// Инициализация ребра: ЗАКАЗ -> ПОСТАВКА if ($order_edge_supply = OrderEdgeSupply::searchBySupplyData((string) $catn, (string) $prod, (string) $delivery, $data['order'])) {
$edge = OrderEdgeSupply::searchBySupplyCatnAndProd((string) $catn, $prod); // Удалось найти рёбра: ЗАКАЗ -> ПОСТАВКА
// Инициализация цены
$price_raw = $supply['cost'];
// Инициализация комментария
$comment = $edge['comm'] ?? 'Комментарий к заказу';
if ($supply['amount'] > 0) {
// Пройдена проверка на количество поставок в заказе
// Инициализация цены // Инициализация цены
$price = $price_raw * $supply['amount'] . ' ' . $supply['currency']; $price_raw = $order_edge_supply[0]->cost ?? $supply['cost'] ?? 0;
// Инициализация доставки if ($supply['amount'] > 0) {
if (!isset($supply['delivery']) || (isset($supply['delivery'], $supply['delivery']['error']) || $supply['delivery'] === '?')) { // Пройдена проверка на количество поставок в заказе
// Не удалось рассчитать доставку
// Инициализация времени // Инициализация цены
$days = '?'; $price = $price_raw * $supply['amount'] . ' ' . $supply['currency'];
} else {
// Удалось рассчитать доставку
// Инициализация даты отправки // Инициализация доставки
try { if (empty($time = $order_edge_supply[0]->time)) {
// Взять данные из "arrivalToOspSender" (Дата прибытия на терминал-отправитель) // Не найден срок доставки (в днях)
$delivery_send_date = DateTime::createFromFormat('Y-m-d', $supply['delivery']['orderDates']['arrivalToOspSender'])->getTimestamp(); if (empty($order_edge_supply[0]->dlvr['data'])) {
} catch (Throwable $e) { // Не удалось рассчитать доставку
// Взять данные из "pickup" (Дата передачи груза на адресе отправителя)
$delivery_send_date = DateTime::createFromFormat('Y-m-d', $supply['delivery']['orderDates']['pickup'])->getTimestamp(); // Инициализация времени
} $time = 0;
} else {
// Удалось рассчитать доставку
// Инициализация времени доставки // Инициализация даты отправки
try { try {
// Доставка по воздуху (подразумевается), данные из "giveoutFromOspReceiver" (Дата и время, с которого груз готов к выдаче на терминале) // Взять данные из "arrivalToOspSender" (Дата прибытия на терминал-отправитель)
// Оставлено на всякий случай для дальнейших разбирательств $delivery_send_date = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['arrivalToOspSender'])->getTimestamp();
} catch (Throwable $e) {
// Взять данные из "pickup" (Дата передачи груза на адресе отправителя)
$delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $supply['delivery']['orderDates']['giveoutFromOspReceiver'])->getTimestamp(); $delivery_send_date = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['pickup'])->getTimestamp();
} catch (Throwable $e) { }
// Автоматическая доставка (подразумевается), данные из "arrivalToOspReceiver" (Дата прибытия натерминал-получатель)
$delivery_converted = DateTime::createFromFormat('Y-m-d', $supply['delivery']['orderDates']['arrivalToOspReceiver'])->getTimestamp(); // Инициализация времени доставки
} try {
$days = ceil(($delivery_converted - ($delivery_send_date ?? 0)) / 60 / 60 / 24) + 1; // Доставка по воздуху (подразумевается), данные из "giveoutFromOspReceiver" (Дата и время, с которого груз готов к выдаче на терминале)
// Оставлено на всякий случай для дальнейших разбирательств
$delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $order_edge_supply[0]->dlvr['data']['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch (Throwable $e) {
// Инициализация даты отправки
// Автоматическая доставка (подразумевается), данные из "arrivalToOspReceiver" (Дата прибытия натерминал-получатель)
$delivery_converted = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['arrivalToOspReceiver'])->getTimestamp();
}
$time = ceil(($delivery_converted - ($delivery_send_date ?? 0)) / 60 / 60 / 24);
}
}
// Инициализация статуса связи поставки
$status = Order::statusToRussian($order_edge_supply[0]->stts ?? 'Обрабатывается');
// Инициализация класса для поставки (если необходимо)
$css = match ($order_edge_supply[0]->stts ?? '') {
'accepted' => ' supply_accepted',
default => ''
};
// Реинициализация максимальной даты доставки
if ($delivery_max < $time) $delivery_max = $time;
// Добавление к общему счётчику количества
$amount_max += $supply['amount'];
// Инициализация иконки
$icon = $delivery === 'avia' ? 'fa-plane' : 'fa-truck';
// Генерация HTML (пробела между supply и $css не должно быть)
$supplies_html .= <<<HTML
<div class="row py-2 supply$css text-center">
<div class="m-auto col-2">{$catn}</div>
<small class="m-auto col-3">$status</small>
<div class="m-auto col-3">$time <small class="mr-1 fas $icon"></small></div>
<div class="m-auto col-2">{$supply['amount']}</div>
<div class="m-auto col-2">$price</div>
</div>
HTML;
// Инициализация общей цены
$sum += $price_raw * $supply['amount'];
} }
// Инициализация статуса связи поставки
$status = OrderEdgeSupply::statusToRussian($edge['stts'] ?? '');
// Инициализация класса для поставки (если необходимо)
$css = match ($edge['stts'] ?? '') {
'accepted' => ' supply_accepted',
default => ''
};
// Реинициализация максимальной даты доставки
if ($delivery_max !== '?' && $delivery_max < $days) $delivery_max = $days;
else if ($days === '?') $delivery_max = '?';
// Инициализация иконки
$icon = $delivery === 'avia' ? 'fa-plane' : 'fa-truck';
// Генерация HTML (пробела между supply и $css не должно быть)
$supplies_html .= <<<HTML
<div class="row py-2 supply$css text-center">
<div class="m-auto col-2">{$catn}</div>
<small class="m-auto col-3">$status</small>
<div class="m-auto col-3">$days <small class="mr-1 fas $icon"></small></div>
<div class="m-auto col-2">{$supply['amount']}</div>
<div class="m-auto col-2">$price</div>
</div>
HTML;
// Инициализация общей цены
$sum += $price_raw * $supply['amount'];
} }
} }
} }
@ -383,11 +408,11 @@ if (empty($window)) {
} }
// Инициализация статуса заказа // Инициализация статуса заказа
$status = AccountEdgeOrder::statusToRussian(AccountEdgeOrder::searchByOrder($moderator_data['order']->readId())['stts'] ?? ''); $status = Order::statusToRussian($account_edge_order->stts);
// Инициализация счета для скачивания // Инициализация счета для скачивания
$invoice = <<<HTML $invoice = <<<HTML
<a class="text-dark" href="/invoices/{$data['order']->_key}/download"><i class="fas fa-file-invoice-dollar"></i></a> <a class="text-dark" href="/invoices/{$data['order']->_key}/download"><i class="mr-1 fas fa-file-invoice-dollar"></i><small><b>Счёт</b></small></a>
HTML; HTML;
echo <<<HTML echo <<<HTML
@ -395,8 +420,8 @@ if (empty($window)) {
<div class="row py-2 cart_list_target_total text-center"> <div class="row py-2 cart_list_target_total text-center">
<div class="col-2">$invoice</div> <div class="col-2">$invoice</div>
<div class="col-3"><b>$status</b></div> <div class="col-3"><b>$status</b></div>
<div class="col-3"><b>$delivery_max</b></div> <div class="col-3"><b>$delivery_max <small><b>(макс.)</b></small></b></div>
<div class="col-2"></div> <div class="col-2"><b>$amount_max <small><b>(макс.)</b></small></b></div>
<div class="col-2"><b>$sum <small><b>руб</b></small></b></div> <div class="col-2"><b>$sum <small><b>руб</b></small></b></div>
</div> </div>
HTML; HTML;

View File

@ -42,6 +42,7 @@ use app\models\Search;
$covr = null; $covr = null;
$prod = $row['prod'] ?? 'Неизвестно'; $prod = $row['prod'] ?? 'Неизвестно';
$catn = $row['catn'] ?? 'Неизвестно'; $catn = $row['catn'] ?? 'Неизвестно';
$name = $row['name'] ?? 'Без названия';
// Генерация списка товаров // Генерация списка товаров
$supplies_html = Search::generate($row, $covr, $list); $supplies_html = Search::generate($row, $covr, $list);
@ -49,10 +50,10 @@ use app\models\Search;
<div class="col mb-2"> <div class="col mb-2">
<div class="row p-2 rounded"> <div class="row p-2 rounded">
<img class="ml-0 rounded" src="<?= $covr ?>" /> <img class="ml-0 rounded" src="<?= $covr ?>" />
<div class="col-3 ml-3 p-0 d-flex flex-column row_fixed_height"> <div class="col ml-3 p-0 d-flex flex-column row_fixed_height">
<a class="my-auto text-dark" href="/product/<?= $prod ?>/<?= $catn ?>"> <a class="my-auto text-dark" href="/product/<?= $prod ?>/<?= $catn ?>">
<h5 class="m-0"><?= $catn ?></h5> <h5 class="m-0"><b><?= $prod ?></b> <?= $catn ?></h5>
<h6 class="m-0"><small><?= $prod ?></small></h6> <h6 class="m-0"><small><?= $name ?></small></h6>
</a> </a>
</div> </div>
<div class="col ml-3 p-0 d-flex flex-column"> <div class="col ml-3 p-0 d-flex flex-column">
@ -104,6 +105,7 @@ use app\models\Search;
$covr = null; $covr = null;
$prod = $product['prod'] ?? 'Неизвестно'; $prod = $product['prod'] ?? 'Неизвестно';
$catn = $product['catn'] ?? 'Неизвестно'; $catn = $product['catn'] ?? 'Неизвестно';
$name = $product['name'] ?? 'Без названия';
// Генерация списка товаров // Генерация списка товаров
$supplies_html = Search::generate($product, $covr, analogs: true); $supplies_html = Search::generate($product, $covr, analogs: true);
@ -119,10 +121,10 @@ use app\models\Search;
<div class="col mb-2"> <div class="col mb-2">
<div class="row p-2 rounded"> <div class="row p-2 rounded">
<img class="ml-0 rounded" src="<?= $covr ?>" /> <img class="ml-0 rounded" src="<?= $covr ?>" />
<div class="col-3 ml-3 p-0 d-flex flex-column row_fixed_height"> <div class="col ml-3 p-0 d-flex flex-column row_fixed_height">
<a class="my-auto text-dark" href="/product/<?= $prod ?>/<?= $catn ?>"> <a class="my-auto text-dark" href="/product/<?= $prod ?>/<?= $catn ?>">
<h5 class="m-0"><?= $catn ?></h5> <h5 class="m-0"><b><?= $prod ?></b> <?= $catn ?></h5>
<h6 class="m-0"><small><?= $prod ?></small></h6> <h6 class="m-0"><small><?= $name ?></small></h6>
</a> </a>
</div> </div>
<div class="col ml-3 p-0 d-flex flex-column"> <div class="col ml-3 p-0 d-flex flex-column">

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,423 @@
/*!
* Bootstrap Reboot v5.0.1 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
background-color: #fff;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
background-color: currentColor;
border: 0;
opacity: 0.25;
}
hr:not([size]) {
height: 1px;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-bs-original-title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-right: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-right: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.2em;
background-color: #fcf8e3;
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: #0d6efd;
text-decoration: underline;
}
a:hover {
color: #0a58ca;
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
direction: ltr ;
unicode-bidi: bidi-override;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: #d63384;
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.2rem 0.4rem;
font-size: 0.875em;
color: #fff;
background-color: #212529;
border-radius: 0.2rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
font-weight: 700;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: #6c757d;
text-align: right;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]::-webkit-calendar-picker-indicator {
display: none;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: right;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: right;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
outline-offset: -2px;
-webkit-appearance: textfield;
}
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::file-selector-button {
font: inherit;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,8 @@
/*!
* Bootstrap Reboot v5.0.1 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-right:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-right:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:right}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:right;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:right}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}[type=email],[type=number],[type=tel],[type=url]{direction:ltr}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.rtl.min.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1,2 @@
/products /products
/supplies/*/

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,12 +1,12 @@
/** /**
* Записать в корзину (создать корзину, если не существует) * Записать в корзину (создать корзину, если не существует)
*/ */
function cart_write(supply_id, delivery_type, amount = 1) { function cart_write(supply_id, delivery, amount = 1) {
// Инициализация // Инициализация
let data = {}; let data = {};
data['supply_id'] = supply_id; data['supply_id'] = supply_id;
data['amount'] = amount; data['amount'] = amount;
data['delivery_type'] = delivery_type; data['delivery'] = delivery;
data['_csrf'] = yii.getCsrfToken(); data['_csrf'] = yii.getCsrfToken();
$.ajax({ $.ajax({
@ -190,13 +190,15 @@ function cart_list_amount_update(target, type, input) {
* Подсчёт стоимости * Подсчёт стоимости
*/ */
function cart_cost_calculate() { function cart_cost_calculate() {
let elements = document.getElementsByClassName('cart_list_target'); const elements = document.getElementsByClassName('cart_list_target');
let reg = /^([0-9]*)\s*\w*/; const reg = /^([0-9]*)\s*\w*/;
let costs = 0; let costs = 0;
for ($i = 0; $i < elements.length; $i++) { for ($i = 0; $i < elements.length; $i++) {
let cost = elements[$i].getElementsByTagName('div')[7].innerText; // Перебор товаров в корзине
let amount = elements[$i].getElementsByTagName('div')[5].children[0].value;
const cost = elements[$i].getElementsByTagName('div')[8].innerText;
const amount = elements[$i].getElementsByTagName('div')[6].children[0].value;
costs += +reg.exec(cost)[1] * amount; costs += +reg.exec(cost)[1] * amount;
}; };

View File

@ -138,7 +138,7 @@ function cart_count() {
button_old.remove(); button_old.remove();
// Реинициализация // Реинициализация
$('#cart_button').dropdown().init(); // $('#cart_button').dropdown().init();
}; };
}; };
@ -161,7 +161,7 @@ function cart_count() {
button_old.remove(); button_old.remove();
// Реинициализация // Реинициализация
$('#cart_button').dropdown().init(); // $('#cart_button').dropdown().init();
}; };
}; };

View File

@ -1,5 +1,5 @@
// Запросить заказы // Запросить заказы
function orders_read(search = '@last', type = '@last', from = '@last', to = '@last', window = 'orders_panel_orders') { function orders_read(search = '@last', stts = '@last', from = '@last', to = '@last', window = 'orders_panel_orders') {
// '@last' - оставить без изменений и взять данные из cookie // '@last' - оставить без изменений и взять данные из cookie
if (search.length > 1) { if (search.length > 1) {
@ -8,24 +8,21 @@ function orders_read(search = '@last', type = '@last', from = '@last', to = '@la
// Инициализация буфера с данными запроса // Инициализация буфера с данными запроса
data = { data = {
'_csrf': yii.getCsrfToken(), '_csrf': yii.getCsrfToken(),
'search': search, search,
'from': from, from,
'to': to, to,
'window': window window
}; };
// Запрос // Запрос
$.ajax({ $.ajax({
url: '/orders/' + type, url: '/orders/' + stts,
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: data, data: data,
success: orders_response_success, success: orders_response_success,
error: orders_response_error error: orders_response_error
}); });
// // Пересчитывание стоимости
// cart_cost_calculate();
}; };
return false; return false;

View File

@ -1,15 +1,15 @@
function order_init(order_key) { function order_init(order) {
// Инициализация панели // Инициализация панели
let panel = document.getElementById(order_key + '_panel'); const panel = document.getElementById(order + '_panel');
// Инициализация кнопки // Инициализация кнопки
let button = document.getElementById(order_key + '_button'); const button = document.getElementById(order + '_button');
let supplies_are_confirmed = true; let supplies_are_confirmed = true;
for (let i = 0; i <= panel.children[2].children[0].children.length - 1; i++) { for (let i = 0; i <= panel.children[2].children[0].children.length - 1; i++) {
// Инициализация // Инициализация
let target = panel.children[2].children[0].children[i]; const target = panel.children[2].children[0].children[i];
if ((target === undefined || target.children[1] === undefined || target.children[1].children[0] === undefined) && !target.classList.contains('dropdown-divider')) { if ((target === undefined || target.children[1] === undefined || target.children[1].children[0] === undefined) && !target.classList.contains('dropdown-divider')) {
@ -25,9 +25,10 @@ function order_init(order_key) {
return false; return false;
}; };
function order_accept(order_key) {
function order_accept(order) {
$.ajax({ $.ajax({
url: 'orders/' + order_key + '/accept', url: 'orders/' + order + '/accept',
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: { data: {
@ -40,304 +41,333 @@ function order_accept(order_key) {
return false; return false;
}; };
function orders_supply_edit(type, supply_key, order_key) { function orders_supply_edit(order, prod, catn, delivery) {
// Инициализация if (typeof order === 'string' && typeof prod === 'string' && typeof catn === 'string' && typeof delivery === 'string') {
let supply = document.getElementById(supply_key + '_supply'); // Получены входные параметры
// Поиск панели для вывода информации // Инициализация
let panel = document.getElementById('orders_panel_edit_' + order_key); const supply = document.getElementById(`${order}_${prod}_${catn}_${delivery}_supply`);
// Поиск всех кнопок с поставками // Поиск панели для вывода информации
let rows = document.getElementsByClassName('row_supply'); const panel = document.getElementById('orders_panel_edit_' + order);
// Деактивация остальных кнопок // Поиск всех кнопок с поставками
for (let i = 0; i < rows.length; i++) { const rows = document.getElementsByClassName('row_supply');
if (rows[i].parentElement.getAttribute('id') === 'orders_panel_supplies_' + order_key) {
// Если это кнопка конкретно с этого заказа
rows[i].classList.remove('row_supply_active'); // Деактивация остальных кнопок
for (let i = 0; i < rows.length; i++) {
if (rows[i].parentElement.getAttribute('id') === 'orders_panel_supplies_' + order) {
// Если это кнопка конкретно с этого заказа
rows[i].classList.remove('row_supply_active');
};
}; };
};
// Активация выбранной кнопки // Активация выбранной кнопки
supply.classList.add('row_supply_active'); supply.classList.add('row_supply_active');
// Запись индикатора загрузки // Запись индикатора загрузки
panel.innerHTML = '<p class="my-auto">Загрузка</p>'; panel.innerHTML = '<p class="my-auto">Загрузка</p>';
$.ajax({ $.ajax({
url: 'orders/supply/' + supply_key + '/read', url: `orders/supply/${order}/${prod}/${catn}/${delivery}/read`,
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: { data: {
'_csrf': yii.getCsrfToken() '_csrf': yii.getCsrfToken()
}, },
success: function (data, status, xhr) { success: function (data, status, xhr) {
// Удаление индикатора загрузки // Удаление индикатора загрузки
panel.innerHTML = ''; panel.innerHTML = '';
if (data !== undefined) { if (data !== undefined) {
// Получены данные с сервера // Получены данные с сервера
// Идентификатор // Идентификатор
if (document.getElementById(supply.getAttribute('id') + '_id') === null) { if (typeof data.id !== 'undefined' && document.getElementById(supply.getAttribute('id') + '_id') === null) {
// Инициализация контейнера // Инициализация контейнера
let container = document.createElement('div'); const container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_id'); container.setAttribute('id', supply.getAttribute('id') + '_id');
container.setAttribute('class', 'row mb-1 px-3'); container.setAttribute('class', 'row px-3');
// Инициализация названия // Инициализация названия
let name = document.createElement('p'); const name = document.createElement('p');
name.setAttribute('id', supply.getAttribute('id') + '_id_name'); name.setAttribute('id', supply.getAttribute('id') + '_id_name');
name.setAttribute('class', 'col-auto px-0 ml-0 mr-2'); name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
name.innerText = 'Идентификатор:'; name.innerText = 'Идентификатор:';
// Инициализация идентификатора // Инициализация идентификатора
let text = document.createElement('p'); const text = document.createElement('p');
text.setAttribute('id', supply.getAttribute('id') + '_id_value'); text.setAttribute('id', supply.getAttribute('id') + '_id_value');
text.setAttribute('class', 'col-auto px-0 mx-0 font-weight-bold'); text.setAttribute('class', 'col-auto px-0 mr-0 font-weight-bold');
if (data.id !== undefined) { if (data.id !== undefined) {
text.innerText = '#' + data.id; text.innerText = '#' + data.id;
} else { } else {
text.innerText = 'Неизвестно'; text.innerText = 'Неизвестно';
};
// Запись в документ
panel.appendChild(container);
container.appendChild(name);
container.appendChild(text);
}; };
// Запись в документ // Разделитель статического информационного блока от блока с динамическими данными
panel.appendChild(container); if (document.getElementById(supply.getAttribute('id') + '_info_divider') === null) {
container.appendChild(name); // Инициализация контейнера
container.appendChild(text); let divider = document.createElement('div');
}; divider.setAttribute('id', supply.getAttribute('id') + '_info_divider');
divider.setAttribute('class', 'dropdown-divider mb-2');
// // Разделитель статического информационного блока от блока с динамическими данными // Запись в документ
// if (document.getElementById(supply.getAttribute('id') + '_info_divider') === null) { panel.appendChild(divider);
// // Инициализация контейнера
// let divider = document.createElement('div');
// divider.setAttribute('id', supply.getAttribute('id') + '_info_divider');
// divider.setAttribute('class', 'dropdown-divider mb-2');;
// // Запись в документ
// panel.appendChild(divider);
// };
// Цена
if (document.getElementById(supply.getAttribute('id') + '_cost') === null) {
// Инициализация контейнера
let container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_cost');
container.setAttribute('class', 'row px-3');
// Инициализация названия
let name = document.createElement('p');
name.setAttribute('id', supply.getAttribute('id') + '_cost_name');
name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
name.innerText = 'Цена';
// Инициализация поля
let input = document.createElement('input');
input.setAttribute('id', supply.getAttribute('id') + '_cost_input');
input.setAttribute('class', 'col-2 text-center form-control-plaintext');
input.setAttribute('type', 'number');
input.setAttribute('onchange', 'return orders_supply_cost_edit(' + supply_key + ', this);');
if (data.cost !== undefined) {
input.setAttribute('value', data.cost);
} else {
input.setAttribute('value', 0);
};
input.setAttribute('aria-invalid', 'false');
// Инициализация дополнительных данных
let info = document.createElement('p');
info.setAttribute('class', 'col-auto px-0 ml-2 mr-0');
info.innerText = 'рублей';
// Запись в документ
panel.appendChild(container);
container.appendChild(name);
container.appendChild(input);
container.appendChild(info);
};
// Время доставки
if (document.getElementById(supply.getAttribute('id') + '_time') === null) {
// Инициализация контейнера
let container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_time');
container.setAttribute('class', 'row mb-2 px-3');
// Инициализация названия
let name = document.createElement('p');
name.setAttribute('id', supply.getAttribute('id') + '_time_name');
name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
name.innerText = 'Время';
// Инициализация поля
let input = document.createElement('input');
input.setAttribute('id', supply.getAttribute('id') + '_time_input');
input.setAttribute('class', 'col-1 text-center form-control-plaintext');
input.setAttribute('type', 'number');
input.setAttribute('onchange', 'return orders_supply_time_edit(' + supply_key + ', this);')
if (data.time !== undefined) {
input.setAttribute('value', data.time);
} else {
input.setAttribute('value', 0);
};
input.setAttribute('aria-invalid', 'false');
// Инициализация дополнительных данных
let info = document.createElement('p');
info.setAttribute('class', 'col-auto px-0 ml-2 mr-0');
info.innerText = 'дней';
// Запись в документ
panel.appendChild(container);
container.appendChild(name);
container.appendChild(input);
container.appendChild(info);
};
// Комментарий
if (document.getElementById(supply.getAttribute('id') + '_comm') === null) {
// Инициализация контейнера
let container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_comm');
container.setAttribute('class', 'row mb-3 px-3');
// Инициализация поля
let textarea = document.createElement('textarea');
textarea.setAttribute('id', supply.getAttribute('id') + '_comm_input');
textarea.setAttribute('class', 'col-12 form-control');
textarea.setAttribute('cols', '50');
textarea.setAttribute('rows', '3');
textarea.setAttribute('onchange', 'return orders_supply_comm_edit(' + supply_key + ', this);')
if (data.comm === undefined) {
textarea.value = 'Комментарий к заказу';
} else {
textarea.value = data.comm;
}; };
// Запись в документ // Цена
panel.appendChild(container); if (typeof data.cost !== 'undefined' && document.getElementById(supply.getAttribute('id') + '_cost') === null) {
container.appendChild(textarea); // Инициализация контейнера
}; const container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_cost');
container.setAttribute('class', 'row px-3');
// Статус подтверждения // Инициализация названия
if (document.getElementById(supply.getAttribute('id') + '_stts') === null) { const name = document.createElement('p');
// Инициализация контейнера name.setAttribute('id', supply.getAttribute('id') + '_cost_name');
let container = document.createElement('div'); name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
container.setAttribute('id', supply.getAttribute('id') + '_stts'); name.innerText = 'Цена:';
container.setAttribute('class', 'row px-3');
// Инициализация индикатора // Инициализация поля
let span = document.createElement('span'); const input = document.createElement('input');
span.setAttribute('id', supply.getAttribute('id') + '_' + type + '_supply_stts_indicator_icon'); input.setAttribute('id', supply.getAttribute('id') + '_cost_input');
span.setAttribute('class', 'ml-auto my-auto fas fa-check'); input.setAttribute('class', 'col-2 ml-auto text-center form-control-plaintext');
input.setAttribute('type', 'number');
input.setAttribute('onblur', `return orders_supply_cost_edit('${order}', '${prod}', '${catn}', '${delivery}', this);`);
if (data.cost !== undefined) {
input.setAttribute('value', data.cost);
} else {
input.setAttribute('value', 0);
};
input.setAttribute('aria-invalid', 'false');
input.setAttribute('data-old-value', input.value);
// Инициализация кнопки // Инициализация дополнительных данных
let button = document.createElement('a'); const info = document.createElement('p');
button.setAttribute('id', supply.getAttribute('id') + '_stts_button'); info.setAttribute('class', 'col-auto px-0 ml-2 mr-0');
button.setAttribute('type', 'button'); info.innerText = 'рублей';
button.setAttribute('role', 'button');
button.setAttribute('onclick', 'return orders_supply_comm_write(this, \'' + type + '\' \'' + supply_key + '\', \'' + order_key + '\');');
if (data.stts === undefined || data.stts == 0) {
button.setAttribute('class', 'col-12 btn button_blue button_clean');
button.innerText = 'Подтвердить';
} else {
button.setAttribute('class', 'col-12 btn button_blue button_clean disabled');
button.innerText = 'Подтверждено';
// Инициализация // Запись в документ
let title = document.getElementById(supply.getAttribute('id') + '_' + type + '_supply_stts_indicator'); panel.appendChild(container);
container.appendChild(name);
container.appendChild(input);
container.appendChild(info);
};
if (title.children[1] === undefined) { // Время доставки
// Индикатор не найден if (typeof data.time !== 'undefined' && document.getElementById(supply.getAttribute('id') + '_time') === null) {
// Инициализация контейнера
const container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_time');
container.setAttribute('class', 'row px-3 pb-1');
// Запись индикатора // Инициализация названия
title.appendChild(span); const name = document.createElement('p');
name.setAttribute('id', supply.getAttribute('id') + '_time_name');
name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
name.innerText = 'Доставка:';
// Инициализация поля
const input = document.createElement('input');
input.setAttribute('id', supply.getAttribute('id') + '_time_input');
input.setAttribute('class', 'col-2 ml-auto text-center form-control-plaintext');
input.setAttribute('type', 'number');
input.setAttribute('onblur', `return orders_supply_time_edit('${order}', '${prod}', '${catn}', '${delivery}', this);`)
if (data.time !== undefined) {
input.setAttribute('value', data.time);
} else {
input.setAttribute('value', 0);
};
input.setAttribute('aria-invalid', 'false');
input.setAttribute('data-old-value', input.value);
// Инициализация дополнительных данных
const info = document.createElement('p');
info.setAttribute('class', 'col-auto px-0 ml-2 mr-0');
info.innerText = 'дней (+1)';
// Запись в документ
panel.appendChild(container);
container.appendChild(name);
container.appendChild(input);
container.appendChild(info);
};
// Количество
if (typeof data.amnt !== 'undefined' && document.getElementById(supply.getAttribute('id') + '_amnt') === null) {
// Инициализация контейнера
const container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_amnt');
container.setAttribute('class', 'row mb-2 px-3');
// Инициализация названия
const name = document.createElement('p');
name.setAttribute('id', supply.getAttribute('id') + '_amnt_name');
name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
name.innerText = 'Количество:';
// Инициализация поля
const input = document.createElement('input');
input.setAttribute('id', supply.getAttribute('id') + '_amnt_input');
input.setAttribute('class', 'col-2 ml-auto text-center form-control-plaintext');
input.setAttribute('type', 'number');
input.setAttribute('onblur', `return orders_supply_amnt_edit('${order}', '${prod}', '${catn}', '${delivery}', this);`)
if (data.amnt !== undefined) {
input.setAttribute('value', data.amnt);
} else {
input.setAttribute('value', 0);
};
input.setAttribute('aria-invalid', 'false');
input.setAttribute('data-old-value', input.value);
// Инициализация дополнительных данных
const info = document.createElement('p');
info.setAttribute('class', 'col-auto px-0 ml-2 mr-0');
info.innerText = 'шт';
// Запись в документ
panel.appendChild(container);
container.appendChild(name);
container.appendChild(input);
container.appendChild(info);
};
// Статус
if (typeof data.stts !== 'undefined' && document.getElementById(supply.getAttribute('id') + '_status') === null) {
// Инициализация контейнера
const container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_status');
container.setAttribute('class', 'row mb-2 px-3');
// Инициализация поля
const select = document.createElement('select');
select.setAttribute('id', supply.getAttribute('id') + '_status_select');
select.setAttribute('class', 'form-control');
select.setAttribute('onchange', `return orders_supply_status_edit('${order}', '${prod}', '${catn}', '${delivery}', this);`)
select.setAttribute('data-old-value', select.value);
// Запись в документ
container.appendChild(select);
const options = {
processing: 'Обрабатывается',
requested: 'Запрошен',
accepted: 'Ожидается отправка',
going: 'Доставляется',
received: 'Получено'
}
for (const name in options) {
// Перебор параметров
// Инициализация параметра
const option = document.createElement('option');
option.value = name;
option.innerText = options[name];
// Запись в документ
select.appendChild(option);
}
// Запись в документ
panel.appendChild(container);
// Выбор активного параметра
if (typeof data.stts === 'string') {
select.value = data.stts;
} else {
input.value = 0;
}; };
}; };
// Запись в документ // Комментарий
panel.appendChild(container); if (typeof data.comm !== 'undefined' && document.getElementById(supply.getAttribute('id') + '_comm') === null) {
container.appendChild(button); // Инициализация контейнера
const container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_comm');
container.setAttribute('class', 'row mb-2 px-3');
// Реинициализация // Инициализация поля
order_init(order_key); const textarea = document.createElement('textarea');
}; textarea.setAttribute('id', supply.getAttribute('id') + '_comm_input');
}; textarea.setAttribute('class', 'col-12 form-control');
textarea.setAttribute('cols', '50');
textarea.setAttribute('rows', '3');
textarea.setAttribute('onblur', `return orders_supply_comm_edit('${order}', '${prod}', '${catn}', '${delivery}', this);`)
if (typeof data.comm === 'string') textarea.value = data.comm;
textarea.setAttribute('placeholder', 'Комментарий к поставке (для покупателя)')
textarea.setAttribute('data-old-value', textarea.value);
orders_response_success(data, status, xhr); // Запись в документ
}, panel.appendChild(container);
error: orders_response_error container.appendChild(textarea);
}); };
return false; const small = document.createElement('small');
}; small.setAttribute('class', 'text-center');
function orders_supply_comm_write(button, type, supply_key, order_key) { const b = document.createElement('b');
// Инициализация b.innerText = 'Покупатель будет уведомлён при изменении параметров';
let supply = document.getElementById(supply_key + '_supply');
$.ajax({ small.appendChild(b);
url: 'orders/supply/' + supply_key + '/write/stts', panel.appendChild(small);
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken(),
'stts': 'accepted'
},
success: function (data, status, xhr) {
// Инициализация индикатора
let span = document.createElement('span');
span.setAttribute('id', supply.getAttribute('id') + '_' + type + '_supply_stts_indicator_icon');
span.setAttribute('class', 'ml-auto my-auto fas fa-check');
if (data.stts === undefined || data.stts == 0) {
button.setAttribute('class', 'col-12 btn button_blue button_clean');
button.innerText = 'Подтвердить';
} else {
button.setAttribute('class', 'col-12 btn button_blue button_clean disabled');
button.innerText = 'Подтверждено';
// Инициализация
let title = document.getElementById(supply.getAttribute('id') + '_' + type + '_supply_stts_indicator');
if (title.children[0] === undefined) {
// Индикатор не найден
// Запись индикатора
title.appendChild(span);
}; };
// Реинициализация orders_response_success(data, status, xhr);
order_init(order_key); },
}; error: orders_response_error
});
orders_response_success(data, status, xhr); }
},
error: orders_response_error
});
return false; return false;
}; };
/** /**
* Изменить цену товара в заказе * Изменить комментарий к поставке заказа
*
* @param {*} order
* @param {*} prod
* @param {*} catn
* @param {*} delivery
* @param {*} element
* @returns
*/ */
function orders_supply_cost_edit(supply_key, input) { function orders_supply_comm_edit(order, prod, catn, delivery, element) {
if (supply_key !== undefined && input !== undefined) { if (typeof order === 'string' && typeof prod === 'string' && typeof catn === 'string' && typeof delivery === 'string' && typeof element === 'object') {
// Обработка входных параметров // Получены входные параметры
// Проверка на наличие изменений
if (element.value === element.getAttribute('data-old-value')) return false;
$.ajax({ $.ajax({
url: '/orders/supply/' + supply_key + '/edit/cost', url: `orders/supply/${order}/${prod}/${catn}/${delivery}/edit/comm`,
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: { data: {
'_csrf': yii.getCsrfToken(), '_csrf': yii.getCsrfToken(),
'cost': input.value 'comm': element.value
}, },
success: function (data, status, xhr) { success: function (data, status, xhr) {
if (data.cost !== undefined) { if (data !== undefined) {
input.value = data.cost; // Получены данные с сервера
if (data.comm !== undefined) {
// Получен комментарий
// Реинициализация параметра
element.value = data.comm;
// Запись метаданных
element.setAttribute('data-old-value', data.comm);
};
}; };
orders_response_success(data, status, xhr); orders_response_success(data, status, xhr);
@ -346,8 +376,48 @@ function orders_supply_cost_edit(supply_key, input) {
}); });
}; };
// Пересчитывание стоимости
cart_cost_calculate(); return false;
};
/**
* Изменить цену поставки в заказе
*/
function orders_supply_cost_edit(order, prod, catn, delivery, element) {
if (typeof order === 'string' && typeof prod === 'string' && typeof catn === 'string' && typeof delivery === 'string' && typeof element === 'object') {
// Получены входные параметры
// Проверка на наличие изменений
if (element.value === element.getAttribute('data-old-value')) return false;
$.ajax({
url: `orders/supply/${order}/${prod}/${catn}/${delivery}/edit/cost`,
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken(),
'cost': element.value
},
success: function (data, status, xhr) {
if (data !== undefined) {
// Получены данные с сервера
if (data.cost !== undefined) {
// Получена цена
// Реинициализация параметра
element.value = data.cost;
// Запись метаданных
element.setAttribute('data-old-value', data.cost);
};
};
orders_response_success(data, status, xhr);
},
error: orders_response_error
});
};
return false; return false;
}; };
@ -355,24 +425,33 @@ function orders_supply_cost_edit(supply_key, input) {
/** /**
* Изменить время доставки товара в заказе * Изменить время доставки товара в заказе
*/ */
function orders_supply_time_edit(supply_key, input) { function orders_supply_time_edit(order, prod, catn, delivery, element) {
if (supply_key !== undefined && input !== undefined) { if (typeof order === 'string' && typeof prod === 'string' && typeof catn === 'string' && typeof delivery === 'string' && typeof element === 'object') {
// Обработка входных параметров // Получены входные параметры
// Проверка на наличие изменений
if (element.value === element.getAttribute('data-old-value')) return false;
$.ajax({ $.ajax({
url: '/orders/supply/' + supply_key + '/edit/time', url: `orders/supply/${order}/${prod}/${catn}/${delivery}/edit/time`,
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: { data: {
'_csrf': yii.getCsrfToken(), '_csrf': yii.getCsrfToken(),
'time': input.value 'time': element.value
}, },
success: function (data, status, xhr) { success: function (data, status, xhr) {
if (data !== undefined) { if (data !== undefined) {
// Получены данные с сервера // Получены данные с сервера
if (data.time !== undefined) { if (data.time !== undefined) {
input.value = data.time; // Получено время
// Реинициализация параметра
element.value = data.time;
// Запись метаданных
element.setAttribute('data-old-value', data.time);
}; };
}; };
@ -382,44 +461,133 @@ function orders_supply_time_edit(supply_key, input) {
}); });
}; };
// Пересчитывание стоимости
cart_cost_calculate();
return false; return false;
}; };
/** /**
* Изменить комментарий товара в заказе * Изменить количество товара в заказе
*/ */
function orders_supply_comm_edit(supply_key, input) { function orders_supply_amnt_edit(order, prod, catn, delivery, element) {
if (supply_key !== undefined && input !== undefined) { if (typeof order === 'string' && typeof prod === 'string' && typeof catn === 'string' && typeof delivery === 'string' && typeof element === 'object') {
// Обработка входных параметров // Получены входные параметры
// Проверка на наличие изменений
if (element.value === element.getAttribute('data-old-value')) return false;
$.ajax({ $.ajax({
url: '/orders/supply/' + supply_key + '/edit/comm', url: `orders/supply/${order}/${prod}/${catn}/${delivery}/edit/amnt`,
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: { data: {
'_csrf': yii.getCsrfToken(), '_csrf': yii.getCsrfToken(),
'comm': input.value 'amnt': element.value
}, },
success: function (data, status) { success: function (data, status, xhr) {
if (data !== undefined) { if (data !== undefined) {
// Получены данные с сервера // Получены данные с сервера
if (data.comm !== undefined) { if (data.amnt !== undefined) {
input.value = data.comm; // Получено время
// Реинициализация параметра
element.value = data.amnt;
// Запись метаданных
element.setAttribute('data-old-value', data.amnt);
}; };
}; };
orders_response_success(data, status); orders_response_success(data, status, xhr);
},
error: orders_response_error
});
};
return false;
};
/**
* Изменить время доставки товара в заказе
*/
function orders_status_edit(order, element) {
if (typeof order === 'string' && typeof element === 'object') {
// Получены входные параметры
// Проверка на наличие изменений
if (element.value === element.getAttribute('data-old-value')) return false;
$.ajax({
url: `/orders/${order}/edit/stts`,
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken(),
'stts': element.value
},
success: function (data, status, xhr) {
if (data !== undefined) {
// Получены данные с сервера
if (data.stts !== undefined) {
// Получен статус
// Реинициализация параметра
element.value = data.stts;
// Запись метаданных
element.setAttribute('data-old-value', data.stts);
};
};
orders_response_success(data, status, xhr);
},
error: orders_response_error
});
};
return false;
};
/**
* Изменить время доставки товара в заказе
*/
function orders_supply_status_edit(order, prod, catn, delivery, element) {
if (typeof order === 'string' && typeof prod === 'string' && typeof catn === 'string' && typeof delivery === 'string' && typeof element === 'object') {
// Получены входные параметры
// Проверка на наличие изменений
if (element.value === element.getAttribute('data-old-value')) return false;
$.ajax({
url: `orders/supply/${order}/${prod}/${catn}/${delivery}/edit/stts`,
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken(),
'stts': element.value
},
success: function (data, status, xhr) {
if (data !== undefined) {
// Получены данные с сервера
if (data.stts !== undefined) {
// Получен статус
// Реинициализация параметра
element.value = data.stts;
// Запись метаданных
element.setAttribute('data-old-value', data.stts);
};
};
orders_response_success(data, status, xhr);
}, },
error: orders_response_error error: orders_response_error
}); });
}; };
// Пересчитывание стоимости
cart_cost_calculate();
return false; return false;
}; };