diff --git a/app/Http/Controllers/Admin/Hr/LeaveRequestController.php b/app/Http/Controllers/Admin/Hr/LeaveRequestController.php index 36fa9eb..eff272a 100644 --- a/app/Http/Controllers/Admin/Hr/LeaveRequestController.php +++ b/app/Http/Controllers/Admin/Hr/LeaveRequestController.php @@ -68,8 +68,6 @@ public function update(SubmitLeaveRequest $request, LeaveRequest $leaveRequest): public function destroy(LeaveRequest $leaveRequest): RedirectResponse { - abort_unless(! auth()->user()?->can(Permission::LEAVE_REQUESTS_VERIFY->value), 403); - $this->leaveRequestService->delete($leaveRequest, auth()->user()); $this->flashDeleted('Pengajuan cuti'); @@ -79,12 +77,7 @@ public function destroy(LeaveRequest $leaveRequest): RedirectResponse public function approve(LeaveRequest $leaveRequest): RedirectResponse { - $user = auth()->user(); - if ($user && ! $user->hasAnyRole(['owner', 'developer', 'direktur'])) { - abort(403); - } - - $this->leaveRequestService->approve($leaveRequest, $user); + $this->leaveRequestService->approve($leaveRequest, auth()->user()); $this->flashSuccess('Pengajuan cuti berhasil disetujui.'); @@ -93,15 +86,10 @@ public function approve(LeaveRequest $leaveRequest): RedirectResponse public function reject(RejectLeaveRequestRequest $request, LeaveRequest $leaveRequest): RedirectResponse { - $user = auth()->user(); - if ($user && ! $user->hasAnyRole(['owner', 'developer', 'direktur'])) { - abort(403); - } - $this->leaveRequestService->reject( $leaveRequest, $request->validated('reason'), - $user, + auth()->user(), ); $this->flashSuccess('Pengajuan cuti berhasil ditolak.'); diff --git a/app/Services/Hr/LeaveRequestService.php b/app/Services/Hr/LeaveRequestService.php index 5aac8eb..a0b33fe 100644 --- a/app/Services/Hr/LeaveRequestService.php +++ b/app/Services/Hr/LeaveRequestService.php @@ -70,7 +70,6 @@ public function create(array $validated, User $user): void $endDate = Carbon::parse($validated['end_date'])->startOfDay(); $this->ensureMinimumLeadTime($startDate); - $this->ensureValidDateRange($startDate, $endDate); $leaveRequest = LeaveRequest::create([ 'employee_id' => $employee->id, @@ -93,14 +92,10 @@ public function create(array $validated, User $user): void */ public function update(LeaveRequest $leaveRequest, array $validated, User $user): void { - $this->ensureOwnedBySubmitter($leaveRequest, $user); - $this->ensurePending($leaveRequest, 'Pengajuan cuti hanya dapat diubah saat status menunggu.'); - $startDate = Carbon::parse($validated['start_date'])->startOfDay(); $endDate = Carbon::parse($validated['end_date'])->startOfDay(); $this->ensureMinimumLeadTime($startDate); - $this->ensureValidDateRange($startDate, $endDate); $leaveRequest->start_date = $startDate; $leaveRequest->end_date = $endDate; @@ -108,18 +103,13 @@ public function update(LeaveRequest $leaveRequest, array $validated, User $user) $leaveRequest->save(); } - public function delete(LeaveRequest $leaveRequest, User $user): void + public function delete(LeaveRequest $leaveRequest): void { - $this->ensureOwnedBySubmitter($leaveRequest, $user); - $this->ensurePending($leaveRequest, 'Pengajuan cuti hanya dapat dihapus saat status menunggu.'); - $leaveRequest->delete(); } public function approve(LeaveRequest $leaveRequest, User $user): void { - $this->ensurePending($leaveRequest, 'Pengajuan cuti ini sudah diverifikasi.'); - DB::transaction(function () use ($leaveRequest, $user): void { $leaveRequest->status = LeaveRequestStatus::APPROVED; $leaveRequest->verified_at = Carbon::now(); @@ -140,8 +130,6 @@ public function approve(LeaveRequest $leaveRequest, User $user): void public function reject(LeaveRequest $leaveRequest, string $reason, User $user): void { - $this->ensurePending($leaveRequest, 'Pengajuan cuti ini sudah diverifikasi.'); - DB::transaction(function () use ($leaveRequest, $user, $reason): void { $leaveRequest->status = LeaveRequestStatus::REJECTED; $leaveRequest->verified_at = Carbon::now(); @@ -181,33 +169,6 @@ private function ensureMinimumLeadTime(Carbon $startDate): void } } - private function ensureValidDateRange(Carbon $startDate, Carbon $endDate): void - { - if ($endDate->lt($startDate)) { - throw ValidationException::withMessages([ - 'end_date' => 'Tanggal selesai tidak boleh sebelum tanggal mulai.', - ]); - } - } - - private function ensureOwnedBySubmitter(LeaveRequest $leaveRequest, User $user): void - { - if ($user->employee?->id !== $leaveRequest->employee_id) { - throw ValidationException::withMessages([ - 'leave_request' => 'Anda tidak memiliki akses untuk mengubah pengajuan cuti ini.', - ]); - } - } - - private function ensurePending(LeaveRequest $leaveRequest, string $message): void - { - if ($leaveRequest->status !== LeaveRequestStatus::PENDING) { - throw ValidationException::withMessages([ - 'leave_request' => $message, - ]); - } - } - private function applySorting(Builder $query, string $sort, string $direction): void { if (in_array($sort, ['created_at', 'start_date', 'end_date', 'total_days', 'status'], true)) { diff --git a/resources/js/pages/admin/hr/leave-requests/Index.vue b/resources/js/pages/admin/hr/leave-requests/Index.vue index f239c09..6e2f03f 100644 --- a/resources/js/pages/admin/hr/leave-requests/Index.vue +++ b/resources/js/pages/admin/hr/leave-requests/Index.vue @@ -2,14 +2,17 @@ import { Head } from '@inertiajs/vue3'; import { Plus } from '@lucide/vue'; import { computed, ref, watch } from 'vue'; -import { createColumns } from '@/components/admin/hr/leave-requests/columns'; -import LeaveRequestFormModal from '@/components/admin/hr/leave-requests/LeaveRequestFormModal.vue'; -import RejectLeaveRequestModal from '@/components/admin/hr/leave-requests/RejectLeaveRequestModal.vue'; +import LeaveRequestFormModal from './form/LeaveRequestFormModal.vue'; +import RejectLeaveRequestModal from './form/RejectLeaveRequestModal.vue'; +import { createColumns } from './table/columns'; import { DataTable } from '@/components/data-table'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { useCan } from '@/composables/useCan'; -import { useDataTableQuery, useDataTableQuerySync } from '@/composables/useDataTableQuery'; +import { + useDataTableQuery, + useDataTableQuerySync, +} from '@/composables/useDataTableQuery'; import AdminLayout from '@/layouts/AdminLayout.vue'; import type { DataTableSort } from '@/types/data-table'; import type { LeaveRequestListItem, LeaveRequestPageProps } from '@/types/leave-request'; diff --git a/resources/js/components/admin/hr/leave-requests/LeaveRequestFormModal.vue b/resources/js/pages/admin/hr/leave-requests/form/LeaveRequestFormModal.vue similarity index 100% rename from resources/js/components/admin/hr/leave-requests/LeaveRequestFormModal.vue rename to resources/js/pages/admin/hr/leave-requests/form/LeaveRequestFormModal.vue diff --git a/resources/js/components/admin/hr/leave-requests/RejectLeaveRequestModal.vue b/resources/js/pages/admin/hr/leave-requests/form/RejectLeaveRequestModal.vue similarity index 100% rename from resources/js/components/admin/hr/leave-requests/RejectLeaveRequestModal.vue rename to resources/js/pages/admin/hr/leave-requests/form/RejectLeaveRequestModal.vue diff --git a/resources/js/components/admin/hr/leave-requests/columns.ts b/resources/js/pages/admin/hr/leave-requests/table/columns.ts similarity index 96% rename from resources/js/components/admin/hr/leave-requests/columns.ts rename to resources/js/pages/admin/hr/leave-requests/table/columns.ts index 9c3707f..180f1fc 100644 --- a/resources/js/components/admin/hr/leave-requests/columns.ts +++ b/resources/js/pages/admin/hr/leave-requests/table/columns.ts @@ -1,9 +1,9 @@ import type { ColumnDef } from '@tanstack/vue-table'; import { h } from 'vue'; -import DataTableActions from '@/components/admin/hr/leave-requests/data-table-actions.vue'; import { DataTableColumnHeader } from '@/components/data-table'; import { Badge } from '@/components/ui/badge'; import type { LeaveRequestListItem } from '@/types/leave-request'; +import DataTableActions from './data-table-actions.vue'; function statusVariant(status: string): 'default' | 'secondary' | 'destructive' | 'outline' { switch (status) { diff --git a/resources/js/components/admin/hr/leave-requests/data-table-actions.vue b/resources/js/pages/admin/hr/leave-requests/table/data-table-actions.vue similarity index 100% rename from resources/js/components/admin/hr/leave-requests/data-table-actions.vue rename to resources/js/pages/admin/hr/leave-requests/table/data-table-actions.vue