From 401303dd25ed077f1a2878ce3bc3599bf82daaad Mon Sep 17 00:00:00 2001 From: JoySystem_v Date: Mon, 12 Aug 2024 14:55:04 +0300 Subject: [PATCH] =?utf8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?utf8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8?= =?utf8?q?=D0=B8=20=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20?= =?utf8?q?=D1=87=D0=B0=D1=81=D1=82=D1=8C=20=D0=BA=D0=BE=D0=B4=D0=B0=20?= =?utf8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/actions/motivation/SumSalaryAction.php | 25 +--- .../motivation/SumSalaryByMonthAction.php | 20 +-- erp24/services/MotivationService.php | 137 ++++++++++++++++-- 3 files changed, 130 insertions(+), 52 deletions(-) diff --git a/erp24/actions/motivation/SumSalaryAction.php b/erp24/actions/motivation/SumSalaryAction.php index f13af742..3ca9a8d0 100644 --- a/erp24/actions/motivation/SumSalaryAction.php +++ b/erp24/actions/motivation/SumSalaryAction.php @@ -72,31 +72,8 @@ class SumSalaryAction extends \yii\base\Action continue; } - // Проверка наличия записи в MotivationValue за текущую неделю - $motivationValue = MotivationValue::findOne([ - 'motivation_id' => $motivation->id, - 'motivation_group_id' => $weekOfMonth, - 'value_id' => 11 - ]); - - if ($motivationValue === null) { - // Если записи нет, создаем новую - $motivationValue = new MotivationValue(); - $motivationValue->motivation_id = $motivation->id; - $motivationValue->motivation_group_id = $weekOfMonth; - $motivationValue->value_id = 11; - $motivationValue->value_type = 'float'; - } - - // Обновляем значение - $motivationValue->value_float = $totalSalary; - $motivationValue->value_int = null; - $motivationValue->value_string = null; + MotivationService::saveOrUpdateMotivationValue($motivation->id, $weekOfMonth, 11, "float", $totalSalary); - // Сохраняем запись - if (!$motivationValue->save()) { - Yii::error("Не удалось записать данные для store_id: $store_id"); - } } return $this->controller->redirect(['motivation/index']); diff --git a/erp24/actions/motivation/SumSalaryByMonthAction.php b/erp24/actions/motivation/SumSalaryByMonthAction.php index a83c58f3..82ecd76f 100644 --- a/erp24/actions/motivation/SumSalaryByMonthAction.php +++ b/erp24/actions/motivation/SumSalaryByMonthAction.php @@ -46,27 +46,9 @@ class SumSalaryByMonthAction extends Action $store_id = $motivation->store_id; $totalSalary = MotivationService::calculateTotalSalary($startDate, $endDate, $store_id); - $motivationValue = MotivationValue::findOne([ - 'motivation_id' => $motivation->id, - 'motivation_group_id' => $weekIndex + 1, // Номер недели - 'value_id' => 11 - ]); - if ($motivationValue === null) { - $motivationValue = new MotivationValue(); - $motivationValue->motivation_id = $motivation->id; - $motivationValue->motivation_group_id = $weekIndex + 1; - $motivationValue->value_id = 11; - $motivationValue->value_type = 'float'; - } - $motivationValue->value_float = $totalSalary; - $motivationValue->value_int = null; - $motivationValue->value_string = null; - - if (!$motivationValue->save()) { - Yii::error("Не удалось записать данные для store_id: $store_id"); - } + MotivationService::saveOrUpdateMotivationValue($motivation->id, $weekIndex + 1, 11, "float", $totalSalary); } } diff --git a/erp24/services/MotivationService.php b/erp24/services/MotivationService.php index e1ae70c1..e5321606 100644 --- a/erp24/services/MotivationService.php +++ b/erp24/services/MotivationService.php @@ -21,7 +21,15 @@ use yii_app\records\EmployeePayment; class MotivationService { - + /** + * Получает ассоциативный массив алиасов групп мотивации. + * + * Этот метод извлекает все записи из таблицы `MotivationValueGroup`, а затем создает + * ассоциативный массив, где ключами являются идентификаторы групп, а значениями — их алиасы. + * + * @return array Ассоциативный массив, где ключами являются ID групп мотивации, + * а значениями — их алиасы. + */ private function getMotivationValueGroupAliases() { $groups = MotivationValueGroup::find()->all(); @@ -32,7 +40,20 @@ class MotivationService return $aliases; } - + /** + * Получает отсортированные данные мотивации для заданного магазина, года и месяца. + * + * Метод извлекает мотивационные данные, соответствующие указанному магазину, году и месяцу, + * а затем обрабатывает их для создания структурированного и отсортированного массива значений. + * Включает дополнительные элементы с нулевыми значениями для плановых и фактических данных, + * если они отсутствуют в основной таблице мотивации. + * + * @param int|null $storeId Идентификатор магазина. Если не указан, может использоваться значение по умолчанию. + * @param int|null $year Год. Если не указан, может использоваться значение по умолчанию. + * @param int|null $month Месяц. Если не указан, может использоваться значение по умолчанию. + * + * @return array Отсортированный массив данных мотивации, включая плановые, фактические и другие элементы. + */ public function getMotivationDataTableSort($storeId = null, $year = null, $month = null) { // 1. Запрос к таблице Motivation @@ -334,7 +355,16 @@ class MotivationService return compact('errors'); } - + /** + * Получение записей по фактическому количеству смен в магазине за указанный период. + * + * @param string $startDate Дата начала периода в формате 'YYYY-MM-DD'. + * @param string $endDate Дата окончания периода в формате 'YYYY-MM-DD'. + * @param int $store_id Идентификатор магазина. + * + * @return array|null Возвращает массив записей из модели TimetableFactModel, соответствующих условиям, + * или null, если записи не найдены. + */ public static function getTimetableFactRecordsByDateAndStore($startDate, $endDate, $store_id) { @@ -348,6 +378,21 @@ class MotivationService return $records; } + /** + * Получение суммы отпускных для магазина за определенный период. + * + * Этот метод выполняет поиск записей в таблице Timetable с `slot_type_id` равным 2, + * которые соответствуют указанному магазину и попадают в заданный период. + * Для каждой записи находится самая последняя запись о платеже сотрудника, + * и её значение используется для расчета суммы отпускных. + * + * @param string $startDate Дата начала периода в формате 'YYYY-MM-DD'. + * @param string $endDate Дата окончания периода в формате 'YYYY-MM-DD'. + * @param int $store_id Идентификатор магазина. + * + * @return float Возвращает общую сумму отпускных за указанный период. + * Если записей не найдено, возвращается 0.0. + */ public static function getVacationsSum($startDate, $endDate, $store_id):float { // Делаем запрос к таблице Timetable для получения записей с slot_type_id = 2 @@ -384,12 +429,25 @@ class MotivationService return $vacationsSum; } - - public static function getMonthSalarySum($id) + /** + * Получение суммы всех недель для определенного `value_id` из таблицы `motivation_value`. + * + * Метод выполняет запрос к модели `MotivationValue`, чтобы получить все записи, + * соответствующие указанным `motivation_id` и `value_id`, и принадлежащие одной из + * определенных групп мотивации. Затем метод суммирует значения поля `value_float` + * из всех полученных записей. + * + * @param int $id Идентификатор мотивации (`motivation_id`). + * @param int $value_id Идентификатор значения (`value_id`). + * + * @return float Возвращает сумму всех значений `value_float` для заданного `value_id`. + * Если записи не найдены, возвращается 0. + */ + public static function getMonthSum($id, $value_id) { // Запрос к модели MotivationValue для получения записей с заданными условиями $records = MotivationValue::find() - ->where(['motivation_id' => $id, 'value_id' => 11]) + ->where(['motivation_id' => $id, 'value_id' => $value_id]) ->andWhere(['in', 'motivation_group_id', [1, 2, 3, 4, 5]]) ->all(); @@ -404,6 +462,26 @@ class MotivationService return $totalSum; } + /** + * Создает или обновляет запись в таблице `motivation_value`. + * + * Метод пытается найти существующую запись в таблице `motivation_value` по заданным + * `motivation_id`, `group_id` и `value_id`. Если запись не найдена, создается новая. + * В зависимости от типа значения (`value_type`), метод устанавливает соответствующее поле + * (`value_float`, `value_int`, `value_string`) и сохраняет запись. + * Если сохранение успешно, возвращается ID записи. В случае ошибки возвращается `false`. + * + * @param int $motivation_id Идентификатор мотивации. + * @param int $group_id Идентификатор группы мотивации. + * @param int $value_id Идентификатор значения. + * @param string $value_type Тип значения, который может быть 'float', 'int' или 'string'. + * @param string $value_string Значение, которое нужно сохранить (string). + * @param int $value_int Значение, которое нужно сохранить (int). + * @param float $value_float Значение, которое нужно сохранить (float). + * + * @return int|false Возвращает ID сохраненной или обновленной записи, либо `false` в случае ошибки. + * @throws \InvalidArgumentException Если передан некорректный тип значения. + */ public static function saveOrUpdateMotivationValue($motivation_id, $group_id, $value_id, $value_type, $value) { // Найти существующую запись @@ -445,7 +523,22 @@ class MotivationService return false; } } - + + /** + * Определяет номер недели в месяце для указанной даты. + * + * Метод вычисляет номер недели в месяце на основе дня месяца, переданного в объекте `DateTime`. + * Недели считаются следующим образом: + * - 1-я неделя: с 1-го по 7-й день месяца. + * - 2-я неделя: с 8-го по 14-й день месяца. + * - 3-я неделя: с 15-го по 21-й день месяца. + * - 4-я неделя: с 22-го по 28-й день месяца. + * - 5-я неделя: с 29-го дня месяца и до конца месяца. + * + * @param \DateTime $dateTime Объект `DateTime`, для которого нужно определить номер недели. + * + * @return int Номер недели в месяце (от 1 до 5). + */ public static function getWeekOfMonth($dateTime) { $dayOfMonth = intval($dateTime->format('j')); @@ -461,7 +554,19 @@ class MotivationService return 5; } } - + + /** + * Возвращает дату начала указанной недели месяца для заданной даты. + * + * Метод определяет начало недели в месяце на основе номера недели, переданного в параметре `$weekOfMonth`. + * Возвращается объект `DateTime`, представляющий первый день этой недели. Если номер недели выходит за пределы + * допустимых значений (1-5), по умолчанию возвращается начало первой недели месяца. + * + * @param \DateTime $dateTime Объект `DateTime`, представляющий дату, для которой определяется неделя. + * @param int $weekOfMonth Номер недели в месяце (от 1 до 5). + * + * @return \DateTime Дата начала указанной недели месяца. + */ public static function getStartOfWeek($dateTime, $weekOfMonth) { $year = $dateTime->format('Y'); @@ -483,7 +588,21 @@ class MotivationService } } - + /** + * Вычисление общей суммы фонда оплаты труда (ФОТ) - зарплаты и отпускных для магазина за указанный период. + * + * Этот метод сначала получает записи о сменах сотрудников за указанный период и сумму отпускных. + * Затем для каждой записи определяется соответствующая дневная зарплата, и она добавляется к общей сумме. + * Если в записи уже указана зарплата за смену, она используется вместо дневной зарплаты. + * В конце к общей сумме зарплат добавляется сумма отпускных. + * + * @param string $startDate Дата начала периода в формате 'YYYY-MM-DD'. + * @param string $endDate Дата окончания периода в формате 'YYYY-MM-DD'. + * @param int $storeId Идентификатор магазина. + * + * @return float Возвращает общую сумму фонда оплаты труда за указанный период, + * включая зарплаты и отпускные. + */ public static function calculateTotalSalary($startDate, $endDate, $storeId):float { $records = self::getTimetableFactRecordsByDateAndStore($startDate, $endDate, $storeId); -- 2.39.5