Работа над сайтом 26

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2022-01-31 14:55:51 +10:00
parent 8abdaf4626
commit 953f99245c
13 changed files with 408 additions and 181 deletions

View File

@ -143,6 +143,50 @@ class Account extends Document implements IdentityInterface, PartnerInterface
[ [
'vrfy', 'vrfy',
'validateVrfyUnique' 'validateVrfyUnique'
],
[
'taxn',
'integer',
'min' => 0,
'max' => 999999999999
],
[
'cntg',
'integer',
'min' => 0,
'max' => 99999999999999999999
],
[
'ladd',
'string',
'length' => [0, 200]
],
[
[
'desc',
'cntc'
],
'string',
'length' => [0, 500]
],
[
'simc',
'integer',
'min' => 0,
'max' => 999999999999999999999999999999
],
[
'comp',
'string',
'length' => [0, 40]
],
[
[
'name',
'boss'
],
'string',
'length' => [0, 100]
] ]
] ]
); );
@ -711,73 +755,88 @@ class Account extends Document implements IdentityInterface, PartnerInterface
*/ */
public static function passwordGenerate(): ?string public static function passwordGenerate(): ?string
{ {
return match (rand(1, 35)) { $password = '';
1 => 'салазки',
2 => 'запчасти', $arr = array(
3 => 'инструменты', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
4 => 'детали', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
5 => 'компоненты', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
6 => 'ремни', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
7 => 'шестерни', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'
8 => 'блоки', );
9 => 'коронки',
10 => 'вал', for ($i = 0; $i < 6; $i++) {
11 => 'пыльник', $password .= $arr[random_int(0, count($arr) - 1)];
12 => 'шкив',
13 => 'станок',
14 => 'сальник',
15 => 'кольцо',
16 => 'цепь',
17 => 'редуктор',
18 => 'фильтр',
19 => 'клапан',
20 => 'фару',
21 => 'мотор',
22 => 'подшипник',
23 => 'болт',
24 => 'стартер',
25 => 'двигатель',
26 => 'трубку',
27 => 'прокладку',
28 => 'помпу',
29 => 'запчасть',
30 => 'втулку',
31 => 'уплотнение',
32 => 'ролик',
33 => 'датчик',
34 => 'насос',
default => 'машину'
} }
. ' ' . match (rand(1, 15)) {
1 => 'забыли', return $password;
2 => 'испортили', // return match (rand(1, 35)) {
3 => 'забрали', // 1 => 'салазки',
4 => 'порвали', // 2 => 'запчасти',
5 => 'украли', // 3 => 'инструменты',
6 => 'обменяли', // 4 => 'детали',
7 => 'угнали', // 5 => 'компоненты',
8 => 'взорвали', // 6 => 'ремни',
9 => 'поломали', // 7 => 'шестерни',
1 => 'доломали', // 8 => 'блоки',
11 => 'утопили', // 9 => 'коронки',
12 => 'испортили', // 10 => 'вал',
13 => 'добили', // 11 => 'пыльник',
14 => 'разбили', // 12 => 'шкив',
15 => 'сорвали', // 13 => 'станок',
default => 'сломали' // 14 => 'сальник',
} // 15 => 'кольцо',
. ' ' . match (rand(1, 9)) { // 16 => 'цепь',
1 => 'закажу', // 17 => 'редуктор',
2 => 'найду', // 18 => 'фильтр',
3 => 'отыщу', // 19 => 'клапан',
4 => 'запрошу', // 20 => 'фару',
5 => 'поищу', // 21 => 'мотор',
6 => 'оформлю', // 22 => 'подшипник',
7 => 'заменю', // 23 => 'болт',
8 => 'поменяю', // 24 => 'стартер',
default => 'куплю' // 25 => 'двигатель',
} // 26 => 'трубку',
. ' в скиллпартс'; // 27 => 'прокладку',
// 28 => 'помпу',
// 29 => 'запчасть',
// 30 => 'втулку',
// 31 => 'уплотнение',
// 32 => 'ролик',
// 33 => 'датчик',
// 34 => 'насос',
// default => 'машину'
// }
// . ' ' . match (rand(1, 15)) {
// 1 => 'забыли',
// 2 => 'испортили',
// 3 => 'забрали',
// 4 => 'порвали',
// 5 => 'украли',
// 6 => 'обменяли',
// 7 => 'угнали',
// 8 => 'взорвали',
// 9 => 'поломали',
// 1 => 'доломали',
// 11 => 'утопили',
// 12 => 'испортили',
// 13 => 'добили',
// 14 => 'разбили',
// 15 => 'сорвали',
// default => 'сломали'
// }
// . ' ' . match (rand(1, 9)) {
// 1 => 'закажу',
// 2 => 'найду',
// 3 => 'отыщу',
// 4 => 'запрошу',
// 5 => 'поищу',
// 6 => 'оформлю',
// 7 => 'заменю',
// 8 => 'поменяю',
// default => 'куплю'
// }
// . ' в скиллпартс';
} }
/** /**

View File

@ -20,7 +20,9 @@ abstract class Document extends ActiveRecord
*/ */
public static function collectionName(): string public static function collectionName(): string
{ {
return throw new Exception('Не инициализировано название коллекции'); throw new Exception('Не инициализировано название коллекции');
return 'document';
} }
/** /**

View File

@ -142,7 +142,7 @@ class Product extends Document
[ [
'prod', 'prod',
'string', 'string',
'length' => [3, 80], 'length' => [2, 80],
'message' => '{attribute} должен быть строкой от 3 до 80 символов' 'message' => '{attribute} должен быть строкой от 3 до 80 символов'
], ],
[ [
@ -624,13 +624,18 @@ class Product extends Document
/** /**
* Проверка на уникальность * Проверка на уникальность
* *
* @param static|null $account Аккаунт
*
* @return bool|static true если создать новую запись, static если найден дубликат * @return bool|static true если создать новую запись, static если найден дубликат
* *
* @todo * @todo
* 1. Обработка дубликатов * 1. Обработка дубликатов
*/ */
public function validateForUniqueness(): bool|static public function validateForUniqueness(Account|int|null $account = null): bool|static
{ {
// Инициализация аккаунта
$account = Account::initAccount($account);
if ($supplies = self::search(['catn' => $this->catn, 'prod' => $this->prod], limit: 100)) { if ($supplies = self::search(['catn' => $this->catn, 'prod' => $this->prod], limit: 100)) {
// Найдены поставки с таким же артикулом (catn) и производителем (prod) // Найдены поставки с таким же артикулом (catn) и производителем (prod)

View File

@ -27,7 +27,9 @@ class Settings extends Document
[ [
'search_period', 'search_period',
'search_connect_keep', 'search_connect_keep',
'delivery_from_default' 'delivery_from_default',
'addition_global',
'delivery_addition_global'
] ]
); );
} }
@ -42,7 +44,9 @@ class Settings extends Document
[ [
'search_period' => 'Поисковый период', 'search_period' => 'Поисковый период',
'search_connect_keep' => 'Режим удержания', 'search_connect_keep' => 'Режим удержания',
'delivery_from_default' => 'Место отправки поставки по умолчанию' 'delivery_from_default' => 'Место отправки поставки по умолчанию',
'addition_global' => 'Глобальная наценка',
'delivery_addition_global' => 'Глобальная надбавка к доставке'
] ]
); );
} }
@ -58,14 +62,16 @@ class Settings extends Document
[ [
[ [
'search_period', 'search_period',
'delivery_from_default' 'delivery_from_default',
'delivery_addition_global'
], ],
'integer', 'integer',
'message' => '{attribute} должен хранить цифровое значение' 'message' => '{attribute} должен хранить цифровое значение'
], ],
[ [
[ [
'search_connect_keep' 'search_connect_keep',
'addition_global'
], ],
'string', 'string',
'message' => '{attribute} должен хранить строковый тип' 'message' => '{attribute} должен хранить строковый тип'

View File

@ -446,34 +446,114 @@ class Supply extends Product implements ProductInterface, OfferInterface
foreach ($data as $doc) { foreach ($data as $doc) {
// Перебор полученных документов // Перебор полученных документов
// Инициализация буфера документов foreach ($doc as $row) {
$_doc = $doc; // Перебор строк
// Поиск всех артикулов (каталожных номеров) // Поиск артикула
$supplies = explode(',', $doc['catn'], 300); $article = $row['Артикул'] ?? $row['артикул'] ?? $row['Article'] ?? $row['article'] ?? $row['catn'];
// Поиск количества товаров // Поиск количества товаров
$amount = $doc['amnt'] ?? 1; $amount = $row['Количество'] ?? $row['количество'] ?? $row['Amount'] ?? $row['amount'] ?? $row['amnt'] ?? 1;
foreach ($supplies as $_supply) { // Поиск аналогов
// Перебор продуктов (если catn перечислены через запятую) $analogs = explode(',', $row['Артикул'] ?? $row['артикул'] ?? $row['Article'] ?? $row['article'] ?? $row['catn'], 50);
// Инициализация функции создания поставки
$create = function (string $_supply) use ($row, $analogs, &$created, &$updated, &$imported, $amount, $account) {
// Очистка
$_supply = trim($_supply); $_supply = trim($_supply);
// Запись артикула (каталожного номера) в буфер // Инициализация буфера документов
$_doc['catn'] = $_supply; $_row = [];
// Инициализация продукта
$supply = new static($_doc); // Запись артикула (каталожного номера) в буфер
$_row['catn'] = $_supply;
$_row['cost'] = (float) preg_replace('/[^\d\.]+/', '', preg_replace('/\,+/', ' ', $row['Стоимость'] ?? $row['стоимость'] ?? $row['Цена'] ?? $row['цена'] ?? $row['Cost'] ?? $row['cost'] ?? $row['Price'] ?? $row['price']));
$_row['prod'] = $row['Производитель'] ?? $row['производитель'] ?? $row['Production'] ?? $row['production'] ?? $row['prod'];
$_row['oemn'] = $analogs;
// Инициализация буфера поставки
$supply = new static($_row);
$supply->scenario = $supply::SCENARIO_WRITE; $supply->scenario = $supply::SCENARIO_WRITE;
if ($supply->validate()) { if ($supply->validate()) {
// Проверка пройдена // Проверка пройдена
if (($_supply = $supply->validateForUniqueness()) instanceof static) { if (($_supply = $supply->validateForUniqueness($account)) instanceof static) {
// Найден документ с такими параметрами // Найден документ с такими параметрами
if ($_supply->cost === $_row['cost']) {
// Стоимость не изменилась
if ($product = Product::searchByCatn($_supply->catn)) {
// Найден товар подходящий для привязки с этой поставкой
for ($i = 0; $i++ < $amount;) {
// Перебор создаваемых рёбер (так работает обозначение количества товаров в наличии)
// Поиск ребёр
$edges = SupplyEdgeProduct::searchByVertex($supply->readId(), $product->readId(), limit: 50);
if ($amount === $edges) {
// Количество товаров в поставке не изменилось
// Раз изменений нет, то обновлять ничего не нужно
continue;
} else if ($amount < $edges) {
// Количество товаров в поставке стало МЕНЬШЕ
// Расчёт разницы
$delete = $edges - $amount;
// Инициализация количества рёбер которые не удалось удалить
$failed = 0;
for ($i = 0; $i < $delete; $i++) {
// Перебор рёбер на удаление (синхронизация)
if ($edges[$i]->delete() >= 1) {
// Удалено ребро
} else {
// Не удалено ребро
// Обновление количества рёбер которые не удалось удалить
++$failed;
}
}
// Отправка уведомления
Notification::_write("Не удалось удалить $failed рёбер у поставки $supply->catn");
} else if ($amount > $edges) {
// Количество товаров в поставке стало БОЛЬШЕ
// Расчёт разницы
$write = $amount - $edges;
// Инициализация количества рёбер которые не удалось записать
$failed = 0;
for ($i = 0; $i < $write; $i++) {
// Перебор рёбер на запись (синхронизация)
if (SupplyEdgeProduct::write($supply->readId(), $product->readId(), data: ['type' => 'connect'])) {
// Записано ребро
} else {
// Не записано ребро
// Обновление количества рёбер которые не удалось записать
++$failed;
}
}
// Отправка уведомления
Notification::_write("Не удалось записать $failed рёбер у поставки $supply->catn");
}
}
}
}
// Инициализация буфера с параметрами загружаемого товара // Инициализация буфера с параметрами загружаемого товара
$vars = $supply->getAttributes(); $vars = $supply->getAttributes();
@ -491,6 +571,9 @@ class Supply extends Product implements ProductInterface, OfferInterface
// Запись поставки в буфер // Запись поставки в буфер
$imported[] = $_supply; $imported[] = $_supply;
// Запись в буфер (для универсальной обработки)
$supply = $_supply;
} else { } else {
// Не найден документ с такими параметрами // Не найден документ с такими параметрами
@ -505,8 +588,19 @@ class Supply extends Product implements ProductInterface, OfferInterface
}; };
} }
if (Product::searchByCatn($supply->catn)) { if ($product = Product::searchByCatn($supply->catn)) {
// Найден товар подходящий для привязки с только что созданной поставкой // Найден товар подходящий для привязки с только что созданной поставкой
if (isset($product->prod) && $product->prod === $supply->prod) {
// Производитель совпадает с тем, что указан в товаре
for ($i = 0; $i++ < $amount;) {
// Перебор создаваемых рёбер (так работает обозначение количества товаров в наличии)
// Запись ребра (с проверкой на дубликат)
SupplyEdgeProduct::writeSafe($supply->readId(), $product->readId(), data: ['type' => 'connect']);
}
}
} else { } else {
// Не найден товар подходящий для привязки с только что созданной поставкой // Не найден товар подходящий для привязки с только что созданной поставкой
@ -519,12 +613,23 @@ class Supply extends Product implements ProductInterface, OfferInterface
// Добавление ошибок // Добавление ошибок
foreach ($supply->errors as $attribute => $error) $this->addError($attribute, $error); foreach ($supply->errors as $attribute => $error) $this->addError($attribute, $error);
} }
};
// Запись поставки
$create($article);
foreach ($analogs as $_supply) {
// Перебор аналогов (если найдены)
// Запись поставки
$create($_supply);
}
} }
} }
} }
} }
if ($imported > 0) { if (count($imported) > 0) {
// Успешно записана минимум 1 поставка // Успешно записана минимум 1 поставка
// Инициализация инстанции импорта // Инициализация инстанции импорта

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace app\models; namespace app\models;
use app\models\traits\Xml2Array; use app\models\traits\Xml2Array;
use carono\exchange1c\interfaces\OfferInterface; use carono\exchange1c\interfaces\OfferInterface;
class SupplyEdgeProduct extends Edge implements OfferInterface class SupplyEdgeProduct extends Edge implements OfferInterface

View File

@ -181,7 +181,7 @@ class Warehouse extends Document
// Инициализация // Инициализация
$list = []; $list = [];
$cities = Dellin::read(9999); $cities = Dellin::read(9999, order: ['dellin.data.name' => 'DESC']);
foreach ($cities as $city) { foreach ($cities as $city) {
// Перебор городов // Перебор городов
@ -196,7 +196,7 @@ class Warehouse extends Document
} }
// Запись // Запись
$list[$termial['id']] = $city->data['name'] . ' (' . $termial['address'] . ')'; $list[$termial['id']] = $city->data['name'];
} }
} }
@ -238,7 +238,7 @@ class Warehouse extends Document
// Параметр $var не найден в настройках аккаунта // Параметр $var не найден в настройках аккаунта
// Сохранение параметра из данных аккаунта в начале массива // Сохранение параметра из данных аккаунта в начале массива
$list = ['Выберите' => 'Выберите'] + $list; $list = ['Город отправления' => 'Город отправления'] + $list;
} }
return $list; return $list;

View File

@ -11,7 +11,7 @@ use yii;
<?= $cart_button ?> <?= $cart_button ?>
<a class="text-dark my-auto mr-2" title="Заказы" href="/orders" role="button" onclick="return page_orders();"><i class="fas fa-list mx-2"></i></a> <a class="text-dark my-auto mr-2" title="Заказы" href="/orders" role="button" onclick="return page_orders();"><i class="fas fa-list mx-2"></i></a>
<div class="btn-group my-auto"> <div class="btn-group my-auto">
<a class="btn m-0 px-0 text-dark button_clean" title="Личный кабинет" href="/profile" role="button" onclick="return page_profile();"><b><?= yii::$app->user->identity->mail ?></b></a> <a class="btn m-0 px-0 text-dark button_clean button_underline" title="Личный кабинет" href="/profile" role="button" onclick="return page_profile();"><b><?= yii::$app->user->identity->mail ?></b></a>
<button id="menu_auth_panel_button" class="pr-0 btn button_clean button_clean_full" type="button" onclick="return deauthentication();" title="Выход"><i class="fas fa-sign-out-alt"></i></button> <button id="menu_auth_panel_button" class="pr-0 btn button_clean button_clean_full" type="button" onclick="return deauthentication();" title="Выход"><i class="fas fa-sign-out-alt"></i></button>
<!-- <div id="menu_auth_panel" class="py-1 text-center d-none"> <!-- <div id="menu_auth_panel" class="py-1 text-center d-none">
<a class="py-1 px-3 d-block button_white text-dark" onclick="return deauthentication();"><b>Выход</b></a> <a class="py-1 px-3 d-block button_white text-dark" onclick="return deauthentication();"><b>Выход</b></a>

View File

@ -296,6 +296,46 @@ $timezone = $timezone[1][0];
<?= $form->errorSummary($model_settings, ['header' => 'Получены ошибки:']) ?> <?= $form->errorSummary($model_settings, ['header' => 'Получены ошибки:']) ?>
<?= $form->field($model_settings, 'addition_global', ['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>
<?php ActiveForm::end(); ?>
<?php
$form = ActiveForm::begin([
'id' => 'form_profile_panel_settings_search_period',
'action' => false,
'fieldConfig' => [
'template' => '{label}{input}',
],
'options' => [
'onsubmit' => 'return false;',
'class' => 'mb-4'
]
]);
?>
<?= $form->field($model_settings, 'delivery_addition_global', ['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>
<?php ActiveForm::end(); ?>
<?php
$form = ActiveForm::begin([
'id' => 'form_profile_panel_settings_search_period',
'action' => false,
'fieldConfig' => [
'template' => '{label}{input}',
],
'options' => [
'onsubmit' => 'return false;',
'class' => 'mb-4'
]
]);
?>
<?= $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_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>

View File

@ -44,7 +44,7 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
<h5>Управление складами</h5> <h5>Управление складами</h5>
<div class="dropdown-divider mb-4"></div> <div class="dropdown-divider mb-4"></div>
<?php if (false && Account::isMinimalAuthorized()) : ?> <?php if (Account::isMinimalAuthorized()) : ?>
<?php <?php
$form = ActiveForm::begin([ $form = ActiveForm::begin([
'id' => 'form_product_import_excel', 'id' => 'form_product_import_excel',
@ -102,6 +102,10 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
break; break;
} }
} }
// Инициализация ссылки на скачивание
preg_match_all('/\/files\/.*$/', $import->file, $matches);
$download = $matches[0][0];
?> ?>
<div class="mb-3 row"> <div class="mb-3 row">
@ -115,7 +119,7 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
<?= $create ?? 'Неизвестно' ?> <?= $create ?? 'Неизвестно' ?>
</div> </div>
<a class="pr-0 my-auto col-auto fas fa-user text-dark" href="<?= $date_connect_with_account ?? 'Неизвестно' ?>"></a> <a class="pr-0 my-auto col-auto fas fa-user text-dark" href="<?= $date_connect_with_account ?? 'Неизвестно' ?>"></a>
<a class="pr-0 my-auto col-auto fas fa-file-download text-dark" title="Скачать" href="<?= $download ?>" aria-hidden="true" download></a> <a class="pr-0 my-auto col-auto fas fa-file-download text-dark" title="Скачать" href="<?= $download ?? '/#' ?>" aria-hidden="true" download></a>
<a class="my-auto col-auto fas fa-trash-alt text-dark" title="Удалить" type="button" aria-hidden="true" onclick="return page_profile_imports_delete(<?= $import->_key ?>);"></a> <a class="my-auto col-auto fas fa-trash-alt text-dark" title="Удалить" type="button" aria-hidden="true" onclick="return page_profile_imports_delete(<?= $import->_key ?>);"></a>
</div> </div>
@ -179,7 +183,7 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
<div class="col"> <div class="col">
<?= $import[0]->name ?? 'Без названия' ?> <?= $import[0]->name ?? 'Без названия' ?>
</div> </div>
<a class="pr-0 my-auto col-auto fas fa-file-download text-dark" title="Скачать" href="<?= $download ?>" aria-hidden="true" download></a> <a class="pr-0 my-auto col-auto fas fa-file-download text-dark" title="Скачать" href="<?= $download ?? '/#' ?>" aria-hidden="true" download></a>
<a class="my-auto col-auto fas fa-trash-alt text-dark" title="Удалить" type="button" aria-hidden="true" onclick="return page_profile_imports_delete(<?= $import->_key ?>);"></a> <a class="my-auto col-auto fas fa-trash-alt text-dark" title="Удалить" type="button" aria-hidden="true" onclick="return page_profile_imports_delete(<?= $import->_key ?>);"></a>
</div> </div>
<?php endforeach ?> <?php endforeach ?>
@ -219,27 +223,32 @@ $panel ?? $panel = 'profile_panel_supplies_input_import';
<!-- <b class="mb-2 row">Инструкция</b> --> <!-- <b class="mb-2 row">Инструкция</b> -->
<small class="row"> <small class="row">
<dl class="mb-0"> <dl class="mb-0">
<dt> <dt>1. Заполните Excel-документ, где в первой строке записаны названия колонок</dt>
1. Заполните Excel-документ, где в первой строке записаны названия колонок
<dd class="mx-4 mt-2 mb-1"><b>Артикул:</b> "артикул", "article", "catn"</dd> <dd class="mx-4 mt-2 mb-1"><b>Артикул:</b> "артикул", "article", "catn"</dd>
<dd class="mx-4 mb-1"><b>Аналоги:</b> "аналоги", "analogs", "ОЕМ", "oemn",</dd>
<dd class="mx-4 mb-1"><b>Производитель:</b> "производитель", "production", "prod"</dd> <dd class="mx-4 mb-1"><b>Производитель:</b> "производитель", "production", "prod"</dd>
<dd class="mx-4 mb-1"><b>Стоимость:</b> "стоимость", "cost"</dd> <dd class="mx-4 mb-1"><b>Стоимость:</b> "стоимость", "цена", "cost", "price"</dd>
<dd class="mx-4 mb-3"><b>Количество:</b> "количество", "amount", "amnt"</dd> <dd class="mx-4 mb-3"><b>Количество:</b> "количество", "amount", "amnt"</dd>
</dt>
<dt> <dt>2. Выберите или создайте склад и настройте его</dt>
2. Выберите или создайте склад и настройте его
<dd class="mx-4 mt-2 mb-1"><b>1.</b> Установите город в котором находится склад</dd> <dd class="mx-4 mt-2 mb-1"><b>1.</b> Установите город в котором находится склад</dd>
<dd class="mx-4 mb-1"><b>2.</b> Нажмите на кнопку "Обзор..." и выбирете Excel-документ</dd> <dd class="mx-4 mb-1"><b>2.</b> Нажмите на кнопку "Обзор..." (может называться по другому) и выбирете Excel-документ</dd>
<dd class="mx-4 mb-1"><b>3.</b> Вам предложит подтвердить отправку на сервер</dd> <dd class="mx-4 mb-1"><b>3.</b> Вам предложит подтвердить отправку на сервер</dd>
<dd class="mx-4 mb-3"><b>4.</b> Если вы не уверены, что правильно заполнили документ, то отклоните загрузку и вам предложит отправить документ модератору. Мы сами настроим и загрузим ваш документ, а так же пришлем исправления, если выявим ошибки</dd> <dd class="mx-4 mb-3"><b>4.</b> Если вы не уверены, что правильно заполнили документ, то отклоните загрузку и вам предложит отправить документ модератору. Мы сами настроим и загрузим ваш документ, а так же пришлем исправления, если выявим ошибки</dd>
</dt>
<dt> <dt>3. Проверьте что все товары загрузились успешно</dt>
3. Проверьте что все товары загрузились успешно
<dd class="mx-4 mt-2 mb-1"><b>1.</b> Присутствуют в поиске</dd> <dd class="mx-4 mt-2 mb-1"><b>1.</b> Присутствуют в поиске</dd>
<dd class="mx-4 mb-1"><b>2.</b> Отображаются в списке поставок склада</dd> <dd class="mx-4 mb-1"><b>2.</b> Отображаются в списке поставок склада</dd>
<dd class="mx-4 mb-3"><b>3.</b> В полученном уведомлении не написано об ошибках или непривязанных поставках. Если поставка не привязалась, то модератор автоматически получает запрос на решение проблемы (отсутствие товара в базе данных, либо неподходящие данные в документе). После обработки вам придёт уведомление и письмо на почту</dd> <dd class="mx-4 mb-3"><b>3.</b> В полученном уведомлении не написано об ошибках или непривязанных поставках. Если поставка не привязалась, то модератор автоматически получает запрос на решение проблемы (отсутствие товара в базе данных, либо неподходящие данные в документе). После обработки вам придёт уведомление и письмо на почту</dd>
</dt>
</dl> </dl>
<div class="col px-0">
<div class="row">
<img class="my-3 mx-auto border border-dark" src="/img/supplies/import_manual.jpg" title="Инструкция по форматированию документа для загрузки на сервер" alt="Инструкция по форматированию документа для загрузки на сервер">
</div>
<div class="row">
<a class="mx-auto" href="/files/system/supplies/sample.xlsx" download>Скачать файл с примером</a>
</div>
</div>
</small> </small>
</section> </section>
</div> </div>

View File

@ -89,6 +89,14 @@ main {
background: none !important; background: none !important;
} }
.button_underline:hover {
text-decoration: underline;
}
.button_underline:active {
text-decoration: none;
}
.form_control_clean, .form_control_clean,
.form_control_clean:hover, .form_control_clean:hover,
.form_control_clean:focus, .form_control_clean:focus,

View File

@ -84,6 +84,7 @@ function page_profile_supplies_import_excel(form, warehouse, account, panel) {
}; };
function page_profile_imports_delete(_key) { function page_profile_imports_delete(_key) {
if (confirm(`Удалить инстанцию поставок ${_key}?`)) {
$.ajax({ $.ajax({
url: '/profile/imports/delete', url: '/profile/imports/delete',
type: 'post', type: 'post',
@ -97,6 +98,9 @@ function page_profile_imports_delete(_key) {
}); });
return false; return false;
}
return true;
}; };
function page_profile_warehouses_write() { function page_profile_warehouses_write() {
@ -115,6 +119,7 @@ function page_profile_warehouses_write() {
}; };
function page_profile_warehouses_delete(_key) { function page_profile_warehouses_delete(_key) {
if (confirm(`Удалить склад ${_key}?`)) {
$.ajax({ $.ajax({
url: '/profile/warehouses/delete', url: '/profile/warehouses/delete',
type: 'post', type: 'post',
@ -128,6 +133,9 @@ function page_profile_warehouses_delete(_key) {
}); });
return false; return false;
}
return true;
}; };
function page_profile_warehouses_rename(_key, name) { function page_profile_warehouses_rename(_key, name) {

View File

@ -429,19 +429,6 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) {
input_ladd.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "ladd", this.value);'); input_ladd.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_edit(' + account._key + ', "ladd", this.value);');
input_ladd.value = account.ladd ?? ''; input_ladd.value = account.ladd ?? '';
// Инициализация ярлыка "CHCK"
let label_chck = document.createElement('label');
label_chck.setAttribute('class', 'control-label');
label_chck.innerText = 'Расчетный счет';
// Инициализация поля "CHCK"
let input_chck = document.createElement('input');
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);');
input_chck.value = account.chck ?? '';
// Инициализация ярлыка "COMP" // Инициализация ярлыка "COMP"
let label_comp = document.createElement('label'); let label_comp = document.createElement('label');
label_comp.setAttribute('class', 'control-label'); label_comp.setAttribute('class', 'control-label');
@ -458,7 +445,7 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) {
// Инициализация ярлыка "CNTC" // Инициализация ярлыка "CNTC"
let label_cntc = document.createElement('label'); let label_cntc = document.createElement('label');
label_cntc.setAttribute('class', 'control-label'); label_cntc.setAttribute('class', 'control-label');
label_cntc.innerText = 'Контакты'; label_cntc.innerText = 'Доп. информация';
// Инициализация поля "CNTC" // Инициализация поля "CNTC"
let input_cntc = document.createElement('textarea'); let input_cntc = document.createElement('textarea');
@ -544,9 +531,6 @@ function page_profile_panel_input_suppliers_requests_generate(suppliers) {
block_details.appendChild(label_ladd); block_details.appendChild(label_ladd);
block_details.appendChild(input_ladd); block_details.appendChild(input_ladd);
block_details.appendChild(label_chck);
block_details.appendChild(input_chck);
block_details.appendChild(label_cntc); block_details.appendChild(label_cntc);
block_details.appendChild(input_cntc); block_details.appendChild(input_cntc);