Панель модератора для регистрации поставщиков

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-09-07 06:39:21 +10:00
parent d9337944b1
commit 3cb2aa1a15
12 changed files with 608 additions and 56 deletions

View File

@ -1,2 +1,3 @@
/import /import/*
/invoices /invoices/*
/accounts/*

View File

@ -97,6 +97,7 @@ $config = [
'product/<catn:[^/]+>' => 'product/index', 'product/<catn:[^/]+>' => 'product/index',
'<section:(product|cart)>/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(title|catn|dscr|dmns|wght|image|cover|comm)>' => '<section>/<action>-<target>', '<section:(product|cart)>/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(title|catn|dscr|dmns|wght|image|cover|comm)>' => '<section>/<action>-<target>',
'profile/geolocation/<action:(init|write)>' => 'profile/geolocation-<action>', 'profile/geolocation/<action:(init|write)>' => 'profile/geolocation-<action>',
'profile/panel/<panel:(suppliers)>/<block:(requests)>/<action:(search)>' => 'profile/panel-<panel>-<block>-<action>',
'orders' => 'order/index', 'orders' => 'order/index',
'orders/<filter:[^/]+>' => 'order/index', 'orders/<filter:[^/]+>' => 'order/index',
'orders/<catn:[^/]+>/<action:(accept)>' => 'order/<action>', 'orders/<catn:[^/]+>/<action:(accept)>' => 'order/<action>',

View File

@ -49,7 +49,8 @@ class ProfileController extends Controller
'import', 'import',
'monitoring', 'monitoring',
'readGroups', 'readGroups',
'geolocation-write' 'geolocation-write',
'panel-suppliers-requests-search'
] ]
], ],
[ [
@ -258,6 +259,8 @@ class ProfileController extends Controller
// Деинициализация // Деинициализация
unset($vars); unset($vars);
// Раздел "Поставщики"
if (yii::$app->request->isPost) { if (yii::$app->request->isPost) {
// AJAX-POST-запрос // AJAX-POST-запрос
@ -659,7 +662,11 @@ class ProfileController extends Controller
$account->city = $account->geol['data']['city']; $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']; $account->zone = $account->geol['data']['timezone'];
@ -696,31 +703,7 @@ class ProfileController extends Controller
*/ */
public static function syncGeolocationWithDellin(Account|int|null $account = null): bool public static function syncGeolocationWithDellin(Account|int|null $account = null): bool
{ {
if (is_null($account)) { Account::initForController($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;
}
}
}
// Синхронизация с базой данных (таблица с ДеловыеЛинии) // Синхронизация с базой данных (таблица с ДеловыеЛинии)
if (isset($account->geol['data']) && $dellin = Dellin::searchByCityKladr(str_pad($account->geol['data']['city_kladr_id'], 25, '0000000000000000000000'))) { 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; 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;
}
} }

View File

@ -9,6 +9,7 @@ use yii\web\Controller;
use yii\web\UploadedFile; use yii\web\UploadedFile;
use app\models\Request; use app\models\Request;
use app\models\Account;
class SuppliersController extends Controller class SuppliersController extends Controller
{ {
@ -27,15 +28,19 @@ class SuppliersController extends Controller
*/ */
public function actionRequestSend() public function actionRequestSend()
{ {
// Инициализация данных запроса
$request = yii::$app->request->post('Request') ?? yii::$app->request->get('Request'); $request = yii::$app->request->post('Request') ?? yii::$app->request->get('Request');
yii::$app->mail_system->compose() // Запись поставщика
->setFrom(yii::$app->params['mail']['system']) Account::writeSupplier($request['name'], $request['phon'], $request['mail'], $file = UploadedFile::getInstance(new Request($request), 'file'));
->setTo(yii::$app->params['mail']['info'])
->setSubject('Регистрация поставщика') // yii::$app->mail_system->compose()
->setHtmlBody($this->renderPartial('/mails/supplier', $request)) // ->setFrom(yii::$app->params['mail']['system'])
->attach(($file = UploadedFile::getInstance(new Request($request), 'file'))->tempName, ['fileName' => $file->name]) // ->setTo(yii::$app->params['mail']['info'])
->send(); // ->setSubject('Регистрация поставщика')
// ->setHtmlBody($this->renderPartial('/mails/supplier', $request))
// ->attach($file->tempName, ['fileName' => $file->name])
// ->send();
return $this->renderPartial('/suppliers/requested'); return $this->renderPartial('/suppliers/requested');
} }

View File

@ -11,6 +11,7 @@ use carono\exchange1c\interfaces\PartnerInterface;
use app\models\Dellin; use app\models\Dellin;
use app\models\traits\SearchByEdge; use app\models\traits\SearchByEdge;
use yii\web\UploadedFile;
/** /**
* Аккаунт * Аккаунт
@ -43,7 +44,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
'pswd', 'pswd',
'name', 'name',
'simc', 'simc',
'sity', 'city',
'zone', 'zone',
'comp', 'comp',
'taxn', 'taxn',
@ -379,10 +380,10 @@ class Account extends Document implements IdentityInterface, PartnerInterface
public function writeOption(string $name, mixed $value = null): bool 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]); unset($this->opts[$name]);
// Отправка // Отправка
return $this->save(); return $this->update() > 0;
} }
/** /**
@ -589,7 +590,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
regenerate_index: 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)) { if (in_array($account->indx, $registry)) {
// Сгенерированный индекс обнаружено в реестре запрещённых индексов // Сгенерированный индекс обнаружено в реестре запрещённых индексов
@ -688,6 +689,24 @@ class Account extends Document implements IdentityInterface, PartnerInterface
return false; 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 $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;
}
} }

View File

@ -109,7 +109,9 @@ abstract class Document extends ActiveRecord
'account' => yii::$app->user->id ?? 'system', 'account' => yii::$app->user->id ?? 'system',
'action' => $action 'action' => $action
], ],
...$data [
'data' => $data
]
)] )]
); );

View File

@ -207,7 +207,7 @@ class Dellin extends Model
'sessionID' => self::$session, 'sessionID' => self::$session,
'delivery' => [ 'delivery' => [
'derival' => [ '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' => [ 'members' => [

View File

@ -7,9 +7,10 @@ use yii\bootstrap\ActiveForm;
use yii\helpers\Html; use yii\helpers\Html;
use app\models\Notification; 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';
<h4 class="ml-4 mb-4"><i class="fas fa-user-shield my-auto mr-2"></i>Панель управления</h4> <h4 class="ml-4 mb-4"><i class="fas fa-user-shield my-auto mr-2"></i>Панель управления</h4>
<div id="profile_panel_panel" class="profile_panel"> <div id="profile_panel_panel" class="profile_panel">
<div class="profile_panel_menu mb-3"> <div class="profile_panel_menu mb-3">
<label class="btn button_white mb-0 mr-2" for="profile_panel_panel_input_notifications">Уведомления</label> <label class="btn button_white mb-0 mr-2" for="profile_panel_input_notifications" onclick="return page_profile_panel_suppliers_choose('profile_panel_input_notifications');">Уведомления</label>
<label class="btn button_white mb-0 mr-2" for="profile_panel_panel_input_settings">Настройки</label> <label class="btn button_white mb-0 mr-2" for="profile_panel_input_suppliers" onclick="return page_profile_panel_input_suppliers_requests_init();">Поставщики</label>
<label class="btn button_white mb-0 mr-2" for="profile_panel_input_settings" onclick="return page_profile_panel_suppliers_choose('profile_panel_input_settings');">Настройки</label>
</div> </div>
<div class="profile_panel_content"> <div class="profile_panel_content">
<input type="radio" id="profile_panel_panel_input_notifications" name="main_panel" <?= $panel === 'profile_panel_panel_input_notifications' ? 'checked' : null ?> /> <input type="radio" id="profile_panel_input_notifications" name="main_panel" <?= $panel === 'profile_panel_input_notifications' ? 'checked' : null ?> />
<div class="col"> <div class="col">
<h5>Отправка уведомления</h5> <h5>Отправка уведомления</h5>
<div class="dropdown-divider mb-3"></div> <div class="dropdown-divider mb-3"></div>
@ -74,7 +76,15 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
<?php ActiveForm::end(); ?> <?php ActiveForm::end(); ?>
</div> </div>
<input type="radio" id="profile_panel_panel_input_settings" name="main_panel" <?= $panel === 'profile_panel_panel_input_settings' ? 'checked' : null ?> />
<input type="radio" id="profile_panel_input_suppliers" name="main_panel" <?= $panel === 'profile_panel_input_suppliers' ? 'checked' : null ?> />
<div class="col">
<h5>Заявки на регистрацию</h5>
<div class="dropdown-divider mb-3"></div>
<div id="profile_panel_input_suppliers_requests"></div>
</div>
<input type="radio" id="profile_panel_input_settings" name="main_panel" <?= $panel === 'profile_panel_input_settings' ? 'checked' : null ?> />
<div class="col"> <div class="col">
<?php <?php
$form = ActiveForm::begin([ $form = ActiveForm::begin([
@ -92,7 +102,7 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
<?= $form->errorSummary($model_settings, ['header' => 'Получены ошибки:']) ?> <?= $form->errorSummary($model_settings, ['header' => 'Получены ошибки:']) ?>
<?= $form->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\')']); ?> <?= $form->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\')']); ?>
<small class="d-block mb-1">Время которое надо ждать для повторного поиска в секундах</small> <small class="d-block mb-1">Время которое надо ждать для повторного поиска в секундах</small>
<?php ActiveForm::end(); ?> <?php ActiveForm::end(); ?>
@ -134,7 +144,7 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
} }
?> ?>
<?= $form->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\')']); ?> <?= $form->field($model_settings, 'search_connect_keep', ['options' => ['class' => "mb-1"]])->dropDownList($list, ['onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_input_settings\')']); ?>
<small class="d-block mb-1">Удерживать открытое соединение до истечения срока блокировки поиска?</small> <small class="d-block mb-1">Удерживать открытое соединение до истечения срока блокировки поиска?</small>
<small class="d-block mb-1">При малой задержке позволяет снизить время загрузки страницы, но при большой будет казаться, что сайт завис</small> <small class="d-block mb-1">При малой задержке позволяет снизить время загрузки страницы, но при большой будет казаться, что сайт завис</small>

View File

@ -3,8 +3,6 @@
<div id="page_search" class="container flex-grow-1 d-flex"> <div id="page_search" class="container flex-grow-1 d-flex">
<?php <?php
use phpDocumentor\Reflection\DocBlock\Tags\Var_;
if (isset($timer) && $timer > 0) : ?> if (isset($timer) && $timer > 0) : ?>
<div class="row py-3 w-100"> <div class="row py-3 w-100">

View File

@ -25,6 +25,10 @@
background-color: #f7f6f9; background-color: #f7f6f9;
} }
#page_profile [id^=profile_panel_]>.profile_panel_content #profile_panel_input_suppliers_requests .panel_supplier_request {
height: 200px;
}
/* #page_profile [id^=profile_panel_]>.profile_panel_content>div>.header_blue~.row:nth-child(2n + 1) { /* #page_profile [id^=profile_panel_]>.profile_panel_content>div>.header_blue~.row:nth-child(2n + 1) {
background-color: #dbdde3; background-color: #dbdde3;
} */ } */

View File

@ -137,7 +137,7 @@ function orders_supply_edit(type, supply_key, order_key) {
input.setAttribute('id', supply.getAttribute('id') + '_cost_input'); input.setAttribute('id', supply.getAttribute('id') + '_cost_input');
input.setAttribute('class', 'col-2 text-center form-control-plaintext'); input.setAttribute('class', 'col-2 text-center form-control-plaintext');
input.setAttribute('type', 'number'); input.setAttribute('type', 'number');
input.setAttribute('onchange', 'return orders_supply_cost_edit(' + supply_key + ', this);') input.setAttribute('onchange', 'return orders_supply_cost_edit(' + supply_key + ', this);');
if (data.cost !== undefined) { if (data.cost !== undefined) {
input.setAttribute('value', data.cost); input.setAttribute('value', data.cost);
} else { } else {

View File

@ -1,3 +1,5 @@
'use strict'
function page_profile_panel_notification_create(form, html = 0) { function page_profile_panel_notification_create(form, html = 0) {
if (form == undefined) { if (form == undefined) {
form = { form = {
@ -49,3 +51,306 @@ function page_profile_panel_write (form) {
return false; return false;
}; };
function page_profile_panel_input_suppliers_requests_init() {
// Инициализация скриптов при открытии вкладки "Поставщики"
// Выбор панели
page_profile_panel_suppliers_choose('profile_panel_input_suppliers');
// Инициализация панели
page_profile_panel_input_suppliers_requests_init();
return false;
};
function page_profile_panel_suppliers_choose(button) {
if (button === 'profile_panel_input_suppliers') {
document.getElementById('profile_panel_input_notifications').addAttribute('onclick', 'return page_profile_panel_input_suppliers_notifications_init();');
document.getElementById('profile_panel_input_settings').addAttribute('onclick', 'return page_profile_panel_input_suppliers_settings_init();');
} else if (button === 'profile_panel_input_notifications') {
document.getElementById('profile_panel_input_suppliers').addAttribute('onclick', 'return page_profile_panel_input_suppliers_requests_init();');
document.getElementById('profile_panel_input_settings').addAttribute('onclick', 'return page_profile_panel_input_suppliers_settings_init();');
} else if (button === 'profile_panel_input_settings') {
document.getElementById('profile_panel_input_notifications').addAttribute('onclick', 'return page_profile_panel_input_suppliers_notifications_init();');
document.getElementById('profile_panel_input_suppliers').addAttribute('onclick', 'return page_profile_panel_input_suppliers_requests_init();');
}
document.getElementById(button).removeAttribute('onclick');
}
function page_profile_panel_input_suppliers_requests_init(wrap = 'profile_panel_input_suppliers_requests') {
// Инициализация блока "Заявки на регистрацию" (поставщиков)
// Инициализация оболочки
wrap = document.getElementById(wrap);
$.ajax({
url: '/profile/panel/suppliers/requests/search',
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken()
},
success: (data, status, xhr) => {
// Обработка ответа
if (data !== undefined) {
// Получены данные с сервера
if (data.suppliers !== undefined && data.suppliers !== null) {
// Найдены данные поставщиков
for (let html of page_profile_panel_input_suppliers_requests_generate(data.suppliers)) {
// Перебор сгенерированных HTML-элементов
// Запись в документ
wrap.appendChild(html);
}
}
}
// Переход к остальным обработчикам
page_profile_response_success(data, status, xhr);
},
error: page_profile_response_error
});
}
function page_profile_panel_input_suppliers_requests_generate(suppliers) {
// Генерация HTML со списком заявок на регистрацию поставщиков
// Инициализация буфера вывода
let html = new Set;
// Инициализация итератора
let i = 0;
for (let account of suppliers) {
// Перебор данных поставщиков
// Обновление счётчика
++i;
// Инициализация контейнера
let container = document.createElement('div');
container.setAttribute('id', 'profile_panel_input_suppliers_requests_block_' + account._key);
container.setAttribute('class', i < suppliers.length ? 'mb-3 px-3 py-1 row' : 'px-3 py-1 row');
// Инициализация колонки с метаданными аккаунта
let block_metadata = document.createElement('div');
block_metadata.setAttribute('id', 'profile_panel_input_suppliers_requests_block_metadata_' + account._key);
block_metadata.setAttribute('class', 'col-4 pl-0 d-flex flex-column');
// Инициализация оболочки идентификатора аккаунта
let wrap_id = document.createElement('p');
wrap_id.setAttribute('class', 'mt-0 mb-2 px-3 row');
// Инициализация ярлыка идентификатора аккаунта
let label_id = document.createElement('b');
label_id.setAttribute('class', '');
label_id.innerText = 'Договор:';
// Инициализация значения идентификатора аккаунта
let value_id = document.createElement('span');
value_id.setAttribute('class', 'ml-auto');
value_id.innerText = account._key;
// Инициализация оболочки времени регистрации
let wrap_regs = document.createElement('p');
wrap_regs.setAttribute('class', 'mt-auto mb-2 px-3 row');
// Инициализация ярлыка времени регистрации
let label_regs = document.createElement('b');
label_regs.setAttribute('class', '');
label_regs.innerText = 'Регистрация:';
// Инициализация значения времени регистрации
let value_regs = document.createElement('span');
value_regs.setAttribute('class', 'ml-auto');
value_regs.innerText = moment.unix(account.date.regs).locale('ru-ru').format('DD.MM.YYYY');
// Инициализация оболочки времени заявки
let wrap_supl = document.createElement('p');
wrap_supl.setAttribute('class', 'mt-0 mb-2 px-3 row');
// Инициализация ярлыка времени заявки
let label_supl = document.createElement('b');
label_supl.setAttribute('class', '');
label_supl.innerText = 'Заявка:';
// Инициализация значения времени заявки
let value_supl = document.createElement('span');
value_supl.setAttribute('class', 'ml-auto');
value_supl.innerText = moment.unix(account.date.supl).locale('ru-ru').format('DD.MM.YYYY');
// Инициализация кнопки сохранения
let button_save = document.createElement('a');
button_save.setAttribute('class', 'btn form-control button_blue');
button_save.setAttribute('type', 'button');
button_save.setAttribute('role', 'button');
button_save.innerText = 'Сохранить';
// Инициализация колонки с основными данными аккаунта
let block_info = document.createElement('div');
block_info.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_' + account._key);
block_info.setAttribute('class', 'col-4 d-flex flex-column');
// Инициализация ярлыка "NAME"
let label_name = document.createElement('label');
label_name.setAttribute('class', 'control-label');
label_name.innerText = 'Имя';
// Инициализация поля "NAME"
let input_name = document.createElement('input');
input_name.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_name_' + account._key);
input_name.setAttribute('class', 'form-control button_clean mb-3');
input_name.setAttribute('type', 'text');
input_name.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_name_edit(' + account._key + ', this);');
input_name.value = account.name;
// Инициализация ярлыка "SIMC" (телефон)
let label_simc = document.createElement('label');
label_simc.setAttribute('class', 'control-label');
label_simc.innerText = 'Номер';
// Инициализация поля "SIMC" (телефон)
let input_simc = document.createElement('input');
input_simc.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_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_simc_edit(' + account._key + ', this);');
input_simc.value = account.simc;
// Инициализация ярлыка "MAIL"
let label_mail = document.createElement('label');
label_mail.setAttribute('class', 'control-label');
label_mail.innerText = 'Почта';
// Инициализация поля "MAIL"
let input_mail = document.createElement('input');
input_mail.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_mail_' + account._key);
input_mail.setAttribute('class', 'form-control button_clean');
input_mail.setAttribute('type', 'mail');
input_mail.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_mail_edit(' + account._key + ', this);');
input_mail.value = account.mail;
// Инициализация колонки с вторичными данными аккаунта
let block_details = document.createElement('div');
block_details.setAttribute('id', 'profile_panel_input_suppliers_requests_block_details_' + account._key);
block_details.setAttribute('class', 'col-4 pr-0 d-flex flex-column');
// Инициализация ярлыка "INDX"
let label_indx = document.createElement('label');
label_indx.setAttribute('class', 'control-label');
label_indx.innerText = 'Индекс';
// Инициализация оболочки "INDX"
let wrap_indx = document.createElement('div');
wrap_indx.setAttribute('class', 'row mx-0 mb-3');
// Инициализация поля "INDX"
let input_indx = document.createElement('input');
input_indx.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_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_indx_edit(' + account._key + ', this);');
input_indx.value = account.indx;
// Инициализация кнопки "INDX"
let button_indx = document.createElement('a');
button_indx.setAttribute('class', 'ml-2 my-auto text-dark');
button_indx.setAttribute('type', 'button');
button_indx.setAttribute('role', 'button');
button_indx.innerHTML = '<i class="fas fa-redo-alt"></i>';
// Инициализация ярлыка "PSWD"
let label_pswd = document.createElement('label');
label_pswd.setAttribute('class', 'control-label');
label_pswd.innerText = 'Пароль';
// Инициализация оболочки "PSWD"
let wrap_pswd = document.createElement('div');
wrap_pswd.setAttribute('class', 'row mx-0 mb-3');
// Инициализация поля "PSWD"
let input_pswd = document.createElement('input');
input_pswd.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_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_pswd_edit(' + account._key + ', this);');
input_pswd.value = account.pswd;
// Инициализация кнопки "PSWD"
let button_pswd = document.createElement('a');
button_pswd.setAttribute('class', 'ml-2 my-auto text-dark');
button_pswd.setAttribute('type', 'button');
button_pswd.setAttribute('role', 'button');
button_pswd.innerHTML = '<i class="fas fa-redo-alt"></i>';
// Инициализация ярлыка "FILE"
let label_file = document.createElement('label');
label_file.setAttribute('class', 'control-label');
label_file.innerText = 'Карточка предприятия';
// Инициализация ссылки на "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.innerHTML = 'Скачать';
// Компоновка элементов блока с основной информацией
wrap_id.appendChild(label_id);
wrap_id.appendChild(value_id);
block_metadata.appendChild(wrap_id);
wrap_regs.appendChild(label_regs);
wrap_regs.appendChild(value_regs);
block_metadata.appendChild(wrap_regs);
wrap_supl.appendChild(label_supl);
wrap_supl.appendChild(value_supl);
block_metadata.appendChild(wrap_supl);
block_metadata.appendChild(button_save);
// Компоновка элементов блока с основной информацией
block_info.appendChild(label_name);
block_info.appendChild(input_name);
block_info.appendChild(label_simc);
block_info.appendChild(input_simc);
block_info.appendChild(label_mail);
block_info.appendChild(input_mail);
// Компоновка элементов блока с вторичными данными
block_details.appendChild(label_indx);
wrap_indx.appendChild(input_indx);
wrap_indx.appendChild(button_indx);
block_details.appendChild(wrap_indx);
block_details.appendChild(label_pswd);
wrap_pswd.appendChild(input_pswd);
wrap_pswd.appendChild(button_pswd);
block_details.appendChild(wrap_pswd);
block_details.appendChild(label_file);
block_details.appendChild(button_file);
// Компоновка всех колонок
container.appendChild(block_metadata);
container.appendChild(block_info);
container.appendChild(block_details);
html.add(container);
if (i < suppliers.length) {
// Это не последний элемент в списке
// Инициализация разделителя (разобраться почему его надо генерировать заново - удаляется после add)
let divider = document.createElement('div');
divider.setAttribute('class', 'dropdown-divider mx-2 mb-2');
// Добавить разделитель
html.add(divider);
}
}
// Возврат
return html;
}