From 3cb2aa1a15d5f9ae75e6f4823d1354755e31b2b2 Mon Sep 17 00:00:00 2001 From: Arsen Mirzaev Tatyano-Muradovich Date: Tue, 7 Sep 2021 06:39:21 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D0=BD=D0=B5=D0=BB=D1=8C=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BF=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D1=89?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mirzaev/skillparts/system/assets/.gitignore | 5 +- .../skillparts/system/config/web.php.example | 1 + .../system/controllers/ProfileController.php | 129 ++++++-- .../controllers/SuppliersController.php | 19 +- mirzaev/skillparts/system/models/Account.php | 163 +++++++++- mirzaev/skillparts/system/models/Document.php | 4 +- .../system/models/connection/Dellin.php | 2 +- .../skillparts/system/views/profile/panel.php | 24 +- .../skillparts/system/views/search/index.php | 2 - .../system/web/css/pages/profile.css | 6 +- .../skillparts/system/web/js/orders_panel.js | 2 +- .../skillparts/system/web/js/profile_panel.js | 307 +++++++++++++++++- 12 files changed, 608 insertions(+), 56 deletions(-) diff --git a/mirzaev/skillparts/system/assets/.gitignore b/mirzaev/skillparts/system/assets/.gitignore index 0e75838..5564053 100644 --- a/mirzaev/skillparts/system/assets/.gitignore +++ b/mirzaev/skillparts/system/assets/.gitignore @@ -1,2 +1,3 @@ -/import -/invoices +/import/* +/invoices/* +/accounts/* diff --git a/mirzaev/skillparts/system/config/web.php.example b/mirzaev/skillparts/system/config/web.php.example index 17cc014..e4609c9 100644 --- a/mirzaev/skillparts/system/config/web.php.example +++ b/mirzaev/skillparts/system/config/web.php.example @@ -97,6 +97,7 @@ $config = [ 'product/' => 'product/index', '///' => '
/-', 'profile/geolocation/' => 'profile/geolocation-', + 'profile/panel///' => 'profile/panel---', 'orders' => 'order/index', 'orders/' => 'order/index', 'orders//' => 'order/', diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php index 5ab3680..0b47908 100644 --- a/mirzaev/skillparts/system/controllers/ProfileController.php +++ b/mirzaev/skillparts/system/controllers/ProfileController.php @@ -49,7 +49,8 @@ class ProfileController extends Controller 'import', 'monitoring', 'readGroups', - 'geolocation-write' + 'geolocation-write', + 'panel-suppliers-requests-search' ] ], [ @@ -258,6 +259,8 @@ class ProfileController extends Controller // Деинициализация unset($vars); + // Раздел "Поставщики" + if (yii::$app->request->isPost) { // AJAX-POST-запрос @@ -659,12 +662,16 @@ class ProfileController extends Controller $account->city = $account->geol['data']['city']; // Запись в буфер новых данных (непонятно почему, но только вторым запросом можно получать часовую зону) - $account->geol = $account->geol + $dadata->clean("address", $account->city); + $account->geol = [ + 'data' => [ + 'timezone' => $dadata->clean("address", $account->city)['data']['timezone'] + ] + ] + $account->geol; // Запись в буфер часовой зоны $account->zone = $account->geol['data']['timezone']; - if($account->update() < 1) { + if ($account->update() < 1) { // Не удалось записать данные // Запись кода ответа @@ -696,31 +703,7 @@ class ProfileController extends Controller */ public static function syncGeolocationWithDellin(Account|int|null $account = null): bool { - 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::initForController($account); // Синхронизация с базой данных (таблица с ДеловыеЛинии) if (isset($account->geol['data']) && $dellin = Dellin::searchByCityKladr(str_pad($account->geol['data']['city_kladr_id'], 25, '0000000000000000000000'))) { @@ -791,4 +774,94 @@ class ProfileController extends Controller return false; } + + public function actionPanelSuppliersRequestsSearch() + { + if (Yii::$app->request->isPost) { + // POST-запрос + + if (Account::isAdmin() || Account::isModer()) { + // Доступ разрешен + + // Инициализация буфера ответа + $response = []; + + // Поиск заявок на регистрацию + $suppliers = Account::searchSuppliersRequests(); + + foreach ($suppliers as $account) { + // Перебор заявок + + // Поиск данных о заявке + foreach ($account->jrnl as $jrnl) { + // Перебор журнала + + if ($jrnl['action'] === 'create') { + // Заявка найдена + + // Запись даты регистрации + $registration_date = $jrnl['date']; + } else if ($jrnl['action'] === 'request to become a supplier') { + // Заявка найдена + + // Запись даты отправки заявки + $supplier_date = $jrnl['date']; + + // Запись данных о заявке + $supplier_data = $jrnl['data'][0]; + } + } + + if (empty($supplier_data) || empty($supplier_date) || empty($registration_date)) { + // Данные из журнала не найдены + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + return; + } + + // Инициализация индекса + Account::generateIndexes([$account]); + + // Инициализация пароля + $account->passwordInit(); + + // Запись в буфер ответа + $response[] = [ + '_key' => $account->_key, + 'name' => $account->name, + 'mail' => $account->mail, + 'simc' => $account->simc, + 'indx' => $account->indx, + 'pswd' => $account->pswd, + 'vrfy' => Account::validateVrfy($account->vrfy), + 'data' => $supplier_data, + 'date' => [ + 'regs' => $registration_date, + 'supl' => $supplier_date + ] + ]; + } + + // Настройка заголовков ответа + Yii::$app->response->format = Response::FORMAT_JSON; + + return [ + 'suppliers' => $response, + '_csrf' => yii::$app->request->getCsrfToken() + ]; + } else { + // Запись кода ответа + yii::$app->response->statusCode = 401; + + return; + } + } + + // Запись кода ответа + yii::$app->response->statusCode = 500; + + return; + } } diff --git a/mirzaev/skillparts/system/controllers/SuppliersController.php b/mirzaev/skillparts/system/controllers/SuppliersController.php index ba6be62..7f98ad5 100644 --- a/mirzaev/skillparts/system/controllers/SuppliersController.php +++ b/mirzaev/skillparts/system/controllers/SuppliersController.php @@ -9,6 +9,7 @@ use yii\web\Controller; use yii\web\UploadedFile; use app\models\Request; +use app\models\Account; class SuppliersController extends Controller { @@ -27,15 +28,19 @@ class SuppliersController extends Controller */ public function actionRequestSend() { + // Инициализация данных запроса $request = yii::$app->request->post('Request') ?? yii::$app->request->get('Request'); - 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 = UploadedFile::getInstance(new Request($request), 'file'))->tempName, ['fileName' => $file->name]) - ->send(); + // Запись поставщика + 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(); return $this->renderPartial('/suppliers/requested'); } diff --git a/mirzaev/skillparts/system/models/Account.php b/mirzaev/skillparts/system/models/Account.php index a8e6ad5..8e43ba1 100644 --- a/mirzaev/skillparts/system/models/Account.php +++ b/mirzaev/skillparts/system/models/Account.php @@ -11,6 +11,7 @@ use carono\exchange1c\interfaces\PartnerInterface; use app\models\Dellin; use app\models\traits\SearchByEdge; +use yii\web\UploadedFile; /** * Аккаунт @@ -43,7 +44,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface 'pswd', 'name', 'simc', - 'sity', + 'city', 'zone', 'comp', 'taxn', @@ -379,10 +380,10 @@ class Account extends Document implements IdentityInterface, PartnerInterface public function writeOption(string $name, mixed $value = null): bool { // Запись - $this->opts[$name] = $value; + $this->opts = [$name => $value] + $this->opts; // Отправка - return $this->save(); + return $this->update() > 0; } /** @@ -396,7 +397,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface unset($this->opts[$name]); // Отправка - return $this->save(); + return $this->update() > 0; } /** @@ -589,7 +590,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface regenerate_index: // Генерация - $account->indx = $int_to_string(random_int(0, 32)) . $int_to_string(random_int(0, 32)) . $int_to_string(random_int(0, 32)); + $account->indx = $int_to_string(random_int(0, 29)) . $int_to_string(random_int(0, 29)) . $int_to_string(random_int(0, 29)); if (in_array($account->indx, $registry)) { // Сгенерированный индекс обнаружено в реестре запрещённых индексов @@ -688,6 +689,24 @@ class Account extends Document implements IdentityInterface, PartnerInterface return false; } + /** + * Инициализация пароля + */ + public function passwordInit(): bool + { + if (empty($this->pswd) || $this->pswd === 'undefined') { + // Пароль не инициализирован + + // Генерация пароля + $this->pswd = self::passwordGenerate(); + + // Сохранение и возврат + return $this->update() > 1; + } + + return false; + } + /** * Гениальный генератор пароля * @@ -778,4 +797,138 @@ class Account extends Document implements IdentityInterface, PartnerInterface return $this->update() > 0 ? true : false; } + + /** + * Поиск заявок на регистрацию поставщиков + * + * @return array + */ + public static function writeSupplier(string $name, string $phone, string $mail, UploadedFile $file): ?static + { + // Инициализация + $account = new static; + + // Настройка + $account->agnt = true; + $account->name = $name; + $account->simc = $phone; + $account->mail = $mail; + $account->type = 'requested'; + + // Генерация пароля + $account->passwordInit(); + + // Инициализация индекса + Account::generateIndexes([$account]); + + if ($account->save()) { + // Удалось сохранить аккаунт + + if (!file_exists($dir = YII_PATH_PUBLIC . '/../assets/accounts/' . $account->_key . '/documents')) { + // Директория для хранения документов не найдена + + if (!mkdir($dir, 0775, true)) { + // Не удалось записать директорию + + return false; + } + } + + // Перенос файла из временной директории + copy($file->tempName, $file2 = $dir . '/' . $file->name); + + $account->journal('request to become a supplier', [ + 'name' => $name, + 'phone' => $phone, + 'mail' => $mail, + 'file' => $file2 + ]); + + return $account; + } + + return null; + } + + /** + * Поиск заявок на регистрацию поставщиков + * + * @return array + */ + public static function searchSuppliersRequests(): array + { + return self::find()->where(['agnt' => true, 'type' => 'requested'])->all(); + } + + /** + * Инициализация аккаунта для контроллера + * + * @param static|null $account Аккаунт + */ + public static function initAccount($account = null): ?static + { + if (is_null($account)) { + // Данные аккаунта не переданы + + if (yii::$app->user->isGuest) { + // Аккаунт не аутентифицирован + } else { + // Аккаунт аутентифицирован + + // Инициализация + $account = yii::$app->user->identity; + + return $account; + } + } else { + if (is_int($account)) { + // Передан идентификатор (_key) аккаунта (подразумевается) + + // Инициализация (поиск в базе данных) + if ($account = Account::searchById(Account::collectionName() . "/$account")) { + // Удалось инициализировать аккаунт + + return $account; + } + } + } + + return null; + } + + /** + * Проверка на то, что аккаунт является администраторрм + * + * @param static|null $account Аккаунт + */ + public static function isAdmin($account = null): bool + { + if ($account = self::initAccount($account)) { + // Аккаунт инициализирован + + if ($account->type === 'administrator') { + return true; + } + } + + return false; + } + + /** + * Проверка на то, что аккаунт является модератором + * + * @param static|null $account Аккаунт + */ + public static function isModer($account = null): bool + { + if ($account = self::initAccount($account)) { + // Аккаунт инициализирован + + if ($account->type === 'moderator') { + return true; + } + } + + return false; + } } diff --git a/mirzaev/skillparts/system/models/Document.php b/mirzaev/skillparts/system/models/Document.php index 69fcd36..2c26835 100644 --- a/mirzaev/skillparts/system/models/Document.php +++ b/mirzaev/skillparts/system/models/Document.php @@ -109,7 +109,9 @@ abstract class Document extends ActiveRecord 'account' => yii::$app->user->id ?? 'system', 'action' => $action ], - ...$data + [ + 'data' => $data + ] )] ); diff --git a/mirzaev/skillparts/system/models/connection/Dellin.php b/mirzaev/skillparts/system/models/connection/Dellin.php index 56f601f..c86b52a 100644 --- a/mirzaev/skillparts/system/models/connection/Dellin.php +++ b/mirzaev/skillparts/system/models/connection/Dellin.php @@ -207,7 +207,7 @@ class Dellin extends Model 'sessionID' => self::$session, 'delivery' => [ 'derival' => [ - 'produceDate' => (new DateTime())->setTimestamp(time())->setTimezone(new DateTimeZone($timezone))->format('Y-m-d') + 'produceDate' => (new DateTime())->setTimestamp(time() + 86400 * 3)->setTimezone(new DateTimeZone($timezone))->format('Y-m-d') ] ], 'members' => [ diff --git a/mirzaev/skillparts/system/views/profile/panel.php b/mirzaev/skillparts/system/views/profile/panel.php index 913aa7d..7f9d79b 100644 --- a/mirzaev/skillparts/system/views/profile/panel.php +++ b/mirzaev/skillparts/system/views/profile/panel.php @@ -7,9 +7,10 @@ use yii\bootstrap\ActiveForm; use yii\helpers\Html; use app\models\Notification; +use app\models\Account; // Инициализация -$panel ?? $panel = 'profile_panel_panel_input_notifications'; +$panel ?? $panel = 'profile_panel_input_notifications'; ?> @@ -25,11 +26,12 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';

Панель управления

- - + + +
- /> + />
Отправка уведомления
@@ -74,7 +76,15 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
- /> + + /> +
+
Заявки на регистрацию
+ +
+
+ + />
errorSummary($model_settings, ['header' => 'Получены ошибки:']) ?> - field($model_settings, 'search_period', ['options' => ['class' => "mb-1"]])->textInput(['value' => $model_settings['search_period'], 'onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_panel_input_settings\')']); ?> + field($model_settings, 'search_period', ['options' => ['class' => "mb-1"]])->textInput(['value' => $model_settings['search_period'], 'onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_input_settings\')']); ?> Время которое надо ждать для повторного поиска в секундах @@ -134,7 +144,7 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications'; } ?> - field($model_settings, 'search_connect_keep', ['options' => ['class' => "mb-1"]])->dropDownList($list, ['onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_panel_input_settings\')']); ?> + field($model_settings, 'search_connect_keep', ['options' => ['class' => "mb-1"]])->dropDownList($list, ['onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_input_settings\')']); ?> Удерживать открытое соединение до истечения срока блокировки поиска? При малой задержке позволяет снизить время загрузки страницы, но при большой будет казаться, что сайт завис diff --git a/mirzaev/skillparts/system/views/search/index.php b/mirzaev/skillparts/system/views/search/index.php index cd7ee57..b5f4224 100644 --- a/mirzaev/skillparts/system/views/search/index.php +++ b/mirzaev/skillparts/system/views/search/index.php @@ -3,8 +3,6 @@