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