SMARTER DONE
This commit is contained in:
parent
ab188f7a12
commit
3ed205998d
|
@ -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)')
|
||||
|
|
|
@ -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(),
|
||||
])
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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([
|
||||
//
|
||||
])
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,75 +84,91 @@ 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;
|
||||
}
|
||||
// Ambil semua kriteria dan urutkan berdasarkan prioritas
|
||||
$kriterias = Kriteria::orderBy('prioritas')->get();
|
||||
$totalNilai = 0;
|
||||
|
||||
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 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;
|
||||
// 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 {
|
||||
$parameter->kondisi_ekonomi = 'Cukup Mampu';
|
||||
$parameter->nilai_kondisi_ekonomi = 0.3;
|
||||
$kondisiEkonomi = 'Cukup Mampu';
|
||||
}
|
||||
|
||||
// Hitung total nilai
|
||||
$totalNilai = 0;
|
||||
// Set kondisi ekonomi
|
||||
$parameter->kondisi_ekonomi = $kondisiEkonomi;
|
||||
|
||||
// Nilai dari Kepemilikan KIP
|
||||
if ($parameter->kepemilikan_kip === 'Memiliki KIP') {
|
||||
$totalNilai += 0.6;
|
||||
// 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 {
|
||||
$totalNilai += 0.4;
|
||||
$statusOrangTua = 'Kedua Orang Tua Masih Hidup';
|
||||
}
|
||||
|
||||
// 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;
|
||||
// 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;
|
||||
}
|
||||
|
||||
// Tambahkan nilai kondisi ekonomi
|
||||
$totalNilai += $parameter->nilai_kondisi_ekonomi;
|
||||
|
||||
// Tambahkan nilai status orang tua
|
||||
$totalNilai += $parameter->nilai_status_orang_tua;
|
||||
}
|
||||
|
||||
$parameter->total_nilai = $totalNilai;
|
||||
});
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
};
|
|
@ -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,
|
||||
],
|
||||
|
|
Loading…
Reference in New Issue