Files
expense/app/Console/Commands/AutoRejectExpense.php
T
root 1c1418f3e0
Deploy to VPS (PAT over HTTPS) / deploy (push) Has been cancelled
Initial commit - expense
2026-06-01 15:01:03 +07:00

97 lines
3.6 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use App\Models\FormUpCountry;
use App\Models\FormVehicleRunningCost;
use App\Models\FormEntertaimentPresentation;
use App\Models\FormMeetingSeminar;
use App\Models\FormOthers;
use App\Helpers\AuditTrailHelper;
class AutoRejectExpense extends Command
{
/**
* Nama perintah yang akan dijalankan di terminal/cron
*/
protected $signature = 'expense:auto-reject';
/**
* Deskripsi perintah
*/
protected $description = 'Otomatis reject expense yang melewati batas waktu final approve (Tgl 13)';
public function handle()
{
$now = Carbon::now();
$closingDay = (int) env('CLOSING_DATE', 13);
$startDay = (int) env('STARTING_DATE', 11);
// Hanya jalankan eksekusi reject pada H+1 dari Closing Day (Misal: Tanggal 14 jam 00:01)
if ($now->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());
}
}
}