Обновление панели заказов

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-06-16 08:24:26 +10:00
parent 9e120afc24
commit cb315a9fcf
13 changed files with 422 additions and 300 deletions

View File

@ -14,7 +14,7 @@
], ],
"require": { "require": {
"php": "^8.0.0", "php": "^8.0.0",
"twbs/bootstrap": ">=4.5", "twbs/bootstrap": "4.6.0",
"yiisoft/yii2": "2.*", "yiisoft/yii2": "2.*",
"yiisoft/yii2-bootstrap": ">=2.0.0", "yiisoft/yii2-bootstrap": ">=2.0.0",
"yiisoft/yii2-swiftmailer": ">=2.0.0", "yiisoft/yii2-swiftmailer": ">=2.0.0",

490
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -81,7 +81,9 @@ $config = [
'orders' => 'order/index', 'orders' => 'order/index',
'orders/<_key:[^/]+>/<action:(accept)>' => 'order/<action>', 'orders/<_key:[^/]+>/<action:(accept)>' => 'order/<action>',
'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>' => 'order/supply-<action>', 'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>' => 'order/supply-<action>',
'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>' 'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>',
'invoices/<order:[^/]+>' => 'invoice/index',
'invoices/<order:[^/]+>/<action:(download)>' => 'invoice/<action>'
], ],
], ],

View File

@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace app\controllers;
use yii;
use yii\web\Controller;
use app\models\Order;
class InvoiceController extends Controller
{
public function actionIndex(int $order)
{
if ($order = Order::searchById(Order::collectionName() . '/' . $order)) {
return $this->renderPartial('/invoice/order/pattern', [
'account' => yii::$app->user->identity->_key,
'order' => [
'id' => $order->_key,
'date' => $order->date ?? time() // @todo доделать
]
]);
}
}
public function actionDownload(int $order)
{
// Инициализация файла
$file = YII_PATH_PUBLIC . '/../assets/invoices/' . $order . '/invoice.xlsx';
if (file_exists($file)) return $this->response->sendFile($file);
else yii::$app->response->statusCode = 500;
}
}

View File

@ -133,6 +133,9 @@ class OrderController extends Controller
if ($account_edge_order->save()) { if ($account_edge_order->save()) {
// Удалось сохранить изменения // Удалось сохранить изменения
// Запись в журнал
Order::searchById($account_edge_order->_to)->journal('accepted');
// Инициализация // Инициализация
$orders = Order::search(type: 'all', limit: 10, page: 1, select: '{account_edge_order, order}'); $orders = Order::search(type: 'all', limit: 10, page: 1, select: '{account_edge_order, order}');
$moderator_orders = self::genOrdersForModeration(); $moderator_orders = self::genOrdersForModeration();
@ -379,10 +382,10 @@ class OrderController extends Controller
// Удалось сохранить изменения // Удалось сохранить изменения
// Генерация счета // Генерация счета
Invoice::generate($this->renderPartial('/invoice/order/pattern', [ Invoice::generate($model->_key, $this->renderPartial('/invoice/order/pattern', [
'account' => yii::$app->user->identity->_key, 'account' => yii::$app->user->identity->_key,
'order' => [ 'order' => [
'id' => $edge->_key, 'id' => $model->_key,
'date' => $edge->date ?? time() // @todo доделать 'date' => $edge->date ?? time() // @todo доделать
] ]
])); ]));

View File

@ -23,4 +23,12 @@ class AccountEdgeOrder extends Edge
{ {
return self::find()->where(['_to' => $order_id])->limit($limit)->all(); return self::find()->where(['_to' => $order_id])->limit($limit)->all();
} }
public static function convertStatusToRussian(string $status): string
{
return match($status) {
'accepted' => 'Доставляется',
default => 'Обрабатывается'
};
}
} }

View File

@ -11,15 +11,24 @@ use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
// use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader; // use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
// use PhpOffice\PhpSpreadsheet\Writer\Html; // use PhpOffice\PhpSpreadsheet\Writer\Html;
use PhpOffice\PhpSpreadsheet\Reader\Html as HtmlReader; use PhpOffice\PhpSpreadsheet\Reader\Html as HtmlReader;
use Exception;
class Invoice extends Model class Invoice extends Model
{ {
public static function generate(string $html): void public static function generate(string|int $order_key, string $html): void
{ {
// Инициализация директории
$dir = YII_PATH_PUBLIC . '/../assets/invoices/' . $order_key;
// Сохранение на диск
if (!file_exists($dir) && !mkdir($dir, 0775, true)) throw new Exception('Не удалось записать директорию:' . $dir);
$reader = new HtmlReader(); $reader = new HtmlReader();
$spreadsheet = $reader->loadFromString($html); $spreadsheet = $reader->loadFromString($html);
$writer = new Xlsx($spreadsheet); $writer = new Xlsx($spreadsheet);
$writer->save('hello world228.xlsx'); $writer->save($dir . '/invoice.xlsx');
// $reader = new XlsxReader(); // $reader = new XlsxReader();
// $reader->setReadDataOnly(true); // $reader->setReadDataOnly(true);

View File

@ -113,4 +113,12 @@ class OrderEdgeSupply extends Edge
return []; return [];
} }
public static function convertStatusToRussian(string|int $status): string
{
return match($status) {
'accepted', 1 => 'Ожидается отправка',
default => 'Запрошен'
};
}
} }

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Competency List</title> <title>Счёт <?= $order['id'] ?></title>
</head> </head>
<body> <body>

View File

@ -2,6 +2,8 @@
declare(strict_types=1); declare(strict_types=1);
use app\models\AccountEdgeOrder;
use app\models\OrderEdgeSupply;
use yii; use yii;
use yii\bootstrap\ActiveForm; use yii\bootstrap\ActiveForm;
@ -172,16 +174,22 @@ if (
<article class="page_order_panel mt-3 py-3 px-4 rounded"> <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> <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="col mb-4 list rounded overflow-hidden">
<div class="row py-2"> <div class="row py-2 text-center">
<!-- <div class="pl-3 mr-1"> <!-- <div class="pl-3 mr-1">
<input id="checkbox_cart_all" type="checkbox" onchange="return cart_list_checkbox(this);" /> <input id="checkbox_cart_all" type="checkbox" onchange="return cart_list_checkbox(this);" />
</div> --> </div> -->
<div class="col">
<span>Поставки</span>
</div>
<div class="col-2 ml-auto"> <div class="col-2 ml-auto">
<span>Статус</span> <span>Статус</span>
</div> </div>
<div class="col-2 mr-3 text-right"> <div class="col-2">
<span>Время</span> <span>Время</span>
</div> </div>
<div class="col-1">
<span></span>
</div>
</div> </div>
<?php <?php
@ -195,8 +203,14 @@ if (
// Пропуск активного заказа (несформированного, корзины) // Пропуск активного заказа (несформированного, корзины)
if ($account_edge_order[0]['type'] === 'current') continue; if ($account_edge_order[0]['type'] === 'current') continue;
// Инициализация // Деинициализация мусора
$date = empty($jrnl) ? '' : date('H:i d.m.Y', end($jrnl)['date']); unset($date);
// Инициализация времени подтверждения заказа
if (isset($order['jrnl'])) foreach ($order['jrnl'] as $entry) {
if ($entry['action'] === 'accepted') $date = date('H:i d.m.Y', $entry['date']);
}
$date ?? $date = 'Ожидается';
// Инициализация буфера поставок // Инициализация буфера поставок
$supplies_html = ''; $supplies_html = '';
@ -211,74 +225,105 @@ if (
// Инициализация окружения // Инициализация окружения
extract($supply); extract($supply);
// Инициализация стоимости
foreach ($order_edge_supply as $part) {
// Перебор связей поставок с заказом
// Инициализация доставки // Инициализация доставки
if (isset($delivery['error'])) { if (isset($delivery['error'])) {
// Не удалось рассчитать доставку // Не удалось рассчитать доставку
// Инициализация индикатора // Инициализация индикатора
$delivery_icon = ''; $time_icon = '';
// Инициализация времени // Инициализация доставки
$delivery = '?'; if (isset($part['time'])) {
// Найдены данные в инстанции поставки
// Инициализация цены // Запись в буфер вывода
$cost = '?'; $time = $part['time'] . ' дн';
} else {
$time = 'Неизвестно';
}
// Инициализация стоимости
if (isset($part['cost'])) $cost = $part['cost'] . ' ' . $currency;
else $cost = 'Неизвестно';
} else { } else {
// Удалось рассчитать доставку // Удалось рассчитать доставку
// Инициализация типа доставки // Инициализация типа доставки
$delivery_type = reset($order_edge_supply)['dlvr']['type'] ?? 'auto'; $time_type = $part['dlvr']['type'] ?? 'auto';
// Инициализация индикатора // Инициализация индикатора
$delivery_icon = match ($delivery_type) { $time_icon = match ($time_type) {
'avia' => '<i class="mr-1 fas fa-plane"></i>', 'avia' => '<i class="mr-1 fas fa-plane"></i>',
default => '<i class="mr-1 fas fa-truck"></i>' default => '<i class="mr-1 fas fa-truck"></i>'
}; };
// Рассчет времени // Инициализация доставки
if (isset($part['time'])) {
// Найдены данные в инстанции поставки
// Запись в буфер вывода
$time = $part['time'] . ' дн';
} else {
// Рассчет времени из данных поставки
try { try {
$delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp(); $time_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch (Exception $e) { } catch (Exception $e) {
$delivery_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp(); $time_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
} }
$delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1; $time = (ceil(($time_converted - time()) / 60 / 60 / 24) + 1) . ' дн';
// Инициализация цены
$cost = $cost . ' ' . $currency;
} }
foreach ($order_edge_supply as $part) { // Инициализация стоимости
// Перебор связей поставок с заказом if (isset($part['cost'])) $cost = $part['cost'] . ' ' . $currency;
else $cost = $cost . ' ' . $currency;
}
// Инициализация статуса связи поставки // Инициализация статуса связи поставки
$status = $part['stts'] ?? 0; $status = OrderEdgeSupply::convertStatusToRussian($part['stts'] ?? 0);
$supplies_html .= <<<HTML $supplies_html .= <<<HTML
<div class="row py-2"> <div class="row py-2">
<div class="col">{$supply['catn']}</div> <div class="col-2">{$supply['catn']}</div>
<div class="col">$status</div> <div class="col-4">$status</div>
<div class="col">$delivery</div> <div class="col-3">$time_icon $time</div>
<div class="col">$cost</div> <div class="col-3">$cost</div>
</div> </div>
HTML; HTML;
} }
} }
} }
// Инициализация статуса заказа
$status = AccountEdgeOrder::convertStatusToRussian($account_edge_order[0]['type']);
// Инициализация счета для скачивания
$invoice = <<<HTML
<a class="text-dark" href="/invoices/{$order['_key']}/download"><i class="fas fa-file-invoice-dollar"></i></a>
HTML;
echo <<<HTML echo <<<HTML
<div class="row py-2 cart_list_target"> <div class="row py-2 cart_list_target text-center">
<!-- <div class="pl-3 mr-1"> <!-- <div class="pl-3 mr-1">
<input type="checkbox" onchange="return cart_list_checkbox(this);"/> <input type="checkbox" onchange="return cart_list_checkbox(this);"/>
</div> --> </div> -->
<div class="col pl-3 mr-1"> <div class="col">
$supplies_html $supplies_html
</div> </div>
<div class="col-2 ml-auto"> <div class="col-2 ml-auto py-2">
{$account_edge_order[0]['type']} $status
</div> </div>
<div class="col-2 mr-3 text-right"> <div class="col-2 py-2">
$date $date
</div> </div>
<div class="col-1 py-2">
$invoice
</div>
</div> </div>
HTML; HTML;
} }

View File

@ -97,6 +97,13 @@
if (isset($delivery['error']) || $delivery === '?') { if (isset($delivery['error']) || $delivery === '?') {
// Не удалось рассчитать доставку // Не удалось рассчитать доставку
// Инициализация типа доставки
$delivery_type = $delivery['type'] ?? 'auto';
// Инициализация индикатора
$delivery_icon = '<i class="mr-1 fas fa-truck"></i>';
// Инициализация времени
$delivery = '?'; $delivery = '?';
} else { } else {
// Удалось рассчитать доставку // Удалось рассчитать доставку

View File

@ -279,7 +279,7 @@ function orders_supply_comm_write(button, supply_key, order_key) {
dataType: 'json', dataType: 'json',
data: { data: {
'_csrf': yii.getCsrfToken(), '_csrf': yii.getCsrfToken(),
'stts': 1 'stts': 'accepted'
}, },
success: function (data, status) { success: function (data, status) {
// Инициализация индикатора // Инициализация индикатора