diff --git a/app/Filament/Pages/WizardForm.php b/app/Filament/Pages/WizardForm.php index 42e4ac42..74eaae52 100644 --- a/app/Filament/Pages/WizardForm.php +++ b/app/Filament/Pages/WizardForm.php @@ -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)') diff --git a/app/Filament/Resources/KriteriaResource.php b/app/Filament/Resources/KriteriaResource.php index 4881d7a8..f68d2889 100644 --- a/app/Filament/Resources/KriteriaResource.php +++ b/app/Filament/Resources/KriteriaResource.php @@ -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(), ]) diff --git a/app/Filament/Resources/ParameterResource.php b/app/Filament/Resources/ParameterResource.php index 36613e16..cb2fb524 100644 --- a/app/Filament/Resources/ParameterResource.php +++ b/app/Filament/Resources/ParameterResource.php @@ -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; diff --git a/app/Filament/Resources/SubKriteriaResource.php b/app/Filament/Resources/SubKriteriaResource.php index 74daafb8..16df3975 100644 --- a/app/Filament/Resources/SubKriteriaResource.php +++ b/app/Filament/Resources/SubKriteriaResource.php @@ -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([ // ]) diff --git a/app/Models/kriteria.php b/app/Models/kriteria.php index 60666992..c5d573a2 100644 --- a/app/Models/kriteria.php +++ b/app/Models/kriteria.php @@ -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; + } } diff --git a/app/Models/parameter.php b/app/Models/parameter.php index 727ee4d4..a1e9c57d 100644 --- a/app/Models/parameter.php +++ b/app/Models/parameter.php @@ -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; }); } diff --git a/app/Models/subkriteria.php b/app/Models/subkriteria.php index f7068101..d996761b 100644 --- a/app/Models/subkriteria.php +++ b/app/Models/subkriteria.php @@ -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; } } \ No newline at end of file diff --git a/database/migrations/2025_03_16_212442_update_kondisi_ekonomi_on_parameters.php b/database/migrations/2025_03_16_212442_update_kondisi_ekonomi_on_parameters.php new file mode 100644 index 00000000..76d759f9 --- /dev/null +++ b/database/migrations/2025_03_16_212442_update_kondisi_ekonomi_on_parameters.php @@ -0,0 +1,37 @@ +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(); + }); + } +}; diff --git a/database/seeders/SubKriteriaSeeder.php b/database/seeders/SubKriteriaSeeder.php index 785bfe2e..8a180644 100644 --- a/database/seeders/SubKriteriaSeeder.php +++ b/database/seeders/SubKriteriaSeeder.php @@ -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, ],