argument('period') ?? Carbon::now()->format('Y-m'); $periodMonthFormatted = Carbon::parse($periodMonth)->translatedFormat('F Y'); $users = User::with('profile') ->whereDoesntHave('roles', function ($query) { $query->whereIn('name', ['Owner', 'Developer']); }) ->get(); $count = 0; try { DB::transaction(function () use ($users, $periodMonth, &$count) { $previousMonth = Carbon::parse($periodMonth)->subMonth()->format('Y-m'); Payroll::where('period_month', $previousMonth) ->where('is_paid', false) ->update([ 'is_paid' => true, 'paid_at' => Carbon::now(), ]); 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) { LogHelper::logException($e, 'Payroll generate failed', [ 'period' => $periodMonth, ]); $this->error('Terjadi kesalahan, silakan hubungi pengembang'); return; } $this->info("$count data penggajian berhasil digenerate untuk periode $periodMonthFormatted."); } }