forked from mirzaev/site-tordv-calculator
241 lines
10 KiB
PHP
241 lines
10 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace mirzaev\calculator\controllers;
|
||
|
||
use mirzaev\calculator\controllers\core;
|
||
use mirzaev\calculator\models\calculators_model as calculators;
|
||
use mirzaev\calculator\models\settings_model as settings;
|
||
use mirzaev\calculator\models\metals_model as metals;
|
||
|
||
use Twig\Loader\FilesystemLoader;
|
||
use Twig\Environment as view;
|
||
|
||
/**
|
||
* Контроллер основной страницы
|
||
*
|
||
* @package mirzaev\calculator\controllers
|
||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||
*/
|
||
final class calculator_controller extends core
|
||
{
|
||
/**
|
||
* Калькулятор
|
||
*
|
||
* HTML-код с калькулятором
|
||
*
|
||
* @param array $vars Параметры
|
||
*/
|
||
public function index(array $vars = []): ?string
|
||
{
|
||
// Генерация представления
|
||
return $this->view->render(DIRECTORY_SEPARATOR . 'calculator' . DIRECTORY_SEPARATOR . 'index.html', $vars);
|
||
}
|
||
|
||
/**
|
||
* Модуль: "тип пользователя"
|
||
*
|
||
* HTML-код с кнопками: "физическое лицо" и "юридическое лицо"
|
||
*
|
||
* @param array $vars Параметры
|
||
*/
|
||
public function buyer(array $vars = []): ?string
|
||
{
|
||
// Инициализация параметров
|
||
$vars['buyer'] = $vars['value'] ?? 'individual';
|
||
|
||
// Удаление параметров
|
||
unset($vars['value']);
|
||
|
||
// Генерация представления
|
||
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . 'buyer.html', $vars);
|
||
}
|
||
|
||
/**
|
||
* Модуль: "сложность"
|
||
*
|
||
* HTML-код с кнопками: "легко", "средне" и "сложно"
|
||
*
|
||
* @param array $vars Параметры
|
||
*/
|
||
public function complexity(array $vars = []): ?string
|
||
{
|
||
// Инициализация параметров
|
||
$vars['complexity'] = $vars['value'] ?? 'medium';
|
||
|
||
// Удаление параметров
|
||
unset($vars['value']);
|
||
|
||
// Генерация представления
|
||
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . 'complexity.html', $vars);
|
||
}
|
||
|
||
/**
|
||
* Модуль: "меню"
|
||
*
|
||
* HTML-код с кнопками добавления калькуляторов
|
||
*
|
||
* @param array $vars Параметры
|
||
*/
|
||
public function menu(array $vars = []): ?string
|
||
{
|
||
// Генерация представления
|
||
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'menu.html', $vars);
|
||
}
|
||
|
||
/**
|
||
* Модуль: "результат"
|
||
*
|
||
* HTML-код с данными результата калькуляции
|
||
*
|
||
* @param array $vars Параметры
|
||
*/
|
||
public function result(array $vars = []): ?string
|
||
{
|
||
// Генерация представления
|
||
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . 'result.html', $vars);
|
||
}
|
||
|
||
/**
|
||
* Модуль: "марка"
|
||
*
|
||
* HTML-код со списком марок металла
|
||
*
|
||
* @param array $vars Параметры
|
||
*
|
||
* @todo 1. Если металл свой, то ничего не генерировать
|
||
*/
|
||
public function mark(array $vars = []): ?string
|
||
{
|
||
// Инициализация журнала ошибок
|
||
$vars['errors'] = ['calculators' => []];
|
||
|
||
// Инициализация списка марок
|
||
$vars['marks'] = metals::marks(empty($vars['type']) ? settings::read("default_type") : $vars['type'], $vars['errors'], $vars['errors']['calculators']);
|
||
|
||
// Инициализация значения по умолчанию
|
||
if (empty($vars['marks'])) $vars['marks'] = ['Не найдено'];
|
||
|
||
// Генерация представления
|
||
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'elements' . DIRECTORY_SEPARATOR. 'metals' . DIRECTORY_SEPARATOR . 'mark.html', $vars);
|
||
}
|
||
|
||
/**
|
||
* Модуль: "разделитель"
|
||
*
|
||
* HTML-код с разделителем элементов
|
||
*
|
||
* @param array $vars Параметры
|
||
*/
|
||
public function divider(array $vars = []): ?string
|
||
{
|
||
// Генерация представления
|
||
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . 'divider.html', $vars);
|
||
}
|
||
|
||
/**
|
||
* Лазерная резка
|
||
*
|
||
* HTML-код с калькулятором лазерной резки
|
||
*
|
||
* @param array $vars Параметры
|
||
*
|
||
* @todo 1. Заголовок калькулятора должен находиться внутри элемента калькулятора
|
||
* 2. Ограничение значений полей в зависимости от выбранной марки
|
||
*/
|
||
public function laser(array $vars = []): ?string
|
||
{
|
||
// Инициализация журнала ошибок
|
||
$vars['errors'] = ['calculators' => []];
|
||
|
||
// Инициализация данных калькулятора
|
||
$vars['calculators'] = ['laser' => [
|
||
'company' => settings::read('default_buyer', $vars['errors']['calculators']),
|
||
'complexity' => settings::read('default_complexity', $vars['errors']['calculators']),
|
||
'width' => (int) round((float) settings::read('default_width', $vars['errors']['calculators'])),
|
||
'height' => (int) round((float) settings::read('default_height', $vars['errors']['calculators'])),
|
||
'length' => (int) round((float) settings::read('default_length', $vars['errors']['calculators'])),
|
||
'amount' => (int) round((float) settings::read('default_amount', $vars['errors']['calculators'])),
|
||
'type' => settings::read('default_type', $vars['errors']['calculators']),
|
||
'holes' => (int) round((float) settings::read('default_holes', $vars['errors']['calculators'])),
|
||
'diameter' => (float) settings::read('default_diameter', $vars['errors']['calculators'])
|
||
]];
|
||
|
||
// Генерация представления
|
||
return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'laser.html', $vars);
|
||
}
|
||
|
||
/**
|
||
* Рассчёт
|
||
*
|
||
* Генерирует ответ в виде ['expenses' => 0, 'income' => 0, 'profit' => 0]
|
||
*
|
||
* @param array $vars Параметры
|
||
*
|
||
* @todo
|
||
* 1. Отправлять данные в зависимости от разрешения (обычным пользователям только expenses)
|
||
* 2. Переписать журнал ошибок и написать вывод ошибок куда-нибудь
|
||
* 3. Вывод ошибок в представления
|
||
* 4. Проверка на то, что существуют поставки для характеристик вписываемых в калькулятор (в режиме прямой трансляции)
|
||
* 5. Убрать передачу цены работы (оставить только время работы в часах и цену за работу в час)
|
||
*/
|
||
public function calculate(array $vars = []): ?string
|
||
{
|
||
// Инициализация журнала ошибок
|
||
$vars['errors'] = ['calculators' => []];
|
||
|
||
// Инициализация калькуляторов из тела запроса (подразумевается, что там массивы с параметрами)
|
||
$calculators = json_decode(file_get_contents('php://input'), true);
|
||
|
||
// Инициализация переменных для буфера вывода
|
||
$machines = $managers = $engineers = $operators = 0;
|
||
|
||
foreach ($calculators as $i => $calculator) {
|
||
// Перебор калькуляторов
|
||
|
||
foreach (['calculator'] as &$parameter) {
|
||
// Перебор мета-параметров
|
||
|
||
// Инициализация общего параметра
|
||
$type = $calculator[$parameter];
|
||
|
||
// Инициализация параметра для обработчика калькулятора
|
||
unset($calculator[$parameter]);
|
||
}
|
||
|
||
// Инициализация номера калькулятора в его категории
|
||
$number = count($vars['errors']['calculators'][$type] ?? []);
|
||
|
||
// Инициализация журнала ошибок для калькулятора
|
||
$calculator['errors'] = [];
|
||
|
||
// Инициализация журнала ошибок для буфера вывода
|
||
$vars['errors']['calculators'][$type][$number] = &$calculator['errors'];
|
||
|
||
// Инициализация буфера параметров
|
||
$parameters = [];
|
||
|
||
// Инициализация параметра типа покупателя (подразумевается, что если не "entity", то "individual")
|
||
$parameters['company'] = $calculator['buyer'] === 'entity';
|
||
unset($calculator['buyer']);
|
||
|
||
// Перенос остальных параметров в буфер параметров
|
||
$parameters += $calculator;
|
||
|
||
// Расчёт
|
||
[$machines, $managers, $engineers, $operators, $handymans, $other] = calculators::$type(...$parameters);
|
||
}
|
||
|
||
return json_encode([
|
||
'machines' => $machines,
|
||
'managers' => $managers,
|
||
'engineers' => $engineers,
|
||
'operators' => $operators,
|
||
'handymans' => $handymans,
|
||
'other' => $other,
|
||
'errors' => $calculator['errors']
|
||
]);
|
||
}
|
||
}
|