From 7a4f12aa948703ff4fe903e12468eb2dca3efcec Mon Sep 17 00:00:00 2001 From: Arsen Mirzaev Tatyano-Muradovich Date: Tue, 14 Dec 2021 14:29:38 +1000 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skillparts/system/config/web.php.example | 2 +- .../system/controllers/ProductController.php | 320 +++++++++++------- .../system/controllers/ProfileController.php | 85 ++++- mirzaev/skillparts/system/models/Edge.php | 2 +- mirzaev/skillparts/system/models/Product.php | 15 + mirzaev/skillparts/system/models/Supply.php | 32 ++ .../skillparts/system/views/profile/panel.php | 4 +- .../system/views/profile/supplies.php | 7 +- .../skillparts/system/web/js/product_panel.js | 27 +- mirzaev/skillparts/system/web/js/profile.js | 67 ++-- .../skillparts/system/web/js/profile_panel.js | 39 +++ 11 files changed, 437 insertions(+), 163 deletions(-) diff --git a/mirzaev/skillparts/system/config/web.php.example b/mirzaev/skillparts/system/config/web.php.example index 2c56453..d3e408a 100644 --- a/mirzaev/skillparts/system/config/web.php.example +++ b/mirzaev/skillparts/system/config/web.php.example @@ -99,7 +99,7 @@ $config = [ '<_key:[0-9]+>/files/' => 'account/file', '<_key:[0-9]+>/' => 'account/', 'product/' => 'product/index', - 'product//' => 'product/', + 'product//' => 'product/', '///' => '
/-', 'profile/geolocation/' => 'profile/geolocation-', 'profile/panel///' => 'profile/panel---', diff --git a/mirzaev/skillparts/system/controllers/ProductController.php b/mirzaev/skillparts/system/controllers/ProductController.php index bf0beda..3596f79 100644 --- a/mirzaev/skillparts/system/controllers/ProductController.php +++ b/mirzaev/skillparts/system/controllers/ProductController.php @@ -12,32 +12,11 @@ use yii\web\HttpException; use yii\web\UploadedFile; use app\models\Product; -use app\models\ProductEdgeProduct; +use app\models\SupplyEdgeProduct; +use app\models\Supply; class ProductController extends Controller { - - - - - - - - - - - - - - - - - - - - - - public function actionIndex(string $catn): array|string|null { if ($model = Product::searchByCatn($catn)) { @@ -61,6 +40,206 @@ class ProductController extends Controller } } + /** + * Запись товара + * + * @param string $catn Артикул + */ + public function actionWrite(string $catn): array|string|null + { + // Инициализация буфера ответа + $return = [ + '_csrf' => yii::$app->request->getCsrfToken() + ]; + + if (empty($catn)) { + // Не получен артикул + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Переход в конец алгоритма + goto end; + } + + if ($product = Product::searchByCatn($catn)) { + // Найден товар + + if (SupplyEdgeProduct::searchByVertex(Supply::searchByCatn($catn)->readId(), $product->readId(), filter: ['type' => 'connect'])) { + // Удалось найти ребро: ПОСТАВКА -> ТОВАР + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Запись в буфер возврата + $return['alert'] = "Товар и связь с поставкой уже существует: $catn"; + + // Переход в конец алгоритма + goto end; + } else { + // Не удалось найти ребро: ПОСТАВКА -> ТОВАР + + if (SupplyEdgeProduct::write(Supply::searchByCatn($catn)->readId(), $product->readId(), data: ['type' => 'connect'])) { + // Удалось создать ребро: ПОСТАВКА -> ТОВАР + + $return['alert'] = "Товар уже существовал, связь с поставкой записана: $catn"; + $return['catn'] = $catn; + } else { + // Не удалось создать ребро: ПОСТАВКА -> ТОВАР + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Запись в буфер возврата + $return['alert'] = "Товар уже существует, попытка связать с поставкой не удалась: $catn"; + } + } + } else { + // Не найден товар + + if ($product = Product::writeEmpty($catn)) { + // Удалось записать товар + + if (SupplyEdgeProduct::write(Supply::collectionName() . "/$catn", $product->readId(), data: ['type' => 'connect'])) { + // Удалось создать ребро: ПОСТАВКА -> ТОВАР + + $return['alert'] = "Товар и связь с поставкой записаны: $catn"; + $return['catn'] = $catn; + } else { + // Не удалось создать ребро: ПОСТАВКА -> ТОВАР + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Запись в буфер возврата + $return['alert'] = "Удалось создать товар, но не удалось связать с поставкой: $catn"; + } + } else { + // Не удалось записать товар + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Запись в буфер возврата + $return['alert'] = "Не удалось записать товар: $catn"; + } + } + + /** + * Конец алгоритма + */ + end: + + if (yii::$app->request->isPost) { + // POST-запрос + + // Запись типа тела ответа + yii::$app->response->format = Response::FORMAT_JSON; + + return $return; + } + + // Переадресация на главную страницу + return $this->redirect("/"); + } + + /** + * Удаление товара + * + * @param string $catn Артикул + */ + public function actionDelete(string $catn): array|string|null + { + // Инициализация буфера ответа + $return = [ + '_csrf' => yii::$app->request->getCsrfToken() + ]; + + if (empty($catn)) { + // Не получен артикул + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Переход в конец алгоритма + goto end; + } + + if ($product = Product::searchByCatn($catn)) { + // Товар найден + + if ($product->disconnect()) { + // Отсоединён от аналогов + + if ($product->delete() > 0) { + // Удалён + + // Запись в буфер возврата + $return['alert'] = "Товар удалён: $catn"; + $return['location'] = '/'; + } else { + // Не удалось удалить + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Запись в буфер возврата + $return['alert'] = "Не удалось удалить товар: $catn"; + + // Переход в конец алгоритма + goto end; + } + } else { + // Не отсоединён от аналогов + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Запись в буфер возврата + $return['alert'] = "Не удалось отсоединить от аналогов перед удалением: $catn"; + + // Переход в конец алгоритма + goto end; + } + } else { + // Не найден товар + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Запись в буфер возврата + $return['alert'] = "Не удалось найти товар: $catn"; + + // Переход в конец алгоритма + goto end; + } + + /** + * Конец алгоритма + */ + end: + + if (yii::$app->request->isPost) { + // POST-запрос + + yii::$app->response->format = Response::FORMAT_JSON; + + return $return; + } + + if (Product::searchByCatn($catn)) { + // Обрабатываемый товар ещё существует (подразумевается, что произошла ошибка) + + // Возврат на страницу товара + return $this->redirect("/product/$catn"); + } else { + // Обрабатываемый товар не существует (подразумевается, что он успешно удалён) + + // Переадресация на главную страницу + return $this->redirect("/"); + } + } + /** * Подключение аналога * @@ -238,101 +417,6 @@ class ProductController extends Controller } } - /** - * Отключение аналога - * - * @param string $catn Артикул - */ - public function actionDelete(string $catn): array|string|null - { - // Инициализация буфера ответа - $return = [ - '_csrf' => yii::$app->request->getCsrfToken() - ]; - - if (empty($catn)) { - // Не получен артикул - - // Запись кода ответа - yii::$app->response->statusCode = 500; - - // Переход в конец алгоритма - goto end; - } - - if ($product = Product::searchByCatn($catn)) { - // Товар найден - - if ($product->disconnect()) { - // Отсоединён от аналогов - - if ($product->delete() > 0) { - // Удалён - - // Запись в буфер возврата - $return['alert'] = "Товар удалён: $catn"; - $return['location'] = '/'; - } else { - // Не удалось удалить - - // Запись кода ответа - yii::$app->response->statusCode = 500; - - // Запись в буфер возврата - $return['alert'] = "Не удалось удалить товар: $catn"; - - // Переход в конец алгоритма - goto end; - } - } else { - // Не отсоединён от аналогов - - // Запись кода ответа - yii::$app->response->statusCode = 500; - - // Запись в буфер возврата - $return['alert'] = "Не удалось отсоединить от аналогов перед удалением: $catn"; - - // Переход в конец алгоритма - goto end; - } - } else { - // Запись кода ответа - yii::$app->response->statusCode = 500; - - // Запись в буфер возврата - $return['alert'] = "Не удалось найти товар: $catn"; - - // Переход в конец алгоритма - goto end; - } - - /** - * Конец алгоритма - */ - end: - - if (yii::$app->request->isPost) { - // POST-запрос - - yii::$app->response->format = Response::FORMAT_JSON; - - return $return; - } - - if (Product::searchByCatn($catn)) { - // Обрабатываемый товар ещё существует (подразумевается, что произошла ошибка) - - // Возврат на страницу товара - return $this->redirect("/product/$catn"); - } else { - // Обрабатываемый товар не существует (подразумевается, что он успешно удалён) - - // Переадресация на главную страницу - return $this->redirect("/"); - } - } - public function actionEditTitle(string $catn): array|string|null { // Инициализация diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php index 7377d67..ffbb421 100644 --- a/mirzaev/skillparts/system/controllers/ProfileController.php +++ b/mirzaev/skillparts/system/controllers/ProfileController.php @@ -450,33 +450,90 @@ class ProfileController extends Controller $supply = new Supply(yii::$app->request->post('Supply') ?? yii::$app->request->get('Supply')); $supply->scenario = $supply::SCENARIO_IMPORT_EXCEL; $panel = yii::$app->request->post('panel') ?? yii::$app->request->get('panel'); + $help = (bool) (yii::$app->request->post('help') ?? yii::$app->request->get('help')); + $target = yii::$app->request->post('account') ?? yii::$app->request->get('account'); + $number = yii::$app->request->post('number') ?? yii::$app->request->get('number'); $sidebar = $this->renderPartial('sidebar'); $groups = self::readGroups(); if (yii::$app->request->isPost) { // AJAX-POST-запрос - // Настройка ответа + // Запись типа тела ответа yii::$app->response->format = Response::FORMAT_JSON; - // Инициализация файлов - $supply->file_excel_1 = UploadedFile::getInstance($supply, 'file_excel_1'); - $supply->file_excel_2 = UploadedFile::getInstance($supply, 'file_excel_2'); - $supply->file_excel_3 = UploadedFile::getInstance($supply, 'file_excel_3'); + if ($help) { + // Запрошена отправка прайса модератору + + // Отправка письма модераторам + $mail = Supply::sendMailForImport('ЗАГРУЗИТЬ ФАЙЛ НА СЕРВЕР НАДО'); - if ($supply->importExcel()) { return [ - 'main' => $this->renderPartial('supplies', compact( - 'supply', - 'groups', - 'sidebar', - 'panel' - )), - '_csrf' => yii::$app->request->getCsrfToken() + '_csrf' => yii::$app->request->getCsrfToken(), + 'alert' => $mail ? 'Письмо с запросом отправлено' : 'Не удалось отправить письмо, свяжитесь с модерацией напрямую через контактные данные в нижней части сайта' ]; } - yii::$app->response->statusCode = 409; + if (!empty($target)) { + // Получен аккаунт для которого необходимо загрузить каталог + + if (empty($number)) { + // Не получен номер раздела в который надо загружать каталог + + return [ + '_csrf' => yii::$app->request->getCsrfToken(), + 'alert' => 'Не получен номер раздела в который надо загружать каталог' + ]; + } + + if (Account::isMinimalAuthorized()) { + // Авторизован доступ к выполнению этого действия + + $supply->{"file_excel_$number"} = UploadedFile::getInstance($supply, 'file_excel'); + + if ($supply->importExcel($target)) { + return [ + 'main' => $this->renderPartial('supplies', compact( + 'supply', + 'groups', + 'sidebar', + 'panel' + )), + '_csrf' => yii::$app->request->getCsrfToken() + ]; + } + + yii::$app->response->statusCode = 409; + } else { + // Не авторизован доступ к выполнению этого действия + + return [ + '_csrf' => yii::$app->request->getCsrfToken(), + 'alert' => 'Вы не имеете разрешения на выполнение этого действия' + ]; + } + } else { + // Не получен аккаунт для которого необходимо загрузить каталог + + // Инициализация файлов + $supply->file_excel_1 = UploadedFile::getInstance($supply, 'file_excel_1'); + $supply->file_excel_2 = UploadedFile::getInstance($supply, 'file_excel_2'); + $supply->file_excel_3 = UploadedFile::getInstance($supply, 'file_excel_3'); + + if ($supply->importExcel()) { + return [ + 'main' => $this->renderPartial('supplies', compact( + 'supply', + 'groups', + 'sidebar', + 'panel' + )), + '_csrf' => yii::$app->request->getCsrfToken() + ]; + } + + yii::$app->response->statusCode = 409; + } } return $this->render('supplies', compact( diff --git a/mirzaev/skillparts/system/models/Edge.php b/mirzaev/skillparts/system/models/Edge.php index 0314c34..7e849d8 100644 --- a/mirzaev/skillparts/system/models/Edge.php +++ b/mirzaev/skillparts/system/models/Edge.php @@ -106,7 +106,7 @@ abstract class Edge extends Document * * @param string $_from Идентификатор отправителя (_id) * @param string $_from Идентификатор получетеля (_id) - * @param string $type Дополнительное поле - тип взаимосвязи + * @param string $type Дополнительное поле - тип взаимосвязи @deprecated * @param string $data Дополнительные данные * * @todo diff --git a/mirzaev/skillparts/system/models/Product.php b/mirzaev/skillparts/system/models/Product.php index adeb660..1e425d7 100644 --- a/mirzaev/skillparts/system/models/Product.php +++ b/mirzaev/skillparts/system/models/Product.php @@ -49,16 +49,31 @@ class Product extends Document /** * Файл .excel для импорта товаров + * + * Универсальный, когда неизвестно на какую позицию загружать каталог + * + * @todo Избавиться от свойств и сделать бесконечное количество места под новые каталоги + */ + public Excel|UploadedFile|string|null $file_excel = null; + + /** + * Файл .excel для импорта товаров + * + * @todo Избавиться от свойств и сделать бесконечное количество места под новые каталоги */ public Excel|UploadedFile|string|null $file_excel_1 = null; /** * Файл .excel для импорта товаров + * + * @todo Избавиться от свойств и сделать бесконечное количество места под новые каталоги */ public Excel|UploadedFile|string|null $file_excel_2 = null; /** * Файл .excel для импорта товаров + * + * @todo Избавиться от свойств и сделать бесконечное количество места под новые каталоги */ public Excel|UploadedFile|string|null $file_excel_3 = null; diff --git a/mirzaev/skillparts/system/models/Supply.php b/mirzaev/skillparts/system/models/Supply.php index 6c4a975..ae8a4ac 100644 --- a/mirzaev/skillparts/system/models/Supply.php +++ b/mirzaev/skillparts/system/models/Supply.php @@ -514,6 +514,15 @@ class Supply extends Product implements ProductInterface, OfferInterface $imported[] = $supply; }; } + + if (Product::searchByCatn($supply->catn)) { + // Найден товар подходящий для привязки с только что созданной поставкой + } else { + // Не найден товар подходящий для привязки с только что созданной поставкой + + // Отправка уведомления + Notification::_write("Не найден товар подходящий для связи с поставкой: $supply->catn", account: '@authorized'); + } } else { // Проверка не пройдена @@ -901,4 +910,27 @@ class Supply extends Product implements ProductInterface, OfferInterface return $limit === 1 ? $edge[0] ?? null : $edge; } } + + /** + * Отправить письмо модератору с просьбой обработать и загрузить прайс + * + * @param string $file Ссылка на скачивание файла с каталогом + * @param Account|int|null $account Аккаунт на который загружать каталог + * + * @return bool + */ + public static function sendMailForImport(string $file, Account|int|null $account = null): bool + { + return false; + + // Отправка письма + yii::$app->mail_system->compose() + ->setFrom(yii::$app->params['mail']['system']) + ->setTo(yii::$app->params['mail']['info']) + ->setSubject('Запрос на обработку каталога') + ->setHtmlBody(yii::$app->controller->renderPartial('/mails/import', ['file' => $file, 'account' => Account::initAccount($account)])) + ->send(); + + return false; + } } diff --git a/mirzaev/skillparts/system/views/profile/panel.php b/mirzaev/skillparts/system/views/profile/panel.php index 6e0740f..ff75e1c 100644 --- a/mirzaev/skillparts/system/views/profile/panel.php +++ b/mirzaev/skillparts/system/views/profile/panel.php @@ -262,7 +262,7 @@ $timezone = $timezone[1][0]; - + catn'" ?? null ?>);"> catn" ?>"> @@ -350,6 +350,8 @@ $timezone = $timezone[1][0]; + +