refactor: simplify LeaveRequest handling by removing unnecessary permission checks and validation methods, streamline service methods, and enhance UI components for better user experience

This commit is contained in:
Yoga Pangestu 2026-06-21 01:39:27 +07:00
parent 0cb93c4e05
commit 6022f93d4b
7 changed files with 11 additions and 59 deletions

View File

@ -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.');

View File

@ -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)) {

View File

@ -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';

View File

@ -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) {