SMARTER DONE

This commit is contained in:
annajwasz 2025-03-16 23:39:23 +07:00
parent ab188f7a12
commit 3ed205998d
9 changed files with 294 additions and 102 deletions

View File

@ -117,15 +117,15 @@ public function form(Form $form): Form
Section::make('Upload Berkas Bukti Bantuan Pemerintah')
->schema([
FileUpload::make('berkas_1')
->label('Berkas Bukti 1')
->label('Berkas Bukti 1 (Opsional)')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->required(),
->acceptedFileTypes(['application/pdf']),
FileUpload::make('berkas_2')
->label('Berkas Bukti 2 (Opsional)')

View File

@ -32,11 +32,16 @@ public static function form(Form $form): Form
return $form
->schema([
TextInput::make('nama')
->required(),//kolom wajib diisi
->required()
->label('Nama Kriteria'),
TextInput::make('prioritas')
->required(),
->numeric()
->required()
->label('Prioritas (Urutan)')
->helperText('Masukkan angka prioritas (1 untuk prioritas tertinggi)'),
TextInput::make('bobot')
->required(),
->disabled()
->helperText('Bobot akan dihitung otomatis menggunakan metode SMARTER'),
]);
}
@ -45,14 +50,19 @@ public static function table(Table $table): Table
return $table
->columns([
TextColumn::make('nama')
->searchable(),
TextColumn::make('prioritas'),
TextColumn::make('bobot'),
])
->filters([
//
->label('Nama Kriteria')
->searchable()
->sortable(),
TextColumn::make('prioritas')
->label('Prioritas')
->sortable(),
TextColumn::make('bobot')
->label('Bobot')
->formatStateUsing(fn ($state) => number_format($state, 4))
->sortable(),
])
->defaultSort('prioritas')
->filters([])
->actions([
Tables\Actions\EditAction::make(),
])

View File

@ -120,7 +120,7 @@ public static function form(Form $form): Form
->default('Cukup Mampu'),
FileUpload::make('berkas_1')
->label('Berkas Bukti 1')
->label('Berkas Bukti 1(Opsional)')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
@ -128,7 +128,6 @@ public static function form(Form $form): Form
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->required()
->disabled(fn ($context) => $context === 'view'),
FileUpload::make('berkas_2')
@ -282,7 +281,7 @@ public static function table(Table $table): Table
'Sangat Kurang Mampu' => 'success',
'Kurang Mampu' => 'warning',
'Cukup Mampu' => 'danger',
default => 'gray',
'Tidak Menerima Bantuan' => 'gray',
}),
Tables\Columns\TextColumn::make('status_orang_tua')
@ -349,6 +348,7 @@ public static function table(Table $table): Table
'Sangat Kurang Mampu' => 'Sangat Kurang Mampu',
'Kurang Mampu' => 'Kurang Mampu',
'Cukup Mampu' => 'Cukup Mampu',
'Tidak Menerima Bantuan' => 'Tidak Menerima Bantuan',
]),
Tables\Filters\SelectFilter::make('status_orang_tua')
@ -604,8 +604,10 @@ protected function mutateFormDataBeforeCreate(array $data): array
$data['kondisi_ekonomi'] = 'Sangat Kurang Mampu';
} elseif ($berkasCount >= 2) {
$data['kondisi_ekonomi'] = 'Kurang Mampu';
} else {
} elseif ($berkasCount >= 1) {
$data['kondisi_ekonomi'] = 'Cukup Mampu';
} else {
$data['kondisi_ekonomi'] = 'Tidak Menerima Bantuan';
}
return $data;
@ -632,8 +634,10 @@ protected function mutateFormDataBeforeSave(array $data): array
$data['kondisi_ekonomi'] = 'Sangat Kurang Mampu';
} elseif ($berkasCount >= 2) {
$data['kondisi_ekonomi'] = 'Kurang Mampu';
} else {
} elseif ($berkasCount >= 1) {
$data['kondisi_ekonomi'] = 'Cukup Mampu';
} else {
$data['kondisi_ekonomi'] = 'Tidak Menerima Bantuan';
}
return $data;

View File

@ -52,10 +52,12 @@ public static function form(Form $form): Form
->required(),
TextInput::make('prioritas')
->numeric()
->required(),
->required()
->label('Prioritas (Urutan)')
->helperText('Masukkan angka prioritas (1 untuk prioritas tertinggi)'),
TextInput::make('bobot')
->numeric()
->required(),
->disabled()
->helperText('Bobot akan dihitung otomatis menggunakan metode SMARTER'),
]);
}
@ -75,10 +77,14 @@ public static function table(Table $table): Table
->sortable()
->searchable(),
TextColumn::make('prioritas')
->label('Prioritas')
->sortable(),
TextColumn::make('bobot')
->label('Bobot')
->formatStateUsing(fn ($state) => number_format($state, 4))
->sortable(),
])
->defaultSort('kriteria_id', 'prioritas')
->filters([
//
])

View File

@ -4,15 +4,81 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Facades\DB;
class kriteria extends Model
class Kriteria extends Model
{
use HasFactory;
protected $guarded = [];
// protected $fillable = [
// 'nama',
// 'prioritas',
// 'bobot'
// ];
protected $fillable = [
'nama',
'prioritas',
'bobot'
];
public function subKriteria(): HasMany
{
return $this->hasMany(SubKriteria::class);
}
protected static function boot()
{
parent::boot();
// Tambahkan event saving untuk mengatur bobot awal
static::saving(function ($kriteria) {
if (is_null($kriteria->bobot)) {
$kriteria->bobot = 0;
}
});
static::saved(function ($kriteria) {
// Hitung ulang bobot untuk semua kriteria
$allKriteria = static::orderBy('prioritas')->get();
$totalKriteria = $allKriteria->count();
DB::beginTransaction();
try {
foreach ($allKriteria as $k) {
$bobot = static::hitungBobot($k->prioritas, $totalKriteria);
DB::table('kriterias')
->where('id', $k->id)
->update(['bobot' => $bobot]);
// Update bobot subkriteria yang terkait
$subkriterias = SubKriteria::where('kriteria_id', $k->id)
->orderBy('prioritas')
->get();
if ($subkriterias->count() > 0) {
foreach ($subkriterias as $sub) {
$totalSub = $subkriterias->count();
$subBobot = SubKriteria::hitungBobot($sub->prioritas, $totalSub, $bobot);
DB::table('subkriterias')
->where('id', $sub->id)
->update(['bobot' => $subBobot]);
}
}
}
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
});
}
// Helper function untuk menghitung bobot
public static function hitungBobot($prioritas, $total)
{
$bobot = 0;
for ($i = $prioritas; $i <= $total; $i++) {
$bobot += (1 / $i);
}
return $bobot / $total;
}
}

View File

@ -38,6 +38,11 @@ class parameter extends Model
'bukti_wafat_ibu',
'status',
'alasan_tidak_valid',
'kondisi_ekonomi',
'nilai_kondisi_ekonomi',
'status_orang_tua',
'nilai_status_orang_tua',
'total_nilai'
];
public function getBerkasKipUrlAttribute()
@ -79,76 +84,92 @@ public function mahasiswa(): BelongsTo
{
return $this->belongsTo(Mahasiswa::class);
}
protected static function boot()
{
parent::boot();
static::saving(function ($parameter) {
// Tentukan status orang tua berdasarkan status ayah dan ibu
if ($parameter->status_ayah === 'Wafat' && $parameter->status_ibu === 'Wafat') {
$parameter->status_orang_tua = 'Kedua Orang Tua Wafat';
$parameter->nilai_status_orang_tua = 0.35;
} elseif ($parameter->status_ayah === 'Wafat' || $parameter->status_ibu === 'Wafat') {
$parameter->status_orang_tua = 'Salah Satu Orang Tua Wafat';
$parameter->nilai_status_orang_tua = 0.25;
} else {
$parameter->status_orang_tua = 'Kedua Orang Tua Masih Hidup';
$parameter->nilai_status_orang_tua = 0.15;
}
// Hitung jumlah berkas yang diupload
$berkasCount = 0;
if (!empty($parameter->berkas_1)) $berkasCount++;
if (!empty($parameter->berkas_2)) $berkasCount++;
if (!empty($parameter->berkas_3)) $berkasCount++;
// Tentukan kondisi ekonomi dan nilai berdasarkan jumlah berkas
if ($berkasCount >= 3) {
$parameter->kondisi_ekonomi = 'Sangat Kurang Mampu';
$parameter->nilai_kondisi_ekonomi = 0.4;
} elseif ($berkasCount >= 2) {
$parameter->kondisi_ekonomi = 'Kurang Mampu';
$parameter->nilai_kondisi_ekonomi = 0.3;
} else {
$parameter->kondisi_ekonomi = 'Cukup Mampu';
$parameter->nilai_kondisi_ekonomi = 0.3;
}
// Hitung total nilai
// Ambil semua kriteria dan urutkan berdasarkan prioritas
$kriterias = Kriteria::orderBy('prioritas')->get();
$totalNilai = 0;
// Nilai dari Kepemilikan KIP
if ($parameter->kepemilikan_kip === 'Memiliki KIP') {
$totalNilai += 0.6;
} else {
$totalNilai += 0.4;
foreach ($kriterias as $kriteria) {
switch ($kriteria->nama) {
case 'Kepemilikan KIP':
// Ambil SubKriteria berdasarkan kepemilikan KIP
$subKriteria = SubKriteria::where('kriteria_id', $kriteria->id)
->where('nama', $parameter->kepemilikan_kip)
->first();
if ($subKriteria) {
$totalNilai += $subKriteria->bobot;
}
break;
case 'Tingkatan Desil':
// Ambil SubKriteria berdasarkan tingkatan desil
$subKriteria = SubKriteria::where('kriteria_id', $kriteria->id)
->where('nama', $parameter->tingkatan_desil)
->first();
if ($subKriteria) {
$totalNilai += $subKriteria->bobot;
}
break;
case 'Kondisi Ekonomi':
// Hitung jumlah berkas yang diupload
$berkasCount = 0;
if (!empty($parameter->berkas_1)) $berkasCount++;
if (!empty($parameter->berkas_2)) $berkasCount++;
if (!empty($parameter->berkas_3)) $berkasCount++;
// Tentukan kondisi ekonomi berdasarkan jumlah berkas
if ($berkasCount === 0) {
$kondisiEkonomi = 'Tidak Menerima Bantuan';
} elseif ($berkasCount >= 3) {
$kondisiEkonomi = 'Sangat Kurang Mampu';
} elseif ($berkasCount === 2) {
$kondisiEkonomi = 'Kurang Mampu';
} else {
$kondisiEkonomi = 'Cukup Mampu';
}
// Set kondisi ekonomi
$parameter->kondisi_ekonomi = $kondisiEkonomi;
// Ambil SubKriteria berdasarkan kondisi ekonomi
$subKriteria = SubKriteria::where('kriteria_id', $kriteria->id)
->where('nama', $kondisiEkonomi)
->first();
if ($subKriteria) {
$totalNilai += $subKriteria->bobot;
}
break;
case 'Status Orang Tua':
// Tentukan status orang tua
if ($parameter->status_ayah === 'Wafat' && $parameter->status_ibu === 'Wafat') {
$statusOrangTua = 'Kedua Orang Tua Wafat';
} elseif ($parameter->status_ayah === 'Wafat' || $parameter->status_ibu === 'Wafat') {
$statusOrangTua = 'Salah Satu Orang Tua Wafat';
} else {
$statusOrangTua = 'Kedua Orang Tua Masih Hidup';
}
// Set status orang tua
$parameter->status_orang_tua = $statusOrangTua;
// Ambil SubKriteria berdasarkan status orang tua
$subKriteria = SubKriteria::where('kriteria_id', $kriteria->id)
->where('nama', $statusOrangTua)
->first();
if ($subKriteria) {
$totalNilai += $subKriteria->bobot;
}
break;
}
}
// Nilai dari Tingkatan Desil
switch ($parameter->tingkatan_desil) {
case 'Desil 1':
$totalNilai += 0.35;
break;
case 'Desil 2':
$totalNilai += 0.25;
break;
case 'Desil 3':
$totalNilai += 0.20;
break;
case 'Desil 4':
$totalNilai += 0.15;
break;
case 'Desil 5':
$totalNilai += 0.05;
break;
}
// Tambahkan nilai kondisi ekonomi
$totalNilai += $parameter->nilai_kondisi_ekonomi;
// Tambahkan nilai status orang tua
$totalNilai += $parameter->nilai_status_orang_tua;
$parameter->total_nilai = $totalNilai;
});
}

View File

@ -4,6 +4,8 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\DB;
class SubKriteria extends Model
{
@ -12,18 +14,64 @@ class SubKriteria extends Model
protected $table = 'subkriterias'; //soalnya buatnya manual
protected $guarded = [];
// protected $table = 'subkriterias';
protected $fillable = [
'kriteria_id',
'nama',
'deskripsi',
'prioritas',
'bobot'
];
// protected $fillable = [
// 'kriteria_id',
// 'nama',
// 'deskripsi',
// 'prioritas',
// 'bobot'
// ];
public function kriteria()
public function kriteria(): BelongsTo
{
return $this->belongsTo(Kriteria::class, 'kriteria_id');
return $this->belongsTo(Kriteria::class);
}
protected static function boot()
{
parent::boot();
// Tambahkan event saving untuk mengatur bobot awal
static::saving(function ($subKriteria) {
if (is_null($subKriteria->bobot)) {
$subKriteria->bobot = 0;
}
});
static::saved(function ($subKriteria) {
// Hitung ulang bobot untuk semua subkriteria dalam kriteria yang sama
$kriteria = Kriteria::find($subKriteria->kriteria_id);
if (!$kriteria) return;
$allSubKriteria = static::where('kriteria_id', $subKriteria->kriteria_id)
->orderBy('prioritas')
->get();
$totalSubKriteria = $allSubKriteria->count();
DB::beginTransaction();
try {
foreach ($allSubKriteria as $sk) {
$subBobot = static::hitungBobot($sk->prioritas, $totalSubKriteria, $kriteria->bobot);
DB::table('subkriterias')
->where('id', $sk->id)
->update(['bobot' => $subBobot]);
}
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
});
}
// Helper function untuk menghitung bobot
public static function hitungBobot($prioritas, $total, $bobotKriteria)
{
$bobot = 0;
for ($i = $prioritas; $i <= $total; $i++) {
$bobot += (1 / $i);
}
return ($bobot / $total) * $bobotKriteria;
}
}

View File

@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('parameters', function (Blueprint $table) {
$table->enum('kondisi_ekonomi', [
'Sangat Kurang Mampu',
'Kurang Mampu',
'Cukup Mampu',
'Tidak Menerima Bantuan'
])->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('parameters', function (Blueprint $table) {
$table->enum('kondisi_ekonomi', [
'Sangat Kurang Mampu',
'Kurang Mampu',
'Cukup Mampu'
])->change();
});
}
};

View File

@ -71,14 +71,14 @@ public function run(): void
[
'kriteria_id' => 3,
'nama' => 'Sangat Kurang Mampu',
'deskripsi' => 'Penghasilan dibawah UMR',
'deskripsi' => 'Memiliki lebih dari 2 bantuan pemerintah',
'prioritas' => 1,
'bobot' => 0.4,
],
[
'kriteria_id' => 3,
'nama' => 'Kurang Mampu',
'deskripsi' => 'Penghasilan setara UMR',
'deskripsi' => 'Memiliki 2 bantuan pemerintah',
'prioritas' => 2,
'bobot' => 0.3,
],