argument('period') ?? Carbon::now()->format('Y-m'); $periodMonthFormatted = Carbon::parse($periodMonth)->translatedFormat('F Y'); $users = User::with('profile')->get(); $count = 0; try { DB::transaction(function () use ($users, $periodMonth, &$count) { foreach ($users as $user) { $exists = Payroll::where('user_id', $user->id) ->where('period_month', $periodMonth) ->exists(); if (! $exists) { $baseSalary = $user->profile?->base_salary ?? 0; Payroll::create([ 'user_id' => $user->id, 'period_month' => $periodMonth, 'base_salary' => $baseSalary, 'bonus' => 0, 'deduction' => 0, 'total_salary' => $baseSalary, 'is_paid' => false, ]); $count++; } } }); } catch (Throwable $e) { Log::error('Payroll generate failed', [ 'error' => $e->getMessage(), ]); $this->info('Gagal generate data penggajian, silakan hubungi pengembang.'); return; } $this->info("$count data penggajian berhasil digenerate untuk periode $periodMonthFormatted."); } }