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') Section::make('Upload Berkas Bukti Bantuan Pemerintah')
->schema([ ->schema([
FileUpload::make('berkas_1') FileUpload::make('berkas_1')
->label('Berkas Bukti 1') ->label('Berkas Bukti 1 (Opsional)')
->disk('berkas') ->disk('berkas')
->directory('ekonomi') ->directory('ekonomi')
->visibility('public') ->visibility('public')
->preserveFilenames() ->preserveFilenames()
->downloadable() ->downloadable()
->openable() ->openable()
->acceptedFileTypes(['application/pdf']) ->acceptedFileTypes(['application/pdf']),
->required(),
FileUpload::make('berkas_2') FileUpload::make('berkas_2')
->label('Berkas Bukti 2 (Opsional)') ->label('Berkas Bukti 2 (Opsional)')

View File

@ -32,11 +32,16 @@ public static function form(Form $form): Form
return $form return $form
->schema([ ->schema([
TextInput::make('nama') TextInput::make('nama')
->required(),//kolom wajib diisi ->required()
->label('Nama Kriteria'),
TextInput::make('prioritas') TextInput::make('prioritas')
->required(), ->numeric()
->required()
->label('Prioritas (Urutan)')
->helperText('Masukkan angka prioritas (1 untuk prioritas tertinggi)'),
TextInput::make('bobot') 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 return $table
->columns([ ->columns([
TextColumn::make('nama') TextColumn::make('nama')
->searchable(), ->label('Nama Kriteria')
TextColumn::make('prioritas'), ->searchable()
TextColumn::make('bobot'), ->sortable(),
TextColumn::make('prioritas')
]) ->label('Prioritas')
->filters([ ->sortable(),
// TextColumn::make('bobot')
->label('Bobot')
->formatStateUsing(fn ($state) => number_format($state, 4))
->sortable(),
]) ])
->defaultSort('prioritas')
->filters([])
->actions([ ->actions([
Tables\Actions\EditAction::make(), Tables\Actions\EditAction::make(),
]) ])

View File

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

View File

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

View File

@ -4,15 +4,81 @@
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; 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; use HasFactory;
protected $guarded = []; protected $fillable = [
// protected $fillable = [ 'nama',
// 'nama', 'prioritas',
// 'prioritas', 'bobot'
// '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', 'bukti_wafat_ibu',
'status', 'status',
'alasan_tidak_valid', 'alasan_tidak_valid',
'kondisi_ekonomi',
'nilai_kondisi_ekonomi',
'status_orang_tua',
'nilai_status_orang_tua',
'total_nilai'
]; ];
public function getBerkasKipUrlAttribute() public function getBerkasKipUrlAttribute()
@ -79,76 +84,92 @@ public function mahasiswa(): BelongsTo
{ {
return $this->belongsTo(Mahasiswa::class); return $this->belongsTo(Mahasiswa::class);
} }
protected static function boot() protected static function boot()
{ {
parent::boot(); parent::boot();
static::saving(function ($parameter) { static::saving(function ($parameter) {
// Tentukan status orang tua berdasarkan status ayah dan ibu // Ambil semua kriteria dan urutkan berdasarkan prioritas
if ($parameter->status_ayah === 'Wafat' && $parameter->status_ibu === 'Wafat') { $kriterias = Kriteria::orderBy('prioritas')->get();
$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
$totalNilai = 0; $totalNilai = 0;
// Nilai dari Kepemilikan KIP foreach ($kriterias as $kriteria) {
if ($parameter->kepemilikan_kip === 'Memiliki KIP') { switch ($kriteria->nama) {
$totalNilai += 0.6; case 'Kepemilikan KIP':
} else { // Ambil SubKriteria berdasarkan kepemilikan KIP
$totalNilai += 0.4; $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; $parameter->total_nilai = $totalNilai;
}); });
} }

View File

@ -4,6 +4,8 @@
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\DB;
class SubKriteria extends Model class SubKriteria extends Model
{ {
@ -12,18 +14,64 @@ class SubKriteria extends Model
protected $table = 'subkriterias'; //soalnya buatnya manual protected $table = 'subkriterias'; //soalnya buatnya manual
protected $guarded = []; protected $guarded = [];
// protected $table = 'subkriterias'; protected $fillable = [
'kriteria_id',
// protected $fillable = [ 'nama',
// 'kriteria_id', 'deskripsi',
// 'nama', 'prioritas',
// 'deskripsi', 'bobot'
// '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, 'kriteria_id' => 3,
'nama' => 'Sangat Kurang Mampu', 'nama' => 'Sangat Kurang Mampu',
'deskripsi' => 'Penghasilan dibawah UMR', 'deskripsi' => 'Memiliki lebih dari 2 bantuan pemerintah',
'prioritas' => 1, 'prioritas' => 1,
'bobot' => 0.4, 'bobot' => 0.4,
], ],
[ [
'kriteria_id' => 3, 'kriteria_id' => 3,
'nama' => 'Kurang Mampu', 'nama' => 'Kurang Mampu',
'deskripsi' => 'Penghasilan setara UMR', 'deskripsi' => 'Memiliki 2 bantuan pemerintah',
'prioritas' => 2, 'prioritas' => 2,
'bobot' => 0.3, 'bobot' => 0.3,
], ],