use yii\helpers\ArrayHelper;
use yii_app\records\Admin;
use yii_app\records\AdminStores;
+use yii_app\records\EmployeePayment;
use yii_app\records\ExportImportTable;
class AdminController extends Controller {
}
}
}
+
+ /**
+ * Миграция записей 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(false)) {
+ $updated++;
+ $processedAdmins[$adminId] = $payment->id;
+ echo "Обновлена запись ID {$payment->id} для сотрудника {$adminId}: дата установлена {$targetDate}\n";
+ }
+ } else {
+ // Если уже есть запись для этого сотрудника, удаляем дубликат
+ if ($payment->delete()) {
+ $deleted++;
+ echo "Удалена дублирующая запись ID {$payment->id} для сотрудника {$adminId}\n";
+ }
+ }
+ }
+
+ echo "\nМиграция завершена:\n";
+ echo "Обновлено записей: {$updated}\n";
+ echo "Удалено дубликатов: {$deleted}\n";
+ }
}
\ No newline at end of file
}
/**
- * Создает запись EmployeePayment для сотрудника на основе его должности
+ * Создает или обновляет запись EmployeePayment для сотрудника на основе его должности
+ * Дата устанавливается первым числом текущего месяца
+ * Если запись за этот месяц уже существует, она обновляется
*
* @param int $adminId ID сотрудника
* @param int|null $creatorId ID пользователя, создающего запись
- * @param string|null $date Дата записи (по умолчанию текущая дата)
- * @return EmployeePayment|null Созданная запись или null в случае ошибки
+ * @param string|null $date Дата записи (по умолчанию первое число текущего месяца)
+ * @return EmployeePayment|null СозданнаÑ\8f или обновленнаÑ\8f запиÑ\81Ñ\8c или null в Ñ\81лÑ\83Ñ\87ае оÑ\88ибки
*/
public function createPaymentFromPosition($adminId, $creatorId = null, $date = null): ?EmployeePayment
{
return null;
}
+ // Если дата не указана, используем первое число текущего месяца
if ($date === null) {
- $date = date('Y-m-d');
+ $date = date('Y-m-01');
+ } else {
+ // Если дата указана, приводим её к первому числу месяца
+ $date = date('Y-m-01', strtotime($date));
}
$admin = Admin::findOne($adminId);
return null;
}
- // Проверяем, нет ли уже записи на эту дату
+ // Проверяем, есть ли уже запись за этот месяц и год
+ $year = date('Y', strtotime($date));
+ $month = date('m', strtotime($date));
+
$existingPayment = EmployeePayment::find()
- ->where(['admin_id' => $adminId, 'date' => $date])
+ ->where(['admin_id' => $adminId])
+ ->andWhere(['EXTRACT(YEAR FROM date)' => $year])
+ ->andWhere(['EXTRACT(MONTH FROM date)' => $month])
->one();
if ($existingPayment) {
+ // Обновляем существующую запись
+ $existingPayment->admin_group_id = $admin->group_id;
+ $existingPayment->employee_position_id = $position->id;
+ $existingPayment->monthly_salary = $position->monthly_salary;
+ $existingPayment->daily_payment = $position->daily_payment;
+ $existingPayment->date = $date;
+ $existingPayment->creator_id = $creatorId;
+
+ if ($existingPayment->save()) {
+ return $existingPayment;
+ }
return null;
}
+ // Создаем новую запись
$payment = new EmployeePayment();
$payment->admin_id = $adminId;
$payment->admin_group_id = $admin->group_id;
/**
* Синхронизирует оклады для всех сотрудников с указанной должностью
* Используется при изменении оклада должности
+ * Дата устанавливается первым числом текущего месяца
+ * Если запись за этот месяц уже существует, она обновляется
*
* @param int $positionId ID должности
* @param int|null $creatorId ID пользователя, изменившего оклад
- * @return array ['success' => bool, 'message' => string, 'created' => int]
+ * @return array ['success' => bool, 'message' => string, 'created' => int, 'updated' => int]
*/
public function syncEmployeesByPosition($positionId, $creatorId = null): array
{
return [
'success' => false,
'message' => 'Не указан ID пользователя для создания записей',
- 'created' => 0
+ 'created' => 0,
+ 'updated' => 0
];
}
return [
'success' => false,
'message' => 'Должность не найдена или оклады не заполнены',
- 'created' => 0
+ 'created' => 0,
+ 'updated' => 0
];
}
$created = 0;
- $date = date('Y-m-d');
+ $updated = 0;
+ $date = date('Y-m-01'); // Первое число текущего месяца
+ $year = date('Y');
+ $month = date('m');
// Получаем всех сотрудников с этой должностью, не уволенных
$admins = Admin::find()
->all();
foreach ($admins as $admin) {
- // Ð\9fÑ\80овеÑ\80Ñ\8fем, неÑ\82 ли Ñ\83же запиÑ\81и на Ñ\8dÑ\82Ñ\83 даÑ\82Ñ\83
+ // Ð\9fÑ\80овеÑ\80Ñ\8fем, еÑ\81Ñ\82Ñ\8c ли Ñ\83же запиÑ\81Ñ\8c за Ñ\8dÑ\82оÑ\82 меÑ\81Ñ\8fÑ\86 и год
$existingPayment = EmployeePayment::find()
- ->where(['admin_id' => $admin->id, 'date' => $date])
+ ->where(['admin_id' => $admin->id])
+ ->andWhere(['EXTRACT(YEAR FROM date)' => $year])
+ ->andWhere(['EXTRACT(MONTH FROM date)' => $month])
->one();
if ($existingPayment) {
- continue;
- }
-
- // Создаем новую запись
- $payment = new EmployeePayment();
- $payment->admin_id = $admin->id;
- $payment->admin_group_id = $admin->group_id;
- $payment->employee_position_id = $position->id;
- $payment->monthly_salary = $position->monthly_salary;
- $payment->daily_payment = $position->daily_payment;
- $payment->date = $date;
- $payment->creator_id = $creatorId;
-
- if ($payment->save()) {
- $created++;
+ // Обновляем существующую запись
+ $existingPayment->admin_group_id = $admin->group_id;
+ $existingPayment->employee_position_id = $position->id;
+ $existingPayment->monthly_salary = $position->monthly_salary;
+ $existingPayment->daily_payment = $position->daily_payment;
+ $existingPayment->date = $date;
+ $existingPayment->creator_id = $creatorId;
+
+ if ($existingPayment->save()) {
+ $updated++;
+ }
+ } else {
+ // Создаем новую запись
+ $payment = new EmployeePayment();
+ $payment->admin_id = $admin->id;
+ $payment->admin_group_id = $admin->group_id;
+ $payment->employee_position_id = $position->id;
+ $payment->monthly_salary = $position->monthly_salary;
+ $payment->daily_payment = $position->daily_payment;
+ $payment->date = $date;
+ $payment->creator_id = $creatorId;
+
+ if ($payment->save()) {
+ $created++;
+ }
}
}
+ $message = "Синхронизация завершена. Создано записей: {$created}, обновлено: {$updated}";
return [
'success' => true,
- 'message' => "Синхронизация завершена. Создано записей: {$created}",
- 'created' => $created
+ 'message' => $message,
+ 'created' => $created,
+ 'updated' => $updated
];
}
}