Compare commits
No commits in common. "main" and "master" have entirely different histories.
|
@ -1,11 +1,11 @@
|
|||
APP_NAME=Laravel
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_KEY=base64:YOUR_APP_KEY
|
||||
APP_DEBUG=true
|
||||
APP_TIMEZONE=UTC
|
||||
APP_URL=http://localhost
|
||||
APP_TIMEZONE=Asia/Jakarta
|
||||
APP_URL=http://localhost:8000
|
||||
|
||||
APP_LOCALE=en
|
||||
APP_LOCALE=id
|
||||
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=sqlite
|
||||
# DB_HOST=127.0.0.1
|
||||
# DB_PORT=3306
|
||||
# DB_DATABASE=laravel
|
||||
# DB_USERNAME=root
|
||||
# DB_PASSWORD=
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=your_database
|
||||
DB_USERNAME=your_username
|
||||
DB_PASSWORD=your_password
|
||||
|
||||
SESSION_DRIVER=database
|
||||
SESSION_LIFETIME=120
|
|
@ -1,12 +0,0 @@
|
|||
name: Issues
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [labeled]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
help-wanted:
|
||||
uses: laravel/.github/.github/workflows/issues.yml@main
|
|
@ -1,12 +0,0 @@
|
|||
name: Pull Requests
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
uneditable:
|
||||
uses: laravel/.github/.github/workflows/pull-requests.yml@main
|
|
@ -1,47 +0,0 @@
|
|||
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
|
|
@ -1,13 +0,0 @@
|
|||
name: Update Changelog
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [released]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
update:
|
||||
permissions:
|
||||
contents: write
|
||||
uses: laravel/.github/.github/workflows/update-changelog.yml@main
|
|
@ -1,9 +0,0 @@
|
|||
php:
|
||||
preset: laravel
|
||||
disabled:
|
||||
- no_unused_imports
|
||||
finder:
|
||||
not-name:
|
||||
- index.php
|
||||
js: true
|
||||
css: true
|
124
CHANGELOG.md
124
CHANGELOG.md
|
@ -1,124 +0,0 @@
|
|||
# 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.
|
|
@ -0,0 +1,36 @@
|
|||
<?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'),
|
||||
),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
<?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();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
<?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'),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -2,12 +2,18 @@
|
|||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\Listform;
|
||||
use App\Models\Parameter;
|
||||
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;
|
||||
|
@ -21,30 +27,25 @@ 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;
|
||||
|
||||
// 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 array $data = [];
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -55,147 +56,235 @@ 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(),
|
||||
TextInput::make('jurusan')
|
||||
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')
|
||||
->required(),
|
||||
TextInput::make('prodi')
|
||||
->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()
|
||||
->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([
|
||||
Select::make('kepemilikan_kip')
|
||||
->label('Kepemilikan KIP')
|
||||
->options([
|
||||
'Memiliki KIP' => 'Memiliki KIP',
|
||||
'Tidak Memiliki KIP' => 'Tidak Memiliki KIP',
|
||||
])
|
||||
->required(),
|
||||
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('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']),
|
||||
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'),
|
||||
]),
|
||||
]),
|
||||
]),
|
||||
]),
|
||||
])
|
||||
->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()
|
||||
];
|
||||
->submitAction(view('filament.pages.wizard-form-submit-button'))
|
||||
])
|
||||
->statePath('data');
|
||||
}
|
||||
|
||||
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' => $data['jurusan'],
|
||||
'prodi' => $data['prodi'],
|
||||
'NIM' => $data['nim'],
|
||||
'jurusan_id' => $data['jurusan_id'],
|
||||
'prodi_id' => $data['prodi_id'],
|
||||
'akreditasi' => $data['akreditasi'] ?? Prodi::find($data['prodi_id'])->akreditasi,
|
||||
'angkatan' => $data['angkatan'],
|
||||
'semester' => $data['semester'],
|
||||
'jalur_masuk' => $data['jalur_masuk'],
|
||||
'ponsel' => $data['ponsel'],
|
||||
'alamat' => $data['alamat'],
|
||||
]);
|
||||
|
||||
// Simpan data listform
|
||||
Listform::create([
|
||||
// Simpan data parameter
|
||||
Parameter::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_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',
|
||||
'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',
|
||||
]);
|
||||
|
||||
DB::commit();
|
||||
|
@ -206,7 +295,7 @@ public function submit()
|
|||
->body('Data berhasil disimpan')
|
||||
->send();
|
||||
|
||||
$this->form->fill(); // Reset form
|
||||
$this->redirect('/admin/');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
|
|
|
@ -17,15 +17,22 @@
|
|||
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-rectangle-stack';
|
||||
protected static ?string $navigationGroup = 'Data Master';
|
||||
protected static ?string $slug = 'daftar-formulir';
|
||||
protected static ?string $navigationIcon = 'heroicon-o-clipboard-document';
|
||||
protected static ?int $navigationSort = 5;
|
||||
protected static ?string $slug = 'daftar-formulir';
|
||||
|
||||
public static function getNavigationGroup(): ?string
|
||||
{
|
||||
return auth()->user()->roles[0]->name === 'mahasiswa'
|
||||
? null
|
||||
: 'Data Master';
|
||||
}
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
|
@ -54,7 +61,8 @@ public static function table(Table $table): Table
|
|||
TextColumn::make('nama'),
|
||||
TextColumn::make('tgl_pembuatan')
|
||||
->label('Tanggal'),
|
||||
TextColumn::make('kuota'),
|
||||
TextColumn::make('kuota')
|
||||
->visible(fn () => !Auth::user()->hasRole('mahasiswa')),
|
||||
TextColumn::make('status')
|
||||
->badge()
|
||||
->color(fn (string $state): string => match ($state) {
|
||||
|
@ -67,6 +75,20 @@ 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')
|
||||
|
@ -75,7 +97,8 @@ 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([
|
||||
|
|
|
@ -3,103 +3,202 @@
|
|||
namespace App\Filament\Resources;
|
||||
|
||||
use App\Filament\Resources\HasilResource\Pages;
|
||||
use App\Filament\Resources\HasilResource\RelationManagers;
|
||||
use App\Models\Hasil;
|
||||
use Filament\Forms;
|
||||
use App\Models\Parameter;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\SoftDeletingScope;
|
||||
use Filament\Forms\Components\Select;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Tables\Columns\TextColumn;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Notifications\Notification;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class HasilResource extends Resource
|
||||
{
|
||||
protected static ?string $model = Hasil::class;
|
||||
protected static ?string $model = Parameter::class;
|
||||
public static $kuota = 0;
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
|
||||
protected static ?string $navigationIcon = 'heroicon-o-clipboard-document-check';
|
||||
protected static ?string $navigationGroup = 'Penilaian';
|
||||
protected static ?string $navigationLabel = 'Hasil Penilaian';
|
||||
protected static ?int $navigationSort = 2;
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
return $form
|
||||
->schema([
|
||||
Select::make('mahasiswa_id')
|
||||
->label('Mahasiswa')
|
||||
->relationship('mahasiswa', 'nama')
|
||||
->searchable()
|
||||
->required(),
|
||||
|
||||
TextInput::make('total_bobot')
|
||||
->label('Total Bobot')
|
||||
->numeric()
|
||||
->readOnly(),
|
||||
|
||||
Select::make('status')
|
||||
->label('Status')
|
||||
->options([
|
||||
'Layak' => 'Layak',
|
||||
'Dipertimbangkan' => 'Dipertimbangkan',
|
||||
'Tidak Layak' => 'Tidak Layak',
|
||||
])
|
||||
->required(),
|
||||
]);
|
||||
}
|
||||
protected static ?string $slug = 'hasil-penilaian';
|
||||
|
||||
protected static ?string $modelLabel = 'Hasil Penilaian';
|
||||
protected static ?string $pluralModelLabel = 'Hasil Penilaian';
|
||||
protected static ?string $breadcrumb = 'Hasil Penilaian';
|
||||
|
||||
public static function table(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
->columns([
|
||||
TextColumn::make('mahasiswa.nama')
|
||||
->label('Nama Mahasiswa')
|
||||
->sortable()
|
||||
->searchable(),
|
||||
|
||||
TextColumn::make('total_bobot')
|
||||
->label('Total Bobot')
|
||||
->sortable(),
|
||||
|
||||
TextColumn::make('status')
|
||||
->label('Status')
|
||||
->badge()
|
||||
->color(fn ($record) => match ($record->status) {
|
||||
'Layak' => 'success',
|
||||
'Dipertimbangkan' => 'warning',
|
||||
'Tidak Layak' => 'danger',
|
||||
}),
|
||||
|
||||
|
||||
])
|
||||
->filters([
|
||||
//
|
||||
])
|
||||
->actions([
|
||||
Tables\Actions\EditAction::make(),
|
||||
])
|
||||
->bulkActions([
|
||||
Tables\Actions\BulkActionGroup::make([
|
||||
Tables\Actions\DeleteBulkAction::make(),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
->headerActions([
|
||||
Tables\Actions\Action::make('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();
|
||||
|
||||
public static function getRelations(): array
|
||||
{
|
||||
return [
|
||||
//
|
||||
];
|
||||
$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',
|
||||
}),
|
||||
])
|
||||
->defaultSort('total_nilai', 'desc')
|
||||
->filters([
|
||||
Tables\Filters\SelectFilter::make('hasil')
|
||||
->options([
|
||||
'Diterima' => 'Diterima',
|
||||
'Tidak Diterima' => 'Tidak Diterima',
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
public static function getPages(): array
|
||||
{
|
||||
return [
|
||||
'index' => Pages\ListHasils::route('/'),
|
||||
'create' => Pages\CreateHasil::route('/create'),
|
||||
'edit' => Pages\EditHasil::route('/{record}/edit'),
|
||||
'index' => Pages\ListHasil::route('/'),
|
||||
'akreditasi-a' => Pages\HasilAkreditasiA::route('/akreditasi-a'),
|
||||
'akreditasi-b' => Pages\HasilAkreditasiB::route('/akreditasi-b'),
|
||||
'akreditasi-c' => Pages\HasilAkreditasiC::route('/akreditasi-c'),
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,152 @@
|
|||
<?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',
|
||||
]),
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
<?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',
|
||||
]),
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
<?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',
|
||||
]),
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -3,10 +3,9 @@
|
|||
namespace App\Filament\Resources\HasilResource\Pages;
|
||||
|
||||
use App\Filament\Resources\HasilResource;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\CreateRecord;
|
||||
use Filament\Resources\Pages\ListRecords;
|
||||
|
||||
class CreateHasil extends CreateRecord
|
||||
class ListHasil extends ListRecords
|
||||
{
|
||||
protected static string $resource = HasilResource::class;
|
||||
}
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -26,6 +26,10 @@ 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
|
||||
{
|
||||
|
@ -36,7 +40,9 @@ public static function form(Form $form): Form
|
|||
TextInput::make('prioritas')
|
||||
->required(),
|
||||
TextInput::make('bobot')
|
||||
->required(),
|
||||
->disabled()
|
||||
->helperText('Bobot akan dihitung otomatis oleh sistem')
|
||||
// ->required(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,223 +0,0 @@
|
|||
<?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'),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -14,12 +14,13 @@
|
|||
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-rectangle-stack';
|
||||
protected static ?string $navigationIcon = 'heroicon-o-user-group';
|
||||
protected static ?string $navigationGroup = 'Data Master';
|
||||
// protected static ?string $navigationLabel = 'Mahasiswa';
|
||||
// protected static ?string $modelLabel = 'Mahasiswa';
|
||||
|
@ -27,6 +28,11 @@ 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
|
||||
|
@ -39,15 +45,20 @@ public static function form(Form $form): Form
|
|||
TextInput::make('NIM')
|
||||
->label('NIM')
|
||||
->required(),
|
||||
TextInput::make('jurusan')
|
||||
Select::make('jurusan_id')
|
||||
->label('Jurusan')
|
||||
->relationship('jurusan', 'nama')
|
||||
->required(),
|
||||
TextInput::make('prodi')
|
||||
Select::make('prodi_id')
|
||||
->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')
|
||||
|
@ -68,11 +79,10 @@ public static function table(Table $table): Table
|
|||
// ->shortable(), //biar urut berdasarkan abjad
|
||||
TextColumn::make('NIM')
|
||||
->label('NIM'),
|
||||
TextColumn::make('jurusan'),
|
||||
TextColumn::make('prodi')
|
||||
->label('Program Studi'),
|
||||
TextColumn::make('jurusan.nama')->label('Jurusan'),
|
||||
TextColumn::make('prodi.nama')->label('Program Studi'),
|
||||
TextColumn::make('prodi.akreditasi')->label('Akreditasi Prodi'),
|
||||
TextColumn::make('angkatan'),
|
||||
TextColumn::make('semester'),
|
||||
TextColumn::make('jalur_masuk'),
|
||||
TextColumn::make('ponsel'),
|
||||
TextColumn::make('alamat'),
|
||||
|
|
|
@ -0,0 +1,666 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
<?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;
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
<?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;
|
||||
}
|
|
@ -35,6 +35,10 @@ 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
|
||||
{
|
||||
|
@ -55,7 +59,9 @@ public static function form(Form $form): Form
|
|||
->required(),
|
||||
TextInput::make('bobot')
|
||||
->numeric()
|
||||
->required(),
|
||||
->disabled()
|
||||
->helperText('Bobot akan dihitung otomatis oleh sistem')
|
||||
// ->required(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -14,12 +14,13 @@
|
|||
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-rectangle-stack';
|
||||
protected static ?string $navigationIcon = 'heroicon-o-user';
|
||||
protected static ?string $navigationGroup = 'Data Master';
|
||||
protected static ?string $slug = 'user';
|
||||
|
||||
|
@ -44,7 +45,12 @@ public static function form(Form $form): Form
|
|||
TextInput::make('password')
|
||||
->password()
|
||||
->required()
|
||||
// ->hiddenOn('edit'),
|
||||
->hiddenOn('edit'),
|
||||
Select::make('roles')
|
||||
->multiple()
|
||||
->relationship('roles', 'name')
|
||||
->preload()
|
||||
->helperText('Biarkan kosong untuk role default (mahasiswa)'),
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -58,6 +64,9 @@ 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()
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filament\Widgets;
|
||||
|
||||
use Filament\Widgets\AccountWidget as BaseWidget;
|
||||
|
||||
class CustomAccountWidget extends BaseWidget
|
||||
{
|
||||
protected int | string | array $columnSpan = 'full';
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
<?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()),
|
||||
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
<?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) . '"'
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?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'));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
|
@ -6,11 +6,12 @@
|
|||
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;
|
||||
use HasFactory, Notifiable, HasRoles;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
|
@ -4,15 +4,81 @@
|
|||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class kriteria extends Model
|
||||
class Kriteria extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $guarded = [];
|
||||
// protected $fillable = [
|
||||
// 'nama',
|
||||
// 'prioritas',
|
||||
// 'bobot'
|
||||
// ];
|
||||
protected $fillable = [
|
||||
'nama',
|
||||
'prioritas',
|
||||
'bobot'
|
||||
];
|
||||
|
||||
public function subKriteria(): HasMany
|
||||
{
|
||||
return $this->hasMany(SubKriteria::class);
|
||||
}
|
||||
|
||||
protected static function boot()
|
||||
{
|
||||
parent::boot();
|
||||
|
||||
// Tambahkan event saving untuk mengatur bobot awal
|
||||
static::saving(function ($kriteria) {
|
||||
if (is_null($kriteria->bobot)) {
|
||||
$kriteria->bobot = 0;
|
||||
}
|
||||
});
|
||||
|
||||
static::saved(function ($kriteria) {
|
||||
// Hitung ulang bobot untuk semua kriteria
|
||||
$allKriteria = static::orderBy('prioritas')->get();
|
||||
$totalKriteria = $allKriteria->count();
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
foreach ($allKriteria as $k) {
|
||||
$bobot = static::hitungBobot($k->prioritas, $totalKriteria);
|
||||
|
||||
DB::table('kriterias')
|
||||
->where('id', $k->id)
|
||||
->update(['bobot' => $bobot]);
|
||||
|
||||
// Update bobot subkriteria yang terkait
|
||||
$subkriterias = SubKriteria::where('kriteria_id', $k->id)
|
||||
->orderBy('prioritas')
|
||||
->get();
|
||||
|
||||
if ($subkriterias->count() > 0) {
|
||||
foreach ($subkriterias as $sub) {
|
||||
$totalSub = $subkriterias->count();
|
||||
$subBobot = SubKriteria::hitungBobot($sub->prioritas, $totalSub, $bobot);
|
||||
|
||||
DB::table('subkriterias')
|
||||
->where('id', $sub->id)
|
||||
->update(['bobot' => $subBobot]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
throw $e;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Helper function untuk menghitung bobot
|
||||
public static function hitungBobot($prioritas, $total)
|
||||
{
|
||||
$bobot = 0;
|
||||
for ($i = $prioritas; $i <= $total; $i++) {
|
||||
$bobot += (1 / $i);
|
||||
}
|
||||
return $bobot / $total;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,87 +0,0 @@
|
|||
<?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;
|
||||
});
|
||||
}
|
||||
}
|
|
@ -5,9 +5,41 @@
|
|||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class mahasiswa extends Model
|
||||
class Mahasiswa extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $guarded = [];
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,196 @@
|
|||
<?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';
|
||||
// }
|
||||
});
|
||||
}
|
||||
}
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class SubKriteria extends Model
|
||||
{
|
||||
|
@ -12,18 +14,64 @@ class SubKriteria extends Model
|
|||
protected $table = 'subkriterias'; //soalnya buatnya manual
|
||||
protected $guarded = [];
|
||||
|
||||
// protected $table = 'subkriterias';
|
||||
|
||||
// protected $fillable = [
|
||||
// 'kriteria_id',
|
||||
// 'nama',
|
||||
// 'deskripsi',
|
||||
// 'prioritas',
|
||||
// 'bobot'
|
||||
// ];
|
||||
protected $fillable = [
|
||||
'kriteria_id',
|
||||
'nama',
|
||||
'deskripsi',
|
||||
'prioritas',
|
||||
'bobot'
|
||||
];
|
||||
|
||||
public function kriteria()
|
||||
public function kriteria(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Kriteria::class, 'kriteria_id');
|
||||
return $this->belongsTo(Kriteria::class);
|
||||
}
|
||||
|
||||
protected static function boot()
|
||||
{
|
||||
parent::boot();
|
||||
|
||||
// Tambahkan event saving untuk mengatur bobot awal
|
||||
static::saving(function ($subKriteria) {
|
||||
if (is_null($subKriteria->bobot)) {
|
||||
$subKriteria->bobot = 0;
|
||||
}
|
||||
});
|
||||
|
||||
static::saved(function ($subKriteria) {
|
||||
// Hitung ulang bobot untuk semua subkriteria dalam kriteria yang sama
|
||||
$kriteria = Kriteria::find($subKriteria->kriteria_id);
|
||||
if (!$kriteria) return;
|
||||
|
||||
$allSubKriteria = static::where('kriteria_id', $subKriteria->kriteria_id)
|
||||
->orderBy('prioritas')
|
||||
->get();
|
||||
$totalSubKriteria = $allSubKriteria->count();
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
foreach ($allSubKriteria as $sk) {
|
||||
$subBobot = static::hitungBobot($sk->prioritas, $totalSubKriteria, $kriteria->bobot);
|
||||
|
||||
DB::table('subkriterias')
|
||||
->where('id', $sk->id)
|
||||
->update(['bobot' => $subBobot]);
|
||||
}
|
||||
DB::commit();
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
throw $e;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Helper function untuk menghitung bobot
|
||||
public static function hitungBobot($prioritas, $total, $bobotKriteria)
|
||||
{
|
||||
$bobot = 0;
|
||||
for ($i = $prioritas; $i <= $total; $i++) {
|
||||
$bobot += (1 / $i);
|
||||
}
|
||||
return ($bobot / $total) * $bobotKriteria;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
<?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 }}');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,144 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\Providers\Filament;
|
||||
|
||||
use BezhanSalleh\FilamentShield\FilamentShieldPlugin;
|
||||
use Filament\Http\Middleware\Authenticate;
|
||||
use Filament\Http\Middleware\AuthenticateSession;
|
||||
use Filament\Http\Middleware\DisableBladeIconComponents;
|
||||
|
@ -17,6 +18,9 @@
|
|||
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
|
||||
{
|
||||
|
@ -27,18 +31,21 @@ 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::Amber,
|
||||
'primary' => Color::Blue,
|
||||
])
|
||||
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
|
||||
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
|
||||
->pages([
|
||||
Pages\Dashboard::class,
|
||||
WizardForm::class,
|
||||
])
|
||||
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
|
||||
->widgets([
|
||||
Widgets\AccountWidget::class,
|
||||
Widgets\FilamentInfoWidget::class,
|
||||
CustomAccountWidget::class,
|
||||
])
|
||||
->spa()
|
||||
->middleware([
|
||||
|
@ -54,6 +61,10 @@ public function panel(Panel $panel): Panel
|
|||
])
|
||||
->authMiddleware([
|
||||
Authenticate::class,
|
||||
])
|
||||
->sidebarCollapsibleOnDesktop()
|
||||
->plugins([
|
||||
\BezhanSalleh\FilamentShield\FilamentShieldPlugin::make(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,12 +7,17 @@
|
|||
"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"
|
||||
"laravel/tinker": "^2.9",
|
||||
"phpoffice/phpspreadsheet": "*",
|
||||
"spatie/laravel-permission": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.23",
|
||||
"laravel/breeze": "*",
|
||||
"laravel/pail": "^1.1",
|
||||
"laravel/pint": "^1.13",
|
||||
"laravel/sail": "^1.26",
|
||||
|
|
|
@ -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": "0cefc8f8c8f7320e732db22110e017ed",
|
||||
"content-hash": "57dba14cea890cadf8142ea60b0ac958",
|
||||
"packages": [
|
||||
{
|
||||
"name": "anourvalar/eloquent-serialize",
|
||||
|
@ -72,6 +72,170 @@
|
|||
},
|
||||
"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",
|
||||
|
@ -351,6 +515,85 @@
|
|||
],
|
||||
"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",
|
||||
|
@ -850,6 +1093,161 @@
|
|||
],
|
||||
"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",
|
||||
|
@ -3140,6 +3538,191 @@
|
|||
],
|
||||
"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",
|
||||
|
@ -3802,6 +4385,112 @@
|
|||
],
|
||||
"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",
|
||||
|
@ -4707,6 +5396,71 @@
|
|||
],
|
||||
"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",
|
||||
|
@ -4885,6 +5639,89 @@
|
|||
],
|
||||
"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",
|
||||
|
@ -7640,6 +8477,67 @@
|
|||
},
|
||||
"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",
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
<?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,
|
||||
],
|
||||
|
||||
];
|
|
@ -60,6 +60,13 @@
|
|||
'report' => false,
|
||||
],
|
||||
|
||||
'berkas' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/berkas'),
|
||||
'url' => env('APP_URL').'/storage/berkas',
|
||||
'visibility' => 'public',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|
@ -75,6 +82,7 @@
|
|||
|
||||
'links' => [
|
||||
public_path('storage') => storage_path('app/public'),
|
||||
public_path('berkas') => storage_path('app/berkas'),
|
||||
],
|
||||
|
||||
];
|
||||
|
|
|
@ -0,0 +1,202 @@
|
|||
<?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',
|
||||
],
|
||||
];
|
|
@ -0,0 +1,22 @@
|
|||
<?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');
|
||||
}
|
||||
};
|
|
@ -0,0 +1,24 @@
|
|||
<?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');
|
||||
}
|
||||
};
|
|
@ -13,13 +13,14 @@ 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->string('jurusan');
|
||||
$table->string('prodi');
|
||||
$table->foreignId('jurusan_id')->constrained('jurusans')->cascadeOnDelete();
|
||||
$table->foreignId('prodi_id')->constrained('prodis')->cascadeOnDelete();
|
||||
$table->string('akreditasi');
|
||||
$table->string('angkatan');
|
||||
$table->string('semester');
|
||||
$table->string('jalur_masuk');
|
||||
$table->string('ponsel');
|
||||
$table->string('alamat');
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
<?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');
|
||||
}
|
||||
};
|
|
@ -1,60 +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
|
||||
{
|
||||
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');
|
||||
}
|
||||
};
|
|
@ -1,30 +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
|
||||
{
|
||||
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');
|
||||
}
|
||||
};
|
|
@ -0,0 +1,140 @@
|
|||
<?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']);
|
||||
}
|
||||
};
|
|
@ -12,10 +12,15 @@ 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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,21 +17,40 @@ public function run(): void
|
|||
[
|
||||
'nama' => 'Kepemilikan KIP',
|
||||
'prioritas' => 1,
|
||||
'bobot' => 0.5555,
|
||||
'bobot' => 0.4566667,
|
||||
],
|
||||
[
|
||||
'nama' => 'Terdata DTKS',
|
||||
'prioritas' => 2,
|
||||
'bobot' => 0.2566667,
|
||||
],
|
||||
[
|
||||
'nama' => 'Tingkatan Desil',
|
||||
'prioritas' => 2,
|
||||
'bobot' => 0.25,
|
||||
'prioritas' => 3,
|
||||
'bobot' => 0.1566667,
|
||||
],
|
||||
[
|
||||
'nama' => 'Kondisi Ekonomi',
|
||||
'prioritas' => 3,
|
||||
'bobot' => 0.20,
|
||||
'prioritas' => 4,
|
||||
'bobot' => 0.09,
|
||||
],
|
||||
[
|
||||
'nama' => 'Status Orang Tua',
|
||||
'prioritas' => 5,
|
||||
'bobot' => 0.04,
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
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;
|
||||
|
||||
|
@ -13,47 +16,58 @@ class MahasiswaSeeder extends Seeder
|
|||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$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 user dengan role mahasiswa
|
||||
// $users = User::role('mahasiswa')->get();
|
||||
|
||||
foreach ($mahasiswas as $mahasiswa) {
|
||||
Mahasiswa::create($mahasiswa);
|
||||
}
|
||||
// // 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
|
||||
// ]));
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,151 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,174 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
|
@ -20,74 +20,118 @@ public function run(): void
|
|||
'nama' => 'Memiliki KIP',
|
||||
'deskripsi' => 'Mahasiswa memiliki Kartu Indonesia Pintar',
|
||||
'prioritas' => 1,
|
||||
'bobot' => 0.6,
|
||||
'bobot' => 0.3425000,
|
||||
],
|
||||
[
|
||||
'kriteria_id' => 1,
|
||||
'nama' => 'Tidak Memiliki KIP',
|
||||
'deskripsi' => 'Mahasiswa tidak memiliki Kartu Indonesia Pintar',
|
||||
'prioritas' => 2,
|
||||
'bobot' => 0.4,
|
||||
'bobot' => 0.1141667,
|
||||
],
|
||||
|
||||
// Subkriteria untuk Tingkatan Desil (kriteria_id: 2)
|
||||
// Subkriteria untuk Terdata dalam DTKS (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.35,
|
||||
'bobot' => 0.0715445,
|
||||
],
|
||||
[
|
||||
'kriteria_id' => 2,
|
||||
'kriteria_id' => 3,
|
||||
'nama' => 'Desil 2',
|
||||
'deskripsi' => 'Tingkat kesejahteraan sangat rendah',
|
||||
'prioritas' => 2,
|
||||
'bobot' => 0.25,
|
||||
'bobot' => 0.0402111,
|
||||
],
|
||||
[
|
||||
'kriteria_id' => 2,
|
||||
'kriteria_id' => 3,
|
||||
'nama' => 'Desil 3',
|
||||
'deskripsi' => 'Tingkat kesejahteraan rendah',
|
||||
'prioritas' => 3,
|
||||
'bobot' => 0.20,
|
||||
'bobot' => 0.0245444,
|
||||
],
|
||||
[
|
||||
'kriteria_id' => 2,
|
||||
'kriteria_id' => 3,
|
||||
'nama' => 'Desil 4',
|
||||
'deskripsi' => 'Tingkat kesejahteraan menengah bawah',
|
||||
'prioritas' => 4,
|
||||
'bobot' => 0.15,
|
||||
'bobot' => 0.0141000,
|
||||
],
|
||||
[
|
||||
'kriteria_id' => 2,
|
||||
'kriteria_id' => 3,
|
||||
'nama' => 'Desil 5',
|
||||
'deskripsi' => 'Tingkat kesejahteraan menengah',
|
||||
'prioritas' => 5,
|
||||
'bobot' => 0.05,
|
||||
'bobot' => 0.0062667,
|
||||
],
|
||||
|
||||
// Subkriteria untuk Kondisi Ekonomi (kriteria_id: 3)
|
||||
// Subkriteria untuk Kondisi Ekonomi (kriteria_id: 4)
|
||||
[
|
||||
'kriteria_id' => 3,
|
||||
'kriteria_id' => 4,
|
||||
'nama' => 'Sangat Kurang Mampu',
|
||||
'deskripsi' => 'Penghasilan dibawah UMR',
|
||||
'deskripsi' => 'Memiliki lebih dari 2 bantuan pemerintah',
|
||||
'prioritas' => 1,
|
||||
'bobot' => 0.4,
|
||||
'bobot' => 0.0468750,
|
||||
],
|
||||
[
|
||||
'kriteria_id' => 3,
|
||||
'kriteria_id' => 4,
|
||||
'nama' => 'Kurang Mampu',
|
||||
'deskripsi' => 'Penghasilan setara UMR',
|
||||
'deskripsi' => 'Memiliki 2 bantuan pemerintah',
|
||||
'prioritas' => 2,
|
||||
'bobot' => 0.3,
|
||||
'bobot' => 0.0243750,
|
||||
],
|
||||
[
|
||||
'kriteria_id' => 3,
|
||||
'kriteria_id' => 4,
|
||||
'nama' => 'Cukup Mampu',
|
||||
'deskripsi' => 'Penghasilan diatas UMR',
|
||||
'deskripsi' => 'Mahasiswa memiliki 1 bantuan pemerintah',
|
||||
'prioritas' => 3,
|
||||
'bobot' => 0.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,
|
||||
],
|
||||
];
|
||||
|
||||
|
|
|
@ -2,9 +2,8 @@
|
|||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class UserSeeder extends Seeder
|
||||
|
@ -14,35 +13,38 @@ class UserSeeder extends Seeder
|
|||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$users = [
|
||||
// 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 = [
|
||||
[
|
||||
'name' => 'Najwa',
|
||||
'email' => 'najwa@admin.com',
|
||||
'name' => 'Ahmad Fauzi',
|
||||
'email' => 'ahmad@user.com',
|
||||
'password' => Hash::make('12345678'),
|
||||
'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(),
|
||||
'email_verified_at' => now()
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
foreach ($users as $user) {
|
||||
User::create($user);
|
||||
foreach ($mahasiswas as $mahasiswa) {
|
||||
$user = User::create($mahasiswa);
|
||||
$user->assignRole('mahasiswa');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,909 @@
|
|||
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.
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
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.
After 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
|
@ -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
|
@ -0,0 +1,173 @@
|
|||
<!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>
|
|
@ -0,0 +1,27 @@
|
|||
@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
|
|
@ -0,0 +1,21 @@
|
|||
<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>
|
|
@ -0,0 +1,12 @@
|
|||
<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>
|
|
@ -0,0 +1,12 @@
|
|||
<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>
|
|
@ -0,0 +1,26 @@
|
|||
<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>
|
|
@ -0,0 +1,7 @@
|
|||
<x-filament::button
|
||||
type="submit"
|
||||
wire:click="submit"
|
||||
class="w-full"
|
||||
>
|
||||
Simpan Data
|
||||
</x-filament::button>
|
|
@ -1,5 +1,3 @@
|
|||
<x-filament-panels::page>
|
||||
<form wire:submit.prevent="submit">
|
||||
{{ $this->form }}
|
||||
</form>
|
||||
{{ $this->form }}
|
||||
</x-filament-panels::page>
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
<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>
|
|
@ -0,0 +1,31 @@
|
|||
@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
|
|
@ -0,0 +1,60 @@
|
|||
<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>
|
|
@ -0,0 +1,165 @@
|
|||
<!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
Loading…
Reference in New Issue