diff --git a/mirzaev/skillparts/system/controllers/CartController.php b/mirzaev/skillparts/system/controllers/CartController.php
index 7188fde..ef82ecb 100644
--- a/mirzaev/skillparts/system/controllers/CartController.php
+++ b/mirzaev/skillparts/system/controllers/CartController.php
@@ -86,7 +86,8 @@ class CartController extends Controller
$account = Account::initAccount();
// Поиск корзины (текущего заказа)
- $data = Order::searchByType()[0] ?? null;
+ $data = Order::searchSmart()[0] ?? null;
+
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();
@@ -163,7 +164,7 @@ class CartController extends Controller
goto end;
}
- if ($edges = OrderEdgeSupply::searchBySupplyCatnAndProd($catn, $prod, Order::searchByType())) {
+ if ($edges = OrderEdgeSupply::searchBySupplyCatnAndProd($catn, $prod, Order::searchByType()[0]['order'])) {
// Рёбра найдены (связи заказа с поставкой)
// Инициализация
diff --git a/mirzaev/skillparts/system/controllers/OrderController.php b/mirzaev/skillparts/system/controllers/OrderController.php
index c19038b..728ae1f 100644
--- a/mirzaev/skillparts/system/controllers/OrderController.php
+++ b/mirzaev/skillparts/system/controllers/OrderController.php
@@ -46,9 +46,11 @@ class OrderController extends Controller
'write',
'delete',
'amount-update',
+ 'amount-update',
'request',
+ 'edit-stts',
'supply-read',
- 'supply-write-stts',
+ 'supply-edit-stts',
'supply-edit-time',
'supply-edit-cost',
'supply-edit-comm'
@@ -114,7 +116,7 @@ class OrderController extends Controller
}
}
- public function actionIndex(string $type = 'all')
+ public function actionIndex(string $stts = '@all')
{
// Инициализация cookie
$cookies = yii::$app->response->cookies;
@@ -122,9 +124,12 @@ class OrderController extends Controller
// Инициализация открытой панели ("Модерация", "Мои заказы")
$window = yii::$app->request->post('window') ?? yii::$app->request->get('window') ?? 'orders_panel_orders';
+ // Инициализация аккаунта
+ $account = Account::initAccount();
+
// Инициализация данных поиска
try {
- if ('@last' === $search = yii::$app->request->post('search') ?? yii::$app->request->get('search')) {
+ if ($search = yii::$app->request->post('search') ?? yii::$app->request->get('search') === '@last') {
// Запрошено использование прошлых данных
// Чтение сохраненных данных в cookie
@@ -162,35 +167,35 @@ class OrderController extends Controller
// Инициализация открытого окна
try {
- if ('@last' === $type) {
+ if ($stts === '@last') {
// Запрошено использование прошлых данных
// Чтение сохраненных данных в cookie
- $type = $cookies->get('type');
+ $stts = $cookies->get('stts');
- if (empty($type)) {
+ if (empty($stts)) {
// Переданы неверные данные
- throw new Exception("Переданы неверные данные \$type: $type", 500);
+ throw new Exception("Переданы неверные данные \$stts: $stts", 500);
}
} else {
- // Запрошена сортировка
+ // Запрошено использование новых данных
- if (empty($type)) {
+ if (empty($stts)) {
// Переданы неверные данные
- throw new Exception("Переданы неверные данные \$type: $type", 500);
+ throw new Exception("Переданы неверные данные \$stts: $stts", 500);
}
// Запись данных в cookie
$cookies->add(new Cookie([
- 'name' => 'type',
- 'value' => $type
+ 'name' => 'stts',
+ 'value' => $stts
]));
}
} catch (Exception $e) {
// Реинициализация
- $type = 'all';
+ $stts = '@all';
}
// Инициализация данных периода (от)
@@ -265,37 +270,68 @@ class OrderController extends Controller
$to = (int) $to;
}
- // Инициализация заказов
- $data = Order::searchByType(
- type: $type,
- limit: 10,
- page: 1,
- supplies: true,
- from: $from,
- to: $to,
- search: $search
- );
+ if ($window === 'orders_panel_orders') {
+ // Обработка панели заказов пользователя
- // Фильтрация
- if (
- !yii::$app->user->isGuest
- && yii::$app->user->identity->type === 'administrator'
- || yii::$app->user->identity->type === 'moderator'
- ) {
- // Пользователь имеет доступ
+ // Инициализация заказов
+ $data = Order::searchSmart(
+ stts: $stts,
+ limit: 10,
+ page: 1,
+ supplies: true,
+ from: $from,
+ to: $to,
+ search: $search
+ );
- // Инициализация заказов для модератора
- $moderator_data = Order::searchByType(account: '@all', type: 'requested', limit: 10, page: 1, supplies: true);
+ // Инициализация панели модератора заказов
+ if (!yii::$app->user->isGuest && Account::isMinimalAuthorized($account)) {
+ // Имеет доступ пользователь
+
+ // Инициализация заказов для модератора
+ $moderator_data = Order::searchSmart(account: '@all', stts: '@all', limit: 10, page: 1, supplies: true);
+ } else {
+ // Не имеет доступ пользователь
+
+ // Инициализация заглушки
+ $moderator_data = null;
+ }
+ } else if ($window === 'orders_panel_moderation') {
+ // Обработка панели модерации заказов
+
+ // Инициализация заказов
+ $data = Order::searchSmart(
+ stts: '@all',
+ limit: 10,
+ page: 1,
+ supplies: true
+ );
+
+ // Инициализация панели модератора заказов
+ if (!yii::$app->user->isGuest && Account::isMinimalAuthorized($account)) {
+ // Имеет доступ пользователь
+
+ // Инициализация заказов для модератора
+ $moderator_data = Order::searchSmart(
+ account: '@all',
+ stts: $stts,
+ limit: 10,
+ page: 1,
+ supplies: true,
+ from: $from,
+ to: $to,
+ search: $search
+ );
+ } else {
+ // Не имеет доступ пользователь
+
+ // Инициализация заглушки
+ $moderator_data = null;
+ }
} else {
- // Пользователь не имеет доступ
-
- // Инициализация заглушки
- $moderator_data = null;
+ // Запрошено неизвестное окно
}
- // Инициализация аккаунта
- $account ?? $account = Account::initAccount();
-
if (yii::$app->request->isPost) {
// POST-запрос
@@ -318,50 +354,6 @@ class OrderController extends Controller
return $this->render('/orders/index', compact('data', 'moderator_data', 'account'));
}
- /**
- * Подтверждение заказа
- *
- * @param int $_key Ключ записи в коллекции order
- *
- * @return string|array|null
- */
- public function actionAccept(int $_key): string|array|null
- {
- // Инициализация
- $buffer = [];
- $account_edge_order = AccountEdgeOrder::searchByOrder(Order::collectionName() . '/' . $_key, limit: 1)[0];
-
- // Запись в буфер записи в базу данных
- $account_edge_order->type = 'accepted';
-
- // Отправка изменений в базу данных
- if ($account_edge_order->save()) {
- // Удалось сохранить изменения
-
- // Запись в журнал
- Order::searchById($account_edge_order->_to)->journal('accepted');
-
- // Инициализация
- $orders = Order::searchByType(type: 'all', limit: 10, page: 1, select: '{account_edge_order, order}', supplies: true);
- $moderator_orders = self::genOrdersForModeration();
-
- // Запись в буфер вывода
- $buffer['main'] = $this->renderPartial('/orders/index', compact('orders', 'moderator_orders'));
- } else {
- // Не удалось сохранить изменения
-
- yii::$app->response->statusCode = 500;
- }
-
- // Запись обязательных параметров
- $buffer['_csrf'] = yii::$app->request->getCsrfToken();
-
- // Настройка ответа
- yii::$app->response->format = Response::FORMAT_JSON;
-
- return $buffer;
- }
-
/**
* Запись
*/
@@ -374,12 +366,12 @@ class OrderController extends Controller
$account = yii::$app->user->identity;
$supply_id = yii::$app->request->post('supply_id');
$amount = yii::$app->request->post('amount') ?? 1;
- $delivery_type = yii::$app->request->post('delivery_type');
+ $delivery = yii::$app->request->post('delivery');
// Запись настроек ответа в буфер
yii::$app->response->format = Response::FORMAT_JSON;
- if (empty($supply_id) || empty($delivery_type)) {
+ if (empty($supply_id) || empty($delivery)) {
// Не выполнены условия для выполнения
// 501 Not Implemented
@@ -392,7 +384,7 @@ class OrderController extends Controller
];
// Инициализация корзины
- if (!$data = Order::searchByType($account)[0]) {
+ if (!$data = Order::searchSmart($account)[0] ?? null) {
// Корзина не найдена (текущий заказ)
// Инициализация
@@ -400,11 +392,11 @@ class OrderController extends Controller
$data['order']->save() or throw new Exception('Не удалось инициализировать заказ');
// Запись ребра: АККАУНТ -> ЗАКАЗ
- AccountEdgeOrder::write($account->readId(), $data['order']->readId(), 'current') or $data['order']->addError('errors', 'Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ');
+ AccountEdgeOrder::write($account->readId(), $data['order']->readId(), data: ['stts' => 'current']) or $data['order']->addError('errors', 'Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ');
}
// Если запись не удалась, то вернуть код: 500 Internal Server Error
- $data['order']->writeSupply($supply_id, $delivery_type, (int) $amount) or yii::$app->response->statusCode = 500;
+ $data['order']->writeSupply($supply_id, $delivery, (int) $amount) or yii::$app->response->statusCode = 500;
return $return;
}
@@ -421,73 +413,84 @@ class OrderController extends Controller
*/
public function actionDelete(): string|array|null
{
- // Инициализация
+ // Инициализация входных параметров (необязательных)
$targets = yii::$app->request->post('targets') ?? yii::$app->request->get('targets');
$page = yii::$app->request->get('page') ?? yii::$app->request->post('page') ?? 1;
- $account = yii::$app->user->identity;
- $order = Order::searchByType();
- if ($targets) {
- // Удаление выбранных целей (удаление из заказа)
+ // Инициализация аккаунта
+ $account = Account::initAccount();
- foreach (isset($targets[0]) && is_array($targets[0]) ? $targets : [$targets] as $target) {
- // Унификация входных параметров
+ // Инициализация заказа
+ $order = Order::searchSmart($account)[0]['order'] ?? null;
- foreach ($target as $catn => $amount) {
- // Перебор целей
+ if (isset($order)) {
+ // Получены необходимые параметры
- // Удаление
- $order->deleteSupply([$catn => (int) $amount]);
- }
- }
- } else {
- // Целью подразумевается сам заказ (удаление заказа)
-
- // Инициализация
- $order->stts = 'reserved';
-
- if ($order->update()) {
- // Запись в журнал
- $order->journal('reserved');
-
- // Поиск
- $edge = AccountEdgeOrder::searchByVertex($account->readId(), $order->readId(), 'current');
-
- if (count($edge) > 1) {
- // Найден более чем 1 заказ
-
- return null;
+ if ($targets) {
+ // Удаление выбранных целей (удаление из заказа)
+
+ foreach (isset($targets[0]) && is_array($targets[0]) ? $targets : [$targets] as $target) {
+ // Унификация входных параметров
+
+ foreach ($target as $catn => $amount) {
+ // Перебор целей
+
+ // Удаление
+ $order->deleteSupply([$catn => (int) $amount]);
+ }
}
+ } else {
+ // Целью подразумевается сам заказ (удаление заказа)
// Инициализация
- $edge = $edge[0];
- $edge->type = 'reserved';
+ $order->stts = 'reserved';
- // Запись
- $edge->update();
+ if ($order->update() > 0) {
+ // Сохранены изменения
- // Реинициализация
- $order = Order::searchByType();
+ // Запись в журнал
+ $order->journal('reserved');
- if (empty($order)) {
- // Корзина не инициализирована
+ // Поиск
+ $edge = AccountEdgeOrder::searchByVertex($account->readId(), $order->readId(), filter: ['stts' => 'current']);
+
+ if (count($edge) > 1) {
+ // Найден более чем 1 заказ
+
+ return null;
+ }
// Инициализация
- $order = new Order();
- $order->save() or throw new Exception('Не удалось инициализировать заказ');
+ $edge = $edge[0];
+ $edge->stts = 'reserved';
- // Подключение
- $order->connect($account);
+ // Запись
+ $edge->update();
+
+ // Реинициализация
+ $order = Order::searchSmart($account);
+
+ if (empty($order)) {
+ // Корзина не инициализирована
+
+ // Инициализация
+ $order = new Order();
+ $order->save() or throw new Exception('Не удалось инициализировать заказ');
+
+ // Подключение
+ $order->connect($account);
+ }
}
}
}
// Инициализация содержимого корзины
- $connections = $order->content(10, $page);
+ $connections = $order->supplies(10, $page);
if (yii::$app->request->isPost) {
// POST-запрос
+ // Инициализация формата ответа
yii::$app->response->format = Response::FORMAT_JSON;
return [
@@ -510,7 +513,7 @@ class OrderController extends Controller
$targets = yii::$app->request->post('targets') ?? yii::$app->request->get('targets');
$page = yii::$app->request->get('page') ?? yii::$app->request->post('page') ?? 1;
$account = yii::$app->user->identity;
- $order = Order::searchByType();
+ $order = Order::searchSmart();
$connections = $order->content(10, $page);
foreach (isset($targets[0]) && is_array($targets[0]) ? $targets : [$targets] as $target) {
@@ -593,9 +596,9 @@ class OrderController extends Controller
// Заполнены все необходимые поля для оформления заказа (подразумевается прохождение второго этапа регистрации)
// Инициализация данных о заказе и поставках
- $data = Order::searchByType(supplies: true)[0];
+ $data = Order::searchSmart(supplies: true)[0];
- if (($account_edge_order = AccountEdgeOrder::searchByVertex(yii::$app->user->id, $data['order']->readId(), 'current')[0]) ?? false) {
+ if (($account_edge_order = AccountEdgeOrder::searchByVertex(yii::$app->user->id, $data['order']->readId(), filter: ['stts' => 'current'])[0]) ?? false) {
// Найдено ребро: АККАУНТ -> ЗАКАЗ
// Инициализация статуса необходимости реинициализации
@@ -607,9 +610,69 @@ class OrderController extends Controller
foreach ($order_edge_supply as $edge) {
// Перебор рёбер: ЗАКАЗ -> ПОСТАВКА
- if ($product = Product::searchBySupplyId($edge->_to)) {
+ if ($product = (Product::searchByCatnAndProd(($product = Product::searchBySupplyId($edge->_to))['catn'], $product['prod']))) {
// Найден товар
+ if ($sender = Account::searchById($account_edge_order->_from)) {
+ // Найден отправитель
+ try {
+ // Инициализация данных геолокации
+
+ // Инициализация буфера
+ $buffer = [];
+
+ try {
+ $from = (int) $sender->opts['delivery_from_terminal'] ?? empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default;
+ } catch (Exception $e) {
+ $from = empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default;
+ }
+
+ try {
+ $to = (int) $account->opts['delivery_to_terminal'] ?? 36;
+ } catch (Exception $e) {
+ $to = 36;
+ }
+
+ if (($buffer_connection = $buffer['product']['bffr']["$from-$to-" . $edge['dlvr']['type']] ?? false) && time() < $buffer_connection['expires']) {
+ // Найдены данные доставки в буфере и их срок хранения не превышен, информация актуальна
+
+ // Запись в буфер вывода
+ $buffer['delivery'] = $buffer_connection['data'];
+ } else {
+ // Инициализация доставки Dellin (автоматическая)
+ $product->bffr = ($product->bffr ?? []) + [
+ "$from-$to-" . $edge['dlvr']['type'] => [
+ 'data' => $buffer['delivery'] = Dellin::calcDeliveryAdvanced(
+ $from,
+ $to,
+ (int) ($buffer['product']['wght'] ?? 0),
+ (int) ($buffer['product']['dmns']['x'] ?? 0),
+ (int) ($buffer['product']['dmns']['y'] ?? 0),
+ (int) ($buffer['product']['dmns']['z'] ?? 0),
+ avia: $edge['dlvr']['type'] === 'avia'
+ ),
+ 'expires' => time() + 86400
+ ]
+ ];
+
+ // Отправка в базу данных
+ $product->update();
+ }
+
+ // Запись даты доставки
+ $edge->dlvr = $edge->dlvr + ['data' => $buffer['delivery']];
+
+ // Запись в базу данных
+ $edge->update();
+ } catch (Exception $e) {
+ // Удаление из заказа
+ $edge->delete();
+
+ // Продолжение цикла
+ continue;
+ }
+ }
+
if ($product['stts'] !== 'active') {
// Не активен товар
@@ -619,15 +682,18 @@ class OrderController extends Controller
// Статус необходимости реинициализации
$reinitialization = true;
}
+
+ // Удаление ребра: ПОСТАВКА -> ТОВАР (уменьшение количества товаров доступных для покупки)
+ SupplyEdgeProduct::searchByVertex($edge->_to, $product->readId(), 'connect')[0]->delete();
}
}
}
// Реинициализация
- if ($reinitialization) $data = Order::searchByType(supplies: true);
+ if ($reinitialization) $data = Order::searchSmart(supplies: true);
// Запись
- $account_edge_order->type = 'requested';
+ $account_edge_order->stts = 'requested';
if ($account_edge_order->update() > 0) {
// Удалось сохранить изменения
@@ -656,7 +722,7 @@ class OrderController extends Controller
} else {
// Не заполнены все необходимые поля для оформления заказа (подразумевается прохождение второго этапа регистрации)
- var_dump($account->getErrors());
+ // var_dump($account->getErrors());
foreach ($account->getErrors() as $parameter => $errors) {
// Перебор параметров с ошибками
@@ -677,6 +743,85 @@ class OrderController extends Controller
}
}
+ /**
+ * Изменение статуса заказа
+ *
+ * @param string $order Идентификатор заказа (_key)
+ *
+ * @return string|array|null
+ */
+ public function actionEditStts(string $order): string|array|null
+ {
+ // Инициализация аккаунта
+ $account = Account::initAccount();
+
+ if (isset($account)) {
+ // Найден аккаунт
+
+ // Инициализация входных параметров
+ $stts = yii::$app->request->post('stts') ?? yii::$app->request->get('stts') ?? 'processing';
+
+ // Инициализация буфера вывода
+ $buffer = [];
+
+ if (empty($order)) {
+ // Не получен обязательные параметры
+
+ yii::$app->response->statusCode = 500;
+
+ goto end;
+ }
+
+ if ($account_edge_order = AccountEdgeOrder::searchByOrder(Order::collectionName() . '/' . $order)[0]) {
+ // Удалось найти ребро до заказа
+
+ // Запись в буфер изначальных данных
+ $old = $account_edge_order->stts;
+
+ // Запись в буфер записи в базу данных
+ $account_edge_order->stts = $stts;
+
+ // Отправка в базу данных
+ if ($account_edge_order->update() > 0) {
+ // Удалось сохранить изменения
+
+ // Инициализация аккаунта покупателя
+ $buyer = Account::searchById($account_edge_order->_from);
+
+ // Отправка уведомления
+ Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order, 'from' => Order::statusToRussian($old), 'to' => Order::statusToRussian($stts), 'target' => 'Статус']), true, $buyer->_key, Notification::TYPE_NOTICE);
+
+ // Запись в буфер вывода
+ $buffer['stts'] = $account_edge_order->stts;
+ } else {
+ // Не удалось сохранить изменения
+
+ yii::$app->response->statusCode = 500;
+ }
+ }
+
+ end:
+
+ // Запись обязательных параметров
+ $buffer['_csrf'] = yii::$app->request->getCsrfToken();
+
+ // Инициализация данных заказов
+ $data = Order::searchSmart(stts: '@last', limit: 10, page: 1, supplies: true);
+
+ // Инициализация панели модератора заказов
+ if (!yii::$app->user->isGuest && Account::isMinimalAuthorized($account)) $moderator_data = Order::searchSmart(account: '@all', stts: '@last', limit: 10, page: 1, supplies: true);
+ else $moderator_data = null;
+
+ // Запись в буфер вывода
+ $buffer['main'] = $this->renderPartial('/orders/index', compact('data', 'moderator_data'));
+
+ // Настройка ответа
+ yii::$app->response->format = Response::FORMAT_JSON;
+
+ return $buffer;
+ }
+ }
+
/**
* Чтение инстанции поставки в заказе (order_edge_supply)
*
@@ -684,12 +829,12 @@ class OrderController extends Controller
*
* @return string|array|null
*/
- public function actionSupplyRead(string $catn, string $prod): string|array|null
+ public function actionSupplyRead(string $order, string $prod, string $catn, string $delivery): string|array|null
{
- // Инициализация
+ // Инициализация буфера вывода
$buffer = [];
- if (empty($catn) || empty($prod)) {
+ if (empty($order) || empty($prod) || empty($catn) || empty($delivery)) {
// Не получены обязательные параметры
yii::$app->response->statusCode = 500;
@@ -697,92 +842,68 @@ class OrderController extends Controller
goto end;
}
- if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $catn)) {
- // Удалось найти инстанцию поставки
+ if ($order_edge_supply = OrderEdgeSupply::searchBySupplyData($catn, $prod, $delivery, Order::searchById(Order::collectionName() . "/$order"))) {
+ // Удалось найти рёбра: ЗАКАЗ -> ПОСТАВКА
// Инициализация ребра: ПОСТАВКА -> ТОВАР
- $supply_edge_product = SupplyEdgeProduct::searchBySupplyId($order_edge_supply->_to);
+ $supply_edge_product = SupplyEdgeProduct::searchBySupplyId($order_edge_supply[0]->_to)[0] ?? null;
// Поиск ребра до аккаунта
- $account = Account::searchBySupplyId($order_edge_supply->_to);
+ $account = Account::searchBySupplyId($order_edge_supply[0]->_to);
// Поиск привязанного товара
- $product = Product::searchBySupplyId($order_edge_supply->_to);
+ $product = Product::searchBySupplyId($order_edge_supply[0]->_to);
- try {
- // Инициализация данных геолокации
- try {
- $from = (int) $account['opts']['delivery_from_terminal'] ?? Settings::searchActive()->delivery_from_default ?? 36;
- } catch (Exception $e) {
- $from = (int) Settings::searchActive()->delivery_from_default ?? 36;
- }
+ // Поиск привязанного товара
+ $supply = Supply::searchById($order_edge_supply[0]->_to);
- try {
- $to = (int) yii::$app->user->identity->opts['delivery_to_terminal'] ?? 36;
- } catch (Exception $e) {
- $to = 36;
- }
+ // Инициализация доставки
+ if (empty($time = $order_edge_supply[0]->time)) {
+ // Не найден срок доставки (в днях)
- // Инициализация доставки
- $delivery = Dellin::calcDeliveryAdvanced(
- $from,
- $to,
- (int) ($product['wght'] ?? 0),
- (int) ($product['dmns']['x'] ?? 0),
- (int) ($product['dmns']['y'] ?? 0),
- (int) ($product['dmns']['z'] ?? 0),
- avia: $order_edge_supply->dlvr['type'] === 'avia'
- );
+ if (empty($order_edge_supply[0]->dlvr['data'])) {
+ // Не удалось рассчитать доставку
- if ($delivery['ready'] ?? false) {
- // Указана дата готовности к получению
-
- // Инициализация доставки
- $delivery = $delivery['ready'];
+ // Инициализация времени
+ $time = 0;
} else {
- // Не указана дата готовности к получению
+ // Удалось рассчитать доставку
// Инициализация даты отправки
try {
// Взять данные из "arrivalToOspSender" (Дата прибытия на терминал-отправитель)
- $delivery_send_date = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspSender'])->getTimestamp();
+ $delivery_send_date = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['arrivalToOspSender'])->getTimestamp();
} catch (Throwable $e) {
// Взять данные из "pickup" (Дата передачи груза на адресе отправителя)
- $delivery_send_date = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['pickup'])->getTimestamp();
+ $delivery_send_date = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['pickup'])->getTimestamp();
}
// Инициализация времени доставки
try {
// Доставка по воздуху (подразумевается), данные из "giveoutFromOspReceiver" (Дата и время, с которого груз готов к выдаче на терминале)
- $delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
+ // Оставлено на всякий случай для дальнейших разбирательств
+
+ $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', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
+ $delivery_converted = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['arrivalToOspReceiver'])->getTimestamp();
}
-
- // Инициализация доставки
- $delivery = ceil(($delivery_converted - ($delivery_send_date ?? 0)) / 60 / 60 / 24) + 1;
+ $time = ceil(($delivery_converted - ($delivery_send_date ?? 0)) / 60 / 60 / 24);
}
- } catch (Exception $e) {
- // var_dump($e->getMessage());
- // var_dump($e->getTrace());
- // var_dump($e->getFile()); die;
-
- // var_dump(json_decode($e->getMessage(), true)['errors']); die;
}
// Запись параметров
- $buffer['cost'] = $order_edge_supply->cost ?? $order_edge_supply->cost = $supply_edge_product[0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу'];
- $buffer['time'] = $order_edge_supply->time ?? $delivery ?? 0;
- $buffer['comm'] = $order_edge_supply->comm ?? $order_edge_supply->comm = 'Комментарий к заказу';
- $buffer['stts'] = $order_edge_supply->stts ?? $order_edge_supply->stts = 0;
- $buffer['id'] = $order_edge_supply->_key ?? 'Неизвестно';
-
- $order_edge_supply->save();
+ $buffer['cost'] = $order_edge_supply[0]->cost ?? $supply->cost ?? 0;
+ $buffer['time'] = $time ?? 0;
+ $buffer['amnt'] = count($order_edge_supply) ?? 0;
+ $buffer['comm'] = $order_edge_supply[0]->comm ?? '';
+ $buffer['stts'] = $order_edge_supply[0]->stts ?? 'processing';
+ $buffer['id'] = $order_edge_supply[0]->_key ?? 'Неизвестно';
}
end:
@@ -797,19 +918,30 @@ class OrderController extends Controller
}
/**
- * Запись статуса поставки в заказе (order_edge_supply)
+ * Редактирование цены поставки в заказе (order_edge_supply)
*
- * @param string $catn Артикул поставки
+ * @param string $order Заказ в котором находится поставка
+ * @param string $prod Производитель
+ * @param string $catn Артикул
+ * @param string $delivery Тип доставки
*
* @return string|array|null
*/
- public function actionSupplyWriteStts(string $catn, string $prod): string|array|null
+ public function actionSupplyEditCost(string $order, string $prod, string $catn, string $delivery): string|array|null
{
- // Инициализация
- $stts = yii::$app->request->post('stts') ?? yii::$app->request->get('stts') ?? '';
+ // Инициализация входных параметров
+ $cost = yii::$app->request->post('cost') ?? yii::$app->request->get('cost');
+
+ // Инициализация буфера вывода
$buffer = [];
- if (empty($catn) || empty($prod)) {
+ // Инициализация аккаунта
+ $account = Account::initAccount();
+
+ // Инициализация заказа
+ $order = Order::searchById(Order::collectionName() . "/$order");
+
+ if (empty($order) || empty($prod) || empty($catn) || empty($delivery) || empty($cost)) {
// Не получены обязательные параметры
yii::$app->response->statusCode = 500;
@@ -817,13 +949,169 @@ class OrderController extends Controller
goto end;
}
- if ($supply = OrderEdgeSupply::searchBySupplyCatnAndProd($catn, $prod)) {
+ if ($order_edge_supply = OrderEdgeSupply::searchBySupplyData($catn, $prod, $delivery, $order)[0]) {
// Удалось найти инстанцию поставки
- var_dump($supply);
+ // Запись в буфер изначальных данных
+ $old = $order_edge_supply->cost;
+
+ // Запись в буфер записи в базу данных
+ $order_edge_supply->cost = $cost;
+
+ // Отправка в базу данных
+ if ($order_edge_supply->update() > 0) {
+ // Удалось сохранить изменения
+
+ // Инициализация аккаунта покупателя
+ $buyer = Account::searchById(AccountEdgeOrder::searchByOrder($order->readId())[0]->_from);
+
+ // Отправка уведомления
+ Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order->_key, 'from' => $old, 'to' => $cost, 'target' => 'Цена поставки']), true, $buyer->_key, Notification::TYPE_NOTICE);
+
+ // Запись в буфер вывода
+ $buffer['cost'] = $order_edge_supply->cost;
+ } else {
+ // Не удалось сохранить изменения
+
+ yii::$app->response->statusCode = 500;
+ }
}
- if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $catn)) {
+ end:
+
+ // Запись обязательных параметров
+ $buffer['_csrf'] = yii::$app->request->getCsrfToken();
+
+ // Инициализация данных заказов
+ $data = Order::searchSmart(stts: '@last', limit: 10, page: 1, supplies: true);
+
+ // Инициализация панели модератора заказов
+ if (!yii::$app->user->isGuest && Account::isMinimalAuthorized($account)) $moderator_data = Order::searchSmart(account: '@all', stts: '@last', limit: 10, page: 1, supplies: true);
+ else $moderator_data = null;
+
+ // Запись в буфер вывода
+ $buffer['main'] = $this->renderPartial('/orders/index', compact('data', 'moderator_data'));
+
+ // Настройка ответа
+ yii::$app->response->format = Response::FORMAT_JSON;
+
+ return $buffer;
+ }
+
+ /**
+ * Редактирование времени доставки поставки в заказе (order_edge_supply)
+ *
+ * @param string $order Заказ в котором находится поставка
+ * @param string $prod Производитель
+ * @param string $catn Артикул
+ * @param string $delivery Тип доставки
+ *
+ * @return string|array|null
+ */
+ public function actionSupplyEditTime(string $order, string $prod, string $catn, string $delivery): string|array|null
+ {
+ // Инициализация входных параметров
+ $time = yii::$app->request->post('time') ?? yii::$app->request->get('time');
+
+ // Инициализация буфера вывода
+ $buffer = [];
+
+ // Инициализация аккаунта
+ $account = Account::initAccount();
+
+ // Инициализация заказа
+ $order = Order::searchById(Order::collectionName() . "/$order");
+
+ if (empty($order) || empty($prod) || empty($catn) || empty($delivery) || empty($time)) {
+ // Не получены обязательные параметры
+
+ yii::$app->response->statusCode = 500;
+
+ goto end;
+ }
+
+ if ($order_edge_supply = OrderEdgeSupply::searchBySupplyData($catn, $prod, $delivery, $order)[0]) {
+ // Удалось найти инстанцию поставки
+
+ // Запись в буфер изначальных данных
+ $old = $order_edge_supply->time;
+
+ // Запись в буфер записи в базу данных
+ $order_edge_supply->time = $time;
+
+ // Отправка в базу данных
+ if ($order_edge_supply->update() > 0) {
+ // Удалось сохранить изменения
+
+ // Инициализация аккаунта покупателя
+ $buyer = Account::searchById(AccountEdgeOrder::searchByOrder($order->readId())[0]->_from);
+
+ // Отправка уведомления
+ Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order->_key, 'from' => $old, 'to' => $time + 1, 'target' => 'Дата получения поставки']), true, $buyer->_key, Notification::TYPE_NOTICE);
+
+ // Запись в буфер вывода
+ $buffer['time'] = $order_edge_supply->time;
+ } else {
+ // Не удалось сохранить изменения
+
+ yii::$app->response->statusCode = 500;
+ }
+ }
+
+ end:
+
+ // Запись обязательных параметров
+ $buffer['_csrf'] = yii::$app->request->getCsrfToken();
+
+ // Инициализация данных заказов
+ $data = Order::searchSmart(stts: '@last', limit: 10, page: 1, supplies: true);
+
+ // Инициализация панели модератора заказов
+ if (!yii::$app->user->isGuest && Account::isMinimalAuthorized($account)) $moderator_data = Order::searchSmart(account: '@all', stts: '@last', limit: 10, page: 1, supplies: true);
+ else $moderator_data = null;
+
+ // Запись в буфер вывода
+ $buffer['main'] = $this->renderPartial('/orders/index', compact('data', 'moderator_data'));
+
+ // Настройка ответа
+ yii::$app->response->format = Response::FORMAT_JSON;
+
+ return $buffer;
+ }
+
+ /**
+ * Редактирование статуса поставки в заказе (order_edge_supply)
+ *
+ * @param string $order Заказ в котором находится поставка
+ * @param string $prod Производитель
+ * @param string $catn Артикул
+ * @param string $delivery Тип доставки
+ *
+ * @return string|array|null
+ */
+ public function actionSupplyEditStts(string $order, string $prod, string $catn, string $delivery): string|array|null
+ {
+ // Инициализация входных параметров
+ $stts = yii::$app->request->post('stts') ?? yii::$app->request->get('stts') ?? '';
+
+ // Инициализация буфера вывода
+ $buffer = [];
+
+ // Инициализация аккаунта
+ $account = Account::initAccount();
+
+ // Инициализация заказа
+ $order = Order::searchById(Order::collectionName() . "/$order");
+
+ if (empty($order) || empty($prod) || empty($catn) || empty($delivery) || empty($stts)) {
+ // Не получены обязательные параметры
+
+ yii::$app->response->statusCode = 500;
+
+ goto end;
+ }
+
+ if ($order_edge_supply = OrderEdgeSupply::searchBySupplyData($catn, $prod, $delivery, $order)[0]) {
// Удалось найти инстанцию поставки
// Запись в буфер изначальных данных
@@ -833,14 +1121,14 @@ class OrderController extends Controller
$order_edge_supply->stts = $stts;
// Отправка в базу данных
- if ($order_edge_supply->save()) {
+ if ($order_edge_supply->update() > 0) {
// Удалось сохранить изменения
// Инициализация аккаунта покупателя
- $account = Account::searchById(AccountEdgeOrder::searchByOrder($order_edge_supply->_from)[0]->_from);
+ $buyer = Account::searchById(AccountEdgeOrder::searchByOrder($order->readId())[0]->_from);
// Отправка уведомления
- Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order_edge_supply->_from, 'from' => OrderEdgeSupply::convertStatusToRussian($old), 'to' => OrderEdgeSupply::convertStatusToRussian($stts), 'target' => 'Комментарий']), true, $account->_key, Notification::TYPE_NOTICE);
+ Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order->_key, 'from' => Order::statusToRussian($old), 'to' => Order::statusToRussian($stts), 'target' => 'Статус поставки']), true, $buyer->_key, Notification::TYPE_NOTICE);
// Запись в буфер вывода
$buffer['stts'] = $order_edge_supply->stts;
@@ -856,105 +1144,15 @@ class OrderController extends Controller
// Запись обязательных параметров
$buffer['_csrf'] = yii::$app->request->getCsrfToken();
- // Настройка ответа
- yii::$app->response->format = Response::FORMAT_JSON;
+ // Инициализация данных заказов
+ $data = Order::searchSmart(stts: '@last', limit: 10, page: 1, supplies: true);
- return $buffer;
- }
+ // Инициализация панели модератора заказов
+ if (!yii::$app->user->isGuest && Account::isMinimalAuthorized($account)) $moderator_data = Order::searchSmart(account: '@all', stts: '@last', limit: 10, page: 1, supplies: true);
+ else $moderator_data = null;
- /**
- * Запись цены поставки в заказе (order_edge_supply)
- *
- * @param string $catn Артикул поставки
- *
- * @return string|array|null
- */
- public function actionSupplyEditCost(int $catn): string|array|null
- {
- // Инициализация
- $cost = yii::$app->request->post('cost') ?? yii::$app->request->get('cost');
- $buffer = [];
-
- if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $catn)) {
- // Удалось найти инстанцию поставки
-
- // Запись в буфер изначальных данных
- $old = $order_edge_supply->cost;
-
- // Запись в буфер записи в базу данных
- $order_edge_supply->cost = $cost;
-
- // Отправка в базу данных
- if ($order_edge_supply->save()) {
- // Удалось сохранить изменения
-
- // Инициализация аккаунта покупателя
- $account = Account::searchById(AccountEdgeOrder::searchByOrder($order_edge_supply->_from)[0]->_from);
-
- // Отправка уведомления
- Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order_edge_supply->_from, 'from' => $old, 'to' => $cost, 'target' => 'Цена']), true, $account->_key, Notification::TYPE_NOTICE);
-
- // Запись в буфер вывода
- $buffer['cost'] = $order_edge_supply->cost;
- } else {
- // Не удалось сохранить изменения
-
- yii::$app->response->statusCode = 500;
- }
- }
-
- // Запись обязательных параметров
- $buffer['_csrf'] = yii::$app->request->getCsrfToken();
-
- // Настройка ответа
- yii::$app->response->format = Response::FORMAT_JSON;
-
- return $buffer;
- }
-
- /**
- * Запись времени доставки поставки в заказе (order_edge_supply)
- *
- * @param int $_key Ключ записи в коллекции order_edge_supply
- *
- * @return string|array|null
- */
- public function actionSupplyEditTime(int $_key): string|array|null
- {
- // Инициализация
- $time = yii::$app->request->post('time') ?? yii::$app->request->get('time');
- $buffer = [];
-
- if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
- // Удалось найти инстанцию поставки
-
- // Запись в буфер изначальных данных
- $old = $order_edge_supply->time;
-
- // Запись в буфер записи в базу данных
- $order_edge_supply->time = $time;
-
- // Отправка в базу данных
- if ($order_edge_supply->save()) {
- // Удалось сохранить изменения
-
- // Инициализация аккаунта покупателя
- $account = Account::searchById(AccountEdgeOrder::searchByOrder($order_edge_supply->_from)[0]->_from);
-
- // Отправка уведомления
- Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order_edge_supply->_from, 'from' => $old, 'to' => $time, 'target' => 'Дата поставки']), true, $account->_key, Notification::TYPE_NOTICE);
-
- // Запись в буфер вывода
- $buffer['time'] = $order_edge_supply->time;
- } else {
- // Не удалось сохранить изменения
-
- yii::$app->response->statusCode = 500;
- }
- }
-
- // Запись обязательных параметров
- $buffer['_csrf'] = yii::$app->request->getCsrfToken();
+ // Запись в буфер вывода
+ $buffer['main'] = $this->renderPartial('/orders/index', compact('data', 'moderator_data'));
// Настройка ответа
yii::$app->response->format = Response::FORMAT_JSON;
@@ -965,17 +1163,36 @@ class OrderController extends Controller
/**
* Запись комментария поставки в заказе (order_edge_supply)
*
- * @param int $_key Ключ записи в коллекции order_edge_supply
+ * @param string $order Заказ в котором находится поставка
+ * @param string $prod Производитель
+ * @param string $catn Артикул
+ * @param string $delivery Тип доставки
*
* @return string|array|null
*/
- public function actionSupplyEditComm(int $_key): string|array|null
+ public function actionSupplyEditComm(string $order, string $prod, string $catn, string $delivery): string|array|null
{
- // Инициализация
+ // Инициализация входных параметров
$comm = yii::$app->request->post('comm') ?? yii::$app->request->get('comm');
+
+ // Инициализация буфера вывода
$buffer = [];
- if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
+ // Инициализация аккаунта
+ $account = Account::initAccount();
+
+ // Инициализация заказа
+ $order = Order::searchById(Order::collectionName() . "/$order");
+
+ if (empty($order) || empty($prod) || empty($catn) || empty($delivery) || empty($comm)) {
+ // Не получены обязательные параметры
+
+ yii::$app->response->statusCode = 500;
+
+ goto end;
+ }
+
+ if ($order_edge_supply = OrderEdgeSupply::searchBySupplyData($catn, $prod, $delivery, $order)[0]) {
// Удалось найти инстанцию поставки
// Запись в буфер изначальных данных
@@ -985,14 +1202,14 @@ class OrderController extends Controller
$order_edge_supply->comm = $comm;
// Отправка в базу данных
- if ($order_edge_supply->save()) {
+ if ($order_edge_supply->update() > 0) {
// Удалось сохранить изменения
// Инициализация аккаунта покупателя
- $account = Account::searchById(AccountEdgeOrder::searchByOrder($order_edge_supply->_from)[0]->_from);
+ $buyer = Account::searchById(AccountEdgeOrder::searchByOrder($order->readId())[0]->_from);
// Отправка уведомления
- Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order_edge_supply->_from, 'from' => $old, 'to' => $comm, 'target' => 'Комментарий']), true, $account->_key, Notification::TYPE_NOTICE);
+ Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order->_key, 'from' => $old, 'to' => $comm, 'target' => 'Комментарий поставки']), true, $buyer->_key, Notification::TYPE_NOTICE);
// Запись в буфер вывода
$buffer['comm'] = $order_edge_supply->comm;
@@ -1003,9 +1220,21 @@ class OrderController extends Controller
}
}
+ end:
+
// Запись обязательных параметров
$buffer['_csrf'] = yii::$app->request->getCsrfToken();
+ // Инициализация данных заказов
+ $data = Order::searchSmart(stts: '@last', limit: 10, page: 1, supplies: true);
+
+ // Инициализация панели модератора заказов
+ if (!yii::$app->user->isGuest && Account::isMinimalAuthorized($account)) $moderator_data = Order::searchSmart(account: '@all', stts: '@last', limit: 10, page: 1, supplies: true);
+ else $moderator_data = null;
+
+ // Запись в буфер вывода
+ $buffer['main'] = $this->renderPartial('/orders/index', compact('data', 'moderator_data'));
+
// Настройка ответа
yii::$app->response->format = Response::FORMAT_JSON;
diff --git a/mirzaev/skillparts/system/controllers/SearchController.php b/mirzaev/skillparts/system/controllers/SearchController.php
index 3e8d84f..5c13ba3 100644
--- a/mirzaev/skillparts/system/controllers/SearchController.php
+++ b/mirzaev/skillparts/system/controllers/SearchController.php
@@ -143,6 +143,7 @@ class SearchController extends Controller
'dscr' => 'dscr',
'catg' => 'catg',
'imgs' => 'imgs',
+ 'name' => 'name',
'prod' => 'prod',
'dmns' => 'dmns',
'stts' => 'stts'
diff --git a/mirzaev/skillparts/system/models/AccountEdgeOrder.php b/mirzaev/skillparts/system/models/AccountEdgeOrder.php
index 5d59965..0988bb9 100644
--- a/mirzaev/skillparts/system/models/AccountEdgeOrder.php
+++ b/mirzaev/skillparts/system/models/AccountEdgeOrder.php
@@ -11,6 +11,68 @@ class AccountEdgeOrder extends Edge
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();
}
-
- /**
- * Генерация ярлыка на русском языке для статуса заказа
- *
- * @param string $status Статус заказа
- *
- * @return string Ярлык статуса на русском языке
- */
- public static function statusToRussian(string $status = ''): string
- {
- return match ($status) {
- 'requested' => 'Запрошен',
- 'accepted' => 'Ожидается отправка',
- 'going' => 'Доставляется',
- 'completed' => 'Завершен',
- default => 'Обрабатывается'
- };
- }
}
diff --git a/mirzaev/skillparts/system/models/Edge.php b/mirzaev/skillparts/system/models/Edge.php
index faf2054..3d06e84 100644
--- a/mirzaev/skillparts/system/models/Edge.php
+++ b/mirzaev/skillparts/system/models/Edge.php
@@ -120,7 +120,7 @@ abstract class Edge extends Document
// Настройка
$edge->_from = $_from;
$edge->_to = $_to;
- $edge->type = $type;
+ if (isset($type)) $edge->type = $type;
foreach ($data as $key => $value) {
if (is_int($key)) {
diff --git a/mirzaev/skillparts/system/models/Order.php b/mirzaev/skillparts/system/models/Order.php
index 2e5b44d..7f8126c 100644
--- a/mirzaev/skillparts/system/models/Order.php
+++ b/mirzaev/skillparts/system/models/Order.php
@@ -96,7 +96,7 @@ class Order extends Document implements DocumentInterface
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 Привести в порядок
*/
- public static function searchByType(
+ public static function searchSmart(
Account|string $account = null,
- string $type = 'current',
+ string $stts = 'current',
string|null $search = null,
int $limit = 1,
int $page = 1,
@@ -276,24 +276,28 @@ class Order extends Document implements DocumentInterface
bool $count = false
): int|array|null {
// Инициализация аккаунта
- if (empty($account) && isset(yii::$app->user->identity)) {
- // Данные не переданы
+ if (empty($account)) {
+ // Не получен аккаунт
$subquery_where = [
[
- 'account._id' => yii::$app->user->identity->readId()
+ 'account._id' => Account::initAccount()->readId()
]
];
} else if ($account instanceof Account) {
- // Передан аккаунт
+ // Получен аккаунт
- $subquery_where = [
- [
- 'account._id' => $account->readId()
- ]
- ];
+ if (Account::isMinimalAuthorized(Account::initAccount())) {
+ $subquery_where = [
+ [
+ 'account._id' => $account->readId()
+ ]
+ ];
+ } else {
+ throw new Exception('У вас нет прав на обработку другого пользователя');
+ }
} else if (str_contains($account, '@all')) {
- // Запрос на обработку всех аккаунтов
+ // Получен запрос на обработку всех аккаунтов
$subquery_where = [];
} else {
@@ -301,11 +305,11 @@ class Order extends Document implements DocumentInterface
}
// Инициализация типа заказа
- if (strcasecmp($type, 'all') !== 0) {
+ if (strcasecmp($stts, '@all') !== 0) {
// Если не указан поиск всех заказов
$subquery_where[] = [
- 'account_edge_order.type' => $type
+ 'account_edge_order.stts' => $stts
];
}
@@ -409,7 +413,7 @@ class Order extends Document implements DocumentInterface
* @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();
@@ -564,17 +568,32 @@ class Order extends Document implements DocumentInterface
*/
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
{
- 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' => 'Резервирован'
+ ];
}
}
diff --git a/mirzaev/skillparts/system/models/OrderEdgeSupply.php b/mirzaev/skillparts/system/models/OrderEdgeSupply.php
index a3ad355..0212c62 100644
--- a/mirzaev/skillparts/system/models/OrderEdgeSupply.php
+++ b/mirzaev/skillparts/system/models/OrderEdgeSupply.php
@@ -14,7 +14,6 @@ class OrderEdgeSupply extends Edge
return 'order_edge_supply';
}
-
/**
* Свойства
*/
@@ -118,7 +117,7 @@ class OrderEdgeSupply extends Edge
/**
- * Поиск поставки по артикулу
+ * Поиск по данным поставки
*
* @param string $catn Артикул
* @param Order $order Заказ
@@ -126,7 +125,7 @@ class OrderEdgeSupply extends Edge
*
* @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)) {
// Поставка найдена
@@ -134,6 +133,12 @@ class OrderEdgeSupply extends Edge
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();
}
@@ -143,21 +148,21 @@ class OrderEdgeSupply extends Edge
return [];
}
-
/**
- * Генерация ярлыка на русском языке для статуса заказа поставки
+ * Генерация ярлыка на русском языке для статуса заказа
*
- * @param string $status Статус заказа поставки
+ * @param string|null $status Статус заказа
*
* @return string Ярлык статуса на русском языке
*/
- public static function statusToRussian(string $status = ''): string
+ public static function statusToRussian(?string $status = 'processing'): string
{
return match ($status) {
'requested' => 'Запрошен',
'accepted' => 'Ожидается отправка',
'going' => 'Доставляется',
'completed' => 'Завершен',
+ 'processing' => 'Обрабатывается',
default => 'Обрабатывается'
};
}
diff --git a/mirzaev/skillparts/system/views/invoice/order/pattern.pdf b/mirzaev/skillparts/system/views/invoice/order/pattern.pdf
new file mode 100755
index 0000000..fe34707
Binary files /dev/null and b/mirzaev/skillparts/system/views/invoice/order/pattern.pdf differ
diff --git a/mirzaev/skillparts/system/views/notification/system/orders/edit.php b/mirzaev/skillparts/system/views/notification/system/orders/edit.php
index fba82a2..fe2e73f 100644
--- a/mirzaev/skillparts/system/views/notification/system/orders/edit.php
+++ b/mirzaev/skillparts/system/views/notification/system/orders/edit.php
@@ -1 +1 @@
-
Данные заказа #= $order ?> изменены: = $target ?> с = $from ?> на = $to ?>
+
#= $order ?>: = mb_convert_case($target, MB_CASE_LOWER, "UTF-8") ?> с "= mb_convert_case($from, MB_CASE_LOWER, "UTF-8") ?>" на "= mb_convert_case($to, MB_CASE_LOWER, "UTF-8") ?>"
diff --git a/mirzaev/skillparts/system/views/orders/index.php b/mirzaev/skillparts/system/views/orders/index.php
index 3b37966..34cc8b2 100644
--- a/mirzaev/skillparts/system/views/orders/index.php
+++ b/mirzaev/skillparts/system/views/orders/index.php
@@ -42,18 +42,18 @@ if (empty($window)) {
/>
-
-
-
-
+
+ $label) : ?>
+
+
-
+
jrnl as $entry) {
// Перебор записей в журнале
@@ -76,18 +76,18 @@ if (empty($window)) {
// Конвертация данных из буфера
$date = [
'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')
];
?>