From b59804342b391a773c646bcfc9d2c40be2983409 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 25 Aug 2026 19:15:40 +0700 Subject: [PATCH] feat: implement HasValues trait for enums and update related code for consistency --- app/Concerns/ProfileValidationRules.php | 2 +- app/Enums/AttendanceStatus.php | 4 +++ app/Enums/ClassMethod.php | 4 +++ app/Enums/Concerns/HasValues.php | 25 +++++++++++++++++++ app/Enums/FeedbackStatus.php | 4 +++ app/Enums/FeedbackType.php | 4 +++ app/Enums/Gender.php | 4 +++ app/Enums/LetterStatus.php | 4 +++ app/Enums/PaymentStatus.php | 4 +++ app/Enums/RegistrationStatus.php | 4 +++ app/Enums/Semester.php | 4 +++ app/Enums/StudentStatus.php | 4 +++ app/Enums/SubmissionStatus.php | 4 +++ app/Http/Controllers/FeedbackController.php | 5 +--- .../Admin/Manage/CourseClassRequest.php | 2 +- .../Manage/CourseRegistrationRequest.php | 2 +- .../Admin/Master/AcademicTermRequest.php | 2 +- .../Admin/Users/AdministratorRequest.php | 2 +- .../Requests/Admin/Users/LecturerRequest.php | 2 +- .../Requests/Admin/Users/StudentRequest.php | 4 +-- app/Http/Requests/FeedbackRequest.php | 2 +- ...8_03_000002_create_user_profiles_table.php | 2 +- ..._03_000003_create_academic_terms_table.php | 2 +- ...026_08_03_000007_create_students_table.php | 2 +- ..._21_000002_create_course_classes_table.php | 2 +- ..._08_24_000002_create_submissions_table.php | 2 +- ..._08_24_000004_create_attendances_table.php | 2 +- ...4_000006_create_tuition_payments_table.php | 2 +- ...0001_create_course_registrations_table.php | 2 +- ...25_000003_create_letter_requests_table.php | 2 +- ...26_08_25_000006_create_feedbacks_table.php | 4 +-- 31 files changed, 90 insertions(+), 24 deletions(-) create mode 100644 app/Enums/Concerns/HasValues.php diff --git a/app/Concerns/ProfileValidationRules.php b/app/Concerns/ProfileValidationRules.php index 0ed6a26..c10c9e2 100644 --- a/app/Concerns/ProfileValidationRules.php +++ b/app/Concerns/ProfileValidationRules.php @@ -16,7 +16,7 @@ protected function profileRules(?int $userId = null): array 'full_name' => ['required', 'string', 'max:150'], 'phone_number' => ['required', 'string', 'max:20'], 'address' => ['required', 'string'], - 'gender' => ['required', 'string', Rule::in(array_values(Gender::cases()))], + 'gender' => ['required', 'string', Rule::in(Gender::values())], 'birth_date' => ['required', 'date'], 'birth_place' => ['required', 'string', 'max:100'], ]; diff --git a/app/Enums/AttendanceStatus.php b/app/Enums/AttendanceStatus.php index bfe21e2..9fc553b 100644 --- a/app/Enums/AttendanceStatus.php +++ b/app/Enums/AttendanceStatus.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum AttendanceStatus: string { + use HasValues; + case Present = 'present'; case Absent = 'absent'; diff --git a/app/Enums/ClassMethod.php b/app/Enums/ClassMethod.php index 6fa6a0d..e2dad9d 100644 --- a/app/Enums/ClassMethod.php +++ b/app/Enums/ClassMethod.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum ClassMethod: string { + use HasValues; + case Online = 'online'; case Offline = 'offline'; case Hybrid = 'hybrid'; diff --git a/app/Enums/Concerns/HasValues.php b/app/Enums/Concerns/HasValues.php new file mode 100644 index 0000000..fcae63b --- /dev/null +++ b/app/Enums/Concerns/HasValues.php @@ -0,0 +1,25 @@ + + */ + public static function values(): array + { + return array_column(self::cases(), 'value'); + } + + /** + * @return array + */ + public static function options(): array + { + return array_map(fn (self $case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ], self::cases()); + } +} diff --git a/app/Enums/FeedbackStatus.php b/app/Enums/FeedbackStatus.php index 5365e2e..63a8bd7 100644 --- a/app/Enums/FeedbackStatus.php +++ b/app/Enums/FeedbackStatus.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum FeedbackStatus: string { + use HasValues; + case Submitted = 'submitted'; case InReview = 'in_review'; case Resolved = 'resolved'; diff --git a/app/Enums/FeedbackType.php b/app/Enums/FeedbackType.php index 50eb9b9..c074868 100644 --- a/app/Enums/FeedbackType.php +++ b/app/Enums/FeedbackType.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum FeedbackType: string { + use HasValues; + case Kritik = 'kritik'; case Saran = 'saran'; case Aduan = 'aduan'; diff --git a/app/Enums/Gender.php b/app/Enums/Gender.php index b96c362..df6da43 100644 --- a/app/Enums/Gender.php +++ b/app/Enums/Gender.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum Gender: string { + use HasValues; + case Male = 'male'; case Female = 'female'; diff --git a/app/Enums/LetterStatus.php b/app/Enums/LetterStatus.php index 6f34615..f8f866a 100644 --- a/app/Enums/LetterStatus.php +++ b/app/Enums/LetterStatus.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum LetterStatus: string { + use HasValues; + case Submitted = 'submitted'; case InProcess = 'in_process'; case Completed = 'completed'; diff --git a/app/Enums/PaymentStatus.php b/app/Enums/PaymentStatus.php index 8527118..a70d582 100644 --- a/app/Enums/PaymentStatus.php +++ b/app/Enums/PaymentStatus.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum PaymentStatus: string { + use HasValues; + case Unpaid = 'unpaid'; case Partial = 'partial'; case Paid = 'paid'; diff --git a/app/Enums/RegistrationStatus.php b/app/Enums/RegistrationStatus.php index 89501db..24131c9 100644 --- a/app/Enums/RegistrationStatus.php +++ b/app/Enums/RegistrationStatus.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum RegistrationStatus: string { + use HasValues; + case Submitted = 'submitted'; case Approved = 'approved'; case Rejected = 'rejected'; diff --git a/app/Enums/Semester.php b/app/Enums/Semester.php index 9111701..9fcd294 100644 --- a/app/Enums/Semester.php +++ b/app/Enums/Semester.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum Semester: string { + use HasValues; + case odd = 'odd'; case even = 'even'; diff --git a/app/Enums/StudentStatus.php b/app/Enums/StudentStatus.php index 0c16336..1d1e40f 100644 --- a/app/Enums/StudentStatus.php +++ b/app/Enums/StudentStatus.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum StudentStatus: string { + use HasValues; + case Active = 'active'; case OnLeave = 'on_leave'; case Graduated = 'graduated'; diff --git a/app/Enums/SubmissionStatus.php b/app/Enums/SubmissionStatus.php index 9ca1eb7..af00b02 100644 --- a/app/Enums/SubmissionStatus.php +++ b/app/Enums/SubmissionStatus.php @@ -2,8 +2,12 @@ namespace App\Enums; +use App\Enums\Concerns\HasValues; + enum SubmissionStatus: string { + use HasValues; + case NotSubmitted = 'not_submitted'; case Submitted = 'submitted'; diff --git a/app/Http/Controllers/FeedbackController.php b/app/Http/Controllers/FeedbackController.php index 3aa4276..e8df599 100644 --- a/app/Http/Controllers/FeedbackController.php +++ b/app/Http/Controllers/FeedbackController.php @@ -20,10 +20,7 @@ public function index(PaginatedRequest $request): Response { return Inertia::render('feedback/index', [ 'feedbacks' => $this->service->paginated($request->user(), ...$request->validatedWithDefaults()), - 'types' => array_map(fn (FeedbackType $type) => [ - 'value' => $type->value, - 'label' => $type->label(), - ], FeedbackType::cases()), + 'types' => FeedbackType::options(), ]); } diff --git a/app/Http/Requests/Admin/Manage/CourseClassRequest.php b/app/Http/Requests/Admin/Manage/CourseClassRequest.php index 56e2d75..531e930 100644 --- a/app/Http/Requests/Admin/Manage/CourseClassRequest.php +++ b/app/Http/Requests/Admin/Manage/CourseClassRequest.php @@ -27,7 +27,7 @@ public function rules(): array ], 'academic_term_id' => ['required', 'integer', Rule::exists('academic_terms', 'id')], 'class_name' => ['nullable', 'string', 'max:50'], - 'method' => ['nullable', 'string', Rule::in(array_column(ClassMethod::cases(), 'value'))], + 'method' => ['nullable', 'string', Rule::in(ClassMethod::values())], ]; } } diff --git a/app/Http/Requests/Admin/Manage/CourseRegistrationRequest.php b/app/Http/Requests/Admin/Manage/CourseRegistrationRequest.php index fc45fff..668d106 100644 --- a/app/Http/Requests/Admin/Manage/CourseRegistrationRequest.php +++ b/app/Http/Requests/Admin/Manage/CourseRegistrationRequest.php @@ -28,7 +28,7 @@ public function rules(): array ->where('student_id', $this->input('student_id')) ->ignore($registration?->id), ], - 'status' => ['nullable', 'string', Rule::in(array_column(RegistrationStatus::cases(), 'value'))], + 'status' => ['nullable', 'string', Rule::in(RegistrationStatus::values())], 'approved_by' => ['nullable', 'integer', Rule::exists('lecturers', 'id')], ]; } diff --git a/app/Http/Requests/Admin/Master/AcademicTermRequest.php b/app/Http/Requests/Admin/Master/AcademicTermRequest.php index 1fd0e14..e6899d7 100644 --- a/app/Http/Requests/Admin/Master/AcademicTermRequest.php +++ b/app/Http/Requests/Admin/Master/AcademicTermRequest.php @@ -38,7 +38,7 @@ function ($attribute, $value, $fail) { 'semester' => [ 'required', 'string', - Rule::in(array_values(Semester::cases())), + Rule::in(Semester::values()), Rule::unique('academic_terms')->where(function ($query) { return $query->where('name', $this->input('name')); })->ignore($this->route('academic_term')), diff --git a/app/Http/Requests/Admin/Users/AdministratorRequest.php b/app/Http/Requests/Admin/Users/AdministratorRequest.php index be5679f..335567c 100644 --- a/app/Http/Requests/Admin/Users/AdministratorRequest.php +++ b/app/Http/Requests/Admin/Users/AdministratorRequest.php @@ -43,7 +43,7 @@ public function rules(): array 'full_name' => ['required', 'string', 'max:150'], 'phone_number' => ['required', 'string', 'max:20'], 'address' => ['required', 'string'], - 'gender' => ['required', 'string', Rule::in(array_values(Gender::cases()))], + 'gender' => ['required', 'string', Rule::in(Gender::values())], 'birth_date' => ['required', 'date'], 'birth_place' => ['required', 'string', 'max:100'], ]; diff --git a/app/Http/Requests/Admin/Users/LecturerRequest.php b/app/Http/Requests/Admin/Users/LecturerRequest.php index 240a4fc..4ae2bb2 100644 --- a/app/Http/Requests/Admin/Users/LecturerRequest.php +++ b/app/Http/Requests/Admin/Users/LecturerRequest.php @@ -42,7 +42,7 @@ public function rules(): array 'full_name' => ['required', 'string', 'max:150'], 'phone_number' => ['required', 'string', 'max:20'], 'address' => ['required', 'string'], - 'gender' => ['required', 'string', Rule::in(array_values(Gender::cases()))], + 'gender' => ['required', 'string', Rule::in(Gender::values())], 'birth_date' => ['required', 'date'], 'birth_place' => ['required', 'string', 'max:100'], diff --git a/app/Http/Requests/Admin/Users/StudentRequest.php b/app/Http/Requests/Admin/Users/StudentRequest.php index 000306b..dc69c1d 100644 --- a/app/Http/Requests/Admin/Users/StudentRequest.php +++ b/app/Http/Requests/Admin/Users/StudentRequest.php @@ -43,7 +43,7 @@ public function rules(): array 'full_name' => ['required', 'string', 'max:150'], 'phone_number' => ['required', 'string', 'max:20'], 'address' => ['required', 'string'], - 'gender' => ['required', 'string', Rule::in(array_values(Gender::cases()))], + 'gender' => ['required', 'string', Rule::in(Gender::values())], 'birth_date' => ['required', 'date'], 'birth_place' => ['required', 'string', 'max:100'], @@ -72,7 +72,7 @@ public function rules(): array 'status' => [ 'nullable', 'string', - Rule::in(array_values(StudentStatus::cases())), + Rule::in(StudentStatus::values()), ], ]; } diff --git a/app/Http/Requests/FeedbackRequest.php b/app/Http/Requests/FeedbackRequest.php index f241335..487999f 100644 --- a/app/Http/Requests/FeedbackRequest.php +++ b/app/Http/Requests/FeedbackRequest.php @@ -16,7 +16,7 @@ public function authorize(): bool public function rules(): array { return [ - 'type' => ['required', 'string', Rule::in(array_column(FeedbackType::cases(), 'value'))], + 'type' => ['required', 'string', Rule::in(FeedbackType::values())], 'subject' => ['required', 'string', 'max:150'], 'message' => ['required', 'string'], ]; diff --git a/database/migrations/2026_08_03_000002_create_user_profiles_table.php b/database/migrations/2026_08_03_000002_create_user_profiles_table.php index c83bb93..70e1691 100644 --- a/database/migrations/2026_08_03_000002_create_user_profiles_table.php +++ b/database/migrations/2026_08_03_000002_create_user_profiles_table.php @@ -15,7 +15,7 @@ public function up(): void $table->string('full_name', 150); $table->string('phone_number', 20); $table->text('address'); - $table->enum('gender', array_values(Gender::cases())); + $table->enum('gender', Gender::values()); $table->date('birth_date'); $table->string('birth_place', 100); $table->timestamps(); diff --git a/database/migrations/2026_08_03_000003_create_academic_terms_table.php b/database/migrations/2026_08_03_000003_create_academic_terms_table.php index b1d6f2a..53d372d 100644 --- a/database/migrations/2026_08_03_000003_create_academic_terms_table.php +++ b/database/migrations/2026_08_03_000003_create_academic_terms_table.php @@ -12,7 +12,7 @@ public function up(): void Schema::create('academic_terms', function (Blueprint $table) { $table->id(); $table->string('name', 20); - $table->enum('semester', array_values(Semester::cases())); + $table->enum('semester', Semester::values()); $table->date('start_date'); $table->date('end_date'); $table->boolean('is_active')->default(false); diff --git a/database/migrations/2026_08_03_000007_create_students_table.php b/database/migrations/2026_08_03_000007_create_students_table.php index ccc615b..8f7e8d3 100644 --- a/database/migrations/2026_08_03_000007_create_students_table.php +++ b/database/migrations/2026_08_03_000007_create_students_table.php @@ -16,7 +16,7 @@ public function up(): void $table->foreignId('department_id')->constrained()->cascadeOnDelete(); $table->integer('enrollment_year'); $table->foreignId('academic_advisor_id')->nullable()->constrained('lecturers')->nullOnDelete(); - $table->enum('status', array_values(StudentStatus::cases()))->nullable()->default(StudentStatus::Active); + $table->enum('status', StudentStatus::values())->nullable()->default(StudentStatus::Active->value); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/migrations/2026_08_21_000002_create_course_classes_table.php b/database/migrations/2026_08_21_000002_create_course_classes_table.php index f7eb968..41172f1 100644 --- a/database/migrations/2026_08_21_000002_create_course_classes_table.php +++ b/database/migrations/2026_08_21_000002_create_course_classes_table.php @@ -15,7 +15,7 @@ public function up(): void $table->foreignId('lecturer_id')->constrained()->cascadeOnDelete(); $table->foreignId('academic_term_id')->constrained()->cascadeOnDelete(); $table->string('class_name', 50)->nullable(); - $table->enum('method', array_values(ClassMethod::cases()))->nullable()->default(ClassMethod::Hybrid->value); + $table->enum('method', ClassMethod::values())->nullable()->default(ClassMethod::Hybrid->value); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/migrations/2026_08_24_000002_create_submissions_table.php b/database/migrations/2026_08_24_000002_create_submissions_table.php index f6ea930..d8e10e3 100644 --- a/database/migrations/2026_08_24_000002_create_submissions_table.php +++ b/database/migrations/2026_08_24_000002_create_submissions_table.php @@ -14,7 +14,7 @@ public function up(): void $table->foreignId('assignment_id')->constrained()->cascadeOnDelete(); $table->foreignId('student_id')->constrained()->cascadeOnDelete(); $table->text('notes')->nullable(); - $table->enum('status', array_values(SubmissionStatus::cases()))->nullable()->default(SubmissionStatus::NotSubmitted->value); + $table->enum('status', SubmissionStatus::values())->nullable()->default(SubmissionStatus::NotSubmitted->value); $table->timestamp('submitted_at')->nullable(); $table->decimal('score', 5, 2)->nullable(); $table->text('lecturer_feedback')->nullable(); diff --git a/database/migrations/2026_08_24_000004_create_attendances_table.php b/database/migrations/2026_08_24_000004_create_attendances_table.php index 38d87d3..260d44d 100644 --- a/database/migrations/2026_08_24_000004_create_attendances_table.php +++ b/database/migrations/2026_08_24_000004_create_attendances_table.php @@ -15,7 +15,7 @@ public function up(): void $table->foreignId('student_id')->constrained()->cascadeOnDelete(); $table->integer('meeting_number')->nullable(); $table->date('date'); - $table->enum('status', array_values(AttendanceStatus::cases()))->nullable()->default(AttendanceStatus::Absent->value); + $table->enum('status', AttendanceStatus::values())->nullable()->default(AttendanceStatus::Absent->value); $table->timestamp('recorded_at')->nullable(); $table->timestamps(); diff --git a/database/migrations/2026_08_24_000006_create_tuition_payments_table.php b/database/migrations/2026_08_24_000006_create_tuition_payments_table.php index b97ba87..0fb3176 100644 --- a/database/migrations/2026_08_24_000006_create_tuition_payments_table.php +++ b/database/migrations/2026_08_24_000006_create_tuition_payments_table.php @@ -15,7 +15,7 @@ public function up(): void $table->decimal('amount_paid', 15, 2); $table->timestamp('paid_at'); $table->string('payment_method', 30)->nullable(); - $table->enum('status', array_values(PaymentStatus::cases()))->nullable()->default(PaymentStatus::Unpaid->value); + $table->enum('status', PaymentStatus::values())->nullable()->default(PaymentStatus::Unpaid->value); $table->foreignId('recorded_by')->nullable()->constrained('users')->nullOnDelete(); $table->text('notes')->nullable(); $table->timestamps(); diff --git a/database/migrations/2026_08_25_000001_create_course_registrations_table.php b/database/migrations/2026_08_25_000001_create_course_registrations_table.php index bcb99cf..d526544 100644 --- a/database/migrations/2026_08_25_000001_create_course_registrations_table.php +++ b/database/migrations/2026_08_25_000001_create_course_registrations_table.php @@ -14,7 +14,7 @@ public function up(): void $table->foreignId('student_id')->constrained()->cascadeOnDelete(); $table->foreignId('academic_term_id')->constrained()->cascadeOnDelete(); $table->foreignId('course_class_id')->constrained()->cascadeOnDelete(); - $table->enum('status', array_values(RegistrationStatus::cases()))->nullable()->default(RegistrationStatus::Submitted->value); + $table->enum('status', RegistrationStatus::values())->nullable()->default(RegistrationStatus::Submitted->value); $table->foreignId('approved_by')->nullable()->constrained('lecturers')->nullOnDelete(); $table->timestamps(); diff --git a/database/migrations/2026_08_25_000003_create_letter_requests_table.php b/database/migrations/2026_08_25_000003_create_letter_requests_table.php index 714cc15..328e22d 100644 --- a/database/migrations/2026_08_25_000003_create_letter_requests_table.php +++ b/database/migrations/2026_08_25_000003_create_letter_requests_table.php @@ -14,7 +14,7 @@ public function up(): void $table->foreignId('student_id')->constrained()->cascadeOnDelete(); $table->string('letter_type', 100); $table->text('purpose')->nullable(); - $table->enum('status', array_values(LetterStatus::cases()))->nullable()->default(LetterStatus::Submitted->value); + $table->enum('status', LetterStatus::values())->nullable()->default(LetterStatus::Submitted->value); $table->foreignId('processed_by')->nullable()->constrained('users')->nullOnDelete(); $table->timestamp('submitted_at')->nullable()->useCurrent(); $table->timestamp('completed_at')->nullable(); diff --git a/database/migrations/2026_08_25_000006_create_feedbacks_table.php b/database/migrations/2026_08_25_000006_create_feedbacks_table.php index 556f35e..1f95450 100644 --- a/database/migrations/2026_08_25_000006_create_feedbacks_table.php +++ b/database/migrations/2026_08_25_000006_create_feedbacks_table.php @@ -13,10 +13,10 @@ public function up(): void Schema::create('feedbacks', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained()->cascadeOnDelete(); - $table->enum('type', array_column(FeedbackType::cases(), 'value')); + $table->enum('type', FeedbackType::values()); $table->string('subject', 150); $table->text('message'); - $table->enum('status', array_column(FeedbackStatus::cases(), 'value'))->default(FeedbackStatus::Submitted->value); + $table->enum('status', FeedbackStatus::values())->default(FeedbackStatus::Submitted->value); $table->text('admin_notes')->nullable(); $table->timestamps(); }); -- 2.45.2