day !== ($closingDay + 1)) { $this->info("Hari ini bukan jadwal auto-reject. Jadwal berikutnya: Tanggal " . ($closingDay + 1)); return; } // Batas maksimal tanggal expense yang harus direject adalah H-1 dari Start Day (Misal: Tanggal 10 bulan ini) // Karena tanggal 11 sudah masuk ke periode bulan depannya. $batasTanggalPeriodeLalu = Carbon::create($now->year, $now->month, $startDay)->subDay()->endOfDay(); $models = [ FormUpCountry::class, FormVehicleRunningCost::class, FormEntertaimentPresentation::class, FormMeetingSeminar::class, FormOthers::class ]; // Daftar status yang dianggap menggantung / belum selesai $pendingStatuses = ['On Progress', 'Approved 1', 'Approved 2', 'Waiting Approval', 'Validated']; $totalRejected = 0; DB::beginTransaction(); try { foreach ($models as $model) { // Tentukan kolom tanggal yang digunakan $dateColumn = ($model === FormMeetingSeminar::class) ? 'created_at' : 'tanggal'; // Ambil semua data yang masih menggantung dari periode lalu $pendingExpenses = $model::whereIn('status', $pendingStatuses) ->where($dateColumn, '<=', $batasTanggalPeriodeLalu) ->get(); foreach ($pendingExpenses as $expense) { // Update status dan berikan alasan penolakan sesuai instruksi core business $expense->update([ 'status' => 'Rejected', 'remarks' => 'auto reject by system - lewat periode cut off', 'rejected_at' => Carbon::now(), 'rejected_by' => 0 // Diisi 0 sebagai flag penanda sistem otomatis ]); // Tambahkan ke Audit Trail $noExpense = $expense->expense_number ?? 'Unknown'; AuditTrailHelper::AddAuditTrail('System Update', "Auto Reject by System for Expense ({$noExpense})"); $totalRejected++; } } DB::commit(); $msg = "Auto Reject berhasil dijalankan. Total direject: {$totalRejected} dokumen."; $this->info($msg); Log::info($msg); } catch (\Exception $e) { DB::rollBack(); $this->error("Gagal menjalankan Auto Reject: " . $e->getMessage()); Log::error("Cron Auto Reject Failed: " . $e->getMessage()); } } }