diff --git a/mirzaev/skillparts/system/config/web.php.example b/mirzaev/skillparts/system/config/web.php.example index 651255b..8336323 100644 --- a/mirzaev/skillparts/system/config/web.php.example +++ b/mirzaev/skillparts/system/config/web.php.example @@ -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', ], ], diff --git a/mirzaev/skillparts/system/controllers/OrderController.php b/mirzaev/skillparts/system/controllers/OrderController.php index 1825c8c..0b93a1f 100644 --- a/mirzaev/skillparts/system/controllers/OrderController.php +++ b/mirzaev/skillparts/system/controllers/OrderController.php @@ -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 { diff --git a/mirzaev/skillparts/system/controllers/SuppliersController.php b/mirzaev/skillparts/system/controllers/SuppliersController.php index 3a1a501..ba6be62 100644 --- a/mirzaev/skillparts/system/controllers/SuppliersController.php +++ b/mirzaev/skillparts/system/controllers/SuppliersController.php @@ -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('Регистрация поставщика') diff --git a/mirzaev/skillparts/system/models/Account.php b/mirzaev/skillparts/system/models/Account.php index 3219d1d..2b0c813 100644 --- a/mirzaev/skillparts/system/models/Account.php +++ b/mirzaev/skillparts/system/models/Account.php @@ -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 => 'Покупатель', + }; + } } diff --git a/mirzaev/skillparts/system/models/AccountForm.php b/mirzaev/skillparts/system/models/AccountForm.php index c4bc15e..b99fef4 100644 --- a/mirzaev/skillparts/system/models/AccountForm.php +++ b/mirzaev/skillparts/system/models/AccountForm.php @@ -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; diff --git a/mirzaev/skillparts/system/models/Notification.php b/mirzaev/skillparts/system/models/Notification.php index 89290c5..da6b5f5 100644 --- a/mirzaev/skillparts/system/models/Notification.php +++ b/mirzaev/skillparts/system/models/Notification.php @@ -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 { diff --git a/mirzaev/skillparts/system/models/Order.php b/mirzaev/skillparts/system/models/Order.php index c160407..55d4c29 100644 --- a/mirzaev/skillparts/system/models/Order.php +++ b/mirzaev/skillparts/system/models/Order.php @@ -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') + ) { // Тип доставки для одной поставки отличается // Запись в буфер diff --git a/mirzaev/skillparts/system/views/notification/system/newOrder.php b/mirzaev/skillparts/system/views/notification/system/newOrder.php deleted file mode 100644 index 93450ff..0000000 --- a/mirzaev/skillparts/system/views/notification/system/newOrder.php +++ /dev/null @@ -1 +0,0 @@ -Новый заказ diff --git a/mirzaev/skillparts/system/views/notification/system/orders/edit.php b/mirzaev/skillparts/system/views/notification/system/orders/edit.php new file mode 100644 index 0000000..fba82a2 --- /dev/null +++ b/mirzaev/skillparts/system/views/notification/system/orders/edit.php @@ -0,0 +1 @@ +

Данные заказа # изменены: с на

diff --git a/mirzaev/skillparts/system/views/notification/system/orders/new.php b/mirzaev/skillparts/system/views/notification/system/orders/new.php new file mode 100644 index 0000000..86b9443 --- /dev/null +++ b/mirzaev/skillparts/system/views/notification/system/orders/new.php @@ -0,0 +1 @@ +Новый заказ diff --git a/mirzaev/skillparts/system/views/orders/index.php b/mirzaev/skillparts/system/views/orders/index.php index e8472a6..9355518 100644 --- a/mirzaev/skillparts/system/views/orders/index.php +++ b/mirzaev/skillparts/system/views/orders/index.php @@ -173,23 +173,15 @@ if (

Заказы

-
-
+
+
-
- Поставки -
-
- Статус -
-
- Время -
-
- -
+ Артикул + Статус + Поступление + Стоимость
$date"; } else { - $time = 'Неизвестно'; + $date = 'Неизвестно'; + $date_html = "$date"; } // Инициализация стоимости - if (isset($part['cost'])) $cost = $part['cost'] . ' ' . $currency; - else $cost = 'Неизвестно'; + if (isset($part['cost'])) $cost_html = '' . ($cost = $part['cost']) . ' ' . $currency . ''; + else $cost_html = '' . ($cost = 'Неизвестно') . ''; } else { // Удалось рассчитать доставку @@ -257,17 +253,19 @@ if ( $time_type = $part['dlvr']['type'] ?? 'auto'; // Инициализация индикатора - $time_icon = match ($time_type) { - 'avia' => '', - default => '' + $date_icon = match ($time_type) { + 'avia' => '', + default => '' }; // Инициализация доставки - if (isset($part['time'])) { + if (isset($part['date'])) { // Найдены данные в инстанции поставки // Запись в буфер вывода - $time = $part['time'] . ' дн'; + // $time = $part['time'] . ' дн'; + $date = date('d.m.Y', $part['date']); + $date_html = "$date"; } 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 = "$date"; } // Инициализация стоимости - if (isset($part['cost'])) $cost = $part['cost'] . ' ' . $currency; - else $cost = $cost . ' ' . $currency; + if (isset($part['cost'])) $cost_html = '' . ($cost = $part['cost']) . ' ' . $currency . ''; + else $cost_html = '' . ($cost = $cost) . ' ' . $currency . ''; } // Инициализация статуса связи поставки $status = OrderEdgeSupply::convertStatusToRussian($part['stts'] ?? 0); + // Инициализация класса для поставки (если необходимо) + $css = match ($part['stts'] ?? 0) { + 'accepted', 1 => ' supply_accepted', + default => '' + }; + + // Пробела между supply и $css не должно быть $supplies_html .= << +
{$supply['catn']}
-
$status
-
$time_icon $time
-
$cost
+
$status
+
$date_html
+
$cost_html
HTML; + + // Обновление общего счётчика цены + $sum += (int) $cost; } } } @@ -308,22 +318,12 @@ if ( HTML; echo << - -
- $supplies_html -
-
- $status -
-
- $date -
-
- $invoice -
+ $supplies_html +
+
$invoice
+
$status
+
$date
+
$sum руб
HTML; } diff --git a/mirzaev/skillparts/system/views/profile/sidebar.php b/mirzaev/skillparts/system/views/profile/sidebar.php index ec4effb..27d3180 100644 --- a/mirzaev/skillparts/system/views/profile/sidebar.php +++ b/mirzaev/skillparts/system/views/profile/sidebar.php @@ -12,8 +12,9 @@ use app\models\SupplyEdgeProduct; ?>
-

Почта:

-

user->identity->mail ?>

+

Договор: user->identity->_key ?>

+

Статус: user->identity->statusLabel() ?>

+

Почта: user->identity->mail ?>

@@ -122,4 +123,4 @@ use app\models\SupplyEdgeProduct;

-
\ No newline at end of file +
diff --git a/mirzaev/skillparts/system/views/suppliers/requested.php b/mirzaev/skillparts/system/views/suppliers/requested.php index 571f9f6..05ec6a4 100644 --- a/mirzaev/skillparts/system/views/suppliers/requested.php +++ b/mirzaev/skillparts/system/views/suppliers/requested.php @@ -74,8 +74,12 @@ AppAsset::register($this);
-

Заявка на подключение

- отсоси +

Заявка отправлена

+
diff --git a/mirzaev/skillparts/system/web/css/pages/orders.css b/mirzaev/skillparts/system/web/css/pages/orders.css index 8433d45..7428ca2 100644 --- a/mirzaev/skillparts/system/web/css/pages/orders.css +++ b/mirzaev/skillparts/system/web/css/pages/orders.css @@ -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 {