From: Vladimir Fomichev Date: Mon, 1 Dec 2025 06:42:13 +0000 (+0300) Subject: Merge branch 'refs/heads/develop' into feature_fomichev_erp-492_add_staffing_table_fo... X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=762f55a6cd9a52b158c332436ec19436fa42d6d5;p=erp24_rep%2Fyii-erp24%2F.git Merge branch 'refs/heads/develop' into feature_fomichev_erp-492_add_staffing_table_for_grades # Conflicts: # erp24/commands/AdminController.php --- 762f55a6cd9a52b158c332436ec19436fa42d6d5 diff --cc erp24/commands/AdminController.php index a6c37530,a2b29af3..4a0b5e5d --- a/erp24/commands/AdminController.php +++ b/erp24/commands/AdminController.php @@@ -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 { @@@ -51,133 -50,58 +52,188 @@@ } } + /** + * Замена 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"; + } }