}
/**
- * Ð\9eÑ\87иÑ\81Ñ\82ка group_name оÑ\82 подÑ\81Ñ\82Ñ\80ок "ноÑ\87Ñ\8c" и "денÑ\8c" длÑ\8f записей с заполненным employee_position_id
+ * Ð\97амена group_name на AdminGroup->name длÑ\8f вÑ\81еÑ\85 записей с заполненным employee_position_id
*
* Команда выполняет:
- * 1. Выборку Admin записей с заполненным employee_position_id и наличием "ночь"/"день" в group_name
- * 2. Сравнение group_name с AdminGroup->name
- * 3. Очистку group_name от "ночь"/"день" при необходимости
- *
- * Примеры работы:
- * - "Старший флорист ночь" + группа "Старший флорист" → "Старший флорист"
- * - "Администратор день" + группа "Администратор" → "Администратор"
- * - "Новичок ночь" + группа "Помощник флориста" → "Новичок"
+ * 1. Выборку Admin записей с заполненным employee_position_id
+ * 2. Замену group_name на AdminGroup->name для каждой записи
*/
public function actionCleanGroupNameFromShift() {
- $this->stdout("=== Ð\9dаÑ\87ало оÑ\87иÑ\81Ñ\82ки group_name оÑ\82 подÑ\81Ñ\82Ñ\80ок 'ноÑ\87Ñ\8c' и 'денÑ\8c' ===\n", \yii\helpers\Console::FG_CYAN);
+ $this->stdout("=== Ð\97амена group_name на AdminGroup->name ===\n", \yii\helpers\Console::FG_CYAN);
$this->stdout("Дата запуска: " . date('Y-m-d H:i:s') . "\n\n");
- // Выборка записей с заполненным employee_position_id и наличием "ночь" или "день" в group_name
+ // Выборка записей с заполненным employee_position_id
$admins = Admin::find()
->where(['IS NOT', 'employee_position_id', null])
->andWhere(['!=', 'employee_position_id', 0])
- ->andWhere([
- 'OR',
- ['ILIKE', 'group_name', 'ночь'],
- ['ILIKE', 'group_name', 'день']
- ])
->all();
$totalCount = count($admins);
return;
}
- // Оптимизация: собираем все уникальные group_id и employee_position_id и загружаем одним запросом
+ // Оптимизация: собираем все уникальные group_id и загружаем одним запросом
$groupIds = [];
- $positionIds = [];
foreach ($admins as $admin) {
if ($admin->group_id && !in_array($admin->group_id, $groupIds)) {
$groupIds[] = $admin->group_id;
}
- if ($admin->employee_position_id && !in_array($admin->employee_position_id, $positionIds)) {
- $positionIds[] = $admin->employee_position_id;
- }
}
// Загружаем все нужные группы одним запросом
->indexBy('id')
->all();
- // Загружаем все нужные должности одним запросом
- $employeePositions = EmployeePosition::find()
- ->where(['id' => $positionIds])
- ->indexBy('id')
- ->all();
-
- $this->stdout("Загружено групп для обработки: " . count($adminGroups) . "\n", \yii\helpers\Console::FG_CYAN);
- $this->stdout("Загружено должностей для обработки: " . count($employeePositions) . "\n\n", \yii\helpers\Console::FG_CYAN);
+ $this->stdout("Загружено групп для обработки: " . count($adminGroups) . "\n\n", \yii\helpers\Console::FG_CYAN);
$processedCount = 0;
$skippedCount = 0;
$updatedCount = 0;
$errors = [];
- foreach ($admins as $index => $admin) {
+ 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");
- $this->stdout("employee_position_id: {$admin->employee_position_id}\n");
// Получаем группу администратора из словаря
$adminGroup = $adminGroups[$admin->group_id] ?? null;
continue;
}
- $groupName = $adminGroup->name;
- $this->stdout("Название группы (AdminGroup->name): '{$groupName}'\n");
-
- // Сравниваем group_name и AdminGroup->name
+ $groupName = trim($adminGroup->name);
$currentGroupName = trim($admin->group_name);
- $targetGroupName = trim($groupName);
+
+ $this->stdout("Название группы (AdminGroup->name): '{$groupName}'\n");
// Если значения одинаковые - пропускаем
- if ($currentGroupName === $targetGroupName) {
+ if ($currentGroupName === $groupName) {
$this->stdout("✓ Значения идентичны, пропускаем\n", \yii\helpers\Console::FG_GREEN);
$skippedCount++;
$this->stdout("\n");
continue;
}
- // Определяем, есть ли в текущем group_name подстроки "ночь" или "день"
- $hasNight = mb_stripos($currentGroupName, 'ночь') !== false;
- $hasDay = mb_stripos($currentGroupName, 'день') !== false;
-
- if (!$hasNight && !$hasDay) {
- $this->stdout("⚠ В group_name нет подстрок 'ночь' или 'день', но значения различаются\n", \yii\helpers\Console::FG_YELLOW);
- $this->stdout("Текущее: '{$currentGroupName}'\n");
- $this->stdout("Ожидаемое: '{$targetGroupName}'\n");
- $skippedCount++;
- $this->stdout("\n");
- continue;
- }
-
- // Убираем "ночь" или "день" с пробелом (в любом месте строки)
- $cleanedName = $currentGroupName;
+ // Заменяем group_name на AdminGroup->name
+ $oldValue = $admin->group_name;
+ $admin->group_name = $groupName;
- // Убираем " ночь" или " ночь" (с пробелом до и/или после)
- $cleanedName = preg_replace('/\s*ночь\s*/iu', ' ', $cleanedName);
-
- // Убираем " день" или " день" (с пробелом до и/или после)
- $cleanedName = preg_replace('/\s*день\s*/iu', ' ', $cleanedName);
-
- // Убираем лишние пробелы и обрезаем
- $cleanedName = trim(preg_replace('/\s+/', ' ', $cleanedName));
-
- $this->stdout("Очищенное group_name: '{$cleanedName}'\n");
-
- // Проверяем, совпадает ли очищенное имя с названием группы
- if ($cleanedName === $targetGroupName) {
- // Если совпадает - используем название группы
- $newGroupName = $targetGroupName;
- $this->stdout("✓ Очищенное имя совпадает с названием группы\n", \yii\helpers\Console::FG_GREEN);
+ if ($admin->save(false)) {
+ $this->stdout("✓ УСПЕШНО ОБНОВЛЕНО:\n", \yii\helpers\Console::FG_GREEN);
+ $this->stdout(" Было: '{$oldValue}'\n");
+ $this->stdout(" Стало: '{$groupName}'\n");
+ $updatedCount++;
} else {
- // Если полное несовпадение - проверяем название грейда по employee_position_id
- $employeePosition = $employeePositions[$admin->employee_position_id] ?? null;
-
- if ($employeePosition) {
- $positionName = trim($employeePosition->name);
- $this->stdout("Название грейда (EmployeePosition->name): '{$positionName}'\n");
-
- // Сравниваем EmployeePosition->name с AdminGroup->name
- if ($positionName === $targetGroupName) {
- // Если совпадают - ставим AdminGroup->name
- $newGroupName = $targetGroupName;
- $this->stdout("✓ Название грейда совпадает с названием группы, используем группу\n", \yii\helpers\Console::FG_GREEN);
- } else {
- // Если не совпадают - ставим EmployeePosition->name (название грейда)
- $newGroupName = $positionName;
- $this->stdout("⚠ Название грейда не совпадает с группой, используем название грейда\n", \yii\helpers\Console::FG_YELLOW);
- }
- } else {
- // Если должность не найдена - оставляем очищенное имя
- $newGroupName = $cleanedName;
- $this->stdout("⚠ Должность не найдена, оставляем очищенное имя\n", \yii\helpers\Console::FG_YELLOW);
- }
- }
-
- // Сохраняем изменения только если значение изменилось
- if ($newGroupName !== $currentGroupName) {
- $oldValue = $admin->group_name;
- $admin->group_name = $newGroupName;
-
- if ($admin->save(false)) {
- $this->stdout("✓ УСПЕШНО ОБНОВЛЕНО:\n", \yii\helpers\Console::FG_GREEN);
- $this->stdout(" Было: '{$oldValue}'\n");
- $this->stdout(" Стало: '{$newGroupName}'\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' => $newGroupName,
- 'error' => $errorMsg
- ];
- }
- } else {
- $this->stdout("⚠ Значение не изменилось, пропускаем\n", \yii\helpers\Console::FG_YELLOW);
- $skippedCount++;
+ $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");