site-zkmr-calculator/mirzaev/calculator/system/controllers/calculator_controller.php

241 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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']
]);
}
}