241 lines
5.7 KiB
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());
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|