Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
8c1736f4fd | |||
46ff0a1d9b | |||
cb5abd9358 | |||
efb85a2609 |
@@ -94,7 +94,7 @@ final class account extends core
|
|||||||
if (mb_strlen($parameters['number']) === 11) $account->number = $parameters['number'];
|
if (mb_strlen($parameters['number']) === 11) $account->number = $parameters['number'];
|
||||||
else throw new exception('Номер должен состоять из 11 символов');
|
else throw new exception('Номер должен состоять из 11 символов');
|
||||||
if ($parameters['mail'] !== $account->mail) $account->mail = $parameters['mail'];
|
if ($parameters['mail'] !== $account->mail) $account->mail = $parameters['mail'];
|
||||||
if (!empty($parameters['password']) && !sodium_crypto_pwhash_str_verify($parameters['password'], $account->password) && $password = true)
|
if (!empty($parameters['password']) && !@sodium_crypto_pwhash_str_verify($parameters['password'], $account->password ?? '') && $password = true)
|
||||||
if (mb_strlen($parameters['password']) > 6) $account->password = sodium_crypto_pwhash_str(
|
if (mb_strlen($parameters['password']) > 6) $account->password = sodium_crypto_pwhash_str(
|
||||||
$parameters['password'],
|
$parameters['password'],
|
||||||
SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE,
|
SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE,
|
||||||
|
@@ -359,7 +359,7 @@ final class market extends core
|
|||||||
// Авторизован аккаунт администратора или оператора
|
// Авторизован аккаунт администратора или оператора
|
||||||
|
|
||||||
// Инициализация данных магазина
|
// Инициализация данных магазина
|
||||||
$market = model::read('d.id == "' . $parameters['id'] . '"', return: '{ name: d.name, number: d.number, mail: d.mail, type: d.type, city: d.city, district: d.district, address: d.address}')->getAll();
|
$market = model::read('d.id == "' . urldecode($parameters['id']) . '"', return: '{ name: d.name, number: d.number, mail: d.mail, type: d.type, city: d.city, district: d.district, address: d.address}')->getAll();
|
||||||
|
|
||||||
if (!empty($market)) {
|
if (!empty($market)) {
|
||||||
// Найдены данные магазина
|
// Найдены данные магазина
|
||||||
@@ -399,7 +399,7 @@ final class market extends core
|
|||||||
// Авторизован аккаунт администратора или оператора
|
// Авторизован аккаунт администратора или оператора
|
||||||
|
|
||||||
// Инициализация данных магазина
|
// Инициализация данных магазина
|
||||||
$market = model::read('d.id == "' . $parameters['id'] . '"');
|
$market = model::read('d.id == "' . urldecode($parameters['id']) . '"');
|
||||||
|
|
||||||
if (!empty($market)) {
|
if (!empty($market)) {
|
||||||
// Найден магазин
|
// Найден магазин
|
||||||
|
@@ -11,6 +11,7 @@ use mirzaev\ebala\controllers\core,
|
|||||||
mirzaev\ebala\models\account,
|
mirzaev\ebala\models\account,
|
||||||
mirzaev\ebala\models\worker,
|
mirzaev\ebala\models\worker,
|
||||||
mirzaev\ebala\models\market,
|
mirzaev\ebala\models\market,
|
||||||
|
mirzaev\ebala\models\payments,
|
||||||
mirzaev\ebala\models\core as _core;
|
mirzaev\ebala\models\core as _core;
|
||||||
|
|
||||||
// Библиотека для ArangoDB
|
// Библиотека для ArangoDB
|
||||||
@@ -577,7 +578,7 @@ final class task extends core
|
|||||||
throw new exception('Запрещено редактировать заявку за менее 16 часов до её начала');
|
throw new exception('Запрещено редактировать заявку за менее 16 часов до её начала');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -1207,7 +1208,7 @@ final class task extends core
|
|||||||
// Изменение статуса подтверждения
|
// Изменение статуса подтверждения
|
||||||
$task->confirmed = !$task->confirmed;
|
$task->confirmed = !$task->confirmed;
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -1332,7 +1333,7 @@ final class task extends core
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -1453,7 +1454,7 @@ final class task extends core
|
|||||||
else {
|
else {
|
||||||
// Получена оценка
|
// Получена оценка
|
||||||
|
|
||||||
// Запись оценики
|
// Запись оценки
|
||||||
$task->rating = $parameters['rating'];
|
$task->rating = $parameters['rating'];
|
||||||
|
|
||||||
if (!empty($parameters['review'])) {
|
if (!empty($parameters['review'])) {
|
||||||
@@ -1468,9 +1469,38 @@ final class task extends core
|
|||||||
|
|
||||||
// Снятие с публикации
|
// Снятие с публикации
|
||||||
$task->published = false;
|
$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) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -1567,7 +1597,7 @@ final class task extends core
|
|||||||
// Изменение статуса скрытия
|
// Изменение статуса скрытия
|
||||||
$task->hided = !$task->hided;
|
$task->hided = !$task->hided;
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -1705,7 +1735,7 @@ final class task extends core
|
|||||||
// Изменение статуса
|
// Изменение статуса
|
||||||
$task->status = 'deleted';
|
$task->status = 'deleted';
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -2047,24 +2077,40 @@ final class task extends core
|
|||||||
// Заявка подтверждена?
|
// Заявка подтверждена?
|
||||||
if ($task->confirmed) throw new exception('Запрещено редактировать тип работы у подтверждённой заявки');
|
if ($task->confirmed) throw new exception('Запрещено редактировать тип работы у подтверждённой заявки');
|
||||||
|
|
||||||
// Инициализация даты
|
if ($this->account->type === 'market') {
|
||||||
$date = (new DateTime('@' . $task->date))->setTimezone(new DateTimeZone('Asia/Krasnoyarsk'));
|
// Магазин
|
||||||
|
|
||||||
// Инициализация времени
|
// Инициализация даты
|
||||||
$start = datetime::createFromFormat('H:i', (string) $task->start);
|
$date = (new DateTime('@' . $task->date))->setTimezone(new DateTimeZone('Asia/Krasnoyarsk'));
|
||||||
$end = datetime::createFromFormat('H:i', (string) $task->end);
|
|
||||||
|
|
||||||
// Перенос времени в дату
|
// Инициализация времени
|
||||||
$start = $date->setTime((int) $start->format('H'), (int) $start->format('i'))->format('U');
|
$start = datetime::createFromFormat('H:i', (string) $task->start);
|
||||||
$end = $date->setTime((int) $end->format('H'), (int) $end->format('i'))->format('U');
|
$end = datetime::createFromFormat('H:i', (string) $task->end);
|
||||||
|
|
||||||
// Заявка уже начата
|
// Перенос времени в дату
|
||||||
if ($this->account->type === 'market' and time() - $start > 0)
|
$start = $date->setTime((int) $start->format('H'), (int) $start->format('i'))->format('U');
|
||||||
throw new exception('Запрещено редактировать тип работы начатой заявки');
|
$end = $date->setTime((int) $end->format('H'), (int) $end->format('i'))->format('U');
|
||||||
|
|
||||||
// Заявка уже завершена
|
// Заявка уже начата?
|
||||||
if ($this->account->type === 'market' and $task->completed === true || time() - $end > 0)
|
if (time() - $start > 0)
|
||||||
throw new exception('Запрещено редактировать тип работы завершённой заявки');
|
throw new exception('Запрещено редактировать тип работы начатой заявки');
|
||||||
|
|
||||||
|
// Заявка уже прошла?
|
||||||
|
if (time() - $end > 0)
|
||||||
|
throw new exception('Запрещено редактировать тип работы прошедшей заявки');
|
||||||
|
|
||||||
|
// Заявка уже завершена?
|
||||||
|
if ($task->completed === true)
|
||||||
|
throw new exception('Запрещено редактировать тип работы завершённой заявки');
|
||||||
|
|
||||||
|
// Прошло более 30 минут после создания заявки? (1800 секунд = 30 минут)
|
||||||
|
/* if (time() - $task->created > 1800)
|
||||||
|
throw new exception('Запрещено редактировать заявку спустя 30 минут после создания'); */
|
||||||
|
|
||||||
|
// До начала заявки осталось менее 16 часов? (57600 секунд = 16 часов)
|
||||||
|
if ($start - time() < 57600)
|
||||||
|
throw new exception('Запрещено редактировать тип работы заявки за менее 16 часов до её начала');
|
||||||
|
}
|
||||||
|
|
||||||
if ($task instanceof _document) {
|
if ($task instanceof _document) {
|
||||||
// Найдена заявка
|
// Найдена заявка
|
||||||
@@ -2075,7 +2121,7 @@ final class task extends core
|
|||||||
default => 'Кассир'
|
default => 'Кассир'
|
||||||
};
|
};
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -2197,7 +2243,7 @@ final class task extends core
|
|||||||
// Изменение статуса
|
// Изменение статуса
|
||||||
$task->description = $parameters['description'];
|
$task->description = $parameters['description'];
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -2287,24 +2333,40 @@ final class task extends core
|
|||||||
// Заявка подтверждена?
|
// Заявка подтверждена?
|
||||||
if ($task->confirmed) throw new exception('Запрещено редактировать дату и время у подтверждённой заявки');
|
if ($task->confirmed) throw new exception('Запрещено редактировать дату и время у подтверждённой заявки');
|
||||||
|
|
||||||
// Инициализация даты
|
if ($this->account->type === 'market') {
|
||||||
$date = (new DateTime('@' . $task->date))->setTimezone(new DateTimeZone('Asia/Krasnoyarsk'));
|
// Магазин
|
||||||
|
|
||||||
// Инициализация времени
|
// Инициализация даты
|
||||||
$start = datetime::createFromFormat('H:i', (string) $task->start);
|
$date = (new DateTime('@' . $task->date))->setTimezone(new DateTimeZone('Asia/Krasnoyarsk'));
|
||||||
$end = datetime::createFromFormat('H:i', (string) $task->end);
|
|
||||||
|
|
||||||
// Перенос времени в дату
|
// Инициализация времени
|
||||||
$start = $date->setTime((int) $start->format('H'), (int) $start->format('i'))->format('U');
|
$start = datetime::createFromFormat('H:i', (string) $task->start);
|
||||||
$end = $date->setTime((int) $end->format('H'), (int) $end->format('i'))->format('U');
|
$end = datetime::createFromFormat('H:i', (string) $task->end);
|
||||||
|
|
||||||
// Заявка уже начата
|
// Перенос времени в дату
|
||||||
if ($this->account->type === 'market' and time() - $start > 0)
|
$start = $date->setTime((int) $start->format('H'), (int) $start->format('i'))->format('U');
|
||||||
throw new exception('Запрещено редактировать дату и время начатой заявки');
|
$end = $date->setTime((int) $end->format('H'), (int) $end->format('i'))->format('U');
|
||||||
|
|
||||||
// Заявка уже завершена
|
// Заявка уже начата?
|
||||||
if ($this->account->type === 'market' and $task->completed === true || time() - $end > 0)
|
if (time() - $start > 0)
|
||||||
throw new exception('Запрещено редактировать дату и время завершённой заявки');
|
throw new exception('Запрещено редактировать дату и время начатой заявки');
|
||||||
|
|
||||||
|
// Заявка уже прошла?
|
||||||
|
if (time() - $end > 0)
|
||||||
|
throw new exception('Запрещено редактировать дату и время прошедшей заявки');
|
||||||
|
|
||||||
|
// Заявка уже завершена?
|
||||||
|
if ($task->completed === true)
|
||||||
|
throw new exception('Запрещено редактировать дату и время завершённой заявки');
|
||||||
|
|
||||||
|
// Прошло более 30 минут после создания заявки? (1800 секунд = 30 минут)
|
||||||
|
/* if (time() - $task->created > 1800)
|
||||||
|
throw new exception('Запрещено редактировать заявку спустя 30 минут после создания'); */
|
||||||
|
|
||||||
|
// До начала заявки осталось менее 16 часов? (57600 секунд = 16 часов)
|
||||||
|
if ($start - time() < 57600)
|
||||||
|
throw new exception('Запрещено редактировать дату и время заявки за менее 16 часов до её начала');
|
||||||
|
}
|
||||||
|
|
||||||
if ($task instanceof _document) {
|
if ($task instanceof _document) {
|
||||||
// Найдена заявка
|
// Найдена заявка
|
||||||
@@ -2314,7 +2376,7 @@ final class task extends core
|
|||||||
if (!empty($parameters['start'])) $task->start = $parameters['start'];
|
if (!empty($parameters['start'])) $task->start = $parameters['start'];
|
||||||
if (!empty($parameters['end'])) $task->end = $parameters['end'];
|
if (!empty($parameters['end'])) $task->end = $parameters['end'];
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -2407,7 +2469,7 @@ final class task extends core
|
|||||||
// Запись комментария
|
// Запись комментария
|
||||||
$task->commentary = $parameters['commentary'];
|
$task->commentary = $parameters['commentary'];
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -2500,7 +2562,7 @@ final class task extends core
|
|||||||
// Запись статуса о публикации
|
// Запись статуса о публикации
|
||||||
$task->published = true;
|
$task->published = true;
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -2593,7 +2655,7 @@ final class task extends core
|
|||||||
// Запись статуса о публикации
|
// Запись статуса о публикации
|
||||||
$task->published = false;
|
$task->published = false;
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -2948,7 +3010,7 @@ final class task extends core
|
|||||||
$task->problematic = false;
|
$task->problematic = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
@@ -3026,7 +3088,7 @@ final class task extends core
|
|||||||
$task->problematic = false;
|
$task->problematic = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Запись в ресстре последних обновивших
|
// Запись в реестре последних обновивших
|
||||||
$task->updates = [$this->account->type => match ($this->account->type) {
|
$task->updates = [$this->account->type => match ($this->account->type) {
|
||||||
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
'worker', 'market' => account::{$this->account->type}($this->account->getId())?->id,
|
||||||
default => $this->account->getKey()
|
default => $this->account->getKey()
|
||||||
|
@@ -396,7 +396,7 @@ final class worker extends core
|
|||||||
// Авторизован аккаунт администратора или оператора
|
// Авторизован аккаунт администратора или оператора
|
||||||
|
|
||||||
// Инициализация данных сотрудника
|
// Инициализация данных сотрудника
|
||||||
$worker = model::read('d.id == "' . $parameters['id'] . '"', return: '{ name: d.name, number: d.number, mail: d.mail, birth: d.birth, passport: d.passport, issued: d.issued, department: d.department, requisites: d.requisites, payment: d.payment, tax: d.tax, city: d.city, district: d.district, address: d.address, worl: d.work, hiring: d.hiring}')->getAll();
|
$worker = model::read('d.id == "' . urldecode($parameters['id']) . '"', return: '{ name: d.name, number: d.number, mail: d.mail, birth: d.birth, passport: d.passport, issued: d.issued, department: d.department, requisites: d.requisites, payment: d.payment, tax: d.tax, city: d.city, district: d.district, address: d.address, worl: d.work, hiring: d.hiring}')->getAll();
|
||||||
|
|
||||||
if (!empty($worker)) {
|
if (!empty($worker)) {
|
||||||
// Найдены данные сотрудника
|
// Найдены данные сотрудника
|
||||||
@@ -436,7 +436,7 @@ final class worker extends core
|
|||||||
// Авторизован аккаунт администратора или оператора
|
// Авторизован аккаунт администратора или оператора
|
||||||
|
|
||||||
// Инициализация данных сотрудника
|
// Инициализация данных сотрудника
|
||||||
$worker = model::read('d.id == "' . $parameters['id'] . '"');
|
$worker = model::read('d.id == "' . urldecode($parameters['id']) . '"');
|
||||||
|
|
||||||
if (!empty($worker)) {
|
if (!empty($worker)) {
|
||||||
// Найден сотрудник
|
// Найден сотрудник
|
||||||
@@ -533,7 +533,7 @@ final class worker extends core
|
|||||||
// Авторизован аккаунт администратора или оператора
|
// Авторизован аккаунт администратора или оператора
|
||||||
|
|
||||||
// Инициализация данных сотрудника
|
// Инициализация данных сотрудника
|
||||||
$worker = model::read('d.id == "' . $parameters['id'] . '"');
|
$worker = model::read('d.id == "' . urldecode($parameters['id']) . '"');
|
||||||
|
|
||||||
if (!empty($worker)) {
|
if (!empty($worker)) {
|
||||||
// Найден сотрудник
|
// Найден сотрудник
|
||||||
@@ -587,7 +587,7 @@ final class worker extends core
|
|||||||
// Авторизован аккаунт администратора или оператора
|
// Авторизован аккаунт администратора или оператора
|
||||||
|
|
||||||
// Инициализация данных сотрудника
|
// Инициализация данных сотрудника
|
||||||
$worker = model::read('d.id == "' . $parameters['id'] . '"');
|
$worker = model::read('d.id == "' . urldecode($parameters['id']) . '"');
|
||||||
|
|
||||||
if (!empty($worker)) {
|
if (!empty($worker)) {
|
||||||
// Найден сотрудник
|
// Найден сотрудник
|
||||||
|
@@ -206,7 +206,7 @@ final class payments extends core
|
|||||||
->setCellValue("K$row", $task->rating ?? 'Отсутствует')
|
->setCellValue("K$row", $task->rating ?? 'Отсутствует')
|
||||||
->setCellValue("L$row", $task->review ?? '')
|
->setCellValue("L$row", $task->review ?? '')
|
||||||
->setCellValue("M$row", $worker->name['second'] . ' ' . $worker->name['first'] . ' ' . $worker->name['last'])
|
->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("O$row", $payment = $hour * $hours)
|
||||||
->setCellValue("P$row", ($penalty = static::penalty($task->rating ?? null)) === null ? $payment : $penalty)
|
->setCellValue("P$row", ($penalty = static::penalty($task->rating ?? null)) === null ? $payment : $penalty)
|
||||||
->setCellValue("Q$row", $bonus = static::bonus($task->rating ?? null))
|
->setCellValue("Q$row", $bonus = static::bonus($task->rating ?? null))
|
||||||
@@ -431,6 +431,15 @@ final class payments extends core
|
|||||||
// Инициализация счётчика строк
|
// Инициализация счётчика строк
|
||||||
$row = 9;
|
$row = 9;
|
||||||
|
|
||||||
|
// Инициализация буфера объединённых данных всех магазинов
|
||||||
|
$total = [
|
||||||
|
'workers' => 0,
|
||||||
|
'hours' => 0,
|
||||||
|
'hour' => [],
|
||||||
|
'payment' => 0,
|
||||||
|
'vat' => 0
|
||||||
|
];
|
||||||
|
|
||||||
foreach ($merged as $id => $dates) {
|
foreach ($merged as $id => $dates) {
|
||||||
// Перебор магазинов
|
// Перебор магазинов
|
||||||
|
|
||||||
@@ -465,7 +474,7 @@ final class payments extends core
|
|||||||
->setCellValue("E$row", $work)
|
->setCellValue("E$row", $work)
|
||||||
->setCellValue("F$row", $task['workers'])
|
->setCellValue("F$row", $task['workers'])
|
||||||
->setCellValue("G$row", $task['hours'])
|
->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("I$row", $payment = $hour * $task['hours'])
|
||||||
->setCellValue("J$row", $payment);
|
->setCellValue("J$row", $payment);
|
||||||
|
|
||||||
@@ -491,10 +500,17 @@ final class payments extends core
|
|||||||
->setCellValue("E$row", '')
|
->setCellValue("E$row", '')
|
||||||
->setCellValue("F$row", $result['workers'])
|
->setCellValue("F$row", $result['workers'])
|
||||||
->setCellValue("G$row", $result['hours'])
|
->setCellValue("G$row", $result['hours'])
|
||||||
->setCellValue("H$row", array_sum($result['hour']) / count($result['hour']))
|
->setCellValue("H$row", $hour = array_sum($result['hour']) / count($result['hour']))
|
||||||
->setCellValue("I$row", $result['payment'])
|
->setCellValue("I$row", $result['payment'])
|
||||||
->setCellValue("J$row", $result['vat']);
|
->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
|
$spreadsheet
|
||||||
->getActiveSheet()
|
->getActiveSheet()
|
||||||
@@ -508,6 +524,36 @@ final class payments extends core
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Запись строки с общими данными всех магазинов
|
||||||
|
$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
|
// Write to output buffer
|
||||||
IOFactory::createWriter($spreadsheet, 'Xlsx')->save('php://output');
|
IOFactory::createWriter($spreadsheet, 'Xlsx')->save('php://output');
|
||||||
|
|
||||||
@@ -533,46 +579,84 @@ final class payments extends core
|
|||||||
/**
|
/**
|
||||||
* Determine tariff
|
* Determine tariff
|
||||||
*
|
*
|
||||||
|
* @param string $type Type of tariffs (market, worker)
|
||||||
* @param string $city City in which the place of work is located
|
* @param string $city City in which the place of work is located
|
||||||
* @param string $work Type of work
|
* @param string $work Type of work
|
||||||
*
|
*
|
||||||
* @return int|float Cost of work per hour (rubles)
|
* @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) {
|
return
|
||||||
'Красноярск' => match (mb_strtolower($work)) {
|
match (mb_strtolower($type)) {
|
||||||
'cashiers', 'cashier', 'кассиры', 'кассир' => 257.07,
|
'market', 'магазин' => match (mb_strtolower($city)) {
|
||||||
'displayers', 'displayer', 'выкладчики', 'выкладчик' => 257.07,
|
'красноярск' => match (mb_strtolower($work)) {
|
||||||
'gastronomes', 'gastronome', 'гастрономы', 'гастроном' => 257.07,
|
'cashiers', 'cashier', 'кассиры', 'кассир' => 257.07,
|
||||||
'brigadiers', 'brigadier', 'бригадиры', 'бригадир' => 360,
|
'displayers', 'displayer', 'выкладчики', 'выкладчик' => 257.07,
|
||||||
'loaders', 'loader', 'грузчики', 'грузчик' => 255.645,
|
'gastronomes', 'gastronome', 'гастрономы', 'гастроном' => 257.07,
|
||||||
'loaders_mobile', 'loader_mobile', 'мобильные грузчики', 'мобильный грузчик' => 305,
|
'brigadiers', 'brigadier', 'бригадиры', 'бригадир' => 360,
|
||||||
'universals_mobile', 'universal_mobile', 'мобильные универсалы', 'мобильный универсал' => 305,
|
'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
|
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
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -245,4 +245,51 @@ final class task extends core
|
|||||||
default => $work
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -2273,7 +2273,7 @@ if (typeof window.tasks !== "function") {
|
|||||||
complete.innerText = "Завершить";
|
complete.innerText = "Завершить";
|
||||||
complete.setAttribute(
|
complete.setAttribute(
|
||||||
"onclick",
|
"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}'))`
|
||||||
);
|
);
|
||||||
|
|
||||||
// Инициализация окна с ошибками
|
// Инициализация окна с ошибками
|
||||||
@@ -2606,6 +2606,10 @@ if (typeof window.tasks !== "function") {
|
|||||||
work.classList.add("row", "connected", "stretched");
|
work.classList.add("row", "connected", "stretched");
|
||||||
this.works(task).then((html) => (work.innerHTML = html));
|
this.works(task).then((html) => (work.innerHTML = html));
|
||||||
work.setAttribute("title", "Тип работы");
|
work.setAttribute("title", "Тип работы");
|
||||||
|
work.setAttribute(
|
||||||
|
'onchange',
|
||||||
|
`tasks.work(document.getElementById('${task}'), this)`
|
||||||
|
);
|
||||||
|
|
||||||
// Инициализация поля ввода описания
|
// Инициализация поля ввода описания
|
||||||
const description = document.createElement("textarea");
|
const description = document.createElement("textarea");
|
||||||
@@ -2938,8 +2942,19 @@ if (typeof window.tasks !== "function") {
|
|||||||
// Блокировка закрытия окна (чтобы не вызвался click() через событие onclick)
|
// Блокировка закрытия окна (чтобы не вызвался click() через событие onclick)
|
||||||
this.freeze = true;
|
this.freeze = true;
|
||||||
|
|
||||||
// Активация виртуальной кнопки "подтвердить"
|
if (
|
||||||
confirm.click();
|
typeof core === "function" &&
|
||||||
|
core.interface === "operator" &&
|
||||||
|
core.interface === "administrator"
|
||||||
|
) {
|
||||||
|
// Оператор или администратор
|
||||||
|
|
||||||
|
// Активация виртуальной кнопки "подтвердить"
|
||||||
|
confirm.click();
|
||||||
|
} else {
|
||||||
|
// Магазин или сотрудник
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Возвращение статуса блокировки закрытия окна
|
// Возвращение статуса блокировки закрытия окна
|
||||||
this.freeze = freeze;
|
this.freeze = freeze;
|
||||||
@@ -3783,8 +3798,6 @@ if (typeof window.tasks !== "function") {
|
|||||||
// Инициализация идентификатора строки
|
// Инициализация идентификатора строки
|
||||||
const id = row.getAttribute("id");
|
const id = row.getAttribute("id");
|
||||||
|
|
||||||
alert(228);
|
|
||||||
|
|
||||||
if (typeof id === "string") {
|
if (typeof id === "string") {
|
||||||
// Инициализирован идентификатор
|
// Инициализирован идентификатор
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user