Compare commits

...

No commits in common. "master" and "main" have entirely different histories.
master ... main

102 changed files with 1093 additions and 6166 deletions

View File

@ -1,11 +1,11 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:YOUR_APP_KEY
APP_KEY=
APP_DEBUG=true
APP_TIMEZONE=Asia/Jakarta
APP_URL=http://localhost:8000
APP_TIMEZONE=UTC
APP_URL=http://localhost
APP_LOCALE=id
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
@ -21,12 +21,12 @@ LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
SESSION_DRIVER=database
SESSION_LIFETIME=120

12
.github/workflows/issues.yml vendored Normal file
View File

@ -0,0 +1,12 @@
name: Issues
on:
issues:
types: [labeled]
permissions:
issues: write
jobs:
help-wanted:
uses: laravel/.github/.github/workflows/issues.yml@main

12
.github/workflows/pull-requests.yml vendored Normal file
View File

@ -0,0 +1,12 @@
name: Pull Requests
on:
pull_request_target:
types: [opened]
permissions:
pull-requests: write
jobs:
uneditable:
uses: laravel/.github/.github/workflows/pull-requests.yml@main

47
.github/workflows/tests.yml vendored Normal file
View File

@ -0,0 +1,47 @@
name: Tests
on:
push:
branches:
- master
- '*.x'
pull_request:
schedule:
- cron: '0 0 * * *'
permissions:
contents: read
jobs:
tests:
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
php: [8.2, 8.3, 8.4]
name: PHP ${{ matrix.php }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite
coverage: none
- name: Install Composer dependencies
run: composer install --prefer-dist --no-interaction --no-progress
- name: Copy environment file
run: cp .env.example .env
- name: Generate app key
run: php artisan key:generate
- name: Execute tests
run: vendor/bin/phpunit

13
.github/workflows/update-changelog.yml vendored Normal file
View File

@ -0,0 +1,13 @@
name: Update Changelog
on:
release:
types: [released]
permissions: {}
jobs:
update:
permissions:
contents: write
uses: laravel/.github/.github/workflows/update-changelog.yml@main

9
.styleci.yml Normal file
View File

@ -0,0 +1,9 @@
php:
preset: laravel
disabled:
- no_unused_imports
finder:
not-name:
- index.php
js: true
css: true

124
CHANGELOG.md Normal file
View File

@ -0,0 +1,124 @@
# Release Notes
## [Unreleased](https://github.com/laravel/laravel/compare/v11.6.0...11.x)
## [v11.6.0](https://github.com/laravel/laravel/compare/v11.5.1...v11.6.0) - 2025-01-21
* Preserve X-Xsrf-Token header from .htaccess by [@thecodeholic](https://github.com/thecodeholic) in https://github.com/laravel/laravel/pull/6520
## [v11.5.1](https://github.com/laravel/laravel/compare/v11.5.0...v11.5.1) - 2025-01-10
* Update .gitignore to not ignore auth.json in the lang directory. by [@Tjoosten](https://github.com/Tjoosten) in https://github.com/laravel/laravel/pull/6515
* Adding PHP 8.4 to the tests matrix by [@mathiasgrimm](https://github.com/mathiasgrimm) in https://github.com/laravel/laravel/pull/6516
* fix css whitespace invalid-calc by [@tvarwig](https://github.com/tvarwig) in https://github.com/laravel/laravel/pull/6517
* [11.x] Fix invalid tailwindcss class by [@Jubeki](https://github.com/Jubeki) in https://github.com/laravel/laravel/pull/6518
## [v11.5.0](https://github.com/laravel/laravel/compare/v11.4.0...v11.5.0) - 2024-12-13
* [11.x] Update `config/mail.php` with supported configuration by [@crynobone](https://github.com/crynobone) in https://github.com/laravel/laravel/pull/6506
## [v11.4.0](https://github.com/laravel/laravel/compare/v11.3.3...v11.4.0) - 2024-12-02
* [11.x] Narrow down array types to lists by [@DvDty](https://github.com/DvDty) in https://github.com/laravel/laravel/pull/6497
* Upgrade to Vite 6 by [@timacdonald](https://github.com/timacdonald) in https://github.com/laravel/laravel/pull/6498
## [v11.3.3](https://github.com/laravel/laravel/compare/v11.3.2...v11.3.3) - 2024-11-18
* Inconsistency in Github action names by [@amirbabaeii](https://github.com/amirbabaeii) in https://github.com/laravel/laravel/pull/6478
* Add schema property to enhance autocompletion for composer.json by [@octoper](https://github.com/octoper) in https://github.com/laravel/laravel/pull/6484
* Update .gitignore by [@EmranMR](https://github.com/EmranMR) in https://github.com/laravel/laravel/pull/6486
* [11.x] Bump framework version by [@PerryvanderMeer](https://github.com/PerryvanderMeer) in https://github.com/laravel/laravel/pull/6490
* [11.x] match `HidesAttributes` docblocks by [@browner12](https://github.com/browner12) in https://github.com/laravel/laravel/pull/6495
## [v11.3.2](https://github.com/laravel/laravel/compare/v11.3.1...v11.3.2) - 2024-10-21
* Fixes pail timing out after an hour by [@nunomaduro](https://github.com/nunomaduro) in https://github.com/laravel/laravel/pull/6473
## [v11.3.1](https://github.com/laravel/laravel/compare/v11.3.0...v11.3.1) - 2024-10-15
**Full Changelog**: https://github.com/laravel/laravel/compare/v11.3.0...v11.3.1
## [v11.3.0](https://github.com/laravel/laravel/compare/v11.2.1...v11.3.0) - 2024-10-14
* Add Tailwind, "composer run dev" by [@taylorotwell](https://github.com/taylorotwell) in https://github.com/laravel/laravel/pull/6463
## [v11.2.1](https://github.com/laravel/laravel/compare/v11.2.0...v11.2.1) - 2024-10-08
* [11.x] Collision Version Upgrade by [@amdad121](https://github.com/amdad121) in https://github.com/laravel/laravel/pull/6454
* [11.x] factory-generics-in-user-model by [@MrPunyapal](https://github.com/MrPunyapal) in https://github.com/laravel/laravel/pull/6453
* Update welcome.blade.php to add missing alt tag by [@mezotv](https://github.com/mezotv) in https://github.com/laravel/laravel/pull/6462
## [v11.2.0](https://github.com/laravel/laravel/compare/v11.1.5...v11.2.0) - 2024-09-11
* Update .gitignore with Zed Editor by [@fahadkhan1740](https://github.com/fahadkhan1740) in https://github.com/laravel/laravel/pull/6449
* Laracon 2024 feature update by [@taylorotwell](https://github.com/taylorotwell) in https://github.com/laravel/laravel/pull/6450
## [v11.1.5](https://github.com/laravel/laravel/compare/v11.1.4...v11.1.5) - 2024-08-14
* Update axios by [@laserhybiz](https://github.com/laserhybiz) in https://github.com/laravel/laravel/pull/6440
## [v11.1.4](https://github.com/laravel/laravel/compare/v11.1.3...v11.1.4) - 2024-07-16
**Full Changelog**: https://github.com/laravel/laravel/compare/v11.1.3...v11.1.4
## [v11.1.3](https://github.com/laravel/laravel/compare/v11.1.2...v11.1.3) - 2024-07-03
* [11.x] Comment maintenance store by [@timacdonald](https://github.com/timacdonald) in https://github.com/laravel/laravel/pull/6429
## [v11.1.2](https://github.com/laravel/laravel/compare/v11.1.1...v11.1.2) - 2024-06-20
* Expose lock table name by [@nhedger](https://github.com/nhedger) in https://github.com/laravel/laravel/pull/6423
## [v11.1.1](https://github.com/laravel/laravel/compare/v11.1.0...v11.1.1) - 2024-06-04
* Format the first letter of `drivers` to lowercase by [@maru0914](https://github.com/maru0914) in https://github.com/laravel/laravel/pull/6413
## [v11.1.0](https://github.com/laravel/laravel/compare/v11.0.9...v11.1.0) - 2024-05-28
* [11.x] Removes `--dev` dependencies by [@nunomaduro](https://github.com/nunomaduro) in https://github.com/laravel/laravel/pull/6406
## [v11.0.9](https://github.com/laravel/laravel/compare/v11.0.8...v11.0.9) - 2024-05-16
* Updated SMTP mail config to use a valid EHLO domain by [@rcerljenko](https://github.com/rcerljenko) in https://github.com/laravel/laravel/pull/6402
## [v11.0.8](https://github.com/laravel/laravel/compare/v11.0.7...v11.0.8) - 2024-05-13
* Add .phpactor.json to .gitignore by [@princejohnsantillan](https://github.com/princejohnsantillan) in https://github.com/laravel/laravel/pull/6400
## [v11.0.7](https://github.com/laravel/laravel/compare/v11.0.6...v11.0.7) - 2024-05-03
* Remove obsolete driver option by [@u01jmg3](https://github.com/u01jmg3) in https://github.com/laravel/laravel/pull/6395
## [v11.0.6](https://github.com/laravel/laravel/compare/v11.0.5...v11.0.6) - 2024-04-09
* Fix PHPUnit constraint by [@szepeviktor](https://github.com/szepeviktor) in https://github.com/laravel/laravel/pull/6389
* [11.x] Add missing roundrobin transport driver config by [@u01jmg3](https://github.com/u01jmg3) in https://github.com/laravel/laravel/pull/6392
## [v11.0.5](https://github.com/laravel/laravel/compare/v11.0.4...v11.0.5) - 2024-03-26
* [11.x] Use PHPUnit v11 by [@philbates35](https://github.com/philbates35) in https://github.com/laravel/laravel/pull/6385
## [v11.0.4](https://github.com/laravel/laravel/compare/v11.0.3...v11.0.4) - 2024-03-15
* [11.x] Removed useless null parameter for env helper (cache.php) by [@siarheipashkevich](https://github.com/siarheipashkevich) in https://github.com/laravel/laravel/pull/6374
* [11.x] Removed useless null parameter for env helper (queue.php) by [@siarheipashkevich](https://github.com/siarheipashkevich) in https://github.com/laravel/laravel/pull/6373
* [11.x] Fix retry_after to be an integer by [@driesvints](https://github.com/driesvints) in https://github.com/laravel/laravel/pull/6377
* [11.x] Fix on hover animation and ring by [@michaelnabil230](https://github.com/michaelnabil230) in https://github.com/laravel/laravel/pull/6376
## [v11.0.3](https://github.com/laravel/laravel/compare/v11.0.2...v11.0.3) - 2024-03-14
* [11.x] Revert collation change by [@driesvints](https://github.com/driesvints) in https://github.com/laravel/laravel/pull/6372
## [v11.0.2](https://github.com/laravel/laravel/compare/v11.0.1...v11.0.2) - 2024-03-13
* [11.x] Remove branch alias from composer.json by [@zepfietje](https://github.com/zepfietje) in https://github.com/laravel/laravel/pull/6366
* [11.x] Fixes typo in welcome page by [@jrd-lewis](https://github.com/jrd-lewis) in https://github.com/laravel/laravel/pull/6363
* change mariadb default by [@taylorotwell](https://github.com/taylorotwell) in https://github.com/laravel/laravel/commit/79969c99c6456a6d6edfbe78d241575fe1f65594
## [v11.0.1](https://github.com/laravel/laravel/compare/v11.0.0...v11.0.1) - 2024-03-12
* [11.x] Fixes SQLite driver missing by [@nunomaduro](https://github.com/nunomaduro) in https://github.com/laravel/laravel/pull/6361
## [v11.0.0 (2023-02-17)](https://github.com/laravel/laravel/compare/v10.3.2...v11.0.0)
Laravel 11 includes a variety of changes to the application skeleton. Please consult the diff to see what's new.

View File

@ -1,36 +0,0 @@
<?php
namespace App\Filament\Pages\Auth;
use Filament\Pages\Auth\Register as BaseRegister;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use Illuminate\Database\Eloquent\Model;
class Register extends BaseRegister
{
public ?array $data = [];
protected function handleRegistration(array $data): Model
{
$user = parent::handleRegistration($data);
$user->assignRole('mahasiswa');
return $user;
}
protected function getForms(): array
{
return [
'form' => $this->form(
$this->makeForm()
->schema([
$this->getNameFormComponent(),
$this->getEmailFormComponent(),
$this->getPasswordFormComponent(),
$this->getPasswordConfirmationFormComponent(),
])
->statePath('data'),
),
];
}
}

View File

@ -1,24 +0,0 @@
<?php
namespace App\Filament\Pages;
use Filament\Facades\Filament;
use Illuminate\Support\Facades\Auth;
class Dashboard extends \Filament\Pages\Dashboard
{
protected static ?string $title = 'Beranda';
public function getWidgets(): array
{
/** @var User $user */
$user = Auth::user();
if ($user->hasRole('mahasiswa')) { {
return [
\App\Filament\Widgets\CustomAccountWidget::class,
];
}
}
return Filament::getWidgets();
}
}

View File

@ -1,153 +0,0 @@
<?php
namespace App\Filament\Pages;
use App\Models\Parameter;
use App\Models\Mahasiswa;
use Filament\Pages\Page;
use Filament\Infolists\Infolist;
use Filament\Infolists\Components\Section;
use Filament\Infolists\Components\TextEntry;
use Filament\Infolists\Components\Grid;
use Filament\Navigation\NavigationItem;
use Filament\Actions\Action;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Support\Facades\Storage;
class ProgresDataPage extends Page
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static ?string $navigationLabel = 'Info';
protected static ?string $navigationGroup = 'Mahasiswa';
protected static ?int $navigationSort = 1;
protected static string $view = 'filament.pages.progres-data-page';
protected static string $routePath = 'progres';
public function getTitle(): string
{
return 'Info';
}
public function infolist(Infolist $infolist): Infolist
{
$user = auth()->user();
// Cari data mahasiswa berdasarkan user_id
$mahasiswa = Mahasiswa::where('user_id', $user->id)->first();
// Jika mahasiswa ditemukan, cari data parameter
$data = $mahasiswa ? Parameter::where('mahasiswa_id', $mahasiswa->id)->first() : null;
// Siapkan state untuk infolist
$state = [
'status' => 'Belum Mengisi Form',
'hasil' => 'Belum Ada Hasil',
'keterangan' => 'Silahkan lengkapi form pendaftaran KIP-K terlebih dahulu.'
];
// Jika data ada, update state sesuai data di database
if ($data) {
$state['status'] = match($data->status) {
'valid' => 'Berkas Valid',
'tidak_valid' => 'Berkas Tidak Valid',
'belum_validasi' => 'Belum Divalidasi',
default => 'Belum Mengisi Form'
};
$state['hasil'] = match($data->hasil) {
'Diterima' => 'Diterima',
'Tidak Diterima' => 'Tidak Diterima',
default => 'Belum Ada Hasil'
};
$state['keterangan'] = match($data->status) {
'valid' => match($data->hasil) {
'Diterima' => 'Selamat! Anda telah diterima sebagai penerima KIP-K. Silahkan cek pengumuman resmi untuk informasi lebih lanjut.',
'Tidak Diterima' => 'Mohon maaf, Anda belum berhasil menjadi penerima KIP-K. Tetap semangat dan jangan menyerah!',
default => 'Berkas Anda telah divalidasi. Hasil seleksi akan diumumkan segera.'
},
'tidak_valid' => "Berkas Anda tidak valid. Alasan: {$data->alasan_tidak_valid}",
'belum_validasi' => 'Berkas Anda sedang dalam proses validasi. Mohon tunggu informasi selanjutnya.',
default => 'Silahkan lengkapi form pendaftaran KIP-K terlebih dahulu.'
};
}
return $infolist
->schema([
Section::make('Status Berkas')
->schema([
Grid::make(2)
->schema([
TextEntry::make('status')
->label('Status Berkas')
->badge()
->color(fn (string $state): string => match ($state) {
'Berkas Valid' => 'success',
'Berkas Tidak Valid' => 'danger',
'Belum Divalidasi' => 'warning',
default => 'gray',
}),
TextEntry::make('hasil')
->label('Hasil Seleksi')
->badge()
->color(fn (string $state): string => match ($state) {
'Diterima' => 'success',
'Tidak Diterima' => 'danger',
default => 'gray',
}),
]),
]),
Section::make('Keterangan')
->schema([
TextEntry::make('keterangan')
->label('Informasi Progres')
->markdown()
->columnSpanFull(),
]),
])
->state($state);
}
protected function getHeaderActions(): array
{
$user = auth()->user();
$mahasiswa = Mahasiswa::with(['prodi', 'jurusan'])->where('user_id', $user->id)->first();
$data = $mahasiswa ? Parameter::where('mahasiswa_id', $mahasiswa->id)->first() : null;
// if ($data && $data->status === 'valid' && $data->hasil === 'Diterima') {
// return [
// Action::make('exportSurat')
// ->label('Download Surat Keterangan')
// ->icon('heroicon-o-document-arrow-down')
// ->action(function () use ($mahasiswa) {
// $pdf = PDF::loadView('surat.keterangan', [
// 'mahasiswa' => $mahasiswa,
// 'tanggal' => now()->format('Y-m-d'),
// ]);
// return response()->streamDownload(function () use ($pdf) {
// echo $pdf->output();
// }, 'surat-k`eterangan-kipk.pdf');
// })
// ];
// }
return [];
}
public static function shouldRegisterNavigation(): bool
{
return false;
}
public static function getNavigationItems(): array
{
return [
NavigationItem::make('Info')
->url(fn (): string => static::getUrl())
->icon('heroicon-o-document-text')
->isActiveWhen(fn (): bool => request()->routeIs(static::getRouteName()))
->visible(fn (): bool => auth()->check() && auth()->user()->roles[0]->name == 'Mahasiswa'),
];
}
}

View File

@ -2,18 +2,12 @@
namespace App\Filament\Pages;
use App\Models\Parameter;
use App\Models\Listform;
use App\Models\Mahasiswa;
use App\Models\Jurusan;
use App\Models\Prodi;
use Filament\Forms\Components\Wizard;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Fieldset;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Pages\Page;
use Filament\Forms\Form;
@ -27,25 +21,30 @@ class WizardForm extends Page
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.pages.wizard-form';
protected static ?string $title = 'Form Pendaftaran KIP-K';
protected static ?string $slug = 'wizard-form';
protected static bool $shouldRegisterNavigation = false;
public array $data = [];
// Data Mahasiswa
public $noreg_kipk;
public $nama;
public $nim;
public $jurusan;
public $prodi;
public $angkatan;
public $semester;
public $jalur_masuk;
public $ponsel;
public $alamat;
// Data Parameter
public $kepemilikan_kip;
public $tingkatan_desil;
public $berkas_sktm;
public $berkas_ppke;
public $berkas_pmk;
public $berkas_pkh;
public $berkas_kks;
public function mount(): void
{
// Cek apakah mahasiswa sudah pernah mengisi form
$mahasiswa = Mahasiswa::where('user_id', auth()->id())->first();
if ($mahasiswa && $mahasiswa->parameter) {
Notification::make()
->warning()
->title('Peringatan')
->body('Anda sudah pernah mengisi form pendaftaran KIP-K')
->send();
$this->redirect('/admin/');
}
$this->form->fill();
}
@ -56,235 +55,147 @@ public function form(Form $form): Form
Wizard::make([
Wizard\Step::make('Biodata Mahasiswa')
->schema([
TextInput::make('noreg_kipk')->label('No. Registrasi KIP-K')->required(),
TextInput::make('nama')->label('Nama Lengkap')->required(),
TextInput::make('nim')->label('NIM')->required(),
Select::make('jurusan_id')
->label('Jurusan')
->options(Jurusan::all()->pluck('nama', 'id'))
->required()
->reactive()
->afterStateUpdated(fn (callable $set) => $set('prodi_id', null)),
Select::make('prodi_id')
->label('Program Studi')
->options(function (callable $get) {
$jurusanId = $get('jurusan_id');
if (!$jurusanId) {
return [];
}
return Prodi::where('jurusan_id', $jurusanId)
->pluck('nama', 'id');
})
->required()
->reactive()
->afterStateUpdated(function (callable $set, callable $get) {
$prodiId = $get('prodi_id');
if ($prodiId) {
$prodi = Prodi::find($prodiId);
$set('akreditasi', $prodi->akreditasi);
}
}),
TextInput::make('akreditasi')
->label('Akreditasi Prodi')
->disabled()
TextInput::make('noreg_kipk')
->label('No. Registrasi KIP-K')
->required(),
TextInput::make('nama')
->label('Nama Lengkap')
->required(),
TextInput::make('nim')
->label('NIM')
->required(),
TextInput::make('jurusan')
->label('Jurusan')
->required(),
TextInput::make('prodi')
->label('Program Studi')
->required(),
TextInput::make('angkatan')
->label('Angkatan')
->required(),
TextInput::make('semester')
->label('Semester')
->required(),
TextInput::make('jalur_masuk')
->label('Jalur Masuk')
->required(),
TextInput::make('ponsel')
->label('No. Handphone')
->tel()
->required(),
TextInput::make('alamat')
->label('Alamat')
->required(),
TextInput::make('angkatan')->label('Angkatan')->required(),
TextInput::make('jalur_masuk')->label('Jalur Masuk')->required(),
TextInput::make('ponsel')->label('No. Handphone')->tel()->required(),
TextInput::make('alamat')->label('Alamat')->required(),
]),
Wizard\Step::make('Parameter Penilaian')
->schema([
Section::make('Kepemilikan KIP')
->schema([
Radio::make('kepemilikan_kip')
->options([
'Memiliki KIP' => 'Memiliki KIP',
'Tidak Memiliki KIP' => 'Tidak Memiliki KIP',
])
->required()
->inline()
->reactive(),
FileUpload::make('berkas_kip')
->label('Bukti Kepemilikan KIP')
->disk('berkas')
->directory('kip')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->visible(fn (callable $get) => $get('kepemilikan_kip') === 'Memiliki KIP')
->required(fn (callable $get) => $get('kepemilikan_kip') === 'Memiliki KIP'),
]),
Section::make('Tingkatan Desil')
->schema([
Radio::make('terdata_dtks')
->options([
'Terdata' => 'Terdata',
'Tidak Terdata' => 'Tidak Terdata',
])
->required()
->inline()
->reactive(),
FileUpload::make('berkas_dtks')
->label('Bukti Terdata di DTKS')
->disk('berkas')
->directory('dtks')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->visible(fn (callable $get) => $get('terdata_dtks') === 'Terdata')
->required(fn (callable $get) => $get('terdata_dtks') === 'Terdata'),
Select::make('kepemilikan_kip')
->label('Kepemilikan KIP')
->options([
'Memiliki KIP' => 'Memiliki KIP',
'Tidak Memiliki KIP' => 'Tidak Memiliki KIP',
])
->required(),
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 Bukti Bantuan Pemerintah')
->schema([
FileUpload::make('berkas_1')
->label('Berkas Bukti 1 (Opsional)')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf']),
FileUpload::make('berkas_2')
->label('Berkas Bukti 2 (Opsional)')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf']),
FileUpload::make('berkas_3')
->label('Berkas Bukti 3 (Opsional)')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf']),
]),
Section::make('Status Orang Tua')
->schema([
Grid::make(2)
->schema([
Fieldset::make('Status Ayah')
->schema([
Radio::make('status_ayah')
->options([
'Hidup' => 'Hidup',
'Wafat' => 'Wafat',
])
->required()
->inline()
->reactive(),
FileUpload::make('bukti_wafat_ayah')
->label('Bukti Kematian Ayah')
->disk('berkas')
->directory('wafat')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->visible(fn (callable $get) => $get('status_ayah') === 'Wafat')
->required(fn (callable $get) => $get('status_ayah') === 'Wafat'),
]),
Fieldset::make('Status Ibu')
->schema([
Radio::make('status_ibu')
->options([
'Hidup' => 'Hidup',
'Wafat' => 'Wafat',
])
->required()
->inline()
->reactive(),
FileUpload::make('bukti_wafat_ibu')
->label('Bukti Kematian Ibu')
->disk('berkas')
->directory('wafat')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->visible(fn (callable $get) => $get('status_ibu') === 'Wafat')
->required(fn (callable $get) => $get('status_ibu') === 'Wafat'),
]),
]),
]),
Select::make('tingkatan_desil')
->label('Tingkatan Desil')
->options([
'Desil 1' => 'Desil 1',
'Desil 2' => 'Desil 2',
'Desil 3' => 'Desil 3',
'Desil 4' => 'Desil 4',
'Desil 5' => 'Desil 5',
])
->required(),
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']),
]),
])
->submitAction(view('filament.pages.wizard-form-submit-button'))
])
->statePath('data');
->submitAction(
\Filament\Forms\Components\Actions\Action::make('submit')
->label('Submit')
->submit('submit')
)
]);
}
protected function getFormActions(): array
{
return [
\Filament\Forms\Components\Actions\Action::make('submit')
->label('Submit')
->action('submit')
->submit()
];
}
public function submit()
{
// Validasi form
$data = $this->form->getState();
DB::beginTransaction();
try {
// Simpan data mahasiswa
$mahasiswa = Mahasiswa::create([
'user_id' => auth()->id(),
'noreg_kipk' => $data['noreg_kipk'],
'nama' => $data['nama'],
'NIM' => $data['nim'],
'jurusan_id' => $data['jurusan_id'],
'prodi_id' => $data['prodi_id'],
'akreditasi' => $data['akreditasi'] ?? Prodi::find($data['prodi_id'])->akreditasi,
'nim' => $data['nim'],
'jurusan' => $data['jurusan'],
'prodi' => $data['prodi'],
'angkatan' => $data['angkatan'],
'semester' => $data['semester'],
'jalur_masuk' => $data['jalur_masuk'],
'ponsel' => $data['ponsel'],
'alamat' => $data['alamat'],
]);
// Simpan data parameter
Parameter::create([
// Simpan data listform
Listform::create([
'mahasiswa_id' => $mahasiswa->id,
'kepemilikan_kip' => $data['kepemilikan_kip'],
'berkas_kip' => $data['berkas_kip'] ?? null,
'terdata_dtks' => $data['terdata_dtks'],
'berkas_dtks' => $data['berkas_dtks'] ?? null,
'tingkatan_desil' => $data['tingkatan_desil'],
'berkas_1' => $data['berkas_1'],
'berkas_2' => $data['berkas_2'] ?? null,
'berkas_3' => $data['berkas_3'] ?? null,
'status_ayah' => $data['status_ayah'],
'bukti_wafat_ayah' => $data['bukti_wafat_ayah'] ?? null,
'status_ibu' => $data['status_ibu'],
'bukti_wafat_ibu' => $data['bukti_wafat_ibu'] ?? null,
'status' => 'belum_validasi',
'berkas_sktm' => $data['berkas_sktm'],
'berkas_ppke' => $data['berkas_ppke'],
'berkas_pmk' => $data['berkas_pmk'],
'berkas_pkh' => $data['berkas_pkh'],
'berkas_kks' => $data['berkas_kks'],
'status' => 'submitted',
]);
DB::commit();
@ -295,7 +206,7 @@ public function submit()
->body('Data berhasil disimpan')
->send();
$this->redirect('/admin/');
$this->form->fill(); // Reset form
} catch (\Exception $e) {
DB::rollBack();

View File

@ -17,22 +17,15 @@
use Filament\Forms\Components\TextInput;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Actions\Action;
use Illuminate\Support\Facades\Auth;
class FormulirResource extends Resource
{
protected static ?string $model = Formulir::class;
protected static ?string $navigationIcon = 'heroicon-o-clipboard-document';
protected static ?int $navigationSort = 5;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Data Master';
protected static ?string $slug = 'daftar-formulir';
public static function getNavigationGroup(): ?string
{
return auth()->user()->roles[0]->name === 'mahasiswa'
? null
: 'Data Master';
}
protected static ?int $navigationSort = 5;
public static function form(Form $form): Form
{
@ -61,8 +54,7 @@ public static function table(Table $table): Table
TextColumn::make('nama'),
TextColumn::make('tgl_pembuatan')
->label('Tanggal'),
TextColumn::make('kuota')
->visible(fn () => !Auth::user()->hasRole('mahasiswa')),
TextColumn::make('kuota'),
TextColumn::make('status')
->badge()
->color(fn (string $state): string => match ($state) {
@ -75,20 +67,6 @@ public static function table(Table $table): Table
//
])
->actions([
Action::make('daftar')
->label('Daftar')
->icon('heroicon-o-pencil-square')
->color('primary')
->url(fn (Formulir $record): string => '/admin/wizard-form')
->openUrlInNewTab(false)
->visible(fn (Formulir $record): bool => $record->status === 'dibuka'),
Action::make('info')
->label('Info')
->icon('heroicon-o-information-circle')
->color('warning')
->url(fn (): string => '/admin/progres-data-page')
->openUrlInNewTab(false)
->visible(fn (): bool => Auth::user()->hasRole('mahasiswa')),
Action::make('toggleStatus')
->label(fn (Formulir $record): string => $record->status === 'dibuka' ? 'Tutup' : 'Buka')
->icon(fn (Formulir $record): string => $record->status === 'dibuka' ? 'heroicon-o-x-circle' : 'heroicon-o-check-circle')
@ -97,8 +75,7 @@ public static function table(Table $table): Table
$record->update([
'status' => $record->status === 'dibuka' ? 'ditutup' : 'dibuka'
]);
})
->visible(fn (): bool => Auth::user()->hasRole('super_admin')),
}),
Tables\Actions\EditAction::make(),
])
->bulkActions([

View File

@ -3,202 +3,103 @@
namespace App\Filament\Resources;
use App\Filament\Resources\HasilResource\Pages;
use App\Models\Parameter;
use App\Filament\Resources\HasilResource\RelationManagers;
use App\Models\Hasil;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Tables\Columns\TextColumn;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\DB;
use Filament\Tables\Columns\TextColumn;
class HasilResource extends Resource
{
protected static ?string $model = Parameter::class;
public static $kuota = 0;
protected static ?string $model = Hasil::class;
protected static ?string $navigationIcon = 'heroicon-o-clipboard-document-check';
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Penilaian';
protected static ?string $navigationLabel = 'Hasil Penilaian';
protected static ?int $navigationSort = 2;
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 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(),
]);
}
public static function table(Table $table): Table
{
return $table
->headerActions([
Tables\Actions\Action::make('exportExcel')
->label('Export Excel')
->icon('heroicon-o-table-cells')
->color('success')
->action(function () {
$data = Parameter::with(['mahasiswa.jurusan', 'mahasiswa.prodi'])
->where('status', 'valid')
->orderBy('total_nilai', 'desc')
->get();
$fileName = 'hasil-penilaian-' . now()->format('Y-m-d') . '.xlsx';
return response()->streamDownload(function () use ($data) {
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Set header
$sheet->setCellValue('A1', 'No');
$sheet->setCellValue('B1', 'Nama Mahasiswa');
$sheet->setCellValue('C1', 'Jurusan');
$sheet->setCellValue('D1', 'Program Studi');
$sheet->setCellValue('E1', 'Akreditasi');
$sheet->setCellValue('F1', 'Total Nilai');
$sheet->setCellValue('G1', 'Hasil');
// Isi data
$row = 2;
foreach ($data as $index => $item) {
$sheet->setCellValue('A' . $row, $index + 1);
$sheet->setCellValue('B' . $row, $item->mahasiswa->nama);
$sheet->setCellValue('C' . $row, $item->mahasiswa->jurusan->nama);
$sheet->setCellValue('D' . $row, $item->mahasiswa->prodi->nama);
$sheet->setCellValue('E' . $row, $item->mahasiswa->prodi->akreditasi);
$sheet->setCellValue('F' . $row, number_format($item->total_nilai, 4));
$sheet->setCellValue('G' . $row, $item->hasil);
$row++;
}
// Auto size columns
foreach (range('A', 'G') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
// Set header style
$headerStyle = [
'font' => ['bold' => true],
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
'borders' => [
'allBorders' => ['borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN],
],
'fill' => [
'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
'startColor' => ['rgb' => 'E2E8F0'],
],
];
$sheet->getStyle('A1:G1')->applyFromArray($headerStyle);
// Set data style
$dataStyle = [
'borders' => [
'allBorders' => ['borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN],
],
];
$sheet->getStyle('A2:G' . ($row - 1))->applyFromArray($dataStyle);
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save('php://output');
}, $fileName);
}),
Tables\Actions\Action::make('exportPdf')
->label('Export PDF')
->icon('heroicon-o-document-arrow-down')
->color('info')
->action(function () {
$data = Parameter::with(['mahasiswa.jurusan', 'mahasiswa.prodi'])
->where('status', 'valid')
->orderBy('total_nilai', 'desc')
->get();
$pdf = \PDF::loadView('exports.hasil-penilaian', [
'data' => $data,
'title' => 'Hasil Penilaian KIPK',
'date' => now()->format('d F Y'),
]);
return response()->streamDownload(function () use ($pdf) {
echo $pdf->output();
}, 'hasil-penilaian-' . now()->format('Y-m-d') . '.pdf');
}),
Tables\Actions\Action::make('akreditasiA')
->label('Set Akreditasi A')
->url(fn () => route('filament.admin.resources.hasil-penilaian.akreditasi-a'))
->color('success')
->icon('heroicon-o-bookmark'),
Tables\Actions\Action::make('akreditasiB')
->label('Set Akreditasi B')
->url(fn () => route('filament.admin.resources.hasil-penilaian.akreditasi-b'))
->color('warning')
->icon('heroicon-o-bookmark'),
Tables\Actions\Action::make('akreditasiC')
->label('Set Akreditasi C')
->url(fn () => route('filament.admin.resources.hasil-penilaian.akreditasi-c'))
->color('danger')
->icon('heroicon-o-bookmark'),
])
->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('mahasiswa.jurusan.nama')
->label('Jurusan')
->searchable()
->sortable(),
TextColumn::make('mahasiswa.prodi.nama')
->label('Program Studi')
->searchable()
->sortable(),
TextColumn::make('mahasiswa.prodi.akreditasi')
->label('Akreditasi Prodi')
->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) {
'Diterima' => 'success',
'Tidak Diterima' => 'danger',
default => 'gray',
}),
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',
}),
])
->defaultSort('total_nilai', 'desc')
->filters([
Tables\Filters\SelectFilter::make('hasil')
->options([
'Diterima' => 'Diterima',
'Tidak Diterima' => 'Tidak Diterima',
]),
//
])
->actions([
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListHasil::route('/'),
'akreditasi-a' => Pages\HasilAkreditasiA::route('/akreditasi-a'),
'akreditasi-b' => Pages\HasilAkreditasiB::route('/akreditasi-b'),
'akreditasi-c' => Pages\HasilAkreditasiC::route('/akreditasi-c'),
'index' => Pages\ListHasils::route('/'),
'create' => Pages\CreateHasil::route('/create'),
'edit' => Pages\EditHasil::route('/{record}/edit'),
];
}
}
}

View File

@ -3,9 +3,10 @@
namespace App\Filament\Resources\HasilResource\Pages;
use App\Filament\Resources\HasilResource;
use Filament\Resources\Pages\ListRecords;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class ListHasil extends ListRecords
class CreateHasil extends CreateRecord
{
protected static string $resource = HasilResource::class;
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\HasilResource\Pages;
use App\Filament\Resources\HasilResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditHasil extends EditRecord
{
protected static string $resource = HasilResource::class;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -1,152 +0,0 @@
<?php
namespace App\Filament\Resources\HasilResource\Pages;
use App\Filament\Resources\HasilResource;
use Filament\Resources\Pages\ListRecords;
use Filament\Tables\Table;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Actions\Action;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\DB;
use App\Models\Parameter;
class HasilAkreditasiA extends ListRecords
{
protected static string $resource = HasilResource::class;
protected static ?string $title = 'Hasil Penilaian Akreditasi A';
public function table(Table $table): Table
{
return $table
->headerActions([
Action::make('setKuota')
->label('Set Kuota Penerimaan')
->form([
TextInput::make('kuota')
->label('Jumlah Kuota')
->numeric()
->required()
->minValue(1)
->helperText('Masukkan jumlah kuota penerimaan untuk akreditasi A.'),
])
->action(function (array $data): void {
DB::beginTransaction();
try {
// Reset hasil untuk akreditasi A
Parameter::whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'A');
})->update(['hasil' => 'Tidak Diterima']);
// Ambil data parameter yang valid dengan akreditasi A
$validParameters = Parameter::where('status', 'valid')
->whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'A');
})
->orderBy('total_nilai', 'desc')
->get();
$kuota = (int) $data['kuota'];
$index = 0;
foreach ($validParameters as $parameter) {
if ($index < $kuota) {
DB::table('parameters')
->where('id', $parameter->id)
->update(['hasil' => 'Diterima']);
}
$index++;
}
DB::commit();
Notification::make()
->title("Berhasil mengatur kuota penerimaan untuk {$kuota} mahasiswa akreditasi A")
->success()
->send();
} catch (\Exception $e) {
DB::rollBack();
Notification::make()
->title('Terjadi kesalahan: ' . $e->getMessage())
->danger()
->send();
}
})
->requiresConfirmation()
->modalHeading('Set Kuota Penerimaan Akreditasi A')
->modalDescription('Apakah Anda yakin ingin mengatur kuota penerimaan untuk akreditasi A?')
->modalSubmitActionLabel('Ya, Set Kuota')
->successNotificationTitle('Kuota berhasil diatur'),
Action::make('resetKuota')
->label('Reset')
->color('danger')
->icon('heroicon-o-arrow-path')
->action(function (): void {
DB::beginTransaction();
try {
Parameter::whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'A');
})->update(['hasil' => null]);
DB::commit();
Notification::make()
->title('Berhasil mereset hasil kuota penerimaan')
->success()
->send();
} catch (\Exception $e) {
DB::rollBack();
Notification::make()
->title('Terjadi kesalahan: ' . $e->getMessage())
->danger()
->send();
}
})
->requiresConfirmation()
->modalHeading('Reset Kuota Penerimaan')
->modalDescription('Apakah Anda yakin ingin mereset hasil kuota penerimaan? Semua hasil akan dikosongkan.')
->modalSubmitActionLabel('Ya, Reset Kuota')
->successNotificationTitle('Kuota berhasil direset'),
])
->modifyQueryUsing(fn ($query) => $query->where('status', 'valid')
->whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'A');
}))
->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) {
'Diterima' => 'success',
'Tidak Diterima' => 'danger',
default => 'gray',
}),
])
->defaultSort('total_nilai', 'desc')
->filters([
\Filament\Tables\Filters\SelectFilter::make('hasil')
->options([
'Diterima' => 'success',
'Tidak Diterima' => 'danger',
]),
]);
}
}

View File

@ -1,153 +0,0 @@
<?php
namespace App\Filament\Resources\HasilResource\Pages;
use App\Filament\Resources\HasilResource;
use Filament\Resources\Pages\ListRecords;
use Filament\Tables\Table;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Actions\Action;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Tables\Filters\SelectFilter;
use Illuminate\Support\Facades\DB;
use App\Models\Parameter;
class HasilAkreditasiB extends ListRecords
{
protected static string $resource = HasilResource::class;
protected static ?string $title = 'Hasil Penilaian Akreditasi B';
public function table(Table $table): Table
{
return $table
->headerActions([
Action::make('setKuota')
->label('Set Kuota Penerimaan')
->form([
TextInput::make('kuota')
->label('Jumlah Kuota')
->numeric()
->required()
->minValue(1)
->helperText('Masukkan jumlah kuota penerimaan untuk akreditasi B.'),
])
->action(function (array $data): void {
DB::beginTransaction();
try {
// Reset hasil untuk akreditasi B
Parameter::whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'B');
})->update(['hasil' => 'Tidak Diterima']);
// Ambil data parameter yang valid dengan akreditasi B
$validParameters = Parameter::where('status', 'valid')
->whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'B');
})
->orderBy('total_nilai', 'desc')
->get();
$kuota = (int) $data['kuota'];
$index = 0;
foreach ($validParameters as $parameter) {
if ($index < $kuota) {
DB::table('parameters')
->where('id', $parameter->id)
->update(['hasil' => 'Diterima']);
}
$index++;
}
DB::commit();
Notification::make()
->title("Berhasil mengatur kuota penerimaan untuk {$kuota} mahasiswa akreditasi B")
->success()
->send();
} catch (\Exception $e) {
DB::rollBack();
Notification::make()
->title('Terjadi kesalahan: ' . $e->getMessage())
->danger()
->send();
}
})
->requiresConfirmation()
->modalHeading('Set Kuota Penerimaan Akreditasi B')
->modalDescription('Apakah Anda yakin ingin mengatur kuota penerimaan untuk akreditasi B?')
->modalSubmitActionLabel('Ya, Set Kuota')
->successNotificationTitle('Kuota berhasil diatur'),
Action::make('resetKuota')
->label('Reset')
->color('danger')
->icon('heroicon-o-arrow-path')
->action(function (): void {
DB::beginTransaction();
try {
Parameter::whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'B');
})->update(['hasil' => null]);
DB::commit();
Notification::make()
->title('Berhasil mereset hasil kuota penerimaan')
->success()
->send();
} catch (\Exception $e) {
DB::rollBack();
Notification::make()
->title('Terjadi kesalahan: ' . $e->getMessage())
->danger()
->send();
}
})
->requiresConfirmation()
->modalHeading('Reset Kuota Penerimaan')
->modalDescription('Apakah Anda yakin ingin mereset hasil kuota penerimaan? Semua hasil akan dikosongkan.')
->modalSubmitActionLabel('Ya, Reset Kuota')
->successNotificationTitle('Kuota berhasil direset'),
])
->modifyQueryUsing(fn ($query) => $query->where('status', 'valid')
->whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'B');
}))
->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) {
'Diterima' => 'success',
'Tidak Diterima' => 'danger',
default => 'gray',
}),
])
->defaultSort('total_nilai', 'desc')
->filters([
\Filament\Tables\Filters\SelectFilter::make('hasil')
->options([
'Diterima' => 'success',
'Tidak Diterima' => 'danger',
]),
]);
}
}

View File

@ -1,153 +0,0 @@
<?php
namespace App\Filament\Resources\HasilResource\Pages;
use App\Filament\Resources\HasilResource;
use Filament\Resources\Pages\ListRecords;
use Filament\Tables\Table;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Actions\Action;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Tables\Filters\SelectFilter;
use Illuminate\Support\Facades\DB;
use App\Models\Parameter;
class HasilAkreditasiC extends ListRecords
{
protected static string $resource = HasilResource::class;
protected static ?string $title = 'Hasil Penilaian Akreditasi C';
public function table(Table $table): Table
{
return $table
->headerActions([
Action::make('setKuota')
->label('Set Kuota Penerimaan')
->form([
TextInput::make('kuota')
->label('Jumlah Kuota')
->numeric()
->required()
->minValue(1)
->helperText('Masukkan jumlah kuota penerimaan untuk akreditasi C.'),
])
->action(function (array $data): void {
DB::beginTransaction();
try {
// Reset hasil untuk akreditasi C
Parameter::whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'C');
})->update(['hasil' => 'Tidak Diterima']);
// Ambil data parameter yang valid dengan akreditasi C
$validParameters = Parameter::where('status', 'valid')
->whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'C');
})
->orderBy('total_nilai', 'desc')
->get();
$kuota = (int) $data['kuota'];
$index = 0;
foreach ($validParameters as $parameter) {
if ($index < $kuota) {
DB::table('parameters')
->where('id', $parameter->id)
->update(['hasil' => 'Diterima']);
}
$index++;
}
DB::commit();
Notification::make()
->title("Berhasil mengatur kuota penerimaan untuk {$kuota} mahasiswa akreditasi C")
->success()
->send();
} catch (\Exception $e) {
DB::rollBack();
Notification::make()
->title('Terjadi kesalahan: ' . $e->getMessage())
->danger()
->send();
}
})
->requiresConfirmation()
->modalHeading('Set Kuota Penerimaan Akreditasi C')
->modalDescription('Apakah Anda yakin ingin mengatur kuota penerimaan untuk akreditasi C?')
->modalSubmitActionLabel('Ya, Set Kuota')
->successNotificationTitle('Kuota berhasil diatur'),
Action::make('resetKuota')
->label('Reset')
->color('danger')
->icon('heroicon-o-arrow-path')
->action(function (): void {
DB::beginTransaction();
try {
Parameter::whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'C');
})->update(['hasil' => null]);
DB::commit();
Notification::make()
->title('Berhasil mereset hasil kuota penerimaan')
->success()
->send();
} catch (\Exception $e) {
DB::rollBack();
Notification::make()
->title('Terjadi kesalahan: ' . $e->getMessage())
->danger()
->send();
}
})
->requiresConfirmation()
->modalHeading('Reset Kuota Penerimaan')
->modalDescription('Apakah Anda yakin ingin mereset hasil kuota penerimaan? Semua hasil akan dikosongkan.')
->modalSubmitActionLabel('Ya, Reset Kuota')
->successNotificationTitle('Kuota berhasil direset'),
])
->modifyQueryUsing(fn ($query) => $query->where('status', 'valid')
->whereHas('mahasiswa.prodi', function ($query) {
$query->where('akreditasi', 'C');
}))
->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) {
'Diterima' => 'success',
'Tidak Diterima' => 'danger',
default => 'gray',
}),
])
->defaultSort('total_nilai', 'desc')
->filters([
\Filament\Tables\Filters\SelectFilter::make('hasil')
->options([
'Diterima' => 'success',
'Tidak Diterima' => 'danger',
]),
]);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\HasilResource\Pages;
use App\Filament\Resources\HasilResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListHasils extends ListRecords
{
protected static string $resource = HasilResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@ -26,10 +26,6 @@ class KriteriaResource extends Resource
// protected static ?string $pluralModelLabel = 'Kriteria';
protected static ?string $slug = 'kriteria';
protected static ?int $navigationSort = 1;
public static function canCreate(): bool
{
return false;
}
public static function form(Form $form): Form
{
@ -40,9 +36,7 @@ public static function form(Form $form): Form
TextInput::make('prioritas')
->required(),
TextInput::make('bobot')
->disabled()
->helperText('Bobot akan dihitung otomatis oleh sistem')
// ->required(),
->required(),
]);
}

View File

@ -0,0 +1,223 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ListformResource\Pages;
use App\Models\Listform;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Section;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Actions\ViewAction;
use Filament\Forms\Components\ViewField;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Placeholder;
use Illuminate\Support\Facades\Storage;
class ListformResource extends Resource
{
protected static ?string $model = Listform::class;
protected static ?string $navigationIcon = 'heroicon-o-clipboard-document-list';
protected static ?string $navigationGroup = 'Penilaian';
protected static ?string $navigationLabel = 'Form Penilaian KIP-K';
protected static ?int $navigationSort = 1;
public static function form(Form $form): Form
{
return $form
->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'),
];
}
}

View File

@ -14,13 +14,12 @@
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Columns\TextColumn;
use Filament\Forms\Components\Select;
class MahasiswaResource extends Resource
{
protected static ?string $model = Mahasiswa::class;
protected static ?string $navigationIcon = 'heroicon-o-user-group';
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Data Master';
// protected static ?string $navigationLabel = 'Mahasiswa';
// protected static ?string $modelLabel = 'Mahasiswa';
@ -28,11 +27,6 @@ class MahasiswaResource extends Resource
protected static ?string $slug = 'mahasiswa';
protected static ?int $navigationSort = 3;//buat urutannya
public static function canCreate(): bool
{
return false;
}
public static function form(Form $form): Form
{
return $form
@ -45,20 +39,15 @@ public static function form(Form $form): Form
TextInput::make('NIM')
->label('NIM')
->required(),
Select::make('jurusan_id')
->label('Jurusan')
->relationship('jurusan', 'nama')
TextInput::make('jurusan')
->required(),
Select::make('prodi_id')
TextInput::make('prodi')
->label('Program Studi')
->relationship('prodi', 'nama')
->required(),
Select::make('akreditasi')
->label('Akreditasi Program Studi')
->relationship('prodi', 'akreditasi')
->required(),
TextInput::make('angkatan')
->required(),
TextInput::make('semester')
->required(),
TextInput::make('jalur_masuk')
->required(),
TextInput::make('ponsel')
@ -79,10 +68,11 @@ public static function table(Table $table): Table
// ->shortable(), //biar urut berdasarkan abjad
TextColumn::make('NIM')
->label('NIM'),
TextColumn::make('jurusan.nama')->label('Jurusan'),
TextColumn::make('prodi.nama')->label('Program Studi'),
TextColumn::make('prodi.akreditasi')->label('Akreditasi Prodi'),
TextColumn::make('jurusan'),
TextColumn::make('prodi')
->label('Program Studi'),
TextColumn::make('angkatan'),
TextColumn::make('semester'),
TextColumn::make('jalur_masuk'),
TextColumn::make('ponsel'),
TextColumn::make('alamat'),

View File

@ -1,666 +0,0 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ParameterResource\Pages;
use App\Filament\Resources\ParameterResource\RelationManagers;
use App\Models\Parameter;
use Filament\Forms;
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\Section;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Hidden;
use Filament\Forms\Components\Fieldset;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Placeholder;
use Filament\Forms\Components\Textarea;
class ParameterResource extends Resource
{
protected static ?string $model = Parameter::class;
protected static ?string $navigationIcon = 'heroicon-o-clipboard-document-list';
protected static ?string $navigationLabel = 'Validasi Data';
protected static ?string $navigationGroup = 'Penilaian';
protected static ?int $navigationSort = 1;
protected static ?string $title = 'Validasi Data';
public static function canCreate(): bool
{
return false;
}
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('Data Mahasiswa')
->schema([
Select::make('mahasiswa_id')
->relationship('mahasiswa', 'nama')
->searchable()
->preload()
->required()
->label('Nama Mahasiswa')
->disabled(fn ($context) => $context === 'view'),
]),
Section::make('Kepemilikan KIP')
->schema([
Radio::make('kepemilikan_kip')
->options([
'Memiliki KIP' => 'Memiliki KIP',
'Tidak Memiliki KIP' => 'Tidak Memiliki KIP',
])
->required()
->inline()
->reactive()
->disabled(fn ($context) => $context === 'view'),
FileUpload::make('berkas_kip')
->label('Bukti Kepemilikan KIP')
->disk('berkas')
->directory('kip')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->visible(fn (callable $get) => $get('kepemilikan_kip') === 'Memiliki KIP')
->required(fn (callable $get) => $get('kepemilikan_kip') === 'Memiliki KIP')
->disabled(fn ($context) => $context === 'view'),
]),
Section::make('Tingkatan Desil')
->schema([
Radio::make('terdata_dtks')
->options([
'Terdata' => 'Terdata',
'Tidak Terdata' => 'Tidak Terdata',
])
->required()
->inline()
->reactive()
->disabled(fn ($context) => $context === 'view'),
FileUpload::make('berkas_dtks')
->label('Bukti Terdata di DTKS')
->disk('berkas')
->directory('dtks')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->visible(fn (callable $get) => $get('terdata_dtks') === 'Terdata')
->required(fn (callable $get) => $get('terdata_dtks') === 'Terdata')
->disabled(fn ($context) => $context === 'view'),
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()
->disabled(fn ($context) => $context === 'view'),
]),
Section::make('Upload Berkas Bukti Bantuan Pemerintah')
->schema([
Hidden::make('kondisi_ekonomi')
->default('Cukup Mampu'),
FileUpload::make('berkas_1')
->label('Berkas Bukti 1(Opsional)')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->disabled(fn ($context) => $context === 'view'),
FileUpload::make('berkas_2')
->label('Berkas Bukti 2 (Opsional)')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->disabled(fn ($context) => $context === 'view'),
FileUpload::make('berkas_3')
->label('Berkas Bukti 3 (Opsional)')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->disabled(fn ($context) => $context === 'view'),
]),
Section::make('Status Orang Tua')
->schema([
Grid::make(2)
->schema([
Fieldset::make('Status Ayah')
->schema([
Radio::make('status_ayah')
->options([
'Hidup' => 'Hidup',
'Wafat' => 'Wafat',
])
->required()
->inline()
->reactive()
->disabled(fn ($context) => $context === 'view'),
FileUpload::make('bukti_wafat_ayah')
->label('Bukti Kematian Ayah')
->disk('berkas')
->directory('wafat')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->visible(fn (callable $get) => $get('status_ayah') === 'Wafat')
->required(fn (callable $get) => $get('status_ayah') === 'Wafat')
->disabled(fn ($context) => $context === 'view'),
]),
Fieldset::make('Status Ibu')
->schema([
Radio::make('status_ibu')
->options([
'Hidup' => 'Hidup',
'Wafat' => 'Wafat',
])
->required()
->inline()
->reactive()
->disabled(fn ($context) => $context === 'view'),
FileUpload::make('bukti_wafat_ibu')
->label('Bukti Kematian Ibu')
->disk('berkas')
->directory('wafat')
->visibility('public')
->preserveFilenames()
->downloadable()
->openable()
->acceptedFileTypes(['application/pdf'])
->visible(fn (callable $get) => $get('status_ibu') === 'Wafat')
->required(fn (callable $get) => $get('status_ibu') === 'Wafat')
->disabled(fn ($context) => $context === 'view'),
]),
]),
// Hidden::make('status_orang_tua')
// ->default('Kedua Orang Tua Masih Hidup'),
]),
Section::make('Status Validasi')
->schema([
Radio::make('status')
->options([
'belum_validasi' => 'Belum Validasi',
'valid' => 'Valid',
'tidak_valid' => 'Tidak Valid',
])
->required()
->default('belum_validasi')
->reactive(),
Textarea::make('alasan_tidak_valid')
->label('Alasan Tidak Valid')
->placeholder('Masukkan alasan mengapa data tidak valid...')
->rows(3)
->required(fn (callable $get) => $get('status') === 'tidak_valid')
->visible(fn (callable $get) => $get('status') === 'tidak_valid'),
])
->visible(fn ($context) => $context === 'view'),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('mahasiswa.nama')
->label('Nama Mahasiswa')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('kepemilikan_kip')
->label('Kepemilikan KIP')
->badge()
->color(fn (string $state): string => match ($state) {
'Memiliki KIP' => 'success',
'Tidak Memiliki KIP' => 'danger',
}),
Tables\Columns\TextColumn::make('terdata_dtks')
->label('Terdata DTKS')
->badge()
->color(fn (string $state): string => match ($state) {
'Terdata' => 'success',
'Tidak Terdata' => 'danger',
}),
Tables\Columns\TextColumn::make('tingkatan_desil')
->label('Tingkatan Desil')
->badge()
->color(fn (string $state): string => match ($state) {
'Desil 1' => 'success',
'Desil 2' => 'success',
'Desil 3' => 'warning',
'Desil 4' => 'warning',
'Desil 5' => 'danger',
default => 'gray',
}),
Tables\Columns\TextColumn::make('kondisi_ekonomi')
->label('Kondisi Ekonomi')
->badge()
->color(fn (string $state): string => match ($state) {
'Sangat Kurang Mampu' => 'success',
'Kurang Mampu' => 'warning',
'Cukup Mampu' => 'danger',
'Tidak Menerima Bantuan' => 'gray',
}),
Tables\Columns\TextColumn::make('status_orang_tua')
->label('Status Orang Tua')
->badge()
->color(fn (string $state): string => match ($state) {
'Kedua Orang Tua Wafat' => 'success',
'Salah Satu Orang Tua Wafat' => 'warning',
'Kedua Orang Tua Masih Hidup' => 'danger',
default => 'gray',
}),
Tables\Columns\TextColumn::make('total_nilai')
->label('Total Nilai')
->sortable(),
// Tables\Columns\TextColumn::make('hasil')
// ->label('Hasil')
// ->badge()
// ->color(fn (string $state): string => match ($state) {
// 'Diterima' => 'success',
// 'Tidak Diterima' => 'danger',
// default => 'gray',
// }),
Tables\Columns\TextColumn::make('status')
->label('Status Validasi')
->badge()
->color(fn (string $state): string => match ($state) {
'valid' => 'success',
'tidak_valid' => 'danger',
'belum_validasi' => 'warning',
default => 'gray',
}),
Tables\Columns\TextColumn::make('created_at')
->label('Tanggal Dibuat')
->dateTime('d M Y H:i')
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->label('Terakhir Diperbarui')
->dateTime('d M Y H:i')
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->defaultSort('created_at', 'desc')
->filters([
Tables\Filters\SelectFilter::make('kepemilikan_kip')
->options([
'Memiliki KIP' => 'Memiliki KIP',
'Tidak Memiliki KIP' => 'Tidak Memiliki KIP',
]),
Tables\Filters\SelectFilter::make('terdata_dtks')
->options([
'Terdata' => 'Terdata',
'Tidak Terdata' => 'Tidak Terdata',
]),
Tables\Filters\SelectFilter::make('tingkatan_desil')
->options([
'Desil 1' => 'Desil 1',
'Desil 2' => 'Desil 2',
'Desil 3' => 'Desil 3',
'Desil 4' => 'Desil 4',
'Desil 5' => 'Desil 5',
]),
Tables\Filters\SelectFilter::make('kondisi_ekonomi')
->options([
'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')
->options([
'Kedua Orang Tua Wafat' => 'Kedua Orang Tua Wafat',
'Salah Satu Orang Tua Wafat' => 'Salah Satu Orang Tua Wafat',
'Kedua Orang Tua Masih Hidup' => 'Kedua Orang Tua Masih Hidup',
]),
Tables\Filters\SelectFilter::make('status')
->options([
'belum_validasi' => 'Belum Validasi',
'valid' => 'Valid',
'tidak_valid' => 'Tidak Valid',
]),
Tables\Filters\SelectFilter::make('hasil')
->options([
'Diterima' => 'Diterima',
'Tidak Diterima' => 'Tidak Diterima',
]),
])
->actions([
Tables\Actions\Action::make('validasi')
->label('Validasi')
->icon('heroicon-o-clipboard-document-check')
->color('success')
->form([
Section::make('Data Mahasiswa')
->schema([
Select::make('mahasiswa_id')
->relationship('mahasiswa', 'nama')
->disabled()
->dehydrated(false),
]),
Section::make('Kepemilikan KIP')
->schema([
Radio::make('kepemilikan_kip')
->options([
'Memiliki KIP' => 'Memiliki KIP',
'Tidak Memiliki KIP' => 'Tidak Memiliki KIP',
])
->disabled()
->dehydrated(false),
FileUpload::make('berkas_kip')
->label('Bukti Kepemilikan KIP')
->disk('berkas')
->directory('kip')
->visibility('public')
->downloadable()
->openable()
->disabled()
->dehydrated(false),
]),
Section::make('Tingkatan Desil')
->schema([
Radio::make('terdata_dtks')
->options([
'Terdata' => 'Terdata',
'Tidak Terdata' => 'Tidak Terdata',
])
->disabled()
->dehydrated(false),
FileUpload::make('berkas_dtks')
->label('Bukti Terdata di DTKS')
->disk('berkas')
->directory('dtks')
->visibility('public')
->downloadable()
->openable()
->disabled()
->dehydrated(false),
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',
])
->disabled()
->dehydrated(false),
]),
Section::make('Upload Berkas Bukti Bantuan Pemerintah')
->schema([
FileUpload::make('berkas_1')
->label('Berkas Bukti 1')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->downloadable()
->openable()
->disabled()
->dehydrated(false),
FileUpload::make('berkas_2')
->label('Berkas Bukti 2')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->downloadable()
->openable()
->disabled()
->dehydrated(false),
FileUpload::make('berkas_3')
->label('Berkas Bukti 3')
->disk('berkas')
->directory('ekonomi')
->visibility('public')
->downloadable()
->openable()
->disabled()
->dehydrated(false),
]),
Section::make('Status Orang Tua')
->schema([
Grid::make(2)
->schema([
Fieldset::make('Status Ayah')
->schema([
Radio::make('status_ayah')
->options([
'Hidup' => 'Hidup',
'Wafat' => 'Wafat',
])
->disabled()
->dehydrated(false),
FileUpload::make('bukti_wafat_ayah')
->label('Bukti Kematian Ayah')
->disk('berkas')
->directory('wafat')
->visibility('public')
->downloadable()
->openable()
->disabled()
->dehydrated(false),
]),
Fieldset::make('Status Ibu')
->schema([
Radio::make('status_ibu')
->options([
'Hidup' => 'Hidup',
'Wafat' => 'Wafat',
])
->disabled()
->dehydrated(false),
FileUpload::make('bukti_wafat_ibu')
->label('Bukti Kematian Ibu')
->disk('berkas')
->directory('wafat')
->visibility('public')
->downloadable()
->openable()
->disabled()
->dehydrated(false),
]),
]),
]),
Section::make('Status Validasi')
->schema([
Radio::make('status')
->options([
'belum_validasi' => 'Belum Validasi',
'valid' => 'Valid',
'tidak_valid' => 'Tidak Valid',
])
->required()
->default('belum_validasi')
->reactive(),
Textarea::make('alasan_tidak_valid')
->label('Alasan Tidak Valid')
->placeholder('Masukkan alasan mengapa data tidak valid...')
->rows(3)
->required(fn (callable $get) => $get('status') === 'tidak_valid')
->visible(fn (callable $get) => $get('status') === 'tidak_valid'),
]),
])
->action(function (array $data, $record): void {
$record->update([
'status' => $data['status'],
'alasan_tidak_valid' => $data['status'] === 'tidak_valid' ? $data['alasan_tidak_valid'] : null,
]);
})
->modalSubmitActionLabel('Simpan Status Validasi')
->fillForm(fn ($record) => [
'mahasiswa_id' => $record->mahasiswa_id,
'kepemilikan_kip' => $record->kepemilikan_kip,
'berkas_kip' => $record->berkas_kip,
'terdata_dtks' => $record->terdata_dtks,
'berkas_dtks' => $record->berkas_dtks,
'tingkatan_desil' => $record->tingkatan_desil,
'berkas_1' => $record->berkas_1,
'berkas_2' => $record->berkas_2,
'berkas_3' => $record->berkas_3,
'status_ayah' => $record->status_ayah,
'bukti_wafat_ayah' => $record->bukti_wafat_ayah,
'status_ibu' => $record->status_ibu,
'bukti_wafat_ibu' => $record->bukti_wafat_ibu,
'status' => $record->status,
'alasan_tidak_valid' => $record->alasan_tidak_valid,
]),
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListParameters::route('/'),
'edit' => Pages\EditParameter::route('/{record}/edit'),
];
}
protected function mutateFormDataBeforeCreate(array $data): array
{
// Tentukan status orang tua berdasarkan status ayah dan ibu
if ($data['status_ayah'] === 'Wafat' && $data['status_ibu'] === 'Wafat') {
$data['status_orang_tua'] = 'Kedua Orang Tua Wafat';
} elseif ($data['status_ayah'] === 'Wafat' || $data['status_ibu'] === 'Wafat') {
$data['status_orang_tua'] = 'Salah Satu Orang Tua Wafat';
} else {
$data['status_orang_tua'] = 'Kedua Orang Tua Masih Hidup';
}
// Tentukan kondisi ekonomi berdasarkan jumlah berkas
$berkasCount = 0;
if (!empty($data['berkas_1'])) $berkasCount++;
if (!empty($data['berkas_2'])) $berkasCount++;
if (!empty($data['berkas_3'])) $berkasCount++;
if ($berkasCount >= 3) {
$data['kondisi_ekonomi'] = 'Sangat Kurang Mampu';
} elseif ($berkasCount >= 2) {
$data['kondisi_ekonomi'] = 'Kurang Mampu';
} elseif ($berkasCount >= 1) {
$data['kondisi_ekonomi'] = 'Cukup Mampu';
} else {
$data['kondisi_ekonomi'] = 'Tidak Menerima Bantuan';
}
return $data;
}
protected function mutateFormDataBeforeSave(array $data): array
{
// Tentukan status orang tua berdasarkan status ayah dan ibu
if ($data['status_ayah'] === 'Wafat' && $data['status_ibu'] === 'Wafat') {
$data['status_orang_tua'] = 'Kedua Orang Tua Wafat';
} elseif ($data['status_ayah'] === 'Wafat' || $data['status_ibu'] === 'Wafat') {
$data['status_orang_tua'] = 'Salah Satu Orang Tua Wafat';
} else {
$data['status_orang_tua'] = 'Kedua Orang Tua Masih Hidup';
}
// Tentukan kondisi ekonomi berdasarkan jumlah berkas
$berkasCount = 0;
if (!empty($data['berkas_1'])) $berkasCount++;
if (!empty($data['berkas_2'])) $berkasCount++;
if (!empty($data['berkas_3'])) $berkasCount++;
if ($berkasCount >= 3) {
$data['kondisi_ekonomi'] = 'Sangat Kurang Mampu';
} elseif ($berkasCount >= 2) {
$data['kondisi_ekonomi'] = 'Kurang Mampu';
} elseif ($berkasCount >= 1) {
$data['kondisi_ekonomi'] = 'Cukup Mampu';
} else {
$data['kondisi_ekonomi'] = 'Tidak Menerima Bantuan';
}
return $data;
}
}

View File

@ -1,12 +0,0 @@
<?php
namespace App\Filament\Resources\ParameterResource\Pages;
use App\Filament\Resources\ParameterResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateParameter extends CreateRecord
{
protected static string $resource = ParameterResource::class;
}

View File

@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\ParameterResource\Pages;
use App\Filament\Resources\ParameterResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditParameter extends EditRecord
{
protected static string $resource = ParameterResource::class;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -1,21 +0,0 @@
<?php
namespace App\Filament\Resources\ParameterResource\Pages;
use App\Filament\Resources\ParameterResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListParameters extends ListRecords
{
protected static string $resource = ParameterResource::class;
protected static ?string $title = 'Validasi Data';
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@ -1,11 +0,0 @@
<?php
namespace App\Filament\Resources\PengumumanResource\Pages;
use App\Filament\Resources\PengumumanResource;
use Filament\Resources\Pages\ListRecords;
class ListPengumuman extends ListRecords
{
protected static string $resource = PengumumanResource::class;
}

View File

@ -35,10 +35,6 @@ class SubKriteriaResource extends Resource
protected static ?string $slug = 'sub-kriteria';
protected static ?int $navigationSort = 2;
public static function canCreate(): bool
{
return false;
}
public static function form(Form $form): Form
{
@ -59,9 +55,7 @@ public static function form(Form $form): Form
->required(),
TextInput::make('bobot')
->numeric()
->disabled()
->helperText('Bobot akan dihitung otomatis oleh sistem')
// ->required(),
->required(),
]);
}

View File

@ -14,13 +14,12 @@
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Columns\TextColumn;
use Filament\Forms\Components\Select;
class UserResource extends Resource
{
protected static ?string $model = User::class;
protected static ?string $navigationIcon = 'heroicon-o-user';
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Data Master';
protected static ?string $slug = 'user';
@ -45,12 +44,7 @@ public static function form(Form $form): Form
TextInput::make('password')
->password()
->required()
->hiddenOn('edit'),
Select::make('roles')
->multiple()
->relationship('roles', 'name')
->preload()
->helperText('Biarkan kosong untuk role default (mahasiswa)'),
// ->hiddenOn('edit'),
]);
}
@ -64,9 +58,6 @@ public static function table(Table $table): Table
TextColumn::make('email')
->searchable()
->sortable(),
TextColumn::make('roles.name')
->badge()
->color('primary'),
TextColumn::make('password'),
TextColumn::make('created_at')
->dateTime()

View File

@ -1,10 +0,0 @@
<?php
namespace App\Filament\Widgets;
use Filament\Widgets\AccountWidget as BaseWidget;
class CustomAccountWidget extends BaseWidget
{
protected int | string | array $columnSpan = 'full';
}

View File

@ -1,56 +0,0 @@
<?php
namespace App\Filament\Widgets;
use App\Filament\Resources\SubKriteriaResource;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as BaseWidget;
use Filament\Tables\Columns\TextColumn;
class DataMaster extends BaseWidget
{
protected static ?int $sort = 5;
protected static ?string $maxHeight = null;
protected int | string | array $columnSpan = 'full';
protected static bool $isLazy = false;
public function table(Table $table): Table
{
return $table
->query(SubKriteriaResource::getEloquentQuery())
->defaultPaginationPageOption(5)
->columns([
TextColumn::make('kriteria.nama')
->label('Kriteria')
->sortable()
->searchable(),
TextColumn::make('nama')
->label('Sub Kriteria')
->sortable()
->searchable(),
TextColumn::make('deskripsi')
->sortable()
->searchable(),
TextColumn::make('prioritas')
->label('Prioritas')
->sortable(),
TextColumn::make('bobot')
->label('Bobot')
->formatStateUsing(fn ($state) => number_format($state, 4))
->sortable(),
])
->contentGrid([
'md' => 2,
'lg' => 3,
'xl' => 4,
])
->striped();
}
public static function canView(): bool
{
return true;
}
}

View File

@ -1,41 +0,0 @@
<?php
namespace App\Filament\Widgets;
use App\Models\Kriteria;
use App\Models\Mahasiswa;
use App\Models\SubKriteria;
use App\Models\parameter;
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
class TestWidget extends BaseWidget
{
protected function getStats(): array
{
return [
Stat::make('Kriteria', Kriteria::count()),
Stat::make('SubKriteria', Subkriteria::count()),
Stat::make('Jumlah Pendaftar', Mahasiswa::has('parameter')->count())
->description('Total Mahasiswa yang telah mendaftar')
->color('info')
->chart(Mahasiswa::has('parameter')
->selectRaw('DATE(created_at) as date, COUNT(*) as total')
->groupBy('date')
->orderBy('date')
->pluck('total')
->toArray()),
Stat::make('Validasi Data', Parameter::whereIn('status', ['valid', 'tidak_valid'])->count() . '/' . Parameter::count())
->description('Total data yang telah divalidasi')
// ->descriptionIcon('heroicon-m-check-circle')
->color('info')
->chart(Parameter::selectRaw('DATE(created_at) as date, COUNT(*) as total')
->whereIn('status', ['valid', 'tidak_valid'])
->groupBy('date')
->orderBy('date')
->pluck('total')
->toArray()),
];
}
}

View File

@ -1,32 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\StreamedResponse;
class PdfViewController extends Controller
{
public function show(Request $request)
{
$path = $request->query('path');
if (!$path) {
abort(404);
}
// Ambil file dari storage
$fullPath = storage_path('app/public/' . $path);
if (!file_exists($fullPath)) {
abort(404);
}
// Return file sebagai response dengan header yang sesuai
return response()->file($fullPath, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="' . basename($path) . '"'
]);
}
}

View File

@ -1,17 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\Parameter;
use Illuminate\Http\Request;
class PengumumanController extends Controller
{
public function show()
{
$pengumuman = Parameter::where('mahasiswa_id', auth()->user()->mahasiswa->id)
->first();
return view('pengumuman', compact('pengumuman'));
}
}

View File

@ -1,25 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Jurusan extends Model
{
use HasFactory;
protected $fillable = [
'nama'
];
public function prodis()
{
return $this->hasMany(Prodi::class);
}
public function mahasiswas()
{
return $this->hasMany(Mahasiswa::class);
}
}

View File

@ -1,27 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Prodi extends Model
{
use HasFactory;
protected $fillable = [
'nama',
'jurusan_id',
'akreditasi'
];
public function jurusan()
{
return $this->belongsTo(Jurusan::class);
}
public function mahasiswas()
{
return $this->hasMany(Mahasiswa::class);
}
}

View File

@ -6,12 +6,11 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable, HasRoles;
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.

18
app/Models/hasil.php Normal file
View File

@ -0,0 +1,18 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class hasil extends Model
{
use HasFactory;
protected $fillable = ['mahasiswa_id', 'total_bobot', 'status'];
public function mahasiswa()
{
return $this->belongsTo(mahasiswa::class);
}
}

View File

@ -4,81 +4,15 @@
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 $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;
}
protected $guarded = [];
// protected $fillable = [
// 'nama',
// 'prioritas',
// 'bobot'
// ];
}

87
app/Models/listform.php Normal file
View File

@ -0,0 +1,87 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Listform extends Model
{
use HasFactory;
protected $guarded = [];
protected $casts = [
'nilai_kepemilikan_kip' => '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;
});
}
}

View File

@ -5,41 +5,9 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Mahasiswa extends Model
class mahasiswa extends Model
{
use HasFactory;
protected $fillable = [
'user_id',
'noreg_kipk',
'nama',
'NIM',
'jurusan_id',
'prodi_id',
'akreditasi',
'angkatan',
'jalur_masuk',
'ponsel',
'alamat'
];
public function user()
{
return $this->belongsTo(User::class);
}
public function jurusan()
{
return $this->belongsTo(Jurusan::class);
}
public function prodi()
{
return $this->belongsTo(Prodi::class);
}
public function parameter()
{
return $this->hasOne(Parameter::class);
}
protected $guarded = [];
}

View File

@ -1,196 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\Storage;
class parameter extends Model
{
use HasFactory;
protected $guarded = [];
protected $appends = [
'berkas_kip_url',
'berkas_dtks_url',
'berkas_1_url',
'berkas_2_url',
'berkas_3_url',
'bukti_wafat_ayah_url',
'bukti_wafat_ibu_url',
];
protected $fillable = [
'mahasiswa_id',
'kepemilikan_kip',
'berkas_kip',
'terdata_dtks',
'berkas_dtks',
'tingkatan_desil',
'berkas_1',
'berkas_2',
'berkas_3',
'status_ayah',
'bukti_wafat_ayah',
'status_ibu',
'bukti_wafat_ibu',
'status',
'alasan_tidak_valid',
'kondisi_ekonomi',
'nilai_kondisi_ekonomi',
'status_orang_tua',
'nilai_status_orang_tua',
'total_nilai',
'hasil'
];
public function getBerkasKipUrlAttribute()
{
return $this->berkas_kip ? asset('berkas/' . $this->berkas_kip) : null;
}
public function getBerkasDtksUrlAttribute()
{
return $this->berkas_dtks ? asset('berkas/' . $this->berkas_dtks) : null;
}
public function getBerkas1UrlAttribute()
{
return $this->berkas_1 ? asset('berkas/' . $this->berkas_1) : null;
}
public function getBerkas2UrlAttribute()
{
return $this->berkas_2 ? asset('berkas/' . $this->berkas_2) : null;
}
public function getBerkas3UrlAttribute()
{
return $this->berkas_3 ? asset('berkas/' . $this->berkas_3) : null;
}
public function getBuktiWafatAyahUrlAttribute()
{
return $this->bukti_wafat_ayah ? asset('berkas/' . $this->bukti_wafat_ayah) : null;
}
public function getBuktiWafatIbuUrlAttribute()
{
return $this->bukti_wafat_ibu ? asset('berkas/' . $this->bukti_wafat_ibu) : null;
}
public function mahasiswa(): BelongsTo
{
return $this->belongsTo(Mahasiswa::class);
}
protected static function boot()
{
parent::boot();
static::saving(function ($parameter) {
// 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 'Terdata DTKS':
// Ambil SubKriteria berdasarkan status terdata DTKS
$subKriteria = SubKriteria::where('kriteria_id', $kriteria->id)
->where('nama', $parameter->terdata_dtks)
->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;
}
}
$parameter->total_nilai = $totalNilai;
// // Tentukan hasil berdasarkan total nilai ini kayanya engga dipake deh
// if ($totalNilai >= 0.75) {
// $parameter->hasil = 'Layak';
// } elseif ($totalNilai >= 0.5) {
// $parameter->hasil = 'Dipertimbangkan';
// } else {
// $parameter->hasil = 'Tidak Layak';
// }
});
}
}

View File

@ -4,8 +4,6 @@
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
{
@ -14,64 +12,18 @@ class SubKriteria extends Model
protected $table = 'subkriterias'; //soalnya buatnya manual
protected $guarded = [];
protected $fillable = [
'kriteria_id',
'nama',
'deskripsi',
'prioritas',
'bobot'
];
// protected $table = 'subkriterias';
// protected $fillable = [
// 'kriteria_id',
// 'nama',
// 'deskripsi',
// 'prioritas',
// 'bobot'
// ];
public function kriteria(): BelongsTo
public function kriteria()
{
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;
return $this->belongsTo(Kriteria::class, 'kriteria_id');
}
}

View File

@ -1,108 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Formulir;
use Illuminate\Auth\Access\HandlesAuthorization;
class FormulirPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_formulir');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Formulir $formulir): bool
{
return $user->can('view_formulir');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->can('create_formulir');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Formulir $formulir): bool
{
return $user->can('update_formulir');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Formulir $formulir): bool
{
return $user->can('delete_formulir');
}
/**
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_formulir');
}
/**
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Formulir $formulir): bool
{
return $user->can('force_delete_formulir');
}
/**
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('force_delete_any_formulir');
}
/**
* Determine whether the user can restore.
*/
public function restore(User $user, Formulir $formulir): bool
{
return $user->can('restore_formulir');
}
/**
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{
return $user->can('restore_any_formulir');
}
/**
* Determine whether the user can replicate.
*/
public function replicate(User $user, Formulir $formulir): bool
{
return $user->can('replicate_formulir');
}
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_formulir');
}
}

View File

@ -1,108 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Parameter;
use Illuminate\Auth\Access\HandlesAuthorization;
class HasilPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_hasil');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Parameter $parameter): bool
{
return $user->can('view_hasil');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->can('create_hasil');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Parameter $parameter): bool
{
return $user->can('update_hasil');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Parameter $parameter): bool
{
return $user->can('delete_hasil');
}
/**
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_hasil');
}
/**
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Parameter $parameter): bool
{
return $user->can('force_delete_hasil');
}
/**
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('force_delete_any_hasil');
}
/**
* Determine whether the user can restore.
*/
public function restore(User $user, Parameter $parameter): bool
{
return $user->can('restore_hasil');
}
/**
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{
return $user->can('restore_any_hasil');
}
/**
* Determine whether the user can replicate.
*/
public function replicate(User $user, Parameter $parameter): bool
{
return $user->can('replicate_hasil');
}
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_hasil');
}
}

View File

@ -1,108 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Kriteria;
use Illuminate\Auth\Access\HandlesAuthorization;
class KriteriaPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_kriteria');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Kriteria $kriteria): bool
{
return $user->can('view_kriteria');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->can('create_kriteria');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Kriteria $kriteria): bool
{
return $user->can('update_kriteria');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Kriteria $kriteria): bool
{
return $user->can('delete_kriteria');
}
/**
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_kriteria');
}
/**
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Kriteria $kriteria): bool
{
return $user->can('force_delete_kriteria');
}
/**
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('force_delete_any_kriteria');
}
/**
* Determine whether the user can restore.
*/
public function restore(User $user, Kriteria $kriteria): bool
{
return $user->can('restore_kriteria');
}
/**
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{
return $user->can('restore_any_kriteria');
}
/**
* Determine whether the user can replicate.
*/
public function replicate(User $user, Kriteria $kriteria): bool
{
return $user->can('replicate_kriteria');
}
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_kriteria');
}
}

View File

@ -1,108 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Mahasiswa;
use Illuminate\Auth\Access\HandlesAuthorization;
class MahasiswaPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_mahasiswa');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Mahasiswa $mahasiswa): bool
{
return $user->can('view_mahasiswa');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->can('create_mahasiswa');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Mahasiswa $mahasiswa): bool
{
return $user->can('update_mahasiswa');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Mahasiswa $mahasiswa): bool
{
return $user->can('delete_mahasiswa');
}
/**
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_mahasiswa');
}
/**
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Mahasiswa $mahasiswa): bool
{
return $user->can('force_delete_mahasiswa');
}
/**
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('force_delete_any_mahasiswa');
}
/**
* Determine whether the user can restore.
*/
public function restore(User $user, Mahasiswa $mahasiswa): bool
{
return $user->can('restore_mahasiswa');
}
/**
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{
return $user->can('restore_any_mahasiswa');
}
/**
* Determine whether the user can replicate.
*/
public function replicate(User $user, Mahasiswa $mahasiswa): bool
{
return $user->can('replicate_mahasiswa');
}
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_mahasiswa');
}
}

View File

@ -1,108 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Parameter;
use Illuminate\Auth\Access\HandlesAuthorization;
class PengumumanPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_pengumuman');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Parameter $parameter): bool
{
return $user->can('view_pengumuman');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->can('create_pengumuman');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Parameter $parameter): bool
{
return $user->can('update_pengumuman');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Parameter $parameter): bool
{
return $user->can('delete_pengumuman');
}
/**
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_pengumuman');
}
/**
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Parameter $parameter): bool
{
return $user->can('force_delete_pengumuman');
}
/**
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('force_delete_any_pengumuman');
}
/**
* Determine whether the user can restore.
*/
public function restore(User $user, Parameter $parameter): bool
{
return $user->can('restore_pengumuman');
}
/**
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{
return $user->can('restore_any_pengumuman');
}
/**
* Determine whether the user can replicate.
*/
public function replicate(User $user, Parameter $parameter): bool
{
return $user->can('replicate_pengumuman');
}
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_pengumuman');
}
}

View File

@ -1,108 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use Spatie\Permission\Models\Role;
use Illuminate\Auth\Access\HandlesAuthorization;
class RolePolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_role');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Role $role): bool
{
return $user->can('view_role');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->can('create_role');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Role $role): bool
{
return $user->can('update_role');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Role $role): bool
{
return $user->can('delete_role');
}
/**
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_role');
}
/**
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Role $role): bool
{
return $user->can('{{ ForceDelete }}');
}
/**
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('{{ ForceDeleteAny }}');
}
/**
* Determine whether the user can restore.
*/
public function restore(User $user, Role $role): bool
{
return $user->can('{{ Restore }}');
}
/**
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{
return $user->can('{{ RestoreAny }}');
}
/**
* Determine whether the user can replicate.
*/
public function replicate(User $user, Role $role): bool
{
return $user->can('{{ Replicate }}');
}
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('{{ Reorder }}');
}
}

View File

@ -1,108 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\SubKriteria;
use Illuminate\Auth\Access\HandlesAuthorization;
class SubKriteriaPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_sub::kriteria');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, SubKriteria $subKriteria): bool
{
return $user->can('view_sub::kriteria');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->can('create_sub::kriteria');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, SubKriteria $subKriteria): bool
{
return $user->can('update_sub::kriteria');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, SubKriteria $subKriteria): bool
{
return $user->can('delete_sub::kriteria');
}
/**
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_sub::kriteria');
}
/**
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, SubKriteria $subKriteria): bool
{
return $user->can('force_delete_sub::kriteria');
}
/**
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('force_delete_any_sub::kriteria');
}
/**
* Determine whether the user can restore.
*/
public function restore(User $user, SubKriteria $subKriteria): bool
{
return $user->can('restore_sub::kriteria');
}
/**
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{
return $user->can('restore_any_sub::kriteria');
}
/**
* Determine whether the user can replicate.
*/
public function replicate(User $user, SubKriteria $subKriteria): bool
{
return $user->can('replicate_sub::kriteria');
}
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_sub::kriteria');
}
}

View File

@ -1,144 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class UserPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*
* @param \App\Models\User $user
* @return bool
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_user');
}
/**
* Determine whether the user can view the model.
*
* @param \App\Models\User $user
* @return bool
*/
public function view(User $user): bool
{
return $user->can('view_user');
}
/**
* Determine whether the user can create models.
*
* @param \App\Models\User $user
* @return bool
*/
public function create(User $user): bool
{
return $user->can('create_user');
}
/**
* Determine whether the user can update the model.
*
* @param \App\Models\User $user
* @return bool
*/
public function update(User $user): bool
{
return $user->can('update_user');
}
/**
* Determine whether the user can delete the model.
*
* @param \App\Models\User $user
* @return bool
*/
public function delete(User $user): bool
{
return $user->can('delete_user');
}
/**
* Determine whether the user can bulk delete.
*
* @param \App\Models\User $user
* @return bool
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_user');
}
/**
* Determine whether the user can permanently delete.
*
* @param \App\Models\User $user
* @return bool
*/
public function forceDelete(User $user): bool
{
return $user->can('force_delete_user');
}
/**
* Determine whether the user can permanently bulk delete.
*
* @param \App\Models\User $user
* @return bool
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('force_delete_any_user');
}
/**
* Determine whether the user can restore.
*
* @param \App\Models\User $user
* @return bool
*/
public function restore(User $user): bool
{
return $user->can('restore_user');
}
/**
* Determine whether the user can bulk restore.
*
* @param \App\Models\User $user
* @return bool
*/
public function restoreAny(User $user): bool
{
return $user->can('restore_any_user');
}
/**
* Determine whether the user can bulk restore.
*
* @param \App\Models\User $user
* @return bool
*/
public function replicate(User $user): bool
{
return $user->can('replicate_user');
}
/**
* Determine whether the user can reorder.
*
* @param \App\Models\User $user
* @return bool
*/
public function reorder(User $user): bool
{
return $user->can('reorder_user');
}
}

View File

@ -1,108 +0,0 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Parameter;
use Illuminate\Auth\Access\HandlesAuthorization;
class ParameterPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->can('view_any_pengumuman');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Parameter $parameter): bool
{
return $user->can('view_pengumuman');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->can('create_pengumuman');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Parameter $parameter): bool
{
return $user->can('update_pengumuman');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Parameter $parameter): bool
{
return $user->can('delete_pengumuman');
}
/**
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{
return $user->can('delete_any_pengumuman');
}
/**
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Parameter $parameter): bool
{
return $user->can('force_delete_pengumuman');
}
/**
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{
return $user->can('force_delete_any_pengumuman');
}
/**
* Determine whether the user can restore.
*/
public function restore(User $user, Parameter $parameter): bool
{
return $user->can('restore_pengumuman');
}
/**
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{
return $user->can('restore_any_pengumuman');
}
/**
* Determine whether the user can replicate.
*/
public function replicate(User $user, Parameter $parameter): bool
{
return $user->can('replicate_pengumuman');
}
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_pengumuman');
}
}

View File

@ -2,7 +2,6 @@
namespace App\Providers\Filament;
use BezhanSalleh\FilamentShield\FilamentShieldPlugin;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\AuthenticateSession;
use Filament\Http\Middleware\DisableBladeIconComponents;
@ -18,9 +17,6 @@
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
use App\Filament\Pages\WizardForm;
use App\Filament\Widgets\CustomAccountWidget;
use App\Filament\Pages\Auth\Register;
class AdminPanelProvider extends PanelProvider
{
@ -31,21 +27,18 @@ public function panel(Panel $panel): Panel
->id('admin')
->path('admin')
->login()
->registration(Register::class)
->plugin(FilamentShieldPlugin::make())
->brandLogo(asset('images/logo-polije.png'))
->brandLogoHeight('3rem')
->colors([
'primary' => Color::Blue,
'primary' => Color::Amber,
])
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
->pages([
WizardForm::class,
Pages\Dashboard::class,
])
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
->widgets([
CustomAccountWidget::class,
Widgets\AccountWidget::class,
Widgets\FilamentInfoWidget::class,
])
->spa()
->middleware([
@ -61,10 +54,6 @@ public function panel(Panel $panel): Panel
])
->authMiddleware([
Authenticate::class,
])
->sidebarCollapsibleOnDesktop()
->plugins([
\BezhanSalleh\FilamentShield\FilamentShieldPlugin::make(),
]);
}
}

0
artisan Normal file → Executable file
View File

View File

@ -7,17 +7,12 @@
"license": "MIT",
"require": {
"php": "^8.2",
"barryvdh/laravel-dompdf": "^3.1",
"bezhansalleh/filament-shield": "^3.3",
"filament/filament": "^3.2",
"laravel/framework": "^11.31",
"laravel/tinker": "^2.9",
"phpoffice/phpspreadsheet": "*",
"spatie/laravel-permission": "*"
"laravel/tinker": "^2.9"
},
"require-dev": {
"fakerphp/faker": "^1.23",
"laravel/breeze": "*",
"laravel/pail": "^1.1",
"laravel/pint": "^1.13",
"laravel/sail": "^1.26",

900
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "57dba14cea890cadf8142ea60b0ac958",
"content-hash": "0cefc8f8c8f7320e732db22110e017ed",
"packages": [
{
"name": "anourvalar/eloquent-serialize",
@ -72,170 +72,6 @@
},
"time": "2025-02-25T05:18:46+00:00"
},
{
"name": "barryvdh/laravel-dompdf",
"version": "v3.1.1",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-dompdf.git",
"reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d",
"reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d",
"shasum": ""
},
"require": {
"dompdf/dompdf": "^3.0",
"illuminate/support": "^9|^10|^11|^12",
"php": "^8.1"
},
"require-dev": {
"larastan/larastan": "^2.7|^3.0",
"orchestra/testbench": "^7|^8|^9|^10",
"phpro/grumphp": "^2.5",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"PDF": "Barryvdh\\DomPDF\\Facade\\Pdf",
"Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf"
},
"providers": [
"Barryvdh\\DomPDF\\ServiceProvider"
]
},
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"Barryvdh\\DomPDF\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "A DOMPDF Wrapper for Laravel",
"keywords": [
"dompdf",
"laravel",
"pdf"
],
"support": {
"issues": "https://github.com/barryvdh/laravel-dompdf/issues",
"source": "https://github.com/barryvdh/laravel-dompdf/tree/v3.1.1"
},
"funding": [
{
"url": "https://fruitcake.nl",
"type": "custom"
},
{
"url": "https://github.com/barryvdh",
"type": "github"
}
],
"time": "2025-02-13T15:07:54+00:00"
},
{
"name": "bezhansalleh/filament-shield",
"version": "3.3.5",
"source": {
"type": "git",
"url": "https://github.com/bezhanSalleh/filament-shield.git",
"reference": "88b6714e4d14abcb614ff3ac45114866763d1ba5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bezhanSalleh/filament-shield/zipball/88b6714e4d14abcb614ff3ac45114866763d1ba5",
"reference": "88b6714e4d14abcb614ff3ac45114866763d1ba5",
"shasum": ""
},
"require": {
"filament/filament": "^3.2",
"php": "^8.1",
"spatie/laravel-package-tools": "^1.9",
"spatie/laravel-permission": "^6.0"
},
"require-dev": {
"larastan/larastan": "^2.0",
"laravel/pint": "^1.0",
"nunomaduro/collision": "^7.0|^8.0",
"orchestra/testbench": "^8.0|^9.0",
"pestphp/pest": "^2.34",
"pestphp/pest-plugin-laravel": "^2.3",
"phpstan/extension-installer": "^1.3",
"phpstan/phpstan-deprecation-rules": "^1.1",
"phpstan/phpstan-phpunit": "^1.3",
"phpunit/phpunit": "^10.1",
"spatie/laravel-ray": "^1.37"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"FilamentShield": "BezhanSalleh\\FilamentShield\\Facades\\FilamentShield"
},
"providers": [
"BezhanSalleh\\FilamentShield\\FilamentShieldServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"BezhanSalleh\\FilamentShield\\": "src",
"BezhanSalleh\\FilamentShield\\Database\\Factories\\": "database/factories"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Bezhan Salleh",
"email": "bezhan_salleh@yahoo.com",
"role": "Developer"
}
],
"description": "Filament support for `spatie/laravel-permission`.",
"homepage": "https://github.com/bezhansalleh/filament-shield",
"keywords": [
"acl",
"bezhanSalleh",
"filament",
"filament-shield",
"laravel",
"permission",
"permissions",
"rbac",
"roles",
"security"
],
"support": {
"issues": "https://github.com/bezhanSalleh/filament-shield/issues",
"source": "https://github.com/bezhanSalleh/filament-shield/tree/3.3.5"
},
"funding": [
{
"url": "https://github.com/bezhanSalleh",
"type": "github"
}
],
"time": "2025-02-17T21:06:24+00:00"
},
{
"name": "blade-ui-kit/blade-heroicons",
"version": "2.6.0",
@ -515,85 +351,6 @@
],
"time": "2024-02-09T16:56:22+00:00"
},
{
"name": "composer/pcre",
"version": "3.3.2",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
},
"conflict": {
"phpstan/phpstan": "<1.11.10"
},
"require-dev": {
"phpstan/phpstan": "^1.12 || ^2",
"phpstan/phpstan-strict-rules": "^1 || ^2",
"phpunit/phpunit": "^8 || ^9"
},
"type": "library",
"extra": {
"phpstan": {
"includes": [
"extension.neon"
]
},
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Pcre\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
}
],
"description": "PCRE wrapping library that offers type-safe preg_* replacements.",
"keywords": [
"PCRE",
"preg",
"regex",
"regular expression"
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.3.2"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
"type": "tidelift"
}
],
"time": "2024-11-12T16:29:46+00:00"
},
{
"name": "danharrin/date-format-converter",
"version": "v0.3.1",
@ -1093,161 +850,6 @@
],
"time": "2024-02-05T11:56:58+00:00"
},
{
"name": "dompdf/dompdf",
"version": "v3.1.0",
"source": {
"type": "git",
"url": "https://github.com/dompdf/dompdf.git",
"reference": "a51bd7a063a65499446919286fb18b518177155a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/dompdf/zipball/a51bd7a063a65499446919286fb18b518177155a",
"reference": "a51bd7a063a65499446919286fb18b518177155a",
"shasum": ""
},
"require": {
"dompdf/php-font-lib": "^1.0.0",
"dompdf/php-svg-lib": "^1.0.0",
"ext-dom": "*",
"ext-mbstring": "*",
"masterminds/html5": "^2.0",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"ext-gd": "*",
"ext-json": "*",
"ext-zip": "*",
"mockery/mockery": "^1.3",
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11",
"squizlabs/php_codesniffer": "^3.5",
"symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0"
},
"suggest": {
"ext-gd": "Needed to process images",
"ext-gmagick": "Improves image processing performance",
"ext-imagick": "Improves image processing performance",
"ext-zlib": "Needed for pdf stream compression"
},
"type": "library",
"autoload": {
"psr-4": {
"Dompdf\\": "src/"
},
"classmap": [
"lib/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1"
],
"authors": [
{
"name": "The Dompdf Community",
"homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md"
}
],
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
"homepage": "https://github.com/dompdf/dompdf",
"support": {
"issues": "https://github.com/dompdf/dompdf/issues",
"source": "https://github.com/dompdf/dompdf/tree/v3.1.0"
},
"time": "2025-01-15T14:09:04+00:00"
},
{
"name": "dompdf/php-font-lib",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/dompdf/php-font-lib.git",
"reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
"reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6"
},
"type": "library",
"autoload": {
"psr-4": {
"FontLib\\": "src/FontLib"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-or-later"
],
"authors": [
{
"name": "The FontLib Community",
"homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md"
}
],
"description": "A library to read, parse, export and make subsets of different types of font files.",
"homepage": "https://github.com/dompdf/php-font-lib",
"support": {
"issues": "https://github.com/dompdf/php-font-lib/issues",
"source": "https://github.com/dompdf/php-font-lib/tree/1.0.1"
},
"time": "2024-12-02T14:37:59+00:00"
},
{
"name": "dompdf/php-svg-lib",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/dompdf/php-svg-lib.git",
"reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/eb045e518185298eb6ff8d80d0d0c6b17aecd9af",
"reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^7.1 || ^8.0",
"sabberworm/php-css-parser": "^8.4"
},
"require-dev": {
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Svg\\": "src/Svg"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0-or-later"
],
"authors": [
{
"name": "The SvgLib Community",
"homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md"
}
],
"description": "A library to read, parse and export to PDF SVG files.",
"homepage": "https://github.com/dompdf/php-svg-lib",
"support": {
"issues": "https://github.com/dompdf/php-svg-lib/issues",
"source": "https://github.com/dompdf/php-svg-lib/tree/1.0.0"
},
"time": "2024-04-29T13:26:35+00:00"
},
{
"name": "dragonmantank/cron-expression",
"version": "v3.4.0",
@ -3538,191 +3140,6 @@
],
"time": "2025-03-04T21:48:52+00:00"
},
{
"name": "maennchen/zipstream-php",
"version": "3.1.2",
"source": {
"type": "git",
"url": "https://github.com/maennchen/ZipStream-PHP.git",
"reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f",
"reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"ext-zlib": "*",
"php-64bit": "^8.2"
},
"require-dev": {
"brianium/paratest": "^7.7",
"ext-zip": "*",
"friendsofphp/php-cs-fixer": "^3.16",
"guzzlehttp/guzzle": "^7.5",
"mikey179/vfsstream": "^1.6",
"php-coveralls/php-coveralls": "^2.5",
"phpunit/phpunit": "^11.0",
"vimeo/psalm": "^6.0"
},
"suggest": {
"guzzlehttp/psr7": "^2.4",
"psr/http-message": "^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"ZipStream\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paul Duncan",
"email": "pabs@pablotron.org"
},
{
"name": "Jonatan Männchen",
"email": "jonatan@maennchen.ch"
},
{
"name": "Jesse Donat",
"email": "donatj@gmail.com"
},
{
"name": "András Kolesár",
"email": "kolesar@kolesar.hu"
}
],
"description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
"keywords": [
"stream",
"zip"
],
"support": {
"issues": "https://github.com/maennchen/ZipStream-PHP/issues",
"source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2"
},
"funding": [
{
"url": "https://github.com/maennchen",
"type": "github"
}
],
"time": "2025-01-27T12:07:53+00:00"
},
{
"name": "markbaker/complex",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPComplex.git",
"reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
"reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"phpcompatibility/php-compatibility": "^9.3",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Complex\\": "classes/src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@lange.demon.co.uk"
}
],
"description": "PHP Class for working with complex numbers",
"homepage": "https://github.com/MarkBaker/PHPComplex",
"keywords": [
"complex",
"mathematics"
],
"support": {
"issues": "https://github.com/MarkBaker/PHPComplex/issues",
"source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
},
"time": "2022-12-06T16:21:08+00:00"
},
{
"name": "markbaker/matrix",
"version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPMatrix.git",
"reference": "728434227fe21be27ff6d86621a1b13107a2562c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
"reference": "728434227fe21be27ff6d86621a1b13107a2562c",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"phpcompatibility/php-compatibility": "^9.3",
"phpdocumentor/phpdocumentor": "2.*",
"phploc/phploc": "^4.0",
"phpmd/phpmd": "2.*",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"sebastian/phpcpd": "^4.0",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Matrix\\": "classes/src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@demon-angel.eu"
}
],
"description": "PHP Class for working with matrices",
"homepage": "https://github.com/MarkBaker/PHPMatrix",
"keywords": [
"mathematics",
"matrix",
"vector"
],
"support": {
"issues": "https://github.com/MarkBaker/PHPMatrix/issues",
"source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
},
"time": "2022-12-02T22:17:43+00:00"
},
{
"name": "masterminds/html5",
"version": "2.9.0",
@ -4385,112 +3802,6 @@
],
"time": "2025-01-30T13:51:11+00:00"
},
{
"name": "phpoffice/phpspreadsheet",
"version": "4.2.0",
"source": {
"type": "git",
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
"reference": "5f6d7410e5fd72cac1aa67d4f05f4fe664d01ba6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/5f6d7410e5fd72cac1aa67d4f05f4fe664d01ba6",
"reference": "5f6d7410e5fd72cac1aa67d4f05f4fe664d01ba6",
"shasum": ""
},
"require": {
"composer/pcre": "^1||^2||^3",
"ext-ctype": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"ext-gd": "*",
"ext-iconv": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"ext-xmlreader": "*",
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*",
"maennchen/zipstream-php": "^2.1 || ^3.0",
"markbaker/complex": "^3.0",
"markbaker/matrix": "^3.0",
"php": "^8.1",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
"psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-main",
"dompdf/dompdf": "^2.0 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.2",
"mitoteam/jpgraph": "^10.3",
"mpdf/mpdf": "^8.1.1",
"phpcompatibility/php-compatibility": "^9.3",
"phpstan/phpstan": "^1.1 || ^2.0",
"phpstan/phpstan-deprecation-rules": "^1.0 || ^2.0",
"phpstan/phpstan-phpunit": "^1.0 || ^2.0",
"phpunit/phpunit": "^10.5",
"squizlabs/php_codesniffer": "^3.7",
"tecnickcom/tcpdf": "^6.5"
},
"suggest": {
"dompdf/dompdf": "Option for rendering PDF with PDF Writer",
"ext-intl": "PHP Internationalization Functions",
"mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
"tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
},
"type": "library",
"autoload": {
"psr-4": {
"PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Maarten Balliauw",
"homepage": "https://blog.maartenballiauw.be"
},
{
"name": "Mark Baker",
"homepage": "https://markbakeruk.net"
},
{
"name": "Franck Lefevre",
"homepage": "https://rootslabs.net"
},
{
"name": "Erik Tilt"
},
{
"name": "Adrien Crivelli"
}
],
"description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
"homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
"keywords": [
"OpenXML",
"excel",
"gnumeric",
"ods",
"php",
"spreadsheet",
"xls",
"xlsx"
],
"support": {
"issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
"source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/4.2.0"
},
"time": "2025-04-17T02:41:45+00:00"
},
{
"name": "phpoption/phpoption",
"version": "1.9.3",
@ -5396,71 +4707,6 @@
],
"time": "2025-02-25T09:09:36+00:00"
},
{
"name": "sabberworm/php-css-parser",
"version": "v8.8.0",
"source": {
"type": "git",
"url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
"reference": "3de493bdddfd1f051249af725c7e0d2c38fed740"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/3de493bdddfd1f051249af725c7e0d2c38fed740",
"reference": "3de493bdddfd1f051249af725c7e0d2c38fed740",
"shasum": ""
},
"require": {
"ext-iconv": "*",
"php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
},
"require-dev": {
"phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41"
},
"suggest": {
"ext-mbstring": "for parsing UTF-8 CSS"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "9.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Sabberworm\\CSS\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Raphael Schweikert"
},
{
"name": "Oliver Klee",
"email": "github@oliverklee.de"
},
{
"name": "Jake Hotson",
"email": "jake.github@qzdesign.co.uk"
}
],
"description": "Parser for CSS Files written in PHP",
"homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser",
"keywords": [
"css",
"parser",
"stylesheet"
],
"support": {
"issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues",
"source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.8.0"
},
"time": "2025-03-23T17:59:05+00:00"
},
{
"name": "spatie/color",
"version": "1.8.0",
@ -5639,89 +4885,6 @@
],
"time": "2025-02-06T14:58:20+00:00"
},
{
"name": "spatie/laravel-permission",
"version": "6.17.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-permission.git",
"reference": "02ada8f638b643713fa2fb543384738e27346ddb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-permission/zipball/02ada8f638b643713fa2fb543384738e27346ddb",
"reference": "02ada8f638b643713fa2fb543384738e27346ddb",
"shasum": ""
},
"require": {
"illuminate/auth": "^8.12|^9.0|^10.0|^11.0|^12.0",
"illuminate/container": "^8.12|^9.0|^10.0|^11.0|^12.0",
"illuminate/contracts": "^8.12|^9.0|^10.0|^11.0|^12.0",
"illuminate/database": "^8.12|^9.0|^10.0|^11.0|^12.0",
"php": "^8.0"
},
"require-dev": {
"laravel/passport": "^11.0|^12.0",
"laravel/pint": "^1.0",
"orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0",
"phpunit/phpunit": "^9.4|^10.1|^11.5"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Spatie\\Permission\\PermissionServiceProvider"
]
},
"branch-alias": {
"dev-main": "6.x-dev",
"dev-master": "6.x-dev"
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Spatie\\Permission\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
}
],
"description": "Permission handling for Laravel 8.0 and up",
"homepage": "https://github.com/spatie/laravel-permission",
"keywords": [
"acl",
"laravel",
"permission",
"permissions",
"rbac",
"roles",
"security",
"spatie"
],
"support": {
"issues": "https://github.com/spatie/laravel-permission/issues",
"source": "https://github.com/spatie/laravel-permission/tree/6.17.0"
},
"funding": [
{
"url": "https://github.com/spatie",
"type": "github"
}
],
"time": "2025-04-08T15:06:14+00:00"
},
{
"name": "symfony/clock",
"version": "v7.2.0",
@ -8477,67 +7640,6 @@
},
"time": "2020-07-09T08:09:16+00:00"
},
{
"name": "laravel/breeze",
"version": "v2.3.6",
"source": {
"type": "git",
"url": "https://github.com/laravel/breeze.git",
"reference": "390cbc433cb72fa6050965000b2d56c9ba6fd713"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/breeze/zipball/390cbc433cb72fa6050965000b2d56c9ba6fd713",
"reference": "390cbc433cb72fa6050965000b2d56c9ba6fd713",
"shasum": ""
},
"require": {
"illuminate/console": "^11.0|^12.0",
"illuminate/filesystem": "^11.0|^12.0",
"illuminate/support": "^11.0|^12.0",
"illuminate/validation": "^11.0|^12.0",
"php": "^8.2.0",
"symfony/console": "^7.0"
},
"require-dev": {
"laravel/framework": "^11.0|^12.0",
"orchestra/testbench-core": "^9.0|^10.0",
"phpstan/phpstan": "^2.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Laravel\\Breeze\\BreezeServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Laravel\\Breeze\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"description": "Minimal Laravel authentication scaffolding with Blade and Tailwind.",
"keywords": [
"auth",
"laravel"
],
"support": {
"issues": "https://github.com/laravel/breeze/issues",
"source": "https://github.com/laravel/breeze"
},
"time": "2025-03-06T14:02:32+00:00"
},
{
"name": "laravel/pail",
"version": "v1.2.2",

View File

@ -1,91 +0,0 @@
<?php
return [
'shield_resource' => [
'should_register_navigation' => false,
'slug' => 'shield/roles',
'navigation_sort' => 4,
'navigation_badge' => true,
'navigation_group' => true,
'is_globally_searchable' => false,
'show_model_path' => true,
'is_scoped_to_tenant' => true,
'cluster' => null,
],
'tenant_model' => null,
'auth_provider_model' => [
'fqcn' => 'App\\Models\\User',
],
'super_admin' => [
'enabled' => true,
'name' => 'super_admin',
'define_via_gate' => false,
'intercept_gate' => 'before', // after
],
'panel_user' => [
'enabled' => true,
'name' => 'panel_user',
],
'permission_prefixes' => [
'resource' => [
'view',
'view_any',
'create',
'update',
'restore',
'restore_any',
'replicate',
'reorder',
'delete',
'delete_any',
'force_delete',
'force_delete_any',
],
'page' => 'page',
'widget' => 'widget',
],
'entities' => [
'pages' => true,
'widgets' => true,
'resources' => true,
'custom_permissions' => false,
],
'generator' => [
'option' => 'policies_and_permissions',
'policy_directory' => 'Policies',
'policy_namespace' => 'Policies',
],
'exclude' => [
'enabled' => true,
'pages' => [
// Hapus Dashboard dari sini
],
'widgets' => [
'AccountWidget', 'FilamentInfoWidget',
],
'resources' => [],
],
'discovery' => [
'discover_all_resources' => false,
'discover_all_widgets' => false,
'discover_all_pages' => false,
],
'register_role_policy' => [
'enabled' => true,
],
];

View File

@ -60,13 +60,6 @@
'report' => false,
],
'berkas' => [
'driver' => 'local',
'root' => storage_path('app/berkas'),
'url' => env('APP_URL').'/storage/berkas',
'visibility' => 'public',
],
],
/*
@ -82,7 +75,6 @@
'links' => [
public_path('storage') => storage_path('app/public'),
public_path('berkas') => storage_path('app/berkas'),
],
];

View File

@ -1,202 +0,0 @@
<?php
return [
'models' => [
/*
* When using the "HasPermissions" trait from this package, we need to know which
* Eloquent model should be used to retrieve your permissions. Of course, it
* is often just the "Permission" model but you may use whatever you like.
*
* The model you want to use as a Permission model needs to implement the
* `Spatie\Permission\Contracts\Permission` contract.
*/
'permission' => Spatie\Permission\Models\Permission::class,
/*
* When using the "HasRoles" trait from this package, we need to know which
* Eloquent model should be used to retrieve your roles. Of course, it
* is often just the "Role" model but you may use whatever you like.
*
* The model you want to use as a Role model needs to implement the
* `Spatie\Permission\Contracts\Role` contract.
*/
'role' => Spatie\Permission\Models\Role::class,
],
'table_names' => [
/*
* When using the "HasRoles" trait from this package, we need to know which
* table should be used to retrieve your roles. We have chosen a basic
* default value but you may easily change it to any table you like.
*/
'roles' => 'roles',
/*
* When using the "HasPermissions" trait from this package, we need to know which
* table should be used to retrieve your permissions. We have chosen a basic
* default value but you may easily change it to any table you like.
*/
'permissions' => 'permissions',
/*
* When using the "HasPermissions" trait from this package, we need to know which
* table should be used to retrieve your models permissions. We have chosen a
* basic default value but you may easily change it to any table you like.
*/
'model_has_permissions' => 'model_has_permissions',
/*
* When using the "HasRoles" trait from this package, we need to know which
* table should be used to retrieve your models roles. We have chosen a
* basic default value but you may easily change it to any table you like.
*/
'model_has_roles' => 'model_has_roles',
/*
* When using the "HasRoles" trait from this package, we need to know which
* table should be used to retrieve your roles permissions. We have chosen a
* basic default value but you may easily change it to any table you like.
*/
'role_has_permissions' => 'role_has_permissions',
],
'column_names' => [
/*
* Change this if you want to name the related pivots other than defaults
*/
'role_pivot_key' => null, // default 'role_id',
'permission_pivot_key' => null, // default 'permission_id',
/*
* Change this if you want to name the related model primary key other than
* `model_id`.
*
* For example, this would be nice if your primary keys are all UUIDs. In
* that case, name this `model_uuid`.
*/
'model_morph_key' => 'model_id',
/*
* Change this if you want to use the teams feature and your related model's
* foreign key is other than `team_id`.
*/
'team_foreign_key' => 'team_id',
],
/*
* When set to true, the method for checking permissions will be registered on the gate.
* Set this to false if you want to implement custom logic for checking permissions.
*/
'register_permission_check_method' => true,
/*
* When set to true, Laravel\Octane\Events\OperationTerminated event listener will be registered
* this will refresh permissions on every TickTerminated, TaskTerminated and RequestTerminated
* NOTE: This should not be needed in most cases, but an Octane/Vapor combination benefited from it.
*/
'register_octane_reset_listener' => false,
/*
* Events will fire when a role or permission is assigned/unassigned:
* \Spatie\Permission\Events\RoleAttached
* \Spatie\Permission\Events\RoleDetached
* \Spatie\Permission\Events\PermissionAttached
* \Spatie\Permission\Events\PermissionDetached
*
* To enable, set to true, and then create listeners to watch these events.
*/
'events_enabled' => false,
/*
* Teams Feature.
* When set to true the package implements teams using the 'team_foreign_key'.
* If you want the migrations to register the 'team_foreign_key', you must
* set this to true before doing the migration.
* If you already did the migration then you must make a new migration to also
* add 'team_foreign_key' to 'roles', 'model_has_roles', and 'model_has_permissions'
* (view the latest version of this package's migration file)
*/
'teams' => false,
/*
* The class to use to resolve the permissions team id
*/
'team_resolver' => \Spatie\Permission\DefaultTeamResolver::class,
/*
* Passport Client Credentials Grant
* When set to true the package will use Passports Client to check permissions
*/
'use_passport_client_credentials' => false,
/*
* When set to true, the required permission names are added to exception messages.
* This could be considered an information leak in some contexts, so the default
* setting is false here for optimum safety.
*/
'display_permission_in_exception' => false,
/*
* When set to true, the required role names are added to exception messages.
* This could be considered an information leak in some contexts, so the default
* setting is false here for optimum safety.
*/
'display_role_in_exception' => false,
/*
* By default wildcard permission lookups are disabled.
* See documentation to understand supported syntax.
*/
'enable_wildcard_permission' => false,
/*
* The class to use for interpreting wildcard permissions.
* If you need to modify delimiters, override the class and specify its name here.
*/
// 'permission.wildcard_permission' => Spatie\Permission\WildcardPermission::class,
/* Cache-specific settings */
'cache' => [
/*
* By default all permissions are cached for 24 hours to speed up performance.
* When permissions or roles are updated the cache is flushed automatically.
*/
'expiration_time' => \DateInterval::createFromDateString('24 hours'),
/*
* The cache key used to store all permissions.
*/
'key' => 'spatie.permission.cache',
/*
* You may optionally indicate a specific cache driver to use for permission and
* role caching using any of the `store` drivers listed in the cache.php config
* file. Using 'default' here means to use the `default` set in cache.php.
*/
'store' => 'default',
],
];

View File

@ -1,22 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('jurusans', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('jurusans');
}
};

View File

@ -1,24 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('prodis', function (Blueprint $table) {
$table->id();
$table->foreignId('jurusan_id')->constrained('jurusans')->cascadeOnDelete();
$table->string('nama');
$table->string('akreditasi');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('prodis');
}
};

View File

@ -13,14 +13,13 @@ public function up(): void
{
Schema::create('mahasiswas', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->string('noreg_kipk');
$table->string('nama');
$table->string('NIM');
$table->foreignId('jurusan_id')->constrained('jurusans')->cascadeOnDelete();
$table->foreignId('prodi_id')->constrained('prodis')->cascadeOnDelete();
$table->string('akreditasi');
$table->string('jurusan');
$table->string('prodi');
$table->string('angkatan');
$table->string('semester');
$table->string('jalur_masuk');
$table->string('ponsel');
$table->string('alamat');

View File

@ -1,89 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('parameters', function (Blueprint $table) {
$table->id();
$table->foreignId('mahasiswa_id')->constrained('mahasiswas')->cascadeOnDelete();
// Untuk Kriteria 1: Kepemilikan KIP
$table->enum('kepemilikan_kip', ['Memiliki KIP', 'Tidak Memiliki KIP']);
//bukti terdata di kip
$table->string('berkas_kip')->nullable();
//terdata di dtks
$table->enum('terdata_dtks', ['Terdata', 'Tidak Terdata']);
//bukti terdata di dtks
$table->string('berkas_dtks')->nullable();
// 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',
'Tidak Menerima Bantuan'
]);
// Berkas untuk Kondisi Ekonomi
$table->string('berkas_1')->nullable(); // Untuk semua kondisi
$table->string('berkas_2')->nullable(); // Untuk Kurang Mampu & Sangat Kurang Mampu
$table->string('berkas_3')->nullable(); // Untuk Kurang Mampu & Sangat Kurang Mampu
// Untuk Kriteria 4: Status Orang tua
$table->enum('status_orang_tua', [
'Kedua Orang Tua Wafat',
'Salah Satu Orang Tua Wafat',
'Kedua Orang Tua Masih Hidup'
]);
// Detail status orang tua
$table->enum('status_ayah', ['Hidup', 'Wafat'])->default('Hidup');
$table->enum('status_ibu', ['Hidup', 'Wafat'])->default('Hidup');
// Bukti kematian orang tua
$table->string('bukti_wafat_ayah')->nullable();
$table->string('bukti_wafat_ibu')->nullable();
// Status form
$table->enum('status', ['belum_validasi', 'valid','tidak_valid'])->default('belum_validasi');
// Alasan tidak valid
$table->text('alasan_tidak_valid')->nullable();
// 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('nilai_status_orang_tua', 10, 7)->default(0);
$table->decimal('total_nilai', 10, 7)->default(0);
// Hasil penilaian
$table->enum('hasil', ['Diterima', 'Tidak Diterima'])->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('parameters');
}
};

View File

@ -0,0 +1,60 @@
<?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::create('listforms', function (Blueprint $table) {
$table->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');
}
};

View File

@ -0,0 +1,30 @@
<?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::create('hasils', function (Blueprint $table) {
$table->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');
}
};

View File

@ -1,140 +0,0 @@
<?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
{
$teams = config('permission.teams');
$tableNames = config('permission.table_names');
$columnNames = config('permission.column_names');
$pivotRole = $columnNames['role_pivot_key'] ?? 'role_id';
$pivotPermission = $columnNames['permission_pivot_key'] ?? 'permission_id';
if (empty($tableNames)) {
throw new \Exception('Error: config/permission.php not loaded. Run [php artisan config:clear] and try again.');
}
if ($teams && empty($columnNames['team_foreign_key'] ?? null)) {
throw new \Exception('Error: team_foreign_key on config/permission.php not loaded. Run [php artisan config:clear] and try again.');
}
Schema::create($tableNames['permissions'], static function (Blueprint $table) {
// $table->engine('InnoDB');
$table->bigIncrements('id'); // permission id
$table->string('name'); // For MyISAM use string('name', 225); // (or 166 for InnoDB with Redundant/Compact row format)
$table->string('guard_name'); // For MyISAM use string('guard_name', 25);
$table->timestamps();
$table->unique(['name', 'guard_name']);
});
Schema::create($tableNames['roles'], static function (Blueprint $table) use ($teams, $columnNames) {
// $table->engine('InnoDB');
$table->bigIncrements('id'); // role id
if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing
$table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable();
$table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index');
}
$table->string('name'); // For MyISAM use string('name', 225); // (or 166 for InnoDB with Redundant/Compact row format)
$table->string('guard_name'); // For MyISAM use string('guard_name', 25);
$table->timestamps();
if ($teams || config('permission.testing')) {
$table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']);
} else {
$table->unique(['name', 'guard_name']);
}
});
Schema::create($tableNames['model_has_permissions'], static function (Blueprint $table) use ($tableNames, $columnNames, $pivotPermission, $teams) {
$table->unsignedBigInteger($pivotPermission);
$table->string('model_type');
$table->unsignedBigInteger($columnNames['model_morph_key']);
$table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index');
$table->foreign($pivotPermission)
->references('id') // permission id
->on($tableNames['permissions'])
->onDelete('cascade');
if ($teams) {
$table->unsignedBigInteger($columnNames['team_foreign_key']);
$table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index');
$table->primary([$columnNames['team_foreign_key'], $pivotPermission, $columnNames['model_morph_key'], 'model_type'],
'model_has_permissions_permission_model_type_primary');
} else {
$table->primary([$pivotPermission, $columnNames['model_morph_key'], 'model_type'],
'model_has_permissions_permission_model_type_primary');
}
});
Schema::create($tableNames['model_has_roles'], static function (Blueprint $table) use ($tableNames, $columnNames, $pivotRole, $teams) {
$table->unsignedBigInteger($pivotRole);
$table->string('model_type');
$table->unsignedBigInteger($columnNames['model_morph_key']);
$table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index');
$table->foreign($pivotRole)
->references('id') // role id
->on($tableNames['roles'])
->onDelete('cascade');
if ($teams) {
$table->unsignedBigInteger($columnNames['team_foreign_key']);
$table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index');
$table->primary([$columnNames['team_foreign_key'], $pivotRole, $columnNames['model_morph_key'], 'model_type'],
'model_has_roles_role_model_type_primary');
} else {
$table->primary([$pivotRole, $columnNames['model_morph_key'], 'model_type'],
'model_has_roles_role_model_type_primary');
}
});
Schema::create($tableNames['role_has_permissions'], static function (Blueprint $table) use ($tableNames, $pivotRole, $pivotPermission) {
$table->unsignedBigInteger($pivotPermission);
$table->unsignedBigInteger($pivotRole);
$table->foreign($pivotPermission)
->references('id') // permission id
->on($tableNames['permissions'])
->onDelete('cascade');
$table->foreign($pivotRole)
->references('id') // role id
->on($tableNames['roles'])
->onDelete('cascade');
$table->primary([$pivotPermission, $pivotRole], 'role_has_permissions_permission_id_role_id_primary');
});
app('cache')
->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null)
->forget(config('permission.cache.key'));
}
/**
* Reverse the migrations.
*/
public function down(): void
{
$tableNames = config('permission.table_names');
if (empty($tableNames)) {
throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.');
}
Schema::drop($tableNames['role_has_permissions']);
Schema::drop($tableNames['model_has_roles']);
Schema::drop($tableNames['model_has_permissions']);
Schema::drop($tableNames['roles']);
Schema::drop($tableNames['permissions']);
}
};

View File

@ -12,15 +12,10 @@ class DatabaseSeeder extends Seeder
public function run(): void
{
$this->call([
RoleSeeder::class,
UserSeeder::class,
KriteriaSeeder::class,
SubKriteriaSeeder::class,
MahasiswaSeeder::class,
// SuperAdminPermissionSeeder::class,
PermissionSeeder::class,
JurusanSeeder::class,
ProdiSeeder::class,
]);
}
}

View File

@ -1,28 +0,0 @@
<?php
namespace Database\Seeders;
use App\Models\Jurusan;
use Illuminate\Database\Seeder;
class JurusanSeeder extends Seeder
{
public function run(): void
{
$jurusans = [
['nama' => 'Produksi Pertanian'],
['nama' => 'Teknologi Pertanian'],
['nama' => 'Peternakan'],
['nama' => 'Manajemen Agribisnis'],
['nama' => 'Teknologi Informasi'],
['nama' => 'Bahasa, Komunikasi dan Pariwisata'],
['nama' => 'Kesehatan'],
['nama' => 'Teknik'],
['nama' => 'Bisnis'],
];
foreach ($jurusans as $jurusan) {
Jurusan::create($jurusan);
}
}
}

View File

@ -17,40 +17,21 @@ public function run(): void
[
'nama' => 'Kepemilikan KIP',
'prioritas' => 1,
'bobot' => 0.4566667,
],
[
'nama' => 'Terdata DTKS',
'prioritas' => 2,
'bobot' => 0.2566667,
'bobot' => 0.5555,
],
[
'nama' => 'Tingkatan Desil',
'prioritas' => 3,
'bobot' => 0.1566667,
'prioritas' => 2,
'bobot' => 0.25,
],
[
'nama' => 'Kondisi Ekonomi',
'prioritas' => 4,
'bobot' => 0.09,
],
[
'nama' => 'Status Orang Tua',
'prioritas' => 5,
'bobot' => 0.04,
'prioritas' => 3,
'bobot' => 0.20,
],
];
// Hitung total bobot untuk memastikan jumlahnya 1
$totalBobot = array_sum(array_column($kriterias, 'bobot'));
// Normalisasi bobot jika total tidak tepat 1
if (abs($totalBobot - 1) > 0.0001) {
foreach ($kriterias as &$kriteria) {
$kriteria['bobot'] = $kriteria['bobot'] / $totalBobot;
}
}
foreach ($kriterias as $kriteria) {
Kriteria::create($kriteria);
}

View File

@ -3,9 +3,6 @@
namespace Database\Seeders;
use App\Models\Mahasiswa;
use App\Models\User;
use App\Models\Jurusan;
use App\Models\Prodi;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
@ -16,58 +13,47 @@ class MahasiswaSeeder extends Seeder
*/
public function run(): void
{
// // Ambil user dengan role mahasiswa
// $users = User::role('mahasiswa')->get();
$mahasiswas = [
[
'noreg_kipk' => 'KIP001',
'nama' => 'Ahmad Fauzi',
'NIM' => '2021573010001',
'jurusan' => 'Teknik',
'prodi' => 'Teknik Informatika',
'angkatan' => '2021',
'semester' => '5',
'jalur_masuk' => 'SNMPTN',
'ponsel' => '081234567890',
'alamat' => 'Jl. Pendidikan No. 1',
],
[
'noreg_kipk' => 'KIP002',
'nama' => 'Siti Nurhaliza',
'NIM' => '2021573010002',
'jurusan' => 'Teknik',
'prodi' => 'Teknik Informatika',
'angkatan' => '2021',
'semester' => '5',
'jalur_masuk' => 'SBMPTN',
'ponsel' => '081234567891',
'alamat' => 'Jl. Pendidikan No. 2',
],
[
'noreg_kipk' => 'KIP003',
'nama' => 'Budi Santoso',
'NIM' => '2021573010003',
'jurusan' => 'Teknik',
'prodi' => 'Teknik Informatika',
'angkatan' => '2021',
'semester' => '5',
'jalur_masuk' => 'SNMPTN',
'ponsel' => '081234567892',
'alamat' => 'Jl. Pendidikan No. 3',
],
];
// // Ambil jurusan dan prodi
// $jurusanTI = Jurusan::where('nama', 'Teknologi Informasi')->first();
// $prodiInformatika = Prodi::where('nama', 'Teknik Informatika')->first();
// $mahasiswas = [
// [
// 'noreg_kipk' => 'KIP001',
// 'nama' => 'Ahmad Fauzi',
// 'NIM' => '2021573010001',
// 'jurusan_id' => $jurusanTI->id,
// 'prodi_id' => $prodiInformatika->id,
// 'akreditasi' => $prodiInformatika->akreditasi,
// 'angkatan' => '2021',
// 'jalur_masuk' => 'SNMPTN',
// 'ponsel' => '081234567890',
// 'alamat' => 'Jl. Pendidikan No. 1',
// ],
// [
// 'noreg_kipk' => 'KIP002',
// 'nama' => 'Siti Nurhaliza',
// 'NIM' => '2021573010002',
// 'jurusan_id' => $jurusanTI->id,
// 'prodi_id' => $prodiInformatika->id,
// 'akreditasi' => $prodiInformatika->akreditasi,
// 'angkatan' => '2021',
// 'jalur_masuk' => 'SBMPTN',
// 'ponsel' => '081234567891',
// 'alamat' => 'Jl. Pendidikan No. 2',
// ],
// [
// 'noreg_kipk' => 'KIP003',
// 'nama' => 'Budi Santoso',
// 'NIM' => '2021573010003',
// 'jurusan_id' => $jurusanTI->id,
// 'prodi_id' => $prodiInformatika->id,
// 'akreditasi' => $prodiInformatika->akreditasi,
// 'angkatan' => '2021',
// 'jalur_masuk' => 'SNMPTN',
// 'ponsel' => '081234567892',
// 'alamat' => 'Jl. Pendidikan No. 3',
// ],
// ];
// foreach ($users as $index => $user) {
// if (isset($mahasiswas[$index])) {
// Mahasiswa::create(array_merge($mahasiswas[$index], [
// 'user_id' => $user->id
// ]));
// }
// }
foreach ($mahasiswas as $mahasiswa) {
Mahasiswa::create($mahasiswa);
}
}
}

View File

@ -1,151 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Illuminate\Support\Facades\DB;
class PermissionSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
// Hapus semua data yang terkait dengan permission dan role
DB::table('model_has_permissions')->delete();
DB::table('model_has_roles')->delete();
DB::table('role_has_permissions')->delete();
DB::table('permissions')->delete();
DB::table('roles')->delete();
// Permission untuk Parameter
$parameterPermissions = [
'view_any_parameter',
'view_parameter',
'create_parameter',
'update_parameter',
'delete_parameter',
'delete_any_parameter',
'force_delete_parameter',
'force_delete_any_parameter',
'restore_parameter',
'restore_any_parameter',
'replicate_parameter',
'reorder_parameter'
];
// Permission untuk Hasil
$hasilPermissions = [
'view_any_hasil',
'view_hasil',
'create_hasil',
'update_hasil',
'delete_hasil',
'delete_any_hasil',
'force_delete_hasil',
'force_delete_any_hasil',
'restore_hasil',
'restore_any_hasil',
'replicate_hasil',
'reorder_hasil'
];
// Permission untuk Pengumuman
$pengumumanPermissions = [
'view_any_pengumuman',
'view_pengumuman',
'create_pengumuman',
'update_pengumuman',
'delete_pengumuman',
'delete_any_pengumuman',
'force_delete_pengumuman',
'force_delete_any_pengumuman',
'restore_pengumuman',
'restore_any_pengumuman',
'replicate_pengumuman',
'reorder_pengumuman'
];
// Permission untuk Mahasiswa
$mahasiswaPermissions = [
'view_any_mahasiswa',
'view_mahasiswa',
'create_mahasiswa',
'update_mahasiswa',
'delete_mahasiswa',
'delete_any_mahasiswa',
'force_delete_mahasiswa',
'force_delete_any_mahasiswa',
'restore_mahasiswa',
'restore_any_mahasiswa',
'replicate_mahasiswa',
'reorder_mahasiswa'
];
// Permission untuk Kriteria
$kriteriaPermissions = [
'view_any_kriteria',
'view_kriteria',
'create_kriteria',
'update_kriteria',
'delete_kriteria',
'delete_any_kriteria',
'force_delete_kriteria',
'force_delete_any_kriteria',
'restore_kriteria',
'restore_any_kriteria',
'replicate_kriteria',
'reorder_kriteria'
];
// Permission untuk SubKriteria
$subKriteriaPermissions = [
'view_any_subkriteria',
'view_subkriteria',
'create_subkriteria',
'update_subkriteria',
'delete_subkriteria',
'delete_any_subkriteria',
'force_delete_subkriteria',
'force_delete_any_subkriteria',
'restore_subkriteria',
'restore_any_subkriteria',
'replicate_subkriteria',
'reorder_subkriteria'
];
// Gabungkan semua permission
$allPermissions = array_merge(
$parameterPermissions,
$hasilPermissions,
$pengumumanPermissions,
$mahasiswaPermissions,
$kriteriaPermissions,
$subKriteriaPermissions
);
// Buat permission
foreach ($allPermissions as $permission) {
Permission::create(['name' => $permission]);
}
// Buat role Super Admin dan berikan semua permission
$superAdmin = Role::create(['name' => 'super_admin']);
$superAdmin->syncPermissions($allPermissions);
// Buat role Admin dan berikan permission yang diperlukan
$admin = Role::create(['name' => 'admin']);
$admin->syncPermissions(array_merge(
$parameterPermissions,
$hasilPermissions,
$pengumumanPermissions
));
// Buat role Mahasiswa dan berikan permission yang diperlukan
$mahasiswa = Role::create(['name' => 'mahasiswa']);
$mahasiswa->syncPermissions($pengumumanPermissions);
}
}

View File

@ -1,174 +0,0 @@
<?php
namespace Database\Seeders;
use App\Models\Prodi;
use Illuminate\Database\Seeder;
class ProdiSeeder extends Seeder
{
public function run(): void
{
$prodis = [
// Produksi Pertanian
[
'jurusan_id' => 1,
'nama' => 'Produksi Tanaman Hortikultura',
'akreditasi' => 'A'
],
[
'jurusan_id' => 1,
'nama' => 'Produksi Tanaman Perkebunan',
'akreditasi' => 'A'
],
[
'jurusan_id' => 1,
'nama' => 'Teknik Produksi Benih',
'akreditasi' => 'B'
],
[
'jurusan_id' => 1,
'nama' => 'Teknologi Produksi Tanaman Pangan',
'akreditasi' => 'B'
],
[
'jurusan_id' => 1,
'nama' => 'Budidaya Tanaman Perkebunan',
'akreditasi' => 'B'
],
[
'jurusan_id' => 1,
'nama' => 'Pengelolaan Perkebunan Kopi',
'akreditasi' => 'C'
],
// Teknologi Pertanian
[
'jurusan_id' => 2,
'nama' => 'Keteknikan Pertanian',
'akreditasi' => 'A'
],
[
'jurusan_id' => 2,
'nama' => 'Teknologi Industri Pangan',
'akreditasi' => 'A'
],
[
'jurusan_id' => 2,
'nama' => 'Teknologi Rekayasa Pangan',
'akreditasi' => 'C'
],
// Peternakan
[
'jurusan_id' => 3,
'nama' => 'Produksi Ternak',
'akreditasi' => 'A'
],
[
'jurusan_id' => 3,
'nama' => 'Manajemen Bisnis Unggas',
'akreditasi' => 'B'
],
[
'jurusan_id' => 3,
'nama' => 'Teknologi Pakan Ternak',
'akreditasi' => 'C'
],
// Manajemen Agribisnis
[
'jurusan_id' => 4,
'nama' => 'Manajemen Agribisnis',
'akreditasi' => 'A'
],
[
'jurusan_id' => 4,
'nama' => 'Manajemen Agroindustri',
'akreditasi' => 'A'
],
// Teknologi Informasi
[
'jurusan_id' => 5,
'nama' => 'Manajemen Informatika',
'akreditasi' => 'A'
],
[
'jurusan_id' => 5,
'nama' => 'Teknik Komputer',
'akreditasi' => 'A'
],
[
'jurusan_id' => 5,
'nama' => 'Teknik Informatika',
'akreditasi' => 'A'
],
[
'jurusan_id' => 5,
'nama' => 'Bisnis Digital',
'akreditasi' => 'C'
],
// Bahasa, Komunikasi dan Pariwisata
[
'jurusan_id' => 6,
'nama' => 'Bahasa Inggris',
'akreditasi' => 'B'
],
[
'jurusan_id' => 6,
'nama' => 'Destinasi Pariwisata',
'akreditasi' => 'C'
],
// Kesehatan
[
'jurusan_id' => 7,
'nama' => 'Manajemen Informasi Kesehatan',
'akreditasi' => 'A'
],
[
'jurusan_id' => 7,
'nama' => 'Gizi Klinik',
'akreditasi' => 'B'
],
[
'jurusan_id' => 7,
'nama' => 'Promosi Kesehatan',
'akreditasi' => 'C'
],
//Teknik
[
'jurusan_id' => 8,
'nama' => 'Teknik Energi Terbarukan',
'akreditasi' => 'A'
],
[
'jurusan_id' => 8,
'nama' => 'Mesin Otomotif',
'akreditasi' => 'B'
],
[
'jurusan_id' => 8,
'nama' => 'Teknologi Rekayasa Mekatronika',
'akreditasi' => 'C'
],
//Bisnis
[
'jurusan_id' => 9,
'nama' => 'Akuntansi Sektor Publik',
'akreditasi' => 'C'
],
[
'jurusan_id' => 9,
'nama' => 'Manajemen Pemasaran Internasional',
'akreditasi' => 'C'
],
];
foreach ($prodis as $prodi) {
Prodi::create($prodi);
}
}
}

View File

@ -1,42 +0,0 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
class RoleSeeder extends Seeder
{
public function run()
{
// Create roles
$admin = Role::create(['name' => 'admin', 'guard_name' => 'web']);
$superAdmin = Role::create(['name' => 'super_admin', 'guard_name' => 'web']);
$mahasiswa = Role::create(['name' => 'mahasiswa', 'guard_name' => 'web']);
// Create permissions
$permissions = [
'view_any_pengumuman',
'view_pengumuman',
'create_pengumuman',
'update_pengumuman',
'delete_pengumuman',
'delete_any_pengumuman',
'force_delete_pengumuman',
'force_delete_any_pengumuman',
'restore_pengumuman',
'restore_any_pengumuman',
'replicate_pengumuman',
'reorder_pengumuman'
];
foreach ($permissions as $permission) {
Permission::create(['name' => $permission, 'guard_name' => 'web']);
}
// Give all permissions to admin and super_admin
$admin->givePermissionTo($permissions);
$superAdmin->givePermissionTo($permissions);
}
}

View File

@ -20,118 +20,74 @@ public function run(): void
'nama' => 'Memiliki KIP',
'deskripsi' => 'Mahasiswa memiliki Kartu Indonesia Pintar',
'prioritas' => 1,
'bobot' => 0.3425000,
'bobot' => 0.6,
],
[
'kriteria_id' => 1,
'nama' => 'Tidak Memiliki KIP',
'deskripsi' => 'Mahasiswa tidak memiliki Kartu Indonesia Pintar',
'prioritas' => 2,
'bobot' => 0.1141667,
'bobot' => 0.4,
],
// Subkriteria untuk Terdata dalam DTKS (kriteria_id: 2)
// Subkriteria untuk Tingkatan Desil (kriteria_id: 2)
[
'kriteria_id' => 2,
'nama' => 'Terdata',
'deskripsi' => 'Mahasiswa yang datanya tercatat dalam Data Terpadu Kesejahteraan Sosial (DTKS).',
'prioritas' => 1,
'bobot' => 0.1925000,
],
[
'kriteria_id' => 2,
'nama' => 'Tidak Terdata',
'deskripsi' => 'Mahasiswa yang datanya tidak tercatat dalam Data Terpadu Kesejahteraan Sosial (DTKS).',
'prioritas' => 2,
'bobot' => 0.0641667,
],
// Subkriteria untuk Tingkatan Desil (kriteria_id: 3)
[
'kriteria_id' => 3,
'nama' => 'Desil 1',
'deskripsi' => 'Tingkat kesejahteraan terendah',
'prioritas' => 1,
'bobot' => 0.0715445,
'bobot' => 0.35,
],
[
'kriteria_id' => 3,
'kriteria_id' => 2,
'nama' => 'Desil 2',
'deskripsi' => 'Tingkat kesejahteraan sangat rendah',
'prioritas' => 2,
'bobot' => 0.0402111,
'bobot' => 0.25,
],
[
'kriteria_id' => 3,
'kriteria_id' => 2,
'nama' => 'Desil 3',
'deskripsi' => 'Tingkat kesejahteraan rendah',
'prioritas' => 3,
'bobot' => 0.0245444,
'bobot' => 0.20,
],
[
'kriteria_id' => 3,
'kriteria_id' => 2,
'nama' => 'Desil 4',
'deskripsi' => 'Tingkat kesejahteraan menengah bawah',
'prioritas' => 4,
'bobot' => 0.0141000,
'bobot' => 0.15,
],
[
'kriteria_id' => 3,
'kriteria_id' => 2,
'nama' => 'Desil 5',
'deskripsi' => 'Tingkat kesejahteraan menengah',
'prioritas' => 5,
'bobot' => 0.0062667,
'bobot' => 0.05,
],
// Subkriteria untuk Kondisi Ekonomi (kriteria_id: 4)
// Subkriteria untuk Kondisi Ekonomi (kriteria_id: 3)
[
'kriteria_id' => 4,
'kriteria_id' => 3,
'nama' => 'Sangat Kurang Mampu',
'deskripsi' => 'Memiliki lebih dari 2 bantuan pemerintah',
'deskripsi' => 'Penghasilan dibawah UMR',
'prioritas' => 1,
'bobot' => 0.0468750,
'bobot' => 0.4,
],
[
'kriteria_id' => 4,
'kriteria_id' => 3,
'nama' => 'Kurang Mampu',
'deskripsi' => 'Memiliki 2 bantuan pemerintah',
'deskripsi' => 'Penghasilan setara UMR',
'prioritas' => 2,
'bobot' => 0.0243750,
'bobot' => 0.3,
],
[
'kriteria_id' => 4,
'kriteria_id' => 3,
'nama' => 'Cukup Mampu',
'deskripsi' => 'Mahasiswa memiliki 1 bantuan pemerintah',
'deskripsi' => 'Penghasilan diatas UMR',
'prioritas' => 3,
'bobot' => 0.0131250,
],
[
'kriteria_id' => 4,
'nama' => 'Tidak Menerima Bantuan',
'deskripsi' => 'Mahasiswa tidak memiliki bantuan pemerintah',
'prioritas' => 4,
'bobot' => 0.0056250,
],
// Subkriteria untuk Status Orang Tua (kriteria_id: 5)
[
'kriteria_id' => 5,
'nama' => 'Kedua Orang Tua Wafat',
'deskripsi' => 'Ayah dan Ibu wafat',
'prioritas' => 1,
'bobot' => 0.0244444,
],
[
'kriteria_id' => 5,
'nama' => 'Salah Satu Orang Tua Wafat',
'deskripsi' => 'Ayah atau Ibu-nya wafat',
'prioritas' => 2,
'bobot' => 0.0111111,
],
[
'kriteria_id' => 5,
'nama' => 'Kedua Orang Tua Masih Hidup',
'deskripsi' => 'Ayah dan Ibu-nya masih hidup',
'prioritas' => 3,
'bobot' => 0.0044444,
'bobot' => 0.3,
],
];

View File

@ -2,8 +2,9 @@
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class UserSeeder extends Seeder
@ -13,38 +14,35 @@ class UserSeeder extends Seeder
*/
public function run(): void
{
// Buat Super Admin
$superAdmin = User::create([
'name' => 'Admin',
'email' => 'pengelola@admin.com',
'password' => Hash::make('12345678'),
'email_verified_at' => now()
]);
$superAdmin->assignRole('super_admin');
// Buat Admin
$admin = User::create([
'name' => 'Admin',
'email' => 'admin@admin.com',
'password' => Hash::make('12345678'),
'email_verified_at' => now()
]);
$admin->assignRole('admin');
// Buat beberapa mahasiswa
$mahasiswas = [
$users = [
[
'name' => 'Ahmad Fauzi',
'email' => 'ahmad@user.com',
'name' => 'Najwa',
'email' => 'najwa@admin.com',
'password' => Hash::make('12345678'),
'email_verified_at' => now()
'email_verified_at' => now(),
],
[
'name' => 'Administrator',
'email' => 'admin@admin.com',
'password' => Hash::make('password'),
'email_verified_at' => now(),
],
[
'name' => 'Ketua Prodi',
'email' => 'kaprodi@admin.com',
'password' => Hash::make('password'),
'email_verified_at' => now(),
],
[
'name' => 'Staff',
'email' => 'staff@admin.com',
'password' => Hash::make('password'),
'email_verified_at' => now(),
],
];
foreach ($mahasiswas as $mahasiswa) {
$user = User::create($mahasiswa);
$user->assignRole('mahasiswa');
foreach ($users as $user) {
User::create($user);
}
}
}

View File

@ -1,909 +0,0 @@
SISTEM PENDUKUNG KEPUTUSAN PENERIMA KIP
KULIAH MAHASISWA POLITEKNIK NEGERI JEMBER
DENGAN MENGGUNAKAN METODE SMARTER
BERBASIS WEB
PROPOSAL TUGAS AKHIR
oleh
Annajwa Shohibuzzahro
NIM E31222691
PROGRAM STUDI MANAJEMEN INFORMATIKA
JURUSAN TEKNOLOGI INFORMASI
POLITEKNIK NEGERI JEMBER
2024
SISTEM PENDUKUNG KEPUTUSAN PENERIMA KIP
KULIAH MAHASISWA POLITEKNIK NEGERI JEMBER
DENGAN MENGGUNAKAN METODE SMARTER
BERBASIS WEB
PROPOSAL TUGAS AKHIR
sebagai salah satu syarat untuk memperoleh gelar Ahli Madya (A.Md)
di Program Studi Manajemen Informatika
Jurusan Teknologi Informasi
oleh
Annajwa Shohibuzzahro
NIM E31222691
PROGRAM STUDI MANAJEMEN INFORMATIKA
JURUSAN TEKNOLOGI INFORMASI
POLITEKNIK NEGERI JEMBER
2024
i
DAFTAR ISI
Halaman
DAFTAR ISI ........................................................................................................... ii
DAFTAR GAMBAR ............................................................................................. iv
DAFTAR TABEL.................................................................................................... v
BAB 1. PENDAHULUAN ..................................................................................... 1
1.1 Latar Belakang ......................................................................................... 1
1.2 Rumusan Masalah .................................................................................... 3
1.3 Batasan Masalah ....................................................................................... 3
1.4 Tujuan ....................................................................................................... 4
1.5 Manfaat..................................................................................................... 4
BAB 2. TINJAUAN PUSTAKA............................................................................. 5
2.1 Tinjauan Pustaka....................................................................................... 5
2.1.1 Penelitian Terdahulu.......................................................................... 5
2.1.2 State Of The Art ................................................................................ 7
2.2 Landasan Teori ......................................................................................... 8
2.2.1 Sistem ................................................................................................ 8
2.2.2 Sistem Pendukung Keputusan........................................................... 8
2.2.3 Kartu Indonesia Pintar Kuliah (KIPK).............................................. 9
2.2.4 Tingkatan Desil ................................................................................. 9
2.2.5 Metode SMARTER ........................................................................... 9
2.2.6 Flowchart ........................................................................................ 12
2.2.7 Use Case Diagram .......................................................................... 13
2.2.8 MySQL............................................................................................ 13
2.2.9 Hypertext Processor (PHP) ............................................................. 14
2.2.10 Website ............................................................................................ 14
2.2.11 Framework Laravel......................................................................... 14
BAB 3. METODE KEGIATAN ............................................................................ 15
3.1 Tempat dan Waktu Pelaksanaan ............................................................. 15
3.2 Alat dan Bahan ....................................................................................... 15
3.3 Metode Pengumpulan Data .................................................................... 16
ii
3.3.1 Studi literatur................................................................................... 16
3.3.2 Observasi......................................................................................... 16
3.3.3 Wawancara ...................................................................................... 17
3.4 Metode Kegiatan .................................................................................... 17
3.4.1 Metode Waterfall ............................................................................. 17
3.4.2 Algoritma Sistem ............................................................................ 19
3.4.3 Use Case Diagram .......................................................................... 21
3.4.4 Activity Diagram............................................................................. 22
3.4.5 Algoritma Metode SMARTER ....................................................... 25
3.5 Pelaksanaan Kegiatan ............................................................................. 28
DAFTAR PUSTAKA ............................................................................................ 29
iii
DAFTAR GAMBAR
Halaman
Gambar 3. 1 Tahapan Metode Waterfall (Presman, 2012) .................................... 17
Gambar 3. 2 Flowchart Sistem.............................................................................. 19
Gambar 3. 3 Use Case ........................................................................................... 21
Gambar 3. 4 Activity Diagram Mahasiswa........................................................... 22
Gambar 3. 5 Activity Diagram Admin.................................................................. 23
Gambar 3. 6 Activity Diagram Pengelola ............................................................. 24
Gambar 3.7 Flowchart metode SMARTER .......................................................... 25
Gambar 3. 8 Mockup dashboard user sebagai Admin .......................................... 26
Gambar 3. 9 Mockup dashboard user sebagai Pengelola...................................... 27
Gambar 3. 10 Mockup umum user sebagai Mahasiswa........................................ 27
iv
DAFTAR TABEL
Halaman
Tabel 2.1 State Of The Art ...................................................................................... 7
Tabel 2.2 Flowchart............................................................................................... 12
Tabel 2.3 Use Case ................................................................................................ 13
Tabel 3.1 Pelaksanaan Kegiatan............................................................................ 28
v
BAB 1. PENDAHULUAN
1.1 Latar Belakang
Pendidikan merupakan salah satu aspek fundamental dalam kehidupan
manusia yang berperan penting dalam mengembangkan potensi suatu individu
dalam kehidupan sehari-hari. Pendidikan bukan hanya menjadi kebutuhan, tetapi
pendidikan juga merupakan hak asasi manusia yang harus dipenuhi oleh setiap
warga negara. Seperti halnya yang telah di tetapkan pada Pasal 31 ayat (1) UUD
1945 menyatakan bahwa “Setiap warga negara berhak mendapatkan
Pendidikan.”(Sujatmoko, n.d.). Usaha pemerintah dalam mewujudkan pasal
tersebut adalah dengan melalui berbagai kebijakan program pemerintah yang
bertujuan untuk memudahkan akses pendidikan untuk warga negara salah satunya
yaitu Program Indonesia Pintar (PIP).
Program Indonesia Pintar (PIP) merupakan salah satu kebijakan pemerintah
dalam upaya pemerataan pendidikan bantuan berupa uang tunai, perluasan akses,
dan kesempatan belajar dari pemerintah yang diberikan kepada peserta didik yang
berasal dari keluarga miskin atau rentan miskin untuk membiayai pendidikan, yang
sesuai dengan isi Intruksi Presiden No. 7 Tahun 2014 pada poin ketiga yaitu
“Pembiayaan pelaksanaan Program Simpanan Keluarga Sejahtera, Program
Indonesia Pintar, dan Program Indonesia Sehat dibebankan pada Anggaran
Pendapatan dan Belanja Daerah serta sumber lain yang tidak mengikat yang
pelaksanaannya sesuai dengan ketentuan peraturan perundang undangan”.
Pemerintah telah berupaya keras dalam menggiatkan Program Indonesia Pintar
(PIP) untuk memenuhi hak setiap warga negara dalam memperoleh layanan
pendidikan, yakni melalui Kartu Indonesia Pintar (KIP) yang diluncurkan oleh
pemerintah di bawah naungan Kementerian Pendidikan dan Kebudayaan (Rohaeni
& Saryono, 2018).
1
2
Kartu Indonesia Pintar (KIP) terdiri dari dua jenis yaitu KIP Sekolah yang
ditujukan kepada peserta didik tingkat Sekolah Dasar hingga Sekolah Menengah
Atas, dan KIP Kuliah yang ditujukan bagi lulusan SMA sederajat dengan dana
bantuan pendidikan serta biaya hidup yang disesuaikan dengan wilayah pendidikan.
KIP ditujukan pada peserta didik yang kurang mampu dalam membiayai
pendidikannya, tetapi di beberapa perguruan tinggi termasuk Politeknik Negeri
Jember penerima KIP Kuliah belum sepenuhnya tepat sasaran karena metode
seleksi calon penerima KIPK menggunakan metode manual yang rawan terjadinya
human error sehingga dapat mengakibatkan ketidaktepatan penerima KIP Kuliah.
Terdapat mahasiswa yang berhak mendapatkan KIPK tetapi mereka tidak
mendapatkan haknya, sehingga tidak dapat melanjutkan pendidikan hingga akhir
atau bahkan mencari kegiatan lain yang menghasilkan uang sehingga fokus belajar
mereka terbagi.
Berdasarkan permasalahan diatas, maka dibangun sebuah sistem pendukung
keputusan yang dapat digunakan oleh panitia pemilihan penerima KIP Kuliah untuk
menentukan siswa yang benar-benar layak mendapatkan bantuan KIP Kuliah
tersebut guna untuk meminimalisir terjadinya hal-hal yang tidak diinginkan. Maka
penulis melakukan penelitian dengan judul “Sistem Pendukung Keputusan
Penerima KIP Kuliah Mahasiswa Politeknik Negeri Jember dengan Menggunakan
Metode SMARTER Berbasis Web”.
Metode Simple Multy Attribute Rating Technique Exploiting Rank
(SMARTER) merupakan salah satu metode yang digunakan dalam mengolah data
yang membantu sistem pendukung keputusan dengan multikriteria yang akan
menghasilkan perangkingan kelayakan penerima KIP Kuliah berupa layak,
dipertimbangkan dan tidak layak.
3
1.2 Rumusan Masalah
Berdasarkan latar belakang yang telah saya jelaskan diatas, maka terdapat
rumusan permasalahan yang mana sebagai berikut :
1. Bagaimana cara untuk menentukan mahasiswa yang layak pendapatkan KIP
Kuliah?
2. Bagaimana menerapkan metode Simple Multy Attribute Rating Technique
Exploiting Rank (SMARTER) dalam sistem pendukung keputusan penerima
KIP Kuliah Mahasiswa Politeknik Negeri Jember?
3. Bagaimana hasil penerapan sistem pendukung keputusan penerima KIP
Kuliah mahasiswa Politeknik Negeri Jember dengan menggunakan metode
Simple Multy Attribute Rating Technique Exploiting Rank (SMARTER) ?
1.3 Batasan Masalah
Berdasarkan permasalahan tersebut maka terdapat batasan masalah pada
penelitian ini adalah sebagai berikut:
1. Sistem pendukung keputusan penerima KIP Kuliah ini dikembangkan
berbasis website.
2. Penelitian ini menggunakan metode perhitungan Simple Multy Attribute
Rating Technique Exploiting Rank (SMARTER).
3. Sistem pendukung keputusan digunakan untuk mempermudah pengambilan
keputusan penentu penerima KIP Kuliah mahasiswa Politeknik Negeri
Jember.
4. Menghasilkan ouput mahasiswa yang layak, dipertimbangkan dan tidak layak
mendapatkan KIP Kuliah.
5. Parameter kriteria yang digunakan dalam proses perhitungan menggunakan
metode SMARTER terdiri dari kriteria kepemilikan KIP Sekolah, kriteria
tingkatan desil, dan kriteria kondisi ekonomi.
4
1.4 Tujuan
Berdasarkan rumusan masalah diatas, tujuan yang ingin dicapai dalam
penelitian ini adalah sebagai berikut:
1. Membuat sistem pendukung keputusan yang digunakan untuk menentukan
penerima KIP Kuliah mahasiswa Politeknik Negeri Jember.
2. Menerapkan metode Simple Multy Attribute Rating Technique Exploiting
Rank (SMARTER) sebagai metode yang dapat digunakan pada sistem
pendukung keputusan penerima KIP Kuliah mahasiswa Politeknik Negeri
Jember.
3. Mengetahui hasil penerapan sistem pendukung keputusan penerima KIP
Kuliah mahasiswa Politeknik Negeri Jember menggunakan metode Simple
Multy Attribute Rating Technique Exploiting Rank (SMARTER).
1.5 Manfaat
Berdasarkan tujuan diatas, diharapkan hasil dari penelitian ini dapat memiliki
manfaat seperti berikut:
1. Panitia seleksi KIP Kuliah Politeknik Negeri Jember lebih mudah dalam
menyeleksi calon mahasiswa penerima KIP Kuliah tanpa melihat data
mahasiswa secara berulang.
2. Dapat mengetahui penerapan metode Simple Multy Attribute Rating
Technique Exploiting Rank (SMARTER) untuk memberikan rekomendasi
calon mahasiswa yang layak menerima KIP Kuliah.
BAB 2. TINJAUAN PUSTAKA
2.1 Tinjauan Pustaka
2.1.1 Penelitian Terdahulu
Dalam penyusunan tugas akhir berjudul “Sistem Pendukung Keputusan
Penerima KIP Kuliah Mahasiswa Politeknik Negeri Jember dengan Menggunakan
Metode SMARTER Berbasis Web” ini diperlukan referensi dari beberapa sumber
pustaka yang digunakan sebagai pembanding antara penelitian yang sudah
dilakukan dengan penelitian yang akan direncanakan agar menjadi lebik baik.
Berikut beberapa tinjauan pustaka yang saya gunakan sebagai pembanding:
a. Rancang Bangun Sistem Seleksi Penentuan Penerima Bantuan KIP Kuliah di
STMIK Muhammadiyah Paguyangan Brebes Menggunakan Metode SAW.
Pada penelitian tersebut mengambil objek penelitian seleksi penentuan
penerima bantuan KIPK di STMIK Muhammadiyah paguyuban dengan
menggunakan metode SAW dengan tujuan dapat mendapatkan keakuratan data
berdasarkan tingkat akurasi kelayakan calon penerima KIPK melalui sistem
pendukung keputusan yang dibuatnya sebagai solusi dari permasalahan mekanisme
pemilihan calon penerima bantuan secara manual. Pada penelitian tersebut
menggunakan beberapa parameter atau kriteria seperti: penghasilan orang tua,
tahun lulus, potensi akademik, yatim/piatu, organisasi, pekerjaan orang tua,
tanggungan orang tua, dan jumlah anggota keluarga. Pada penelitian ini output yang
akan dihasilkan berupa desktop.
b. Sistem Pendukung Keputusan Pemilihan Ekstrakurikuler Pada Siswa Di
MAN 3 Banyuwangi Menggunakan Metode Simple Multy Attribute Rating
Technique Exploiting Rank Berbasis Web (Ananda Zakia Syahfitri, Politeknik
Negeri Jember, Manajemen Informatika, Jember, 2024).
Pada penelitian tersebut mengambil objek pemilihan ekstrakurikuler pada
siswa di MAN 3 Banyuwangi dengan menggunakan metode Simple Multy Attribute
5
6
Rating Technique Exploiting Rank Berbasis Web dengan tujuan dapat menjadi
solusi dari permasalahan siswa yang merasa bingung dan kesulitan dalam
menentukan ekstrakurikuler yang sesuai dengan minat dan potensinya dengan
memberikan sistem yang memberikan keputusan pada siswa MAN 3 Banyuwangi
dalam memilih ektrakurikuler mana yang sesuai dengan minat dan potensi mereka.
Sistem ini dibangun dengan menggunakan beberapa parameter kriteria yaitu minat,
bakat, pengalaman, prestasi, dan fasilitas. Dengan menggunakan 10 jenis alternatif
ekstrakurikuler yaitu: futsal, tenis meja, Badminton, Catur, Taekwondo, seni Lukis,
seni tari, teater, dan jurnalis yang menghasilkan output nilai akhir tertinggi
merupakan ekstrakurikuler yang paling direkomendasikan untuk siswa. Pada
penelitian ini metode SMARTER memiliki akurasi sebesar 85% dari 20 data uji.
7
2.1.2 State Of The Art
Pada tugas akhir yang berjudul “Sistem Pendukung Keputusan Penerima KIP
Kuliah Mahasiswa Politeknik Negeri Jember Dengan Menggunakan Metode
SMARTER Berbasis Web” terdapat sebuah perbandingan dengan karya tulis ilmiah
sebelumnya yang disajikan dalam table State Of The Art sebagai berikut:
Tabel 2. 1 State Of The Art Zakia Annajwa
Nama Tri Wahyuni Wulandari Ananda
Penulis dkk. Syahfitri Shohibuzzahro
Judul Rancang Bangun Sistem Sistem Pendukung Sistem Pendukung
Seleksi Penentuan Keputusan Pemilihan Keputusan Penerima
Penerima Bantuan KIP Ekstrakurikuler Pada KIP Kuliah
Kuliah di STMIK Siswa di MAN 3 Mahasiswa
Muhammadiyah Banyuwangi Politeknik Negeri
Paguyangan Brebes Menggunakan Jember
Menggunakan Metode Metode SMARTER Menggunakan
SAW. Berbasis Web Metode SMARTER
Berbasis Web
Objek KIP Kuliah Ekstrakurikuler KIP Kuliah
Studi STMIK MAN 3 Banyuwangi Politeknik Negeri
Kasus Muhammadiyah Jember
Paguyangan Brebes
Metode SAW SMARTER SMARTER
Kriteria Penghasilan orang tua, minat, bakat, kepemilikan KIP
tahun lulus, potensi pengalaman, Sekolah, tingkatan
akademik, yatim/piatu, prestasi, dan fasilitas desil, dan tingkat
organisasi, pekerjaan kemampuan.
orang tua, tanggungan
orang tua, jumlah
anggota keluarga.
Tahun 2023 2024 2024
8
2.2 Landasan Teori
2.2.1 Sistem
Menurut Romney, et al (2015:1) dalam jurnal Accounting Information
System, menyatakan bahwa sistem adalah serangkaian dua atau lebih komponen
yang saling terkait dan berinteraksi untuk mencapai suatu tujuan. Menurut Mulyadi
(2016:1) dalam jurnal Sistem Akuntansi, menyatakan bahwa sistem adalah
kelompok unsur yang erat berhubungan satu dengan lainnya, yang berfungsi
bersama-sama untuk mencapai tujuan tertentu. Menurut Subri (2016) dalam jurnal
Sistem Informasi Manajemen, menyatakan bahwa sistem adalah suatu kumpulan
atau himpunan dari unsur, komponen, atau variable yang terorganisasi, saling
berinteraksi, saling tergantung satu sama lain, dan terpadu. Berdasarkan para ahli
diatas dapat disimpulkan bahwa sistem merupakan sekumpulan komponen yang
saling berinteraksi dan bergantung satu sama lain yang bekerja secara terorganisasi
untuk mencapai suatu tujuan tertentu.
2.2.2 Sistem Pendukung Keputusan
Sistem pendukung keputusan adalah sistem yang digunkan untuk dapat
mengambil keputusan pada situasi terstruktur dan tidak terstruktur, dimana
seseorang tidak mengetahui secara pasti bagaimana seharusnya sebuah keputusan
dibuat (Tuban, 2001). Sistem pendukung keputusan bertujuan untuk memberikan
perkiraan dan mengarahkan pengguna dalam pengambilan keputusan dengan lebih
baik melalui proses dalam memperoleh informasi dengan menggunakan model
pengambilan keputusan (Galuh Andika et al., 2019). Sistem pendukung keputusan
merupakan sistem informasi bersifat interaktif yang menyediakan informasi,
pemodelan, dan manipulasi data berbasisi computer untuk membantu dalam proses
pengambilan keputusan (Cahyati et al., 2021). Berdasarkan beberapa penjelasan
diatas dapat disimpulkan bahwa sistem pendukung keputusan merupakan sistem
yang dapat memberikan suatu informasi berupa saran atau rekomendasi dalam
pengambilan keputusan yang paling efisien atau paling baik pada suatu
permasalahan melalui proses pengolahan data.
9
2.2.3 Kartu Indonesia Pintar Kuliah (KIPK)
Kartu Indonesia Pintar merupakan implementasi dari Program Indonesia
Pintar (PIP) yaitu merupakan program pemerintah yang diluncurkan untuk
mengatasi masalah yang terjadi karena banyaknya ditemukan kasus siswa yang
masih usia sekolah namun tidak mendapatkan haknya karena keterbatasan biaya
(N. Eni Rohaeni & Oyon Saryono, 2018). Kartu Indonesia Pintar terbagi menjadi 2
yaitu: KIP Sekolah yang ditujukan kepada peserta didik SMA atau sederajat dan
KIP Kuliah yang ditujukan kepada peserta didik yang telah lulus dari SMA atau
sederajat yang digunakan sebagai peningkatan akses pndidikan dengan
memberikan bantuan dana kepada siswa dari keluarga kurang mampu agar mereka
dapat melanjutkan pendidikan hingga ke jenjang yang lebih tinggi. Dengan adanya
KIP, diharapkan tidak ada lagi anak-anak Indonesia yang terhambat pendidikannya
karena masalah ekonomi, sehingga bisa mengurangi kemiskinan dan meningkatkan
kualitas hidup masyarakat secara keseluruhan.
2.2.4 Tingkatan Desil
Seluruh rumah tangga yang ada di Indonesia dalam Basis Data Terpadu dapat
dikelompokkan ke dalam kelompok yang disebut desil. Desil merupakan kelompok
per-sepuluhan sehingga seluruh rumah tangga terbagi ke dalam 10 desil. Desil 10
merupakan rumah tangga di Indonesia yang memiliki penghasilan tertinggi 10%
dari seluruh rumah tangga yang ada, begitu sebaliknya rumah tangga yang masuk
kedalam desil 1 yaitu rumah tangga yang paling miskin atau berpenghasilan
terendah 10% dari seluruh rumah tangga yang ada di Indonesia (Basis Data
Terpadu, 2013). Dalam penelitian ini berfokus pada kelompok desil terendah yang
terdaftar dalam Data Terpadu Kesejahteraan Sosial (DTKS) yang layak
mendapatkan KIP Kuliah.
2.2.5 Metode SMARTER
Metode Simple Multy Attribute Rating Technique Exploiting Rank merupakan
salah satu metode yang digunakan dalam mengolah data yang membantu sistem
pendukung keputusan. Pada tahun 1977 metode SMART (Simple Multy Attribute
10
Rating Technique) hadir kemudian dikembangkan menjadi metode SMARTS
(Simple Multy Attribute Rating Technique Swing). Pada tahun 1994 Edward dan
Baron mengubahnya menjadi SMARTER (Simple Multy Attribute Rating
Technique Exploiting Rank) yang merupakan hasil dari modifikasi metode
SMARTS.
Dalam metode SMARTER, bobot dihitung menggunakan rumus pembobotan
Rank Order Centroid (ROC) pada setiap kriteria dan sub kriteria. Metode
pembobotan ini menggunakan rentang nilai antara 0 hingga 1, yang memudahkan
dalam perhitungan dan perbandingan nilai setiap alternatif. ROC didasarkan pada
tingkat kepentingan atau prioritas dari setiap kriteria. Teknik ini memberikan bobot
pada setiap kriteria sesuai dengan urutan peringkat yang diberikan berdasarkan
tingkat prioritas yang telah ditentukan.
Langkah-langkah perhitungan metode Simple Multy Attribute Rating
Technique Exploiting Rank (SMARTER) adalah sebagai berikut:
a. Menentukan Kriteria dan Tingkatan Prioritas
Dalam sistem pendukung keputusan, kriteria digunakan untuk menentukan faktor-
faktor yang utama bagi pengguna dalam memilih alternatif yang sesuai. Penetapan
kriteria yang digunakan dan tingkatan prioritas pada pemilihan penerima KIPK di
Politeknik Negeri Jember telah ditentukan oleh admin dan pengelola yang terdiri
dari kepemilikan KIP Sekolah, Tingkatan desil dan Tingkat kemampuan dengan
menyertakan bukti bukti dokumen yang terlampir.
b. Menentukan Sub Kriteria dan Tingkatan Prioritas
Dalam sistem pendukung keputusan, sub kriteria digunakan untuk memecah
kriteria utama menjadi komponen yang lebih spesifik untuk mengukur pentingnya
faktor-faktor dalam memilih alternatif. Penetapan sub kriteria dan tingkatan
prioritas ditentukan berdasarkan setiap kriteria yang digunakan.
c. Pembobotan ROC Setiap Kriteria dan Sub Kriteria
Pada metode SMARTER untuk menghitung bobot kriteria dan sub kriteria adalah
menggunakan teknik Rank Order Centoid (ROC) yang didasarkan pada urutan
tingkat prioritas.
11
d. Menghitung Hasil Akhir Nilai Utility
Nilai utility merupakan nilai yang digunakan untuk memperkirakan hasil
perhitungan dari pilihan alternatif yang berbeda. Nilai utility digunakan untuk
acuan pada nilai akhir penentuan sistem pendukung keputusan.
e. Perangkingan Setiap Alternatif
Perangkingan didapatkan dari hasil perhitungan metode SMARTER dengan
mengurutkan hasil nilai akhir yang telah diproses. Nilai akhir tertinggi menyatakan
bahwa mahasiswa tersebut paling layak menerima bantuan KIPK.
12
2.2.6 Flowchart
Flowchart merupakan media perancangan yang biasa digunakan dalam
pembangunan suatu sistem yang berupa suatu grafik yang disertai alur atau
langkah-langkah dari suatu program. Flowchart memiliki beberapa simbol dan
kegunaanya, ditnjukkan pada tabel 2.2:
Tabel 2. 2 Flowchart
No. Nama Simbol Keterangan
1 Terminal Digunakan untuk menunjukkan titik
awal dan akhirnya alur program
2 Flow Digunakan untuk menghubungkan
antar simbol dan memberikan arah
3 Process aliran proses dari satu langkah ke
4 Decision langkah berikutnya.
5 Connector Digunakan untuk menunjukkan
6 Output/Input langkah atau aktifitas dalam suatu
7 Document proses.
Digunakan untuk mengambil
keputusan dari dua alternatif yang
diberikan yaitu “true” atau “false”.
Digunakan untuk menghubungkan
bagian- bagian dari flowchart yang
terpisah.
Merupakan operasi input atau output
yang digunakan untuk memasukkan
data atau mencetak hasil.
Digunakan untuk mencetak hasil
output berbentuk dokumen atau
laporan.
13
2.2.7 Use Case Diagram
Use Case diagram digunakan untuk menggambarkan fungsionalitas dari
sistem. Diagram ini untuk memodelkan perilaku suatu sistem yang dibutuhkan serta
diharapkan pengguna (Firman et al., 2016) atau dapat diartikan sebagai diagram
yang digunakan untuk mengilustrasikan kebutuhan suatu sistem. Use Case
Diagram memiliki beberapa simbol pada tabel 2.3.
Tabel 2. 3 Use Case Nama Keterangan
No. Simbol
1 Actor Digunakan sebagai pemeran atau user
yang akan menjalankan sistem.
2 Use Case Digunakan untuk menunjukkan suatu
3 fungsi yang dimiliki sistem.
4
5 <<include>> Association Digunakan sebagai penghubung atau
6 <<extend>>
relasi antar actor dengan use case.
Generalization Digunakan sebagai penghubung atau
relasi antar actor dengan use case yang
memiliki persamaan.
Include / Uses Digunakan untuk menghubungkan
fungsionalitas yang disediakan oleh
usecase lainnya.
Extend Digunakan untuk menghubungkan
suatu use case menggunakan
fungsionalitas dari use case lainnya
jika suatu kondisi terpenuhi.
2.2.8 MySQL
Menurut Michael Widenius yang merupakan salah satu pencipta MySQL
mengatakan bahwa MySQL merupakan sistem manajemen basis data relasional
open-source yang memungkinkan pengelolaan basis data secara efisien dan
14
mendukung berbagai macam aplikasi. MySQL adalah perngakat lunak yang
berfungsi sebagai sistem manajemen basis data relasional atau yang biasa disebut
dengan Relational Database Management System (RDBMS). Sistem ini
menggunakan Structured Query Language (SQL) untuk mengelola dan
memaniputasi data dalam basis data.
2.2.9 Hypertext Processor (PHP)
Hypertext Processor merupakan salah satu bahasa pemrograman yang
digunakan untuk menerjemahkan kode program basis data menjadi kode mesin
yang dapat dimengerti oleh komputer yang bersifat server_side yang ditambahkan
ke HTML (Supono, 2018). PHP juga dapat diartikan sebagai Bahasa pemrograman
yang digunakan untuk membuat website dinamis dan interaktif yang akan diproses
didalam server dan hasilnya dikirim ke browser user dalam bentuk website.
2.2.10 Website
Website adalah sebuah media yang berisi halaman-halaman yang berisi
informasi yang bisa diakses lewat jalur internet dan dapat dinikmati secara global
(seluruh dunia). Sebuah website pada dasarnya adalah barisan kode-kode yang
berisi kumpulan perintah, yang kemudian diterjemahkan melalui sebuah browser
(Sarwono, 2015:2).
2.2.11 Framework Laravel
Pada April 2011 Taylor Otwell pertama kali menemukan framework PHP
yang up-to-date dengan versi PHP yaitu framework laravel. Laravel merupakan
kerangka kerja pemrograman yang berbasis open source yang memudahkan
penggunaan dan dokumentasi yang lengkap menjadi salah satu faktor mengapa
laravel menjadi primadona dalam beberapa tahun terakhir (Mulyadi, 2015). Laravel
juga menjadi salah satu framework yang dapat membantu pengembang untuk
memaksimalkan penggunaan PHP didalam proses pengembangan website. Selain
itu, Laravel juga memiliki beberapa fitur unggulan, seperti kerangka engine,
routing, dan modularity.
BAB 3. METODE KEGIATAN
3.1 Tempat dan Waktu Pelaksanaan
Dalam penyusunan tugas akhir yang berjudul “Sistem Pendukung Keputusan
Pemilihan Penerima KIP Kuliah Mahasiswa Dengan Menggunakan Metode Simple
Multy Attribute Technique Exploiting Rank Berbasis Web” dilaksanakan di
Politeknik Negeri Jember selama 6 (enam) bulan.
3.2 Alat dan Bahan
3.2.1 Alat
Dalam penyusunan tugas akhir ini diperlukan alat-alat yang membantu
penyusunan tugas akhir yaitu terdiri dari perangkat keras (hardware) dan perangkat
lunak (software).
a. Perangkat Keras (Hardware)
1) Manufacture : Lenovo
2) Type : Lenovo K14 Gen 1
3) Processor : Intel Core i5-1145G7
4) Random Access Memory (RAM) : 8192 (8 GB)
5) Storage : 512GB SSD W10 Pro - 8GB
b. Perangkat Lunak (Software)
1) Operating System : Windows 10
2) Software Document : Microsoft Word, Microsoft Excel
3) Software Programming : Visual Studio Code
4) Browser : Microsoft Edge, Google Chrome
5) Local Server : Xampp
15
16
3.2.2 Bahan
Bahan yang dibutuhkan pada penelitian ini meliputi data berupa kriteria dan
bobot yang merupakan parameter penting dalam penelitian ini. Data tersebut
didapatkan dari hasil wawancara dengan narasumber terkait atau user dan juga
website KIP Kuliah pemerintah.
3.3 Metode Pengumpulan Data
Metode pengumpulan data merupakan teknik atau prosedur yang digunakan
untuk mengumpulkan data yang dibutuhkan dalam penelitian yang berjudul
“Sistem Pendukung Keputusan Penerima KIP Kuliah Mahasiswa Politeknik Negeri
Jember dengan Menggunakan Metode Simple Multy Attribute Rating Technique
Exploiting Rank Berbasis Web” yang dilakukan dengan beberapa tahap sebagai
berikut:
3.3.1 Studi literatur
Studi literatur adalah metode pengumpulan data dengan cara menelaah
berbagai sumber pustaka yang relavan dengan topik penelitian yang diambil. Studi
literatur dilakukan untuk memahami teori dan konsep dasar yang relevan yang
dapat digunakan sebagai referensi dalam pengerjaan tugas akhir ini.
3.3.2 Observasi
Oberservasi merupakan metode pengumpulan data dengan cara mengamati
langsung objek atau situasi yang sedang diteliti. Dalam penelitian ini, observasi
yang dilakukan untuk mengamati langsung bagaimana proses seleksi penerima KIP
Kuliah yang dilakukan di Politeknik Negeri Jember dan juga kriteria yang
digunakan dalam proses penilaian. Observasi ini bertujuan untuk peneliti agar dapat
mengidentifikasi kebutuhan-kebutuhan yang harus dipenuhi oleh sistem pendukung
keputusan yang akan dibuat agar sistem berjalan sesuai tujuan.
17
3.3.3 Wawancara
Wawancara merupakan metode pengumpulan data dengan cara tanya jawab
langsung dengan narasumber yang memiliki pengetahuan dengan topik penelitian
dan juga calon user sistem. Dalam penelitian ini, wawancara dilakukan betujuan
untuk menggali informasi yang lebih mendalam tentang proses seleksi dan kriteria
penerima KIP Kuliah dari pihak yang terlibat langsung, seperti staff administrasi
kemahasiswaan atau panitia seleksi penerima KIP Kuliah. Wawancara ini juga
penting untuk memvalidasi data yang telah diperoleh dari observasi dan studi
literatur dengan cara mengkonfirmasikan data-data yang ditemukan sebelumnya.
3.4 Metode Kegiatan
3.5.1 Metode Waterfall
Metode yang digunakan dalam pengerjaan pengembangan sistem yang akan
dibuat pada tugas akhir ini adalah metode waterfall. Metode waterfall merupakan
model pengembangan perangkat lunak yang terbagi menjadi beberapa tahap atau
aliran yang berurutan dan saling terkait seperti halnya air terjun yang mengalir dari
ketinggian ke daratan dan tidak akan terjadi sebaliknya. Metode waterfall
merupakan metode sistematis dengan menyelesaikan tahapan satu kemudian dapat
melanjutkan ke tahapan selanjutnya.
Gambar 3. 1 Tahapan Metode Waterfall (Presman, 2012)
18
a. Tahap requirement
Pada Tahap requirement, dilakukan analisis kebutuhan dari sistem yang akan
dibangun. Dengan melalui komunikasi antara pengembang dan user agar dapat
membangun sistem yang diharapkan. Komunikasi tersebut yang akan
menghasilkan informasi berupa pengumpulan data yang dapat digunakan sebagai
acuan dalam pengembangan sistem pendukung keputusan pemilihan penerima KIP
Kuliah mahasiswa Politeknik Negeri Jember yang membutuhkan data kriteria dan
sub kriteria yang telah ditentukan oleh panitia pemilihan penerima KIP Kuliah atau
staff kemahasiswaan di Politeknik Negeri Jember. Data-data tersebut dapat
didapatkan melalui studi literatur, wawancara, dan observasi di Politeknik Negeri
Jember.
b. Tahap design
Tahap design merupakan tahap merancang dan desain sistem yang bertujuan
untuk memberikan gambaran mengenai sistem yang dikerjakan dan membantu
dalam mengambarkan keseluruhan rancangan sistem. Tahap perancangan desain
sistem meliputi Use Case Diagram, Activity Diagram, Design Mock Up, dan
struktur database.
c. Tahap implementation
Tahap implementation merupakan tahap implementasi menerjemahkan
desain yang telah dibuat kedalam kode program sehingga semua perintah yang
dibutuhkan dapat terbaca dalam sistem dari start sampai end dengan menggunakan
tools Visual Studio Code.
d. Tahap verification
Tahap verification merupakan tahap kegiatan uji coba acceptence testing
dengan memastikan bahwa sistem yang dibangun telah sesuai kebutuhan dan
system testing yaitu memastikan bahwa semua bagian sistem bekerja dengan benar.
Uji coba sistem dilakukan oleh user sistem yaitu panitia pemilihan penerima KIPK
Politeknik Negeri Jember dan Mahasiswa calon penerima KIPK dengan tujuan
untuk memastikan kesesuaian sistem dengan kebutuhan dan juga mengindentifikasi
dan memperbaiki bug.
19
e. Tahap Maintenance
Tahap Maintenance merupakan tahap terakhir yang ada di metode waterfall
yaitu tahap pemeliharaan. Dengan diperbarui yang berguna untuk memastikan
kelangsungan fungsionalitas seperti perbaikan bug, pembaruan sistem, dan
pengelolaan data.
3.5 Perancangan Sistem
3.5.1 Algoritma Sistem
Algoritma sistem merupakan langkah-langkah cara kerja sistem atau alur
proses program yang digambarkan dengan flowchart berikut:
Gambar 3. 2 Flowchart Sistem
20
Pada Gambar 3.2 di atas menggambarkan alur sistem yang dimulai dari
halaman login yang dapat digunakan untuk 3 user yaitu mahasiswa, admin, dan
pengelola. Mahasiswa dapat melakukan verifikasi akun yang kemudian dapat
dialihkan ke halaman beranda kemudian menginputkan formular. User admin dapat
melakukan CRUD data mahasiswa, CRUD data kriteria, CRUD data subkriteria,
dan CRUD formulir, kemudian admin dapat memvalidasi data alternatif yang telah
diinputkan mahasiswa sebelumnya yang akan dilanjutkan pada perhitungan metode
SMARTER yang kemudian dapat menghasilkan rangking serta penginputan kuota
oleh admin dan pengelola yang menghasilkan hasil penerimaan. Bukti diterima
dapat dicetak guna untuk verifikasi terhadap mahasiswa yang menerima dengan
orang tua.
21
3.5.2 Use Case Diagram
Gambar 3. 3 Use Case
Pada Gambar 3.3 menunjukkan gambaran fungsional sistem yang terdiri dari
3 aktor yaitu mahasiswa, admin dan pengelola yaitu wakil direktur 3 Politeknik
Negeri Jember. Mahasiswa dapat mengakses dan mengisi formulir data mahasiswa
serta dapat melihat hasil akhir penerima KIPK yang juga dapat diakses oleh admin
dan pengelola. Admin mendapatkan hak akses mengolah data mahasiswa,
mengolah data kriteria dan subkriteria, melakukan serta mengelola perhitungan
SMARTER, mengelola hasil penilaian dan validasi data mahasiswa. Sedangkan
pengelola hanya memiliki hak akses melihat data kriteria dan subkriteria, data
mahasiswa, dan hasil penilaian serta pengelola juga mendapatkan hak akses
mengelola kuota penerima KIPK.
22
3.5.3 Activity Diagram
Activity Diagram merupakan diagram yang mengambarkan alur kerja atau
aktifitas dari sebuah sistem yang akan digunakan pada sistem ini adalah sebagai
berikut:
a. Activity Diagram Mahasiswa
Gambar 3. 4 Activity Diagram Mahasiswa
Pada Gambar 3.4 merupakan activity diagram mahasiswa yang diawali
dengan membuka website kemudian sistem menampilkan halaman login dan
register. Terdapat button login, jika mahasiswa memiliki akun maka mahasiswa
dapat melakukan proses login dengan menginputkan username dan password.
Sebaliknya, jika siswa belum memiliki akun, maka dialihkan ke halaman register
untuk pendaftaran akun terlebih dahulu dengan menginputkan nama, uname dan
23
password, kemudian melakukan proses login kembali. Sistem akan memvalidasi
dengan mengecek apakah inputan sesuai atau tidak, jika sesuai akan dialihkan ke
halaman dashboard dan dapat menginputkan formulir, dan jika tidak sesuai maka
akan melakukan proses login kembali.
b. Activity Diagram Admin
Gambar 3. 5 Activity Diagram Admin
Pada Gambar 3.5 merupakan activity diagram admin yang diawali dengan
membuka website kemudian sistem menampilkan halaman login dengan
menginputkan username dan password sistem akan memvalidasi dengan mengecek
apakah inputan sesuai atau tidak, jika sesuai akan dialihkan ke halaman dashboard.
Admin dapat melakukan CRUD data mahasiswa, data kriteria, data subkriteria.
Selanjutnya semua data akan disimpan oleh sistem yang kemudian dilalukan
24
perhitungan SMARTER sehingga dapat menghasilkan hasil akhir perangkingan
penerimaan KIPK mahasiswa.
c. Activity Diagram Pengelola
Gambar 3. 6 Activity Diagram Pengelola
Pada Gambar 3.6 merupakan activity diagram admin yang diawali dengan
membuka website kemudian sistem menampilkan halaman login dengan
menginputkan username dan password sistem akan memvalidasi dengan mengecek
apakah inputan sesuai atau tidak, jika sesuai akan dialihkan ke halaman dashboard.
Pengelola dapat menginputkan kuota penerima KIPK yang kemudian diproses oleh
sistem menghasilkan nilai akhir penentu mahasiswa penerima KIPK.
25
3.5.4 Algoritma Metode SMARTER
Algoritma perhitungan metode Simple Multy Attribute Rating Technique
Exploiting Rank dapat digambarkan dengan flowchart sebagai berikut:
Gambar 3.7 Flowchart metode SMARTER
Pada Gambar 3.7 menggambarkan alur sistem metode SMARTER yang
dimulai dengan menentukan kriteria dan sub kriteria berserta tingkat prioritas yang
telah ditetapkan oleh panitia pemilihan KIP Kuliah atau staff kemahasiswaan
Politeknik Negeri Jember yaitu dengan kriteria atau parameter yang terfokus
kepada kepemilikan KIP Sekolah, Tingkatan Desil dan Kondisi Ekonomi.
26
Kemudian kriteria-kriteria tersebut dipecah menjadi sub kriteria agar pembobotan
yang dilakukan lebih spesifik dengan pembobotan yang menggunakan metode Rank
Order Centroid (ROC). Hasil dari pembobotan tersebut digunakan untuk mencari
nilai ultility yang didapatkan dari hasil kali bobot kriteria dengan subktiteria
sehingga seluruh nilai utility dapat dijumlahkan untuk menentukan hasil akhir
perhitungan seberapa layak mahasiswa tersebut untuk mendapatkan KIP Kuliah.
3.5.5 Mockup
Mockup merupakan gambaran yang digunakan untuk menunjukan desain
antarmuka pengguna yang dilengkapi dengan elemen-elemen visualnya sebagai
berikut:
Gambar 3. 8 Mockup dashboard user sebagai Admin
Pada gambar 3.8 terdapat rancangan design mockup dengan user sebagai
admin yang dilengkapi dengan beberapa fitur dan tampilan pada navbar terdapat
pilihan beberapa option yang akan menampilkan data master yang berisi data
kriteria dan subkriteria, data mahasiswa, data formulir dan informasi user. Terdapat
data perhitungan yang merupakan tempat perhitungan data.
27
Gambar 3. 9 Mockup dashboard user sebagai Pengelola
Pada gambar 3.9 terdapat rancangan design mockup dengan user sebagai
pengelola Dimana pengelola hanya dapat melihat data master yang berisi data
kriteria dan subkriteria, data mahasiswa, data formulir dan informasi user. Terdapat
data perhitungan yang merupakan tempat perhitungan data. Pengelola dapat
menginputkan kuota pada bagian data perhitungan.
Gambar 3. 10 Mockup umum user sebagai Mahasiswa
Pada gambar 3.10 terdapat rancangan design mockup dengan user sebagai
mahasiswa dimana mahasiswa dapat menginputkan formulir yang akan diteruskan
pada proses validasi oleh admin. Mahasiswa juga dapat melihat hasil perangkingan
atau hasil dari seleksi data dari inputan seluruh mahasiswa.
28
3.5 Pelaksanaan Kegiatan
Dalam proses penyusunan tugas akhir ini terdapat jadwal pelaksanaan untuk
merencanakan estimasi waktu pengerjaan dalam menyelesaikan sistem yang akan
dikembangkan dengan mengikuti langkah-langkah metode waterfall sebagai acuan
dalam pengembangan sistem. Berikut adalah tabel jadwal pelaksanaan kegiatan:
Tabel 3. 1 Pelaksanaan Kegiatan
No. Pelaksanaan Kegiatan 2024 - 2025
Des Jan Feb Mar April Mei
1 Tahap Requirement
2 Tahap Design
3 Tahap Implementation
4 Tahap Verification
5 Tahap Maintenance
29
DAFTAR PUSTAKA
Dasar, K. K. (2011). Sistem informasi akuntansi. Konsep-konsep Dasar Sistem
Informasi Akuntansi, 3(1), 1-32.
Haris Saputro (2012). Modul Pembelajaran Praktek Basis Data (MySQL)
Kementerian Pendidikan dan Kebudayaan Republik Indonesia. (n.d.). Pelajari dan
pahami tahapan pendaftaran KIP Kuliah. Pusat Layanan Pembiayaan
Pendidikan. https://puslapdik.kemdikbud.go.id/pelajari-dan-pahami-
tahapan-pendaftaran-kip-kuliah/
Kementerian Pendidikan dan Kebudayaan Republik Indonesia. (n.d.). KIP Kuliah.
Lembaga Layanan Pendidikan Tinggi Wilayah VIII.
https://lldikti8.kemdikbud.go.id/kip-kuliah/
Kholisah, S. N. (2024) Sistem Pendukung Keputusan Penerima Permohonan
Penyesuaian UKT Bagi Mahasiswa Politeknik Negeri Jember
Mahkamah Konstitusi Republik Indonesia. (2022). Resume perkara nomor
21/PUU-XX/2022 tentang BHP dan SIDIKNAS.
Mustakim, S.T. M.Kom. (2018) Simple Multi attribute Rating Technique Exploiting
Ranks (SMARTER) research Organization of Predatech UIN Sultan Syarif
Kasim Riau
Nur, M., Nurdin, N., & Ulva, A. F. (2023). Sistem Pendukung Keputusan Penentuan
Penerima KIP-Kuliah Menggunakan Metode SMART. Sisfo: Jurnal Ilmiah
Sistem Informasi, 7(2), 82-96.
Pratiwi, H. (2016). Sistem Pendukung Keputusan. Yogyakarta: deepublish, 49-57.
Pressman, R.S. (2012). Rekayasa Perangkat Lunak: Pendekatan Praktisi.
Yogyakarta: Penerbit Andi.
Rohaeni, N. E., & Saryono, O. (2018). Number 1 Indonesian Journal of Education
Management and Administration Review (Vol. 2).
Romney M.B., & Steinbart, P.J. (2015). Accounting information systems (edisi ke-
10). New Jersey: Prentice-Hall Inc.
Sujatmoko, E. (n.d.). Hak Warga Negara Dalam Memperoleh Pendidikan.
Wulandari, T. W. (2023). Rancang Bangun Sistem Seleksi Penentuan Penerima
Bantuan KIP Kuliah di STMIK Muhammadiyah Paguyangan Brebes
30
Menggunakan Metode SAW. Jurnal Teknik Informatika dan Sistem
Informasi, 3(1), 8-14.

View File

@ -1,40 +0,0 @@
SURAT KUASA
Yang bertanda tangan di bawah ini:
Nama : Suryadi
Umur : 55 Tahun
NIK : 3510051408700006
Alamat : Jl. Raya Muncar H. Abdurrozzaq Selatan Pabbrik Panggung RT/RW
01/01, Desa Kedungrejo Kec. Muncar Kab. Banyuwangi
Adalah ayah kandung dari:
Nama : M. Alvalent Shaufan Nazhif
Umur : 16
No Paspor : E6787944
Memberikan kuasa kepada:
Nama : Ilyas Pasaribu
Umur : 28 tahun
No Paspor : E2161918
Pendidikan : Mahasiswa Pasca Sarjana Universitas Al-Azhar
Untuk menjadi wali dari anak saya guna pengurusan visa. Demikian surat kuasa ini dibuat dengan
sungguh-sungguh untuk dipergunakan semestinya.
Palembang, 15 Febuari 2025 Yang menerima kuasa
Yang memberi kuasa
Suryadi Ilyas Pasaribu

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
function i({state:a,splitKeys:n}){return{newTag:"",state:a,createTag:function(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag:function(t){this.state=this.state.filter(e=>e!==t)},reorderTags:function(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{"x-on:blur":"createTag()","x-model":"newTag","x-on:keydown"(t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},"x-on:paste"(){this.$nextTick(()=>{if(n.length===0){this.createTag();return}let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default};
function i({state:a,splitKeys:n}){return{newTag:"",state:a,createTag:function(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag:function(t){this.state=this.state.filter(e=>e!==t)},reorderTags:function(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{["x-on:blur"]:"createTag()",["x-model"]:"newTag",["x-on:keydown"](t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},["x-on:paste"](){this.$nextTick(()=>{if(n.length===0){this.createTag();return}let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,173 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{ $title }}</title>
<style>
body {
font-family: Arial, sans-serif;
font-size: 12px;
}
.header-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 0;
}
.header-table td {
vertical-align: top;
}
.logo {
width: 70px;
height: 70px;
}
.instansi-text {
text-align: center;
font-size: 14px;
font-weight: bold;
line-height: 1.5;
}
.line {
border-top: 2px solid black;
margin-top: 5px;
margin-bottom: 5px;
}
.document-info {
font-size: 11px;
margin-top: 5px;
margin-bottom: 15px;
}
.document-info div {
margin-bottom: 2px;
}
.title {
text-align: center;
font-size: 14px;
font-weight: bold;
}
.subtitle {
text-align: center;
margin-bottom: 10px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}
th, td {
border: 1px solid #000;
padding: 5px;
text-align: left;
}
th {
background-color: #f0f0f0;
}
.badge {
padding: 3px 6px;
border-radius: 3px;
font-size: 11px;
}
.success {
background-color: #d4edda;
color: #155724;
}
.warning {
background-color: #fff3cd;
color: #856404;
}
.danger {
background-color: #f8d7da;
color: #721c24;
}
.footer {
text-align: right;
margin-top: 40px;
}
</style>
</head>
<body>
<!-- HEADER -->
<table class="header-table" style="border: none;">
<tr>
<td style="width: 15%; border: none;">
<img src="{{ public_path('images/logo-polije.png') }}" class="logo" alt="Logo">
</td>
<td style="width: 85%; border: none;" class="instansi-text">
KEMENTERIAN PENDIDIKAN TINGGI, SAINS, DAN TEKNOLOGI<br>
POLITEKNIK NEGERI JEMBER<br>
JL. Mastrip PO BOX 164 Jember 68101
</td>
</tr>
</table>
<div class="line"></div>
<!-- INFO DOKUMEN -->
<div class="document-info">
<div><strong>Kode Dokumen</strong>: FR-JUR-031</div>
<div><strong>Tanggal Berlaku</strong>: {{ \Carbon\Carbon::parse($date)->format('d/m/Y') }}</div>
<div><strong>Revisi</strong>: 0</div>
<div><strong>Halaman</strong>: 1</div>
</div>
<!-- JUDUL -->
<div class="title">{{ $title }}</div>
<div class="subtitle">Tanggal: {{ \Carbon\Carbon::parse($date)->format('d F Y') }}</div>
<!-- TABEL -->
<table>
<thead>
<tr>
<th>No</th>
<th>Nama Mahasiswa</th>
<th>Jurusan</th>
<th>Program Studi</th>
<th>Akreditasi</th>
<th>Total Nilai</th>
<th>Hasil</th>
</tr>
</thead>
<tbody>
@foreach($data as $index => $item)
<tr>
<td>{{ $index + 1 }}</td>
<td>{{ $item->mahasiswa->nama }}</td>
<td>{{ $item->mahasiswa->jurusan->nama }}</td>
<td>{{ $item->mahasiswa->prodi->nama }}</td>
<td>{{ $item->mahasiswa->prodi->akreditasi }}</td>
<td>{{ number_format($item->total_nilai, 4) }}</td>
<td>
@if($item->hasil == 'Diterima')
<span class="badge success">Diterima</span>
@else
<span class="badge danger">Tidak Diterima</span>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
<div class="footer">
<p>Dicetak pada: {{ now()->format('d F Y H:i:s') }}</p>
</div>
</body>
</html>

View File

@ -1,27 +0,0 @@
@php
$url = $url instanceof \Closure ? $url($record ?? null) : $url;
// Dapatkan path file dari URL
$path = str_replace('/storage/berkas/', '', $url);
@endphp
@if($url)
<div class="w-full">
<div class="border border-gray-300 rounded-lg overflow-hidden bg-white">
<embed
src="{{ asset('berkas/' . $path) }}"
type="application/pdf"
width="100%"
height="800px"
class="w-full"
/>
</div>
<div class="mt-2 flex justify-end">
<a href="{{ $url }}" class="text-primary-600 hover:text-primary-500 flex items-center" target="_blank">
<span class="mr-2">Download PDF</span>
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"/>
</svg>
</a>
</div>
</div>
@endif

View File

@ -1,21 +0,0 @@
<x-filament-panels::page>
<div class="space-y-6">
<div class="bg-white rounded-lg shadow p-6">
<h2 class="text-2xl font-bold mb-4">Selamat Datang di Sistem KIP-K</h2>
<p class="text-gray-600">
Sistem ini digunakan untuk pendaftaran dan pengelolaan Kartu Indonesia Pintar Kuliah (KIP-K).
Silakan gunakan menu navigasi di sebelah kiri untuk mengakses fitur-fitur yang tersedia.
</p>
</div>
<div class="bg-white rounded-lg shadow p-6">
<h3 class="text-xl font-semibold mb-4">Informasi Penting</h3>
<ul class="list-disc list-inside space-y-2 text-gray-600">
<li>Pastikan data diri Anda sudah lengkap dan valid</li>
<li>Lengkapi semua berkas yang diperlukan sesuai dengan persyaratan</li>
<li>Periksa status pengajuan Anda secara berkala</li>
<li>Jika ada kendala, silakan hubungi admin</li>
</ul>
</div>
</div>
</x-filament-panels::page>

View File

@ -1,12 +0,0 @@
<x-filament-panels::page>
<div class="space-y-6">
<div class="bg-white rounded-lg shadow p-6">
<h2 class="text-2xl font-bold mb-4">Form Pendaftaran KIP-K</h2>
<p class="text-gray-600 mb-4">
Silakan lengkapi form pendaftaran berikut untuk mengajukan KIP-K. Pastikan semua data yang Anda masukkan valid dan lengkap.
</p>
<livewire:wizard-form />
</div>
</div>
</x-filament-panels::page>

View File

@ -1,12 +0,0 @@
<x-filament-panels::page>
<div class="space-y-6">
<div class="bg-white rounded-lg shadow p-6">
<h2 class="text-2xl font-bold mb-4">Pengumuman Hasil Seleksi KIP-K</h2>
<p class="text-gray-600 mb-4">
Berikut adalah status pengajuan dan hasil seleksi KIP-K Anda. Silakan periksa secara berkala untuk mendapatkan informasi terbaru.
</p>
{{ $this->table }}
</div>
</div>
</x-filament-panels::page>

View File

@ -1,26 +0,0 @@
<x-filament-panels::page>
<div class="space-y-6">
<div class="bg-white rounded-xl shadow-sm p-6">
<h2 class="text-lg font-medium text-gray-900 mb-4">Informasi Status</h2>
{{ $this->infolist }}
</div>
<div class="bg-white rounded-xl shadow-sm p-6">
<h2 class="text-lg font-medium text-gray-900 mb-4">Status Progres</h2>
<div class="space-y-4">
<div class="flex items-center space-x-2">
<div class="h-2 w-2 rounded-full bg-blue-500"></div>
<span class="text-sm text-gray-600">Data Anda sedang dalam proses validasi</span>
</div>
<div class="flex items-center space-x-2">
<div class="h-2 w-2 rounded-full bg-yellow-500"></div>
<span class="text-sm text-gray-600">Tim akan memeriksa kelengkapan dokumen Anda</span>
</div>
<div class="flex items-center space-x-2">
<div class="h-2 w-2 rounded-full bg-green-500"></div>
<span class="text-sm text-gray-600">Hasil seleksi akan diumumkan sesuai jadwal</span>
</div>
</div>
</div>
</div>
</x-filament-panels::page>

View File

@ -1,7 +0,0 @@
<x-filament::button
type="submit"
wire:click="submit"
class="w-full"
>
Simpan Data
</x-filament::button>

View File

@ -1,3 +1,5 @@
<x-filament-panels::page>
{{ $this->form }}
<form wire:submit.prevent="submit">
{{ $this->form }}
</form>
</x-filament-panels::page>

View File

@ -1,26 +0,0 @@
<x-filament-panels::page>
<div class="space-y-6">
<div class="bg-white rounded-xl shadow-sm p-6">
<h2 class="text-lg font-medium text-gray-900 mb-4">Informasi Progres Data</h2>
{{ $this->infolist }}
</div>
<div class="bg-white rounded-xl shadow-sm p-6">
<h2 class="text-lg font-medium text-gray-900 mb-4">Status Progres</h2>
<div class="space-y-4">
<div class="flex items-center space-x-2">
<div class="h-2 w-2 rounded-full bg-blue-500"></div>
<span class="text-sm text-gray-600">Data Anda sedang dalam proses validasi</span>
</div>
<div class="flex items-center space-x-2">
<div class="h-2 w-2 rounded-full bg-yellow-500"></div>
<span class="text-sm text-gray-600">Tim akan memeriksa kelengkapan dokumen Anda</span>
</div>
<div class="flex items-center space-x-2">
<div class="h-2 w-2 rounded-full bg-green-500"></div>
<span class="text-sm text-gray-600">Hasil seleksi akan diumumkan sesuai jadwal</span>
</div>
</div>
</div>
</div>
</x-filament-panels::page>

View File

@ -1,31 +0,0 @@
@php
$record = $getRecord();
@endphp
@if($record->status === 'tidak_valid')
<div class="text-danger-600">
Mohon maaf, berkas Anda dinyatakan tidak valid.
@if($record->alasan_tidak_valid)
<br>
<small>Alasan: {{ $record->alasan_tidak_valid }}</small>
@endif
</div>
@elseif($record->status === 'valid')
@if($record->hasil === 'Layak')
<div class="text-success-600">
Selamat! Anda dinyatakan LULUS seleksi dan berhak menerima KIP-K.
</div>
@elseif($record->hasil === 'Dipertimbangkan')
<div class="text-warning-600">
Anda masuk dalam daftar pertimbangan. Mohon tunggu pengumuman selanjutnya.
</div>
@else
<div class="text-danger-600">
Mohon maaf, Anda dinyatakan TIDAK LULUS seleksi KIP-K.
</div>
@endif
@else
<div class="text-gray-500">
Berkas Anda masih dalam proses validasi.
</div>
@endif

View File

@ -1,60 +0,0 @@
<x-app-layout>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow-xl sm:rounded-lg p-6">
<h2 class="text-2xl font-bold mb-4">Hasil Pengumuman KIP-K</h2>
@if($pengumuman)
<div class="mb-4">
<h3 class="font-semibold">Status Berkas:</h3>
<div class="mt-2">
@if($pengumuman->status === 'valid')
<span class="px-2 py-1 bg-green-100 text-green-800 rounded">Valid</span>
@elseif($pengumuman->status === 'tidak_valid')
<span class="px-2 py-1 bg-red-100 text-red-800 rounded">Tidak Valid</span>
@else
<span class="px-2 py-1 bg-yellow-100 text-yellow-800 rounded">Dalam Proses Validasi</span>
@endif
</div>
</div>
@if($pengumuman->status === 'tidak_valid')
<div class="mt-4 p-4 bg-red-50 text-red-700 rounded">
<p class="font-semibold">Mohon maaf, berkas Anda dinyatakan tidak valid.</p>
@if($pengumuman->alasan_tidak_valid)
<p class="mt-2">Alasan: {{ $pengumuman->alasan_tidak_valid }}</p>
@endif
</div>
@elseif($pengumuman->status === 'valid')
<div class="mt-4">
<h3 class="font-semibold">Hasil Seleksi:</h3>
<div class="mt-4">
@if($pengumuman->hasil === 'Layak')
<div class="p-4 bg-green-50 text-green-700 rounded">
<p class="font-semibold">Selamat! Anda dinyatakan LULUS seleksi dan berhak menerima KIP-K.</p>
</div>
@elseif($pengumuman->hasil === 'Dipertimbangkan')
<div class="p-4 bg-yellow-50 text-yellow-700 rounded">
<p class="font-semibold">Anda masuk dalam daftar pertimbangan. Mohon tunggu pengumuman selanjutnya.</p>
</div>
@else
<div class="p-4 bg-red-50 text-red-700 rounded">
<p class="font-semibold">Mohon maaf, Anda dinyatakan TIDAK LULUS seleksi KIP-K.</p>
</div>
@endif
</div>
</div>
@else
<div class="mt-4 p-4 bg-gray-50 text-gray-700 rounded">
<p>Berkas Anda masih dalam proses validasi. Silakan cek kembali nanti.</p>
</div>
@endif
@else
<div class="p-4 bg-yellow-50 text-yellow-700 rounded">
<p>Anda belum mengajukan pendaftaran KIP-K.</p>
</div>
@endif
</div>
</div>
</div>
</x-app-layout>

View File

@ -1,165 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Surat Keterangan KIP-K</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
margin: 40px;
font-size: 12px;
}
.header-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 0;
}
.header-table td {
vertical-align: top;
}
.logo {
width: 70px;
height: 70px;
}
.instansi-text {
text-align: center;
font-size: 14px;
font-weight: bold;
line-height: 1.5;
}
.line {
border-top: 2px solid black;
margin-top: 5px;
margin-bottom: 5px;
}
.document-info {
font-size: 11px;
margin-top: 5px;
margin-bottom: 15px;
}
.document-info div {
margin-bottom: 2px;
}
.header {
text-align: center;
margin-bottom: 30px;
}
.content {
margin-bottom: 30px;
}
.footer {
margin-top: 50px;
text-align: right;
}
.signature {
margin-top: 50px;
text-align: right;
}
.signature-line {
margin-top: 50px;
border-top: 1px solid black;
width: 200px;
margin-left: auto;
}
</style>
</head>
<body>
<!-- HEADER -->
<table class="header-table" style="border: none;">
<tr>
<td style="width: 15%; border: none;">
<img src="{{ public_path('images/logo-polije.png') }}" class="logo" alt="Logo">
</td>
<td style="width: 85%; border: none;" class="instansi-text">
KEMENTERIAN PENDIDIKAN TINGGI, SAINS, DAN TEKNOLOGI<br>
POLITEKNIK NEGERI JEMBER<br>
JL. Mastrip PO BOX 164 Jember 68101
</td>
</tr>
</table>
<div class="line"></div>
<div class="header">
<h2>SURAT KETERANGAN</h2>
<h3>PENERIMA KIP-K</h3>
<p>Nomor: {{ date('Y') }}/KIP-K/{{ str_pad($mahasiswa->id, 4, '0', STR_PAD_LEFT) }}</p>
</div>
<div class="content">
<p>Yang bertanda tangan di bawah ini, Kepala Program Studi {{ $mahasiswa->prodi->nama ?? '-' }}, menyatakan bahwa:</p>
<table style="margin-left: 40px;">
<tr>
<td>No. Registrasi KIP-K</td>
<td>: {{ $mahasiswa->noreg_kipk }}</td>
</tr>
<tr>
<td>Nama Lengkap</td>
<td>: {{ $mahasiswa->nama }}</td>
</tr>
<tr>
<td>NIM</td>
<td>: {{ $mahasiswa->NIM }}</td>
</tr>
<tr>
<td>Program Studi</td>
<td>: {{ $mahasiswa->prodi->nama ?? '-' }}</td>
</tr>
<tr>
<td>Jurusan</td>
<td>: {{ $mahasiswa->jurusan->nama ?? '-' }}</td>
</tr>
<tr>
<td>Akreditasi Prodi</td>
<td>: {{ $mahasiswa->akreditasi }}</td>
</tr>
<tr>
<td>Angkatan</td>
<td>: {{ $mahasiswa->angkatan }}</td>
</tr>
<tr>
<td>Jalur Masuk</td>
<td>: {{ $mahasiswa->jalur_masuk }}</td>
</tr>
<tr>
<td>No. Handphone</td>
<td>: {{ $mahasiswa->ponsel }}</td>
</tr>
<tr>
<td>Alamat</td>
<td>: {{ $mahasiswa->alamat }}</td>
</tr>
</table>
<p style="margin-top: 20px;">
Telah dinyatakan <strong>DITERIMA</strong> sebagai penerima Kartu Indonesia Pintar Kuliah (KIP-K)
berdasarkan hasil seleksi yang telah dilakukan.
</p>
</div>
<div class="footer">
<p>Jember, {{ \Carbon\Carbon::parse($tanggal)->locale('id')->isoFormat('D MMMM Y') }}</p>
<table style="width: 100%; margin-top: 50px;">
<tr>
<td style="width: 33%; text-align: center;">
<p>Penerima KIP-K</p>
<div style="border-top: 1px solid black; width: 200px; margin: 50px auto 0;"></div>
<p>{{ $mahasiswa->nama }}</p>
</td>
<td style="width: 33%; text-align: center;">
<p>Wali Mahasiswa</p>
<div style="border-top: 1px solid black; width: 200px; margin: 50px auto 0;"></div>
<p>........................</p>
</td>
<td style="width: 33%; text-align: center;">
<p>Kepala Program Studi</p>
<div style="border-top: 1px solid black; width: 200px; margin: 50px auto 0;"></div>
<p>........................</p>
</td>
</tr>
</table>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More