Изменение полей в панели модератора + генерация счетов

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-06-14 20:57:29 +10:00
parent 4f898bf796
commit 0d654ad790
12 changed files with 700 additions and 886 deletions

View File

@ -28,7 +28,7 @@
"mirzaev/yii2-arangodb": ">=2.1.x-dev",
"mirzaev/yii2-arangodb-sessions": ">=1.1.x-dev",
"guzzlehttp/guzzle": "^7.3",
"cdek-it/sdk2.0": "^0.1.5"
"mnvx/lowrapper": "^1.0"
},
"require-dev": {
"codeception/codeception": ">=4.1",

1156
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -81,7 +81,7 @@ $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)>' => 'order/supply-<action>-<target>'
'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>'
],
],

View File

@ -20,7 +20,7 @@ use app\models\Notification;
use app\models\SupplyEdgeProduct;
use Codeception\PHPUnit\ResultPrinter\HTML;
use DateTime;
use Exception;
class OrderController extends Controller
@ -34,7 +34,20 @@ class OrderController extends Controller
[
'allow' => true,
'roles' => ['@'],
'actions' => ['index', 'accept', 'read', 'write', 'delete', 'amount-update', 'pay', 'supply-read', 'supply-write-stts']
'actions' => [
'index',
'accept',
'read',
'write',
'delete',
'amount-update',
'pay',
'supply-read',
'supply-write-stts',
'supply-edit-time',
'supply-edit-cost',
'supply-edit-comm'
]
],
[
'allow' => false,
@ -429,32 +442,45 @@ class OrderController extends Controller
// Инициализация ребра: ПОСТАВКА -> ТОВАР
$supply_edge_product = SupplyEdgeProduct::searchBySupplyId($order_edge_supply->_to);
// // Поиск ребра до аккаунта
// $account = Account::searchBySupplyId($order_edge_supply->_to);
// Поиск ребра до аккаунта
$account = Account::searchBySupplyId($order_edge_supply->_to);
// // Поиск привязанного товара
// $product = Product::searchBySupplyId($order_edge_supply->_to);
// Поиск привязанного товара
$product = Product::searchBySupplyId($order_edge_supply->_to);
// try {
// // Инициализация доставки
// $delivery = Dellin::calcDeliveryAdvanced(
// explode('_', $account['opts']['delivery_from_terminal'])[1],
// explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1],
// (int) ($product['wght'] ?? 0),
// (int) ($product['dmns']['x'] ?? 0),
// (int) ($product['dmns']['y'] ?? 0),
// (int) ($product['dmns']['z'] ?? 0)
// );
// } catch (Exception $e) {
// // var_dump(json_decode($e->getMessage(), true)['errors']); die;
// }
try {
// Инициализация доставки
$delivery = Dellin::calcDeliveryAdvanced(
$account['opts']['delivery_from_terminal'],
yii::$app->user->identity->opts['delivery_to_terminal'],
(int) ($product['wght'] ?? 0),
(int) ($product['dmns']['x'] ?? 0),
(int) ($product['dmns']['y'] ?? 0),
(int) ($product['dmns']['z'] ?? 0),
avia: $order_edge_supply->dlvr['type'] === 'avia'
);
// Рассчет времени
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;
} catch (Exception $e) {
// var_dump($e->getMessage());
// var_dump($e->getTrace());
// var_dump($e->getFile()); die;
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
}
// Запись параметров
$buffer['cost'] = $order_edge_supply->cost ?? $order_edge_supply->cost = $supply_edge_product[0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу'];
$buffer['time'] = $order_edge_supply->time ?? 0;
// $buffer['time'] = $order_edge_supply->time ?? $delivery ?? 0;
$buffer['time'] = $order_edge_supply->time ?? $delivery ?? 0;
$buffer['comm'] = $order_edge_supply->comm ?? $order_edge_supply->comm = 'Комментарий к заказу';
$buffer['stts'] = $order_edge_supply->stts ?? $order_edge_supply->stts = 0;
$buffer['id'] = $order_edge_supply->_key ?? 'Неизвестно';
$order_edge_supply->save();
}
@ -469,7 +495,7 @@ class OrderController extends Controller
}
/**
* Чтение инстанции поставки в заказе (order_edge_supply)
* Запись статуса поставки в заказе (order_edge_supply)
*
* @param int $_key Ключ записи в коллекции order_edge_supply
*
@ -484,14 +510,138 @@ class OrderController extends Controller
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки
// Запись в буфер вывода и буфер записи в базу данных
$buffer['stts'] = $order_edge_supply->stts = $stts;
// Запись в буфер записи в базу данных
$order_edge_supply->stts = $stts;
// Отправка в базу данных
if ($order_edge_supply->save()) {
// Удалось сохранить изменения
// Запись в буфер вывода
$buffer['stts'] = $order_edge_supply->stts;
} else {
// Не удалось сохранить изменения
yii::$app->response->statusCode = 500;
}
}
// Запись обязательных параметров
$buffer['_csrf'] = yii::$app->request->getCsrfToken();
// Настройка ответа
yii::$app->response->format = Response::FORMAT_JSON;
return $buffer;
}
/**
* Запись цены поставки в заказе (order_edge_supply)
*
* @param int $_key Ключ записи в коллекции order_edge_supply
*
* @return string|array|null
*/
public function actionSupplyEditCost(int $_key): string|array|null
{
// Инициализация
$cost = yii::$app->request->post('cost') ?? yii::$app->request->get('cost');
$buffer = [];
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки
// Запись в буфер записи в базу данных
$order_edge_supply->cost = $cost;
// Отправка в базу данных
if ($order_edge_supply->save()) {
// Удалось сохранить изменения
// Запись в буфер вывода
$buffer['cost'] = $order_edge_supply->cost;
} else {
// Не удалось сохранить изменения
yii::$app->response->statusCode = 500;
}
}
// Запись обязательных параметров
$buffer['_csrf'] = yii::$app->request->getCsrfToken();
// Настройка ответа
yii::$app->response->format = Response::FORMAT_JSON;
return $buffer;
}
/**
* Запись времени доставки поставки в заказе (order_edge_supply)
*
* @param int $_key Ключ записи в коллекции order_edge_supply
*
* @return string|array|null
*/
public function actionSupplyEditTime(int $_key): string|array|null
{
// Инициализация
$time = yii::$app->request->post('time') ?? yii::$app->request->get('time');
$buffer = [];
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки
// Запись в буфер записи в базу данных
$order_edge_supply->time = $time;
// Отправка в базу данных
if ($order_edge_supply->save()) {
// Удалось сохранить изменения
// Запись в буфер вывода
$buffer['time'] = $order_edge_supply->time;
} else {
// Не удалось сохранить изменения
yii::$app->response->statusCode = 500;
}
}
// Запись обязательных параметров
$buffer['_csrf'] = yii::$app->request->getCsrfToken();
// Настройка ответа
yii::$app->response->format = Response::FORMAT_JSON;
return $buffer;
}
/**
* Запись комментария поставки в заказе (order_edge_supply)
*
* @param int $_key Ключ записи в коллекции order_edge_supply
*
* @return string|array|null
*/
public function actionSupplyEditComm(int $_key): string|array|null
{
// Инициализация
$comm = yii::$app->request->post('comm') ?? yii::$app->request->get('comm');
$buffer = [];
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки
// Запись в буфер записи в базу данных
$order_edge_supply->comm = $comm;
// Отправка в базу данных
if ($order_edge_supply->save()) {
// Удалось сохранить изменения
// Запись в буфер вывода
$buffer['comm'] = $order_edge_supply->comm;
} else {
// Не удалось сохранить изменения

View File

@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
namespace app\models;
use yii;
use yii\base\Model;
use Mnvx\Lowrapper\Converter;
use Mnvx\Lowrapper\LowrapperParameters;
use Mnvx\Lowrapper\Format;
class Invoice extends Model
{
public function generate(): array
{
// Создаем объект конвертера
$converter = new Converter();
// Описываем параметры для конвертера
$parameters = (new LowrapperParameters())
// На вход подаем строку с HTML
->setInputData('<html>My html file</html>')
// В каком формате нужен результат
->setOutputFormat(Format::TEXT_DOCX)
// Файл для сохранения результата
->setOutputFile('path-to-result-docx.docx');
// Запускаем конвертацию
$converter->convert($parameters);
}
}

View File

@ -458,7 +458,7 @@ class Order extends Document implements DocumentInterface
// var_dump($e->getTrace());
// var_dump($e->getFile()); die;
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
var_dump(json_decode($e->getMessage(), true)['errors']); die;
}
// Запись цены (цена поставки + цена доставки + наша наценка)

View File

@ -171,7 +171,8 @@ class Dellin extends Model
'sessionID' => self::$session,
'delivery' => [
'derival' => [
'produceDate' => date('Y-m-d', time() + ($settings['delivery_handle_time'] ?? 86400))
// 'produceDate' => date('Y-m-d', time() + ($settings['delivery_handle_time'] ?? 86400))
'produceDate' => date('Y-m-d', time() + 86400 * 3)
]
],
'members' => [

View File

@ -63,7 +63,7 @@ use DateTime;
default => '<i class="mr-1 fas fa-truck"></i>'
};
// Инициализация времени
// Рассчет времени
try {
$delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $connection['delivery']['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch (Exception $e) {

View File

@ -66,8 +66,8 @@ if (
];
?>
<p class="col-auto ml-1">#<?= $order['order']['_key'] ?></p>
<p class="col-auto mr-1">
<p class="col-auto ml-1 font-weight-bold">#<?= $order['order']['_key'] ?></p>
<p class="col-auto mr-1 font-weight-bold">
<span class="mr-2"><?= $date['H:i'] ?? 'Неизвестно' ?></span>
<span><?= $date['m.d.Y'] ?? 'Неизвестно' ?></span>
</p>
@ -133,7 +133,7 @@ if (
</div>
<?php endif ?>
</div>
<div id="orders_panel_edit_<?= $order['order']['_key'] ?>" class="px-3 col-6 d-flex flex-column">
<div id="orders_panel_edit_<?= $order['order']['_key'] ?>" class="px-4 col-6 d-flex flex-column">
<p class="my-auto">Выберите поставку</p>
</div>
<div id="orders_panel_info_<?= $order['order']['_key'] ?>" class="col-3 d-flex flex-column">

View File

@ -44,6 +44,13 @@ AppAsset::register($this);
<meta name="msapplication-TileImage" content="/favicons/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
<script type="text/javascript">
var onloadCallback = function() {
grecaptcha.render('form_suppliers_request_recaptcha', {
'sitekey': '6LcTDSsbAAAAAF-KOY6azKzaIj6rOqyegJqNKRcc'
});
};
</script>
<?php $this->registerCsrfMetaTags() ?>
@ -90,8 +97,8 @@ AppAsset::register($this);
<?= $form->field($model_request, 'phon', ['options' => ['class' => "mb-3"]])->input('tel', ['aria-invalid' => false, 'aria-required' => true, 'pattern' => '7[0-9]{3}[0-9]{3}[0-9]{2}[0-9]{2}', 'placeholder' => '79091112233', 'title' => '79091112233']); ?>
<?= $form->field($model_request, 'mail', ['options' => ['class' => "mb-3"]])->input('email', ['placeholder' => 'company@mail.ru']); ?>
<?= $form->field($model_request, 'file', ['options' => ['class' => "mb-3 d-flex flex-column justify-content-center"]])->fileInput(['multiple' => true, 'class' => 'my-auto px-0']) ?>
<div id="form_suppliers_request_recaptcha"></div>
</div>
</div>
<div class="row">
@ -103,6 +110,8 @@ AppAsset::register($this);
</main>
<?php $this->endBody() ?>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
</body>
</html>

View File

@ -11,8 +11,6 @@ function order_init(order_key) {
// Инициализация
let target = panel.children[2].children[0].children[i];
console.log(i);
if ((target === undefined || target.children[1] === undefined || target.children[1].children[0] === undefined) && !target.classList.contains('dropdown-divider')) {
supplies_are_confirmed = false;
@ -78,24 +76,65 @@ function orders_supply_edit(supply_key, order_key) {
// Удаление индикатора загрузки
panel.innerHTML = '';
// Идентификатор
if (document.getElementById(supply.getAttribute('id') + '_id') === null) {
// Инициализация контейнера
let container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_id');
container.setAttribute('class', 'row mb-1 px-3');
// Инициализация названия
let name = document.createElement('p');
name.setAttribute('id', supply.getAttribute('id') + '_id_name');
name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
name.innerText = 'Идентификатор:';
// Инициализация идентификатора
let text = document.createElement('p');
text.setAttribute('id', supply.getAttribute('id') + '_id_value');
text.setAttribute('class', 'col-auto px-0 mx-0 font-weight-bold');
if (data.id !== undefined) {
text.innerText = '#' + data.id;
} else {
text.innerText = 'Неизвестно';
}
// Запись в документ
panel.appendChild(container);
container.appendChild(name);
container.appendChild(text);
};
// // Разделитель статического информационного блока от блока с динамическими данными
// if (document.getElementById(supply.getAttribute('id') + '_info_divider') === null) {
// // Инициализация контейнера
// let divider = document.createElement('div');
// divider.setAttribute('id', supply.getAttribute('id') + '_info_divider');
// divider.setAttribute('class', 'dropdown-divider mb-2');;
// // Запись в документ
// panel.appendChild(divider);
// };
// Цена
if (document.getElementById(supply.getAttribute('id') + '_cost') === null) {
// Инициализация контейнера
let container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_cost');
container.setAttribute('class', 'row mb-3 px-3');
container.setAttribute('class', 'row px-3');
// Инициализация названия
let name = document.createElement('p');
name.setAttribute('id', supply.getAttribute('id') + '_cost_name');
name.setAttribute('class', 'col-2 text-center');
name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
name.innerText = 'Цена';
// Инициализация поля
let input = document.createElement('input');
input.setAttribute('id', supply.getAttribute('id') + '_cost_input');
input.setAttribute('class', 'col-10 form-control');
input.setAttribute('class', 'col-2 text-center form-control-plaintext');
input.setAttribute('type', 'number');
input.setAttribute('onchange', 'return orders_supply_cost_edit(' + supply_key + ', this);')
if (data.cost !== undefined) {
input.setAttribute('value', data.cost);
} else {
@ -103,10 +142,16 @@ function orders_supply_edit(supply_key, order_key) {
}
input.setAttribute('aria-invalid', 'false');
// Инициализация дополнительных данных
let info = document.createElement('p');
info.setAttribute('class', 'col-auto px-0 ml-2 mr-0');
info.innerText = 'рублей';
// Запись в документ
panel.appendChild(container);
container.appendChild(name);
container.appendChild(input);
container.appendChild(info);
};
// Время доставки
@ -114,19 +159,20 @@ function orders_supply_edit(supply_key, order_key) {
// Инициализация контейнера
let container = document.createElement('div');
container.setAttribute('id', supply.getAttribute('id') + '_time');
container.setAttribute('class', 'row mb-3 px-3');
container.setAttribute('class', 'row mb-2 px-3');
// Инициализация названия
let name = document.createElement('p');
name.setAttribute('id', supply.getAttribute('id') + '_time_name');
name.setAttribute('class', 'col-2 text-center');
name.setAttribute('class', 'col-auto px-0 ml-0 mr-2');
name.innerText = 'Время';
// Инициализация поля
let input = document.createElement('input');
input.setAttribute('id', supply.getAttribute('id') + '_time_input');
input.setAttribute('class', 'col-10 form-control');
input.setAttribute('class', 'col-1 text-center form-control-plaintext');
input.setAttribute('type', 'number');
input.setAttribute('onchange', 'return orders_supply_time_edit(' + supply_key + ', this);')
if (data.time !== undefined) {
input.setAttribute('value', data.time);
} else {
@ -134,10 +180,16 @@ function orders_supply_edit(supply_key, order_key) {
}
input.setAttribute('aria-invalid', 'false');
// Инициализация дополнительных данных
let info = document.createElement('p');
info.setAttribute('class', 'col-auto px-0 ml-2 mr-0');
info.innerText = 'дней';
// Запись в документ
panel.appendChild(container);
container.appendChild(name);
container.appendChild(input);
container.appendChild(info);
};
// Комментарий
@ -153,10 +205,11 @@ function orders_supply_edit(supply_key, order_key) {
textarea.setAttribute('class', 'col-12 form-control');
textarea.setAttribute('cols', '50');
textarea.setAttribute('rows', '3');
textarea.setAttribute('onchange', 'return orders_supply_comm_edit(' + supply_key + ', this);')
if (data.comm === undefined) {
textarea.innerText = 'Комментарий к заказу';
textarea.value = 'Комментарий к заказу';
} else {
textarea.innerText = data.comm;
textarea.value = data.comm;
}
// Запись в документ
@ -192,8 +245,6 @@ function orders_supply_edit(supply_key, order_key) {
// Инициализация
let title = document.getElementById(supply.getAttribute('id') + '_stts_indicator');
console.log(title.children[0]);
if (title.children[0] === undefined) {
// Индикатор не найден
@ -263,3 +314,99 @@ function orders_supply_comm_write(button, supply_key, order_key) {
return false;
}
/**
* Изменить цену товара в заказе
*/
function orders_supply_cost_edit(supply_key, input) {
if (supply_key !== undefined && input !== undefined) {
// Обработка входных параметров
$.ajax({
url: '/orders/supply/' + supply_key + '/edit/cost',
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken(),
'cost': input.value
},
success: function (data, status) {
if (data.cost !== undefined) {
input.value = data.cost;
}
orders_response_success(data, status);
},
error: orders_response_error
});
}
// Пересчитывание стоимости
cart_cost_calculate();
return false;
}
/**
* Изменить время доставки товара в заказе
*/
function orders_supply_time_edit(supply_key, input) {
if (supply_key !== undefined && input !== undefined) {
// Обработка входных параметров
$.ajax({
url: '/orders/supply/' + supply_key + '/edit/time',
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken(),
'time': input.value
},
success: function (data, status) {
if (data.time !== undefined) {
input.value = data.time;
}
orders_response_success(data, status);
},
error: orders_response_error
});
}
// Пересчитывание стоимости
cart_cost_calculate();
return false;
}
/**
* Изменить комментарий товара в заказе
*/
function orders_supply_comm_edit(supply_key, input) {
if (supply_key !== undefined && input !== undefined) {
// Обработка входных параметров
$.ajax({
url: '/orders/supply/' + supply_key + '/edit/comm',
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken(),
'comm': input.value
},
success: function (data, status) {
if (data.comm !== undefined) {
input.value = data.comm;
}
orders_response_success(data, status);
},
error: orders_response_error
});
}
// Пересчитывание стоимости
cart_cost_calculate();
return false;
}