TKK_E32230908/app/Models/BorrowTransaction.php

241 lines
5.7 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
use Illuminate\Support\Facades\Mail;
use App\Mail\PeminjamanMenungguApproval;
class BorrowTransaction extends Model
{
use HasFactory;
protected $table = 'borrow_transactions';
protected $fillable = [
'anggota_id',
'koleksi_id',
'tanggal_pinjam',
'pickup_date',
'pickup_time',
'tanggal_kembali',
'status',
'surat_pengantar',
'tanggal_perpanjangan',
'alasan_perpanjangan',
'perpanjangan_diajukan',
'perpanjangan_disetujui',
];
public $timestamps = true;
public function anggota()
{
return $this->belongsTo(\App\Models\Anggota::class, 'anggota_id');
}
public function koleksi()
{
return $this->belongsTo(\App\Models\Koleksi::class, 'koleksi_id', 'biblio_id');
}
public function scopeMenunggu($query)
{
return $query->where('status', 'menunggu');
}
public function scopeDisetujui($query)
{
return $query->where('status', 'disetujui');
}
public function scopeDipinjam($query)
{
return $query->where('status', 'dipinjam');
}
public function scopeDikembalikan($query)
{
return $query->where('status', 'dikembalikan');
}
public function scopeDitolak($query)
{
return $query->where('status', 'ditolak');
}
public function scopePengembalianMenunggu($query)
{
return $query->where('status', 'pengembalian_menunggu');
}
public function scopePerpanjanganMenunggu($query)
{
return $query->where('status', 'perpanjangan_menunggu');
}
public static function sudahDipinjam($koleksiId)
{
return self::where('koleksi_id', $koleksiId)
->whereIn('status', ['dipinjam', 'menunggu', 'disetujui'])
->exists();
}
public function markAsDisetujui($pickupDate = null)
{
$this->status = 'disetujui';
$this->pickup_date = $pickupDate ? Carbon::parse($pickupDate) : Carbon::today();
$this->save();
}
public function markAsDipinjam()
{
$this->status = 'dipinjam';
$this->tanggal_pinjam = Carbon::today();
$this->save();
}
public function markAsDitolak()
{
$this->status = 'ditolak';
$this->save();
}
public function markAsDikembalikan()
{
// Menggunakan update langsung ke database berdasarkan ID target
$this->where('id', $this->id)->update([
'status' => 'dikembalikan',
'tanggal_kembali' => \Carbon\Carbon::today()
]);
// Sinkronisasi data object yang sedang aktif di memory
$this->status = 'dikembalikan';
$this->tanggal_kembali = \Carbon\Carbon::today();
}
public function markAsPengembalianMenunggu()
{
$this->status = 'pengembalian_menunggu';
$this->tanggal_kembali = null;
$this->save();
}
public function ajukanPerpanjangan($tanggalBaru, $alasan)
{
if ($this->perpanjangan_diajukan) {
throw new \Exception('Anda sudah pernah mengajukan perpanjangan untuk buku ini.');
}
$this->tanggal_perpanjangan = Carbon::parse($tanggalBaru);
$this->alasan_perpanjangan = $alasan;
$this->status = 'perpanjangan_menunggu';
$this->perpanjangan_diajukan = true;
$this->perpanjangan_disetujui = null;
$this->save();
}
public function setujuiPerpanjangan()
{
$this->tanggal_kembali = $this->tanggal_perpanjangan;
$this->status = 'dipinjam';
$this->perpanjangan_disetujui = true;
$this->save();
}
public function tolakPerpanjangan()
{
$this->status = 'dipinjam';
$this->perpanjangan_disetujui = false;
$this->save();
}
public function getIsBorrowedAttribute()
{
return $this->status === 'dipinjam';
}
public function getIsApprovedAttribute()
{
return $this->status === 'disetujui';
}
public function getIsReturnPendingAttribute()
{
return $this->status === 'pengembalian_menunggu';
}
public function getIsExtensionPendingAttribute()
{
return $this->status === 'perpanjangan_menunggu';
}
public function getIsExtensionApprovedAttribute()
{
return $this->perpanjangan_disetujui === true;
}
public function getIsExtensionRejectedAttribute()
{
return $this->perpanjangan_disetujui === false;
}
public function canBeExtended()
{
return $this->status === 'dipinjam' && !$this->perpanjangan_diajukan;
}
public function canBeReturnedByUser()
{
return $this->status === 'dipinjam';
}
public function canBeRated()
{
return $this->status === 'dikembalikan';
}
public function isLate()
{
if (!$this->tanggal_kembali) return false;
return Carbon::now()->greaterThan(Carbon::parse($this->tanggal_kembali));
}
public function getLateDays()
{
if (!$this->isLate()) return 0;
return Carbon::parse($this->tanggal_kembali)->diffInDays(Carbon::now());
}
public static function boot()
{
parent::boot();
static::created(function ($transaction) {
if (env('MAIL_USERNAME')) {
try {
Mail::to(config('mail.from.address'))
->send(new PeminjamanMenungguApproval($transaction));
} catch (\Exception $e) {
\Log::error('Gagal mengirim email peminjaman ke admin: ' . $e->getMessage());
}
}
});
}
}