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

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-06-21 09:21:10 +10:00
parent 8c4ca42d3c
commit cc1e7e7d66
14 changed files with 189 additions and 79 deletions

View File

@ -51,15 +51,28 @@ $config = [
'errorHandler' => [
'errorAction' => 'error',
],
'mailer' => [
'mail_info' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'ssl://smtp.yandex.com',
'host' => 'smtp.yandex.com',
'username' => 'info@skillparts.ru',
'password' => 'SkillParts_1337',
'port' => '587',
'port' => '465',
'encryption' => 'ssl',
],
],
'mail_system' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.yandex.com',
'username' => 'system@skillparts.ru',
'password' => 'System01001010Null',
'port' => '465',
'encryption' => 'ssl',
],
],

View File

@ -361,7 +361,7 @@ class OrderController extends Controller
public function actionPay(): string|array|null
{
// Инициализация
$model = Order::search();
$model = Order::search(supplies: true);
// Поиск ребра
$edge = AccountEdgeOrder::searchByVertex(yii::$app->user->id, $model->readId(), 'current');
@ -381,12 +381,33 @@ class OrderController extends Controller
if ($edge->update()) {
// Удалось сохранить изменения
// Генерация счета
// Инициализация буфера поставок
$supplies = [];
foreach($model['supplies'] as $supply) {
$supplies[] = [
'title' => $supply['supply']['catn'],
'amount' => [
'value' => $supply['amount'] ?? 0,
'unit' => 'шт'
],
'cost' => [
'value' => $supply['cost'] ?? 0,
'unit' => 'руб'
],
'type' => 'supply'
];
}
Invoice::generate($model->_key, $this->renderPartial('/invoice/order/pattern', [
'account' => yii::$app->user->identity->_key,
'buyer' => [
'id' => yii::$app->user->identity->_key,
'info' => 'Неизвестно'
],
'order' => [
'id' => $model->_key,
'date' => $edge->date ?? time() // @todo доделать
'date' => $edge->date ?? time(),
'entries' => $supplies
]
]));
@ -394,7 +415,7 @@ class OrderController extends Controller
$model->journal('requested');
// Отправка уведомлений модераторам
Notification::_write($this->renderPartial('/notification/system/newOrder', ['id' => $edge->_key]), true, '@auth', Notification::TYPE_MODERATOR_ORDER_NEW);
Notification::_write($this->renderPartial('/notification/system/orders/new', ['id' => $edge->_key]), true, '@auth', Notification::TYPE_MODERATOR_ORDER_NEW);
}
// Инициализация
@ -525,6 +546,9 @@ class OrderController extends Controller
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки
// Запись в буфер изначальных данных
$old = $order_edge_supply->stts;
// Запись в буфер записи в базу данных
$order_edge_supply->stts = $stts;
@ -532,6 +556,12 @@ class OrderController extends Controller
if ($order_edge_supply->save()) {
// Удалось сохранить изменения
// Инициализация аккаунта покупателя
$account = Account::searchById(AccountEdgeOrder::searchByOrder($order_edge_supply->_from)[0]->_from);
// Отправка уведомления
Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order_edge_supply->_from, 'from' => OrderEdgeSupply::convertStatusToRussian($old), 'to' => OrderEdgeSupply::convertStatusToRussian($stts), 'target' => 'Комментарий']), true, $account->_key, Notification::TYPE_NOTICE);
// Запись в буфер вывода
$buffer['stts'] = $order_edge_supply->stts;
} else {
@ -566,6 +596,9 @@ class OrderController extends Controller
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки
// Запись в буфер изначальных данных
$old = $order_edge_supply->cost;
// Запись в буфер записи в базу данных
$order_edge_supply->cost = $cost;
@ -573,6 +606,12 @@ class OrderController extends Controller
if ($order_edge_supply->save()) {
// Удалось сохранить изменения
// Инициализация аккаунта покупателя
$account = Account::searchById(AccountEdgeOrder::searchByOrder($order_edge_supply->_from)[0]->_from);
// Отправка уведомления
Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order_edge_supply->_from, 'from' => $old, 'to' => $cost, 'target' => 'Цена']), true, $account->_key, Notification::TYPE_NOTICE);
// Запись в буфер вывода
$buffer['cost'] = $order_edge_supply->cost;
} else {
@ -607,6 +646,9 @@ class OrderController extends Controller
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки
// Запись в буфер изначальных данных
$old = $order_edge_supply->time;
// Запись в буфер записи в базу данных
$order_edge_supply->time = $time;
@ -614,6 +656,12 @@ class OrderController extends Controller
if ($order_edge_supply->save()) {
// Удалось сохранить изменения
// Инициализация аккаунта покупателя
$account = Account::searchById(AccountEdgeOrder::searchByOrder($order_edge_supply->_from)[0]->_from);
// Отправка уведомления
Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order_edge_supply->_from, 'from' => $old, 'to' => $time, 'target' => 'Дата поставки']), true, $account->_key, Notification::TYPE_NOTICE);
// Запись в буфер вывода
$buffer['time'] = $order_edge_supply->time;
} else {
@ -648,6 +696,9 @@ class OrderController extends Controller
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки
// Запись в буфер изначальных данных
$old = $order_edge_supply->comm;
// Запись в буфер записи в базу данных
$order_edge_supply->comm = $comm;
@ -655,6 +706,12 @@ class OrderController extends Controller
if ($order_edge_supply->save()) {
// Удалось сохранить изменения
// Инициализация аккаунта покупателя
$account = Account::searchById(AccountEdgeOrder::searchByOrder($order_edge_supply->_from)[0]->_from);
// Отправка уведомления
Notification::_write($this->renderPartial('/notification/system/orders/edit', ['order' => $order_edge_supply->_from, 'from' => $old, 'to' => $comm, 'target' => 'Комментарий']), true, $account->_key, Notification::TYPE_NOTICE);
// Запись в буфер вывода
$buffer['comm'] = $order_edge_supply->comm;
} else {

View File

@ -29,7 +29,7 @@ class SuppliersController extends Controller
{
$request = yii::$app->request->post('Request') ?? yii::$app->request->get('Request');
yii::$app->mailer->compose()
yii::$app->mail_system->compose()
->setFrom(yii::$app->params['mail']['system'])
->setTo(yii::$app->params['mail']['info'])
->setSubject('Регистрация поставщика')

View File

@ -538,4 +538,19 @@ class Account extends Document implements IdentityInterface, PartnerInterface
select: 'account_edge_supply[0]'
)[0];
}
/**
* Генерация текста обозначающего статус аккаунта на русском языке
*
* @return string Статус аккаунта
*/
public function statusLabel(): string
{
return match($this->type) {
'administrator', 'admin' => 'Администратор',
'moderator', 'moder' => 'Модератор',
'supplier' => 'Поставщик',
default => 'Покупатель',
};
}
}

View File

@ -119,7 +119,14 @@ class AccountForm extends Model
$this->account->pswd = yii::$app->security->generatePasswordHash($this->pswd);
// Регистрация
return $this->account->save();
if ($this->account->save()) {
// Успешно завершена регистрация
// Генерация индекса
Account::generateIndexes([$this->account]);
return true;
}
}
return false;

View File

@ -147,8 +147,10 @@ class Notification extends Document
*
* @param string $html Содержимое уведомления (HTML или текст)
* @param bool|string|null $html Содержимое уведомления (HTML или текст)
* @param string $account Получатель уведомления
* @param string $account Получатель уведомления (_key)
* @param string $type Тип уведомления
*
* @todo Намного удобнее будет заменить _key на _id, чтобы из рёбер сразу получать аккаунт без лишних операций
*/
public static function _write(string $text, bool|string|null $html = false, string $account = null, string $type = self::TYPE_NOTICE): self|array|null
{

View File

@ -296,16 +296,19 @@ class Order extends Document implements DocumentInterface
foreach ($return as &$container) {
// Перебор заказов
// Инициализация настроек
$config = $container['order'];
unset($config['_id'], $config['_rev'], $config['_id']);
if ($container instanceof Order) {
$buffer = $container;
} else {
// Инициализация настроек
$config = $container['order'];
unset($config['_id'], $config['_rev'], $config['_id']);
if ($buffer = new Order($config)) {
// Удалось инициализировать буфер заказа
// Чтение полного содержания
$container['supplies'] = $buffer->content(100);
// Инициализация буфера
$buffer = new Order($config);
}
// Чтение полного содержания
$container['supplies'] = $buffer->content(30);
}
}
@ -371,7 +374,8 @@ class Order extends Document implements DocumentInterface
// || (isset($order_edge_supply['dlvr']['type']) && $order_edge_supply['dlvr']['type'] !== $target_dlvr_type)
// ) {
if ((isset($order_edge_supply['dlvr']['type']) && $order_edge_supply['dlvr']['type'] === $target_dlvr_type)
|| (empty($order_edge_supply['dlvr']['type']) && $target_dlvr_type === 'auto')) {
|| (empty($order_edge_supply['dlvr']['type']) && $target_dlvr_type === 'auto')
) {
// Тип доставки для одной поставки отличается
// Запись в буфер

View File

@ -1 +0,0 @@
<a href="orders#<?= $id ?>">Новый заказ</a>

View File

@ -0,0 +1 @@
<p class="my-2 mx-3" href="/orders#<?= $order ?>">Данные заказа #<?= $order ?> изменены: <?= $target ?> с <?= $from ?> на <?= $to ?></p>

View File

@ -0,0 +1 @@
<a href="/orders#<?= $id ?>">Новый заказ</a>

View File

@ -173,23 +173,15 @@ if (
<?php endif ?>
<article class="page_order_panel mt-3 py-3 px-4 rounded">
<h4 class="ml-4 mt-2 mb-4"><i class="fas fa-list mr-2"></i>Заказы</h4>
<div class="col mb-4 list rounded overflow-hidden">
<div class="row py-2 text-center">
<div class="col mb-4 list rounded">
<div class="row py-3 text-center">
<!-- <div class="pl-3 mr-1">
<input id="checkbox_cart_all" type="checkbox" onchange="return cart_list_checkbox(this);" />
</div> -->
<div class="col">
<span>Поставки</span>
</div>
<div class="col-2 ml-auto">
<span>Статус</span>
</div>
<div class="col-2">
<span>Время</span>
</div>
<div class="col-1">
<span></span>
</div>
<span class="col-2"><b>Артикул</b></span>
<span class="col-4"><b>Статус</b></span>
<span class="col-3"><b>Поступление</b></span>
<span class="col-3"><b>Стоимость</b></span>
</div>
<?php
@ -215,6 +207,9 @@ if (
// Инициализация буфера поставок
$supplies_html = '';
// Инициализация общей стоимости поставок
$sum = 0;
if (isset($supplies)) {
// Найдены поставки
@ -225,8 +220,6 @@ if (
// Инициализация окружения
extract($supply);
// Инициализация стоимости
foreach ($order_edge_supply as $part) {
// Перебор связей поставок с заказом
@ -235,21 +228,24 @@ if (
// Не удалось рассчитать доставку
// Инициализация индикатора
$time_icon = '';
$date_icon = '';
// Инициализация доставки
if (isset($part['time'])) {
if (isset($part['date'])) {
// Найдены данные в инстанции поставки
// Запись в буфер вывода
$time = $part['time'] . ' дн';
// $time = $part['time'] . ' дн';
$date = date('d.m.Y', $part['date']);
$date_html = "<span class=\"m-auto\">$date</span>";
} else {
$time = 'Неизвестно';
$date = 'Неизвестно';
$date_html = "<small class=\"m-auto\">$date</small>";
}
// Инициализация стоимости
if (isset($part['cost'])) $cost = $part['cost'] . ' ' . $currency;
else $cost = 'Неизвестно';
if (isset($part['cost'])) $cost_html = '<span class="m-auto">' . ($cost = $part['cost']) . ' <small>' . $currency . '</small></span>';
else $cost_html = '<small class="m-auto">' . ($cost = 'Неизвестно') . '</small>';
} else {
// Удалось рассчитать доставку
@ -257,17 +253,19 @@ if (
$time_type = $part['dlvr']['type'] ?? 'auto';
// Инициализация индикатора
$time_icon = match ($time_type) {
'avia' => '<i class="mr-1 fas fa-plane"></i>',
default => '<i class="mr-1 fas fa-truck"></i>'
$date_icon = match ($time_type) {
'avia' => '<i class="ml-1 fas fa-plane"></i>',
default => '<i class="ml-1 fas fa-truck"></i>'
};
// Инициализация доставки
if (isset($part['time'])) {
if (isset($part['date'])) {
// Найдены данные в инстанции поставки
// Запись в буфер вывода
$time = $part['time'] . ' дн';
// $time = $part['time'] . ' дн';
$date = date('d.m.Y', $part['date']);
$date_html = "<span class=\"m-auto\">$date</span>";
} else {
// Рассчет времени из данных поставки
@ -276,25 +274,37 @@ if (
} catch (Exception $e) {
$time_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
}
$time = (ceil(($time_converted - time()) / 60 / 60 / 24) + 1) . ' дн';
// $time = (ceil(($time_converted - time()) / 60 / 60 / 24) + 1) . ' дн';
$date = date('d.m.Y', $time_converted);
$date_html = "<span class=\"m-auto\">$date</span>";
}
// Инициализация стоимости
if (isset($part['cost'])) $cost = $part['cost'] . ' ' . $currency;
else $cost = $cost . ' ' . $currency;
if (isset($part['cost'])) $cost_html = '<span class="m-auto">' . ($cost = $part['cost']) . ' <small>' . $currency . '</small></span>';
else $cost_html = '<span class="m-auto">' . ($cost = $cost) . ' <small>' . $currency . '</small></span>';
}
// Инициализация статуса связи поставки
$status = OrderEdgeSupply::convertStatusToRussian($part['stts'] ?? 0);
// Инициализация класса для поставки (если необходимо)
$css = match ($part['stts'] ?? 0) {
'accepted', 1 => ' supply_accepted',
default => ''
};
// Пробела между supply и $css не должно быть
$supplies_html .= <<<HTML
<div class="row py-2">
<div class="row py-2 supply$css text-center">
<div class="col-2">{$supply['catn']}</div>
<div class="col-4">$status</div>
<div class="col-3">$time_icon $time</div>
<div class="col-3">$cost</div>
<div class="col-4 d-flex"><small class="m-auto">$status</small></div>
<div class="col-3 d-flex">$date_html</div>
<div class="col-3 d-flex">$cost_html</div>
</div>
HTML;
// Обновление общего счётчика цены
$sum += (int) $cost;
}
}
}
@ -308,22 +318,12 @@ if (
HTML;
echo <<<HTML
<div class="row py-2 cart_list_target text-center">
<!-- <div class="pl-3 mr-1">
<input type="checkbox" onchange="return cart_list_checkbox(this);"/>
</div> -->
<div class="col">
$supplies_html
</div>
<div class="col-2 ml-auto py-2">
$status
</div>
<div class="col-2 py-2">
$date
</div>
<div class="col-1 py-2">
$invoice
</div>
$supplies_html
<div class="row py-2 cart_list_target_total text-center">
<div class="col-2">$invoice</div>
<div class="col-4"><b>$status</b></div>
<div class="col-3"><b>$date</b></div>
<div class="col-3"><b>$sum <small><b>руб</b></small></b></div>
</div>
HTML;
}

View File

@ -12,8 +12,9 @@ use app\models\SupplyEdgeProduct;
?>
<div class="col py-3 rounded">
<div class="row px-3">
<p class="ml-0">Почта: </p>
<p class="mr-0"><?= yii::$app->user->identity->mail ?></p>
<p class="mb-2 w-100 d-flex"><b>Договор: </b><span class="ml-auto"><?= yii::$app->user->identity->_key ?></span></p>
<p class="mb-2 w-100 d-flex"><b>Статус: </b><span class="ml-auto"><?= yii::$app->user->identity->statusLabel() ?></span></p>
<p class="w-100 d-flex"><b>Почта: </b><span class="ml-auto"><?= yii::$app->user->identity->mail ?></span></p>
</div>
<div class="dropdown-divider my-3"></div>
<dl class="m-0">

View File

@ -74,8 +74,12 @@ AppAsset::register($this);
<main id="page_suppliers" class="container pb-5 flex-grow-1 d-flex justify-content-center">
<article class="col my-auto p-3 px-5 rounded overflow-hidden">
<h3 class="py-3 mt-2 mb-4 text-center"><b>Заявка на подключение</b></h3>
отсоси
<h3 class="py-3 mt-2 mb-4 text-center"><b>Заявка отправлена</b></h3>
<div class="row mb-4">
<a class="col-auto mx-auto btn button_blue button_clean" href="/">
На главную
</a>
</div>
</article>
</main>

View File

@ -2,12 +2,18 @@
background-color: #fff;
}
#page_orders .page_order_panel .list > .row:nth-child(2n+1) {
#page_orders .page_order_panel .list>.row:first-child, #page_orders article .cart_list_target_total {
background-color: #dbdde3;
}
#page_orders .page_order_panel .list>.supply.row:nth-child(2n-1) {
background-color: #f7f6f9;
}
#page_orders .page_order_panel .list > .row:first-child {
background-color: #dbdde3;
#page_orders .page_order_panel .list>.supply.supply_accepted.row {
-webkit-box-shadow: 4px 0px 0px 0px #123EAB inset;
-moz-box-shadow: 4px 0px 0px 0px #123EAB inset;
box-shadow: 4px 0px 0px 0px #123EAB inset;
}
#page_orders .cart_field_cost span {