From 4f80a465bc7c329c20d5d3c1c12c774a4795d486 Mon Sep 17 00:00:00 2001 From: Arsen Mirzaev Tatyano-Muradovich Date: Wed, 13 Apr 2022 12:39:58 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=20=D0=B2=D1=81=D0=B5=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controllers/CartController.php | 8 +- .../system/controllers/OrderController.php | 25 ++- .../system/controllers/ProductController.php | 146 ++++++++-------- .../system/controllers/ProfileController.php | 4 +- mirzaev/skillparts/system/models/Order.php | 6 +- .../system/models/OrderEdgeSupply.php | 29 ++++ mirzaev/skillparts/system/models/Product.php | 84 +++++++-- mirzaev/skillparts/system/models/Search.php | 25 ++- mirzaev/skillparts/system/models/Supply.php | 137 +++++++++------ .../skillparts/system/views/product/index.php | 51 +++--- .../skillparts/system/views/product/list.php | 3 +- .../skillparts/system/views/profile/panel.php | 10 +- .../system/views/profile/supplies.php | 2 +- .../skillparts/system/views/search/index.php | 21 ++- .../system/web/css/pages/product.css | 9 +- .../skillparts/system/web/js/product_panel.js | 163 +++++++++++------- .../skillparts/system/web/js/profile_panel.js | 12 +- 17 files changed, 458 insertions(+), 277 deletions(-) diff --git a/mirzaev/skillparts/system/controllers/CartController.php b/mirzaev/skillparts/system/controllers/CartController.php index a5f89ce..2bb7d2e 100644 --- a/mirzaev/skillparts/system/controllers/CartController.php +++ b/mirzaev/skillparts/system/controllers/CartController.php @@ -148,14 +148,14 @@ class CartController extends Controller return $this->render('index', compact('account', 'model', 'connections', 'delivery_to_terminal_list')); } - public function actionEditComm(string $catn): array|string|null + public function actionEditComm(string $catn, string $prod): array|string|null { // Инициализация $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (is_null($catn)) { + if (is_null($catn) || is_null($prod)) { // Не получен артикул yii::$app->response->statusCode = 500; @@ -163,7 +163,7 @@ class CartController extends Controller goto end; } - if ($edges = OrderEdgeSupply::searchBySupplyCatn($catn, Order::searchByType())) { + if ($edges = OrderEdgeSupply::searchBySupplyCatnAndProd($catn, $prod, Order::searchByType())) { // Рёбра найдены (связи заказа с поставкой) // Инициализация @@ -216,7 +216,7 @@ class CartController extends Controller return $return; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { return $this->render('index', compact('model')); } else { return $this->redirect('/'); diff --git a/mirzaev/skillparts/system/controllers/OrderController.php b/mirzaev/skillparts/system/controllers/OrderController.php index 39b3dfd..be3e197 100644 --- a/mirzaev/skillparts/system/controllers/OrderController.php +++ b/mirzaev/skillparts/system/controllers/OrderController.php @@ -693,14 +693,17 @@ class OrderController extends Controller * * @return string|array|null */ - public function actionSupplyRead(string $catn): string|array|null + public function actionSupplyRead(string $catn, string $prod): string|array|null { // Инициализация $buffer = []; - if ($supply = OrderEdgeSupply::searchBySupplyCatn($catn)) { - // Удалось найти инстанцию поставки + if (empty($catn) || empty($prod)) { + // Не получены обязательные параметры + yii::$app->response->statusCode = 500; + + goto end; } if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $catn)) { @@ -791,6 +794,8 @@ class OrderController extends Controller $order_edge_supply->save(); } + end: + // Запись обязательных параметров $buffer['_csrf'] = yii::$app->request->getCsrfToken(); @@ -807,13 +812,21 @@ class OrderController extends Controller * * @return string|array|null */ - public function actionSupplyWriteStts(string $catn): string|array|null + public function actionSupplyWriteStts(string $catn, string $prod): string|array|null { // Инициализация $stts = yii::$app->request->post('stts') ?? yii::$app->request->get('stts') ?? ''; $buffer = []; - if ($supply = OrderEdgeSupply::searchBySupplyCatn($_id = Supply::collectionName() . '/' . $catn)) { + if (empty($catn) || empty($prod)) { + // Не получены обязательные параметры + + yii::$app->response->statusCode = 500; + + goto end; + } + + if ($supply = OrderEdgeSupply::searchBySupplyCatnAndProd($catn, $prod)) { // Удалось найти инстанцию поставки var_dump($supply); @@ -847,6 +860,8 @@ class OrderController extends Controller } } + end: + // Запись обязательных параметров $buffer['_csrf'] = yii::$app->request->getCsrfToken(); diff --git a/mirzaev/skillparts/system/controllers/ProductController.php b/mirzaev/skillparts/system/controllers/ProductController.php index 803cd3d..0656eb1 100644 --- a/mirzaev/skillparts/system/controllers/ProductController.php +++ b/mirzaev/skillparts/system/controllers/ProductController.php @@ -79,9 +79,9 @@ class ProductController extends Controller ]; } - public function actionIndex(string $catn): array|string|null + public function actionIndex(string $prod, string $catn): array|string|null { - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден if (yii::$app->request->isAjax) { @@ -107,14 +107,14 @@ class ProductController extends Controller * * @param string $catn Артикул */ - public function actionWrite(string $catn): array|string|null + public function actionWrite(string $catn, string $prod): array|string|null { // Инициализация буфера ответа $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул // Запись кода ответа @@ -124,10 +124,10 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Найден товар - if (SupplyEdgeProduct::searchByVertex(Supply::searchByCatn($catn)->readId(), $product->readId(), filter: ['type' => 'connect'])) { + if (SupplyEdgeProduct::searchByVertex(Supply::searchByCatnAndProd($catn, $prod)->readId(), $product->readId(), filter: ['type' => 'connect'])) { // Удалось найти ребро: ПОСТАВКА -> ТОВАР // Запись кода ответа @@ -141,7 +141,7 @@ class ProductController extends Controller } else { // Не удалось найти ребро: ПОСТАВКА -> ТОВАР - if (SupplyEdgeProduct::write(Supply::searchByCatn($catn)->readId(), $product->readId(), data: ['type' => 'connect'])) { + if (SupplyEdgeProduct::write(Supply::searchByCatnAndProd($catn, $prod)->readId(), $product->readId(), data: ['type' => 'connect'])) { // Удалось создать ребро: ПОСТАВКА -> ТОВАР $return['alert'] = "Товар уже существовал, связь с поставкой записана: $catn"; @@ -248,7 +248,7 @@ class ProductController extends Controller * * @param string $catn Артикул */ - public function actionDelete(string $catn): array|string|null + public function actionDelete(string $catn, string $prod): array|string|null { // Инициализация буфера ответа $return = [ @@ -265,7 +265,7 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден if ($product->disconnect()) { @@ -327,7 +327,7 @@ class ProductController extends Controller return $return; } - if (Product::searchByCatn($catn)) { + if (Product::searchByCatnAndProd($catn, $prod)) { // Обрабатываемый товар ещё существует (подразумевается, что произошла ошибка) // Возврат на страницу товара @@ -343,9 +343,10 @@ class ProductController extends Controller /** * Подключение аналога * + * @param string $prod Производитель * @param string $catn Артикул */ - public function actionConnect(string $catn): array|string|null + public function actionConnect(string $prod, string $catn): array|string|null { // Инициализация буфера ответа $return = [ @@ -362,23 +363,23 @@ class ProductController extends Controller goto end; } - if ($from = Product::searchByCatn($catn)) { + if ($from = Product::searchByCatnAndProd($catn, $prod)) { // Найден товар if ($target = yii::$app->request->post('catn') ?? yii::$app->request->get('catn')) { // Инициализирован артикул товара для связи if ($to = Product::searchByCatn($target)) { - // Существует товар к которому планируется соединение + // Существуют товары к которым планируется соединение } else { - // Не существует товар к которому планируется соединение + // Не существуют товары к которым планируется соединение // Инициализация товара - if ($to = Product::writeEmpty((string) $target)) { + if ($to = [Product::writeEmpty((string) $target, $from->prod)]) { // Удалось записать товар // Запись в буфер возврата - $return['alert'] = "Не удалось записать новый товар: $target"; + $return['alert'] = "Записан новый товар: $target ($from->prod)"; } else { // Не удалось записать товар @@ -386,25 +387,28 @@ class ProductController extends Controller yii::$app->response->statusCode = 500; // Запись в буфер возврата - $return['alert'] = "Не удалось записать новый товар: $target"; + $return['alert'] = "Не удалось записать новый товар: $target ($from->prod)"; // Переход в конец алгоритма goto end; } } - if (count($from->synchronization($to)) > 0) { - // Созданы рёбра + // Инициализация количества созданных рёбер + $writed = 0; - // Запись в буфер возврата - $return['alert'] = 'Продукты успешно соединены'; - } else { - // Не созданы рёбра + foreach ($to as $product) { + // Перебор товаров для записи связи: ТОВАР -> ТОВАР - // Запись в буфер возврата - $return['alert'] = 'Не удалось соединить продукты'; + // Универсализация данных (приведение к объекту) + if (is_array($product) && !$product = Product::searchByCatnAndProd($product['catn'], $product['prod'])) continue; + // Запись ребра и синхронизация (добавление в группу к остальным аналогам) + if (count($from->synchronization($product)) > 0) $writed++; } + + // Запись в буфер возврата + $return['alert'] = "Создано $writed связей"; } } else { // Не найден товар @@ -413,7 +417,7 @@ class ProductController extends Controller yii::$app->response->statusCode = 500; // Запись в буфер возврата - $return['alert'] = "Не удалось найти товар: $catn"; + $return['alert'] = "Не удалось найти товар: $catn ($prod)"; // Переход в конец алгоритма goto end; @@ -430,11 +434,11 @@ class ProductController extends Controller return $return; } - if (Product::searchByCatn($catn)) { + if (Product::searchByCatnAndProd($catn, $prod)) { // Старый товар ещё существует (подразумевается, что произошла ошибка) // Возврат на страницу товара - return $this->redirect("/product/$catn"); + return $this->redirect("/product/$prod/$catn"); } else { // Обрабатываемый товар не существует (подразумевается, что произошла ошибка) @@ -448,14 +452,14 @@ class ProductController extends Controller * * @param string $catn Артикул */ - public function actionDisconnect(string $catn): array|string|null + public function actionDisconnect(string $catn, string $prod): array|string|null { // Инициализация буфера ответа $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул // Запись кода ответа @@ -465,13 +469,13 @@ class ProductController extends Controller goto end; } - if ($from = Product::searchByCatn($catn)) { + if ($from = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация цели $target = yii::$app->request->post('catn') ?? yii::$app->request->get('catn'); - if ($from->disconnect(Product::searchByCatn(empty($target) ? null : $target))) { + if ($from->disconnect($target)) { // Удалено ребро (связь) // Запись в буфер возврата @@ -510,11 +514,11 @@ class ProductController extends Controller return $return; } - if (Product::searchByCatn($catn)) { + if (Product::searchByCatnAndProd($catn, $prod)) { // Обрабатываемый товар ещё существует (подразумевается, что произошла ошибка) // Возврат на страницу товара - return $this->redirect("/product/$catn"); + return $this->redirect("/product/$prod/$catn"); } else { // Обрабатываемый товар не существует (подразумевается, что произошла ошибка) @@ -523,14 +527,14 @@ class ProductController extends Controller } } - public function actionEditTitle(string $catn): array|string|null + public function actionEditTitle(string $catn, string $prod): array|string|null { // Инициализация $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул yii::$app->response->statusCode = 500; @@ -538,7 +542,7 @@ class ProductController extends Controller goto end; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация @@ -566,21 +570,21 @@ class ProductController extends Controller return $return; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { return $this->render('index', compact('model')); } else { return $this->redirect('/'); } } - public function actionEditCatn(string $catn): array|string|null + public function actionEditCatn(string $catn, string $prod): array|string|null { // Инициализация $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул yii::$app->response->statusCode = 500; @@ -588,7 +592,7 @@ class ProductController extends Controller goto end; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация @@ -617,11 +621,11 @@ class ProductController extends Controller return $return; } - if (Product::searchByCatn($catn)) { + if (Product::searchByCatnAndProd($catn, $prod)) { // Старый товар ещё существует (подразумевается, что произошла ошибка) // Возврат на страницу товара - return $this->redirect("/product/$catn"); + return $this->redirect("/product/$prod/$catn"); } else { // Старый товар не существует (подразумевается, что его артикул успешно изменён) @@ -630,14 +634,14 @@ class ProductController extends Controller } } - public function actionEditDscr(string $catn): array|string|null + public function actionEditDscr(string $catn, string $prod): array|string|null { // Инициализация $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул yii::$app->response->statusCode = 500; @@ -645,7 +649,7 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация @@ -673,21 +677,21 @@ class ProductController extends Controller return $return; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { return $this->render('index', compact('model')); } else { return $this->redirect('/'); } } - public function actionEditDmns(string $catn): array|string|null + public function actionEditDmns(string $catn, string $prod): array|string|null { // Инициализация $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул yii::$app->response->statusCode = 500; @@ -695,7 +699,7 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация @@ -729,21 +733,21 @@ class ProductController extends Controller return $return; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { return $this->render('index', compact('model')); } else { return $this->redirect('/'); } } - public function actionEditWght(string $catn): array|string|null + public function actionEditWght(string $catn, string $prod): array|string|null { // Инициализация $return = [ '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул yii::$app->response->statusCode = 500; @@ -751,7 +755,7 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация @@ -779,7 +783,7 @@ class ProductController extends Controller return $return; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { return $this->render('index', compact('model')); } else { return $this->redirect('/'); @@ -793,7 +797,7 @@ class ProductController extends Controller '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул yii::$app->response->statusCode = 500; @@ -801,7 +805,7 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация @@ -828,14 +832,14 @@ class ProductController extends Controller return $return; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { return $this->render('index', compact('model')); } else { return $this->redirect('/'); } } - public function actionDeleteImage(string $catn): array|string|null + public function actionDeleteImage(string $catn, string $prod): array|string|null { // Инициализация $return = [ @@ -843,7 +847,7 @@ class ProductController extends Controller ]; $index = yii::$app->request->post('index') ?? yii::$app->request->get('index'); - if (empty($catn) || empty($index)) { + if (empty($catn) || empty($index) || empty($prod)) { // Не получены обязательные параметры yii::$app->response->statusCode = 500; @@ -851,7 +855,7 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация (буфер нужен из-за кривых сеттеров) @@ -883,14 +887,14 @@ class ProductController extends Controller return $return; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { return $this->render('index', compact('model')); } else { return $this->redirect('/'); } } - public function actionWriteCover(string $catn): array|string|null + public function actionWriteCover(string $catn, string $prod): array|string|null { // Инициализация $return = [ @@ -898,7 +902,7 @@ class ProductController extends Controller ]; $index = yii::$app->request->post('index') ?? yii::$app->request->get('index'); - if (empty($catn) || empty($index)) { + if (empty($catn) || empty($index) || empty($prod)) { // Не получены обязательные параметры yii::$app->response->statusCode = 500; @@ -906,7 +910,7 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Товар найден // Инициализация (буфер нужен из-за кривых сеттеров) @@ -948,7 +952,7 @@ class ProductController extends Controller return $return; } - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { return $this->render('index', compact('model')); } else { return $this->redirect('/'); @@ -960,7 +964,7 @@ class ProductController extends Controller * * @param string $catn Артикул */ - public function actionStatus(string $catn): array|string|null + public function actionStatus(string $prod, string $catn): array|string|null { if (yii::$app->request->isPost) { // POST-запрос @@ -973,7 +977,7 @@ class ProductController extends Controller '_csrf' => yii::$app->request->getCsrfToken() ]; - if (empty($catn)) { + if (empty($catn) || empty($prod)) { // Не получен артикул // Запись кода ответа @@ -983,7 +987,7 @@ class ProductController extends Controller goto end; } - if ($product = Product::searchByCatn($catn)) { + if ($product = Product::searchByCatnAndProd($catn, $prod)) { // Найден товар // Запись старого статуса @@ -1008,7 +1012,7 @@ class ProductController extends Controller // Не записаны изменения // Отправка уведомления - Notification::_write("Не удалось изменить статус на $stts у товара $catn", type: Notification::TYPE_ERROR); + Notification::_write("Не удалось изменить статус на $stts у товара $catn ($prod)", type: Notification::TYPE_ERROR); } } else { // Не найден товар @@ -1017,7 +1021,7 @@ class ProductController extends Controller yii::$app->response->statusCode = 500; // Отправка уведомления - Notification::_write("Не удалось найти товар $catn", type: Notification::TYPE_ERROR); + Notification::_write("Не удалось найти товар $catn ($prod)", type: Notification::TYPE_ERROR); // Переход в конец алгоритма goto end; diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php index b4f1052..89cd1d3 100644 --- a/mirzaev/skillparts/system/controllers/ProfileController.php +++ b/mirzaev/skillparts/system/controllers/ProfileController.php @@ -558,7 +558,6 @@ class ProfileController extends Controller } else { // Не получен аккаунт для которого необходимо загрузить каталог - if ($supply->importExcel((int) $warehouse)) { return [ @@ -807,6 +806,9 @@ class ProfileController extends Controller */ public static function syncGeolocationWithDellin(Account|int|null $account = null): bool { + // Инициализщация аккаунта + $account = Account::initAccount($account); + // Синхронизация с базой данных (таблица с ДеловыеЛинии) if (isset($account->geol['data']) && $dellin = Dellin::searchByCityKladr(str_pad($account->geol['data']['city_kladr_id'], 25, '0000000000000000000000'))) { // Удалось найти город с терминалами ДеловыеЛинии diff --git a/mirzaev/skillparts/system/models/Order.php b/mirzaev/skillparts/system/models/Order.php index e7fbbd5..6d3e7b9 100644 --- a/mirzaev/skillparts/system/models/Order.php +++ b/mirzaev/skillparts/system/models/Order.php @@ -186,6 +186,8 @@ class Order extends Document implements DocumentInterface * @param Supply|array $supply Товары * * @return int Количество удалённых рёбер + * + * @todo Доделать */ public function deleteSupply(Supply|array $supply): int { @@ -599,7 +601,7 @@ class Order extends Document implements DocumentInterface } } else { // Инициализация инстанции продукта в базе данных - $product = Product::searchByCatn($connection['product']['catn']); + $product = Product::searchByCatnAndProd($connection['product']['catn'], $connection['product']['prod']); // Инициализация доставки Dellin (автоматическая) $product->bffr = ($product->bffr ?? []) + [ @@ -662,7 +664,7 @@ class Order extends Document implements DocumentInterface } } else { // Инициализация инстанции продукта в базе данных - $product = Product::searchByCatn($connection['product']['catn']); + $product = Product::searchByCatnAndProd($connection['product']['catn'], $connection['product']['prod']); // Инициализация доставки Dellin (автоматическая) $product->bffr = ($product->bffr ?? []) + [ diff --git a/mirzaev/skillparts/system/models/OrderEdgeSupply.php b/mirzaev/skillparts/system/models/OrderEdgeSupply.php index 6fb2aa0..e8b8976 100644 --- a/mirzaev/skillparts/system/models/OrderEdgeSupply.php +++ b/mirzaev/skillparts/system/models/OrderEdgeSupply.php @@ -96,6 +96,8 @@ class OrderEdgeSupply extends Edge * @param int $limit Максимальное количество * * @return array Поставки + * + * @deprecated */ public static function searchBySupplyCatn(string $catn, Order $order = null, int $limit = 10): array { @@ -114,6 +116,33 @@ class OrderEdgeSupply extends Edge return []; } + + /** + * Поиск поставки по артикулу + * + * @param string $catn Артикул + * @param Order $order Заказ + * @param int $limit Максимальное количество + * + * @return array Поставки + */ + public static function searchBySupplyCatnAndProd(string $catn, string $prod, Order $order = null, int $limit = 10): array + { + if ($supply = Supply::searchByCatnAndProd($catn, $prod)) { + // Поставка найдена + + if (isset($order)) { + // Поиск только по определённому заказу + + return self::find()->where(['_from' => $order->readId(), '_to' => $supply->readId()])->limit($limit)->all(); + } + + return self::find()->where(['_to' => $supply->readId()])->limit($limit)->all(); + } + + return []; + } + public static function convertStatusToRussian(string|int $status): string { return match($status) { diff --git a/mirzaev/skillparts/system/models/Product.php b/mirzaev/skillparts/system/models/Product.php index ad56fa6..591dd13 100644 --- a/mirzaev/skillparts/system/models/Product.php +++ b/mirzaev/skillparts/system/models/Product.php @@ -223,7 +223,7 @@ class Product extends Document if ($this->isNewRecord) { // Новая запись - $this->stts = 'inactive'; + $this->stts = $this->stts ?? 'inactive'; } return true; @@ -235,13 +235,15 @@ class Product extends Document /** * Запись пустого продукта */ - public static function writeEmpty(string $catn): ?self + public static function writeEmpty(string $catn, string $prod = 'Неизвестный', bool $active = false): ?self { // Инициализация $model = new self; // Настройки $model->catn = $catn; + $model->prod = $prod; + $model->stts = $active ? 'active' : 'inactive'; // Запись return $model->save() ? $model : null; @@ -346,7 +348,7 @@ class Product extends Document * * @todo Переделать нормально */ - public static function searchByCatn(string|null $catn, int $limit = 1, array $select = []): static|array|null + public static function searchByCatn(string $catn, int $limit = 999, array $select = []): static|array|null { if ($limit <= 1) { return static::findOne(['catn' => $catn]); @@ -369,6 +371,37 @@ class Product extends Document return $query; } + /** + * Поиск по каталожному номеру и производителю + * + * Ищет продукт и возвращает его, + * либо выполняет поиск через представление + * + * @todo Переделать нормально + */ + public static function searchByCatnAndProd(string $catn, string $prod, int $limit = 1, array $select = []): static|array|null + { + if ($limit <= 1) { + return static::findOne(['catn' => $catn, 'prod' => $prod]); + } + + $query = self::find() + ->where(['catn' => $catn, 'prod' => $prod]) + ->limit($limit) + ->select($select) + ->createCommand() + ->execute() + ->getAll(); + + foreach ($query as &$attribute) { + // Приведение всех свойств в массив и очистка от лишних данных + + $attribute = $attribute->getAll(); + } + + return $query; + } + /** * Поиск по каталожному номеру (через представления) * @@ -432,18 +465,19 @@ class Product extends Document /** * Найти все аналоги * - * @param string $catn Идентификатор товара + * @param string $prod Производитель + * @param string $catn Артикул * @param int $limit Ограничение по количеству * * @return array|null Найденные аналоги */ - public static function searchAnalogs(string $catn, int $limit = 30): ?array + public static function searchAnalogs(string $prod, string $catn, int $limit = 30): ?array { // Инициализация буфера возврата $return = []; // Поиск ключей аналогов - $analogs = ProductEdgeProduct::searchConnections(self::searchByCatn($catn)->_key, $limit); + $analogs = ProductEdgeProduct::searchConnections(self::searchByCatnAndProd($catn, $prod)?->_key, $limit); foreach ($analogs as $analog) { // Перебор найденных ключей (_key) аналогов @@ -694,21 +728,21 @@ class Product extends Document * * @param string $catn Артикул, каталожный номер */ - public static function initEmpty(string $catn): Supply|array + public static function initEmpty(string $catn, string $prod): Supply|array { $oemn = self::searchOemn($catn); if (count($oemn) === 1) { // Передан только один артикул - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { // Продукт уже существует return $model; } // Запись пустого продукта - return Product::writeEmpty($catn); + return Product::writeEmpty($catn, $prod); } // Инициализация @@ -717,14 +751,14 @@ class Product extends Document foreach ($oemn as $catn) { // Перебор всех найденных артикулов - if ($model = Product::searchByCatn($catn)) { + if ($model = Product::searchByCatnAndProd($catn, $prod)) { // Продукт уже существует continue; } // Запись - if ($model = Product::writeEmpty($catn)) { + if ($model = Product::writeEmpty($catn, $prod)) { // Записано // Запись в массив сохранённых моделей @@ -734,4 +768,32 @@ class Product extends Document return $models; } + + /** + * Активация + * + * @return bool Статус выполнения + */ + public function activate(): bool + { + $this->stts = 'activate'; + + if ($this->update() > 0) return true; + + return false; + } + + /** + * Деактивация + * + * @return bool Статус выполнения + */ + public function deactivate(): bool + { + $this->stts = 'inactive'; + + if ($this->update() > 0) return true; + + return false; + } } diff --git a/mirzaev/skillparts/system/models/Search.php b/mirzaev/skillparts/system/models/Search.php index 301d9df..56a7ce7 100644 --- a/mirzaev/skillparts/system/models/Search.php +++ b/mirzaev/skillparts/system/models/Search.php @@ -196,7 +196,7 @@ class Search extends Document // Доставка "auto" try { - $from = (int) (Warehouse::searchBySupply(Supply::searchByCatn($connection['supply']['catn']))[0]->trmn ?? Settings::searchActive()?->delivery_from_default ?? 36); + $from = (int) (Warehouse::searchBySupply(Supply::searchByCatnAndProd($connection['supply']['catn'], $connection['supply']['prod']))[0]->trmn ?? Settings::searchActive()?->delivery_from_default ?? 36); } catch (exception $e) { $from = empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default; } @@ -234,7 +234,7 @@ class Search extends Document $connection['delivery']['type'] = 'auto'; } else { // Инициализация инстанции продукта в базе данных - $product = Product::searchByCatn($connection['product']['catn']); + $product = Product::searchByCatnAndProd($connection['product']['catn'], $connection['product']['prod']); if ($connection['delivery'] = Dellin::calcDeliveryAdvanced( $from, @@ -294,7 +294,7 @@ class Search extends Document } try { - $from = (int) (Warehouse::searchBySupply(Supply::searchByCatn($connection['supply']['catn']))[0]->trmn ?? Settings::searchActive()?->delivery_from_default ?? 36); + $from = (int) (Warehouse::searchBySupply(Supply::searchByCatnAndProd($connection['supply']['catn'], $connection['supply']['prod']))[0]->trmn ?? Settings::searchActive()?->delivery_from_default ?? 36); } catch (Exception $e) { $from = empty(Settings::searchActive()->delivery_from_default) ? 36 : (int) Settings::searchActive()->delivery_from_default; } @@ -319,7 +319,7 @@ class Search extends Document $buffer_delivery_avia['delivery']['type'] = 'avia'; } else { // Инициализация инстанции продукта в базе данных - $product = Product::searchByCatn($buffer_delivery_avia['product']['catn']); + $product = Product::searchByCatnAndProd($buffer_delivery_avia['product']['catn'], $connection['product']['prod']); if ($buffer_delivery_avia['delivery'] = Dellin::calcDeliveryAdvanced( $from, @@ -388,6 +388,8 @@ class Search extends Document /** * Генерация HTML-кода с найденным товаром * + * Я сам в ахуе, переделывать не буду + * * @param array $row Товар сгенерированный через Search::content() * @param string|null $cover Обложка * @param array $empties Реестр не найденных товаров @@ -465,17 +467,12 @@ class Search extends Document // Инициализация количества // $amount_raw = $amount = $supply['amnt'] ?? $supply_edge_product[0]['onec']['Количество'] ?? 0; - $amount_raw = $amount = count(@SupplyEdgeProduct::searchByVertex(@Supply::collectionName() . '/' . $supply['_key'], @Product::searchByCatn($supply['catn'])->readId(), limit: 999)) ?? 1; - - if (empty($amount_raw) || $amount_raw < 1) { - // Уже не используется - $amount = 'Под заказ'; - } else { - $amount .= ' шт'; - } + // Инициализация цены и её представления + $amount_raw = $amount = count(@SupplyEdgeProduct::searchByVertex(@Supply::collectionName() . '/' . $supply['_key'], @Product::searchByCatnAndProd($supply['catn'], $supply['prod'])->readId(), limit: 999)) ?? 1; + $amount .= ' шт'; if ($amount_raw < 1 || $price_raw < 1) { - // Нет в наличии или цена 0 рублей + // Количество 0 или цена 0 // Поставки отстутвуют no_supplies: @@ -494,7 +491,7 @@ class Search extends Document HTML; // Запись в список ненайденных - $empties[] = $row['catn']; + $empties[$row['prod']] = [$row['catn']] + (isset($empties[$row['prod']]) ? $empties[$row['prod']] : []); // Запись блокировщика $empty_block = true; diff --git a/mirzaev/skillparts/system/models/Supply.php b/mirzaev/skillparts/system/models/Supply.php index b482863..6e2c702 100644 --- a/mirzaev/skillparts/system/models/Supply.php +++ b/mirzaev/skillparts/system/models/Supply.php @@ -468,24 +468,24 @@ class Supply extends Product implements ProductInterface, OfferInterface // Поиск аналогов $analogs = explode(',', (string) ($row['Аналоги'] ?? $row['аналоги'] ?? $row['Analogs'] ?? $row['analogs'] ?? $row['ОЕМ'] ?? $row['eom'] ?? ''), 50); + // Поиск производителя + $prod = $row['Производитель'] ?? $row['производитель'] ?? $row['Production'] ?? $row['production'] ?? $row['prod'] ?? 'Неизвестный'; + // Инициализация функции создания поставки - $create = function (string $_supply) use ($row, $analogs, &$created, &$updated, &$imported, $amount, $account): bool { + $create = function (string $_supply) use ($article, $row, $prod, $analogs, &$created, &$updated, &$imported, $amount, $account): bool { // Очистка $_supply = trim($_supply); - // Проверка на то, что передано пустое поле "Аналоги" (подразумевается) - if (empty($_supply)) return false; - - // Инициализация буфера документов - $_row = []; - // Инициализация статуса ошибки $error = false; + // Инициализация буфера документов + $_row = []; + // Запись артикула (каталожного номера) в буфер $_row['catn'] = $_supply; - $_row['cost'] = (float) preg_replace('/[^\d\.]+/', '', preg_replace('/\,+/', ' ', $row['Стоимость'] ?? $row['стоимость'] ?? $row['Цена'] ?? $row['цена'] ?? $row['Cost'] ?? $row['cost'] ?? $row['Price'] ?? $row['price'])); - $_row['prod'] = $row['Производитель'] ?? $row['производитель'] ?? $row['Production'] ?? $row['production'] ?? $row['prod']; + $_row['cost'] = (float) preg_replace('/[^\d\.]+/', '', preg_replace('/\,+/', ' ', $row['Стоимость'] ?? $row['стоимость'] ?? $row['Цена'] ?? $row['цена'] ?? $row['Cost'] ?? $row['cost'] ?? $row['Price'] ?? $row['price'])) ?? 0; + $_row['prod'] = $prod; $_row['oemn'] = array_walk($analogs, 'trim'); // Инициализация буфера поставки @@ -497,21 +497,57 @@ class Supply extends Product implements ProductInterface, OfferInterface // Проверка пройдена if (($_supply = $supply->validateForUniqueness($account)) instanceof static) { - // Найден документ с такими параметрами + // Найдена поставка с такими параметрами (артикул и производитель) - if ($_supply->cost === $_row['cost']) { - // Стоимость не изменилась + if ($_supply->cost !== $_row['cost']) { + // Стоимость изменилась - if ($product = Product::searchByCatn($_supply->catn)) { + if ($product = Product::searchByCatnAndProd($supply->catn, $supply->prod)) { + // Найден товар подходящий для привязки с только что созданной поставкой (подразумевается что уже был привязан в коде выше) + + // Приведение типа (для анализатора) + if (is_array($product)) $product = $product[0]; + } else { + // Не найден товар подходящий для привязки с только что созданной поставкой + + if ($product = Product::writeEmpty($supply->catn, $supply->prod, Account::isMinimalAuthorized($account))) { + // Удалось записать новый товар (НЕАКТИВНЫЙ) + + // Отправка уведомления + // Notification::_write("Не найден товар подходящий для связи с поставкой: $supply->catn", account: '@authorized'); + } else { + // Не удалось записать новый товар + + // Отправка уведомления + Notification::_write("Не удалось создать новый товар: $supply->catn", account: '@authorized'); + + // Запись статуса об ошибке + $error = true; + } + } + + // Завершение выполнения при ошибке + if ($error) return !$error; + + if ($product = Product::searchByCatnAndProd($_supply->catn, $_supply->prod)) { // Найден товар подходящий для привязки с этой поставкой for ($i = 0; $i++ < $amount;) { // Перебор создаваемых рёбер (так работает обозначение количества товаров в наличии) // Поиск ребёр - $edges = SupplyEdgeProduct::searchByVertex($supply->readId(), $product->readId(), limit: 999); + $edges = SupplyEdgeProduct::searchByVertex($_supply->readId(), $product->readId(), limit: 999); - if ($amount === count($edges)) { + if (count($edges) === 0) { + // Ребёр нет, но должны быть (если количество загружаемых поставок более нуля) + + for ($i = 0; $i++ < $amount;) { + // Перебор создаваемых рёбер (так работает обозначение количества товаров в наличии) + + // Запись ребра + SupplyEdgeProduct::write($_supply->readId(), $product->readId(), data: ['type' => 'connect']); + } + } else if ($amount === count($edges)) { // Количество товаров в поставке не изменилось // Раз изменений нет, то обновлять ничего не нужно @@ -520,7 +556,7 @@ class Supply extends Product implements ProductInterface, OfferInterface // Количество товаров в поставке стало МЕНЬШЕ // Расчёт разницы - $delete = $edges - $amount; + $delete = count($edges) - $amount; // Инициализация количества рёбер которые не удалось удалить $failed = 0; @@ -539,12 +575,12 @@ class Supply extends Product implements ProductInterface, OfferInterface } // Отправка уведомления - Notification::_write("Не удалось удалить $failed рёбер у поставки $supply->catn"); - } else if ($amount > $edges) { + Notification::_write("Не удалось удалить $failed рёбер у поставки $_supply->catn"); + } else if ($amount > count($edges)) { // Количество товаров в поставке стало БОЛЬШЕ // Расчёт разницы - $write = $amount - $edges; + $write = $amount - count($edges); // Инициализация количества рёбер которые не удалось записать $failed = 0; @@ -552,7 +588,7 @@ class Supply extends Product implements ProductInterface, OfferInterface for ($i = 0; $i < $write; $i++) { // Перебор рёбер на запись (синхронизация) - if (SupplyEdgeProduct::write($supply->readId(), $product->readId(), data: ['type' => 'connect'])) { + if (SupplyEdgeProduct::write($_supply->readId(), $product->readId(), data: ['type' => 'connect'])) { // Записано ребро } else { // Не записано ребро @@ -563,7 +599,7 @@ class Supply extends Product implements ProductInterface, OfferInterface } // Отправка уведомления - Notification::_write("Не удалось записать $failed рёбер у поставки $supply->catn"); + Notification::_write("Не удалось записать $failed рёбер у поставки $_supply->catn"); } } } @@ -602,40 +638,6 @@ class Supply extends Product implements ProductInterface, OfferInterface $imported[] = $supply; }; } - - if ($product = Product::searchByCatn($supply->catn)) { - // Найден товар подходящий для привязки с только что созданной поставкой - - // Приведение типа (для анализатора) - if (is_array($product)) $product = $product[0]; - } else { - // Не найден товар подходящий для привязки с только что созданной поставкой - - if ($product = Product::writeEmpty($supply->catn)) { - // Удалось записать новый товар (НЕАКТИВНЫЙ) - - // Отправка уведомления - // Notification::_write("Не найден товар подходящий для связи с поставкой: $supply->catn", account: '@authorized'); - } else { - // Не удалось записать новый товар - - // Отправка уведомления - Notification::_write("Не удалось создать новый товар: $supply->catn", account: '@authorized'); - - // Запись статуса об ошибке - $error = true; - } - } - - // if (isset($product->prod) && $product->prod === $supply->prod) { - // // Производитель совпадает с тем, что указан в товаре - for ($i = 0; $i++ < $amount;) { - // Перебор создаваемых рёбер (так работает обозначение количества товаров в наличии) - - // Запись ребра - SupplyEdgeProduct::write($supply->readId(), $product->readId(), data: ['type' => 'connect']); - } - // } } else { // Проверка не пройдена @@ -646,6 +648,31 @@ class Supply extends Product implements ProductInterface, OfferInterface $error = true; } + if (Account::isMinimalAuthorized($account)) { + // Авторизованный пользователь + + // Активация товара + $product->activate(); + + // Инициализация списка артикулов группы для добавления аналогов + $group = [$article] + $analogs; + + foreach ($group as $catn) { + // Перебор артикулов для добавления аналогов + + if ($targets = Product::searchByCatn($catn)) { + // Найдены товары для добавления аналогов + + foreach ($targets as $target) { + // Перебор товаров для добавления аналогов + + // Добавление в группу аналогов + $product->synchronization($target); + } + } + } + } + return !$error; }; diff --git a/mirzaev/skillparts/system/views/product/index.php b/mirzaev/skillparts/system/views/product/index.php index 48fcb1a..9b56fc9 100644 --- a/mirzaev/skillparts/system/views/product/index.php +++ b/mirzaev/skillparts/system/views/product/index.php @@ -55,7 +55,7 @@ use app\models\Product; && (yii::$app->user->identity->type === 'administrator' || yii::$app->user->identity->type === 'moderator') ) : ?> - + @@ -89,14 +89,15 @@ use app\models\Product; ) { // Инициализация артикула $catn = $model['catn']; + $prod = $model['prod']; echo <<
- - + +
HTML; @@ -119,28 +120,17 @@ use app\models\Product; && (yii::$app->user->identity->type === 'administrator' || yii::$app->user->identity->type === 'moderator')) : ?> -
- user->isGuest - && (yii::$app->user->identity->type === 'administrator' - || yii::$app->user->identity->type === 'moderator') - ) : ?> -

- -

- -
user->identity->type === 'administrator' || yii::$app->user->identity->type === 'moderator') ) : ?> -
+

-

-
+
+

-

+ -
+

-

-
+
+

-

+
@@ -176,11 +166,11 @@ use app\models\Product;

- Габариты:смxсмxсм + Габариты:смxсмxсм

- Вес:г + Вес:г

@@ -206,7 +196,7 @@ use app\models\Product; && (yii::$app->user->identity->type === 'administrator' || yii::$app->user->identity->type === 'moderator') ) : ?> -

+

@@ -220,18 +210,19 @@ use app\models\Product; ) { // Инициализация артикула $catn = $model['catn']; + $prod = $model['prod']; if (isset($model['stts']) && $model['stts'] === 'active') { // Товар активен echo <<Деактивировать + HTML; } else { // Товар неактивен, либо что-то с ним ещё echo <<Активировать + HTML; } } diff --git a/mirzaev/skillparts/system/views/product/list.php b/mirzaev/skillparts/system/views/product/list.php index 5b6f260..398c691 100644 --- a/mirzaev/skillparts/system/views/product/list.php +++ b/mirzaev/skillparts/system/views/product/list.php @@ -35,8 +35,9 @@ $timezone = $timezone[1][0];
.
- + catn ?? 'Неизвестно' ?> + (prod ?? 'Неизвестно' ?>)
diff --git a/mirzaev/skillparts/system/views/profile/panel.php b/mirzaev/skillparts/system/views/profile/panel.php index a21beac..0427fba 100644 --- a/mirzaev/skillparts/system/views/profile/panel.php +++ b/mirzaev/skillparts/system/views/profile/panel.php @@ -214,11 +214,11 @@ $timezone = $timezone[1][0];
.
-
+
catn ?? 'Неизвестно' ?> + (prod ?? 'Неизвестно' ?>)
-
- dscr ?? 'Без описания' ?> +
amnt ?? '0' ?>шт @@ -230,9 +230,9 @@ $timezone = $timezone[1][0];
- catn'" ?? null ?>);"> + catn'" ?? null ?>, prod'" ?? null ?>);"> - catn" ?>"> + prod/$product->catn" ?>"> diff --git a/mirzaev/skillparts/system/views/profile/supplies.php b/mirzaev/skillparts/system/views/profile/supplies.php index 0988f53..415ced9 100644 --- a/mirzaev/skillparts/system/views/profile/supplies.php +++ b/mirzaev/skillparts/system/views/profile/supplies.php @@ -44,7 +44,7 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
Управление складами
- + 'form_product_import_excel', diff --git a/mirzaev/skillparts/system/views/search/index.php b/mirzaev/skillparts/system/views/search/index.php index 77f3c19..fd5e1bc 100644 --- a/mirzaev/skillparts/system/views/search/index.php +++ b/mirzaev/skillparts/system/views/search/index.php @@ -49,7 +49,7 @@ use app\models\Search;
- +
@@ -72,15 +72,20 @@ use app\models\Search; // Инициализация буфера записанных аналогов $writed = []; - foreach ($empties as $catn) { - // Перебор товаров без поставок + foreach ($empties as $prod => $products) { + // Перебор поставок - // Чтение и запись asdasdas - $analogs[$catn] = Search::content(products: Product::searchAnalogs($catn)); + foreach ($products as $catn) { + // Перебор товаров - // Исключение из вывода в списке аналогов - $writed[$catn] = true; + // Чтение и запись аналогов + $analogs[$catn] = Search::content(products: Product::searchAnalogs($prod, $catn)); + + // Исключение из вывода в списке аналогов + $writed[$catn] = true; + } } + ?> @@ -101,7 +106,7 @@ use app\models\Search;
- +
diff --git a/mirzaev/skillparts/system/web/css/pages/product.css b/mirzaev/skillparts/system/web/css/pages/product.css index 1dabd69..e7dfefa 100644 --- a/mirzaev/skillparts/system/web/css/pages/product.css +++ b/mirzaev/skillparts/system/web/css/pages/product.css @@ -75,11 +75,18 @@ border: none; } -#page_product article .product_title { +#page_product article :is(product_catn, product_prod) { word-wrap: anywhere; word-break: break-all; } +#page_product article h1.product_catn { + font-size: larger; +} + +#page_product article h2.product_prod { + font-size: small; +} #page_product article .product_admin_menu { background-color: #f4f4f6; diff --git a/mirzaev/skillparts/system/web/js/product_panel.js b/mirzaev/skillparts/system/web/js/product_panel.js index 4f77238..c20d151 100644 --- a/mirzaev/skillparts/system/web/js/product_panel.js +++ b/mirzaev/skillparts/system/web/js/product_panel.js @@ -1,6 +1,6 @@ -function product_panel_title_edit(catn, element) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { - element.innerHTML = ''; +function product_panel_title_edit(catn, prod, element) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { + element.innerHTML = ''; element.removeAttribute('onclick'); @@ -10,8 +10,8 @@ function product_panel_title_edit(catn, element) { return true; }; -function product_panel_title_save(catn, element) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { +function product_panel_title_save(catn, prod, element) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { // Инициализация let text = element.children[0].value; @@ -19,10 +19,10 @@ function product_panel_title_save(catn, element) { element.innerHTML = text; // Запись аттрибута (предзагрузка) - element.setAttribute('onclick', 'return product_panel_title_edit(\'' + catn + '\', this);'); + element.setAttribute('onclick', 'return product_panel_title_edit(\'' + catn + '\', \'' + prod + '\', this);'); $.ajax({ - url: '/product/' + catn + '/edit/title', + url: '/product/' + prod + '/' + catn + '/edit/title', type: 'post', dataType: 'json', data: { @@ -40,7 +40,7 @@ function product_panel_title_save(catn, element) { element.innerHTML = data.name; // Запись аттрибута - element.setAttribute('onclick', 'return product_panel_title_edit(\'' + catn + '\', this);'); + element.setAttribute('onclick', 'return product_panel_title_edit(\'' + catn + '\', \'' + prod + '\', this);'); }; }; @@ -55,9 +55,9 @@ function product_panel_title_save(catn, element) { return true; }; -function product_panel_catn_edit(catn, element, redirect = false) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { - element.innerHTML = ''; +function product_panel_catn_edit(catn, prod, element, redirect = false) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { + element.innerHTML = ''; element.removeAttribute('onclick'); @@ -67,8 +67,8 @@ function product_panel_catn_edit(catn, element, redirect = false) { return true; }; -function product_panel_catn_save(catn, element, redirect = false) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { +function product_panel_catn_save(catn, prod, element, redirect = false) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { // Инициализация let text = element.children[0].value; @@ -76,10 +76,10 @@ function product_panel_catn_save(catn, element, redirect = false) { element.innerHTML = text; // Запись аттрибута (предзагрузка) - element.setAttribute('onclick', 'return product_panel_catn_edit(\'' + catn + '\', this);'); + element.setAttribute('onclick', 'return product_panel_catn_edit(\'' + catn + '\', \'' + prod + '\', this);'); $.ajax({ - url: '/product/' + catn + '/edit/catn', + url: '/product/' + prod + '/' + catn + '/edit/catn', type: 'post', dataType: 'json', data: { @@ -96,8 +96,49 @@ function product_panel_catn_save(catn, element, redirect = false) { return true; }; -function product_panel_dimensions_edit(catn, element, dimension) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { +function product_panel_prod_edit(catn, prod, element, redirect = false) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { + element.innerHTML = ''; + + element.removeAttribute('onclick'); + + return false; + }; + + return true; +}; + +function product_panel_prod_save(catn, prod, element, redirect = false) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { + // Инициализация + let text = element.children[0].value; + + // Обновление заголовка (предзагрузка) + element.innerHTML = text; + + // Запись аттрибута (предзагрузка) + element.setAttribute('onclick', 'return product_panel_catn_edit(\'' + catn + '\', \'' + prod + '\', this);'); + + $.ajax({ + url: '/product/' + prod + '/' + catn + '/edit/prod', + type: 'post', + dataType: 'json', + data: { + '_csrf': yii.getCsrfToken(), + 'text': text + }, + success: product_response_success, + error: product_response_error + }); + + return false; + }; + + return true; +}; + +function product_panel_dimensions_edit(catn, prod, element, dimension) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { let input = document.createElement('input'); @@ -109,7 +150,7 @@ function product_panel_dimensions_edit(catn, element, dimension) { element.replaceWith(input); - product_panel_handler_save(product_panel_dimensions_save, catn, input, dimension); + product_panel_handler_save(product_panel_dimensions_save, catn, prod, input, dimension); return false; }; @@ -117,8 +158,8 @@ function product_panel_dimensions_edit(catn, element, dimension) { return true; }; -function product_panel_dimensions_save(catn, element, dimension) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { +function product_panel_dimensions_save(catn, prod, element, dimension) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { // Инициализация let text = element.value; let span = document.createElement('span'); @@ -126,7 +167,7 @@ function product_panel_dimensions_save(catn, element, dimension) { span.setAttribute('id', element.id); span.setAttribute('class', 'ml-1 pointer-event'); span.setAttribute('role', 'button'); - span.setAttribute('onclick', 'return product_panel_dimensions_edit(\'' + catn + '\', this, \'' + dimension + '\');'); + span.setAttribute('onclick', 'return product_panel_dimensions_edit(\'' + catn + '\', \'' + prod + '\', this, \'' + dimension + '\');'); if (text.length === 0) { text = '0'; @@ -137,7 +178,7 @@ function product_panel_dimensions_save(catn, element, dimension) { element.replaceWith(span); $.ajax({ - url: '/product/' + catn + '/edit/dmns', + url: '/product/' + prod + '/' + catn + '/edit/dmns', type: 'post', dataType: 'json', data: { @@ -155,7 +196,7 @@ function product_panel_dimensions_save(catn, element, dimension) { span.innerText = data.dimension; // Запись аттрибута - span.setAttribute('onclick', 'return product_panel_dimensions_edit(\'' + catn + '\', this, \'' + dimension + '\');'); + span.setAttribute('onclick', 'return product_panel_dimensions_edit(\'' + catn + '\', \'' + prod + '\', this, \'' + dimension + '\');'); }; }; @@ -171,8 +212,8 @@ function product_panel_dimensions_save(catn, element, dimension) { }; -function product_panel_weight_edit(catn, element) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { +function product_panel_weight_edit(catn, prod, element) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { let input = document.createElement('input'); @@ -184,7 +225,7 @@ function product_panel_weight_edit(catn, element) { element.replaceWith(input); - product_panel_handler_save(product_panel_weight_save, catn, input); + product_panel_handler_save(product_panel_weight_save, catn, prod, input); return false; }; @@ -192,8 +233,8 @@ function product_panel_weight_edit(catn, element) { return true; }; -function product_panel_weight_save(catn, element) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { +function product_panel_weight_save(catn, prod, element) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { // Инициализация let text = element.value; let span = document.createElement('span'); @@ -201,7 +242,7 @@ function product_panel_weight_save(catn, element) { span.setAttribute('id', element.id); span.setAttribute('class', 'ml-1 pointer-event'); span.setAttribute('role', 'button'); - span.setAttribute('onclick', 'return product_panel_weight_edit(\'' + catn + '\', this);'); + span.setAttribute('onclick', 'return product_panel_weight_edit(\'' + catn + '\', \'' + prod + '\', this);'); if (text.length === 0) { text = '0'; @@ -212,7 +253,7 @@ function product_panel_weight_save(catn, element) { element.replaceWith(span); $.ajax({ - url: '/product/' + catn + '/edit/wght', + url: '/product/' + prod + '/' + catn + '/edit/wght', type: 'post', dataType: 'json', data: { @@ -229,7 +270,7 @@ function product_panel_weight_save(catn, element) { span.innerText = data.weight; // Запись аттрибута - span.setAttribute('onclick', 'return product_panel_weight_edit(\'' + catn + '\', this);'); + span.setAttribute('onclick', 'return product_panel_weight_edit(\'' + catn + '\', \'' + prod + '\', this);'); }; }; @@ -244,9 +285,9 @@ function product_panel_weight_save(catn, element) { return true; }; -function product_panel_description_edit(catn, element) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { - element.innerHTML = ''; +function product_panel_description_edit(catn, prod, element) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { + element.innerHTML = ''; element.removeAttribute('onclick'); @@ -256,8 +297,8 @@ function product_panel_description_edit(catn, element) { return true; }; -function product_panel_description_save(catn, element) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { +function product_panel_description_save(catn, prod, element) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { // Инициализация let text = element.children[0].value; @@ -265,10 +306,10 @@ function product_panel_description_save(catn, element) { element.innerHTML = text; // Запись аттрибута (предзагрузка) - element.setAttribute('onclick', 'return product_panel_description_edit(\'' + catn + '\', this);'); + element.setAttribute('onclick', 'return product_panel_description_edit(\'' + catn + '\', \'' + prod + '\', this);'); $.ajax({ - url: '/product/' + catn + '/edit/dscr', + url: '/product/' + prod + '/' + catn + '/edit/dscr', type: 'post', dataType: 'json', data: { @@ -285,7 +326,7 @@ function product_panel_description_save(catn, element) { element.innerHTML = data.description; // Запись аттрибута - element.setAttribute('onclick', 'return product_panel_description_edit(\'' + catn + '\', this);'); + element.setAttribute('onclick', 'return product_panel_description_edit(\'' + catn + '\', \'' + prod + '\', this);'); }; }; @@ -306,7 +347,7 @@ function product_panel_description_save(catn, element) { * @param {*} catn * @returns */ -function product_panel_connect(catn, group) { +function product_panel_connect(catn, prod, group) { if (group === null || group === '') { return false; } @@ -317,9 +358,9 @@ function product_panel_connect(catn, group) { group = prompt('Подключить аналог'); } - if (catn !== null && catn !== undefined) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined) { $.ajax({ - url: '/product/' + catn + '/connect', + url: '/product/' + prod + '/' + catn + '/connect', type: 'post', dataType: 'json', data: { @@ -343,10 +384,10 @@ function product_panel_connect(catn, group) { * @param {*} catn * @returns */ -function product_panel_disconnect(catn) { +function product_panel_disconnect(catn, prod) { if (catn !== null && catn !== undefined) { $.ajax({ - url: '/product/' + catn + '/disconnect', + url: '/product/' + prod + '/' + catn + '/disconnect', type: 'post', dataType: 'json', data: { @@ -363,10 +404,10 @@ function product_panel_disconnect(catn) { return true; } -function product_panel_delete(catn) { - if (catn !== null && catn !== undefined) { +function product_panel_delete(catn, prod) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined) { $.ajax({ - url: '/product/' + catn + '/delete', + url: '/product/' + prod + '/' + catn + '/delete', type: 'post', dataType: 'json', data: { @@ -382,8 +423,8 @@ function product_panel_delete(catn) { return true; } -function product_panel_images_write(catn, element) { - if (catn !== null && catn !== undefined && element !== null && element !== undefined) { +function product_panel_images_write(catn, prod, element) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { // Инициализация let data = new FormData(); @@ -393,7 +434,7 @@ function product_panel_images_write(catn, element) { }; $.ajax({ - url: '/product/' + catn + '/write/image', + url: '/product/' + prod + '/' + catn + '/write/image', type: 'post', dataType: 'json', processData: false, @@ -409,10 +450,10 @@ function product_panel_images_write(catn, element) { return true; }; -function product_panel_images_delete(catn, index) { - if (catn !== null && catn !== undefined && index !== null && index !== undefined) { +function product_panel_images_delete(catn, prod, index) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && index !== null && index !== undefined) { $.ajax({ - url: '/product/' + catn + '/delete/image', + url: '/product/' + prod + '/' + catn + '/delete/image', type: 'post', dataType: 'json', data: { @@ -429,10 +470,10 @@ function product_panel_images_delete(catn, index) { return true; }; -function product_panel_images_cover_write(catn, index) { - if (catn !== null && catn !== undefined && index !== null && index !== undefined) { +function product_panel_images_cover_write(catn, prod, index) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && index !== null && index !== undefined) { $.ajax({ - url: '/product/' + catn + '/write/cover', + url: '/product/' + prod + '/' + catn + '/write/cover', type: 'post', dataType: 'json', data: { @@ -449,11 +490,11 @@ function product_panel_images_cover_write(catn, index) { return true; }; -function product_panel_handler_save(save, catn, element, ...vars) { +function product_panel_handler_save(save, catn, prod, element, ...vars) { if (save !== undefined && save !== null) { let product_panel_handler_save_function = function (event) { if (event.target.id !== element.id) { - save(catn, element, ...vars); + save(catn, prod, element, ...vars); document.body.removeEventListener('click', product_panel_handler_save_function, true); }; }; @@ -462,10 +503,10 @@ function product_panel_handler_save(save, catn, element, ...vars) { }; }; -function product_panel_product_stts(catn, stts) { - if (catn !== null && catn !== undefined && stts !== null && stts !== undefined) { +function product_panel_product_stts(catn, prod, stts) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && stts !== null && stts !== undefined) { $.ajax({ - url: '/product/' + catn + '/status', + url: '/product/' + prod + '/' + catn + '/status', type: 'post', dataType: 'json', data: { diff --git a/mirzaev/skillparts/system/web/js/profile_panel.js b/mirzaev/skillparts/system/web/js/profile_panel.js index f272088..eda0324 100644 --- a/mirzaev/skillparts/system/web/js/profile_panel.js +++ b/mirzaev/skillparts/system/web/js/profile_panel.js @@ -707,13 +707,11 @@ function profile_panel_input_suppliers_requests_block_decline(_key, reason) { /** * Создание товара */ -function profile_panel_input_suppliers_accounts_create_product(button, _key) { - if (_key === undefined) { - return false; - } +function profile_panel_input_suppliers_accounts_create_product(button, catn, prod) { + if (catn === undefined || prod === undefined) return false; $.ajax({ - url: `/product/${_key}/write`, + url: `/product/${prod}/${catn}/write`, type: 'post', dataType: 'json', data: { @@ -722,13 +720,13 @@ function profile_panel_input_suppliers_accounts_create_product(button, _key) { success: (data, status, xhr) => { if (data.catn !== undefined) { // Реинициализация кнопки создания товара - button.href = `/product/${_key}`; + button.href = `/product/${prod}/${catn}`; button.onclick = null; button.classList.remove('icon_red'); button.classList.add('text-dark'); button.title = 'Товар создан'; - product_panel_connect(_key, prompt('Подключить аналог (пусто - не подключать)')); + product_panel_connect(catn, prod, prompt('Подключить аналог (пусто - не подключать)')); } return page_profile_response_success(data, status, xhr);