From d9f69b7f68b4e3d104bba539be5b991865ce953a Mon Sep 17 00:00:00 2001 From: annajwasz Date: Sun, 23 Feb 2025 16:27:25 +0700 Subject: [PATCH] Initial commit --- app/Filament/Resources/ListformResource.php | 223 ++++++++++++++++++ .../ListformResource/Pages/CreateListform.php | 12 + .../ListformResource/Pages/EditListform.php | 19 ++ .../ListformResource/Pages/ListListforms.php | 19 ++ app/Models/listform.php | 87 +++++++ app/Providers/Filament/AdminPanelProvider.php | 1 + ...25_02_22_213634_create_listforms_table.php | 60 +++++ database/seeders/SubKriteriaSeeder.php | 24 +- .../filament/components/file-link.blade.php | 11 + .../views/filament/pages/listform.blade.php | 3 + 10 files changed, 454 insertions(+), 5 deletions(-) create mode 100644 app/Filament/Resources/ListformResource.php create mode 100644 app/Filament/Resources/ListformResource/Pages/CreateListform.php create mode 100644 app/Filament/Resources/ListformResource/Pages/EditListform.php create mode 100644 app/Filament/Resources/ListformResource/Pages/ListListforms.php create mode 100644 app/Models/listform.php create mode 100644 database/migrations/2025_02_22_213634_create_listforms_table.php create mode 100644 resources/views/filament/components/file-link.blade.php create mode 100644 resources/views/filament/pages/listform.blade.php diff --git a/app/Filament/Resources/ListformResource.php b/app/Filament/Resources/ListformResource.php new file mode 100644 index 00000000..07d17179 --- /dev/null +++ b/app/Filament/Resources/ListformResource.php @@ -0,0 +1,223 @@ +schema([ + Section::make('Data Mahasiswa') + ->schema([ + Select::make('mahasiswa_id') + ->relationship('mahasiswa', 'nama') + ->searchable() + ->preload() + ->required() + ->label('Nama Mahasiswa'), + ]), + + Section::make('Kepemilikan KIP') + ->schema([ + Select::make('kepemilikan_kip') + ->options([ + 'Memiliki KIP' => 'Memiliki KIP', + 'Tidak Memiliki KIP' => 'Tidak Memiliki KIP', + ]) + ->required(), + ]), + + Section::make('Tingkatan Desil') + ->schema([ + Select::make('tingkatan_desil') + ->options([ + 'Desil 1' => 'Desil 1', + 'Desil 2' => 'Desil 2', + 'Desil 3' => 'Desil 3', + 'Desil 4' => 'Desil 4', + 'Desil 5' => 'Desil 5', + ]) + ->required(), + ]), + + Section::make('Upload Berkas Pendukung') + ->schema([ + FileUpload::make('berkas_sktm') + ->label('Upload SKTM') + ->helperText('Surat Keterangan Tidak Mampu dari Kelurahan/Desa') + ->directory('berkas-sktm') + ->preserveFilenames() + ->required() + ->acceptedFileTypes(['application/pdf']), + + FileUpload::make('berkas_ppke') + ->label('Upload PPKE') + ->helperText('Pernyataan Penghasilan Keluarga') + ->directory('berkas-ppke') + ->preserveFilenames() + ->acceptedFileTypes(['application/pdf']), + + FileUpload::make('berkas_pmk') + ->label('Upload PMK') + ->helperText('Pernyataan Mahasiswa Kurang Mampu') + ->directory('berkas-pmk') + ->preserveFilenames() + ->acceptedFileTypes(['application/pdf']), + + FileUpload::make('berkas_pkh') + ->label('Upload PKH') + ->helperText('Kartu Program Keluarga Harapan') + ->directory('berkas-pkh') + ->preserveFilenames() + ->acceptedFileTypes(['application/pdf']), + + FileUpload::make('berkas_kks') + ->label('Upload KKS') + ->helperText('Kartu Keluarga Sejahtera') + ->directory('berkas-kks') + ->preserveFilenames() + ->acceptedFileTypes(['application/pdf']), + ]), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('mahasiswa.nama') + ->label('Nama Mahasiswa') + ->searchable() + ->sortable(), + TextColumn::make('kepemilikan_kip') + ->label('Kepemilikan KIP'), + TextColumn::make('tingkatan_desil') + ->label('Tingkatan Desil'), + TextColumn::make('kondisi_ekonomi') + ->label('Kondisi Ekonomi'), + TextColumn::make('total_nilai') + ->label('Total Nilai') + ->sortable(), + TextColumn::make('status') + ->badge() + ->color(fn (string $state): string => match ($state) { + 'submitted' => 'success', + 'draft' => 'warning', + default => 'gray', + }), + ]) + ->defaultSort('total_nilai', 'desc') + ->filters([]) + ->actions([ + ViewAction::make() + ->form([ + Section::make('Data Mahasiswa') + ->schema([ + TextInput::make('mahasiswa_name') + ->label('Nama Mahasiswa') + ->formatStateUsing(fn ($record) => $record->mahasiswa->nama) + ->disabled(), + TextInput::make('kepemilikan_kip') + ->label('Kepemilikan KIP') + ->disabled(), + TextInput::make('tingkatan_desil') + ->label('Tingkatan Desil') + ->disabled(), + TextInput::make('kondisi_ekonomi') + ->label('Kondisi Ekonomi') + ->disabled(), + TextInput::make('total_nilai') + ->label('Total Nilai') + ->disabled(), + ]), + Section::make('Berkas') + ->schema([ + Placeholder::make('berkas_sktm') + ->label('SKTM') + ->content(fn ($record) => $record->berkas_sktm ? + view('filament.components.file-link', [ + 'url' => Storage::url($record->berkas_sktm), + 'label' => 'SKTM' + ]) : + 'Tidak ada berkas' + ), + Placeholder::make('berkas_ppke') + ->label('PPKE') + ->content(fn ($record) => $record->berkas_ppke ? + view('filament.components.file-link', [ + 'url' => Storage::url($record->berkas_ppke), + 'label' => 'PPKE' + ]) : + 'Tidak ada berkas' + ), + Placeholder::make('berkas_pmk') + ->label('PMK') + ->content(fn ($record) => $record->berkas_pmk ? + view('filament.components.file-link', [ + 'url' => Storage::url($record->berkas_pmk), + 'label' => 'PMK' + ]) : + 'Tidak ada berkas' + ), + Placeholder::make('berkas_pkh') + ->label('PKH') + ->content(fn ($record) => $record->berkas_pkh ? + view('filament.components.file-link', [ + 'url' => Storage::url($record->berkas_pkh), + 'label' => 'PKH' + ]) : + 'Tidak ada berkas' + ), + Placeholder::make('berkas_kks') + ->label('KKS') + ->content(fn ($record) => $record->berkas_kks ? + view('filament.components.file-link', [ + 'url' => Storage::url($record->berkas_kks), + 'label' => 'KKS' + ]) : + 'Tidak ada berkas' + ), + ]), + ]), + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListListforms::route('/'), + 'create' => Pages\CreateListform::route('/create'), + 'edit' => Pages\EditListform::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/ListformResource/Pages/CreateListform.php b/app/Filament/Resources/ListformResource/Pages/CreateListform.php new file mode 100644 index 00000000..0f82085f --- /dev/null +++ b/app/Filament/Resources/ListformResource/Pages/CreateListform.php @@ -0,0 +1,12 @@ + 'decimal:7', + 'nilai_tingkatan_desil' => 'decimal:7', + 'nilai_kondisi_ekonomi' => 'decimal:7', + 'total_nilai' => 'decimal:7', + ]; + + public function mahasiswa(): BelongsTo + { + return $this->belongsTo(Mahasiswa::class); + } + + protected static function boot() + { + parent::boot(); + + static::saving(function ($listform) { + // Hitung jumlah berkas yang diupload + $berkasCount = 0; + if (!empty($listform->berkas_sktm)) $berkasCount++; + if (!empty($listform->berkas_ppke)) $berkasCount++; + if (!empty($listform->berkas_pmk)) $berkasCount++; + if (!empty($listform->berkas_pkh)) $berkasCount++; + if (!empty($listform->berkas_kks)) $berkasCount++; + + // Tentukan kondisi ekonomi dan nilai berdasarkan jumlah berkas + if ($berkasCount >= 4) { + $listform->kondisi_ekonomi = 'Sangat Kurang Mampu'; + $listform->nilai_kondisi_ekonomi = 0.4; + } elseif ($berkasCount >= 2) { + $listform->kondisi_ekonomi = 'Kurang Mampu'; + $listform->nilai_kondisi_ekonomi = 0.3; + } else { + $listform->kondisi_ekonomi = 'Cukup Mampu'; + $listform->nilai_kondisi_ekonomi = 0.3; + } + + // Hitung total nilai + $totalNilai = 0; + + // Nilai dari Kepemilikan KIP + if ($listform->kepemilikan_kip === 'Memiliki KIP') { + $totalNilai += 0.6; + } else { + $totalNilai += 0.4; + } + + // Nilai dari Tingkatan Desil + switch ($listform->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 += $listform->nilai_kondisi_ekonomi; + + $listform->total_nilai = $totalNilai; + }); + } +} diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 6694332a..3053f4a4 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -40,6 +40,7 @@ public function panel(Panel $panel): Panel Widgets\AccountWidget::class, Widgets\FilamentInfoWidget::class, ]) + ->spa() ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, diff --git a/database/migrations/2025_02_22_213634_create_listforms_table.php b/database/migrations/2025_02_22_213634_create_listforms_table.php new file mode 100644 index 00000000..686c41b8 --- /dev/null +++ b/database/migrations/2025_02_22_213634_create_listforms_table.php @@ -0,0 +1,60 @@ +id(); + $table->foreignId('mahasiswa_id')->constrained('mahasiswas')->cascadeOnDelete(); + + // Untuk Kriteria 1: Kepemilikan KIP + $table->enum('kepemilikan_kip', ['Memiliki KIP', 'Tidak Memiliki KIP']); + + // Untuk Kriteria 2: Tingkatan Desil + $table->enum('tingkatan_desil', [ + 'Desil 1', + 'Desil 2', + 'Desil 3', + 'Desil 4', + 'Desil 5' + ]); + + // Untuk Kriteria 3: Kondisi Ekonomi + $table->enum('kondisi_ekonomi', ['Sangat Kurang Mampu', 'Kurang Mampu', 'Cukup Mampu']); + + // Berkas untuk Kondisi Ekonomi + $table->string('berkas_sktm')->nullable(); // Untuk semua kondisi + $table->string('berkas_ppke')->nullable(); // Untuk Kurang Mampu & Sangat Kurang Mampu + $table->string('berkas_pmk')->nullable(); // Untuk Kurang Mampu & Sangat Kurang Mampu + $table->string('berkas_pkh')->nullable(); // Khusus Sangat Kurang Mampu + $table->string('berkas_kks')->nullable(); // Khusus Sangat Kurang Mampu + + // Untuk menyimpan nilai perhitungan + $table->decimal('nilai_kepemilikan_kip', 10, 7)->default(0); + $table->decimal('nilai_tingkatan_desil', 10, 7)->default(0); + $table->decimal('nilai_kondisi_ekonomi', 10, 7)->default(0); + $table->decimal('total_nilai', 10, 7)->default(0); + + // Status form + $table->enum('status', ['draft', 'submitted'])->default('draft'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('listforms'); + } +}; diff --git a/database/seeders/SubKriteriaSeeder.php b/database/seeders/SubKriteriaSeeder.php index cfa233f4..785bfe2e 100644 --- a/database/seeders/SubKriteriaSeeder.php +++ b/database/seeders/SubKriteriaSeeder.php @@ -36,21 +36,35 @@ public function run(): void 'nama' => 'Desil 1', 'deskripsi' => 'Tingkat kesejahteraan terendah', 'prioritas' => 1, - 'bobot' => 0.4, + 'bobot' => 0.35, ], [ 'kriteria_id' => 2, 'nama' => 'Desil 2', - 'deskripsi' => 'Tingkat kesejahteraan rendah', + 'deskripsi' => 'Tingkat kesejahteraan sangat rendah', 'prioritas' => 2, - 'bobot' => 0.3, + 'bobot' => 0.25, ], [ 'kriteria_id' => 2, 'nama' => 'Desil 3', - 'deskripsi' => 'Tingkat kesejahteraan menengah bawah', + 'deskripsi' => 'Tingkat kesejahteraan rendah', 'prioritas' => 3, - 'bobot' => 0.3, + 'bobot' => 0.20, + ], + [ + 'kriteria_id' => 2, + 'nama' => 'Desil 4', + 'deskripsi' => 'Tingkat kesejahteraan menengah bawah', + 'prioritas' => 4, + 'bobot' => 0.15, + ], + [ + 'kriteria_id' => 2, + 'nama' => 'Desil 5', + 'deskripsi' => 'Tingkat kesejahteraan menengah', + 'prioritas' => 5, + 'bobot' => 0.05, ], // Subkriteria untuk Kondisi Ekonomi (kriteria_id: 3) diff --git a/resources/views/filament/components/file-link.blade.php b/resources/views/filament/components/file-link.blade.php new file mode 100644 index 00000000..da66e4e2 --- /dev/null +++ b/resources/views/filament/components/file-link.blade.php @@ -0,0 +1,11 @@ +@if($url) +
+ + Lihat {{ $label }} + +
+@else +
+ Tidak ada berkas +
+@endif \ No newline at end of file diff --git a/resources/views/filament/pages/listform.blade.php b/resources/views/filament/pages/listform.blade.php new file mode 100644 index 00000000..cc614779 --- /dev/null +++ b/resources/views/filament/pages/listform.blade.php @@ -0,0 +1,3 @@ + + +