MIF_E31220412/app/Models/Sewa.php

105 lines
2.5 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Sewa extends Model
{
use HasFactory, SoftDeletes;
protected $fillable = [
'user_id',
'paket_id',
'kota_id',
'ongkir',
'tanggal_mulai',
'tanggal_selesai',
'lokasi',
'catatan',
'total_harga',
'status',
'bukti_pembayaran',
'tanggal_pembayaran',
'jenis_jaminan',
'foto_jaminan',
'nominal_pembayaran'
];
protected $casts = [
'tanggal_mulai' => 'datetime',
'tanggal_selesai' => 'datetime',
'tanggal_pembayaran' => 'datetime',
];
protected $dates = [
'tanggal_mulai',
'tanggal_selesai',
'tanggal_pembayaran',
'deleted_at'
];
// Relasi dengan User
public function user()
{
return $this->belongsTo(User::class);
}
// Relasi dengan Paket
public function paket()
{
return $this->belongsTo(Paket::class);
}
// Relasi dengan PaketOngkirKota
public function kota()
{
return $this->belongsTo(PaketOngkirKota::class, 'kota_id');
}
public function chats()
{
return $this->hasMany(Chat::class);
}
// Accessor untuk status yang lebih mudah dibaca
public function getStatusLabelAttribute()
{
return match($this->status) {
'pending' => 'Menunggu Konfirmasi',
'disetujui' => 'Disetujui',
'ditolak' => 'Ditolak',
'selesai' => 'Selesai',
'dibatalkan' => 'Dibatalkan',
default => ucfirst($this->status)
};
}
// Accessor untuk total durasi sewa dalam hari
public function getDurasiSewaAttribute()
{
return $this->tanggal_mulai->diffInDays($this->tanggal_selesai) + 1;
}
// Scope untuk mencari sewa berdasarkan status
public function scopeStatus($query, $status)
{
return $query->where('status', $status);
}
// Scope untuk sewa yang aktif
public function scopeAktif($query)
{
return $query->whereIn('status', ['disetujui'])
->where('tanggal_selesai', '>=', now());
}
// Scope untuk riwayat sewa
public function scopeRiwayat($query)
{
return $query->whereIn('status', ['selesai', 'dibatalkan', 'ditolak'])
->orWhere('tanggal_selesai', '<', now());
}
}