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";
+ }
}