From 8c538729553817bb4d7adfac147fde4d00f18293 Mon Sep 17 00:00:00 2001 From: Arsen Mirzaev Tatyano-Muradovich Date: Wed, 22 Sep 2021 11:38:53 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BD=D1=8F=D1=82=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B8=20=D0=BE=D1=82=D0=BA=D0=B0=D0=B7=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skillparts/system/config/web.php.example | 4 + .../system/controllers/AccountController.php | 210 +++++++++++++++++- .../system/controllers/ProfileController.php | 2 - .../controllers/SuppliersController.php | 14 +- mirzaev/skillparts/system/models/Account.php | 52 +++-- .../skillparts/system/models/Notification.php | 10 +- mirzaev/skillparts/system/models/Product.php | 50 ++--- .../system/views/mails/suppliers/decline.php | 17 ++ .../skillparts/system/views/mails/verify.php | 1 + .../system/views/notification/popup.php | 5 +- .../notification/system/suppliers/request.php | 1 + mirzaev/skillparts/system/web/css/main.css | 19 +- .../skillparts/system/web/js/profile_panel.js | 139 ++++++++++-- 13 files changed, 426 insertions(+), 98 deletions(-) create mode 100644 mirzaev/skillparts/system/views/mails/suppliers/decline.php create mode 100644 mirzaev/skillparts/system/views/notification/system/suppliers/request.php diff --git a/mirzaev/skillparts/system/config/web.php.example b/mirzaev/skillparts/system/config/web.php.example index e4609c9..ab12655 100644 --- a/mirzaev/skillparts/system/config/web.php.example +++ b/mirzaev/skillparts/system/config/web.php.example @@ -94,6 +94,10 @@ $config = [ 'class' => 'yii\rest\UrlRule', 'controller' => 'main' ], + '<_key:[0-9]+>' => 'account/index', + '<_key:[0-9]+>//' => 'account/', + '<_key:[0-9]+>/files/' => 'account/file', + '<_key:[0-9]+>/' => 'account/', 'product/' => 'product/index', '///' => '
/-', 'profile/geolocation/' => 'profile/geolocation-', diff --git a/mirzaev/skillparts/system/controllers/AccountController.php b/mirzaev/skillparts/system/controllers/AccountController.php index a6155a4..ffbe8f4 100644 --- a/mirzaev/skillparts/system/controllers/AccountController.php +++ b/mirzaev/skillparts/system/controllers/AccountController.php @@ -7,6 +7,7 @@ namespace app\controllers; use yii; use yii\web\Controller; use yii\web\Response; +use yii\web\Cookie; use yii\filters\AccessControl; use app\models\Account; @@ -19,14 +20,36 @@ class AccountController extends Controller 'access' => [ 'class' => AccessControl::class, 'rules' => [ + [ + 'allow' => true, + 'actions' => [ + 'file' + ] + ], [ 'allow' => true, 'roles' => ['@'], 'actions' => [ 'index', 'edit', + 'regenerate' ] ], + [ + 'allow' => true, + 'actions' => ['accept', 'decline'], + 'matchCallback' => function ($rule, $action): bool { + if ( + !yii::$app->user->isGuest + && (yii::$app->user->identity->type === 'administrator' + || yii::$app->user->identity->type === 'moderator') + ) { + return true; + } + + return false; + } + ], [ 'allow' => false, 'roles' => ['?'], @@ -72,6 +95,130 @@ class AccountController extends Controller return $this->renderPartial('/accounts/index'); } + /** + * Подтверждение + * + * @param int $_key Идентификатор аккаунта + */ + public function actionAccept(string $_key) + { + if (yii::$app->user->isGuest) { + // Аккаунт не аутентифицирован + } else { + if (yii::$app->request->isPost) { + // AJAX-POST-запрос + + if ( + yii::$app->user->identity->type === 'administrator' + || yii::$app->user->identity->type === 'moderator' + ) { + // Запрос произведен уполномоченным + + if ($account = Account::searchById(Account::collectionName() . '/' . $_key)) { + // Аккаунт найден + + $account->type = 'user'; + + if ($account->update() > 0) { + // Удалось перезаписать данные в хранилище + + // Запись в журнал + $account->journal('accepted into suppliers'); + + // Отправка письма с подтверждением аккаунта + $account->sendMailVerify(); + + // Настройка формата ответа + yii::$app->response->format = Response::FORMAT_JSON; + + return true; + } + } + } + } + } + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + return false; + } + + /** + * Отказ + * + * @param int $_key Идентификатор аккаунта + */ + public function actionDecline(string $_key) + { + if (yii::$app->user->isGuest) { + // Аккаунт не аутентифицирован + } else { + if (yii::$app->request->isPost) { + // AJAX-POST-запрос + + if ( + yii::$app->user->identity->type === 'administrator' + || yii::$app->user->identity->type === 'moderator' + ) { + // Запрос произведен уполномоченным + + if ($account = Account::searchById(Account::collectionName() . '/' . $_key)) { + // Аккаунт найден + + // Отправка письма с отказом и причиной + $account->sendMailDecline(yii::$app->request->post('reason') ?? yii::$app->request->get('reason')); + + // Настройка формата ответа + yii::$app->response->format = Response::FORMAT_JSON; + + // Удаление аккаунта + return $account->delete() > 0; + } + } + } + } + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + return false; + } + + /** + * Запрос файла + * + * @param int $_key Идентификатор аккаунта + * @param string $file Путь до файла от каталога аккаунта + */ + public function actionFile(string $_key, string $file) + { + // Инициализация файла + $file = YII_PATH_PUBLIC . "/../assets/accounts/$_key/files/$file"; + + if (file_exists($file)) { + // Удалось найти файл + + return $this->response->sendFile($file); + } else { + // Не удалось найти файл + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + // Перенаправление на страницу аккаунта + return yii::$app->response->redirect("/$_key"); + } + } + + /** + * Редактирование параметра + * + * @param int $_key + * @param string $target + * + * @return void + */ public function actionEdit(int $_key, string $target) { if (yii::$app->user->isGuest) { @@ -80,16 +227,69 @@ class AccountController extends Controller if (yii::$app->request->isPost) { // AJAX-POST-запрос + if ( + $_key === yii::$app->user->identity->_key || + (yii::$app->user->identity->type === 'administrator' + || yii::$app->user->identity->type === 'moderator') + ) { + // Запрос произведен с изменяемого аккаунта, либо уполномоченным + + if ($account = Account::searchById(Account::collectionName() . '/' . $_key)) { + // Аккаунт найден + + // Запись параметра + $account->{$target} = yii::$app->request->post('value') ?? yii::$app->request->get('value') ?? 'Неизвестно'; + + // Настройка формата ответа + yii::$app->response->format = Response::FORMAT_JSON; + + return $account->update() > 0; + } + } + } + } + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + return false; + } + + /** + * Регенерация параметра + * + * @param int $_key + * @param string $target + * @return void + */ + public function actionRegenerate(int $_key, string $target) + { + if (yii::$app->user->isGuest) { + // Аккаунт не аутентифицирован + } else { + if (yii::$app->request->isPost) { + // AJAX-POST-запрос + if ($account = Account::searchById(Account::collectionName() . '/' . $_key)) { // Аккаунт найден - // Запись параметра - $account->{$target} = yii::$app->request->post('value') ?? yii::$app->request->get('value') ?? 'Неизвестно'; + if ( + $account->_key === yii::$app->user->identity->_key || + (yii::$app->user->identity->type === 'administrator' + || yii::$app->user->identity->type === 'moderator') + ) { + // Запрос произведен с изменяемого аккаунта, либо уполномоченным - // Настройка формата ответа - yii::$app->response->format = Response::FORMAT_JSON; + if ($target === 'indx') { + // Запрошена регенерация индекса - return $account->update() > 0; + // Настройка формата ответа + yii::$app->response->format = Response::FORMAT_JSON; + + // Регенерация индекса + return Account::generateIndexes([$account], force: true); + } + } } } } diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php index 59ef208..d655aa3 100644 --- a/mirzaev/skillparts/system/controllers/ProfileController.php +++ b/mirzaev/skillparts/system/controllers/ProfileController.php @@ -703,8 +703,6 @@ class ProfileController extends Controller */ public static function syncGeolocationWithDellin(Account|int|null $account = null): bool { - Account::initForController($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/controllers/SuppliersController.php b/mirzaev/skillparts/system/controllers/SuppliersController.php index 7f98ad5..887e845 100644 --- a/mirzaev/skillparts/system/controllers/SuppliersController.php +++ b/mirzaev/skillparts/system/controllers/SuppliersController.php @@ -34,13 +34,13 @@ class SuppliersController extends Controller // Запись поставщика Account::writeSupplier($request['name'], $request['phon'], $request['mail'], $file = UploadedFile::getInstance(new Request($request), 'file')); - // yii::$app->mail_system->compose() - // ->setFrom(yii::$app->params['mail']['system']) - // ->setTo(yii::$app->params['mail']['info']) - // ->setSubject('Регистрация поставщика') - // ->setHtmlBody($this->renderPartial('/mails/supplier', $request)) - // ->attach($file->tempName, ['fileName' => $file->name]) - // ->send(); + yii::$app->mail_system->compose() + ->setFrom(yii::$app->params['mail']['system']) + ->setTo(yii::$app->params['mail']['info']) + ->setSubject('Регистрация поставщика') + ->setHtmlBody($this->renderPartial('/mails/supplier', $request)) + ->attach($file->tempName, ['fileName' => $file->name]) + ->send(); return $this->renderPartial('/suppliers/requested'); } diff --git a/mirzaev/skillparts/system/models/Account.php b/mirzaev/skillparts/system/models/Account.php index 2fb68bd..86a6b34 100644 --- a/mirzaev/skillparts/system/models/Account.php +++ b/mirzaev/skillparts/system/models/Account.php @@ -565,11 +565,11 @@ class Account extends Document implements IdentityInterface, PartnerInterface * Генерация псевдоанонимных индексов * * @param [int] $accounts Массив аккаунтов - * @param bool $init Параметр обозначающий изменение только для тех у кого ранее идентификатор задан не был (без перезаписи) + * @param bool $force Перезаписывать, если существует * * @return int Количество успешно обработанных аккаунтов */ - public static function generateIndexes(array $accounts, bool $init = true): int + public static function generateIndexes(array $accounts, bool $force = false): int { // Инициализация $amount = 0; @@ -597,14 +597,14 @@ class Account extends Document implements IdentityInterface, PartnerInterface foreach ($accounts as $account) { // Перебор запрошенных аккаунтов - if (($init && empty($account->indx)) || !$init) { - // Запись только тех аккаунтов у кого не инициализирован индекс или если указано отсутствие проверки + if ($force || empty($account->indx)) { + // Запись только тех аккаунтов у кого не инициализирован индекс, либо если указана перезапись // Повтор генерации regenerate_index: // Генерация - $account->indx = $int_to_string(random_int(0, 29)) . $int_to_string(random_int(0, 29)) . $int_to_string(random_int(0, 29)); + $account->indx = $int_to_string(random_int(0, 27)) . $int_to_string(random_int(0, 27)) . $int_to_string(random_int(0, 27)); if (in_array($account->indx, $registry)) { // Сгенерированный индекс обнаружено в реестре запрещённых индексов @@ -703,6 +703,19 @@ class Account extends Document implements IdentityInterface, PartnerInterface return false; } + public function sendMailDecline(string $reason = 'Проблема с данными'): bool + { + // Отправка письма + yii::$app->mail_system->compose() + ->setFrom(yii::$app->params['mail']['system']) + ->setTo($this->mail) + ->setSubject('Отказано в регистрации') + ->setHtmlBody(yii::$app->controller->renderPartial('/mails/suppliers/decline', ['reason' => $reason])) + ->send(); + + return false; + } + /** * Инициализация пароля */ @@ -714,10 +727,11 @@ class Account extends Document implements IdentityInterface, PartnerInterface // Генерация пароля $this->pswd = self::passwordGenerate(); - // Сохранение и возврат - return $this->update() > 1; + // Возврат + return true; } + // Возврат (подразумевается неудача) return false; } @@ -825,6 +839,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface // Настройка $account->agnt = true; $account->name = $name; + $account->boss = $name; $account->simc = $phone; $account->mail = $mail; $account->type = 'requested'; @@ -832,16 +847,16 @@ class Account extends Document implements IdentityInterface, PartnerInterface // Генерация пароля $account->passwordInit(); - // Инициализация индекса - Account::generateIndexes([$account]); - if ($account->save()) { // Удалось сохранить аккаунт - if (!file_exists($dir = YII_PATH_PUBLIC . '/../assets/accounts/' . $account->_key . '/documents')) { + // Инициализация индекса + Account::generateIndexes([$account]); + + if (!file_exists($path = YII_PATH_PUBLIC . "/../assets/accounts/$account->_key/files")) { // Директория для хранения документов не найдена - if (!mkdir($dir, 0775, true)) { + if (!mkdir($path, 0775, true)) { // Не удалось записать директорию return false; @@ -849,15 +864,22 @@ class Account extends Document implements IdentityInterface, PartnerInterface } // Перенос файла из временной директории - copy($file->tempName, $file2 = $dir . '/' . $file->name); + copy($file->tempName, $path .= "/$file->name"); + // Запись в журнал $account->journal('request to become a supplier', [ 'name' => $name, 'phone' => $phone, 'mail' => $mail, - 'file' => $file2 + 'file' => [ + 'path' => $path, + 'uri' => "/$account->_key/files/$file->name" + ] ]); + // Отправка уведомлений + Notification::_write(yii::$app->controller->renderPartial('/notification/system/suppliers/request', ['_key' => $account->_key]), html: true, account: '@authorized'); + return $account; } @@ -871,7 +893,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface */ public static function searchSuppliersRequests(): array { - return self::find()->where(['agnt' => true, 'type' => 'requested'])->all(); + return self::find()->where(['agnt' => true, 'type' => 'requested'])->orderBy(['DESC'])->all(); } /** diff --git a/mirzaev/skillparts/system/models/Notification.php b/mirzaev/skillparts/system/models/Notification.php index 37fdc05..1358912 100644 --- a/mirzaev/skillparts/system/models/Notification.php +++ b/mirzaev/skillparts/system/models/Notification.php @@ -156,7 +156,7 @@ class Notification extends Document { // Инициализация $model = new self; - $account or $account = yii::$app->user->identity->_key ?? throw new Exception('Не удалось инициализировать получателя'); + $account ?? $account = yii::$app->user->identity->_key ?? throw new Exception('Не удалось инициализировать получателя'); if ((bool) (int) $html) { // Получен текст в формете HTML-кода @@ -186,16 +186,16 @@ class Notification extends Document * Поиск получателя * * @param self $model Уведомление - * @param string $text Необработанный текст + * @param string $targets Необработанный текст с получателями * @param string $type Тип уведомления */ - protected static function searchReceiverAndConnect(self $model, string $text, string $type = self::TYPE_NOTICE): AccountEdgeNotification|array|null + protected static function searchReceiverAndConnect(self $model, string $targets, string $type = self::TYPE_NOTICE): AccountEdgeNotification|array|null { // Инициализация $return = []; // Конвертация - $accounts = array_map('trim', explode(self::$delimiter, $text)); + $accounts = array_map('trim', explode(self::$delimiter, $targets)); foreach ($accounts as $account) { if (in_array('@all', $accounts, true)) { @@ -218,7 +218,7 @@ class Notification extends Document || in_array('@auth', $accounts, true) || in_array('@autheds', $accounts, true) ) { - // Всем авторизованным + // Всем авторизованным (админам и модераторам) // Инициализация $return = []; diff --git a/mirzaev/skillparts/system/models/Product.php b/mirzaev/skillparts/system/models/Product.php index 9b4f335..3ca6fb6 100644 --- a/mirzaev/skillparts/system/models/Product.php +++ b/mirzaev/skillparts/system/models/Product.php @@ -327,46 +327,23 @@ class Product extends Document // Инициализация $data = []; $amount = 0; - - if (is_null($account)) { - // Данные аккаунта не переданы - - if (yii::$app->user->isGuest) { - // Аккаунт не аутентифицирован - - return false; - } else { - // Аккаунт аутентифицирован - - // Инициализация - $account = yii::$app->user->identity; - } - } else { - if (is_int($account)) { - // Передан идентификатор (_key) аккаунта (подразумевается) - - // Инициализация (поиск в базе данных) - if (!$account = Account::searchById(Account::collectionName() . "/$account")) { - // Не удалось инициализировать аккаунт - - return false; - } - } - } - + $account = Account::initAccount($account); if ($this->validate()) { foreach ($this->file_excel as $file) { // Перебор файлов // Инициализация - $dir = YII_PATH_PUBLIC . '../assets/import/' . (new DateTime('now', new DateTimeZone($account->zone ?? Settings::search()['timezone_default'] ?? 'UTC+3'))) . '/excel/' . (yii::$app->user->identity->_key ?? 'system') . '/' . time() . '/'; + preg_match_all('/UTC([\+\-0-9:]*)/', $account->zone ?? Settings::search()['timezone_default'] ?? 'UTC+3', $timezone); + $timezone = $timezone[1][0]; + $path = YII_PATH_PUBLIC . "/../assets/accounts/$account->_key/files/" . (new DateTime('now', new DateTimeZone($timezone)))->getTimestamp(); // Сохранение на диск - if (!file_exists($dir)) { - mkdir($dir, 0775, true); - } - $file->saveAs($path = $dir . $file->baseName . '.' . $file->extension); + if (!file_exists($path)) + if (!mkdir($path, 0775, true)) + throw new Exception('Не удалось создать директорию', 500); + + $file->saveAs($path = $path . "/$file->baseName.$file->extension"); $data[] = Excel::import($path, [ 'setFirstRecordAsKeys' => true, @@ -407,17 +384,18 @@ class Product extends Document // (new $group())->writeMember($product, $this->group); } else { // Проверка не пройдена - foreach ($product->errors as $attribute => $error) { - $this->addError($attribute, $error); - } + + // Добавление ошибок + foreach ($product->errors as $attribute => $error) $this->addError($attribute, $error); } } } } // Деинициализация - $this->file_excel = ''; + $this->file_excel = null; + // Макрос действий после импорта static::afterImportExcel($amount); return true; diff --git a/mirzaev/skillparts/system/views/mails/suppliers/decline.php b/mirzaev/skillparts/system/views/mails/suppliers/decline.php new file mode 100644 index 0000000..60cefe0 --- /dev/null +++ b/mirzaev/skillparts/system/views/mails/suppliers/decline.php @@ -0,0 +1,17 @@ +
+
+ + SkillParts + +
+
+

Отказано в регистрации

+

Причина:

+ Повторная заявка +
+
+ Вы получили это сообщение потому, что на ваш почтовый адрес была совершена регистрация +
+ Если это были не вы, проверьте безопасность ваших аккаунтов и свяжитесь с администрацией +
+
diff --git a/mirzaev/skillparts/system/views/mails/verify.php b/mirzaev/skillparts/system/views/mails/verify.php index 465c468..ec0ad1a 100644 --- a/mirzaev/skillparts/system/views/mails/verify.php +++ b/mirzaev/skillparts/system/views/mails/verify.php @@ -12,6 +12,7 @@
Вы получили это сообщение потому, что на ваш почтовый адрес была совершена регистрация +
Если это были не вы, проверьте безопасность ваших аккаунтов и свяжитесь с администрацией
diff --git a/mirzaev/skillparts/system/views/notification/popup.php b/mirzaev/skillparts/system/views/notification/popup.php index f711ab5..ad1067d 100644 --- a/mirzaev/skillparts/system/views/notification/popup.php +++ b/mirzaev/skillparts/system/views/notification/popup.php @@ -23,7 +23,10 @@ foreach ($notification->jrnl as $jrnl) { } $title = <<$type$date + + $type + $date + HTML; echo <<Заявка на регистрацию поставщика: diff --git a/mirzaev/skillparts/system/web/css/main.css b/mirzaev/skillparts/system/web/css/main.css index 145e4df..e680e20 100644 --- a/mirzaev/skillparts/system/web/css/main.css +++ b/mirzaev/skillparts/system/web/css/main.css @@ -107,7 +107,8 @@ main { transition: 0s; } -.button_blue_simple:active { +.button_blue_simple:active, +.button_blue_simple:focus { color: #ddd; background-color: #391e97; transition: 0s; @@ -125,7 +126,8 @@ main { transition: 0s; } -.button_blue:active { +.button_blue:active, +.button_blue:focus { color: #ddd; background-color: #391e97; transition: 0s; @@ -143,7 +145,8 @@ main { transition: 0s; } -.button_red:active { +.button_red:active, +.button_red:focus { color: #ddd; background-color: #971e1e; transition: 0s; @@ -161,7 +164,8 @@ main { transition: 0s; } -.button_red_softer:active { +.button_red_softer:active, +.button_red_softer:focus { color: #ddd; background-color: #b82d2d; transition: 0s; @@ -176,12 +180,14 @@ main { transition: 0s; } -.button_white:active { +.button_white:active, +.button_white:focus { background-color: #cfd3dd; transition: 0s; } .button_white_hover { + /* Что я натворил? */ background-color: #eaebee !important; transition: 0s; } @@ -195,7 +201,8 @@ main { transition: 0s; } -.button_grey:active { +.button_grey:active, +.button_grey:focus { background-color: #8c94a8; transition: 0s; } diff --git a/mirzaev/skillparts/system/web/js/profile_panel.js b/mirzaev/skillparts/system/web/js/profile_panel.js index 30b31fc..6df2b86 100644 --- a/mirzaev/skillparts/system/web/js/profile_panel.js +++ b/mirzaev/skillparts/system/web/js/profile_panel.js @@ -137,7 +137,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация контейнера let container = document.createElement('div'); - container.setAttribute('id', 'profile_panel_input_suppliers_requests_block_' + account._key); + container.setAttribute('id', account._key); container.setAttribute('class', i < suppliers.length ? 'mb-3 px-3 py-1 row panel_supplier_request' : 'px-3 py-1 row panel_supplier_request'); // Инициализация первой строки @@ -146,7 +146,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация колонки с метаданными аккаунта let block_metadata = document.createElement('div'); - block_metadata.setAttribute('id', 'profile_panel_input_suppliers_requests_block_metadata_' + account._key); + block_metadata.setAttribute('id', 'metadata_' + account._key); block_metadata.setAttribute('class', 'col-4 pr-0 d-flex flex-column'); // Инициализация оболочки идентификатора аккаунта @@ -200,6 +200,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { button_accept.setAttribute('class', 'mb-2 btn form-control button_blue'); button_accept.setAttribute('type', 'button'); button_accept.setAttribute('role', 'button'); + button_accept.setAttribute('onclick', 'return profile_panel_input_suppliers_requests_block_accept(' + account._key + ');'); button_accept.innerText = 'Подтвердить'; // Инициализация кнопки отклонения @@ -207,11 +208,12 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { button_decline.setAttribute('class', 'btn form-control button_red_softer'); button_decline.setAttribute('type', 'button'); button_decline.setAttribute('role', 'button'); + button_decline.setAttribute('onclick', 'return profile_panel_input_suppliers_requests_block_decline(' + account._key + ');'); button_decline.innerText = 'Отклонить'; // Инициализация колонки с основными данными аккаунта let block_info = document.createElement('div'); - block_info.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_' + account._key); + block_info.setAttribute('id', '' + account._key); block_info.setAttribute('class', 'col-4 pl-0 d-flex flex-column'); // Инициализация ярлыка "NAME" @@ -221,7 +223,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "NAME" let input_name = document.createElement('input'); - input_name.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_name_' + account._key); + input_name.setAttribute('id', 'name_' + account._key); input_name.setAttribute('class', 'form-control button_clean mb-3'); input_name.setAttribute('type', 'text'); input_name.setAttribute('placeholder', 'Иванов Иван Иванович'); @@ -235,7 +237,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "BOSS" let input_boss = document.createElement('input'); - input_boss.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_boss_' + account._key); + input_boss.setAttribute('id', 'boss_' + account._key); input_boss.setAttribute('class', 'form-control button_clean mb-3'); input_boss.setAttribute('type', 'text'); input_boss.setAttribute('placeholder', 'Иванов Иван Иванович'); @@ -249,7 +251,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "SIMC" (телефон) let input_simc = document.createElement('input'); - input_simc.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_simc_' + account._key); + input_simc.setAttribute('id', 'simc_' + account._key); input_simc.setAttribute('class', 'form-control button_clean mb-3'); input_simc.setAttribute('type', 'number'); input_simc.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "simc", this.value);'); @@ -262,7 +264,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "MAIL" let input_mail = document.createElement('input'); - input_mail.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_mail_' + account._key); + input_mail.setAttribute('id', 'mail_' + account._key); input_mail.setAttribute('class', 'form-control button_clean mb-3'); input_mail.setAttribute('type', 'mail'); input_mail.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "mail", this.value);'); @@ -270,7 +272,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация колонки с вторичными данными аккаунта let block_details = document.createElement('div'); - block_details.setAttribute('id', 'profile_panel_input_suppliers_requests_block_details_' + account._key); + block_details.setAttribute('id', 'details_' + account._key); block_details.setAttribute('class', 'col-4 d-flex flex-column'); // Инициализация ярлыка "INDX" @@ -284,7 +286,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "INDX" let input_indx = document.createElement('input'); - input_indx.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_indx_' + account._key); + input_indx.setAttribute('id', 'indx_' + account._key); input_indx.setAttribute('class', 'col form-control button_clean'); input_indx.setAttribute('type', 'text'); input_indx.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "indx", this.value);'); @@ -295,7 +297,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { button_indx.setAttribute('class', 'ml-2 my-auto text-dark'); button_indx.setAttribute('type', 'button'); button_indx.setAttribute('role', 'button'); - button_indx.innerHTML = ''; + button_indx.innerHTML = ''; // // Инициализация ярлыка "PSWD" // let label_pswd = document.createElement('label'); @@ -308,7 +310,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // // Инициализация поля "PSWD" // let input_pswd = document.createElement('input'); - // input_pswd.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_pswd_' + account._key); + // input_pswd.setAttribute('id', 'pswd_' + account._key); // input_pswd.setAttribute('class', 'col form-control button_clean'); // input_pswd.setAttribute('type', 'text'); // input_pswd.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "pswd", this.value);'); @@ -329,7 +331,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация ссылки на "FILE" let button_file = document.createElement('a'); button_file.setAttribute('class', 'btn form-control button_blue'); - button_file.setAttribute('href', '/' + account._key + '/requests/supplier/' + account.date.supl + '/document'); + button_file.setAttribute('href', account.data.file.uri); button_file.innerHTML = 'Скачать'; // Инициализация ярлыка "TAXN" @@ -339,7 +341,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "TAXN" let input_taxn = document.createElement('input'); - input_taxn.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_taxn_' + account._key); + input_taxn.setAttribute('id', 'taxn_' + account._key); input_taxn.setAttribute('class', 'form-control button_clean mb-3'); input_taxn.setAttribute('type', 'text'); input_taxn.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "taxn", this.value);'); @@ -352,7 +354,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "CNTG" let input_cntg = document.createElement('input'); - input_cntg.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_cntg_' + account._key); + input_cntg.setAttribute('id', 'cntg_' + account._key); input_cntg.setAttribute('class', 'form-control button_clean mb-3'); input_cntg.setAttribute('type', 'text'); input_cntg.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "cntg", this.value);'); @@ -365,7 +367,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "FADD" let input_fadd = document.createElement('input'); - input_fadd.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_fadd_' + account._key); + input_fadd.setAttribute('id', 'fadd_' + account._key); input_fadd.setAttribute('class', 'form-control button_clean mb-3'); input_fadd.setAttribute('type', 'text'); input_fadd.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "fadd", this.value);'); @@ -378,7 +380,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "LADD" let input_ladd = document.createElement('input'); - input_ladd.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_ladd_' + account._key); + input_ladd.setAttribute('id', 'ladd_' + account._key); input_ladd.setAttribute('class', 'form-control button_clean mb-3'); input_ladd.setAttribute('type', 'text'); input_ladd.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "ladd", this.value);'); @@ -391,7 +393,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "CHCK" let input_chck = document.createElement('input'); - input_chck.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_chck_' + account._key); + input_chck.setAttribute('id', 'chck_' + account._key); input_chck.setAttribute('class', 'form-control button_clean mb-3'); input_chck.setAttribute('type', 'text'); input_chck.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "chck", this.value);'); @@ -404,7 +406,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "COMP" let input_comp = document.createElement('input'); - input_comp.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_comp_' + account._key); + input_comp.setAttribute('id', 'comp_' + account._key); input_comp.setAttribute('class', 'form-control button_clean mb-3'); input_comp.setAttribute('type', 'text'); input_comp.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "comp", this.value);'); @@ -417,7 +419,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "CNTC" let input_cntc = document.createElement('textarea'); - input_cntc.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_cntc_' + account._key); + input_cntc.setAttribute('id', 'cntc_' + account._key); input_cntc.setAttribute('class', 'form-control button_clean profile_panel_input_suppliers_requests_block_textarea'); input_cntc.setAttribute('type', 'text'); input_cntc.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "cntc", this.value);'); @@ -430,7 +432,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { // Инициализация поля "DESC" let textarea_desc = document.createElement('textarea'); - textarea_desc.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_desc_' + account._key); + textarea_desc.setAttribute('id', 'desc_' + account._key); textarea_desc.setAttribute('class', 'form-control button_clean mb-3 profile_panel_input_suppliers_requests_block_textarea'); textarea_desc.setAttribute('type', 'text'); textarea_desc.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "desc", this.value);'); @@ -551,9 +553,18 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) { return html; } +/** + * Редактирование параметра + * + * @param {*} _key + * @param {*} target + * @param {*} value + * + * @returns + */ function profile_panel_input_suppliers_requests_block_edit(_key, target, value) { $.ajax({ - url: `/account/${_key}/${target}/edit`, + url: `/${_key}/${target}/edit`, type: 'post', dataType: 'json', data: { @@ -566,3 +577,89 @@ function profile_panel_input_suppliers_requests_block_edit(_key, target, value) return false; } + +/** + * Регенерация параметра + * + * @param {*} _key + * @param {*} target + * @returns + */ +function profile_panel_input_suppliers_requests_block_regen(_key, target) { + $.ajax({ + url: `/${_key}/${target}/regenerate`, + type: 'post', + dataType: 'json', + data: { + '_csrf': yii.getCsrfToken() + }, + success: (data, status, xhr) => { + // Реинициализация списка + page_profile_panel_input_suppliers_requests_init(); + + return page_profile_response_success(data, status, xhr); + }, + error: page_profile_response_error + }); + + return false; +} + +/** + * Подтверждение регистрации + * + * @param {*} _key + * @param {*} target + * @returns + */ + function profile_panel_input_suppliers_requests_block_accept(_key) { + $.ajax({ + url: `/${_key}/accept`, + type: 'post', + dataType: 'json', + data: { + '_csrf': yii.getCsrfToken() + }, + success: (data, status, xhr) => { + // Реинициализация списка + page_profile_panel_input_suppliers_requests_init(); + + return page_profile_response_success(data, status, xhr); + }, + error: page_profile_response_error + }); + + return false; +} + +/** + * Отклонение регистрации + * + * @param {*} _key + * @param {*} target + * @returns + */ +function profile_panel_input_suppliers_requests_block_decline(_key, reason) { + if (reason === undefined) { + reason = prompt('Причина отказа', 'Недостаточно данных'); + } + + $.ajax({ + url: `/${_key}/decline`, + type: 'post', + dataType: 'json', + data: { + '_csrf': yii.getCsrfToken(), + reason + }, + success: (data, status, xhr) => { + // Реинициализация списка + page_profile_panel_input_suppliers_requests_init(); + + return page_profile_response_success(data, status, xhr); + }, + error: page_profile_response_error + }); + + return false; +}