MIF_E31230069/spk_kontrakan/app/Console/Commands/SyncKontrakanStatus.php

83 lines
2.5 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Kontrakan;
use App\Models\Booking;
class SyncKontrakanStatus extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'kontrakan:sync-status
{--all : Sync semua kontrakan, bukan hanya yang perlu update}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Sinkronisasi status kontrakan berdasarkan booking aktif';
/**
* Execute the console command.
*/
public function handle()
{
$this->info('Memulai sinkronisasi status kontrakan...');
$today = now()->toDateString();
$updated = 0;
$checked = 0;
// 1. Reset kontrakan yang occupied_until sudah lewat
$expiredCount = Kontrakan::where('status', 'occupied')
->whereNotNull('occupied_until')
->where('occupied_until', '<', $today)
->update([
'status' => 'available',
'occupied_until' => null,
]);
if ($expiredCount > 0) {
$this->info("- Reset {$expiredCount} kontrakan yang masa sewanya sudah berakhir.");
$updated += $expiredCount;
}
// 2. Cek semua kontrakan dengan booking aktif
if ($this->option('all')) {
$kontrakans = Kontrakan::all();
} else {
// Hanya kontrakan yang punya booking aktif atau statusnya perlu dicek
$kontrakanIds = Booking::select('kontrakan_id')
->distinct()
->whereIn('status', [Booking::STATUS_CONFIRMED, Booking::STATUS_CHECKED_IN])
->pluck('kontrakan_id');
$kontrakans = Kontrakan::whereIn('id', $kontrakanIds)
->orWhereIn('status', ['booked', 'occupied'])
->get();
}
foreach ($kontrakans as $kontrakan) {
$checked++;
$oldStatus = $kontrakan->status;
$kontrakan->syncStatusFromBookings();
if ($kontrakan->status !== $oldStatus) {
$updated++;
$this->line(" [{$kontrakan->id}] {$kontrakan->nama}: {$oldStatus}{$kontrakan->status}");
}
}
$this->info("Selesai! Dicek: {$checked}, Diupdate: {$updated}");
return Command::SUCCESS;
}
}