Работа над сайтом 26
This commit is contained in:
parent
8abdaf4626
commit
953f99245c
|
@ -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 => 'куплю'
|
||||||
|
// }
|
||||||
|
// . ' в скиллпартс';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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} должен хранить строковый тип'
|
||||||
|
|
|
@ -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 поставка
|
||||||
|
|
||||||
// Инициализация инстанции импорта
|
// Инициализация инстанции импорта
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Reference in New Issue