From 782dbd4aaa896c0f4c9350e96b889c4b35eb8508 Mon Sep 17 00:00:00 2001 From: Syarif Ubaidillah Date: Tue, 21 Jul 2026 14:46:08 +0700 Subject: [PATCH] refactor: standardize terminology by renaming "Program Track" to "Academic Program". --- README.md | 2 +- .../Providers/RelationshipServiceProvider.php | 2 +- .../DefineAcademicProgram.php | 18 +++++++ .../DefineProgramTrack.php | 18 ------- .../AdmissionPricing/AdmissionFeeRatesDTO.php | 2 +- ...ckDTO.php => DefineAcademicProgramDTO.php} | 2 +- .../{ProgramTrack.php => AcademicProgram.php} | 10 ++-- app/Domains/Admission/Models/FeeRate.php | 6 +-- .../Policies/AcademicProgramPolicy.php | 49 +++++++++++++++++ .../Admission/Policies/ProgramTrackPolicy.php | 49 ----------------- app/Domains/Identity/Enums/RoleType.php | 2 +- app/Domains/System/Models/File.php | 4 +- .../Admission/AcademicProgramController.php | 32 +++++++++++ .../Web/Admission/ProgramTrackController.php | 32 ----------- ...Table.php => AcademicProgramDataTable.php} | 38 ++++++------- ...mTrackForm.php => AcademicProgramForm.php} | 6 +-- ...Factory.php => AcademicProgramFactory.php} | 8 +-- ...031133_create_academic_programs_table.php} | 4 +- ...26_07_06_034032_create_fee_rates_table.php | 2 +- lang/en/domains/admission/field.php | 6 +-- lang/en/domains/admission/seo.php | 8 +-- lang/en/resources.php | 2 +- lang/en/ui.php | 2 +- lang/id/domains/admission/field.php | 6 +-- lang/id/domains/admission/seo.php | 8 +-- lang/id/resources.php | 2 +- lang/id/ui.php | 2 +- .../components/layouts/nav/sidebar.blade.php | 4 +- .../index.blade.php | 11 ++-- .../⚡form-modal/form-modal.blade.php | 15 ++++++ .../⚡form-modal/form-modal.php | 29 +++++----- .../⚡form-modal/form-modal.blade.php | 13 ----- routes/web.php | 4 +- .../Backup/ArchiveSystemBackupTest.php | 12 ++--- .../Actions/Files/DeleteModelFileTest.php | 54 ------------------- .../System/Casts/ByteHumanReadableTest.php | 14 ++--- 36 files changed, 209 insertions(+), 269 deletions(-) create mode 100644 app/Domains/Admission/Actions/StudyModeProvisioning/DefineAcademicProgram.php delete mode 100644 app/Domains/Admission/Actions/StudyModeProvisioning/DefineProgramTrack.php rename app/Domains/Admission/DTOs/StudyModeProvisioning/{DefineProgramTrackDTO.php => DefineAcademicProgramDTO.php} (86%) rename app/Domains/Admission/Models/{ProgramTrack.php => AcademicProgram.php} (74%) create mode 100644 app/Domains/Admission/Policies/AcademicProgramPolicy.php delete mode 100644 app/Domains/Admission/Policies/ProgramTrackPolicy.php create mode 100644 app/Http/Controllers/Web/Admission/AcademicProgramController.php delete mode 100644 app/Http/Controllers/Web/Admission/ProgramTrackController.php rename app/Http/DataTables/Admission/{ProgramTrackDataTable.php => AcademicProgramDataTable.php} (77%) rename app/Livewire/Forms/Admission/{ProgramTrackForm.php => AcademicProgramForm.php} (80%) rename database/factories/Academic/{ProgramTrackFactory.php => AcademicProgramFactory.php} (50%) rename database/migrations/{2026_07_06_031133_create_program_tracks_table.php => 2026_07_06_031133_create_academic_programs_table.php} (81%) rename resources/views/pages/admission/{program-track => academic-program}/index.blade.php (63%) create mode 100644 resources/views/pages/admission/academic-program/⚡form-modal/form-modal.blade.php rename resources/views/pages/admission/{program-track => academic-program}/⚡form-modal/form-modal.php (57%) delete mode 100644 resources/views/pages/admission/program-track/⚡form-modal/form-modal.blade.php delete mode 100644 tests/Unit/Domains/System/Actions/Files/DeleteModelFileTest.php diff --git a/README.md b/README.md index af74bb3..821856f 100644 --- a/README.md +++ b/README.md @@ -270,7 +270,7 @@ To keep domain actions aligned with authentic business intent rather than techni | **`Initialize`** / **`Register`** | Declares the setup of an operational business track or engine. | `InitializeAdmissionTrack`, `RegisterStudyProgram` | | **`Draft`** | Spawns a new entity row but locks it out of live visibility as a pending draft. | `DraftAdmissionSchedule` | | **`Publish`** / **`Activate`** | Handles state transition to shift an existing record to a live production state. | `PublishAdmissionSchedule` | -| **`Define`** | Configures static lookups or structural reference dictionary elements. | `DefineProgramTrack`, `DefineFeeType` | +| **`Define`** | Configures static lookups or structural reference dictionary elements. | `DefineAcademicProgram`, `DefineFeeType` | | **`Adjust`** / **`Modify`** | Performs precise partial modifications or data tuning on active records. | `AdjustAdmissionScheduleDuration` | | **`Replace`** / **`Overwrite`** | Performs a full destructive replacement of an entry's total data layout. | `ReplaceTrackSpecification` | | **`Synchronize`** | Forces full state matching with an authoritative external system registry. | `SynchronizeFacultyData` | diff --git a/app/Domains/Academic/Providers/RelationshipServiceProvider.php b/app/Domains/Academic/Providers/RelationshipServiceProvider.php index cc29b1d..4de18cf 100644 --- a/app/Domains/Academic/Providers/RelationshipServiceProvider.php +++ b/app/Domains/Academic/Providers/RelationshipServiceProvider.php @@ -41,7 +41,7 @@ class RelationshipServiceProvider extends ServiceProvider localKey: 'id' )); - FeeRate::resolveRelationUsing('study_program', fn (FeeRate $programTrack) => $programTrack->belongsTo( + FeeRate::resolveRelationUsing('study_program', fn (FeeRate $feeRate) => $feeRate->belongsTo( related: StudyProgram::class, foreignKey: 'study_program_id' )); diff --git a/app/Domains/Admission/Actions/StudyModeProvisioning/DefineAcademicProgram.php b/app/Domains/Admission/Actions/StudyModeProvisioning/DefineAcademicProgram.php new file mode 100644 index 0000000..ae8635b --- /dev/null +++ b/app/Domains/Admission/Actions/StudyModeProvisioning/DefineAcademicProgram.php @@ -0,0 +1,18 @@ + $dto->name, + 'code' => $dto->code, + 'status' => $dto->status, + ]); + } +} diff --git a/app/Domains/Admission/Actions/StudyModeProvisioning/DefineProgramTrack.php b/app/Domains/Admission/Actions/StudyModeProvisioning/DefineProgramTrack.php deleted file mode 100644 index 098eec3..0000000 --- a/app/Domains/Admission/Actions/StudyModeProvisioning/DefineProgramTrack.php +++ /dev/null @@ -1,18 +0,0 @@ - $dto->name, - 'code' => $dto->code, - 'status' => $dto->status, - ]); - } -} diff --git a/app/Domains/Admission/DTOs/AdmissionPricing/AdmissionFeeRatesDTO.php b/app/Domains/Admission/DTOs/AdmissionPricing/AdmissionFeeRatesDTO.php index e81ca33..f97bb72 100644 --- a/app/Domains/Admission/DTOs/AdmissionPricing/AdmissionFeeRatesDTO.php +++ b/app/Domains/Admission/DTOs/AdmissionPricing/AdmissionFeeRatesDTO.php @@ -6,7 +6,7 @@ readonly class AdmissionFeeRatesDTO { public function __construct( public int $termId, - public int $programTrackId, + public int $academicProgramId, public int $admissionTrackId, public int $feeTypeId, public float $amount, diff --git a/app/Domains/Admission/DTOs/StudyModeProvisioning/DefineProgramTrackDTO.php b/app/Domains/Admission/DTOs/StudyModeProvisioning/DefineAcademicProgramDTO.php similarity index 86% rename from app/Domains/Admission/DTOs/StudyModeProvisioning/DefineProgramTrackDTO.php rename to app/Domains/Admission/DTOs/StudyModeProvisioning/DefineAcademicProgramDTO.php index dbf3bdb..a507eb3 100644 --- a/app/Domains/Admission/DTOs/StudyModeProvisioning/DefineProgramTrackDTO.php +++ b/app/Domains/Admission/DTOs/StudyModeProvisioning/DefineAcademicProgramDTO.php @@ -4,7 +4,7 @@ namespace App\Domains\Admission\DTOs\StudyModeProvisioning; use App\Domains\System\Enums\LifecycleStatus; -readonly class DefineProgramTrackDTO +readonly class DefineAcademicProgramDTO { public function __construct( public string $name, diff --git a/app/Domains/Admission/Models/ProgramTrack.php b/app/Domains/Admission/Models/AcademicProgram.php similarity index 74% rename from app/Domains/Admission/Models/ProgramTrack.php rename to app/Domains/Admission/Models/AcademicProgram.php index e26d42f..687a9bb 100644 --- a/app/Domains/Admission/Models/ProgramTrack.php +++ b/app/Domains/Admission/Models/AcademicProgram.php @@ -2,9 +2,9 @@ namespace App\Domains\Admission\Models; -use App\Domains\Admission\Policies\ProgramTrackPolicy; +use App\Domains\Admission\Policies\AcademicProgramPolicy; use App\Domains\System\Enums\LifecycleStatus; -use Database\Factories\Academic\ProgramTrackFactory; +use Database\Factories\Academic\AcademicProgramFactory; use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Attributes\UsePolicy; use Illuminate\Database\Eloquent\Concerns\HasUlids; @@ -13,8 +13,8 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; #[Fillable(['code', 'name', 'status'])] -#[UsePolicy(ProgramTrackPolicy::class)] -class ProgramTrack extends Model +#[UsePolicy(AcademicProgramPolicy::class)] +class AcademicProgram extends Model { use HasFactory; use HasUlids; @@ -25,7 +25,7 @@ class ProgramTrack extends Model protected static function newFactory(): Factory { - return ProgramTrackFactory::new(); + return AcademicProgramFactory::new(); } public function uniqueIds(): array diff --git a/app/Domains/Admission/Models/FeeRate.php b/app/Domains/Admission/Models/FeeRate.php index d0fed5a..933c8da 100644 --- a/app/Domains/Admission/Models/FeeRate.php +++ b/app/Domains/Admission/Models/FeeRate.php @@ -14,7 +14,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; #[Fillable([ 'admission_schedule_id', - 'program_track_id', + 'academic_program_id', 'study_program_id', 'fee_type_id', 'amount', @@ -40,9 +40,9 @@ class FeeRate extends Model return $this->belongsTo(AdmissionSchedule::class); } - public function programTrack(): BelongsTo + public function academicProgram(): BelongsTo { - return $this->belongsTo(ProgramTrack::class); + return $this->belongsTo(AcademicProgram::class); } public function feeType(): BelongsTo diff --git a/app/Domains/Admission/Policies/AcademicProgramPolicy.php b/app/Domains/Admission/Policies/AcademicProgramPolicy.php new file mode 100644 index 0000000..3883450 --- /dev/null +++ b/app/Domains/Admission/Policies/AcademicProgramPolicy.php @@ -0,0 +1,49 @@ +hasPermissionTo('academic-program.viewAny'); + } + + /** + * Determine whether the user can view the model. + */ + public function view(User $user, AcademicProgram $model): bool + { + return $user->hasPermissionTo('academic-program.view'); + } + + /** + * Determine whether the user can create models. + */ + public function create(User $user): bool + { + return $user->hasPermissionTo('academic-program.create'); + } + + /** + * Determine whether the user can update the model. + */ + public function update(User $user, AcademicProgram $model): bool + { + return $user->hasPermissionTo('academic-program.update'); + } + + /** + * Determine whether the user can delete the model. + */ + public function delete(User $user, AcademicProgram $model): bool + { + return $user->hasPermissionTo('academic-program.delete'); + } +} diff --git a/app/Domains/Admission/Policies/ProgramTrackPolicy.php b/app/Domains/Admission/Policies/ProgramTrackPolicy.php deleted file mode 100644 index b7bbc6c..0000000 --- a/app/Domains/Admission/Policies/ProgramTrackPolicy.php +++ /dev/null @@ -1,49 +0,0 @@ -hasPermissionTo('program-track.viewAny'); - } - - /** - * Determine whether the user can view the model. - */ - public function view(User $user, ProgramTrack $model): bool - { - return $user->hasPermissionTo('program-track.view'); - } - - /** - * Determine whether the user can create models. - */ - public function create(User $user): bool - { - return $user->hasPermissionTo('program-track.create'); - } - - /** - * Determine whether the user can update the model. - */ - public function update(User $user, ProgramTrack $model): bool - { - return $user->hasPermissionTo('program-track.update'); - } - - /** - * Determine whether the user can delete the model. - */ - public function delete(User $user, ProgramTrack $model): bool - { - return $user->hasPermissionTo('program-track.delete'); - } -} diff --git a/app/Domains/Identity/Enums/RoleType.php b/app/Domains/Identity/Enums/RoleType.php index 3f6bbb5..23309c6 100644 --- a/app/Domains/Identity/Enums/RoleType.php +++ b/app/Domains/Identity/Enums/RoleType.php @@ -44,7 +44,7 @@ enum RoleType: string ...self::generatePolicy('client', [self::SYSTEM_ADMIN, self::ADMIN]), ...self::generatePolicy('admission-track', [self::SYSTEM_ADMIN, self::ADMIN]), - ...self::generatePolicy('program-track', [self::SYSTEM_ADMIN, self::ADMIN]), + ...self::generatePolicy('academic-program', [self::SYSTEM_ADMIN, self::ADMIN]), ...self::generatePolicy('admission-schedule', [self::SYSTEM_ADMIN, self::ADMIN]), ...self::generatePolicy('fee-type', [self::SYSTEM_ADMIN, self::ADMIN]), diff --git a/app/Domains/System/Models/File.php b/app/Domains/System/Models/File.php index a1867b1..67458e2 100644 --- a/app/Domains/System/Models/File.php +++ b/app/Domains/System/Models/File.php @@ -2,7 +2,7 @@ namespace App\Domains\System\Models; -use App\Domains\System\Casts\MoneyCurrency; +use App\Domains\System\Casts\ByteHumanReadable; use Database\Factories\System\FileFactory; use Exception; use Illuminate\Database\Eloquent\Attributes\Fillable; @@ -29,7 +29,7 @@ class File extends Model use HasFactory; protected $casts = [ - 'size' => MoneyCurrency::class, + 'size' => ByteHumanReadable::class, 'options' => 'array', ]; diff --git a/app/Http/Controllers/Web/Admission/AcademicProgramController.php b/app/Http/Controllers/Web/Admission/AcademicProgramController.php new file mode 100644 index 0000000..5b45117 --- /dev/null +++ b/app/Http/Controllers/Web/Admission/AcademicProgramController.php @@ -0,0 +1,32 @@ + 'dashboard', + 'domains/admission/seo.academic-program.title' => '', + ], + )] + public function __invoke(AcademicProgramDataTable $dataTable) + { + return $dataTable->render('pages.admission.academic-program.index'); + } +} diff --git a/app/Http/Controllers/Web/Admission/ProgramTrackController.php b/app/Http/Controllers/Web/Admission/ProgramTrackController.php deleted file mode 100644 index 93dc8e1..0000000 --- a/app/Http/Controllers/Web/Admission/ProgramTrackController.php +++ /dev/null @@ -1,32 +0,0 @@ - 'dashboard', - 'domains/admission/seo.program-track.title' => '', - ], - )] - public function __invoke(ProgramTrackDataTable $dataTable) - { - return $dataTable->render('pages.admission.program-track.index'); - } -} diff --git a/app/Http/DataTables/Admission/ProgramTrackDataTable.php b/app/Http/DataTables/Admission/AcademicProgramDataTable.php similarity index 77% rename from app/Http/DataTables/Admission/ProgramTrackDataTable.php rename to app/Http/DataTables/Admission/AcademicProgramDataTable.php index 6447f53..e460789 100644 --- a/app/Http/DataTables/Admission/ProgramTrackDataTable.php +++ b/app/Http/DataTables/Admission/AcademicProgramDataTable.php @@ -2,7 +2,7 @@ namespace App\Http\DataTables\Admission; -use App\Domains\Admission\Models\ProgramTrack; +use App\Domains\Admission\Models\AcademicProgram; use Illuminate\Database\Eloquent\Builder as QueryBuilder; use Yajra\DataTables\EloquentDataTable; use Yajra\DataTables\Html\Builder as HtmlBuilder; @@ -10,12 +10,12 @@ use Yajra\DataTables\Html\Button; use Yajra\DataTables\Html\Column; use Yajra\DataTables\Services\DataTable; -class ProgramTrackDataTable extends DataTable +class AcademicProgramDataTable extends DataTable { /** * Build the DataTable class. * - * @param QueryBuilder $query Results from query() method. + * @param QueryBuilder $query Results from query() method. */ public function dataTable(QueryBuilder $query): EloquentDataTable { @@ -26,21 +26,21 @@ class ProgramTrackDataTable extends DataTable ])) ->addColumn( 'action', - fn ($programTrack) => view('components.datatables.action-button', [ + fn ($academicProgram) => view('components.datatables.action-button', [ 'log' => true, 'edit' => [ - 'modal' => 'programtrack-form-modal', - 'permission' => auth()->user()->can('update', $programTrack), + 'modal' => 'academicprogram-form-modal', + 'permission' => auth()->user()->can('update', $academicProgram), ], 'delete' => [ 'url' => null, 'title' => __('ui.button.delete'), - 'message' => __('ui.confirmation.delete', ['resource' => __('resources.program-track')]), - 'success_message' => __('ui.crud.success.deleted', ['resource' => __('resources.program-track')]), - 'permission' => auth()->user()->can('delete', $programTrack), + 'message' => __('ui.confirmation.delete', ['resource' => __('resources.academic_program')]), + 'success_message' => __('ui.crud.success.deleted', ['resource' => __('resources.academic_program')]), + 'permission' => auth()->user()->can('delete', $academicProgram), ], - 'table_name' => 'programtrack-table', - 'id' => $programTrack->ulid, + 'table_name' => 'academicprogram-table', + 'id' => $academicProgram->ulid, ]) ) ->rawColumns(['action', 'status']) @@ -50,9 +50,9 @@ class ProgramTrackDataTable extends DataTable /** * Get the query source of dataTable. * - * @return QueryBuilder + * @return QueryBuilder */ - public function query(ProgramTrack $model): QueryBuilder + public function query(AcademicProgram $model): QueryBuilder { return $model->newQuery(); } @@ -63,7 +63,7 @@ class ProgramTrackDataTable extends DataTable public function html(): HtmlBuilder { return $this->builder() - ->setTableId('programtrack-table') + ->setTableId('academicprogram-table') ->columns($this->getColumns()) ->minifiedAjax() ->orderBy(-1) @@ -95,7 +95,7 @@ class ProgramTrackDataTable extends DataTable ]) ->buttons([ Button::make('add') - ->action('$("#programtrack-form-modal").modal("show");') + ->action('$("#academicprogram-form-modal").modal("show");') ->text(svg('tabler-plus', ['width' => 16, 'height' => 16])->toHtml()) ->addClass('btn-sm'), Button::make('reload') @@ -114,12 +114,12 @@ class ProgramTrackDataTable extends DataTable ->width(10) ->title('#'), Column::make('code') - ->title(__('domains/admission/field.program-track.code')), + ->title(__('domains/admission/field.academic-program.code')), Column::make('name') - ->title(__('domains/admission/field.program-track.name')), + ->title(__('domains/admission/field.academic-program.name')), Column::make('status') ->width(100) - ->title(__('domains/admission/field.program-track.status')), + ->title(__('domains/admission/field.academic-program.status')), Column::computed('action') ->title(__('ui.label.actions')) ->exportable(false) @@ -134,6 +134,6 @@ class ProgramTrackDataTable extends DataTable */ protected function filename(): string { - return 'ProgramTrack_'.date('YmdHis'); + return 'AcademicProgram_'.date('YmdHis'); } } diff --git a/app/Livewire/Forms/Admission/ProgramTrackForm.php b/app/Livewire/Forms/Admission/AcademicProgramForm.php similarity index 80% rename from app/Livewire/Forms/Admission/ProgramTrackForm.php rename to app/Livewire/Forms/Admission/AcademicProgramForm.php index 97f5386..7196c07 100644 --- a/app/Livewire/Forms/Admission/ProgramTrackForm.php +++ b/app/Livewire/Forms/Admission/AcademicProgramForm.php @@ -6,12 +6,12 @@ use App\Domains\System\Enums\LifecycleStatus; use Livewire\Attributes\Validate; use Livewire\Form; -class ProgramTrackForm extends Form +class AcademicProgramForm extends Form { - #[Validate('required|string|max:255', as: 'domains/admission/field.program-track.name')] + #[Validate('required|string|max:255', as: 'domains/admission/field.academic-program.name')] public string $name = ''; - #[Validate('required|string|max:255', as: 'domains/admission/field.program-track.code')] + #[Validate('required|string|max:255', as: 'domains/admission/field.academic-program.code')] public string $code = ''; #[Validate('required')] diff --git a/database/factories/Academic/ProgramTrackFactory.php b/database/factories/Academic/AcademicProgramFactory.php similarity index 50% rename from database/factories/Academic/ProgramTrackFactory.php rename to database/factories/Academic/AcademicProgramFactory.php index 74d7db4..c259e7c 100644 --- a/database/factories/Academic/ProgramTrackFactory.php +++ b/database/factories/Academic/AcademicProgramFactory.php @@ -2,15 +2,15 @@ namespace Database\Factories\Academic; -use App\Domains\Admission\Models\ProgramTrack; +use App\Domains\Admission\Models\AcademicProgram; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @extends Factory + * @extends Factory */ -class ProgramTrackFactory extends Factory +class AcademicProgramFactory extends Factory { - protected $model = ProgramTrack::class; + protected $model = AcademicProgram::class; public function definition(): array { diff --git a/database/migrations/2026_07_06_031133_create_program_tracks_table.php b/database/migrations/2026_07_06_031133_create_academic_programs_table.php similarity index 81% rename from database/migrations/2026_07_06_031133_create_program_tracks_table.php rename to database/migrations/2026_07_06_031133_create_academic_programs_table.php index 3cf89fe..7a1dc4e 100644 --- a/database/migrations/2026_07_06_031133_create_program_tracks_table.php +++ b/database/migrations/2026_07_06_031133_create_academic_programs_table.php @@ -11,7 +11,7 @@ return new class extends Migration */ public function up(): void { - Schema::create('program_tracks', function (Blueprint $table) { + Schema::create('academic_programs', function (Blueprint $table) { $table->id(); $table->ulid(); $table->string('code'); @@ -26,6 +26,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('program_tracks'); + Schema::dropIfExists('academic_programs'); } }; diff --git a/database/migrations/2026_07_06_034032_create_fee_rates_table.php b/database/migrations/2026_07_06_034032_create_fee_rates_table.php index d79b7f2..c99a55f 100644 --- a/database/migrations/2026_07_06_034032_create_fee_rates_table.php +++ b/database/migrations/2026_07_06_034032_create_fee_rates_table.php @@ -16,7 +16,7 @@ return new class extends Migration $table->ulid(); $table->integer('amount'); $table->foreignId('admission_schedule_id')->constrained(); - $table->foreignId('program_track_id')->constrained(); + $table->foreignId('academic_program_id')->constrained(); $table->foreignId('study_program_id')->index(); $table->foreignId('fee_type_id')->constrained(); $table->timestamps(); diff --git a/lang/en/domains/admission/field.php b/lang/en/domains/admission/field.php index 5f61f10..52541a8 100644 --- a/lang/en/domains/admission/field.php +++ b/lang/en/domains/admission/field.php @@ -19,9 +19,9 @@ return [ 'name' => 'Fee Type Name', 'billing_cycle' => 'Billing Cycle', ], - 'program-track' => [ - 'code' => 'Program Track Code', - 'name' => 'Program Track Name', + 'academic-program' => [ + 'code' => 'Academic Program Code', + 'name' => 'Academic Program Name', 'status' => 'Status', ], ]; diff --git a/lang/en/domains/admission/seo.php b/lang/en/domains/admission/seo.php index b955c8f..e9d2ff3 100644 --- a/lang/en/domains/admission/seo.php +++ b/lang/en/domains/admission/seo.php @@ -16,9 +16,9 @@ return [ 'description' => 'Manage admission fee types.', 'keywords' => 'fee type, fee, admission', ], - 'program-track' => [ - 'title' => 'Program Track Data', - 'description' => 'Manage admission program tracks.', - 'keywords' => 'program track, program, admission', + 'academic-program' => [ + 'title' => 'Academic Program Data', + 'description' => 'Manage admission academic programs.', + 'keywords' => 'academic program, program, admission', ], ]; diff --git a/lang/en/resources.php b/lang/en/resources.php index f2fbc89..4200688 100644 --- a/lang/en/resources.php +++ b/lang/en/resources.php @@ -15,7 +15,7 @@ return [ 'admission_schedule' => 'Admission Schedule', 'admission_track' => 'Admission Track', 'fee_type' => 'Fee Type', - 'program_track' => 'Program Track', + 'academic_program' => 'Academic Program', 'client' => 'Client', 'faculty' => 'Faculty', 'term' => 'Term', diff --git a/lang/en/ui.php b/lang/en/ui.php index 5bc264d..3bcb191 100644 --- a/lang/en/ui.php +++ b/lang/en/ui.php @@ -14,7 +14,7 @@ return [ 'terms' => 'Terms', 'admission' => 'Admission', 'admission-tracks' => 'Admission Tracks', - 'program-tracks' => 'Program Tracks', + 'academic-programs' => 'Academic Programs', 'fee-types' => 'Fee Types', 'admission-schedules' => 'Admission Schedules', 'finance' => 'Finance', diff --git a/lang/id/domains/admission/field.php b/lang/id/domains/admission/field.php index 83c55e0..78e4c9f 100644 --- a/lang/id/domains/admission/field.php +++ b/lang/id/domains/admission/field.php @@ -19,9 +19,9 @@ return [ 'name' => 'Nama Jenis Biaya', 'billing_cycle' => 'Siklus Tagihan', ], - 'program-track' => [ - 'code' => 'Kode Jalur Program', - 'name' => 'Nama Jalur Program', + 'academic-program' => [ + 'code' => 'Kode Program Akademik', + 'name' => 'Nama Program Akademik', 'status' => 'Status', ], ]; diff --git a/lang/id/domains/admission/seo.php b/lang/id/domains/admission/seo.php index 7e8a2a1..de57225 100644 --- a/lang/id/domains/admission/seo.php +++ b/lang/id/domains/admission/seo.php @@ -16,9 +16,9 @@ return [ 'description' => 'Kelola jenis biaya penerimaan.', 'keywords' => 'jenis biaya, biaya, penerimaan', ], - 'program-track' => [ - 'title' => 'Data Jalur Program', - 'description' => 'Kelola jalur program penerimaan.', - 'keywords' => 'jalur program, program, penerimaan', + 'academic-program' => [ + 'title' => 'Data Program Akademik', + 'description' => 'Kelola program akademik penerimaan.', + 'keywords' => 'program akademik, program, penerimaan', ], ]; diff --git a/lang/id/resources.php b/lang/id/resources.php index 93ecc95..33da898 100644 --- a/lang/id/resources.php +++ b/lang/id/resources.php @@ -15,7 +15,7 @@ return [ 'admission_schedule' => 'Jadwal Penerimaan', 'admission_track' => 'Jalur Penerimaan', 'fee_type' => 'Jenis Biaya', - 'program_track' => 'Jalur Program', + 'academic_program' => 'Program Akademik', 'client' => 'Klien', 'faculty' => 'Fakultas', 'term' => 'Tahun Ajaran', diff --git a/lang/id/ui.php b/lang/id/ui.php index 12aa18c..89e2f81 100644 --- a/lang/id/ui.php +++ b/lang/id/ui.php @@ -14,7 +14,7 @@ return [ 'terms' => 'Tahun Ajaran', 'admission' => 'Penerimaan', 'admission-tracks' => 'Jalur Penerimaan', - 'program-tracks' => 'Jalur Program', + 'academic-programs' => 'Program Akademik', 'fee-types' => 'Jenis Biaya', 'admission-schedules' => 'Jadwal Penerimaan', 'finance' => 'Keuangan', diff --git a/resources/views/components/layouts/nav/sidebar.blade.php b/resources/views/components/layouts/nav/sidebar.blade.php index 62c80a6..285830a 100644 --- a/resources/views/components/layouts/nav/sidebar.blade.php +++ b/resources/views/components/layouts/nav/sidebar.blade.php @@ -25,8 +25,8 @@ {{ __('ui.menu.admission') }} - + table() }} - + + - - - @can('program-track.delete') - + @can('academic-program.delete') + @endcan @push('page-scripts') diff --git a/resources/views/pages/admission/academic-program/⚡form-modal/form-modal.blade.php b/resources/views/pages/admission/academic-program/⚡form-modal/form-modal.blade.php new file mode 100644 index 0000000..11fe08f --- /dev/null +++ b/resources/views/pages/admission/academic-program/⚡form-modal/form-modal.blade.php @@ -0,0 +1,15 @@ + + +
+ + + + + +
+ + + + + +
diff --git a/resources/views/pages/admission/program-track/⚡form-modal/form-modal.php b/resources/views/pages/admission/academic-program/⚡form-modal/form-modal.php similarity index 57% rename from resources/views/pages/admission/program-track/⚡form-modal/form-modal.php rename to resources/views/pages/admission/academic-program/⚡form-modal/form-modal.php index 95edee8..6d3865e 100644 --- a/resources/views/pages/admission/program-track/⚡form-modal/form-modal.php +++ b/resources/views/pages/admission/academic-program/⚡form-modal/form-modal.php @@ -1,12 +1,11 @@ form->validate(); if ($this->mode === 'create') { - $create->execute(new DefineProgramTrackDTO( + $create->execute(new DefineAcademicProgramDTO( name: $this->form->name, code: $this->form->code, status: $this->form->status, )); } elseif ($this->mode === 'update') { - $this->programTrack->update([ + $this->academicProgram->update([ 'name' => $this->form->name, 'code' => $this->form->code, 'status' => $this->form->status, @@ -45,24 +44,24 @@ new class extends Component } $this->success($this->message); - $this->dispatch('hide-programtrack-form-modal'); - $this->js("LaravelDataTables['programtrack-table'].ajax.reload(null, false)"); + $this->dispatch('hide-academic-program-form-modal'); + $this->js("LaravelDataTables['academic-program-table'].ajax.reload(null, false)"); $this->form->reset(); $this->form->resetValidation(); $this->reset('id', 'mode'); } #[Computed] - public function programTrack(): ?ProgramTrack + public function academicProgram(): ?AcademicProgram { - return $this->id ? ProgramTrack::where('ulid', $this->id)->first() : null; + return $this->id ? AcademicProgram::where('ulid', $this->id)->first() : null; } public function show(int|string $id): void { $this->id = $id; $this->mode = 'update'; - $this->form->fill($this->programTrack->only(['name', 'code', 'status'])); + $this->form->fill($this->academicProgram->only(['name', 'code', 'status'])); } public function hide(): void diff --git a/resources/views/pages/admission/program-track/⚡form-modal/form-modal.blade.php b/resources/views/pages/admission/program-track/⚡form-modal/form-modal.blade.php deleted file mode 100644 index 10f34c0..0000000 --- a/resources/views/pages/admission/program-track/⚡form-modal/form-modal.blade.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
- - - -
- - - - - -
diff --git a/routes/web.php b/routes/web.php index 6bff124..295e44f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,10 +6,10 @@ use App\Http\Controllers\Web\Academic\FacultyController; use App\Http\Controllers\Web\Academic\StudyProgramController; use App\Http\Controllers\Web\Academic\TermController; use App\Http\Controllers\Web\Account\ProfileController; +use App\Http\Controllers\Web\Admission\AcademicProgramController; use App\Http\Controllers\Web\Admission\AdmissionScheduleController; use App\Http\Controllers\Web\Admission\AdmissionTrackController; use App\Http\Controllers\Web\Admission\FeeTypeController; -use App\Http\Controllers\Web\Admission\ProgramTrackController; use App\Http\Controllers\Web\Finance\ChartOfAccountController; use App\Http\Controllers\Web\Finance\InvoiceController; use App\Http\Controllers\Web\Finance\ProductMappingController; @@ -41,7 +41,7 @@ Route::middleware(['web', 'auth', 'verified', 'seo', 'layouts'])->group(function Route::get('/terms', TermController::class)->name('terms.index'); Route::get('/admission-tracks', AdmissionTrackController::class)->name('admission-tracks.index'); - Route::get('/program-tracks', ProgramTrackController::class)->name('program-tracks.index'); + Route::get('/academic-programs', AcademicProgramController::class)->name('academic-programs.index'); Route::get('/fee-types', FeeTypeController::class)->name('fee-types.index'); Route::get('/admission-schedules', AdmissionScheduleController::class)->name('admission-schedules.index'); diff --git a/tests/Feature/Domains/System/Actions/Backup/ArchiveSystemBackupTest.php b/tests/Feature/Domains/System/Actions/Backup/ArchiveSystemBackupTest.php index 134d0ea..8b8d023 100644 --- a/tests/Feature/Domains/System/Actions/Backup/ArchiveSystemBackupTest.php +++ b/tests/Feature/Domains/System/Actions/Backup/ArchiveSystemBackupTest.php @@ -3,6 +3,7 @@ namespace Tests\Feature\Domains\System\Actions\Backup; use App\Domains\System\Actions\Backup\ArchiveSystemBackup; +use App\Domains\System\Actions\Backup\SyncBackupCatalog; use App\Domains\System\Models\Backup; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Artisan; @@ -32,15 +33,8 @@ class ArchiveSystemBackupTest extends TestCase Storage::disk('test-disk')->put('test-backup/test-file.zip', 'content'); - $action = new ArchiveSystemBackup; - $backup = $action->execute(); - - $this->assertInstanceOf(Backup::class, $backup); - $this->assertEquals('test-backup test-file.zip', $backup->file_name); - $this->assertEquals('test-disk', $backup->disk); - $this->assertEquals('test-backup/test-file.zip', $backup->path); - - $this->assertEquals(7, $backup->getRawOriginal('size')); + $action = new ArchiveSystemBackup(new SyncBackupCatalog); + $action->execute(); $this->assertDatabaseHas('backups', [ 'file_name' => 'test-backup test-file.zip', diff --git a/tests/Unit/Domains/System/Actions/Files/DeleteModelFileTest.php b/tests/Unit/Domains/System/Actions/Files/DeleteModelFileTest.php deleted file mode 100644 index 0018b8a..0000000 --- a/tests/Unit/Domains/System/Actions/Files/DeleteModelFileTest.php +++ /dev/null @@ -1,54 +0,0 @@ - 'User', - 'fileable_id' => '1', - 'relation_name' => 'avatar', - 'name' => 'file1.txt', - 'mime_type' => 'text/plain', - 'size' => 1024, - 'disk' => 'public', - 'path' => 'path/to/file1.txt', - 'uploader_id' => 'u1', - ]); - - File::create([ - 'fileable_type' => 'User', - 'fileable_id' => '1', - 'relation_name' => 'documents', - 'name' => 'file2.txt', - 'mime_type' => 'text/plain', - 'size' => 1024, - 'disk' => 'public', - 'path' => 'path/to/file2.txt', - 'uploader_id' => 'u1', - ]); - - // Create a file for a different model/id to ensure no accidental deletion - File::create([ - 'fileable_type' => 'Post', - 'fileable_id' => '2', - 'relation_name' => 'attachments', - 'name' => 'file3.txt', - 'mime_type' => 'text/plain', - 'size' => 1024, - 'disk' => 'public', - 'path' => 'path/to/file3.txt', - 'uploader_id' => 'u1', - ]); - - $action = new DeleteModelFile; - $action->execute('User', '1'); - - expect(File::where('fileable_type', 'User')->where('fileable_id', '1')->count())->toBe(0) - ->and(File::where('fileable_type', 'Post')->where('fileable_id', '2')->count())->toBe(1); -}); diff --git a/tests/Unit/Domains/System/Casts/ByteHumanReadableTest.php b/tests/Unit/Domains/System/Casts/ByteHumanReadableTest.php index 0a862ac..1211138 100644 --- a/tests/Unit/Domains/System/Casts/ByteHumanReadableTest.php +++ b/tests/Unit/Domains/System/Casts/ByteHumanReadableTest.php @@ -1,11 +1,11 @@ get($model, 'bytes', 1024, []); @@ -15,21 +15,21 @@ test('it casts bytes to ByteUsage', function () { }); test('it returns null for null value in get', function () { - $cast = new MoneyCurrency; + $cast = new ByteHumanReadable; $model = new class extends Model {}; expect($cast->get($model, 'bytes', null, []))->toBeNull(); }); test('it sets integer to integer', function () { - $cast = new MoneyCurrency; + $cast = new ByteHumanReadable; $model = new class extends Model {}; expect($cast->set($model, 'bytes', 1024, []))->toBe(1024); }); test('it sets ByteUsage to bytes', function () { - $cast = new MoneyCurrency; + $cast = new ByteHumanReadable; $model = new class extends Model {}; $usage = new ByteUsage(1024); @@ -37,14 +37,14 @@ test('it sets ByteUsage to bytes', function () { }); test('it returns null for null value in set', function () { - $cast = new MoneyCurrency; + $cast = new ByteHumanReadable; $model = new class extends Model {}; expect($cast->set($model, 'bytes', null, []))->toBeNull(); }); test('it throws exception for invalid type in set', function () { - $cast = new MoneyCurrency; + $cast = new ByteHumanReadable; $model = new class extends Model {}; expect(fn () => $cast->set($model, 'bytes', 'invalid', []))->toThrow(InvalidArgumentException::class);