From: Vladimir Fomichev Date: Thu, 20 Nov 2025 07:29:48 +0000 (+0300) Subject: Скрипт по датам окладов X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=077c7cf91e92a1e62d684bca28d1bc39e16c555d;p=erp24_rep%2Fyii-erp24%2F.git Скрипт по датам окладов --- diff --git a/erp24/commands/AdminController.php b/erp24/commands/AdminController.php index 8180d1e7..afa8436d 100644 --- a/erp24/commands/AdminController.php +++ b/erp24/commands/AdminController.php @@ -6,6 +6,7 @@ use yii\console\Controller; use yii\helpers\ArrayHelper; use yii_app\records\Admin; use yii_app\records\AdminStores; +use yii_app\records\EmployeePayment; use yii_app\records\ExportImportTable; class AdminController extends Controller { @@ -48,4 +49,57 @@ class AdminController extends Controller { } } } + + /** + * Миграция записей EmployeePayment за ноябрь 2025 года + * Проставляет дату 2025-11-01 для всех записей с заполненным employee_position_id + * Если у сотрудника несколько записей за ноябрь, оставляет одну с датой 2025-11-01 + */ + public function actionMigrateNovember2025Payments() + { + $targetDate = '2025-11-01'; + $year = 2025; + $month = 11; + + echo "Начинаем миграцию записей EmployeePayment за ноябрь 2025 года...\n"; + + // Находим все записи за ноябрь 2025 с заполненным employee_position_id + $payments = EmployeePayment::find() + ->where(['EXTRACT(YEAR FROM date)' => $year]) + ->andWhere(['EXTRACT(MONTH FROM date)' => $month]) + ->andWhere(['IS NOT', 'employee_position_id', null]) + ->orderBy(['admin_id' => SORT_ASC, 'date' => SORT_ASC]) + ->all(); + + echo "Найдено записей: " . count($payments) . "\n"; + + $updated = 0; + $deleted = 0; + $processedAdmins = []; + + foreach ($payments as $payment) { + $adminId = $payment->admin_id; + + // Если это первая запись для этого сотрудника за ноябрь + if (!isset($processedAdmins[$adminId])) { + // Обновляем дату на первое число месяца + $payment->date = $targetDate; + if ($payment->save(false)) { + $updated++; + $processedAdmins[$adminId] = $payment->id; + echo "Обновлена запись ID {$payment->id} для сотрудника {$adminId}: дата установлена {$targetDate}\n"; + } + } else { + // Если уже есть запись для этого сотрудника, удаляем дубликат + if ($payment->delete()) { + $deleted++; + echo "Удалена дублирующая запись ID {$payment->id} для сотрудника {$adminId}\n"; + } + } + } + + echo "\nМиграция завершена:\n"; + echo "Обновлено записей: {$updated}\n"; + echo "Удалено дубликатов: {$deleted}\n"; + } } \ No newline at end of file diff --git a/erp24/services/SalarySyncService.php b/erp24/services/SalarySyncService.php index 6512ec6c..beeb8d0a 100644 --- a/erp24/services/SalarySyncService.php +++ b/erp24/services/SalarySyncService.php @@ -111,12 +111,14 @@ class SalarySyncService } /** - * Создает запись EmployeePayment для сотрудника на основе его должности + * Создает или обновляет запись EmployeePayment для сотрудника на основе его должности + * Дата устанавливается первым числом текущего месяца + * Если запись за этот месяц уже существует, она обновляется * * @param int $adminId ID сотрудника * @param int|null $creatorId ID пользователя, создающего запись - * @param string|null $date Дата записи (по умолчанию текущая дата) - * @return EmployeePayment|null Созданная запись или null в случае ошибки + * @param string|null $date Дата записи (по умолчанию первое число текущего месяца) + * @return EmployeePayment|null Созданная или обновленная запись или null в случае ошибки */ public function createPaymentFromPosition($adminId, $creatorId = null, $date = null): ?EmployeePayment { @@ -128,8 +130,12 @@ class SalarySyncService return null; } + // Если дата не указана, используем первое число текущего месяца if ($date === null) { - $date = date('Y-m-d'); + $date = date('Y-m-01'); + } else { + // Если дата указана, приводим её к первому числу месяца + $date = date('Y-m-01', strtotime($date)); } $admin = Admin::findOne($adminId); @@ -142,15 +148,32 @@ class SalarySyncService return null; } - // Проверяем, нет ли уже записи на эту дату + // Проверяем, есть ли уже запись за этот месяц и год + $year = date('Y', strtotime($date)); + $month = date('m', strtotime($date)); + $existingPayment = EmployeePayment::find() - ->where(['admin_id' => $adminId, 'date' => $date]) + ->where(['admin_id' => $adminId]) + ->andWhere(['EXTRACT(YEAR FROM date)' => $year]) + ->andWhere(['EXTRACT(MONTH FROM date)' => $month]) ->one(); if ($existingPayment) { + // Обновляем существующую запись + $existingPayment->admin_group_id = $admin->group_id; + $existingPayment->employee_position_id = $position->id; + $existingPayment->monthly_salary = $position->monthly_salary; + $existingPayment->daily_payment = $position->daily_payment; + $existingPayment->date = $date; + $existingPayment->creator_id = $creatorId; + + if ($existingPayment->save()) { + return $existingPayment; + } return null; } + // Создаем новую запись $payment = new EmployeePayment(); $payment->admin_id = $adminId; $payment->admin_group_id = $admin->group_id; @@ -170,10 +193,12 @@ class SalarySyncService /** * Синхронизирует оклады для всех сотрудников с указанной должностью * Используется при изменении оклада должности + * Дата устанавливается первым числом текущего месяца + * Если запись за этот месяц уже существует, она обновляется * * @param int $positionId ID должности * @param int|null $creatorId ID пользователя, изменившего оклад - * @return array ['success' => bool, 'message' => string, 'created' => int] + * @return array ['success' => bool, 'message' => string, 'created' => int, 'updated' => int] */ public function syncEmployeesByPosition($positionId, $creatorId = null): array { @@ -185,7 +210,8 @@ class SalarySyncService return [ 'success' => false, 'message' => 'Не указан ID пользователя для создания записей', - 'created' => 0 + 'created' => 0, + 'updated' => 0 ]; } @@ -194,12 +220,16 @@ class SalarySyncService return [ 'success' => false, 'message' => 'Должность не найдена или оклады не заполнены', - 'created' => 0 + 'created' => 0, + 'updated' => 0 ]; } $created = 0; - $date = date('Y-m-d'); + $updated = 0; + $date = date('Y-m-01'); // Первое число текущего месяца + $year = date('Y'); + $month = date('m'); // Получаем всех сотрудников с этой должностью, не уволенных $admins = Admin::find() @@ -208,34 +238,48 @@ class SalarySyncService ->all(); foreach ($admins as $admin) { - // Проверяем, нет ли уже записи на эту дату + // Проверяем, есть ли уже запись за этот месяц и год $existingPayment = EmployeePayment::find() - ->where(['admin_id' => $admin->id, 'date' => $date]) + ->where(['admin_id' => $admin->id]) + ->andWhere(['EXTRACT(YEAR FROM date)' => $year]) + ->andWhere(['EXTRACT(MONTH FROM date)' => $month]) ->one(); if ($existingPayment) { - continue; - } - - // Создаем новую запись - $payment = new EmployeePayment(); - $payment->admin_id = $admin->id; - $payment->admin_group_id = $admin->group_id; - $payment->employee_position_id = $position->id; - $payment->monthly_salary = $position->monthly_salary; - $payment->daily_payment = $position->daily_payment; - $payment->date = $date; - $payment->creator_id = $creatorId; - - if ($payment->save()) { - $created++; + // Обновляем существующую запись + $existingPayment->admin_group_id = $admin->group_id; + $existingPayment->employee_position_id = $position->id; + $existingPayment->monthly_salary = $position->monthly_salary; + $existingPayment->daily_payment = $position->daily_payment; + $existingPayment->date = $date; + $existingPayment->creator_id = $creatorId; + + if ($existingPayment->save()) { + $updated++; + } + } else { + // Создаем новую запись + $payment = new EmployeePayment(); + $payment->admin_id = $admin->id; + $payment->admin_group_id = $admin->group_id; + $payment->employee_position_id = $position->id; + $payment->monthly_salary = $position->monthly_salary; + $payment->daily_payment = $position->daily_payment; + $payment->date = $date; + $payment->creator_id = $creatorId; + + if ($payment->save()) { + $created++; + } } } + $message = "Синхронизация завершена. Создано записей: {$created}, обновлено: {$updated}"; return [ 'success' => true, - 'message' => "Синхронизация завершена. Создано записей: {$created}", - 'created' => $created + 'message' => $message, + 'created' => $created, + 'updated' => $updated ]; } }