->orderBy(['admin_id' => SORT_ASC, 'date' => SORT_ASC])
->all();
- echo "Найдено записей: " . count($payments) . "\n";
+ echo "Найдено записей с employee_position_id: " . count($payments) . "\n";
$updated = 0;
$deleted = 0;
+ $merged = 0;
$processedAdmins = [];
foreach ($payments as $payment) {
// Если это первая запись для этого сотрудника за ноябрь
if (!isset($processedAdmins[$adminId])) {
- // Обновляем дату на первое число месяца
- $payment->date = $targetDate;
- if ($payment->save()) {
- $updated++;
- $processedAdmins[$adminId] = $payment->id;
- echo "Обновлена запись ID {$payment->id} для сотрудника {$adminId}: дата установлена {$targetDate}\n";
+ // Проверяем, есть ли уже запись на целевую дату (без employee_position_id)
+ $existingPayment = EmployeePayment::find()
+ ->where(['admin_id' => $adminId, 'date' => $targetDate])
+ ->andWhere(['employee_position_id' => null])
+ ->one();
+
+ if ($existingPayment) {
+ // Проверяем, совпадают ли оклады - можно слить
+ $sameSalary = $existingPayment->monthly_salary == $payment->monthly_salary
+ && $existingPayment->daily_payment == $payment->daily_payment;
+
+ if ($sameSalary) {
+ // Оклады совпадают - обновляем существующую запись, добавляя employee_position_id
+ $existingPayment->employee_position_id = $payment->employee_position_id;
+ if ($existingPayment->save()) {
+ echo "Слияние: запись ID {$existingPayment->id} обновлена employee_position_id из ID {$payment->id}\n";
+ $merged++;
+ }
+ // Удаляем дубликат с другой датой
+ $payment->delete();
+ $deleted++;
+ $processedAdmins[$adminId] = $existingPayment->id;
+ } else {
+ // Оклады разные - удаляем старую запись без должности, используем новую
+ echo "Оклады разные у {$adminId}: старая ({$existingPayment->monthly_salary}/{$existingPayment->daily_payment}) vs новая ({$payment->monthly_salary}/{$payment->daily_payment})\n";
+ $existingPayment->delete();
+ $deleted++;
+ // Теперь можем сохранить с новой датой
+ $payment->date = $targetDate;
+ if ($payment->save()) {
+ $updated++;
+ $processedAdmins[$adminId] = $payment->id;
+ echo "Обновлена запись ID {$payment->id} для сотрудника {$adminId}\n";
+ }
+ }
} else {
- echo "Ошибка сохранения {$payment->id} для сотрудника {$adminId}";
+ // Нет конфликтующей записи - просто обновляем дату
+ $payment->date = $targetDate;
+ if ($payment->save()) {
+ $updated++;
+ $processedAdmins[$adminId] = $payment->id;
+ echo "Обновлена запись ID {$payment->id} для сотрудника {$adminId}: дата установлена {$targetDate}\n";
+ } else {
+ echo "Ошибка сохранения {$payment->id} для сотрудника {$adminId}: " . implode(', ', $payment->getFirstErrors()) . "\n";
+ }
}
} else {
// Если уже есть запись для этого сотрудника, удаляем дубликат
echo "\nМиграция завершена:\n";
echo "Обновлено записей: {$updated}\n";
+ echo "Слито записей: {$merged}\n";
echo "Удалено дубликатов: {$deleted}\n";
}
}
\ No newline at end of file