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')
- ) : ?>
-
= $model['prod'] ?? 'Без названия' ?>
-
- = $model['prod'] ?? 'Без названия' ?>
-
-
user->identity->type === 'administrator'
|| yii::$app->user->identity->type === 'moderator')
) : ?>
-
+
= $model['catn'] ?? '' ?>
-
-
+
+
= $model['prod'] ?? 'Неизвестно' ?>
-
+
-
+
= $model['catn'] ?>
-
-
+
+
= $model['prod'] ?? 'Неизвестно' ?>
-
+
@@ -176,11 +166,11 @@ use app\models\Product;
- Габариты:= empty($model['dmns']['x']) ? '0' : $model['dmns']['x'] ?>смx= empty($model['dmns']['y']) ? '0' : $model['dmns']['y'] ?>смx= empty($model['dmns']['z']) ? '0' : $model['dmns']['z'] ?>см
+ Габариты:= empty($model['dmns']['x']) ? '0' : $model['dmns']['x'] ?>смx= empty($model['dmns']['y']) ? '0' : $model['dmns']['y'] ?>смx= empty($model['dmns']['z']) ? '0' : $model['dmns']['z'] ?>см
- Вес:= empty($model['wght']) ? '0' : $model['wght'] ?>г
+ Вес:= empty($model['wght']) ? '0' : $model['wght'] ?>г
@@ -206,7 +196,7 @@ use app\models\Product;
&& (yii::$app->user->identity->type === 'administrator'
|| yii::$app->user->identity->type === 'moderator')
) : ?>
- = $model['dscr'] ?? 'Без описания' ?>
+ = $model['dscr'] ?? 'Без описания' ?>
= $model['prod'] ?? 'Без описания' ?>
@@ -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];
= ++$amount ?>.
-
+
= $product->catn ?? 'Неизвестно' ?>
+ (= $product->prod ?? 'Неизвестно' ?>)
= $create ?? 'Неизвестно' ?>
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];
= ++$amount ?>.
-
+
= $supply->catn ?? 'Неизвестно' ?>
+ (= $product->prod ?? 'Неизвестно' ?>)
-
- = $supply->dscr ?? 'Без описания' ?>
+
= $supply->amnt ?? '0' ?>шт
@@ -230,9 +230,9 @@ $timezone = $timezone[1][0];
= $create ?? 'Неизвестно' ?>
-
catn'" ?? null ?>);">
+
catn'" ?? null ?>, = "'$supply->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;
-
+
= $catn ?>
= $prod ?>
@@ -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;
-
+
= $catn ?>
= $prod ?>
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);