diff --git a/app/Models/listform.php b/app/Models/listform.php deleted file mode 100644 index df0a2a19..00000000 --- a/app/Models/listform.php +++ /dev/null @@ -1,88 +0,0 @@ - 'decimal:7', -// 'nilai_tingkatan_desil' => 'decimal:7', -// 'nilai_kondisi_ekonomi' => 'decimal:7', -// 'total_nilai' => 'decimal:7', -// ]; - -// public function mahasiswa(): BelongsTo -// { -// return $this->belongsTo(Mahasiswa::class); -// } - -// protected static function boot() -// { -// parent::boot(); - -// static::saving(function ($listform) { -// // Hitung jumlah berkas yang diupload -// $berkasCount = 0; -// if (!empty($listform->berkas_sktm)) $berkasCount++; -// if (!empty($listform->berkas_ppke)) $berkasCount++; -// if (!empty($listform->berkas_pmk)) $berkasCount++; -// if (!empty($listform->berkas_pkh)) $berkasCount++; -// if (!empty($listform->berkas_kks)) $berkasCount++; - -// // Tentukan kondisi ekonomi dan nilai berdasarkan jumlah berkas -// if ($berkasCount >= 4) { -// $listform->kondisi_ekonomi = 'Sangat Kurang Mampu'; -// $listform->nilai_kondisi_ekonomi = 0.4; -// } elseif ($berkasCount >= 2) { -// $listform->kondisi_ekonomi = 'Kurang Mampu'; -// $listform->nilai_kondisi_ekonomi = 0.3; -// } else { -// $listform->kondisi_ekonomi = 'Cukup Mampu'; -// $listform->nilai_kondisi_ekonomi = 0.3; -// } - -// // Hitung total nilai -// $totalNilai = 0; - -// // Nilai dari Kepemilikan KIP -// if ($listform->kepemilikan_kip === 'Memiliki KIP') { -// $totalNilai += 0.6; -// } else { -// $totalNilai += 0.4; -// } - -// // Nilai dari Tingkatan Desil -// switch ($listform->tingkatan_desil) { -// case 'Desil 1': -// $totalNilai += 0.35; -// break; -// case 'Desil 2': -// $totalNilai += 0.25; -// break; -// case 'Desil 3': -// $totalNilai += 0.20; -// break; -// case 'Desil 4': -// $totalNilai += 0.15; -// break; -// case 'Desil 5': -// $totalNilai += 0.05; -// break; -// } - -// // Tambahkan nilai kondisi ekonomi -// $totalNilai += $listform->nilai_kondisi_ekonomi; - -// $listform->total_nilai = $totalNilai; -// }); -// } - -// } diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 2492697c..68e101ec 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -4,30 +4,141 @@ 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->hasRole(['admin', 'super_admin']); + return $user->can('view_any_user'); } - public function view(User $user, User $model): bool + /** + * Determine whether the user can view the model. + * + * @param \App\Models\User $user + * @return bool + */ + public function view(User $user): bool { - return $user->hasRole(['admin', 'super_admin']); + 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->hasRole(['admin', 'super_admin']); + return $user->can('create_user'); } - public function update(User $user, User $model): bool + /** + * Determine whether the user can update the model. + * + * @param \App\Models\User $user + * @return bool + */ + public function update(User $user): bool { - return $user->hasRole(['admin', 'super_admin']); + return $user->can('update_user'); } - public function delete(User $user, User $model): bool + /** + * Determine whether the user can delete the model. + * + * @param \App\Models\User $user + * @return bool + */ + public function delete(User $user): bool { - return $user->hasRole(['admin', 'super_admin']); + return $user->can('delete_user'); } -} \ No newline at end of file + + /** + * 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'); + } +} diff --git a/app/Policies/parameterPolicy.php b/app/Policies/parameterPolicy.php index c3ced267..7c9bbfe9 100644 --- a/app/Policies/parameterPolicy.php +++ b/app/Policies/parameterPolicy.php @@ -105,12 +105,4 @@ public function reorder(User $user): bool { return $user->can('reorder_pengumuman'); } - - public function show() - { - $pengumuman = Parameter::where('mahasiswa_id', auth()->user()->mahasiswa->id) - ->first(); - - return view('pengumuman', compact('pengumuman')); - } } diff --git a/config/filament-shield.php b/config/filament-shield.php index 451c6c52..157bca4d 100644 --- a/config/filament-shield.php +++ b/config/filament-shield.php @@ -68,7 +68,7 @@ 'enabled' => true, 'pages' => [ - 'Dashboard', + // Hapus Dashboard dari sini ], 'widgets' => [ diff --git a/config/permission.php b/config/permission.php new file mode 100644 index 00000000..8e84e9d5 --- /dev/null +++ b/config/permission.php @@ -0,0 +1,202 @@ + [ + + /* + * 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', + ], +]; diff --git a/database/migrations/2024_03_14_add_alasan_tidak_valid_to_parameters.php b/database/migrations/2024_03_14_add_alasan_tidak_valid_to_parameters.php deleted file mode 100644 index ce51655f..00000000 --- a/database/migrations/2024_03_14_add_alasan_tidak_valid_to_parameters.php +++ /dev/null @@ -1,22 +0,0 @@ -text('alasan_tidak_valid')->nullable(); - }); - } - - public function down() - { - Schema::table('parameters', function (Blueprint $table) { - $table->dropColumn('alasan_tidak_valid'); - }); - } -}; \ No newline at end of file diff --git a/database/migrations/2025_03_11_222431_create_parameters_table.php b/database/migrations/2025_02_20_222431_create_parameters_table.php similarity index 82% rename from database/migrations/2025_03_11_222431_create_parameters_table.php rename to database/migrations/2025_02_20_222431_create_parameters_table.php index 990693cb..238320d0 100644 --- a/database/migrations/2025_03_11_222431_create_parameters_table.php +++ b/database/migrations/2025_02_20_222431_create_parameters_table.php @@ -6,10 +6,7 @@ return new class extends Migration { - /** - * Run the migrations. - */ - public function up(): void + public function up() { Schema::create('parameters', function (Blueprint $table) { $table->id(); @@ -37,14 +34,17 @@ public function up(): void ]); // Untuk Kriteria 3: Kondisi Ekonomi - $table->enum('kondisi_ekonomi', ['Sangat Kurang Mampu', 'Kurang Mampu', 'Cukup Mampu']); + $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 - // $table->string('berkas_pkh')->nullable(); // Khusus Sangat Kurang Mampu - // $table->string('berkas_kks')->nullable(); // Khusus Sangat Kurang Mampu // Untuk Kriteria 4: Status Orang tua $table->enum('status_orang_tua', [ @@ -60,27 +60,30 @@ public function up(): void // 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'); - // // Untuk menyimpan nilai perhitungan + // 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); - // Status form - // $table->enum('status', ['draft', 'submitted'])->default('draft'); - $table->enum('status', ['belum_validasi', 'valid','tidak_valid'])->default('belum_validasi'); + // Hasil penilaian + $table->enum('hasil', ['Layak', 'Dipertimbangkan', 'Tidak Layak'])->nullable(); + $table->timestamps(); }); } - /** - * Reverse the migrations. - */ - public function down(): void + public function down() { Schema::dropIfExists('parameters'); } -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/database/migrations/2025_02_22_213634_create_listforms_table.php b/database/migrations/2025_02_22_213634_create_listforms_table.php deleted file mode 100644 index 686c41b8..00000000 --- a/database/migrations/2025_02_22_213634_create_listforms_table.php +++ /dev/null @@ -1,60 +0,0 @@ -id(); - $table->foreignId('mahasiswa_id')->constrained('mahasiswas')->cascadeOnDelete(); - - // Untuk Kriteria 1: Kepemilikan KIP - $table->enum('kepemilikan_kip', ['Memiliki KIP', 'Tidak Memiliki KIP']); - - // Untuk Kriteria 2: Tingkatan Desil - $table->enum('tingkatan_desil', [ - 'Desil 1', - 'Desil 2', - 'Desil 3', - 'Desil 4', - 'Desil 5' - ]); - - // Untuk Kriteria 3: Kondisi Ekonomi - $table->enum('kondisi_ekonomi', ['Sangat Kurang Mampu', 'Kurang Mampu', 'Cukup Mampu']); - - // Berkas untuk Kondisi Ekonomi - $table->string('berkas_sktm')->nullable(); // Untuk semua kondisi - $table->string('berkas_ppke')->nullable(); // Untuk Kurang Mampu & Sangat Kurang Mampu - $table->string('berkas_pmk')->nullable(); // Untuk Kurang Mampu & Sangat Kurang Mampu - $table->string('berkas_pkh')->nullable(); // Khusus Sangat Kurang Mampu - $table->string('berkas_kks')->nullable(); // Khusus Sangat Kurang Mampu - - // Untuk menyimpan nilai perhitungan - $table->decimal('nilai_kepemilikan_kip', 10, 7)->default(0); - $table->decimal('nilai_tingkatan_desil', 10, 7)->default(0); - $table->decimal('nilai_kondisi_ekonomi', 10, 7)->default(0); - $table->decimal('total_nilai', 10, 7)->default(0); - - // Status form - $table->enum('status', ['draft', 'submitted'])->default('draft'); - - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('listforms'); - } -}; diff --git a/database/migrations/2025_03_16_212442_update_kondisi_ekonomi_on_parameters.php b/database/migrations/2025_03_16_212442_update_kondisi_ekonomi_on_parameters.php deleted file mode 100644 index 76d759f9..00000000 --- a/database/migrations/2025_03_16_212442_update_kondisi_ekonomi_on_parameters.php +++ /dev/null @@ -1,37 +0,0 @@ -enum('kondisi_ekonomi', [ - 'Sangat Kurang Mampu', - 'Kurang Mampu', - 'Cukup Mampu', - 'Tidak Menerima Bantuan' - ])->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('parameters', function (Blueprint $table) { - $table->enum('kondisi_ekonomi', [ - 'Sangat Kurang Mampu', - 'Kurang Mampu', - 'Cukup Mampu' - ])->change(); - }); - } -}; diff --git a/database/migrations/2025_03_16_214500_add_hasil_column_to_parameters.php b/database/migrations/2025_03_16_214500_add_hasil_column_to_parameters.php deleted file mode 100644 index 5933833f..00000000 --- a/database/migrations/2025_03_16_214500_add_hasil_column_to_parameters.php +++ /dev/null @@ -1,30 +0,0 @@ -enum('hasil', ['Layak', 'Dipertimbangkan', 'Tidak Layak']) - ->after('total_nilai') - ->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('parameters', function (Blueprint $table) { - $table->dropColumn('hasil'); - }); - } -}; \ No newline at end of file diff --git a/database/migrations/2025_04_26_093632_create_permission_tables.php b/database/migrations/2025_04_26_093632_create_permission_tables.php new file mode 100644 index 00000000..70a120f3 --- /dev/null +++ b/database/migrations/2025_04_26_093632_create_permission_tables.php @@ -0,0 +1,140 @@ +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']); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 6a0713ee..ee321f1b 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -12,10 +12,12 @@ class DatabaseSeeder extends Seeder public function run(): void { $this->call([ + RoleSeeder::class, UserSeeder::class, KriteriaSeeder::class, SubKriteriaSeeder::class, MahasiswaSeeder::class, + SuperAdminPermissionSeeder::class, ]); } } diff --git a/database/seeders/KriteriaSeeder.php b/database/seeders/KriteriaSeeder.php index b9de5f43..ea8de3f7 100644 --- a/database/seeders/KriteriaSeeder.php +++ b/database/seeders/KriteriaSeeder.php @@ -17,21 +17,35 @@ public function run(): void [ 'nama' => 'Kepemilikan KIP', 'prioritas' => 1, - 'bobot' => 0.5555, + 'bobot' => 0.5208333, ], [ 'nama' => 'Tingkatan Desil', 'prioritas' => 2, - 'bobot' => 0.25, + 'bobot' => 0.2708333, ], [ 'nama' => 'Kondisi Ekonomi', 'prioritas' => 3, - 'bobot' => 0.20, + 'bobot' => 0.1458333, + ], + [ + 'nama' => 'Status Orang Tua', + 'prioritas' => 4, + 'bobot' => 0.0625000, ], - ]; + // 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); } diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php new file mode 100644 index 00000000..5aa2b815 --- /dev/null +++ b/database/seeders/RoleSeeder.php @@ -0,0 +1,42 @@ + '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); + } +} \ No newline at end of file diff --git a/database/seeders/SubKriteriaSeeder.php b/database/seeders/SubKriteriaSeeder.php index 8a180644..6dd80ad5 100644 --- a/database/seeders/SubKriteriaSeeder.php +++ b/database/seeders/SubKriteriaSeeder.php @@ -20,14 +20,14 @@ public function run(): void 'nama' => 'Memiliki KIP', 'deskripsi' => 'Mahasiswa memiliki Kartu Indonesia Pintar', 'prioritas' => 1, - 'bobot' => 0.6, + 'bobot' => 0.3906250, ], [ 'kriteria_id' => 1, 'nama' => 'Tidak Memiliki KIP', 'deskripsi' => 'Mahasiswa tidak memiliki Kartu Indonesia Pintar', 'prioritas' => 2, - 'bobot' => 0.4, + 'bobot' => 0.1302083, ], // Subkriteria untuk Tingkatan Desil (kriteria_id: 2) @@ -36,35 +36,35 @@ public function run(): void 'nama' => 'Desil 1', 'deskripsi' => 'Tingkat kesejahteraan terendah', 'prioritas' => 1, - 'bobot' => 0.35, + 'bobot' => 0.1238805, ], [ 'kriteria_id' => 2, 'nama' => 'Desil 2', 'deskripsi' => 'Tingkat kesejahteraan sangat rendah', 'prioritas' => 2, - 'bobot' => 0.25, + 'bobot' => 0.0695139, ], [ 'kriteria_id' => 2, 'nama' => 'Desil 3', 'deskripsi' => 'Tingkat kesejahteraan rendah', 'prioritas' => 3, - 'bobot' => 0.20, + 'bobot' => 0.0424306, ], [ 'kriteria_id' => 2, 'nama' => 'Desil 4', 'deskripsi' => 'Tingkat kesejahteraan menengah bawah', 'prioritas' => 4, - 'bobot' => 0.15, + 'bobot' => 0.0243750, ], [ 'kriteria_id' => 2, 'nama' => 'Desil 5', 'deskripsi' => 'Tingkat kesejahteraan menengah', 'prioritas' => 5, - 'bobot' => 0.05, + 'bobot' => 0.0108333, ], // Subkriteria untuk Kondisi Ekonomi (kriteria_id: 3) @@ -73,21 +73,51 @@ public function run(): void 'nama' => 'Sangat Kurang Mampu', 'deskripsi' => 'Memiliki lebih dari 2 bantuan pemerintah', 'prioritas' => 1, - 'bobot' => 0.4, + 'bobot' => 0.0759548, ], [ 'kriteria_id' => 3, 'nama' => 'Kurang Mampu', 'deskripsi' => 'Memiliki 2 bantuan pemerintah', 'prioritas' => 2, - 'bobot' => 0.3, + 'bobot' => 0.0394965, ], [ 'kriteria_id' => 3, 'nama' => 'Cukup Mampu', - 'deskripsi' => 'Penghasilan diatas UMR', + 'deskripsi' => 'Mahasiswa memiliki 1 bantuan pemerintah', 'prioritas' => 3, - 'bobot' => 0.3, + 'bobot' => 0.0212674, + ], + [ + 'kriteria_id' => 3, + 'nama' => 'Tidak Menerima Bantuan', + 'deskripsi' => 'Mahasiswa tidak memiliki bantuan pemerintah', + 'prioritas' => 4, + 'bobot' => 0.0091146, + ], + + // Subkriteria untuk Status Orang Tua (kriteria_id: 4) + [ + 'kriteria_id' => 4, + 'nama' => 'Kedua Orang Tua Wafat', + 'deskripsi' => 'Ayah dan Ibu wafat', + 'prioritas' => 1, + 'bobot' => 0.0381944, + ], + [ + 'kriteria_id' => 4, + 'nama' => 'Salah Satu Orang Tua Wafat', + 'deskripsi' => 'Ayah atau Ibu-nya wafat', + 'prioritas' => 2, + 'bobot' => 0.0173611, + ], + [ + 'kriteria_id' => 4, + 'nama' => 'Kedua Orang Tua Masih Hidup', + 'deskripsi' => 'Ayah dan Ibu-nya masih hidup', + 'prioritas' => 3, + 'bobot' => 0.0069444, ], ]; diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index 05a0b538..2ffe25b5 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -18,12 +18,15 @@ public function run(): void // Cek apakah email sudah ada if (!User::where('email', 'najwa@admin.com')->exists()) { - User::create([ + $user = User::create([ 'name' => 'Najwa', 'email' => 'najwa@admin.com', 'password' => Hash::make('12345678'), 'email_verified_at' => now() ]); + + // Berikan role super_admin + $user->assignRole('super_admin'); } // Tambahkan user lain jika diperlukan