diff --git a/composer.json b/composer.json index 7e78dc8..1c6df0a 100644 --- a/composer.json +++ b/composer.json @@ -1,42 +1,43 @@ { - "name": "mirzaev/tordv-calculator", - "description": "Калькулятор стоимости услуг по обработке металла", - "type": "site", - "keywords": [ - "site", - "calculator" - ], - "readme": "README.md", - "homepage": "https://git.mirzaev.sexy/mirzaev/tordv-calculator", - "license": "WTFPL", - "authors": [ - { - "name": "Arsen Mirzaev Tatyano-Muradovich", - "email": "arsen@mirzaev.sexy", - "homepage": "https://mirzaev.sexy", - "role": "Programmer" - } - ], - "support": { - "email": "arsen@mirzaev.sexy", - "docs": "https://git.mirzaev.sexy/mirzaev/tordv-calculator/wiki", - "issues": "https://git.mirzaev.sexy/mirzaev/tordv-calculator/issues" - }, - "funding": [ - { - "type": "funding", - "url": "https://fund.mirzaev.sexy" - } - ], - "require": { - "php": "^8.0.0", - "mirzaev/minimal": "^2.0.x-dev", - "twig/twig": "^3.3", - "phpoffice/phpspreadsheet": "^1.20" - }, - "autoload": { - "psr-4": { - "mirzaev\\tordv\\calculator\\": "mirzaev/tordv/calculator/system" - } + "name": "mirzaev/zkmr-calculator", + "description": "Калькулятор стоимости услуг по обработке металла", + "type": "site", + "keywords": [ + "site", + "calculator" + ], + "readme": "README.md", + "homepage": "https://git.mirzaev.sexy/mirzaev/zkmr-calculator", + "license": "WTFPL", + "authors": [ + { + "name": "Arsen Mirzaev Tatyano-Muradovich", + "email": "arsen@mirzaev.sexy", + "homepage": "https://mirzaev.sexy", + "role": "Programmer" } + ], + "support": { + "email": "arsen@mirzaev.sexy", + "docs": "https://git.mirzaev.sexy/mirzaev/zkmr-calculator/wiki", + "issues": "https://git.mirzaev.sexy/mirzaev/zkmr-calculator/issues" + }, + "funding": [ + { + "type": "funding", + "url": "https://fund.mirzaev.sexy" + } + ], + "require": { + "php": "^8.2.0", + "mirzaev/minimal": "^2.0.x-dev", + "twig/twig": "^3.3", + "phpoffice/phpspreadsheet": "^1.20", + "ext-mysqli": "*" + }, + "autoload": { + "psr-4": { + "mirzaev\\zkmr\\calculator\\": "mirzaev/zkmr/calculator/system" + } + } } diff --git a/composer.lock b/composer.lock index 5d40663..2ad2830 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d63372480c8f1c3719fb9e69026eef21", + "content-hash": "c424f9f2f1b7a9cbcfaa900a5da9d892", "packages": [ { "name": "ezyang/htmlpurifier", @@ -926,7 +926,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.0.0" + "php": "^8.2.0", + "ext-mysqli": "*" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/mirzaev/tordv/calculator/system/controllers/calculator_controller.php b/mirzaev/tordv/calculator/system/controllers/calculator_controller.php deleted file mode 100644 index b040975..0000000 --- a/mirzaev/tordv/calculator/system/controllers/calculator_controller.php +++ /dev/null @@ -1,266 +0,0 @@ - - */ -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 - { - // Инициализация журнала ошибок - $vars['errors'] = ['calculators' => []]; - - // Инициализация данных калькулятора - $vars['discount'] = settings::read('discount', $vars['errors']['calculators']); - - // Генерация представления - 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 - * 5. Убрать передачу цены работы (оставить только время работы в часах и цену за работу в час) - */ - public function calculate(array $vars = []): ?string - { - // Инициализация журнала ошибок - $vars['errors'] = ['calculators' => []]; - - try { - // Инициализация параметров из тела запроса (подразумевается, что там массивы с параметрами) - $vars['input'] = json_decode(file_get_contents('php://input'), true); - - $calculators = $vars['input']['calculators']; - $discount = $vars['input']['discount']; - $cutting = $vars['input']['cutting']; - - // Инициализация переменных для буфера вывода - $machines = $managers = $engineers = $operators = $handymans = $other = 0; - - if (count($calculators) > 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 + ['cutting' => $cutting]); - } - } else { - // Не найдены калькуляторы - - throw new exception('Не найдены калькуляторы'); - } - } catch (exception $e) { - // Запись в журнал ошибок - $vars['errors']['calculators'][] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - - return json_encode([ - 'machines' => $machines, - 'managers' => $managers, - 'engineers' => $engineers, - 'operators' => $operators, - 'handymans' => $handymans, - 'other' => $other + ['discount' => $discount], - 'errors' => $vars['errors'] - ]); - } -} diff --git a/mirzaev/tordv/calculator/system/models/accounts_model.php b/mirzaev/tordv/calculator/system/models/accounts_model.php deleted file mode 100644 index c8e1b57..0000000 --- a/mirzaev/tordv/calculator/system/models/accounts_model.php +++ /dev/null @@ -1,621 +0,0 @@ - - */ -final class accounts_model extends core -{ - /** - * Регистрация - * - * @param string $name Входной псевдоним - * @param string $email Почта - * @param string $password Пароль (password) - * @param bool $authentication Автоматическая аутентификация в случае успешной регистрации - * @param array &$errors Журнал ошибок - * - * @return array|bool Аккаунт, если удалось аутентифицироваться - */ - public static function registration(string $name = null, string $email = null, string $password, array &$errors = []): array - { - try { - if (static::account($errors)) { - // Аутентифицирован пользователь - - // Запись ошибки - throw new exception('Уже аутентифицирован'); - } - - if (empty($account = static::read(['name' => $name]) or $account = static::read(['email' => $email]))) { - // Не удалось найти аккаунт - - if (static::write($name, $email, $password, $errors)) { - // Удалось зарегистрироваться - - return $account; - } - } else { - // Удалось найти аккаунт - - return $account; - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return []; - } - - /** - * Аутентификация - * - * @param string $login Входной псевдоним - * @param string $password Пароль (password) - * @param bool $remember Функция "Запомнить меня" - увеличенное время хранения cookies - * @param array &$errors Журнал ошибок - * - * @return array Аккаунт (если не найден, то пустой массив) - */ - public static function authentication(string $login, string $password, bool $remember = false, array &$errors = []): array - { - try { - if (static::account($errors)) { - // Аутентифицирован пользователь - - // Запись ошибки - throw new exception('Уже аутентифицирован'); - } - - - if (empty($account = static::read(['name' => $login]) or $account = static::read(['email' => $login]))) { - // Не удалось найти аккаунт - - throw new exception('Не удалось найти аккаунт'); - } - - if (password_verify($password, $account['password'])) { - // Совпадают хеши паролей - - // Инициализация идентификатора сессии - session_id($account['id']); - - // Инициализация названия сессии - session_name('id'); - - // Инициализация сессии - session_start(); - - // Инициализация времени хранения хеша - $time = time() + ($remember ? 604800 : 86400); - - // Инициализация хеша - $hash = static::hash((int) $account['id'], crypt($account['password'], time() . $account['id']), $time, $errors)['hash']; - - // Инициализация cookies - setcookie("hash", $hash, $time, path: '/', secure: true); - - return $account; - } else { - // Не совпадают хеши паролей - - throw new exception('Неправильный пароль'); - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return []; - } - - /** - * Аутентификация - * - * @param array &$errors Журнал ошибок - * - * @return bool Удалось ли деаутентифицироваться - */ - public static function deauthentication(array &$errors = []): bool - { - try { - if ($account = static::account($errors)) { - // Аутентифицирован пользователь - - // Инициализация запроса - $request = static::$db->prepare("UPDATE `accounts` SET `hash` = null, `time` = 0 WHERE `id` = :id"); - - // Параметры запроса - $params = [ - ":id" => $account['id'], - ]; - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - $request->fetch(pdo::FETCH_ASSOC); - - // Деинициализация cookies - setcookie("id", '', 0, path: '/', secure: true); - setcookie("hash", '', 0, path: '/', secure: true); - - return true; - } else { - // Не аутентифицирован пользователь - - // Запись ошибки - throw new exception('Не аутентифицирован'); - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return false; - } - - /** - * Прочитать данные аккаунта, если пользователь аутентифицирован - * - * Можно использовать как проверку на аутентифицированность - * - * @param array &$errors Журнал ошибок - * - * @return array Аккаунт (если не найден, то пустой массив) - * - * @todo 1. Сделать в static::read() возможность передачи нескольких параметров и перенести туда непосредственно чтение аккаунта с проверкой хеша - */ - public static function account(array &$errors = []): array - { - try { - if (!empty($_COOKIE['id']) && !empty($_COOKIE['hash'])) { - // Аутентифицирован аккаунт (найдены cookie и они хранят значения - подразумевается, что не null или пустое) - - if ($_COOKIE['hash'] === static::hash((int) $_COOKIE['id'], errors: $errors)['hash']) { - // Совпадает переданный хеш с тем, что хранится в базе данных - } else { - // Не совпадает переданный хеш с тем, что хранится в базе данных - - // Генерация ошибки - throw new exception('Вы аутентифицированы с другого устройства (не совпадают хеши аутентификации)'); - } - - // Инициализация запроса - $request = static::$db->prepare("SELECT * FROM `accounts` WHERE `id` = :id && `hash` = :hash"); - - // Параметры запроса - $params = [ - ":id" => $_COOKIE['id'], - ":hash" => $_COOKIE['hash'], - ]; - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - if (empty($account = $request->fetch(pdo::FETCH_ASSOC))) { - // Не найдена связка идентификатора с хешем - - // Генерация ошибки - throw new exception('Не найден пользотватель или время аутентификации истекло'); - } - - // Чтение разрешений - $account['permissions'] = static::permissions((int) $account['id'], $errors); - - return $account; - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return []; - } - - /** - * Прочитать разрешения аккаунта - * - * @param int $id Идентификатор аккаунта - * @param array &$errors Журнал ошибок - * - * @return array Разрешения аккаунта, если найдены - */ - public static function permissions(int $id, array &$errors = []): array - { - try { - // Инициализация запроса - $request = static::$db->prepare("SELECT * FROM `permissions` WHERE `id` = :id"); - - // Параметры запроса - $params = [ - ":id" => $id - ]; - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - if (empty($response = $request->fetch(pdo::FETCH_ASSOC))) { - // Не найдены разрешения - - // Генерация ошибки - throw new exception('Не найдены разрешения'); - } - - // Удаление ненужных данных - unset($response['id']); - - return $response; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return []; - } - - /** - * Проверить разрешение - * - * @param string $permission Разрешение - * @param int|null $id Идентификатор аккаунта - * @param array &$errors Журнал ошибок - * - * @return bool|null Статус разрешения, если оно записано - */ - public static function access(string $permission, int|null $id = null, array &$errors = []): ?bool - { - try { - // Инициализация аккаунта - $account = isset($id) ? self::read(['id' => $id], $errors) : self::account($errors); - - return isset($account['permissions'][$permission]) ? (bool) $account['permissions'][$permission] : null; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return null; - } - - /** - * Запись пользователя в базу данных - * - * @param string|null $name Имя - * @param string|null $email Почта - * @param string|null $password Пароль - * @param array &$errors Журнал ошибок - * - * @return array Аккаунт (если не найден, то пустой массив) - */ - public static function write(string|null $name = null, string|null $email = null, string|null $password = null, array &$errors = []): array - { - try { - // Инициализация параметров запроса - $params = []; - - if (isset($name)) { - try { - // Проверка параметра - if (iconv_strlen($name) < 3) throw new exception('Длина имени должна быть не менее 3 символов'); - if (iconv_strlen($name) > 60) throw new exception('Длина имени должна быть не более 60 символов'); - - // Запись в буфер параметров запроса - $params[':name'] = $name; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine() - ]; - - goto end; - } - } - - if (isset($email)) { - try { - // Проверка параметра - if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) throw new exception('Не удалось распознать почту'); - if (iconv_strlen($email) < 3) throw new exception('Длина почты должна быть не менее 3 символов'); - if (iconv_strlen($email) > 60) throw new exception('Длина почты должна быть не более 80 символов'); - - // Запись в буфер параметров запроса - $params[':email'] = $email; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine() - ]; - - goto end; - } - } - - if (isset($password)) { - try { - // Проверка параметра - if (iconv_strlen($password) < 3) throw new exception('Длина пароля должна быть не менее 3 символов'); - if (iconv_strlen($password) > 60) throw new exception('Длина пароля должна быть не более 120 символов'); - - // Запись в буфер параметров запроса - $params[':password'] = password_hash($password, PASSWORD_BCRYPT); - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine() - ]; - - goto end; - } - } - - // Инициализация запроса - $request = static::$db->prepare("INSERT INTO `accounts` (" . (isset($name) ? '`name`' : '') . (isset($name) && isset($email) ? ', ' : '') . (isset($email) ? '`email`' : '') . ((isset($name) || isset($email)) && isset($password) ? ', ' : '') . (isset($password) ? '`password`' : '') . ") VALUES (" . (isset($name) ? ':name' : '') . (isset($name) && isset($email) ? ', ' : '') . (isset($email) ? ':email' : '') . ((isset($name) || isset($email)) && isset($password) ? ', ' : '') . (isset($password) ? ':password' : '') . ")"); - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - $request->fetch(pdo::FETCH_ASSOC); - - try { - if (isset($name)) { - // Передано имя аккаунта - - // Чтение аккаунта - $account = static::read(['name' => $name]); - } else if (isset($email)) { - // Передана почта аккаунта - - // Чтение аккаунта - $account = static::read(['email' => $email]); - } else { - // Не передано ни имя, ни почта - - throw new exception('Не переданны данные для полноценной регистрации аккаунта'); - } - - // Инициализация запроса - $request = static::$db->prepare("INSERT INTO `permissions` (`id`) VALUES (:id)"); - - // Инициализация параметров - $params = [ - ':id' => $account['id'] - ]; - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - $request->fetch(pdo::FETCH_ASSOC); - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - // Конец выполнения - end: - - return isset($account) && $account ? $account : []; - } - - /** - * Чтение пользователя из базы данных - * - * @param array $search Поиск ('поле' => 'значение'), работает только с одним полем - * @param array &$errors Журнал ошибок - * - * @return array Аккаунт, если найден - */ - public static function read(array $search, array &$errors = []): array - { - try { - // Инициализация данных для поиска - $field = array_keys($search)[0] ?? null; - $value = $search[$field] ?? null; - - if (empty($field)) { - // Получено пустое значение поля - - // Запись ошибки - throw new exception('Пустое значение поля для поиска'); - } - - // Инициализация запроса - $request = static::$db->prepare("SELECT * FROM `accounts` WHERE `$field` = :field LIMIT 1"); - - // Параметры запроса - $params = [ - ":field" => $value, - ]; - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - if ($account = $request->fetch(pdo::FETCH_ASSOC)) { - // Найден аккаунт - - try { - if ($permissions = static::permissions((int) $account['id'], $errors)) { - // Найдены разрешения - - // Запись в буфер данных аккаунта - $account['permissions'] = $permissions; - } else { - // Не найдены разрешения - - throw new exception('Не удалось найти и прочитать разрешения'); - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine() - ]; - } - } else { - // Не найден аккаунт - - throw new exception('Не удалось найти аккаунт'); - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return isset($account) && $account ? $account : []; - } - - /** - * Запись или чтение хеша из базы данных - * - * @param int $id Идентификатор аккаунта - * @param int|null $hash Хеш аутентифиакции - * @param string|null $time Время хранения хеша - * @param array &$errors Журнал ошибок - * - * @return array ['hash' => $hash, 'time' => $time] - */ - public static function hash(int $id, string|null $hash = null, int|null $time = null, array &$errors = []): array - { - try { - if (isset($hash, $time)) { - // Переданы хеш и его время хранения - - // Инициализация запроса - $request = static::$db->prepare("UPDATE `accounts` SET `hash` = :hash, `time` = :time WHERE `id` = :id"); - - // Параметры запроса - $params = [ - ":id" => $id, - ":hash" => $hash, - ":time" => $time, - ]; - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - $request->fetch(pdo::FETCH_ASSOC); - } else { - // Не переданы хеш и его время хранения - - // Инициализация запроса - $request = static::$db->prepare("SELECT `hash`, `time` FROM `accounts` WHERE `id` = :id"); - - // Параметры запроса - $params = [ - ":id" => $id, - ]; - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - extract((array) $request->fetch(pdo::FETCH_ASSOC)); - - if (!empty($response['time']) && $response['time'] <= time()) { - // Истекло время жизни хеша - - // Инициализация запроса - $request = static::$db->prepare("UPDATE `accounts` SET `hash` = :hash, `time` = :time WHERE `id` = :id"); - - // Параметры запроса - $params = [ - ":id" => $id, - ":hash" => null, - ":time" => null, - ]; - - // Отправка запроса - $request->execute($params); - - // Генерация ответа - $response = $request->fetch(pdo::FETCH_ASSOC); - - // Генерация ошибки - throw new exception('Время аутентификации истекло'); - } - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[]= [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return ['hash' => $hash, 'time' => $time]; - } -} diff --git a/mirzaev/tordv/calculator/system/models/baloons_model.php b/mirzaev/tordv/calculator/system/models/baloons_model.php deleted file mode 100644 index b26b7c7..0000000 --- a/mirzaev/tordv/calculator/system/models/baloons_model.php +++ /dev/null @@ -1,163 +0,0 @@ - - * - * @todo - * 1. Если длина реза баллона зависит от типа металла (учитывается) то перенести это в класс металлов - */ -final class baloons_model extends core -{ - /** - * Используемый газ - */ - public string $gas; - - /** - * Количество баллонов - */ - public float $amount = 0; - - /** - * Цена всех баллонов - */ - public float $cost; - - /** - * Вычисление используемого газа - * - * @param float $length Толщина металла - * @param array &$errors Журнал ошибок - * - * @return string|null Название газа - */ - public function gas(float $length, array &$errors = []): ?string - { - try { - return $this->gas = match (true) { - $length >= 4 => 'oxygen', - default => 'air' - }; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return null; - } - - /** - * Вычисление количества используемых баллонов - * - * @param string $metal Тип металла - * @param float $cutting Длина реза - * @param float $length Толщина листа - * @param string|null $gas Используемый газ - * @param array &$errors Журнал ошибок - * - * @return int|null Количество баллонов - * - * @todo - * 1. Добавить к баллонам уточнение чтобы считало не по листам а по объёму а лучше по длине реза - * 2. Определение длины реза по типу металла - */ - public function amount(string $metal, float $cutting, float $length, ?string $gas = null, array &$errors = []): ?float - { - try { - // Инициализация входных параметров - $gas ?? $gas = &$this->gas; - - // Инициализация запроса - $request = static::$db->prepare("SELECT `length` FROM `baloons` WHERE `gas` = :gas LIMIT 30"); - - // Отправка запроса - $request->execute([ - ':gas' => $gas - ]); - - // Генерация ответа - $response = $request->fetch(pdo::FETCH_ASSOC); - - // Проверка на полученные значения - if (!is_array($response)) return null; - - // Вычисление длины реза на которое хватит баллона - $flow = $response['length'] / $length; - - // Вычисление количества баллонов (округление к большему) - return $this->amount = $cutting / $flow; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return null; - } - - - - /** - * Вычисление стоимости баллонов - * - * @param string $metal Тип металла - * @param int|null $gas Используемый газ - * @param array &$errors Журнал ошибок - * - * @return float|null Стоимость баллонов - */ - public function cost(string $metal, ?int $amount = null, ?string $gas = null, array &$errors = []): ?float - { - try { - // Инициализация входных параметров - $amount ?? $amount = &$this->amount; - $gas ?? $gas = &$this->gas; - - // Инициализация запроса - $request = static::$db->prepare("SELECT `cost` FROM `baloons` WHERE `gas` = :gas LIMIT 30"); - - // Отправка запроса - $request->execute([ - ':gas' => $gas - ]); - - // Генерация ответа - $response = $request->fetch(pdo::FETCH_ASSOC); - - // Проверка на полученные значения - if (!is_array($response)) return null; - - // Инициализация стоимости всех баллонов - return $this->cost = $response['cost'] * $amount; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return null; - } -} diff --git a/mirzaev/tordv/calculator/system/models/metals_model.php b/mirzaev/tordv/calculator/system/models/metals_model.php deleted file mode 100644 index 20ffe1d..0000000 --- a/mirzaev/tordv/calculator/system/models/metals_model.php +++ /dev/null @@ -1,232 +0,0 @@ - - */ -final class metals_model extends core -{ - /** - * Расчёт скорость реза металла - * - * @param string $metal Металл - * @param string $gas Газ - * @param float $lenght Толщина - * @param array &$errors Журнал ошибок - * - * @return float|int Скорость реза (мм/с) - */ - public static function cut(string $metal, string $gas, float $lenght, array &$errors = []): float|int - { - try { - return (float) settings::read("cut_speed_${metal}_${gas}_$lenght", $errors) ?? throw new exception('Не удалось определить скорость реза металла'); - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return 0; - } - - /** - * Определение веса - * - * @param string $type Тип - * @param array &$errors Журнал ошибок - * - * @return float|null Вес (кг) - */ - public static function kg(string $type = 'stainless_steel', array &$errors = []): ?float - { - try { - return (float) match ($type) { - 'steel' => 8, - 'galvanized_steel' => 8, - 'stainless_steel' => 8.7, - 'brass' => 8.7, - 'copper' => 9, - 'aluminum' => 3, - default => throw new exception('Не удалось определить тип металла') - }; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return null; - } - - /** - * Запись в базу данных - * - * @param int $supply Идентификатор записи поставки в базе данных - * @param string $type Тип - * @param string $mark Марка - * @param float $width Ширина (мм) - * @param float $height Высота (мм) - * @param float $length Толщина (мм) - * @param int $piece Цена за лист (руб) - * @param int $ton Цена за тонну (руб) - * @param array &$errors Журнал ошибок - * - * @return bool Статус записи - */ - public static function write(int $supply, string $type, string $mark, float $width, float $height, float $length, int $piece, int $ton, array &$errors = []): bool - { - try { - if ($account = accounts::account($errors)) { - // Инициализирован аккаунт - - // Инициализация запроса - $request = static::$db->prepare("INSERT INTO `metals` (`supply`, `type`, `mark`, `width`, `height`, `length`, `piece`, `ton`, `account`) VALUES (:supply, :type, :mark, :width, :height, :length, :piece, :ton, :account)"); - - // Инициализация параметров - $params = [ - ':supply' => $supply, - ':type' => $type, - ':mark' => $mark, - ':width' => $width, - ':height' => $height, - ':length' => $length, - ':piece' => $piece, - ':ton' => $ton, - ':account' => $account['id'], - ]; - - // Отправка запроса - $request->execute($params); - - // Получение ответа - return $request->fetch(pdo::FETCH_ASSOC) !== false; - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return false; - } - - /** - * Чтение из базы данных - * - * Очищает от дубликатов - * - * @param string $type Тип - * @param string $mark Марка - * @param float $length Толщина - * @param array &$errors Журнал ошибок - * - * @return float|null Цена за 1 килограмм (руб) - */ - public static function read(string $type, string $mark, float $length, array &$errors = []): ?array - { - try { - // Инициализация запроса - $request = static::$db->prepare("SELECT `width`, `height`, `piece`, `ton` FROM `metals` WHERE `type` = :type && `mark` = :mark && `length` = :length LIMIT 30"); - - // Отправка запроса - $request->execute([ - ':type' => $type, - ':mark' => $mark, - ':length' => $length - ]); - - // Генерация ответа - $response = $request->fetchAll(pdo::FETCH_ASSOC); - - // Проверка на полученные значения - if (!is_array($response)) return false; - - if (count($response) === 1) return $response[0]; - else if (count($response) > 1) { - // Найдено более чем одно значение - - // Инициализация буфера вывода - $buffer = $response[0]; - - foreach ($response as $metal) { - // Перебор полученных значений металлов - - // Запись в буфер металла с самой большей площадью листа - if (($metal['width'] * $metal['height']) > ($buffer['width'] * $buffer['height'])) $buffer = $metal; - } - - return $metal; - } - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return null; - } - - /** - * Поиск и чтение марок металла - * - * Очищает от дубликатов - * - * @param string $type Тип - * @param array &$errors Журнал ошибок - * - * @return float|null Цена за 1 килограмм (руб) - */ - public static function marks(string $type = '*', array &$errors = []): ?array - { - try { - // Инициализация запроса - $request = static::$db->prepare("SELECT DISTINCT `mark` FROM `metals` WHERE `type` = :type"); - - // Отправка запроса - $request->execute([':type' => $type]); - - // Генерация ответа - $response = $request->fetchAll(pdo::FETCH_COLUMN); - - return $response === false ? null : (array) $response; - } catch (exception $e) { - // Запись в журнал ошибок - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - return null; - } -} diff --git a/mirzaev/tordv/calculator/system/public/js/calculator.js b/mirzaev/tordv/calculator/system/public/js/calculator.js deleted file mode 100644 index 448d3c4..0000000 --- a/mirzaev/tordv/calculator/system/public/js/calculator.js +++ /dev/null @@ -1,577 +0,0 @@ -'use strict'; - -let calculator = { - index: document.getElementById("calculator"), - calculators: [], - account: [], - settings: { - defaults: { - buyer: 'individual', - complexity: 'medium', - } - }, - init() { - // Инициализация калькулятора - - this.generate.buyer(this.settings.defaults.buyer) - .then( - success => { - this.generate.complexity(this.settings.defaults.complexity) - .then( - success => { - this.generate.menu() - .then( - success => { - this.authenticate(cookie.read('id')) - .then( - success => { - // Запись данных аккаунта - this.account = success; - - if (this.account !== undefined && typeof this.account === 'object' && this.account.permissions !== undefined) { - // Найден аккаунт - - if (this.account.permissions.calculate == 1) { - // Разрешено использовать калькулятор - - this.generate.result(); - } - } - } - ); - } - ); - } - ); - } - ); - - console.log('[КАЛЬКУЛЯТОР] Инициализирован'); - }, - authenticate(id) { - // Запрос и генерация HTML с данными о типе покупателя (юр. лицо и физ. лицо)' - - return fetch('/account/data?id=' + id, { - method: "POST", - headers: { "content-type": "application/x-www-form-urlencoded" } - }).then((response) => { - if (response.status === 200) { - return response.json().then( - success => { - console.log('[КАЛЬКУЛЯТОР] Загружены данные пользователя: ' + id); - - return success; - }, - error => { - console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить данные пользователя: ' + id); - }); - } - }); - }, - calculate() { - // Запрос и генерация HTML с данными о рассчете со всех калькуляторов - - // Инициализация параметров - let cutting = document.getElementById('cutting'); - let discount = document.getElementById('discount'); - - // Инициализация буфера запроса - let query = { - calculators: {}, - cutting: +cutting.value ?? 0, - discount: +discount.value ?? 0 - }; - - for (const number in this.calculators) { - // Перебор калькуляторов - - // Инициализация буфера запроса для нового калькулятора - query['calculators'][number] = {}; - - // Инициализация типа калькулятора - query['calculators'][number]['calculator'] = this.calculators[number].getAttribute('data-calculator'); - - for (const buyer of this.index.querySelectorAll('input[name="buyer"]')) { - // Перебор полей с параметрами типа заказчика - - if (buyer.checked) { - // Найдено выбранное поле - - // Запись в буфер запроса - query['calculators'][number]['buyer'] = buyer.value; - } - } - - for (const complexity of this.index.querySelectorAll('input[name="complexity"]')) { - // Перебор полей с параметрами сложности - - if (complexity.checked) { - // Найдено выбранное поле - - // Запись в буфер запроса - query['calculators'][number]['complexity'] = complexity.value; - } - } - - for (const field of this.calculators[number].querySelectorAll('[data-calculator-parameter]')) { - // Перебор полей с параметрами - - if (field.getAttribute('type') === 'checkbox') { - // Флажок - - // Запись в буфер запроса - query['calculators'][number][field.getAttribute('data-calculator-parameter')] = field.checked; - } else if (field.getAttribute('type') === 'text' || field.getAttribute('type') === 'number' || field.getAttribute('type') === 'range') { - // Текстовое, цифровое поле или ползунок - - // Запись в буфер запроса - query['calculators'][number][field.getAttribute('data-calculator-parameter')] = field.value; - } else { - // Элемент с тегом - {% for mark in marks %} - - {% endfor %} - - - diff --git a/mirzaev/tordv/calculator/system/views/calculators/menu.html b/mirzaev/tordv/calculator/system/views/calculators/menu.html deleted file mode 100644 index 9d0c743..0000000 --- a/mirzaev/tordv/calculator/system/views/calculators/menu.html +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/mirzaev/tordv/calculator/system/controllers/accounts_controller.php b/mirzaev/zkmr/calculator/system/controllers/accounts_controller.php similarity index 96% rename from mirzaev/tordv/calculator/system/controllers/accounts_controller.php rename to mirzaev/zkmr/calculator/system/controllers/accounts_controller.php index f1c5c64..636b37e 100644 --- a/mirzaev/tordv/calculator/system/controllers/accounts_controller.php +++ b/mirzaev/zkmr/calculator/system/controllers/accounts_controller.php @@ -2,16 +2,16 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\controllers; +namespace mirzaev\zkmr\calculator\controllers; -use mirzaev\tordv\calculator\controllers\core; +use mirzaev\zkmr\calculator\controllers\core; -use mirzaev\tordv\calculator\models\accounts_model as accounts; +use mirzaev\zkmr\calculator\models\accounts_model as accounts; /** * Контроллер пользователей * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ final class accounts_controller extends core diff --git a/mirzaev/zkmr/calculator/system/controllers/calculator_controller.php b/mirzaev/zkmr/calculator/system/controllers/calculator_controller.php new file mode 100644 index 0000000..d0ff1d9 --- /dev/null +++ b/mirzaev/zkmr/calculator/system/controllers/calculator_controller.php @@ -0,0 +1,258 @@ + + */ +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 + { + // Инициализация журнала ошибок + $vars['errors'] = ['calculators' => []]; + + // Инициализация данных калькулятора + $vars['discount'] = settings::read('discount', $vars['errors']['calculators']); + + // Генерация представления + return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . 'result.html', $vars); + } + + /** + * Модуль: "тип забора" + * + * HTML-код со списком типов забора + * + * @param array $vars Параметры + */ + public function fence(array $vars = []): ?string + { + // Инициализация журнала ошибок + $vars['errors'] = ['calculators' => []]; + + // Генерация представления + return $this->view->render(DIRECTORY_SEPARATOR . 'calculators' . DIRECTORY_SEPARATOR . 'elements' . DIRECTORY_SEPARATOR . 'fences' . DIRECTORY_SEPARATOR . $vars['type'] . '.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 profnastil(array $vars = []): ?string + { + // Инициализация журнала ошибок + $vars['errors'] = ['calculators' => []]; + + // Инициализация данных калькулятора + $vars['calculators'] = ['profnastil' => [ + '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 . 'profnastil.html', $vars); + } + + /** + * Расчёт + * + * Генерирует ответ в виде ['expenses' => 0, 'income' => 0, 'profit' => 0] + * + * @param array $vars Параметры + * + * @todo + * 5. Убрать передачу цены работы (оставить только время работы в часах и цену за работу в час) + */ + public function calculate(array $vars = []): ?string + { + // Инициализация журнала ошибок + $vars['errors'] = ['calculators' => []]; + + try { + // Инициализация параметров из тела запроса (подразумевается, что там массивы с параметрами) + $vars['input'] = json_decode(file_get_contents('php://input'), true); + + $calculators = $vars['input']['calculators']; + $discount = $vars['input']['discount']; + $cutting = $vars['input']['cutting']; + + // Инициализация переменных для буфера вывода + $machines = $managers = $engineers = $operators = $handymans = $other = 0; + + if (count($calculators) > 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 + ['cutting' => $cutting]); + } + } else { + // Не найдены калькуляторы + + throw new exception('Не найдены калькуляторы'); + } + } catch (exception $e) { + // Запись в журнал ошибок + $vars['errors']['calculators'][] = [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + + return json_encode([ + 'machines' => $machines, + 'managers' => $managers, + 'engineers' => $engineers, + 'operators' => $operators, + 'handymans' => $handymans, + 'other' => $other + ['discount' => $discount], + 'errors' => $vars['errors'] + ]); + } +} diff --git a/mirzaev/tordv/calculator/system/controllers/contacts_controller.php b/mirzaev/zkmr/calculator/system/controllers/contacts_controller.php similarity index 81% rename from mirzaev/tordv/calculator/system/controllers/contacts_controller.php rename to mirzaev/zkmr/calculator/system/controllers/contacts_controller.php index c289200..9606ab4 100644 --- a/mirzaev/tordv/calculator/system/controllers/contacts_controller.php +++ b/mirzaev/zkmr/calculator/system/controllers/contacts_controller.php @@ -2,15 +2,15 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\controllers; +namespace mirzaev\zkmr\calculator\controllers; -use mirzaev\tordv\calculator\controllers\core; -use mirzaev\tordv\calculator\models\accounts_model as accounts; +use mirzaev\zkmr\calculator\controllers\core; +use mirzaev\zkmr\calculator\models\accounts_model as accounts; /** * Контроллер контактов * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ final class contacts_controller extends core diff --git a/mirzaev/tordv/calculator/system/controllers/core.php b/mirzaev/zkmr/calculator/system/controllers/core.php similarity index 73% rename from mirzaev/tordv/calculator/system/controllers/core.php rename to mirzaev/zkmr/calculator/system/controllers/core.php index c311cc0..2557c44 100644 --- a/mirzaev/tordv/calculator/system/controllers/core.php +++ b/mirzaev/zkmr/calculator/system/controllers/core.php @@ -2,17 +2,17 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\controllers; +namespace mirzaev\zkmr\calculator\controllers; -use mirzaev\tordv\calculator\views\manager; -use mirzaev\tordv\calculator\models\core as models; +use mirzaev\zkmr\calculator\views\manager; +use mirzaev\zkmr\calculator\models\core as models; use mirzaev\minimal\controller; /** * Менеджер представлений * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ class core extends controller diff --git a/mirzaev/tordv/calculator/system/controllers/errors_controller.php b/mirzaev/zkmr/calculator/system/controllers/errors_controller.php similarity index 84% rename from mirzaev/tordv/calculator/system/controllers/errors_controller.php rename to mirzaev/zkmr/calculator/system/controllers/errors_controller.php index 2b3bf5a..5f28b8c 100644 --- a/mirzaev/tordv/calculator/system/controllers/errors_controller.php +++ b/mirzaev/zkmr/calculator/system/controllers/errors_controller.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\controllers; +namespace mirzaev\zkmr\calculator\controllers; -use mirzaev\tordv\calculator\controllers\core; +use mirzaev\zkmr\calculator\controllers\core; use Twig\Loader\FilesystemLoader; use Twig\Environment as view; @@ -12,7 +12,7 @@ use Twig\Environment as view; /** * Контроллер основной страницы * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ final class errors_controller extends core diff --git a/mirzaev/tordv/calculator/system/controllers/journal_controller.php b/mirzaev/zkmr/calculator/system/controllers/journal_controller.php similarity index 81% rename from mirzaev/tordv/calculator/system/controllers/journal_controller.php rename to mirzaev/zkmr/calculator/system/controllers/journal_controller.php index bcd5cc7..79b719c 100644 --- a/mirzaev/tordv/calculator/system/controllers/journal_controller.php +++ b/mirzaev/zkmr/calculator/system/controllers/journal_controller.php @@ -2,15 +2,15 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\controllers; +namespace mirzaev\zkmr\calculator\controllers; -use mirzaev\tordv\calculator\controllers\core; -use mirzaev\tordv\calculator\models\accounts_model as accounts; +use mirzaev\zkmr\calculator\controllers\core; +use mirzaev\zkmr\calculator\models\accounts_model as accounts; /** * Контроллер журналов * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ final class journal_controller extends core diff --git a/mirzaev/tordv/calculator/system/controllers/main_controller.php b/mirzaev/zkmr/calculator/system/controllers/main_controller.php similarity index 78% rename from mirzaev/tordv/calculator/system/controllers/main_controller.php rename to mirzaev/zkmr/calculator/system/controllers/main_controller.php index 8ed88e5..82ae173 100644 --- a/mirzaev/tordv/calculator/system/controllers/main_controller.php +++ b/mirzaev/zkmr/calculator/system/controllers/main_controller.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\controllers; +namespace mirzaev\zkmr\calculator\controllers; -use mirzaev\tordv\calculator\controllers\core; -use mirzaev\tordv\calculator\models\accounts_model as accounts; +use mirzaev\zkmr\calculator\controllers\core; +use mirzaev\zkmr\calculator\models\accounts_model as accounts; use Twig\Loader\FilesystemLoader; use Twig\Environment as view; @@ -13,7 +13,7 @@ use Twig\Environment as view; /** * Контроллер основной страницы * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ final class main_controller extends core diff --git a/mirzaev/tordv/calculator/system/controllers/settings_controller.php b/mirzaev/zkmr/calculator/system/controllers/settings_controller.php similarity index 92% rename from mirzaev/tordv/calculator/system/controllers/settings_controller.php rename to mirzaev/zkmr/calculator/system/controllers/settings_controller.php index 7953505..7ae5e42 100644 --- a/mirzaev/tordv/calculator/system/controllers/settings_controller.php +++ b/mirzaev/zkmr/calculator/system/controllers/settings_controller.php @@ -2,16 +2,16 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\controllers; +namespace mirzaev\zkmr\calculator\controllers; -use mirzaev\tordv\calculator\controllers\core; -use mirzaev\tordv\calculator\models\accounts_model as accounts; -use mirzaev\tordv\calculator\models\settings_model as settings; +use mirzaev\zkmr\calculator\controllers\core; +use mirzaev\zkmr\calculator\models\accounts_model as accounts; +use mirzaev\zkmr\calculator\models\settings_model as settings; /** * Контроллер настроек * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ final class settings_controller extends core diff --git a/mirzaev/tordv/calculator/system/controllers/supplies_controller.php b/mirzaev/zkmr/calculator/system/controllers/supplies_controller.php similarity index 79% rename from mirzaev/tordv/calculator/system/controllers/supplies_controller.php rename to mirzaev/zkmr/calculator/system/controllers/supplies_controller.php index 4322c46..7ae75eb 100644 --- a/mirzaev/tordv/calculator/system/controllers/supplies_controller.php +++ b/mirzaev/zkmr/calculator/system/controllers/supplies_controller.php @@ -2,25 +2,25 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\controllers; +namespace mirzaev\zkmr\calculator\controllers; -use mirzaev\tordv\calculator\controllers\core; -use mirzaev\tordv\calculator\models\accounts_model as accounts; -use mirzaev\tordv\calculator\models\supplies_model as supplies; +use mirzaev\zkmr\calculator\controllers\core; +use mirzaev\zkmr\calculator\models\accounts_model as accounts; +use mirzaev\zkmr\calculator\models\supplies_model as supplies; -use mirzaev\tordv\calculator\models\filters\import_aluminum_filter; -use mirzaev\tordv\calculator\models\filters\import_brass_filter; -use mirzaev\tordv\calculator\models\filters\import_copper_filter; -use mirzaev\tordv\calculator\models\filters\import_stainless_steel_filter; -use mirzaev\tordv\calculator\models\filters\import_steel_filter; -use mirzaev\tordv\calculator\models\filters\import_galvanized_steel_filter; +use mirzaev\zkmr\calculator\models\filters\import_aluminum_filter; +use mirzaev\zkmr\calculator\models\filters\import_brass_filter; +use mirzaev\zkmr\calculator\models\filters\import_copper_filter; +use mirzaev\zkmr\calculator\models\filters\import_stainless_steel_filter; +use mirzaev\zkmr\calculator\models\filters\import_steel_filter; +use mirzaev\zkmr\calculator\models\filters\import_galvanized_steel_filter; use Exception; /** * Контроллер поставок * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ final class supplies_controller extends core diff --git a/mirzaev/zkmr/calculator/system/models/accounts_model.php b/mirzaev/zkmr/calculator/system/models/accounts_model.php new file mode 100644 index 0000000..fb045b1 --- /dev/null +++ b/mirzaev/zkmr/calculator/system/models/accounts_model.php @@ -0,0 +1,621 @@ + + */ +final class accounts_model extends core +{ + /** + * Регистрация + * + * @param string $name Входной псевдоним + * @param string $email Почта + * @param string $password Пароль (password) + * @param bool $authentication Автоматическая аутентификация в случае успешной регистрации + * @param array &$errors Журнал ошибок + * + * @return array Аккаунт, если удалось аутентифицироваться + */ + public static function registration(string $name = null, string $email = null, string $password, array &$errors = []): array + { + try { + if (static::account($errors)) { + // Аутентифицирован пользователь + + // Запись ошибки + throw new exception('Уже аутентифицирован'); + } + + if (empty($account = static::read(['name' => $name]) or $account = static::read(['email' => $email]))) { + // Не удалось найти аккаунт + + if (static::write($name, $email, $password, $errors)) { + // Удалось зарегистрироваться + + return $account; + } + } else { + // Удалось найти аккаунт + + return $account; + } + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + return []; + } + + /** + * Аутентификация + * + * @param string $login Входной псевдоним + * @param string $password Пароль (password) + * @param bool $remember Функция "Запомнить меня" - увеличенное время хранения cookies + * @param array &$errors Журнал ошибок + * + * @return array Аккаунт (если не найден, то пустой массив) + */ + public static function authentication(string $login, string $password, bool $remember = false, array &$errors = []): array + { + try { + if (static::account($errors)) { + // Аутентифицирован пользователь + + // Запись ошибки + throw new exception('Уже аутентифицирован'); + } + + + if (empty($account = static::read(['name' => $login]) or $account = static::read(['email' => $login]))) { + // Не удалось найти аккаунт + + throw new exception('Не удалось найти аккаунт'); + } + + if (password_verify($password, $account['password'])) { + // Совпадают хеши паролей + + // Инициализация идентификатора сессии + session_id($account['id']); + + // Инициализация названия сессии + session_name('id'); + + // Инициализация сессии + session_start(); + + // Инициализация времени хранения хеша + $time = time() + ($remember ? 604800 : 86400); + + // Инициализация хеша + $hash = static::hash((int) $account['id'], crypt($account['password'], time() . $account['id']), $time, $errors)['hash']; + + // Инициализация cookies + setcookie("hash", $hash, $time, path: '/', secure: true); + + return $account; + } else { + // Не совпадают хеши паролей + + throw new exception('Неправильный пароль'); + } + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + return []; + } + + /** + * Аутентификация + * + * @param array &$errors Журнал ошибок + * + * @return bool Удалось ли деаутентифицироваться + */ + public static function deauthentication(array &$errors = []): bool + { + try { + if ($account = static::account($errors)) { + // Аутентифицирован пользователь + + // Инициализация запроса + $request = static::$db->prepare("UPDATE `accounts` SET `hash` = null, `time` = 0 WHERE `id` = :id"); + + // Параметры запроса + $params = [ + ":id" => $account['id'], + ]; + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + $request->fetch(pdo::FETCH_ASSOC); + + // Деинициализация cookies + setcookie("id", '', 0, path: '/', secure: true); + setcookie("hash", '', 0, path: '/', secure: true); + + return true; + } else { + // Не аутентифицирован пользователь + + // Запись ошибки + throw new exception('Не аутентифицирован'); + } + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + return false; + } + + /** + * Прочитать данные аккаунта, если пользователь аутентифицирован + * + * Можно использовать как проверку на аутентифицированность + * + * @param array &$errors Журнал ошибок + * + * @return array Аккаунт (если не найден, то пустой массив) + * + * @todo 1. Сделать в static::read() возможность передачи нескольких параметров и перенести туда непосредственно чтение аккаунта с проверкой хеша + */ + public static function account(array &$errors = []): array + { + try { + if (!empty($_COOKIE['id']) && !empty($_COOKIE['hash'])) { + // Аутентифицирован аккаунт (найдены cookie и они хранят значения - подразумевается, что не null или пустое) + + if ($_COOKIE['hash'] === static::hash((int) $_COOKIE['id'], errors: $errors)['hash']) { + // Совпадает переданный хеш с тем, что хранится в базе данных + } else { + // Не совпадает переданный хеш с тем, что хранится в базе данных + + // Генерация ошибки + throw new exception('Вы аутентифицированы с другого устройства (не совпадают хеши аутентификации)'); + } + + // Инициализация запроса + $request = static::$db->prepare("SELECT * FROM `accounts` WHERE `id` = :id && `hash` = :hash"); + + // Параметры запроса + $params = [ + ":id" => $_COOKIE['id'], + ":hash" => $_COOKIE['hash'], + ]; + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + if (empty($account = $request->fetch(pdo::FETCH_ASSOC))) { + // Не найдена связка идентификатора с хешем + + // Генерация ошибки + throw new exception('Не найден пользотватель или время аутентификации истекло'); + } + + // Чтение разрешений + $account['permissions'] = static::permissions((int) $account['id'], $errors); + + return $account; + } + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + return []; + } + + /** + * Прочитать разрешения аккаунта + * + * @param int $id Идентификатор аккаунта + * @param array &$errors Журнал ошибок + * + * @return array Разрешения аккаунта, если найдены + */ + public static function permissions(int $id, array &$errors = []): array + { + try { + // Инициализация запроса + $request = static::$db->prepare("SELECT * FROM `permissions` WHERE `id` = :id"); + + // Параметры запроса + $params = [ + ":id" => $id + ]; + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + if (empty($response = $request->fetch(pdo::FETCH_ASSOC))) { + // Не найдены разрешения + + // Генерация ошибки + throw new exception('Не найдены разрешения'); + } + + // Удаление ненужных данных + unset($response['id']); + + return $response; + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + return []; + } + + /** + * Проверить разрешение + * + * @param string $permission Разрешение + * @param int|null $id Идентификатор аккаунта + * @param array &$errors Журнал ошибок + * + * @return bool|null Статус разрешения, если оно записано + */ + public static function access(string $permission, int|null $id = null, array &$errors = []): ?bool + { + try { + // Инициализация аккаунта + $account = isset($id) ? self::read(['id' => $id], $errors) : self::account($errors); + + return isset($account['permissions'][$permission]) ? (bool) $account['permissions'][$permission] : null; + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + return null; + } + + /** + * Запись пользователя в базу данных + * + * @param string|null $name Имя + * @param string|null $email Почта + * @param string|null $password Пароль + * @param array &$errors Журнал ошибок + * + * @return array Аккаунт (если не найден, то пустой массив) + */ + public static function write(string|null $name = null, string|null $email = null, string|null $password = null, array &$errors = []): array + { + try { + // Инициализация параметров запроса + $params = []; + + if (isset($name)) { + try { + // Проверка параметра + if (iconv_strlen($name) < 3) throw new exception('Длина имени должна быть не менее 3 символов'); + if (iconv_strlen($name) > 60) throw new exception('Длина имени должна быть не более 60 символов'); + + // Запись в буфер параметров запроса + $params[':name'] = $name; + } catch (exception $e) { + // Запись в журнал ошибок + $errors[] = [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine() + ]; + + goto end; + } + } + + if (isset($email)) { + try { + // Проверка параметра + if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) throw new exception('Не удалось распознать почту'); + if (iconv_strlen($email) < 3) throw new exception('Длина почты должна быть не менее 3 символов'); + if (iconv_strlen($email) > 60) throw new exception('Длина почты должна быть не более 80 символов'); + + // Запись в буфер параметров запроса + $params[':email'] = $email; + } catch (exception $e) { + // Запись в журнал ошибок + $errors[] = [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine() + ]; + + goto end; + } + } + + if (isset($password)) { + try { + // Проверка параметра + if (iconv_strlen($password) < 3) throw new exception('Длина пароля должна быть не менее 3 символов'); + if (iconv_strlen($password) > 60) throw new exception('Длина пароля должна быть не более 120 символов'); + + // Запись в буфер параметров запроса + $params[':password'] = password_hash($password, PASSWORD_BCRYPT); + } catch (exception $e) { + // Запись в журнал ошибок + $errors[] = [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine() + ]; + + goto end; + } + } + + // Инициализация запроса + $request = static::$db->prepare("INSERT INTO `accounts` (" . (isset($name) ? '`name`' : '') . (isset($name) && isset($email) ? ', ' : '') . (isset($email) ? '`email`' : '') . ((isset($name) || isset($email)) && isset($password) ? ', ' : '') . (isset($password) ? '`password`' : '') . ") VALUES (" . (isset($name) ? ':name' : '') . (isset($name) && isset($email) ? ', ' : '') . (isset($email) ? ':email' : '') . ((isset($name) || isset($email)) && isset($password) ? ', ' : '') . (isset($password) ? ':password' : '') . ")"); + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + $request->fetch(pdo::FETCH_ASSOC); + + try { + if (isset($name)) { + // Передано имя аккаунта + + // Чтение аккаунта + $account = static::read(['name' => $name]); + } else if (isset($email)) { + // Передана почта аккаунта + + // Чтение аккаунта + $account = static::read(['email' => $email]); + } else { + // Не передано ни имя, ни почта + + throw new exception('Не переданны данные для полноценной регистрации аккаунта'); + } + + // Инициализация запроса + $request = static::$db->prepare("INSERT INTO `permissions` (`id`) VALUES (:id)"); + + // Инициализация параметров + $params = [ + ':id' => $account['id'] + ]; + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + $request->fetch(pdo::FETCH_ASSOC); + } catch (exception $e) { + // Запись в журнал ошибок + $errors[] = [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + // Конец выполнения + end: + + return isset($account) && $account ? $account : []; + } + + /** + * Чтение пользователя из базы данных + * + * @param array $search Поиск ('поле' => 'значение'), работает только с одним полем + * @param array &$errors Журнал ошибок + * + * @return array Аккаунт, если найден + */ + public static function read(array $search, array &$errors = []): array + { + try { + // Инициализация данных для поиска + $field = array_keys($search)[0] ?? null; + $value = $search[$field] ?? null; + + if (empty($field)) { + // Получено пустое значение поля + + // Запись ошибки + throw new exception('Пустое значение поля для поиска'); + } + + // Инициализация запроса + $request = static::$db->prepare("SELECT * FROM `accounts` WHERE `$field` = :field LIMIT 1"); + + // Параметры запроса + $params = [ + ":field" => $value, + ]; + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + if ($account = $request->fetch(pdo::FETCH_ASSOC)) { + // Найден аккаунт + + try { + if ($permissions = static::permissions((int) $account['id'], $errors)) { + // Найдены разрешения + + // Запись в буфер данных аккаунта + $account['permissions'] = $permissions; + } else { + // Не найдены разрешения + + throw new exception('Не удалось найти и прочитать разрешения'); + } + } catch (exception $e) { + // Запись в журнал ошибок + $errors[] = [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine() + ]; + } + } else { + // Не найден аккаунт + + throw new exception('Не удалось найти аккаунт'); + } + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + return isset($account) && $account ? $account : []; + } + + /** + * Запись или чтение хеша из базы данных + * + * @param int $id Идентификатор аккаунта + * @param int|null $hash Хеш аутентифиакции + * @param string|null $time Время хранения хеша + * @param array &$errors Журнал ошибок + * + * @return array ['hash' => $hash, 'time' => $time] + */ + public static function hash(int $id, string|null $hash = null, int|null $time = null, array &$errors = []): array + { + try { + if (isset($hash, $time)) { + // Переданы хеш и его время хранения + + // Инициализация запроса + $request = static::$db->prepare("UPDATE `accounts` SET `hash` = :hash, `time` = :time WHERE `id` = :id"); + + // Параметры запроса + $params = [ + ":id" => $id, + ":hash" => $hash, + ":time" => $time, + ]; + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + $request->fetch(pdo::FETCH_ASSOC); + } else { + // Не переданы хеш и его время хранения + + // Инициализация запроса + $request = static::$db->prepare("SELECT `hash`, `time` FROM `accounts` WHERE `id` = :id"); + + // Параметры запроса + $params = [ + ":id" => $id, + ]; + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + extract((array) $request->fetch(pdo::FETCH_ASSOC)); + + if (!empty($response['time']) && $response['time'] <= time()) { + // Истекло время жизни хеша + + // Инициализация запроса + $request = static::$db->prepare("UPDATE `accounts` SET `hash` = :hash, `time` = :time WHERE `id` = :id"); + + // Параметры запроса + $params = [ + ":id" => $id, + ":hash" => null, + ":time" => null, + ]; + + // Отправка запроса + $request->execute($params); + + // Генерация ответа + $response = $request->fetch(pdo::FETCH_ASSOC); + + // Генерация ошибки + throw new exception('Время аутентификации истекло'); + } + } + } catch (exception $e) { + // Запись в журнал ошибок + $errors[]= [ + 'text' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + return ['hash' => $hash, 'time' => $time]; + } +} diff --git a/mirzaev/tordv/calculator/system/models/calculators_model.php b/mirzaev/zkmr/calculator/system/models/calculators_model.php similarity index 98% rename from mirzaev/tordv/calculator/system/models/calculators_model.php rename to mirzaev/zkmr/calculator/system/models/calculators_model.php index ebe65b0..d2b4705 100644 --- a/mirzaev/tordv/calculator/system/models/calculators_model.php +++ b/mirzaev/zkmr/calculator/system/models/calculators_model.php @@ -2,18 +2,18 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models; +namespace mirzaev\zkmr\calculator\models; -use mirzaev\tordv\calculator\models\settings_model as settings; -use mirzaev\tordv\calculator\models\metals_model as metals; -use mirzaev\tordv\calculator\models\baloons_model as baloons; +use mirzaev\zkmr\calculator\models\settings_model as settings; +use mirzaev\zkmr\calculator\models\metals_model as metals; +use mirzaev\zkmr\calculator\models\baloons_model as baloons; use exception; /** * Модель калькуляторов * - * @package mirzaev\tordv\calculator\models + * @package mirzaev\zkmr\calculator\models * @author Arsen Mirzaev Tatyano-Muradovich */ final class calculators_model extends core diff --git a/mirzaev/tordv/calculator/system/models/core.php b/mirzaev/zkmr/calculator/system/models/core.php similarity index 97% rename from mirzaev/tordv/calculator/system/models/core.php rename to mirzaev/zkmr/calculator/system/models/core.php index 6ffacfb..1d3ae67 100644 --- a/mirzaev/tordv/calculator/system/models/core.php +++ b/mirzaev/zkmr/calculator/system/models/core.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models; +namespace mirzaev\zkmr\calculator\models; use mirzaev\minimal\model; @@ -14,7 +14,7 @@ use exception; /** * Ядро моделей * - * @package mirzaev\tordv\calculator\models + * @package mirzaev\zkmr\calculator\models * @author Arsen Mirzaev Tatyano-Muradovich */ class core extends model diff --git a/mirzaev/tordv/calculator/system/models/filters/import_aluminum_filter.php b/mirzaev/zkmr/calculator/system/models/filters/import_aluminum_filter.php similarity index 89% rename from mirzaev/tordv/calculator/system/models/filters/import_aluminum_filter.php rename to mirzaev/zkmr/calculator/system/models/filters/import_aluminum_filter.php index 965888e..b873972 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_aluminum_filter.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_aluminum_filter.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; -use mirzaev\tordv\calculator\models\filters\import_filter_noname_1; +use mirzaev\zkmr\calculator\models\filters\import_filter_noname_1; /** * Фильтр импорта цен на алюминий от неизвестного поставщика под номером 1 * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich */ final class import_aluminum_filter extends import_filter_noname_1 diff --git a/mirzaev/tordv/calculator/system/models/filters/import_brass_filter.php b/mirzaev/zkmr/calculator/system/models/filters/import_brass_filter.php similarity index 82% rename from mirzaev/tordv/calculator/system/models/filters/import_brass_filter.php rename to mirzaev/zkmr/calculator/system/models/filters/import_brass_filter.php index bc61c4d..3d782fb 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_brass_filter.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_brass_filter.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; -use mirzaev\tordv\calculator\models\filters\import_filter_noname_1; +use mirzaev\zkmr\calculator\models\filters\import_filter_noname_1; /** * Фильтр импорта цен на латунь от неизвестного поставщика под номером 1 * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich */ final class import_brass_filter extends import_filter_noname_1 diff --git a/mirzaev/tordv/calculator/system/models/filters/import_copper_filter.php b/mirzaev/zkmr/calculator/system/models/filters/import_copper_filter.php similarity index 79% rename from mirzaev/tordv/calculator/system/models/filters/import_copper_filter.php rename to mirzaev/zkmr/calculator/system/models/filters/import_copper_filter.php index a50ae93..a58df17 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_copper_filter.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_copper_filter.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; -use mirzaev\tordv\calculator\models\filters\import_filter_noname_1; +use mirzaev\zkmr\calculator\models\filters\import_filter_noname_1; /** * Фильтр импорта цен на медь от неизвестного поставщика под номером 1 * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich */ final class import_copper_filter extends import_filter_noname_1 diff --git a/mirzaev/tordv/calculator/system/models/filters/import_filter.php b/mirzaev/zkmr/calculator/system/models/filters/import_filter.php similarity index 91% rename from mirzaev/tordv/calculator/system/models/filters/import_filter.php rename to mirzaev/zkmr/calculator/system/models/filters/import_filter.php index bb09e39..cf4f7da 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_filter.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_filter.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; use PhpOffice\PhpSpreadsheet\Reader\IReadFilter as filter; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; @@ -10,7 +10,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; /** * Интерфейс фильтра импорта * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich */ interface import_filter extends filter diff --git a/mirzaev/tordv/calculator/system/models/filters/import_filter_mc.php b/mirzaev/zkmr/calculator/system/models/filters/import_filter_mc.php similarity index 93% rename from mirzaev/tordv/calculator/system/models/filters/import_filter_mc.php rename to mirzaev/zkmr/calculator/system/models/filters/import_filter_mc.php index f9b4571..c3d78a1 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_filter_mc.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_filter_mc.php @@ -2,17 +2,17 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; -use mirzaev\tordv\calculator\models\filters\import_filter as filter; -use mirzaev\tordv\calculator\models\metals_model as metals; +use mirzaev\zkmr\calculator\models\filters\import_filter as filter; +use mirzaev\zkmr\calculator\models\metals_model as metals; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; /** * Фильтр импорта для документов от "МЕТАЛЛСЕРВИС" * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich */ class import_filter_mc implements filter diff --git a/mirzaev/tordv/calculator/system/models/filters/import_filter_noname_1.php b/mirzaev/zkmr/calculator/system/models/filters/import_filter_noname_1.php similarity index 94% rename from mirzaev/tordv/calculator/system/models/filters/import_filter_noname_1.php rename to mirzaev/zkmr/calculator/system/models/filters/import_filter_noname_1.php index 2e2b5c4..749b48f 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_filter_noname_1.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_filter_noname_1.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; -use mirzaev\tordv\calculator\models\filters\import_filter as filter; -use mirzaev\tordv\calculator\models\metals_model as metals; +use mirzaev\zkmr\calculator\models\filters\import_filter as filter; +use mirzaev\zkmr\calculator\models\metals_model as metals; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; @@ -13,7 +13,7 @@ use PhpOffice\PhpSpreadsheet\Cell\Coordinate; /** * Фильтр импорта для документов от неизвестного поставщика под номером 1 * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich */ class import_filter_noname_1 implements filter diff --git a/mirzaev/tordv/calculator/system/models/filters/import_galvanized_steel_filter.php b/mirzaev/zkmr/calculator/system/models/filters/import_galvanized_steel_filter.php similarity index 82% rename from mirzaev/tordv/calculator/system/models/filters/import_galvanized_steel_filter.php rename to mirzaev/zkmr/calculator/system/models/filters/import_galvanized_steel_filter.php index 0abd7d0..550b27b 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_galvanized_steel_filter.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_galvanized_steel_filter.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; -use mirzaev\tordv\calculator\models\filters\import_filter_noname_1; +use mirzaev\zkmr\calculator\models\filters\import_filter_noname_1; /** * Фильтр импорта цен на оцинкованную сталь от "МЕТАЛЛСЕРВИС" * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich * * @todo 1. Доделать 982 до 992 строки diff --git a/mirzaev/tordv/calculator/system/models/filters/import_stainless_steel_filter.php b/mirzaev/zkmr/calculator/system/models/filters/import_stainless_steel_filter.php similarity index 91% rename from mirzaev/tordv/calculator/system/models/filters/import_stainless_steel_filter.php rename to mirzaev/zkmr/calculator/system/models/filters/import_stainless_steel_filter.php index bf3143a..0875233 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_stainless_steel_filter.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_stainless_steel_filter.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; -use mirzaev\tordv\calculator\models\filters\import_filter_noname_1; +use mirzaev\zkmr\calculator\models\filters\import_filter_noname_1; /** * Фильтр импорта цен на нержавеющую сталь от неизвестного поставщика под номером 1 * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich * * @todo 1. Доделать 982 до 992 строки diff --git a/mirzaev/tordv/calculator/system/models/filters/import_steel_filter.php b/mirzaev/zkmr/calculator/system/models/filters/import_steel_filter.php similarity index 90% rename from mirzaev/tordv/calculator/system/models/filters/import_steel_filter.php rename to mirzaev/zkmr/calculator/system/models/filters/import_steel_filter.php index 32c629d..686e68c 100644 --- a/mirzaev/tordv/calculator/system/models/filters/import_steel_filter.php +++ b/mirzaev/zkmr/calculator/system/models/filters/import_steel_filter.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models\filters; +namespace mirzaev\zkmr\calculator\models\filters; -use mirzaev\tordv\calculator\models\filters\import_filter_mc; +use mirzaev\zkmr\calculator\models\filters\import_filter_mc; /** * Фильтр импорта цен на чёрную сталь от "МЕТАЛЛСЕРВИС" * - * @package mirzaev\tordv\calculator\models\filters + * @package mirzaev\zkmr\calculator\models\filters * @author Arsen Mirzaev Tatyano-Muradovich */ final class import_steel_filter extends import_filter_mc diff --git a/mirzaev/tordv/calculator/system/models/settings_model.php b/mirzaev/zkmr/calculator/system/models/settings_model.php similarity index 99% rename from mirzaev/tordv/calculator/system/models/settings_model.php rename to mirzaev/zkmr/calculator/system/models/settings_model.php index 2e547fa..5aa0b47 100644 --- a/mirzaev/tordv/calculator/system/models/settings_model.php +++ b/mirzaev/zkmr/calculator/system/models/settings_model.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models; +namespace mirzaev\zkmr\calculator\models; use pdo; use exception; @@ -10,7 +10,7 @@ use exception; /** * Модель настроек * - * @package mirzaev\tordv\calculator\models + * @package mirzaev\zkmr\calculator\models * @author Arsen Mirzaev Tatyano-Muradovich */ final class settings_model extends core diff --git a/mirzaev/tordv/calculator/system/models/supplies_model.php b/mirzaev/zkmr/calculator/system/models/supplies_model.php similarity index 92% rename from mirzaev/tordv/calculator/system/models/supplies_model.php rename to mirzaev/zkmr/calculator/system/models/supplies_model.php index c72cb48..e3fe2f4 100644 --- a/mirzaev/tordv/calculator/system/models/supplies_model.php +++ b/mirzaev/zkmr/calculator/system/models/supplies_model.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\models; +namespace mirzaev\zkmr\calculator\models; -use mirzaev\tordv\calculator\models\accounts_model as accounts; -use mirzaev\tordv\calculator\models\filters\import_filter as filter; +use mirzaev\zkmr\calculator\models\accounts_model as accounts; +use mirzaev\zkmr\calculator\models\filters\import_filter as filter; use PhpOffice\PhpSpreadsheet\Reader\Xls as reader; @@ -15,7 +15,7 @@ use exception; /** * Модель поставки * - * @package mirzaev\tordv\calculator\models + * @package mirzaev\zkmr\calculator\models * @author Arsen Mirzaev Tatyano-Muradovich */ final class supplies_model extends core diff --git a/mirzaev/tordv/calculator/system/public/.gitignore b/mirzaev/zkmr/calculator/system/public/.gitignore similarity index 100% rename from mirzaev/tordv/calculator/system/public/.gitignore rename to mirzaev/zkmr/calculator/system/public/.gitignore diff --git a/mirzaev/tordv/calculator/system/public/Nginx_1.21_vhost.conf b/mirzaev/zkmr/calculator/system/public/Nginx_1.21_vhost.conf similarity index 100% rename from mirzaev/tordv/calculator/system/public/Nginx_1.21_vhost.conf rename to mirzaev/zkmr/calculator/system/public/Nginx_1.21_vhost.conf diff --git a/mirzaev/tordv/calculator/system/public/css/auth.css b/mirzaev/zkmr/calculator/system/public/css/auth.css similarity index 100% rename from mirzaev/tordv/calculator/system/public/css/auth.css rename to mirzaev/zkmr/calculator/system/public/css/auth.css diff --git a/mirzaev/tordv/calculator/system/public/css/calculator.css b/mirzaev/zkmr/calculator/system/public/css/calculator.css similarity index 100% rename from mirzaev/tordv/calculator/system/public/css/calculator.css rename to mirzaev/zkmr/calculator/system/public/css/calculator.css diff --git a/mirzaev/tordv/calculator/system/public/css/main.css b/mirzaev/zkmr/calculator/system/public/css/main.css similarity index 100% rename from mirzaev/tordv/calculator/system/public/css/main.css rename to mirzaev/zkmr/calculator/system/public/css/main.css diff --git a/mirzaev/tordv/calculator/system/public/css/settings.css b/mirzaev/zkmr/calculator/system/public/css/settings.css similarity index 100% rename from mirzaev/tordv/calculator/system/public/css/settings.css rename to mirzaev/zkmr/calculator/system/public/css/settings.css diff --git a/mirzaev/tordv/calculator/system/public/img/bending.png b/mirzaev/zkmr/calculator/system/public/img/bending.png similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/bending.png rename to mirzaev/zkmr/calculator/system/public/img/bending.png diff --git a/mirzaev/tordv/calculator/system/public/img/black.svg b/mirzaev/zkmr/calculator/system/public/img/black.svg similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/black.svg rename to mirzaev/zkmr/calculator/system/public/img/black.svg diff --git a/mirzaev/tordv/calculator/system/public/img/easy.png b/mirzaev/zkmr/calculator/system/public/img/easy.png similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/easy.png rename to mirzaev/zkmr/calculator/system/public/img/easy.png diff --git a/mirzaev/tordv/calculator/system/public/img/hard.png b/mirzaev/zkmr/calculator/system/public/img/hard.png similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/hard.png rename to mirzaev/zkmr/calculator/system/public/img/hard.png diff --git a/mirzaev/tordv/calculator/system/public/img/laser.png b/mirzaev/zkmr/calculator/system/public/img/laser.png similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/laser.png rename to mirzaev/zkmr/calculator/system/public/img/laser.png diff --git a/mirzaev/tordv/calculator/system/public/img/medium.png b/mirzaev/zkmr/calculator/system/public/img/medium.png similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/medium.png rename to mirzaev/zkmr/calculator/system/public/img/medium.png diff --git a/mirzaev/tordv/calculator/system/public/img/painting.png b/mirzaev/zkmr/calculator/system/public/img/painting.png similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/painting.png rename to mirzaev/zkmr/calculator/system/public/img/painting.png diff --git a/mirzaev/tordv/calculator/system/public/img/plasma.png b/mirzaev/zkmr/calculator/system/public/img/plasma.png similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/plasma.png rename to mirzaev/zkmr/calculator/system/public/img/plasma.png diff --git a/mirzaev/tordv/calculator/system/public/img/white.svg b/mirzaev/zkmr/calculator/system/public/img/white.svg similarity index 100% rename from mirzaev/tordv/calculator/system/public/img/white.svg rename to mirzaev/zkmr/calculator/system/public/img/white.svg diff --git a/mirzaev/tordv/calculator/system/public/index.php.sample b/mirzaev/zkmr/calculator/system/public/index.php.sample similarity index 88% rename from mirzaev/tordv/calculator/system/public/index.php.sample rename to mirzaev/zkmr/calculator/system/public/index.php.sample index fbfc2d4..2d8846f 100644 --- a/mirzaev/tordv/calculator/system/public/index.php.sample +++ b/mirzaev/zkmr/calculator/system/public/index.php.sample @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator; +namespace mirzaev\zkmr\calculator; use mirzaev\minimal\core; use mirzaev\minimal\router; @@ -10,9 +10,9 @@ use mirzaev\minimal\router; define('SUPPLIES', realpath('supplies')); define('VIEWS', realpath('..' . DIRECTORY_SEPARATOR . 'views')); define('TYPE', 'mysql'); -define('BASE', 'calculator'); -define('HOST', '127.0.0.1'); -define('LOGIN', 'root'); +define('BASE', 'zkmr-calculator'); +define('HOST', 'localhost'); +define('LOGIN', ''); define('PASSWORD', ''); // Автозагрузка @@ -33,9 +33,9 @@ $router->write('/calculator/generate/buyer', 'calculator', 'buyer', 'POST'); $router->write('/calculator/generate/complexity', 'calculator', 'complexity', 'POST'); $router->write('/calculator/generate/menu', 'calculator', 'menu', 'POST'); $router->write('/calculator/generate/result', 'calculator', 'result', 'POST'); -$router->write('/calculator/generate/mark', 'calculator', 'mark', 'POST'); +$router->write('/calculator/generate/fence', 'calculator', 'fence', 'POST'); $router->write('/calculator/generate/divider', 'calculator', 'divider', 'POST'); -$router->write('/calculator/generate/laser', 'calculator', 'laser', 'POST'); +$router->write('/calculator/generate/profnastil', 'calculator', 'profnastil', 'POST'); $router->write('/calculator/calculate', 'calculator', 'calculate', 'POST'); $router->write('/settings', 'settings', 'index', 'GET'); $router->write('/settings/write', 'settings', 'write', 'POST'); diff --git a/mirzaev/tordv/calculator/system/public/js/auth.js b/mirzaev/zkmr/calculator/system/public/js/auth.js similarity index 100% rename from mirzaev/tordv/calculator/system/public/js/auth.js rename to mirzaev/zkmr/calculator/system/public/js/auth.js diff --git a/mirzaev/zkmr/calculator/system/public/js/calculator.js b/mirzaev/zkmr/calculator/system/public/js/calculator.js new file mode 100644 index 0000000..20a925e --- /dev/null +++ b/mirzaev/zkmr/calculator/system/public/js/calculator.js @@ -0,0 +1,568 @@ +'use strict'; + +let calculator = { + index: document.getElementById("calculator"), + calculators: [], + account: [], + settings: { + defaults: { + buyer: 'individual', + complexity: 'medium', + } + }, + init() { + // Инициализация калькулятора + + this.generate.buyer(this.settings.defaults.buyer) + .then( + success => { + this.generate.complexity(this.settings.defaults.complexity) + .then( + success => { + this.generate.menu() + .then( + success => { + this.authenticate(cookie.read('id')) + .then( + success => { + // Запись данных аккаунта + this.account = success; + + if (this.account !== undefined && typeof this.account === 'object' && this.account.permissions !== undefined) { + // Найден аккаунт + + if (this.account.permissions.calculate == 1) { + // Разрешено использовать калькулятор + + this.generate.result(); + } + } + } + ); + } + ); + } + ); + } + ); + + console.log('[КАЛЬКУЛЯТОР] Инициализирован'); + }, + authenticate(id) { + // Запрос и генерация HTML с данными о типе покупателя (юр. лицо и физ. лицо)' + + return fetch('/account/data?id=' + id, { + method: "POST", + headers: { "content-type": "application/x-www-form-urlencoded" } + }).then((response) => { + if (response.status === 200) { + return response.json().then( + success => { + console.log('[КАЛЬКУЛЯТОР] Загружены данные пользователя: ' + id); + + return success; + }, + error => { + console.log('[КАЛЬКУЛЯТОР] [ОШИБКА] Не удалось загрузить данные пользователя: ' + id); + } + ); + } + }); + }, + calculate() { + // Запрос и генерация HTML с данными о рассчете со всех калькуляторов + + // Инициализация параметров + let cutting = document.getElementById('cutting'); + let discount = document.getElementById('discount'); + + // Инициализация буфера запроса + let query = { + calculators: {}, + cutting: +cutting.value ?? 0, + discount: +discount.value ?? 0 + }; + + for (const number in this.calculators) { + // Перебор калькуляторов + + // Инициализация буфера запроса для нового калькулятора + query['calculators'][number] = {}; + + // Инициализация типа калькулятора + query['calculators'][number]['calculator'] = this.calculators[number].getAttribute('data-calculator'); + + for (const buyer of this.index.querySelectorAll('input[name="buyer"]')) { + // Перебор полей с параметрами типа заказчика + + if (buyer.checked) { + // Найдено выбранное поле + + // Запись в буфер запроса + query['calculators'][number]['buyer'] = buyer.value; + } + } + + for (const complexity of this.index.querySelectorAll('input[name="complexity"]')) { + // Перебор полей с параметрами сложности + + if (complexity.checked) { + // Найдено выбранное поле + + // Запись в буфер запроса + query['calculators'][number]['complexity'] = complexity.value; + } + } + + for (const field of this.calculators[number].querySelectorAll('[data-calculator-parameter]')) { + // Перебор полей с параметрами + + if (field.getAttribute('type') === 'checkbox') { + // Флажок + + // Запись в буфер запроса + query['calculators'][number][field.getAttribute('data-calculator-parameter')] = field.checked; + } else if (field.getAttribute('type') === 'text' || field.getAttribute('type') === 'number' || field.getAttribute('type') === 'range') { + // Текстовое, цифровое поле или ползунок + + // Запись в буфер запроса + query['calculators'][number][field.getAttribute('data-calculator-parameter')] = field.value; + } else { + // Элемент с тегом + + + + + diff --git a/mirzaev/zkmr/calculator/system/views/calculators/elements/fences/2.html b/mirzaev/zkmr/calculator/system/views/calculators/elements/fences/2.html new file mode 100644 index 0000000..dc29109 --- /dev/null +++ b/mirzaev/zkmr/calculator/system/views/calculators/elements/fences/2.html @@ -0,0 +1,8 @@ +
+ +
+ +
+
diff --git a/mirzaev/tordv/calculator/system/views/calculators/index.html b/mirzaev/zkmr/calculator/system/views/calculators/index.html similarity index 56% rename from mirzaev/tordv/calculator/system/views/calculators/index.html rename to mirzaev/zkmr/calculator/system/views/calculators/index.html index 0cb8d49..819c2ab 100644 --- a/mirzaev/tordv/calculator/system/views/calculators/index.html +++ b/mirzaev/zkmr/calculator/system/views/calculators/index.html @@ -16,18 +16,18 @@ calculator.init(); } - } else { - // Документ не загружен + } else { + // Документ не загружен - // Обработчик события загрузки документа - document.addEventListener('DOMContentLoaded', function () { - // Обработчик события инициализации + // Обработчик события загрузки документа + document.addEventListener('DOMContentLoaded', function () { + // Обработчик события инициализации - if (calculator !== undefined) { - // Калькулятор инициализирован + if (calculator !== undefined) { + // Калькулятор инициализирован - calculator.init(); - } + calculator.init(); + } }, false); }; diff --git a/mirzaev/zkmr/calculator/system/views/calculators/menu.html b/mirzaev/zkmr/calculator/system/views/calculators/menu.html new file mode 100644 index 0000000..3ce7566 --- /dev/null +++ b/mirzaev/zkmr/calculator/system/views/calculators/menu.html @@ -0,0 +1,6 @@ + diff --git a/mirzaev/tordv/calculator/system/views/calculators/modules/buyer.1.html b/mirzaev/zkmr/calculator/system/views/calculators/modules/buyer.1.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/calculators/modules/buyer.1.html rename to mirzaev/zkmr/calculator/system/views/calculators/modules/buyer.1.html diff --git a/mirzaev/tordv/calculator/system/views/calculators/modules/buyer.html b/mirzaev/zkmr/calculator/system/views/calculators/modules/buyer.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/calculators/modules/buyer.html rename to mirzaev/zkmr/calculator/system/views/calculators/modules/buyer.html diff --git a/mirzaev/tordv/calculator/system/views/calculators/modules/complexity.html b/mirzaev/zkmr/calculator/system/views/calculators/modules/complexity.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/calculators/modules/complexity.html rename to mirzaev/zkmr/calculator/system/views/calculators/modules/complexity.html diff --git a/mirzaev/tordv/calculator/system/views/calculators/modules/divider.html b/mirzaev/zkmr/calculator/system/views/calculators/modules/divider.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/calculators/modules/divider.html rename to mirzaev/zkmr/calculator/system/views/calculators/modules/divider.html diff --git a/mirzaev/tordv/calculator/system/views/calculators/modules/result.html b/mirzaev/zkmr/calculator/system/views/calculators/modules/result.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/calculators/modules/result.html rename to mirzaev/zkmr/calculator/system/views/calculators/modules/result.html diff --git a/mirzaev/tordv/calculator/system/views/calculators/laser.html b/mirzaev/zkmr/calculator/system/views/calculators/profnastil.html similarity index 66% rename from mirzaev/tordv/calculator/system/views/calculators/laser.html rename to mirzaev/zkmr/calculator/system/views/calculators/profnastil.html index f16be85..11540c4 100644 --- a/mirzaev/tordv/calculator/system/views/calculators/laser.html +++ b/mirzaev/zkmr/calculator/system/views/calculators/profnastil.html @@ -1,16 +1,46 @@

Лазерная резка

-
+
- + + + + +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + {% include 'calculators/elements/fences/1.html' %} + +
+ +
+
diff --git a/mirzaev/tordv/calculator/system/views/contacts/index.html b/mirzaev/zkmr/calculator/system/views/contacts/index.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/contacts/index.html rename to mirzaev/zkmr/calculator/system/views/contacts/index.html diff --git a/mirzaev/tordv/calculator/system/views/core.html b/mirzaev/zkmr/calculator/system/views/core.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/core.html rename to mirzaev/zkmr/calculator/system/views/core.html diff --git a/mirzaev/tordv/calculator/system/views/footer.html b/mirzaev/zkmr/calculator/system/views/footer.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/footer.html rename to mirzaev/zkmr/calculator/system/views/footer.html diff --git a/mirzaev/tordv/calculator/system/views/head.html b/mirzaev/zkmr/calculator/system/views/head.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/head.html rename to mirzaev/zkmr/calculator/system/views/head.html diff --git a/mirzaev/tordv/calculator/system/views/header.html b/mirzaev/zkmr/calculator/system/views/header.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/header.html rename to mirzaev/zkmr/calculator/system/views/header.html diff --git a/mirzaev/tordv/calculator/system/views/journal/index.html b/mirzaev/zkmr/calculator/system/views/journal/index.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/journal/index.html rename to mirzaev/zkmr/calculator/system/views/journal/index.html diff --git a/mirzaev/tordv/calculator/system/views/main/index.html b/mirzaev/zkmr/calculator/system/views/main/index.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/main/index.html rename to mirzaev/zkmr/calculator/system/views/main/index.html diff --git a/mirzaev/tordv/calculator/system/views/manager.php b/mirzaev/zkmr/calculator/system/views/manager.php similarity index 84% rename from mirzaev/tordv/calculator/system/views/manager.php rename to mirzaev/zkmr/calculator/system/views/manager.php index e2c74e5..231d499 100644 --- a/mirzaev/tordv/calculator/system/views/manager.php +++ b/mirzaev/zkmr/calculator/system/views/manager.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace mirzaev\tordv\calculator\views; +namespace mirzaev\zkmr\calculator\views; use mirzaev\minimal\controller; @@ -12,7 +12,7 @@ use Twig\Environment as view; /** * Менеджер представлений * - * @package mirzaev\tordv\calculator\controllers + * @package mirzaev\zkmr\calculator\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ final class manager extends controller diff --git a/mirzaev/tordv/calculator/system/views/settings/index.html b/mirzaev/zkmr/calculator/system/views/settings/index.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/settings/index.html rename to mirzaev/zkmr/calculator/system/views/settings/index.html diff --git a/mirzaev/tordv/calculator/system/views/sidebar.html b/mirzaev/zkmr/calculator/system/views/sidebar.html similarity index 100% rename from mirzaev/tordv/calculator/system/views/sidebar.html rename to mirzaev/zkmr/calculator/system/views/sidebar.html diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..a78ce42 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,16 @@ + + + + + + + + +