refactor: standardize enum case naming and update route permissions for consistency across the application

This commit is contained in:
Yoga Pangestu 2026-06-22 13:24:53 +07:00
parent d8a403daa9
commit 6d6de5fa4b
23 changed files with 123 additions and 123 deletions

View File

@ -4,20 +4,20 @@
enum ActivityEventLabel: string
{
case Created = 'created';
case Updated = 'updated';
case Deleted = 'deleted';
case Login = 'login';
case Logout = 'logout';
case CREATED = 'created';
case UPDATED = 'updated';
case DELETED = 'deleted';
case LOGIN = 'login';
case LOGOUT = 'logout';
public function label(): string
{
return match ($this) {
self::Created => 'Dibuat',
self::Updated => 'Diperbarui',
self::Deleted => 'Dihapus',
self::Login => 'Masuk',
self::Logout => 'Keluar',
self::CREATED => 'Dibuat',
self::UPDATED => 'Diperbarui',
self::DELETED => 'Dihapus',
self::LOGIN => 'Masuk',
self::LOGOUT => 'Keluar',
};
}

View File

@ -14,19 +14,19 @@ enum Permission: string
case EMPLOYEES_CREATE = 'employees.create';
case EMPLOYEES_UPDATE = 'employees.update';
case EMPLOYEES_DELETE = 'employees.delete';
case EMPLOYEES_RESET_PASSWORD = 'employees.reset-password';
case EMPLOYEES_TOGGLE_STATUS = 'employees.toggle-status';
case EMPLOYEES_RESET_PASSWORD = 'employees.reset_password';
case EMPLOYEES_TOGGLE_STATUS = 'employees.toggle_status';
case ATTENDANCES_VIEW = 'attendances.view';
case ATTENDANCES_CREATE = 'attendances.create';
case ATTENDANCES_DELETE = 'attendances.delete';
case ATTENDANCES_MANAGE = 'attendances.manage';
case LEAVE_REQUESTS_VIEW = 'leave-requests.view';
case LEAVE_REQUESTS_CREATE = 'leave-requests.create';
case LEAVE_REQUESTS_UPDATE = 'leave-requests.update';
case LEAVE_REQUESTS_DELETE = 'leave-requests.delete';
case LEAVE_REQUESTS_VERIFY = 'leave-requests.verify';
case LEAVE_REQUESTS_VIEW = 'leave_requests.view';
case LEAVE_REQUESTS_CREATE = 'leave_requests.create';
case LEAVE_REQUESTS_UPDATE = 'leave_requests.update';
case LEAVE_REQUESTS_DELETE = 'leave_requests.delete';
case LEAVE_REQUESTS_VERIFY = 'leave_requests.verify';
case CATEGORIES_VIEW = 'categories.view';
case CATEGORIES_CREATE = 'categories.create';
@ -47,13 +47,13 @@ enum Permission: string
case PRODUCTS_CREATE = 'products.create';
case PRODUCTS_UPDATE = 'products.update';
case PRODUCTS_DELETE = 'products.delete';
case PRODUCTS_TOGGLE_STATUS = 'products.toggle-status';
case PRODUCTS_TOGGLE_STATUS = 'products.toggle_status';
case RAW_MATERIALS_VIEW = 'raw-materials.view';
case RAW_MATERIALS_CREATE = 'raw-materials.create';
case RAW_MATERIALS_UPDATE = 'raw-materials.update';
case RAW_MATERIALS_DELETE = 'raw-materials.delete';
case RAW_MATERIALS_TOGGLE_STATUS = 'raw-materials.toggle-status';
case RAW_MATERIALS_VIEW = 'raw_materials.view';
case RAW_MATERIALS_CREATE = 'raw_materials.create';
case RAW_MATERIALS_UPDATE = 'raw_materials.update';
case RAW_MATERIALS_DELETE = 'raw_materials.delete';
case RAW_MATERIALS_TOGGLE_STATUS = 'raw_materials.toggle_status';
case PURCHASES_VIEW = 'purchases.view';
case PURCHASES_CREATE = 'purchases.create';
@ -76,9 +76,9 @@ enum Permission: string
case CUTTINGS_VERIFY = 'cuttings.verify';
case CUTTINGS_REJECT = 'cuttings.reject';
case OWNER_VERIFICATIONS_VIEW = 'owner-verifications.view';
case OWNER_VERIFICATIONS_VERIFY = 'owner-verifications.verify';
case OWNER_VERIFICATIONS_REJECT = 'owner-verifications.reject';
case OWNER_VERIFICATIONS_VIEW = 'owner_verifications.view';
case OWNER_VERIFICATIONS_VERIFY = 'owner_verifications.verify';
case OWNER_VERIFICATIONS_REJECT = 'owner_verifications.reject';
case STOCKS_VIEW = 'stocks.view';
@ -93,12 +93,12 @@ enum Permission: string
case EXPENSES_UPDATE = 'expenses.update';
case EXPENSES_DELETE = 'expenses.delete';
case EMPLOYEE_ADVANCES_VIEW = 'employee-advances.view';
case EMPLOYEE_ADVANCES_CREATE = 'employee-advances.create';
case EMPLOYEE_ADVANCES_UPDATE = 'employee-advances.update';
case EMPLOYEE_ADVANCES_DELETE = 'employee-advances.delete';
case EMPLOYEE_ADVANCES_VERIFY = 'employee-advances.verify';
case EMPLOYEE_ADVANCES_PAY = 'employee-advances.pay';
case EMPLOYEE_ADVANCES_VIEW = 'employee_advances.view';
case EMPLOYEE_ADVANCES_CREATE = 'employee_advances.create';
case EMPLOYEE_ADVANCES_UPDATE = 'employee_advances.update';
case EMPLOYEE_ADVANCES_DELETE = 'employee_advances.delete';
case EMPLOYEE_ADVANCES_VERIFY = 'employee_advances.verify';
case EMPLOYEE_ADVANCES_PAY = 'employee_advances.pay';
case PAYROLL_VIEW = 'payroll.view';
case PAYROLL_ADJUST = 'payroll.adjust';
@ -106,7 +106,7 @@ enum Permission: string
case SETTINGS_VIEW = 'settings.view';
case SETTINGS_UPDATE = 'settings.update';
case ACTIVITY_LOGS_VIEW = 'activity-logs.view';
case ACTIVITY_LOGS_VIEW = 'activity_logs.view';
case ROLES_VIEW = 'roles.view';
case ROLES_CREATE = 'roles.create';

View File

@ -48,7 +48,7 @@ public function store(EmployeeAdvanceRequest $request): RedirectResponse
$this->flashSuccess('Kasbon berhasil diajukan.');
return redirect()->route('admin.finance.employee-advances.index');
return redirect()->route('admin.finance.employee_advances.index');
}
public function update(EmployeeAdvanceRequest $request, EmployeeAdvance $employeeAdvance): RedirectResponse
@ -57,7 +57,7 @@ public function update(EmployeeAdvanceRequest $request, EmployeeAdvance $employe
$this->flashUpdated('Kasbon');
return redirect()->route('admin.finance.employee-advances.index');
return redirect()->route('admin.finance.employee_advances.index');
}
public function destroy(EmployeeAdvance $employeeAdvance): RedirectResponse
@ -66,7 +66,7 @@ public function destroy(EmployeeAdvance $employeeAdvance): RedirectResponse
$this->flashDeleted('Kasbon');
return redirect()->route('admin.finance.employee-advances.index');
return redirect()->route('admin.finance.employee_advances.index');
}
public function approve(EmployeeAdvance $employeeAdvance): RedirectResponse
@ -75,7 +75,7 @@ public function approve(EmployeeAdvance $employeeAdvance): RedirectResponse
$this->flashSuccess('Kasbon berhasil disetujui dan dicairkan dari kas.');
return redirect()->route('admin.finance.employee-advances.index');
return redirect()->route('admin.finance.employee_advances.index');
}
public function reject(RejectEmployeeAdvanceRequest $request, EmployeeAdvance $employeeAdvance): RedirectResponse
@ -88,7 +88,7 @@ public function reject(RejectEmployeeAdvanceRequest $request, EmployeeAdvance $e
$this->flashSuccess('Kasbon berhasil ditolak.');
return redirect()->route('admin.finance.employee-advances.index');
return redirect()->route('admin.finance.employee_advances.index');
}
public function pay(EmployeeAdvance $employeeAdvance): RedirectResponse
@ -97,6 +97,6 @@ public function pay(EmployeeAdvance $employeeAdvance): RedirectResponse
$this->flashSuccess('Kasbon berhasil dilunasi.');
return redirect()->route('admin.finance.employee-advances.index');
return redirect()->route('admin.finance.employee_advances.index');
}
}

View File

@ -52,7 +52,7 @@ public function store(SubmitLeaveRequest $request): RedirectResponse
$this->flashSuccess('Pengajuan cuti berhasil diajukan.');
return redirect()->route('admin.hr.leave-requests.index');
return redirect()->route('admin.hr.leave_requests.index');
}
public function update(SubmitLeaveRequest $request, LeaveRequest $leaveRequest): RedirectResponse
@ -61,7 +61,7 @@ public function update(SubmitLeaveRequest $request, LeaveRequest $leaveRequest):
$this->flashUpdated('Pengajuan cuti');
return redirect()->route('admin.hr.leave-requests.index');
return redirect()->route('admin.hr.leave_requests.index');
}
public function destroy(LeaveRequest $leaveRequest): RedirectResponse
@ -70,7 +70,7 @@ public function destroy(LeaveRequest $leaveRequest): RedirectResponse
$this->flashDeleted('Pengajuan cuti');
return redirect()->route('admin.hr.leave-requests.index');
return redirect()->route('admin.hr.leave_requests.index');
}
public function approve(LeaveRequest $leaveRequest): RedirectResponse
@ -79,7 +79,7 @@ public function approve(LeaveRequest $leaveRequest): RedirectResponse
$this->flashSuccess('Pengajuan cuti berhasil disetujui.');
return redirect()->route('admin.hr.leave-requests.index');
return redirect()->route('admin.hr.leave_requests.index');
}
public function reject(RejectLeaveRequestRequest $request, LeaveRequest $leaveRequest): RedirectResponse
@ -92,6 +92,6 @@ public function reject(RejectLeaveRequestRequest $request, LeaveRequest $leaveRe
$this->flashSuccess('Pengajuan cuti berhasil ditolak.');
return redirect()->route('admin.hr.leave-requests.index');
return redirect()->route('admin.hr.leave_requests.index');
}
}

View File

@ -40,7 +40,7 @@ public function approve(ApproveVerificationRequest $request, Cutting $cutting):
$this->flashSuccess('Verifikasi berhasil disetujui. Stok produk telah ditambahkan ke toko.');
return redirect()->route('admin.manage.owner-verifications.index');
return redirect()->route('admin.manage.owner_verifications.index');
}
public function reject(RejectVerificationRequest $request, Cutting $cutting): RedirectResponse
@ -53,6 +53,6 @@ public function reject(RejectVerificationRequest $request, Cutting $cutting): Re
$this->flashSuccess('Verifikasi berhasil ditolak.');
return redirect()->route('admin.manage.owner-verifications.index');
return redirect()->route('admin.manage.owner_verifications.index');
}
}

View File

@ -53,7 +53,7 @@ public function store(RawMaterialRequest $request): RedirectResponse
$this->flashCreated('Bahan baku');
return redirect()->route('admin.master.raw-materials.index');
return redirect()->route('admin.master.raw_materials.index');
}
public function edit(RawMaterial $rawMaterial): Response
@ -78,7 +78,7 @@ public function update(RawMaterialRequest $request, RawMaterial $rawMaterial): R
$this->flashUpdated('Bahan baku');
return redirect()->route('admin.master.raw-materials.index');
return redirect()->route('admin.master.raw_materials.index');
}
public function toggleStatus(ToggleStatusRequest $request, RawMaterial $rawMaterial): RedirectResponse
@ -96,6 +96,6 @@ public function destroy(RawMaterial $rawMaterial): RedirectResponse
$this->flashDeleted('Bahan baku');
return redirect()->route('admin.master.raw-materials.index');
return redirect()->route('admin.master.raw_materials.index');
}
}

View File

@ -114,7 +114,7 @@ private function pendingOwnerVerifications(Request $request): int
{
$user = $request->user();
if ($user === null || ! $user->can('owner-verifications.view')) {
if ($user === null || ! $user->can('owner_verifications.view')) {
return 0;
}

View File

@ -6,9 +6,9 @@
use App\Models\User;
use Illuminate\Validation\ValidationException;
trait ResolvesAuthEmployee
trait ResolvesAuthenticatedEmployee
{
private function resolveAuthEmployee(?User $user = null): Employee
private function resolveAuthenticatedEmployee(?User $user = null): Employee
{
$employee = ($user ?? auth()->user())?->employee;

View File

@ -6,7 +6,7 @@
use App\Enums\Role;
use App\Models\EmployeeAdvance;
use App\Models\User;
use App\Services\Concerns\ResolvesAuthEmployee;
use App\Services\Concerns\ResolvesAuthenticatedEmployee;
use App\Services\System\PushNotificationService;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Database\Eloquent\Builder;
@ -14,7 +14,7 @@
class EmployeeAdvanceService
{
use ResolvesAuthEmployee;
use ResolvesAuthenticatedEmployee;
public function __construct(
private readonly CashService $cashService,
@ -74,7 +74,7 @@ public function paginateForIndex(array $tableQuery, User $user, string $status =
*/
public function create(array $validated, User $user): void
{
$employee = $this->resolveAuthEmployee($user);
$employee = $this->resolveAuthenticatedEmployee($user);
$employeeAdvance = DB::transaction(function () use ($validated, $employee) {
return EmployeeAdvance::create([

View File

@ -6,7 +6,7 @@
use App\Models\Employee;
use App\Models\LeaveRequest;
use App\Models\User;
use App\Services\Concerns\ResolvesAuthEmployee;
use App\Services\Concerns\ResolvesAuthenticatedEmployee;
use App\Services\Media\MediaService;
use App\Services\System\PushNotificationService;
use Carbon\CarbonInterface;
@ -16,7 +16,7 @@
class AttendanceService
{
use ResolvesAuthEmployee;
use ResolvesAuthenticatedEmployee;
public function __construct(
private readonly MediaService $mediaService,
@ -72,7 +72,7 @@ public function isOnLeaveToday(Employee $employee): bool
*/
public function checkIn(array $validated, User $user): void
{
$employee = $this->resolveAuthEmployee($user);
$employee = $this->resolveAuthenticatedEmployee($user);
$existing = Attendance::query()
->where('employee_id', $employee->id)
@ -113,7 +113,7 @@ public function checkIn(array $validated, User $user): void
*/
public function checkOut(array $validated, User $user): void
{
$employee = $this->resolveAuthEmployee($user);
$employee = $this->resolveAuthenticatedEmployee($user);
$attendance = Attendance::query()
->where('employee_id', $employee->id)

View File

@ -5,7 +5,7 @@
use App\Enums\LeaveRequestStatus;
use App\Models\LeaveRequest;
use App\Models\User;
use App\Services\Concerns\ResolvesAuthEmployee;
use App\Services\Concerns\ResolvesAuthenticatedEmployee;
use App\Services\System\PushNotificationService;
use Carbon\Carbon;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
@ -15,7 +15,7 @@
class LeaveRequestService
{
use ResolvesAuthEmployee;
use ResolvesAuthenticatedEmployee;
public function __construct(
private readonly PushNotificationService $pushNotificationService,
@ -53,7 +53,7 @@ public function paginateForIndex(array $tableQuery, User $user): LengthAwarePagi
*/
public function create(array $validated, User $user): void
{
$employee = $this->resolveAuthEmployee($user);
$employee = $this->resolveAuthenticatedEmployee($user);
$hasPending = LeaveRequest::pending()
->where('employee_id', $employee->id)

View File

@ -44,7 +44,7 @@ const menuGroups: MenuGroup[] = [
items: [
{ title: 'Kategori', href: '/admin/master/categories', icon: FolderTree, permission: 'categories.view' },
{ title: 'Produk', href: '/admin/master/products', icon: Package, permission: 'products.view' },
{ title: 'Bahan Baku', href: '/admin/master/raw-materials', icon: Layers, permission: 'raw-materials.view' },
{ title: 'Bahan Baku', href: '/admin/master/raw-materials', icon: Layers, permission: 'raw_materials.view' },
{ title: 'Supplier', href: '/admin/master/suppliers', icon: User, permission: 'suppliers.view' },
{ title: 'Customer', href: '/admin/master/customers', icon: UserCheck, permission: 'customers.view' },
],
@ -55,7 +55,7 @@ const menuGroups: MenuGroup[] = [
{ title: 'Belanja', href: '/admin/manage/purchases', icon: ShoppingBag, permission: 'purchases.view' },
{ title: 'Cutting', href: '/admin/manage/cuttings', icon: Scissors, permission: 'cuttings.view' },
{ title: 'Stok', href: '/admin/manage/stocks', icon: Warehouse, permission: 'stocks.view', badgeKey: 'pendingCuttings' },
{ title: 'Verifikasi Owner', href: '/admin/manage/owner-verifications', icon: CheckCircle, permission: 'owner-verifications.view', badgeKey: 'pendingOwnerVerifications' },
{ title: 'Verifikasi Owner', href: '/admin/manage/owner-verifications', icon: CheckCircle, permission: 'owner_verifications.view', badgeKey: 'pendingOwnerVerifications' },
{ title: 'Pesanan', href: '/admin/manage/orders', icon: ShoppingCart, permission: 'orders.view' },
],
},
@ -64,7 +64,7 @@ const menuGroups: MenuGroup[] = [
items: [
{ title: 'Kas Toko', href: '/admin/finance/cash', icon: Wallet, permission: 'cash.view' },
{ title: 'Pengeluaran', href: '/admin/finance/expenses', icon: Receipt, permission: 'expenses.view' },
{ title: 'Kasbon', href: '/admin/finance/employee-advances', icon: Banknote, permission: 'employee-advances.view', badgeKey: 'pendingEmployeeAdvances' },
{ title: 'Kasbon', href: '/admin/finance/employee-advances', icon: Banknote, permission: 'employee_advances.view', badgeKey: 'pendingEmployeeAdvances' },
{ title: 'Gaji', href: '/admin/finance/payroll', icon: WalletCards, permission: 'payroll.view' },
],
},
@ -73,7 +73,7 @@ const menuGroups: MenuGroup[] = [
items: [
{ title: 'Pegawai', href: '/admin/hr/employees', icon: Users, permission: 'employees.view' },
{ title: 'Presensi', href: '/admin/hr/attendances', icon: Clock, permission: 'attendances.view' },
{ title: 'Cuti', href: '/admin/hr/leave-requests', icon: CalendarDays, permission: 'leave-requests.view', badgeKey: 'pendingLeaveRequests' },
{ title: 'Cuti', href: '/admin/hr/leave-requests', icon: CalendarDays, permission: 'leave_requests.view', badgeKey: 'pendingLeaveRequests' },
],
},
{
@ -81,7 +81,7 @@ const menuGroups: MenuGroup[] = [
items: [
{ title: 'Role & Permission', href: '/admin/system/roles', icon: Shield, permission: 'roles.view' },
{ title: 'Pengaturan', href: '/admin/system/setting', icon: Settings2, permission: 'settings.view' },
{ title: 'Log Aktivitas', href: '/admin/system/activity-logs', icon: History, permission: 'activity-logs.view' },
{ title: 'Log Aktivitas', href: '/admin/system/activity-logs', icon: History, permission: 'activity_logs.view' },
],
},
];

View File

@ -118,7 +118,7 @@ watch(
</Button>
</div>
<Card v-if="can('employee-advances.verify')">
<Card v-if="can('employee_advances.verify')">
<CardHeader class="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle class="text-sm font-medium text-muted-foreground">
Total Kasbon
@ -147,7 +147,7 @@ watch(
<EmployeeAdvanceFormModal v-if="canSubmit" v-model:open="formModalOpen"
:employee-advance="editingEmployeeAdvance" />
<RejectEmployeeAdvanceModal v-if="can('employee-advances.verify')" v-model:open="rejectModalOpen"
<RejectEmployeeAdvanceModal v-if="can('employee_advances.verify')" v-model:open="rejectModalOpen"
:employee-advance="rejectingEmployeeAdvance" />
</AdminLayout>
</template>

View File

@ -28,16 +28,16 @@ const isOwner = computed(() => (
const canEdit = computed(() => (
props.employeeAdvance.is_editable
&& !can('employee-advances.verify')
&& !can('employee_advances.verify')
&& isOwner.value
&& can('employee-advances.update')
&& can('employee_advances.update')
));
const canDelete = computed(() => (
props.employeeAdvance.is_editable
&& !can('employee-advances.verify')
&& !can('employee_advances.verify')
&& isOwner.value
&& can('employee-advances.delete')
&& can('employee_advances.delete')
));
const deleteConfirmOpen = ref(false);
@ -111,7 +111,7 @@ function payEmployeeAdvance() {
<TooltipContent>Ubah</TooltipContent>
</Tooltip>
<Tooltip v-if="employeeAdvance.can_verify && can('employee-advances.verify')">
<Tooltip v-if="employeeAdvance.can_verify && can('employee_advances.verify')">
<TooltipTrigger as-child>
<Button variant="ghost" size="icon" class="size-8 text-green-600 hover:text-green-600"
@click="approveConfirmOpen = true">
@ -122,7 +122,7 @@ function payEmployeeAdvance() {
<TooltipContent>Setujui</TooltipContent>
</Tooltip>
<Tooltip v-if="employeeAdvance.can_verify && can('employee-advances.verify')">
<Tooltip v-if="employeeAdvance.can_verify && can('employee_advances.verify')">
<TooltipTrigger as-child>
<Button variant="ghost" size="icon" class="text-destructive hover:text-destructive size-8"
@click="emit('reject', employeeAdvance)">
@ -133,7 +133,7 @@ function payEmployeeAdvance() {
<TooltipContent>Tolak</TooltipContent>
</Tooltip>
<Tooltip v-if="employeeAdvance.can_pay && can('employee-advances.pay')">
<Tooltip v-if="employeeAdvance.can_pay && can('employee_advances.pay')">
<TooltipTrigger as-child>
<Button variant="ghost" size="icon" class="size-8" @click="payConfirmOpen = true">
<Banknote class="size-4" />
@ -155,11 +155,11 @@ function payEmployeeAdvance() {
</Tooltip>
</div>
<ConfirmDialog v-if="can('employee-advances.verify')" v-model:open="approveConfirmOpen" title="Setujui kasbon?"
<ConfirmDialog v-if="can('employee_advances.verify')" v-model:open="approveConfirmOpen" title="Setujui kasbon?"
:description="`Kasbon ${employeeAdvance.amount_formatted} untuk ${employeeAdvance.employee_name} akan dicairkan. Saldo kas akan berkurang.`"
confirm-label="Setujui" cancel-label="Batal" :loading="approveProcessing" @confirm="approveEmployeeAdvance" />
<ConfirmDialog v-if="can('employee-advances.pay')" v-model:open="payConfirmOpen" title="Lunasi kasbon?"
<ConfirmDialog v-if="can('employee_advances.pay')" v-model:open="payConfirmOpen" title="Lunasi kasbon?"
:description="`Pelunasan kasbon ${employeeAdvance.amount_formatted} dari ${employeeAdvance.employee_name}. Saldo kas akan bertambah.`"
confirm-label="Lunasi" cancel-label="Batal" :loading="payProcessing" @confirm="payEmployeeAdvance" />

View File

@ -70,7 +70,7 @@ function resetPassword() {
<TooltipContent>Ubah</TooltipContent>
</Tooltip>
<Tooltip v-if="can('employees.reset-password')">
<Tooltip v-if="can('employees.reset_password')">
<TooltipTrigger as-child>
<Button variant="ghost" size="icon" class="size-8" @click="resetPasswordConfirmOpen = true">
<KeyRound class="size-4" />
@ -93,7 +93,7 @@ function resetPassword() {
</div>
<ConfirmDialog
v-if="can('employees.reset-password')"
v-if="can('employees.reset_password')"
v-model:open="resetPasswordConfirmOpen"
title="Reset kata sandi pegawai?"
:description="`Kata sandi ${employee.profile?.full_name ?? 'pegawai'} akan direset ke kata sandi default sistem (${defaultPassword}). Pengguna akan otomatis logout dari semua sesi aktif.`"

View File

@ -24,7 +24,7 @@ watch(
);
function toggleStatus(checked: boolean) {
if (!can('employees.toggle-status')) {
if (!can('employees.toggle_status')) {
return;
}
@ -51,7 +51,7 @@ function toggleStatus(checked: boolean) {
<div class="flex items-center gap-2">
<Switch
:model-value="isActive"
:disabled="processing || !can('employees.toggle-status')"
:disabled="processing || !can('employees.toggle_status')"
@update:model-value="toggleStatus"
/>
<Badge :variant="isActive ? 'default' : 'secondary'">

View File

@ -113,7 +113,7 @@ watch(
<LeaveRequestFormModal v-if="canSubmit" v-model:open="formModalOpen"
:leave-request="editingLeaveRequest" />
<RejectLeaveRequestModal v-if="can('leave-requests.verify')" v-model:open="rejectModalOpen"
<RejectLeaveRequestModal v-if="can('leave_requests.verify')" v-model:open="rejectModalOpen"
:leave-request="rejectingLeaveRequest" />
</AdminLayout>
</template>

View File

@ -28,16 +28,16 @@ const isOwner = computed(() => (
const canEdit = computed(() => (
props.leaveRequest.is_editable
&& !can('leave-requests.verify')
&& !can('leave_requests.verify')
&& isOwner.value
&& can('leave-requests.update')
&& can('leave_requests.update')
));
const canDelete = computed(() => (
props.leaveRequest.is_editable
&& !can('leave-requests.verify')
&& !can('leave_requests.verify')
&& isOwner.value
&& can('leave-requests.delete')
&& can('leave_requests.delete')
));
const deleteConfirmOpen = ref(false);
@ -92,7 +92,7 @@ function approveLeaveRequest() {
<TooltipContent>Ubah</TooltipContent>
</Tooltip>
<Tooltip v-if="leaveRequest.can_verify && can('leave-requests.verify')">
<Tooltip v-if="leaveRequest.can_verify && can('leave_requests.verify')">
<TooltipTrigger as-child>
<Button variant="ghost" size="icon" class="size-8 text-green-600 hover:text-green-600"
@click="approveConfirmOpen = true">
@ -103,7 +103,7 @@ function approveLeaveRequest() {
<TooltipContent>Setujui</TooltipContent>
</Tooltip>
<Tooltip v-if="leaveRequest.can_verify && can('leave-requests.verify')">
<Tooltip v-if="leaveRequest.can_verify && can('leave_requests.verify')">
<TooltipTrigger as-child>
<Button variant="ghost" size="icon" class="text-destructive hover:text-destructive size-8"
@click="emit('reject', leaveRequest)">
@ -126,7 +126,7 @@ function approveLeaveRequest() {
</Tooltip>
</div>
<ConfirmDialog v-if="can('leave-requests.verify')" v-model:open="approveConfirmOpen" title="Setujui cuti?"
<ConfirmDialog v-if="can('leave_requests.verify')" v-model:open="approveConfirmOpen" title="Setujui cuti?"
:description="`Cuti ${leaveRequest.employee_name} (${leaveRequest.start_date_formatted} - ${leaveRequest.end_date_formatted}, ${leaveRequest.total_days} hari) akan disetujui.`"
confirm-label="Setujui" cancel-label="Batal" :loading="approveProcessing" @confirm="approveLeaveRequest" />

View File

@ -67,7 +67,7 @@ function submitReject() {
</script>
<template>
<div v-if="can('owner-verifications.verify')" class="flex items-center gap-1">
<div v-if="can('owner_verifications.verify')" class="flex items-center gap-1">
<Tooltip>
<TooltipTrigger as-child>
<Button

View File

@ -99,7 +99,7 @@ watch(
<h2 class="text-2xl font-bold tracking-tight">Bahan Baku</h2>
</div>
<Button v-if="can('raw-materials.create')" as-child class="shrink-0 self-start sm:self-center">
<Button v-if="can('raw_materials.create')" as-child class="shrink-0 self-start sm:self-center">
<Link href="/admin/master/raw-materials/create">
<Plus class="size-4" />
Tambah

View File

@ -37,7 +37,7 @@ function destroyRawMaterial() {
<template>
<div class="flex items-center justify-end gap-1">
<Tooltip v-if="can('raw-materials.update')">
<Tooltip v-if="can('raw_materials.update')">
<TooltipTrigger as-child>
<Button variant="ghost" size="icon" class="size-8" as-child>
<Link :href="`/admin/master/raw-materials/${material.id}/edit`">
@ -49,7 +49,7 @@ function destroyRawMaterial() {
<TooltipContent>Ubah</TooltipContent>
</Tooltip>
<Tooltip v-if="can('raw-materials.delete')">
<Tooltip v-if="can('raw_materials.delete')">
<TooltipTrigger as-child>
<Button variant="ghost" size="icon" class="text-destructive hover:text-destructive size-8"
@click="deleteConfirmOpen = true">
@ -61,7 +61,7 @@ function destroyRawMaterial() {
</Tooltip>
</div>
<ConfirmDialog v-if="can('raw-materials.delete')" v-model:open="deleteConfirmOpen" title="Hapus bahan baku?"
<ConfirmDialog v-if="can('raw_materials.delete')" v-model:open="deleteConfirmOpen" title="Hapus bahan baku?"
:description="`Bahan baku ${material.name} akan dihapus beserta seluruh variannya. Tindakan ini tidak dapat dibatalkan.`"
confirm-label="Hapus" cancel-label="Batal" destructive :loading="deleteProcessing"
@confirm="destroyRawMaterial" />

View File

@ -24,7 +24,7 @@ watch(
);
function toggleStatus(checked: boolean) {
if (!can('raw-materials.toggle-status')) {
if (!can('raw_materials.toggle_status')) {
return;
}
@ -49,7 +49,7 @@ function toggleStatus(checked: boolean) {
<template>
<div class="flex items-center gap-2">
<Switch :model-value="isActive" :disabled="processing || !can('raw-materials.toggle-status')"
<Switch :model-value="isActive" :disabled="processing || !can('raw_materials.toggle_status')"
@update:model-value="toggleStatus" />
<Badge :variant="isActive ? 'default' : 'secondary'">
{{ isActive ? 'Aktif' : 'Nonaktif' }}

View File

@ -45,8 +45,8 @@
Route::post('/auth/logout', [LogoutController::class, 'store'])->name('logout');
// Push Notifications
Route::post('/push-subscriptions', [PushSubscriptionController::class, 'store'])->name('push-subscriptions.store');
Route::delete('/push-subscriptions', [PushSubscriptionController::class, 'destroy'])->name('push-subscriptions.destroy');
Route::post('/push-subscriptions', [PushSubscriptionController::class, 'store'])->name('push_subscriptions.store');
Route::delete('/push-subscriptions', [PushSubscriptionController::class, 'destroy'])->name('push_subscriptions.destroy');
Route::prefix('admin')->name('admin.')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])
@ -92,7 +92,7 @@
Route::patch('{product}/toggle-status', [ProductController::class, 'toggleStatus'])
->middleware('permission:'.Permission::PRODUCTS_TOGGLE_STATUS->value)
->name('toggle-status');
->name('toggle_status');
Route::delete('{product}', [ProductController::class, 'destroy'])
->middleware('permission:'.Permission::PRODUCTS_DELETE->value)
@ -101,7 +101,7 @@
Route::get('/', [ProductController::class, 'index'])->name('index');
});
Route::prefix('raw-materials')->name('raw-materials.')
Route::prefix('raw-materials')->name('raw_materials.')
->middleware('permission:'.Permission::RAW_MATERIALS_VIEW->value)
->group(function () {
Route::get('create', [RawMaterialController::class, 'create'])
@ -122,7 +122,7 @@
Route::patch('{rawMaterial}/toggle-status', [RawMaterialController::class, 'toggleStatus'])
->middleware('permission:'.Permission::RAW_MATERIALS_TOGGLE_STATUS->value)
->name('toggle-status');
->name('toggle_status');
Route::delete('{rawMaterial}', [RawMaterialController::class, 'destroy'])
->middleware('permission:'.Permission::RAW_MATERIALS_DELETE->value)
@ -185,11 +185,11 @@
Route::post('draft-items', [PurchaseDraftItemController::class, 'store'])
->middleware('permission:'.Permission::PURCHASES_CREATE->value)
->name('draft-items.store');
->name('draft_items.store');
Route::delete('draft-items/{rawMaterialPrice}', [PurchaseDraftItemController::class, 'destroy'])
->middleware('permission:'.Permission::PURCHASES_CREATE->value)
->name('draft-items.destroy');
->name('draft_items.destroy');
Route::post('/', [PurchaseController::class, 'store'])
->middleware('permission:'.Permission::PURCHASES_CREATE->value)
@ -219,15 +219,15 @@
Route::post('draft-items', [OrderDraftItemController::class, 'store'])
->middleware('permission:'.Permission::ORDERS_CREATE->value)
->name('draft-items.store');
->name('draft_items.store');
Route::put('draft-items/resync-prices', [OrderDraftItemController::class, 'resyncPrices'])
->middleware('permission:'.Permission::ORDERS_CREATE->value)
->name('draft-items.resync-prices');
->name('draft_items.resync_prices');
Route::delete('draft-items/{productVariant}', [OrderDraftItemController::class, 'destroy'])
->middleware('permission:'.Permission::ORDERS_CREATE->value)
->name('draft-items.destroy');
->name('draft_items.destroy');
Route::post('/', [OrderController::class, 'store'])
->middleware('permission:'.Permission::ORDERS_CREATE->value)
@ -244,7 +244,7 @@
->name('update');
Route::post('{order}/status', [OrderController::class, 'transitionStatus'])
->name('transition-status');
->name('transition_status');
Route::delete('{order}', [OrderController::class, 'destroy'])
->middleware('permission:'.Permission::ORDERS_DELETE->value)
@ -263,19 +263,19 @@
Route::post('draft-materials', [CuttingDraftItemController::class, 'storeMaterial'])
->middleware('permission:'.Permission::CUTTINGS_CREATE->value)
->name('draft-materials.store');
->name('draft_materials.store');
Route::delete('draft-materials/{rawMaterialPrice}', [CuttingDraftItemController::class, 'destroyMaterial'])
->middleware('permission:'.Permission::CUTTINGS_CREATE->value)
->name('draft-materials.destroy');
->name('draft_materials.destroy');
Route::post('draft-results', [CuttingDraftItemController::class, 'storeResult'])
->middleware('permission:'.Permission::CUTTINGS_CREATE->value)
->name('draft-results.store');
->name('draft_results.store');
Route::delete('draft-results/{productVariant}', [CuttingDraftItemController::class, 'destroyResult'])
->middleware('permission:'.Permission::CUTTINGS_CREATE->value)
->name('draft-results.destroy');
->name('draft_results.destroy');
Route::post('/', [CuttingController::class, 'store'])
->middleware('permission:'.Permission::CUTTINGS_VIEW->value.'|'.Permission::CUTTINGS_CREATE->value)
@ -291,7 +291,7 @@
Route::post('{cutting}/status', [CuttingController::class, 'transitionStatus'])
->middleware('permission:'.Permission::CUTTINGS_COMPLETE->value.'|'.Permission::CUTTINGS_VERIFY->value.'|'.Permission::CUTTINGS_REJECT->value)
->name('transition-status');
->name('transition_status');
Route::delete('{cutting}', [CuttingController::class, 'destroy'])
->middleware('permission:'.Permission::CUTTINGS_VIEW->value.'|'.Permission::CUTTINGS_DELETE->value)
@ -308,7 +308,7 @@
->name('verify');
});
Route::prefix('owner-verifications')->name('owner-verifications.')
Route::prefix('owner-verifications')->name('owner_verifications.')
->middleware('permission:'.Permission::OWNER_VERIFICATIONS_VIEW->value)
->group(function () {
Route::get('/', [OwnerVerificationController::class, 'index'])->name('index');
@ -345,13 +345,13 @@
->name('destroy');
});
Route::prefix('activity-logs')->name('activity-logs.')
Route::prefix('activity-logs')->name('activity_logs.')
->middleware('permission:'.Permission::ACTIVITY_LOGS_VIEW->value)
->group(function () {
Route::get('/', [ActivityLogController::class, 'index'])->name('index');
});
Route::prefix('setting')->name('setting.')
Route::prefix('settings')->name('settings.')
->middleware('permission:'.Permission::SETTINGS_VIEW->value)
->group(function () {
Route::get('/', [SettingController::class, 'index'])->name('index');
@ -362,7 +362,7 @@
Route::put('social-media', [SettingController::class, 'updateSocialMedia'])
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
->name('social-media.update');
->name('social_media.update');
Route::put('marketplace', [SettingController::class, 'updateMarketplace'])
->middleware('permission:'.Permission::SETTINGS_UPDATE->value)
@ -430,7 +430,7 @@
->name('destroy');
});
Route::prefix('employee-advances')->name('employee-advances.')
Route::prefix('employee-advances')->name('employee_advances.')
->middleware('permission:'.Permission::EMPLOYEE_ADVANCES_VIEW->value)
->group(function () {
Route::get('/', [EmployeeAdvanceController::class, 'index'])->name('index');
@ -487,11 +487,11 @@
Route::post('check-in', [AttendanceController::class, 'checkIn'])
->middleware('permission:'.Permission::ATTENDANCES_CREATE->value)
->name('check-in');
->name('check_in');
Route::post('check-out', [AttendanceController::class, 'checkOut'])
->middleware('permission:'.Permission::ATTENDANCES_CREATE->value)
->name('check-out');
->name('check_out');
Route::delete('{attendance}', [AttendanceController::class, 'destroy'])
->middleware('permission:'.Permission::ATTENDANCES_DELETE->value)
@ -503,11 +503,11 @@
->group(function () {
Route::post('{user}/reset-password', [EmployeeController::class, 'resetPassword'])
->middleware('permission:'.Permission::EMPLOYEES_RESET_PASSWORD->value)
->name('reset-password');
->name('reset_password');
Route::patch('{user}/toggle-status', [EmployeeController::class, 'toggleStatus'])
->middleware('permission:'.Permission::EMPLOYEES_TOGGLE_STATUS->value)
->name('toggle-status');
->name('toggle_status');
Route::get('create', [EmployeeController::class, 'create'])
->middleware('permission:'.Permission::EMPLOYEES_CREATE->value)
@ -532,7 +532,7 @@
Route::get('/', [EmployeeController::class, 'index'])->name('index');
});
Route::prefix('leave-requests')->name('leave-requests.')
Route::prefix('leave-requests')->name('leave_requests.')
->middleware('permission:'.Permission::LEAVE_REQUESTS_VIEW->value)
->group(function () {
Route::get('/', [LeaveRequestController::class, 'index'])->name('index');