]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Скрипт по датам окладов
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 20 Nov 2025 07:29:48 +0000 (10:29 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 20 Nov 2025 07:29:48 +0000 (10:29 +0300)
erp24/commands/AdminController.php
erp24/services/SalarySyncService.php

index 8180d1e7bc05854a479bd2d1567ebee69002ef9f..afa8436d6060e3b07b3ca4ce162b8926fb6f8da1 100644 (file)
@@ -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
index 6512ec6c4c1b2f5fb6561de858a20f48e663ebce..beeb8d0a5482e1fbd4f92ed2888640c07dbc6bd8 100644 (file)
@@ -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 Ð¡Ð¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ\8f Ð¸Ð»Ð¸ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð¸Ð»Ð¸ null Ð² Ñ\81лÑ\83Ñ\87ае Ð¾Ñ\88ибки
      */
     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) {
-            // Ð\9fÑ\80овеÑ\80Ñ\8fем, Ð½ÐµÑ\82 Ð»Ð¸ Ñ\83же Ð·Ð°Ð¿Ð¸Ñ\81и Ð½Ð° Ñ\8dÑ\82Ñ\83 Ð´Ð°Ñ\82Ñ\83
+            // Ð\9fÑ\80овеÑ\80Ñ\8fем, ÐµÑ\81Ñ\82Ñ\8c Ð»Ð¸ Ñ\83же Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð·Ð° Ñ\8dÑ\82оÑ\82 Ð¼ÐµÑ\81Ñ\8fÑ\86 Ð¸ Ð³Ð¾Ð´
             $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
         ];
     }
 }