@php
$users_rules = $users_rules ?? [];
$gmenu = $gmenu ?? collect();
$url_menu = $url_menu ?? '';
$title_group = $title_group ?? '';
$isAdminUser = in_array('admins', $users_rules, true) || in_array('admin', $users_rules, true);
$isHeadUser = in_array('headxx', $users_rules, true) || in_array('head', $users_rules, true);
$normalizedRules = array_map(fn ($role) => strtolower(trim((string) $role)), $users_rules);
$isUserMenuUser = in_array('usersx', $normalizedRules, true);
$puMenuKeys = ['truser', 'trreq', 'trhrd', 'trpetn'];
$puMenuUrls = ['user', 'pengajuan', 'pengajuan-hrd', 'pekerjaan-nonperiodic'];
$sidebarUser = $user_login ?? auth()->user();
$puNotificationCount = 0;
if ($sidebarUser && \Illuminate\Support\Facades\Schema::hasTable('tr_non_periodic')) {
$sidebarRoles = array_filter(array_map(fn ($role) => strtolower(trim($role)), explode(',', (string) ($sidebarUser->idroles ?? ''))));
$notificationQuery = DB::table('tr_non_periodic')->where('is_active', '1');
if (array_intersect($sidebarRoles, ['admins', 'admin'])) {
$puNotificationCount = $notificationQuery->where(function ($query) {
$query->where(fn ($q) => $q->whereIn('request_status', ['pending', 'review'])->whereNull('head_approval_date'))
->orWhere(fn ($q) => $q->whereIn('request_status', ['pending', 'review', 'approved'])->whereNotNull('head_approval_date')->whereNull('hrd_approval_date'))
->orWhereIn('request_status', ['pengadaan', 'pengerjaan', 'revisi', 'verifikasi']);
})->count();
} elseif (array_intersect($sidebarRoles, ['headxx', 'head'])) {
$headDepartmentIds = DB::table('ms_department')
->where('head_user_id', $sidebarUser->id)->where('is_active', '1')->pluck('id');
if ($headDepartmentIds->isEmpty()) {
$headDepartmentIds = DB::table('ms_employee')->where('user_id', $sidebarUser->id)
->where('is_active', '1')->whereNotNull('departemen_id')->pluck('departemen_id');
}
if ($headDepartmentIds->isNotEmpty()) {
if (\Illuminate\Support\Facades\Schema::hasColumn('tr_non_periodic', 'request_departemen_id')) {
$notificationQuery->whereIn('request_departemen_id', $headDepartmentIds);
} else {
$departmentUsers = DB::table('ms_employee')
->join('users', 'ms_employee.user_id', '=', 'users.id')
->whereIn('ms_employee.departemen_id', $headDepartmentIds)
->where('ms_employee.is_active', '1')
->select('users.id', 'users.username')
->get();
$requesterIds = $departmentUsers->pluck('id');
$requesterUsernames = $departmentUsers->pluck('username')
->filter()->map(fn ($username) => strtolower((string) $username));
$notificationQuery->where(function ($query) use ($requesterIds, $requesterUsernames) {
$query->whereIn('user_id', $requesterIds)
->orWhereIn(DB::raw('LOWER(user_id)'), $requesterUsernames)
->orWhereIn(DB::raw('LOWER(user_create)'), $requesterUsernames);
});
}
$puNotificationCount = $notificationQuery
->whereIn('request_status', ['pending', 'review'])
->whereNull('head_approval_date')->count();
}
} elseif (array_intersect($sidebarRoles, ['hrdxxx', 'hrd'])) {
$puNotificationCount = $notificationQuery->whereIn('request_status', ['pending', 'review', 'approved'])
->whereNotNull('head_approval_date')->whereNull('hrd_approval_date')->count();
} elseif (array_intersect($sidebarRoles, ['ptgspu', 'ptgoff'])) {
$notificationQuery->whereIn('request_status', ['pengadaan', 'pengerjaan', 'revisi']);
if (in_array('ptgoff', $sidebarRoles, true) && !in_array('ptgspu', $sidebarRoles, true)) {
$notificationQuery->where('worker_id', $sidebarUser->id);
}
$puNotificationCount = $notificationQuery->count();
} else {
$sidebarUsername = strtolower(trim((string) ($sidebarUser->username ?? '')));
$puNotificationCount = $notificationQuery->where('request_status', 'verifikasi')
->where(function ($query) use ($sidebarUser, $sidebarUsername) {
$query->where('user_id', $sidebarUser->id)
->orWhereRaw('LOWER(user_id) = ?', [$sidebarUsername])
->orWhereRaw('LOWER(user_create) = ?', [$sidebarUsername]);
})->count();
}
}
$menuNotificationCount = function ($menu) use ($puMenuKeys, $puNotificationCount) {
if (in_array($menu->dmenu ?? '', $puMenuKeys, true)) return $puNotificationCount;
if (empty($menu->notif)) return 0;
return (int) (DB::select($menu->notif)[0]->notif ?? 0);
};
$preferredPuMenu = function ($menuItems) use ($normalizedRules) {
$preferredOrder = ['truser', 'trreq', 'trpetn', 'trhrd'];
if (in_array('headxx', $normalizedRules, true)) {
$preferredOrder = ['trreq', 'truser', 'trpetn', 'trhrd'];
}
if (in_array('ptgspu', $normalizedRules, true) || in_array('ptgoff', $normalizedRules, true)) {
$preferredOrder = ['trpetn', 'truser', 'trreq', 'trhrd'];
}
if (in_array('admins', $normalizedRules, true) || in_array('admin', $normalizedRules, true) || in_array('hrdxxx', $normalizedRules, true) || in_array('hrd', $normalizedRules, true) || in_array('usersx', $normalizedRules, true)) {
$preferredOrder = ['truser', 'trreq', 'trhrd', 'trpetn'];
}
foreach ($preferredOrder as $dmenu) {
$candidate = $menuItems->firstWhere('dmenu', $dmenu);
if ($candidate) {
return $candidate;
}
}
return $menuItems->first();
};
$collapsePuMenus = function ($menuItems) use ($puMenuKeys, $preferredPuMenu) {
if (! $menuItems instanceof \Illuminate\Support\Collection) {
return $menuItems;
}
$puItems = $menuItems->filter(function ($item) use ($puMenuKeys) {
return in_array($item->dmenu ?? '', $puMenuKeys, true);
})->values();
if ($puItems->isEmpty()) {
return $menuItems;
}
$selectedPu = clone $preferredPuMenu($puItems);
$selectedPu->name = 'Daftar PU';
$selectedPu->icon = 'ni-bullet-list-67';
$insertedPu = false;
return $menuItems->filter(function ($item) use ($puMenuKeys, &$insertedPu, $selectedPu) {
if (! in_array($item->dmenu ?? '', $puMenuKeys, true)) {
return true;
}
if ($insertedPu) {
return false;
}
$item->dmenu = $selectedPu->dmenu;
$item->name = $selectedPu->name;
$item->url = $selectedPu->url;
$item->icon = $selectedPu->icon;
$item->notif = $selectedPu->notif ?? '';
$insertedPu = true;
return true;
})->values();
};
$reorderAdminDailyHrdMenu = function ($menuItems) use ($isAdminUser) {
if (! $isAdminUser || ! $menuItems instanceof \Illuminate\Support\Collection) {
return $menuItems;
}
$periodicIndex = $menuItems->search(function ($item) {
return strtolower(trim((string) ($item->name ?? ''))) === 'daftar periodic hrd';
});
$dailyIndex = $menuItems->search(function ($item) {
return strtolower(trim((string) ($item->name ?? ''))) === 'pekerjaan daily hrd';
});
if ($periodicIndex === false || $dailyIndex === false || $dailyIndex === $periodicIndex + 1) {
return $menuItems;
}
$dailyItem = $menuItems->pull($dailyIndex);
if ($dailyItem === null) {
return $menuItems;
}
$periodicIndex = $menuItems->search(function ($item) {
return strtolower(trim((string) ($item->name ?? ''))) === 'daftar periodic hrd';
});
if ($periodicIndex === false) {
$menuItems->push($dailyItem);
return $menuItems;
}
$menuItems->splice($periodicIndex + 1, 0, [$dailyItem]);
return $menuItems->values();
};
$getMenuName = function ($d) use ($isAdminUser) {
if (($d->dmenu ?? '') === 'truser') {
return 'Daftar PU';
}
if (($d->name ?? '') === 'Daftar PU') {
return 'Daftar PU';
}
return $d->name ?? '';
};
$getMenuIcon = function ($d) {
if (($d->dmenu ?? '') === 'truser') {
return 'ni-bullet-list-67';
}
return $d->icon ?? '';
};
$isMenuActive = function ($d) use ($url_menu, $puMenuKeys, $puMenuUrls) {
if (in_array($d->dmenu ?? '', $puMenuKeys, true)) {
return in_array($url_menu, $puMenuUrls, true);
}
return ($d->url ?? '') === $url_menu;
};
$shouldRenderAsStandalonePuMenu = function ($menuItems) use ($isAdminUser, $puMenuKeys) {
if ($isAdminUser || ! $menuItems instanceof \Illuminate\Support\Collection) {
return false;
}
return $menuItems->count() === 1 && in_array($menuItems->first()->dmenu ?? '', $puMenuKeys, true);
};
@endphp
{{-- Dashboard Petugas Link --}}
@if (in_array('ptgoff', $users_rules, true) || in_array('ptgspu', $users_rules, true))
-
Dashboard Petugas
@endif
@if ($isUserMenuUser)
@php
$flatMenuItems = DB::table('sys_dmenu')
->join('sys_auth', 'sys_dmenu.dmenu', '=', 'sys_auth.dmenu')
->whereIn('sys_auth.idroles', $users_rules)
->where('sys_dmenu.isactive', '1')
->where('sys_dmenu.show', '1')
->where('sys_auth.isactive', '1')
->select('sys_dmenu.*')
->distinct()
->orderBy('sys_dmenu.urut', 'asc')
->get();
@endphp
@foreach ($flatMenuItems as $d)
-
@endforeach
@elseif ($isHeadUser)
@php
$headMenuItems = DB::table('sys_dmenu')
->join('sys_auth', 'sys_dmenu.dmenu', '=', 'sys_auth.dmenu')
->whereIn('sys_auth.idroles', $users_rules)
->where('sys_dmenu.isactive', '1')
->where('sys_dmenu.show', '1')
->where('sys_auth.isactive', '1')
->whereIn('sys_dmenu.dmenu', ['trreq', 'trhis'])
->select('sys_dmenu.*')
->distinct()
->orderBy('sys_dmenu.urut', 'asc')
->get();
@endphp
@foreach ($headMenuItems as $d)
-
@endforeach
@else
{{-- LOOPING GMENU --}}
@foreach ($gmenu as $g)
@if ($g->gmenu == 'blankx')
{{-- Query DMenu --}}
@php
$querydmenu = DB::table('sys_dmenu')
->join('sys_auth', 'sys_dmenu.dmenu', '=', 'sys_auth.dmenu')
->whereIn('sys_auth.idroles', $users_rules)
->where('sys_dmenu.isactive', '1')
->where('sys_dmenu.show', '1')
->where('sys_auth.isactive', '1')
->where('sys_dmenu.gmenu', $g->gmenu)
->select('sys_dmenu.*')
->distinct()
->orderBy('sys_dmenu.urut', 'asc')
->get();
$querydmenu = $reorderAdminDailyHrdMenu($querydmenu);
$querydmenu = $collapsePuMenus($querydmenu);
@endphp
@if ($shouldRenderAsStandalonePuMenu($querydmenu))
@php
$d = $querydmenu->first();
@endphp
-
@else
@foreach ($querydmenu as $d)
-
@endforeach
@endif
@else
@php
$querydmenu = DB::table('sys_dmenu')
->join('sys_auth', 'sys_dmenu.dmenu', '=', 'sys_auth.dmenu')
->whereIn('sys_auth.idroles', $users_rules)
->where('sys_dmenu.isactive', '1')
->where('sys_dmenu.show', '1')
->where('sys_auth.isactive', '1')
->where('sys_dmenu.gmenu', $g->gmenu)
->select('sys_dmenu.*')
->distinct()
->orderBy('sys_dmenu.urut', 'asc')
->get();
$querydmenu = $reorderAdminDailyHrdMenu($querydmenu);
$querydmenu = $collapsePuMenus($querydmenu);
$groupNotificationCount = $querydmenu->sum(function ($menu) use ($menuNotificationCount) {
return $menuNotificationCount($menu);
});
@endphp
@if ($shouldRenderAsStandalonePuMenu($querydmenu))
@php
$d = $querydmenu->first();
@endphp
-
@elseif ($querydmenu->isNotEmpty())
-
name == $title_group ? 'aria-expanded=true' : '' }}>
{{ $g->name }}
@if ($groupNotificationCount > 0)
{{ $groupNotificationCount }}
@endif
@endif
@endif
@endforeach
@endif