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() { $this->status = 'dikembalikan'; $this->tanggal_kembali = Carbon::today(); $this->save(); } 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()); } } }); } }