<?php

declare(strict_types=1);

namespace mirzaev\ebala\models;

// Файлы проекта
use mirzaev\ebala\models\traits\status;

// Библиотека для ArangoDB
use ArangoDBClient\Document as _document;

// Фреймворк для работы с таблицами
use PhpOffice\PhpSpreadsheet\IOFactory,
	PhpOffice\PhpSpreadsheet\Style\Color,
	PhpOffice\PhpSpreadsheet\Style\Fill,
	PhpOffice\PhpSpreadsheet\Style\Conditional,
	PhpOffice\PhpSpreadsheet\Style\Alignment,
	PhpOffice\PhpSpreadsheet\Spreadsheet;

// System libraries
use exception;

/**
 * Модель выплат
 *
 * @package mirzaev\ebala\models
 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 */
final class payments extends core
{
	use status;

	/**
	 * Сотрудники
	 *
	 * Расчитать стоимость работы сотрудников за выбранный период и сгенерировать excel-документ
	 *
	 * @param int $from Начальная дата для выборки заявок (unixtime)
	 * @param int $to Конечная дата для выборки заявок (unixtime)
	 * @param array $errors Errors registry
	 *
	 * @return bool Записан буфер вывода сгенерированный excel-документ?
	 */
	public static function workers(int $from, int $to, array &$errors = []): bool
	{
		try {
			// Чтение заявок
			$tasks = @task::read("d.date >= $from && d.date <= $to && d.problematic == false && d.completed == true", amount: 999999, return: '{worker: d.worker, market: d.market, date: d.date, work: d.work, start: d.start, end: d.end, commentary: d.commentary, rating: d.rating, review: d.review}', errors: $errors);

			if (is_array($tasks) && count($tasks) > 0) {
				// Найдены заявки

				// Инициализация таблицы
				$spreadsheet = new Spreadsheet();

				// Конвертация unixtime в читаемую дату
				$_from = gmdate("d.m.Y", $from);
				$_to = gmdate("d.m.Y", $to);

				// Запись настроек таблицы
				$spreadsheet
					->getProperties()
					->setCreator('Спецресурс')
					->setLastModifiedBy('Спецресурс')
					->setTitle("$_from - $_to")
					->setSubject("Зарплаты сотрудникам $_from - $_to")
					->setDescription("Зарплаты сотрудникам за период с $_from по $_to")
					->setKeywords('зарплата сотрудники');

				// Открытие страницы
				$spreadsheet->setActiveSheetIndex(0);

				// Запись первой строки (названия колонок)
				$spreadsheet
					->getActiveSheet()
					->setCellValue('A1', 'Адрес')
					->setCellValue('B1', 'Дата выплаты')
					->setCellValue('C1', 'Дата заявки')
					->setCellValue('D1', 'Магазин')
					->setCellValue('E1', 'Сотрудник')
					->setCellValue('F1', 'Работа')
					->setCellValue('G1', 'Начало')
					->setCellValue('H1', 'Конец')
					->setCellValue('I1', 'Часы')
					->setCellValue('J1', 'Статус')
					->setCellValue('K1', 'Рейтинг')
					->setCellValue('L1', 'Отзыв')
					->setCellValue('M1', 'ФИО')
					->setCellValue('N1', 'Час')
					->setCellValue('O1', 'Смена')
					->setCellValue('P1', 'Штраф')
					->setCellValue('Q1', 'Премия')
					->setCellValue('R1', 'Полная оплата')
					->setCellValue('S1', 'Наличными')
					->setCellValue('T1', 'Наличные?')
					->setCellValue('U1', 'Переводом')
					->setCellValue('V1', 'Реквизиты')
					->setCellValue('W1', 'Тариф')
					->setCellValue('X1', 'Без НДС')
					->setCellValue('Y1', 'Прибыль')
					->setCellValue('Z1', 'Примечание')
					->setCellValue('AA1', 'Долг сотрудника')
					->setCellValue('AB1', 'Кто платит')
					->setCellValue('AC1', 'Кто платит');

				// Запись цвета верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getStyle('A1:AC1')
					->getFill()
					->setFillType(Fill::FILL_SOLID)
					->getStartColor()
					->setARGB('ffffffb9');

				// Запись толщины текста верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getStyle('A1:AC1')
					->getFont()
					->setBold(true);

				// Запись размера текста верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getStyle('A1:AC1')
					->getFont()
					->setSize(13);

				// Запись позиции текста верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getStyle('A1:AC1')
					->getAlignment()
					->setHorizontal(Alignment::HORIZONTAL_CENTER)
					->setVertical(Alignment::VERTICAL_CENTER);

				// Запись ширины строки верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getRowDimension(1)
					->setRowHeight(24);

				// Запись ширины колонок
				$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(30);
				$spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(18);
				$spreadsheet->getActiveSheet()->getColumnDimension('C')->setWidth(18);
				$spreadsheet->getActiveSheet()->getColumnDimension('D')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('E')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('F')->setWidth(22);
				$spreadsheet->getActiveSheet()->getColumnDimension('G')->setWidth(12);
				$spreadsheet->getActiveSheet()->getColumnDimension('H')->setWidth(12);
				$spreadsheet->getActiveSheet()->getColumnDimension('I')->setWidth(12);
				$spreadsheet->getActiveSheet()->getColumnDimension('J')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('K')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('L')->setWidth(40);
				$spreadsheet->getActiveSheet()->getColumnDimension('M')->setWidth(32);
				$spreadsheet->getActiveSheet()->getColumnDimension('N')->setWidth(12);
				$spreadsheet->getActiveSheet()->getColumnDimension('O')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('P')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('Q')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('R')->setWidth(16);
				$spreadsheet->getActiveSheet()->getColumnDimension('S')->setWidth(16);
				$spreadsheet->getActiveSheet()->getColumnDimension('T')->setWidth(22);
				$spreadsheet->getActiveSheet()->getColumnDimension('U')->setWidth(22);
				$spreadsheet->getActiveSheet()->getColumnDimension('V')->setWidth(80);
				$spreadsheet->getActiveSheet()->getColumnDimension('W')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('X')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('Y')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('Z')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('AA')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('AB')->setWidth(14);
				$spreadsheet->getActiveSheet()->getColumnDimension('AC')->setWidth(14);

				// Инициализация счётчика строк
				$row = 2;

				foreach ($tasks as $task) {
					// Перебор заявок

					// Инициализация сотрудника
					$worker = worker::read('d.id == "' . $task->worker . '"');

					if ($worker instanceof _document) {
						// Найден сотрудник

						// Инициализация магазина
						$market = market::read('d.id == "' . $task->market . '"');

						if ($market instanceof _document) {
							// Найден магазин

							// Запись строки
							$spreadsheet
								->getActiveSheet()
								->setCellValue("A$row", $market->city . ' ' . $market->address)
								->setCellValue("B$row", '')
								->setCellValue("C$row", gmdate("d.m.Y", $task->date))
								->setCellValue("D$row", $market->id)
								->setCellValue("E$row", $worker->id)
								->setCellValue("F$row", $task->work)
								->setCellValue("G$row", $task->start)
								->setCellValue("H$row", $task->end)
								->setCellValue("I$row", $hours = task::hours($task->start, $task->end, $errors))
								->setCellValue("J$row", '')
								->setCellValue("K$row", $task->rating ?? 'Отсутствует')
								->setCellValue("L$row", $task->review ?? '')
								->setCellValue("M$row", $worker->name['second'] . ' ' . $worker->name['first'] . ' ' . $worker->name['last'])
								->setCellValue("N$row", $hour = static::hour('worker', $market->city, $task->work))
								->setCellValue("O$row", $payment = $hour * $hours)
								->setCellValue("P$row", ($penalty = static::penalty($task->rating ?? null)) === null ? $payment : $penalty)
								->setCellValue("Q$row", $bonus = static::bonus($task->rating ?? null))
								->setCellValue("R$row", $payment + (($penalty = static::penalty($task->rating ?? null)) === null ? $payment : $penalty) + $bonus)
								->setCellValue("S$row", '')
								->setCellValue("T$row", $worker->payment) // Наличные?
								->setCellValue("U$row", '')
								->setCellValue("V$row", $worker->requisites)
								->setCellValue("W$row", '')
								->setCellValue("X$row", '')
								->setCellValue("Y$row", '')
								->setCellValue("Z$row", '')
								->setCellValue("AA$row", '')
								->setCellValue("AB$row", '')
								->setCellValue("AC$row", '');

							// Инкрементация счётчика для генерации следующей строки
							++$row;
						}
					}
				}

				// Write to output buffer
				IOFactory::createWriter($spreadsheet, 'Xlsx')->save('php://output');

				// Exit (success)
				return true;
			}
			throw new exception('Не найдены заявки');
		} catch (exception $e) {
			// Write to the errors registry
			$errors[] = [
				'text' => $e->getMessage(),
				'file' => $e->getFile(),
				'line' => $e->getLine(),
				'stack' => $e->getTrace()
			];
		}

		// Exit (fail)
		return false;
	}

	/**
	 * Магазины
	 *
	 * Расчитать ... и сгенерировать excel-документ
	 *
	 * @param int $from Начальная дата для выборки заявок (unixtime)
	 * @param int $to Конечная дата для выборки заявок (unixtime)
	 * @param array $errors Errors registry
	 *
	 * @return bool Записан буфер вывода сгенерированный excel-документ?
	 */
	public static function markets(int $from, int $to, array &$errors = []): bool
	{
		try {
			// Чтение заявок
			$tasks = @task::collect(
				"d.date >= $from && d.date <= $to && d.problematic == false && d.completed == true",
				sort: 'd.date DESC',
				amount: 999999,
				index: 'd.date',
				return: '{worker: d.worker, market: d.market, date: d.date, work: d.work, start: d.start, end: d.end, commentary: d.commentary, rating: d.rating, review: d.review}',
				errors: $errors
			);

			// Универсализация
			if ($tasks instanceof _document) $tasks = [$tasks];

			// Инициализация буфера объединённых заявок по дате (подразумеваются дни)
			$merged = [];

			foreach ($tasks as $groups) {
				// Перебор групп заявок разделённых по датам

				foreach ($groups->getAll() as $date => $_tasks) {
					// Перебор дат (подразумевается только одна)

					foreach ($_tasks as $task) {
						// Перебор заявок

						// Первичная инициализация данных в буфере объединённых заявок по дням
						$merged[$task['market']] ??= [];
						$merged[$task['market']][$date] ??= [];
						$merged[$task['market']][$date][$task['work']] ??= ['workers' => 0, 'hours' => 0];

						// Запись в буфер объединённых заявок по дням
						$merged[$task['market']][$date][$task['work']]['workers']++;
						$merged[$task['market']][$date][$task['work']]['hours'] += task::hours($task['start'], $task['end'], $errors);
					}
				}
			}

			if (count($merged) > 0) {
				// Найдены сгенерированные данные

				// Инициализация таблицы
				$spreadsheet = new Spreadsheet();

				// Конвертация unixtime в читаемую дату
				$_from = gmdate("d.m.Y", $from);
				$_to = gmdate("d.m.Y", $to);

				// Запись настроек таблицы
				$spreadsheet
					->getProperties()
					->setCreator('Спецресурс')
					->setLastModifiedBy('Спецресурс')
					->setTitle("$_from - $_to")
					->setSubject(" $_from - $_to")
					->setDescription(" за период с $_from по $_to")
					->setKeywords('магазины');

				// Открытие страницы
				$spreadsheet->setActiveSheetIndex(0);

				// Запись первых строк
				$spreadsheet
					->getActiveSheet()
					->setCellValue('A1', 'К Договору  от 0.0.20')
					->setCellValue('A2', 'К Договору  от 0.0.20')
					->setCellValue('A4', 'Детализация выполненных заказов за период')
					->setCellValue('A5', "Период: $_from - $_to")
					->setCellValue('A6', "Заказчик: ")
					->setCellValue('A8', "Магазин")
					->setCellValue('B8', "Тип")
					->setCellValue('C8', "Адрес")
					->setCellValue('D8', "Дата")
					->setCellValue('E8', "Работа")
					->setCellValue('F8', "Сотрудники")
					->setCellValue('G8', "Часы")
					->setCellValue('H8', "Тариф")
					->setCellValue('I8', "Без НДС")
					->setCellValue('J8', "С НДС");

				// Запись ширины колонок
				$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(12);
				$spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(16);
				$spreadsheet->getActiveSheet()->getColumnDimension('C')->setWidth(32);
				$spreadsheet->getActiveSheet()->getColumnDimension('D')->setWidth(16);
				$spreadsheet->getActiveSheet()->getColumnDimension('E')->setWidth(16);
				$spreadsheet->getActiveSheet()->getColumnDimension('F')->setWidth(16);
				$spreadsheet->getActiveSheet()->getColumnDimension('G')->setWidth(12);
				$spreadsheet->getActiveSheet()->getColumnDimension('H')->setWidth(12);
				$spreadsheet->getActiveSheet()->getColumnDimension('I')->setWidth(18);
				$spreadsheet->getActiveSheet()->getColumnDimension('J')->setWidth(18);

				// Фиксация верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->freezePane('K9');

				// Объединение ячеек
				$spreadsheet->getActiveSheet()->mergeCells('A1:J1');
				$spreadsheet->getActiveSheet()->mergeCells('A2:J2');
				$spreadsheet->getActiveSheet()->mergeCells('A4:J4');
				$spreadsheet->getActiveSheet()->mergeCells('A5:J5');
				$spreadsheet->getActiveSheet()->mergeCells('A6:J6');

				// Запись позиций текстов "к договору"
				$spreadsheet
					->getActiveSheet()
					->getStyle('A1:J2')
					->getAlignment()
					->setHorizontal(Alignment::HORIZONTAL_RIGHT);

				// Запись позиций текста заголовка
				$spreadsheet
					->getActiveSheet()
					->getStyle('A4:J4')
					->getAlignment()
					->setHorizontal(Alignment::HORIZONTAL_CENTER)
					->setVertical(Alignment::VERTICAL_CENTER);

				// Запись позиций текста верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getStyle('A8:J8')
					->getAlignment()
					->setHorizontal(Alignment::HORIZONTAL_CENTER)
					->setVertical(Alignment::VERTICAL_CENTER);

				// Запись цвета верхнего колонтинула (левая половина)
				$spreadsheet
					->getActiveSheet()
					->getStyle('A8:D8')
					->getFill()
					->setFillType(Fill::FILL_SOLID)
					->getStartColor()
					->setARGB('ffdfe4ec');

				// Запись цвета верхнего колонтинула (правая половина)
				$spreadsheet
					->getActiveSheet()
					->getStyle('E8:J8')
					->getFill()
					->setFillType(Fill::FILL_SOLID)
					->getStartColor()
					->setARGB('ff8093b3');

				// Запись размера текста верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getStyle('A8:J8')
					->getFont()
					->setSize(12);

				// Запись толщины текста верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getStyle('A8:J8')
					->getFont()
					->setBold(true);

				// Запись ширины строки верхнего колонтинула
				$spreadsheet
					->getActiveSheet()
					->getRowDimension(8)
					->setRowHeight(32);

				// Инициализация счётчика строк
				$row = 9;

				// Инициализация буфера объединённых данных всех магазинов
				$total = [
					'workers' => 0,
					'hours' => 0,
					'hour' => [],
					'payment' => 0,
					'vat' => 0
				];

				foreach ($merged as $id => $dates) {
					// Перебор магазинов

					// Инициализация магазина
					$market = market::read('d.id == "' . $id . '"');

					if ($market instanceof _document) {
						// Найден магазин

						// Инициализация буфера объединённых данных магазина
						$result = [
							'workers' => 0,
							'hours' => 0,
							'hour' => [],
							'payment' => 0,
							'vat' => 0
						];

						foreach ($dates as $date => $works) {
							// Перебор дат заявок

							foreach ($works as $work => $task) {
								// Перебор заявок

								// Запись строки с заявками по дате
								$spreadsheet
									->setActiveSheetIndex(0)
									->setCellValue("A$row", $id)
									->setCellValue("B$row", $market->type)
									->setCellValue("C$row", $market->address)
									->setCellValue("D$row", gmdate("d.m.Y", $date))
									->setCellValue("E$row", $work)
									->setCellValue("F$row", $task['workers'])
									->setCellValue("G$row", $task['hours'])
									->setCellValue("H$row", $hour = static::hour('market', $market->city, $work))
									->setCellValue("I$row", $payment = $hour * $task['hours'])
									->setCellValue("J$row", $payment);

								// Запись в буфер объединённых данных магазина
								$result['workers'] += $task['workers'];
								$result['hours'] += $task['hours'];
								$result['hour'][] = $hour;
								$result['payment'] += $payment;
								$result['vat'] += $payment;

								// Инкрементация счётчика для генерации следующей строки
								++$row;
							}
						}

						// Запись строки с общими данными магазина
						$spreadsheet
							->setActiveSheetIndex(0)
							->setCellValue("A$row", "Всего ($id)")
							->setCellValue("B$row", '')
							->setCellValue("C$row", '')
							->setCellValue("D$row", '')
							->setCellValue("E$row", '')
							->setCellValue("F$row", $result['workers'])
							->setCellValue("G$row", $result['hours'])
							->setCellValue("H$row", $hour = array_sum($result['hour']) / count($result['hour']))
							->setCellValue("I$row", $result['payment'])
							->setCellValue("J$row", $result['vat']);

						// Запись в буфер объединённых данных всех магазинов
						$total['workers'] += $result['workers'];
						$total['hours'] += $result['hours'];
						$total['hour'][] = $hour;
						$total['payment'] += $result['payment'];
						$total['vat'] += $result['vat'];

						// Запись цвета строки с общими данными магазина
						$spreadsheet
							->getActiveSheet()
							->getStyle("A$row:J$row")
							->getFill()
							->setFillType(Fill::FILL_SOLID)
							->getStartColor()
							->setARGB('ffdfe4ec');

						++$row;
					}
				}

				// Запись строки с общими данными всех магазинов
				$spreadsheet
					->setActiveSheetIndex(0)
					->setCellValue("A$row", "Итого")
					->setCellValue("B$row", '')
					->setCellValue("C$row", '')
					->setCellValue("D$row", '')
					->setCellValue("E$row", '')
					->setCellValue("F$row", $total['workers'])
					->setCellValue("G$row", $total['hours'])
					->setCellValue("H$row", array_sum($total['hour']) / count($total['hour']))
					->setCellValue("I$row", $total['payment'])
					->setCellValue("J$row", $total['vat']);

				// Запись цвета строки с общими данными всех магазинов
				$spreadsheet
					->getActiveSheet()
					->getStyle("A$row:J$row")
					->getFill()
					->setFillType(Fill::FILL_SOLID)
					->getStartColor()
					->setARGB('ffdfe4ec');

				// Запись жирного текста для строки с общими данными всех магазинов
				$spreadsheet
					->getActiveSheet()
					->getStyle("A$row:J$row")
					->getFont()
					->setBold(true);

				// Write to output buffer
				IOFactory::createWriter($spreadsheet, 'Xlsx')->save('php://output');

				// Exit (success)
				return true;
			}
			throw new exception('Не найдены заявки');
		} catch (exception $e) {
			// Write to the errors registry
			$errors[] = [
				'text' => $e->getMessage(),
				'file' => $e->getFile(),
				'line' => $e->getLine(),
				'stack' => $e->getTrace()
			];
		}

		// Exit (fail)
		return false;
	}


	/**
	 * Determine tariff
	 *
	 * @param string $type Type of tariffs (market, worker)
	 * @param string $city City in which the place of work is located
	 * @param string $work Type of work
	 *
	 * @return int|float Cost of work per hour (rubles)
	 */
	public static function hour(string $type, string $city, string $work): int|float
	{
		return
			match (mb_strtolower($type)) {
				'market', 'магазин' => match (mb_strtolower($city)) {
					'красноярск' => match (mb_strtolower($work)) {
						'cashiers', 'cashier', 'кассиры', 'кассир' => 257.07,
						'displayers', 'displayer', 'выкладчики', 'выкладчик' => 257.07,
						'gastronomes', 'gastronome', 'гастрономы', 'гастроном' => 257.07,
						'brigadiers', 'brigadier', 'бригадиры', 'бригадир' => 360,
						'loaders', 'loader', 'грузчики', 'грузчик' => 255.645,
						'loaders_mobile', 'loader_mobile', 'мобильные грузчики', 'мобильный грузчик' => 305,
						'universals_mobile', 'universal_mobile', 'мобильные универсалы', 'мобильный универсал' => 305,
						default => 0
					},
					'железногорск', 'сосновоборск', 'тыва' => match (mb_strtolower($work)) {
						'cashiers', 'cashier', 'кассиры', 'кассир' => 263.34,
						'displayers', 'displayer', 'выкладчики', 'выкладчик' => 263.34,
						'gastronomes', 'gastronome', 'гастрономы', 'гастроном' => 263.34,
						'brigadiers', 'brigadier', 'бригадиры', 'бригадир' => 360,
						'loaders', 'loader', 'грузчики', 'грузчик' => 255.645,
						'loaders_mobile', 'loader_mobile', 'мобильные грузчики', 'мобильный грузчик' => 305,
						'universals_mobile', 'universal_mobile', 'мобильные универсалы', 'мобильный универсал' => 305,
						default => 0
					},
					'хакасия', 'иркутск' => match (mb_strtolower($work)) {
						'cashiers', 'cashier', 'кассиры', 'кассир' => 245.385,
						'displayers', 'displayer', 'выкладчики', 'выкладчик' => 245.385,
						'gastronomes', 'gastronome', 'гастрономы', 'гастроном' => 245.385,
						'brigadiers', 'brigadier', 'бригадиры', 'бригадир' => 360,
						'loaders', 'loader', 'грузчики', 'грузчик' => 255.645,
						'loaders_mobile', 'loader_mobile', 'мобильные грузчики', 'мобильный грузчик' => 305,
						'universals_mobile', 'universal_mobile', 'мобильные универсалы', 'мобильный универсал' => 305,
						default => 0
					},
					default => 0
				},
				'worker', 'сотрудник' => match (mb_strtolower($city)) {
					'красноярск' => match (mb_strtolower($work)) {
						'cashiers', 'cashier', 'кассиры', 'кассир' => 190.91,
						'displayers', 'displayer', 'выкладчики', 'выкладчик' => 190.91,
						'gastronomes', 'gastronome', 'гастрономы', 'гастроном' => 190.91,
						'brigadiers', 'brigadier', 'бригадиры', 'бригадир' => 250,
						'loaders', 'loader', 'грузчики', 'грузчик' => 177.27,
						'loaders_mobile', 'loader_mobile', 'мобильные грузчики', 'мобильный грузчик' => 250,
						'universals_mobile', 'universal_mobile', 'мобильные универсалы', 'мобильный универсал' => 250,
						default => 0
					},
					'железногорск', 'сосновоборск', 'тыва' => match (mb_strtolower($work)) {
						'cashiers', 'cashier', 'кассиры', 'кассир' => 190.91,
						'displayers', 'displayer', 'выкладчики', 'выкладчик' => 190.91,
						'gastronomes', 'gastronome', 'гастрономы', 'гастроном' => 190.91,
						'brigadiers', 'brigadier', 'бригадиры', 'бригадир' => 250,
						'loaders', 'loader', 'грузчики', 'грузчик' => 177.27,
						'loaders_mobile', 'loader_mobile', 'мобильные грузчики', 'мобильный грузчик' => 250,
						'universals_mobile', 'universal_mobile', 'мобильные универсалы', 'мобильный универсал' => 250,
						default => 0
					},
					'хакасия', 'иркутск' => match (mb_strtolower($work)) {
						'cashiers', 'cashier', 'кассиры', 'кассир' => 181.82,
						'displayers', 'displayer', 'выкладчики', 'выкладчик' => 181.82,
						'gastronomes', 'gastronome', 'гастрономы', 'гастроном' => 181.82,
						'brigadiers', 'brigadier', 'бригадиры', 'бригадир' => 250,
						'loaders', 'loader', 'грузчики', 'грузчик' => 168.18,
						'loaders_mobile', 'loader_mobile', 'мобильные грузчики', 'мобильный грузчик' => 250,
						'universals_mobile', 'universal_mobile', 'мобильные универсалы', 'мобильный универсал' => 250,
						default => 0
					},
					default => 0
				},
				default => 0
			};
	}

	/**
	 * Bonus on task
	 *
	 * @param int $rating Rating of the task from the market
	 *
	 * @return int Bonus (rubles)
	 */
	public static function bonus(int $rating): int
	{
		return match ($rating) {
			5 => 100,
			default => 0
		};
	}

	/**
	 * Penalty on task
	 *
	 * @param int $rating Rating of the task from the market
	 *
	 * @return int|null Penalty (rubles) (null - all payment)
	 */
	public static function penalty(int $rating): ?int
	{
		return match ($rating) {
			3 => -100,
			2 => -500,
			1 => null,
			default => 0
		};
	}
}
