]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Merge branch 'refs/heads/develop' into feature_fomichev_erp-492_add_staffing_table_fo...
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 1 Dec 2025 06:42:13 +0000 (09:42 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 1 Dec 2025 06:42:13 +0000 (09:42 +0300)
# Conflicts:
# erp24/commands/AdminController.php

1  2 
erp24/commands/AdminController.php

index a6c37530148c4710a26b447eab4760b35881eb80,a2b29af36f90306252e13b4b3c80d829f60d3cd5..4a0b5e5d2358a4eb1298965611c1aa14d2828828
@@@ -5,9 -5,8 +5,10 @@@ namespace yii_app\commands
  use yii\console\Controller;
  use yii\helpers\ArrayHelper;
  use yii_app\records\Admin;
 +use yii_app\records\AdminGroup;
  use yii_app\records\AdminStores;
+ use yii_app\records\EmployeePayment;
 +use yii_app\records\EmployeePosition;
  use yii_app\records\ExportImportTable;
  
  class AdminController extends Controller {
          }
      }
  
-      * 
 +    /**
 +     * Замена group_name на AdminGroup->name для всех записей с заполненным employee_position_id
-             
++     *
 +     * Команда выполняет:
 +     * 1. Выборку Admin записей с заполненным employee_position_id
 +     * 2. Замену group_name на AdminGroup->name для каждой записи
 +     */
 +    public function actionCleanGroupNameFromShift() {
 +        $this->stdout("=== Замена group_name на AdminGroup->name ===\n", \yii\helpers\Console::FG_CYAN);
 +        $this->stdout("Дата запуска: " . date('Y-m-d H:i:s') . "\n\n");
 +
 +        // Выборка записей с заполненным employee_position_id
 +        $admins = Admin::find()
 +            ->where(['IS NOT', 'employee_position_id', null])
 +            ->andWhere(['!=', 'employee_position_id', 0])
 +            ->all();
 +
 +        $totalCount = count($admins);
 +        $this->stdout("Найдено записей для обработки: {$totalCount}\n\n", \yii\helpers\Console::FG_YELLOW);
 +
 +        if ($totalCount === 0) {
 +            $this->stdout("Нет записей для обработки. Завершение работы.\n", \yii\helpers\Console::FG_GREEN);
 +            return;
 +        }
 +
 +        // Оптимизация: собираем все уникальные group_id и загружаем одним запросом
 +        $groupIds = [];
 +        foreach ($admins as $admin) {
 +            if ($admin->group_id && !in_array($admin->group_id, $groupIds)) {
 +                $groupIds[] = $admin->group_id;
 +            }
 +        }
 +
 +        // Загружаем все нужные группы одним запросом
 +        $adminGroups = AdminGroup::find()
 +            ->where(['id' => $groupIds])
 +            ->indexBy('id')
 +            ->all();
 +
 +        $this->stdout("Загружено групп для обработки: " . count($adminGroups) . "\n\n", \yii\helpers\Console::FG_CYAN);
 +
 +        $processedCount = 0;
 +        $skippedCount = 0;
 +        $updatedCount = 0;
 +        $errors = [];
 +
 +        foreach ($admins as $admin) {
 +            $processedCount++;
 +            $this->stdout("--- Обработка записи {$processedCount}/{$totalCount} ---\n", \yii\helpers\Console::FG_CYAN);
 +            $this->stdout("ID: {$admin->id}\n");
 +            $this->stdout("Имя: {$admin->name}\n");
 +            $this->stdout("Текущий group_name: '{$admin->group_name}'\n");
 +            $this->stdout("group_id: {$admin->group_id}\n");
 +
 +            // Получаем группу администратора из словаря
 +            $adminGroup = $adminGroups[$admin->group_id] ?? null;
-             
++
 +            if (!$adminGroup) {
 +                $errorMsg = "Группа с ID {$admin->group_id} не найдена";
 +                $this->stdout("⚠ ОШИБКА: {$errorMsg}\n", \yii\helpers\Console::FG_RED);
 +                $errors[] = [
 +                    'admin_id' => $admin->id,
 +                    'admin_name' => $admin->name,
 +                    'error' => $errorMsg
 +                ];
 +                $this->stdout("\n");
 +                continue;
 +            }
 +
 +            $groupName = trim($adminGroup->name);
 +            $currentGroupName = trim($admin->group_name);
 +
 +            $this->stdout("Название группы (AdminGroup->name): '{$groupName}'\n");
 +
 +            // Если значения одинаковые - пропускаем
 +            if ($currentGroupName === $groupName) {
 +                $this->stdout("✓ Значения идентичны, пропускаем\n", \yii\helpers\Console::FG_GREEN);
 +                $skippedCount++;
 +                $this->stdout("\n");
 +                continue;
 +            }
 +
 +            // Заменяем group_name на AdminGroup->name
 +            $oldValue = $admin->group_name;
 +            $admin->group_name = $groupName;
++
 +            if ($admin->save(false)) {
 +                $this->stdout("✓ УСПЕШНО ОБНОВЛЕНО:\n", \yii\helpers\Console::FG_GREEN);
 +                $this->stdout("  Было: '{$oldValue}'\n");
 +                $this->stdout("  Стало: '{$groupName}'\n");
 +                $updatedCount++;
 +            } else {
 +                $errorMsg = "Ошибка при сохранении: " . implode(', ', $admin->getFirstErrors());
 +                $this->stdout("✗ ОШИБКА СОХРАНЕНИЯ: {$errorMsg}\n", \yii\helpers\Console::FG_RED);
 +                $errors[] = [
 +                    'admin_id' => $admin->id,
 +                    'admin_name' => $admin->name,
 +                    'old_value' => $oldValue,
 +                    'new_value' => $groupName,
 +                    'error' => $errorMsg
 +                ];
 +            }
 +
 +            $this->stdout("\n");
 +        }
 +
 +        // Итоговая статистика
 +        $this->stdout("\n=== ИТОГОВАЯ СТАТИСТИКА ===\n", \yii\helpers\Console::FG_CYAN);
 +        $this->stdout("Всего обработано: {$processedCount}\n");
 +        $this->stdout("Обновлено: {$updatedCount}\n", \yii\helpers\Console::FG_GREEN);
 +        $this->stdout("Пропущено: {$skippedCount}\n", \yii\helpers\Console::FG_YELLOW);
 +        $this->stdout("Ошибок: " . count($errors) . "\n", \yii\helpers\Console::FG_RED);
 +
 +        if (!empty($errors)) {
 +            $this->stdout("\n=== СПИСОК ОШИБОК ===\n", \yii\helpers\Console::FG_RED);
 +            foreach ($errors as $error) {
 +                $this->stdout("ID: {$error['admin_id']}, Имя: {$error['admin_name']}\n");
 +                $this->stdout("Ошибка: {$error['error']}\n");
 +                if (isset($error['old_value'])) {
 +                    $this->stdout("Было: '{$error['old_value']}'\n");
 +                    $this->stdout("Должно было стать: '{$error['new_value']}'\n");
 +                }
 +                $this->stdout("\n");
 +            }
 +        }
 +
 +        $this->stdout("\n=== Завершение работы ===\n", \yii\helpers\Console::FG_CYAN);
 +        $this->stdout("Дата завершения: " . date('Y-m-d H:i:s') . "\n");
 +    }
++
+     /**
+      * Миграция записей 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()) {
+                     $updated++;
+                     $processedAdmins[$adminId] = $payment->id;
+                     echo "Обновлена запись ID {$payment->id} для сотрудника {$adminId}: дата установлена {$targetDate}\n";
+                 } else {
+                     echo "Ошибка сохранения {$payment->id} для сотрудника {$adminId}";
+                 }
+             } else {
+                 // Если уже есть запись для этого сотрудника, удаляем дубликат
+                 if ($payment->delete()) {
+                     $deleted++;
+                     echo "Удалена дублирующая запись ID {$payment->id} для сотрудника {$adminId}\n";
+                 }
+             }
+         }
+         echo "\nМиграция завершена:\n";
+         echo "Обновлено записей: {$updated}\n";
+         echo "Удалено дубликатов: {$deleted}\n";
+     }
  }