class MotivationService
{
-
+ /**
+ * Получает ассоциативный массив алиасов групп мотивации.
+ *
+ * Этот метод извлекает все записи из таблицы `MotivationValueGroup`, а затем создает
+ * ассоциативный массив, где ключами являются идентификаторы групп, а значениями — их алиасы.
+ *
+ * @return array Ассоциативный массив, где ключами являются ID групп мотивации,
+ * а значениями — их алиасы.
+ */
private function getMotivationValueGroupAliases()
{
$groups = MotivationValueGroup::find()->all();
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
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)
{
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
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();
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)
{
// Найти существующую запись
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'));
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');
}
}
-
+ /**
+ * Вычисление общей суммы фонда оплаты труда (ФОТ) - зарплаты и отпускных для магазина за указанный период.
+ *
+ * Этот метод сначала получает записи о сменах сотрудников за указанный период и сумму отпускных.
+ * Затем для каждой записи определяется соответствующая дневная зарплата, и она добавляется к общей сумме.
+ * Если в записи уже указана зарплата за смену, она используется вместо дневной зарплаты.
+ * В конце к общей сумме зарплат добавляется сумма отпускных.
+ *
+ * @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);