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

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": {
"php": "^8.0.0",
"twbs/bootstrap": ">=4.5",
"twbs/bootstrap": "4.6.0",
"yiisoft/yii2": "2.*",
"yiisoft/yii2-bootstrap": ">=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/<_key:[^/]+>/<action:(accept)>' => 'order/<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()) {
// Удалось сохранить изменения
// Запись в журнал
Order::searchById($account_edge_order->_to)->journal('accepted');
// Инициализация
$orders = Order::search(type: 'all', limit: 10, page: 1, select: '{account_edge_order, order}');
$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,
'order' => [
'id' => $edge->_key,
'id' => $model->_key,
'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();
}
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\Writer\Html;
use PhpOffice\PhpSpreadsheet\Reader\Html as HtmlReader;
use Exception;
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();
$spreadsheet = $reader->loadFromString($html);
$writer = new Xlsx($spreadsheet);
$writer->save('hello world228.xlsx');
$writer->save($dir . '/invoice.xlsx');
// $reader = new XlsxReader();
// $reader->setReadDataOnly(true);

View File

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

View File

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

View File

@ -2,6 +2,8 @@
declare(strict_types=1);
use app\models\AccountEdgeOrder;
use app\models\OrderEdgeSupply;
use yii;
use yii\bootstrap\ActiveForm;
@ -172,16 +174,22 @@ if (
<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">
<div class="row py-2 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 mr-3 text-right">
<div class="col-2">
<span>Время</span>
</div>
<div class="col-1">
<span></span>
</div>
</div>
<?php
@ -195,8 +203,14 @@ if (
// Пропуск активного заказа (несформированного, корзины)
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 = '';
@ -211,74 +225,105 @@ if (
// Инициализация окружения
extract($supply);
// Инициализация стоимости
foreach ($order_edge_supply as $part) {
// Перебор связей поставок с заказом
// Инициализация доставки
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 {
// Удалось рассчитать доставку
// Инициализация типа доставки
$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>',
default => '<i class="mr-1 fas fa-truck"></i>'
};
// Рассчет времени
// Инициализация доставки
if (isset($part['time'])) {
// Найдены данные в инстанции поставки
// Запись в буфер вывода
$time = $part['time'] . ' дн';
} else {
// Рассчет времени из данных поставки
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) {
$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;
// Инициализация цены
$cost = $cost . ' ' . $currency;
$time = (ceil(($time_converted - time()) / 60 / 60 / 24) + 1) . ' дн';
}
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
<div class="row py-2">
<div class="col">{$supply['catn']}</div>
<div class="col">$status</div>
<div class="col">$delivery</div>
<div class="col">$cost</div>
<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>
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
<div class="row py-2 cart_list_target">
<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 pl-3 mr-1">
<div class="col">
$supplies_html
</div>
<div class="col-2 ml-auto">
{$account_edge_order[0]['type']}
<div class="col-2 ml-auto py-2">
$status
</div>
<div class="col-2 mr-3 text-right">
<div class="col-2 py-2">
$date
</div>
<div class="col-1 py-2">
$invoice
</div>
</div>
HTML;
}

View File

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

View File

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