diff --git a/app/Filament/Resources/HasilResource.php b/app/Filament/Resources/HasilResource.php index 3a386e8b..a822dcc8 100644 --- a/app/Filament/Resources/HasilResource.php +++ b/app/Filament/Resources/HasilResource.php @@ -3,103 +3,135 @@ namespace App\Filament\Resources; use App\Filament\Resources\HasilResource\Pages; -use App\Filament\Resources\HasilResource\RelationManagers; -use App\Models\Hasil; -use Filament\Forms; +use App\Models\Parameter; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Table; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\SoftDeletingScope; -use Filament\Forms\Components\Select; -use Filament\Forms\Components\TextInput; use Filament\Tables\Columns\TextColumn; +use Filament\Forms\Components\TextInput; +use Filament\Notifications\Notification; +use Illuminate\Support\Facades\DB; class HasilResource extends Resource { - protected static ?string $model = Hasil::class; + protected static ?string $model = Parameter::class; + public static $kuota = 0; - protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack'; + protected static ?string $navigationIcon = 'heroicon-o-clipboard-document-check'; protected static ?string $navigationGroup = 'Penilaian'; + protected static ?string $navigationLabel = 'Hasil Penilaian'; protected static ?int $navigationSort = 2; - - public static function form(Form $form): Form - { - return $form - ->schema([ - Select::make('mahasiswa_id') - ->label('Mahasiswa') - ->relationship('mahasiswa', 'nama') - ->searchable() - ->required(), - - TextInput::make('total_bobot') - ->label('Total Bobot') - ->numeric() - ->readOnly(), - - Select::make('status') - ->label('Status') - ->options([ - 'Layak' => 'Layak', - 'Dipertimbangkan' => 'Dipertimbangkan', - 'Tidak Layak' => 'Tidak Layak', - ]) - ->required(), - ]); - } + protected static ?string $slug = 'hasil-penilaian'; + + protected static ?string $modelLabel = 'Hasil Penilaian'; + protected static ?string $pluralModelLabel = 'Hasil Penilaian'; + protected static ?string $breadcrumb = 'Hasil Penilaian'; public static function table(Table $table): Table { return $table - ->columns([ - TextColumn::make('mahasiswa.nama') - ->label('Nama Mahasiswa') - ->sortable() - ->searchable(), - - TextColumn::make('total_bobot') - ->label('Total Bobot') - ->sortable(), - - TextColumn::make('status') - ->label('Status') - ->badge() - ->color(fn ($record) => match ($record->status) { - 'Layak' => 'success', - 'Dipertimbangkan' => 'warning', - 'Tidak Layak' => 'danger', - }), - - - ]) - ->filters([ - // - ]) - ->actions([ - Tables\Actions\EditAction::make(), - ]) - ->bulkActions([ - Tables\Actions\BulkActionGroup::make([ - Tables\Actions\DeleteBulkAction::make(), - ]), - ]); - } + ->headerActions([ + Tables\Actions\Action::make('setKuota') + ->label('Set Kuota Penerimaan') + ->form([ + TextInput::make('kuota') + ->label('Jumlah Kuota') + ->numeric() + ->required() + ->minValue(1) + ->helperText('Masukkan jumlah kuota penerimaan. Hanya mahasiswa dengan nilai tertinggi dan berkas valid yang akan diterima.'), + ]) + ->action(function (array $data): void { + DB::beginTransaction(); + try { + // Reset semua hasil terlebih dahulu + Parameter::query()->update(['hasil' => 'Tidak Layak']); - public static function getRelations(): array - { - return [ - // - ]; + // Ambil semua data parameter yang valid dan urutkan berdasarkan total nilai + $validParameters = Parameter::where('status', 'valid') + ->orderBy('total_nilai', 'desc') + ->get(); + + $kuota = (int) $data['kuota']; + $index = 0; + + foreach ($validParameters as $parameter) { + // Gunakan update langsung ke database untuk memastikan perubahan tersimpan + if ($index < $kuota) { + DB::table('parameters') + ->where('id', $parameter->id) + ->update(['hasil' => 'Layak']); + } elseif ($index < ($kuota + 3)) { + DB::table('parameters') + ->where('id', $parameter->id) + ->update(['hasil' => 'Dipertimbangkan']); + } + $index++; + } + + DB::commit(); + + Notification::make() + ->title("Berhasil mengatur kuota penerimaan untuk {$kuota} mahasiswa") + ->success() + ->send(); + } catch (\Exception $e) { + DB::rollBack(); + Notification::make() + ->title('Terjadi kesalahan: ' . $e->getMessage()) + ->danger() + ->send(); + } + }) + ->requiresConfirmation() + ->modalHeading('Set Kuota Penerimaan') + ->modalDescription('Apakah Anda yakin ingin mengatur kuota penerimaan? Tindakan ini akan mengubah status kelayakan semua mahasiswa.') + ->modalSubmitActionLabel('Ya, Set Kuota') + ->successNotificationTitle('Kuota berhasil diatur'), + ]) + ->modifyQueryUsing(fn ($query) => $query->where('status', 'valid')) + ->columns([ + TextColumn::make('no') + ->label('No.') + ->rowIndex(false) + ->alignCenter(), + + TextColumn::make('mahasiswa.nama') + ->label('Nama Mahasiswa') + ->searchable() + ->sortable(), + + TextColumn::make('total_nilai') + ->label('Total Nilai') + ->formatStateUsing(fn ($state) => number_format($state, 4)) + ->sortable(), + + TextColumn::make('hasil') + ->label('Hasil') + ->badge() + ->color(fn (string $state): string => match ($state) { + 'Layak' => 'success', + 'Dipertimbangkan' => 'warning', + 'Tidak Layak' => 'danger', + default => 'gray', + }), + ]) + ->defaultSort('total_nilai', 'desc') + ->filters([ + Tables\Filters\SelectFilter::make('hasil') + ->options([ + 'Layak' => 'Layak', + 'Dipertimbangkan' => 'Dipertimbangkan', + 'Tidak Layak' => 'Tidak Layak', + ]), + ]); } public static function getPages(): array { return [ - 'index' => Pages\ListHasils::route('/'), - 'create' => Pages\CreateHasil::route('/create'), - 'edit' => Pages\EditHasil::route('/{record}/edit'), + 'index' => Pages\ListHasil::route('/'), ]; } -} +} \ No newline at end of file diff --git a/app/Filament/Resources/HasilResource/Pages/EditHasil.php b/app/Filament/Resources/HasilResource/Pages/EditHasil.php deleted file mode 100644 index d5c31893..00000000 --- a/app/Filament/Resources/HasilResource/Pages/EditHasil.php +++ /dev/null @@ -1,19 +0,0 @@ -belongsTo(mahasiswa::class); - } -} diff --git a/app/Models/parameter.php b/app/Models/parameter.php index a1e9c57d..93924201 100644 --- a/app/Models/parameter.php +++ b/app/Models/parameter.php @@ -42,7 +42,8 @@ class parameter extends Model 'nilai_kondisi_ekonomi', 'status_orang_tua', 'nilai_status_orang_tua', - 'total_nilai' + 'total_nilai', + 'hasil' ]; public function getBerkasKipUrlAttribute() @@ -171,6 +172,15 @@ protected static function boot() } $parameter->total_nilai = $totalNilai; + + // Tentukan hasil berdasarkan total nilai + if ($totalNilai >= 0.75) { + $parameter->hasil = 'Layak'; + } elseif ($totalNilai >= 0.5) { + $parameter->hasil = 'Dipertimbangkan'; + } else { + $parameter->hasil = 'Tidak Layak'; + } }); } } diff --git a/database/migrations/2025_03_05_212139_create_hasils_table.php b/database/migrations/2025_03_05_212139_create_hasils_table.php deleted file mode 100644 index 9ef6a49c..00000000 --- a/database/migrations/2025_03_05_212139_create_hasils_table.php +++ /dev/null @@ -1,30 +0,0 @@ -id(); - $table->foreignId('mahasiswa_id')->constrained('mahasiswas')->onDelete('cascade'); // Relasi ke tabel mahasiswa - $table->decimal('total_bobot', 5, 2); // Skor akhir hasil perhitungan SMARTER - $table->enum('status', ['Layak','Dipertimbangkan', 'Tidak Layak'])->default('Tidak Layak'); // Status keputusan - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('hasils'); - } -}; diff --git a/database/migrations/2025_03_16_214500_add_hasil_column_to_parameters.php b/database/migrations/2025_03_16_214500_add_hasil_column_to_parameters.php new file mode 100644 index 00000000..5933833f --- /dev/null +++ b/database/migrations/2025_03_16_214500_add_hasil_column_to_parameters.php @@ -0,0 +1,30 @@ +enum('hasil', ['Layak', 'Dipertimbangkan', 'Tidak Layak']) + ->after('total_nilai') + ->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('parameters', function (Blueprint $table) { + $table->dropColumn('hasil'); + }); + } +}; \ No newline at end of file diff --git a/database/migrations/2025_03_16_xxxxx_add_hasil_column_to_parameters.php b/database/migrations/2025_03_16_xxxxx_add_hasil_column_to_parameters.php new file mode 100644 index 00000000..e4074a69 --- /dev/null +++ b/database/migrations/2025_03_16_xxxxx_add_hasil_column_to_parameters.php @@ -0,0 +1,22 @@ +enum('hasil', ['Layak', 'Dipertimbangkan', 'Tidak Layak'])->nullable()->after('total_nilai'); + }); + } + + public function down(): void + { + Schema::table('parameters', function (Blueprint $table) { + $table->dropColumn('hasil'); + }); + } +}; \ No newline at end of file