Обновление панели заказов
This commit is contained in:
parent
9e120afc24
commit
cb315a9fcf
|
@ -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",
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -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>'
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 доделать
|
||||||
]
|
]
|
||||||
]));
|
]));
|
||||||
|
|
|
@ -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 => 'Обрабатывается'
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -113,4 +113,12 @@ class OrderEdgeSupply extends Edge
|
||||||
|
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function convertStatusToRussian(string|int $status): string
|
||||||
|
{
|
||||||
|
return match($status) {
|
||||||
|
'accepted', 1 => 'Ожидается отправка',
|
||||||
|
default => 'Запрошен'
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
// Инициализация доставки
|
// Инициализация стоимости
|
||||||
if (isset($delivery['error'])) {
|
|
||||||
// Не удалось рассчитать доставку
|
|
||||||
|
|
||||||
// Инициализация индикатора
|
|
||||||
$delivery_icon = '';
|
|
||||||
|
|
||||||
// Инициализация времени
|
|
||||||
$delivery = '?';
|
|
||||||
|
|
||||||
// Инициализация цены
|
|
||||||
$cost = '?';
|
|
||||||
} else {
|
|
||||||
// Удалось рассчитать доставку
|
|
||||||
|
|
||||||
// Инициализация типа доставки
|
|
||||||
$delivery_type = reset($order_edge_supply)['dlvr']['type'] ?? 'auto';
|
|
||||||
|
|
||||||
// Инициализация индикатора
|
|
||||||
$delivery_icon = match ($delivery_type) {
|
|
||||||
'avia' => '<i class="mr-1 fas fa-plane"></i>',
|
|
||||||
default => '<i class="mr-1 fas fa-truck"></i>'
|
|
||||||
};
|
|
||||||
|
|
||||||
// Рассчет времени
|
|
||||||
try {
|
|
||||||
$delivery_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();
|
|
||||||
}
|
|
||||||
$delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1;
|
|
||||||
|
|
||||||
// Инициализация цены
|
|
||||||
$cost = $cost . ' ' . $currency;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($order_edge_supply as $part) {
|
foreach ($order_edge_supply as $part) {
|
||||||
// Перебор связей поставок с заказом
|
// Перебор связей поставок с заказом
|
||||||
|
|
||||||
|
// Инициализация доставки
|
||||||
|
if (isset($delivery['error'])) {
|
||||||
|
// Не удалось рассчитать доставку
|
||||||
|
|
||||||
|
// Инициализация индикатора
|
||||||
|
$time_icon = '';
|
||||||
|
|
||||||
|
// Инициализация доставки
|
||||||
|
if (isset($part['time'])) {
|
||||||
|
// Найдены данные в инстанции поставки
|
||||||
|
|
||||||
|
// Запись в буфер вывода
|
||||||
|
$time = $part['time'] . ' дн';
|
||||||
|
} else {
|
||||||
|
$time = 'Неизвестно';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Инициализация стоимости
|
||||||
|
if (isset($part['cost'])) $cost = $part['cost'] . ' ' . $currency;
|
||||||
|
else $cost = 'Неизвестно';
|
||||||
|
} else {
|
||||||
|
// Удалось рассчитать доставку
|
||||||
|
|
||||||
|
// Инициализация типа доставки
|
||||||
|
$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>'
|
||||||
|
};
|
||||||
|
|
||||||
|
// Инициализация доставки
|
||||||
|
if (isset($part['time'])) {
|
||||||
|
// Найдены данные в инстанции поставки
|
||||||
|
|
||||||
|
// Запись в буфер вывода
|
||||||
|
$time = $part['time'] . ' дн';
|
||||||
|
} else {
|
||||||
|
// Рассчет времени из данных поставки
|
||||||
|
|
||||||
|
try {
|
||||||
|
$time_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$time_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
|
||||||
|
}
|
||||||
|
$time = (ceil(($time_converted - time()) / 60 / 60 / 24) + 1) . ' дн';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Инициализация стоимости
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
// Удалось рассчитать доставку
|
// Удалось рассчитать доставку
|
||||||
|
|
|
@ -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) {
|
||||||
// Инициализация индикатора
|
// Инициализация индикатора
|
||||||
|
|
Reference in New Issue