diff --git a/mirzaev/ebala/system/controllers/task.php b/mirzaev/ebala/system/controllers/task.php index 26e47e7..dbe1ac6 100755 --- a/mirzaev/ebala/system/controllers/task.php +++ b/mirzaev/ebala/system/controllers/task.php @@ -11,6 +11,7 @@ use mirzaev\ebala\controllers\core, mirzaev\ebala\models\account, mirzaev\ebala\models\worker, mirzaev\ebala\models\market, + mirzaev\ebala\models\payments, mirzaev\ebala\models\core as _core; // Библиотека для ArangoDB @@ -577,7 +578,7 @@ final class task extends core throw new exception('Запрещено редактировать заявку за менее 16 часов до её начала'); } - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -1207,7 +1208,7 @@ final class task extends core // Изменение статуса подтверждения $task->confirmed = !$task->confirmed; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -1332,7 +1333,7 @@ final class task extends core } } - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -1453,7 +1454,7 @@ final class task extends core else { // Получена оценка - // Запись оценики + // Запись оценки $task->rating = $parameters['rating']; if (!empty($parameters['review'])) { @@ -1468,9 +1469,38 @@ final class task extends core // Снятие с публикации $task->published = false; + + // Иниализация сотрудника + $worker = worker::read('d.id == "' . $task->worker . '"'); + + // Инициализация магазина + $market = market::read('d.id == "' . $task->market . '"'); + + // Подсчёт часов работы + $hours = model::hours($task->start, $task->end, $this->errors); + + // Инициализация цены работы за 1 час + $hour = payments::hour($market->city, $task->work); + + // Подсчёт оплаты за работу + $payment = $hour * $hours; + + // Инициализация штрафа + $penalty = payments::penalty($task->rating ?? null); + + // Инициализация премии + $bonus = payments::bonus($task->rating ?? null); + + // Инициализация транзакции к оплате сотруднику + model::transaction( + $task->getId(), + $worker->getId(), + $payment - ($penalty === null ? $payment : -$penalty) + $bonus, + $this->errors + ); } - // Запись в ресстре последних обновивших + // Запись в реcстре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -1567,7 +1597,7 @@ final class task extends core // Изменение статуса скрытия $task->hided = !$task->hided; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -1705,7 +1735,7 @@ final class task extends core // Изменение статуса $task->status = 'deleted'; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -2075,7 +2105,7 @@ final class task extends core default => 'Кассир' }; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -2197,7 +2227,7 @@ final class task extends core // Изменение статуса $task->description = $parameters['description']; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -2314,7 +2344,7 @@ final class task extends core if (!empty($parameters['start'])) $task->start = $parameters['start']; if (!empty($parameters['end'])) $task->end = $parameters['end']; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -2407,7 +2437,7 @@ final class task extends core // Запись комментария $task->commentary = $parameters['commentary']; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -2500,7 +2530,7 @@ final class task extends core // Запись статуса о публикации $task->published = true; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -2593,7 +2623,7 @@ final class task extends core // Запись статуса о публикации $task->published = false; - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -2948,7 +2978,7 @@ final class task extends core $task->problematic = false; } - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() @@ -3026,7 +3056,7 @@ final class task extends core $task->problematic = false; } - // Запись в ресстре последних обновивших + // Запись в реестре последних обновивших $task->updates = [$this->account->type => match ($this->account->type) { 'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id, default => $this->account->getKey() diff --git a/mirzaev/ebala/system/models/payments.php b/mirzaev/ebala/system/models/payments.php index 9c46c72..3810d2f 100755 --- a/mirzaev/ebala/system/models/payments.php +++ b/mirzaev/ebala/system/models/payments.php @@ -206,7 +206,7 @@ final class payments extends core ->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($market->city, $task->work)) + ->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)) @@ -465,7 +465,7 @@ final class payments extends core ->setCellValue("E$row", $work) ->setCellValue("F$row", $task['workers']) ->setCellValue("G$row", $task['hours']) - ->setCellValue("H$row", $hour = static::hour($market->city, $work)) + ->setCellValue("H$row", $hour = static::hour('market', $market->city, $work)) ->setCellValue("I$row", $payment = $hour * $task['hours']) ->setCellValue("J$row", $payment); @@ -533,46 +533,84 @@ final class payments extends core /** * 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 $city, string $work): int|float + public static function hour(string $type, string $city, string $work): int|float { - return match ($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, + 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 - }, - 'Железногорск', 'Сосновоборск', 'Тыва' => 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 - }; + }; } /** diff --git a/mirzaev/ebala/system/models/task.php b/mirzaev/ebala/system/models/task.php index b42c676..70ce49e 100755 --- a/mirzaev/ebala/system/models/task.php +++ b/mirzaev/ebala/system/models/task.php @@ -245,4 +245,51 @@ final class task extends core default => $work }; } + + /** + * Create a transaction for work on a task + * + * @param string $task + * @param string $worker + * @param int $amount + * @param array $errors + * + * @return ?string Identificator of instance of ArangoDB + */ + public static function transaction( + string $task, + string $worker, + int $amount = 0, + array &$errors = [] + ): ?string { + try { + if ( + collection::init(static::$arangodb->session, self::COLLECTION) + && collection::init(static::$arangodb->session, worker::COLLECTION) + && collection::init(static::$arangodb->session, 'transaction', true) + ) { + // Инициализированы коллекции + + // Запись документа в базу данны и возврат (успех) + return document::write(static::$arangodb->session, 'transaction', [ + '_from' => $task, + '_to' => $worker, + 'amount' => $amount, + 'processed' => 0, + ]); + } else 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 null; + } + } diff --git a/mirzaev/ebala/system/public/js/tasks.js b/mirzaev/ebala/system/public/js/tasks.js index e8e4d3c..e09fd53 100755 --- a/mirzaev/ebala/system/public/js/tasks.js +++ b/mirzaev/ebala/system/public/js/tasks.js @@ -2273,7 +2273,7 @@ if (typeof window.tasks !== "function") { complete.innerText = "Завершить"; complete.setAttribute( "onclick", - `tasks.complete(this, this.parentElement.previousElementSibling.previousElementSibling.children[0], this.parentElement.previousElementSibling, document.getElementById('${task}'))` + `tasks.complete(this, this.parentElement.previousElementSibling.previousElementSibling.previousElementSibling.children[0], this.parentElement.previousElementSibling.previousElementSibling, document.getElementById('${task}'))` ); // Инициализация окна с ошибками