]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
добавил комментарии и заменил часть кода методами
authorJoySystem_v <fvv2011@gmail.com>
Mon, 12 Aug 2024 11:55:04 +0000 (14:55 +0300)
committerJoySystem_v <fvv2011@gmail.com>
Mon, 12 Aug 2024 11:55:04 +0000 (14:55 +0300)
erp24/actions/motivation/SumSalaryAction.php
erp24/actions/motivation/SumSalaryByMonthAction.php
erp24/services/MotivationService.php

index f13af742c8abe3a0bd6de965f73fca6f8dbfb04d..3ca9a8d08a4abb479bb254b312327c9684db0a8d 100644 (file)
@@ -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']);
index a83c58f304be66949002d496b2ddf0551234f283..82ecd76f578c738745e91043a37af0eaaf88660b 100644 (file)
@@ -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);
                 }
             }
 
index e1ae70c1adde0aad2656f7a6f3697ec077d89570..e5321606a069e267a9e4be5cf28582723e446c77 100644 (file)
@@ -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);