MIF_E31222658/app/Models/PengajuanUkt.php

181 lines
4.2 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
class PengajuanUkt extends Model
{
use HasFactory;
protected $table = 'pengajuan_ukts';
protected $primaryKey = 'id';
protected $attributes = [
'status_validasi' => 'menunggu'
];
protected $casts = [
'status_validasi' => 'string',
];
protected $fillable = [
'mahasiswa_id',
'jenis_pengajuan',
'status_validasi',
'alasan_penolakan',
'status_form_id',
'ukt_saat_ini',
'file_ukt',
'file_ukt_valid',
'file_ukt_alasan',
'alasan_pengajuan'
];
protected $appends = ['status', 'semester'];
// Event untuk handle penghapusan
protected static function booted()
{
static::deleting(function ($pengajuan) {
// Hapus semua relasi terlebih dahulu
$pengajuan->hasilPenilaian()->delete();
$pengajuan->details()->delete();
$pengajuan->dokumen()->delete();
// Hapus file-file terkait jika ada
foreach ($pengajuan->details as $detail) {
if ($detail->file_dokumen && Storage::exists('public/'.$detail->file_dokumen)) {
Storage::delete('public/'.$detail->file_dokumen);
}
}
// Hapus notifikasi terkait pengajuan ini
if ($pengajuan->mahasiswa && $pengajuan->mahasiswa->user) {
$pengajuan->mahasiswa->user->notifications()
->where('data->pengajuan_id', $pengajuan->id)
->delete();
}
});
}
public function getStatusAttribute()
{
return $this->attributes['status_validasi'] ?? 'menunggu';
}
public function setStatusAttribute($value)
{
$this->attributes['status_validasi'] = $value;
}
public function mahasiswa()
{
return $this->belongsTo(Mahasiswa::class, 'mahasiswa_id', 'user_id');
}
public function hasilPenilaian()
{
return $this->hasOne(HasilPenilaian::class, 'pengajuan_id');
}
public function details()
{
return $this->hasMany(PengajuanDetail::class, 'pengajuan_ukt_id');
}
public function validator()
{
return $this->belongsTo(User::class, 'validator_id');
}
public function dokumen()
{
return $this->hasMany(PengajuanDetail::class, 'pengajuan_ukt_id');
}
public function form()
{
return $this->belongsTo(Form::class, 'status_form_id');
}
public function isDibuka()
{
return $this->form->status === 'Dibuka';
}
public function isDitutup()
{
return optional($this->form)->status === 'Ditutup';
}
public function isPenurunan()
{
return $this->jenis_pengajuan === 'penurunan';
}
public function isPengangsuran()
{
return $this->jenis_pengajuan === 'pengangsuran';
}
public function isMenunggu()
{
return $this->getStatusAttribute() === 'menunggu';
}
public function isValid()
{
return $this->getStatusAttribute() === 'valid';
}
public function isTidakValid()
{
return $this->getStatusAttribute() === 'tidak valid';
}
public function scopeMenunggu($query)
{
return $query->where('status_validasi', 'menunggu');
}
public function scopeValid($query)
{
return $query->where('status_validasi', 'valid');
}
public function scopeTidakValid($query)
{
return $query->where('status_validasi', 'tidak valid');
}
public function scopePenurunan($query)
{
return $query->where('jenis_pengajuan', 'penurunan');
}
public function scopePengangsuran($query)
{
return $query->where('jenis_pengajuan', 'pengangsuran');
}
public function getSemesterAttribute()
{
return optional($this->form)->semester;
}
public function setUktSaatIniAttribute($value)
{
$this->attributes['ukt_saat_ini'] = (int) str_replace('.', '', $value);
}
public function getUktFormattedAttribute()
{
return number_format($this->ukt_saat_ini, 0, ',', '.');
}
}