@php
$faviconVersion = file_exists(public_path('favicon.ico')) ? (string) filemtime(public_path('favicon.ico')) : (string) time();
@endphp
@stack('styles')
@php
$user = auth()->user();
// Tüm menü yetkilerini tek batch sorgu ile al
$menuAccess = $user ? \App\Support\ModuleAccess::userMenuAccessMap($user) : [];
$isManager = $user && strtolower(trim((string) $user->role)) === 'manager';
$can = static function ($key) use ($menuAccess, $user) {
$key = trim((string) $key);
if ($key === '') {
return false;
}
if (str_starts_with($key, 'module.')) {
if (!$user) {
return false;
}
$segments = explode('.', $key);
if (count($segments) >= 3 && !empty($segments[1])) {
$permission = !empty($segments[2]) ? (string) $segments[2] : 'view';
return \App\Support\ModuleAccess::userHasModule($user, (string) $segments[1], $permission);
}
return \App\Support\ModuleAccess::userHasPermission($user, $key);
}
return !empty($menuAccess[$key]);
};
// Prefer employee id provided by AdminLayoutComposer.
$layoutEmployeeId = (int) ($layoutEmployeeId ?? 0);
if ($layoutEmployeeId <= 0 && $user) {
try {
if (\Illuminate\Support\Facades\Schema::hasTable('employees')) {
$employeeCode = trim((string) ($user->user_code ?? ''));
$company = trim((string) ($user->company ?? ''));
$hasCompanyColumn = \Illuminate\Support\Facades\Schema::hasColumn('employees', 'company');
if ($employeeCode !== '' && \Illuminate\Support\Facades\Schema::hasColumn('employees', 'employee_code')) {
$query = \Illuminate\Support\Facades\DB::table('employees')->where('employee_code', $employeeCode);
if ($company !== '' && $hasCompanyColumn) {
$query->where('company', $company);
}
$layoutEmployeeId = (int) ($query->value('id') ?? 0);
}
if ($layoutEmployeeId <= 0 && \Illuminate\Support\Facades\Schema::hasColumn('employees', 'name')) {
$query = \Illuminate\Support\Facades\DB::table('employees')->where('name', (string) ($user->name ?? ''));
if ($company !== '' && $hasCompanyColumn) {
$query->where('company', $company);
}
$layoutEmployeeId = (int) ($query->value('id') ?? 0);
}
}
} catch (\Throwable $e) {
$layoutEmployeeId = 0;
}
}
$userId = (int) ($user->id ?? 0);
$employeeId = $layoutEmployeeId ?? 0;
// --- Form Menu Data & Groups ---
$formMenuData = \App\Support\FormMenuNavigation::forUser($user, $menuAccess);
$formMenuGroups = [
'performance' => collect((array) data_get($formMenuData, 'groups.performance', []))->map(static fn(array $row): object => (object) $row)->values(),
'tasks' => collect((array) data_get($formMenuData, 'groups.tasks', []))->map(static fn(array $row): object => (object) $row)->values(),
'settings' => collect((array) data_get($formMenuData, 'groups.settings', []))->map(static fn(array $row): object => (object) $row)->values(),
];
$formMenuLinkMap = (array) data_get($formMenuData, 'link_map', []);
$formMenuLinksAllowed = [];
foreach ((array) data_get($formMenuData, 'links', []) as $groupId => $groupLinks) {
$formMenuLinksAllowed[(int) $groupId] = collect((array) $groupLinks)->map(static fn(array $row): object => (object) $row)->values();
}
// Determine active form menus for dynamic highlighting
$formMenuActiveGroupId = 0;
$formMenuActiveModule = '';
if (request()->routeIs('admin.form-menus.fill')) {
$activeMenuId = (int) request()->route('id');
if ($activeMenuId > 0) {
$activeMeta = $formMenuLinkMap[$activeMenuId] ?? null;
if (is_array($activeMeta)) {
$formMenuActiveGroupId = (int) ($activeMeta['group_id'] ?? 0);
$formMenuActiveModule = (string) ($activeMeta['module_key'] ?? '');
} elseif (\Illuminate\Support\Facades\Schema::hasTable('form_menu_links')) {
$formMenuActiveModule = (string) (\Illuminate\Support\Facades\DB::table('form_menu_links')->where('id', $activeMenuId)->value('menu_group') ?? '');
}
}
}
$formMenuHas = (array) data_get($formMenuData, 'has', []);
$hasPerformanceFormMenuLinks = !empty($formMenuHas['performance']);
$hasTasksFormMenuLinks = !empty($formMenuHas['tasks']);
$hasSettingsFormMenuLinks = !empty($formMenuHas['settings']);
$isAssetsAdmin = (bool) ($isAssetsAdminFlag ?? false);
$isAssetsGroupAuthority = (bool) ($isAssetsGroupAuthorityFlag ?? false);
// AKTIF ROUTE KONTROLLERI
$hrActive = request()->routeIs('admin.employees.*', 'admin.questions.*', 'admin.rule-sets.*', 'admin.periods.*', 'admin.assignments.*', 'admin.reports.*') || $formMenuActiveModule === 'performance';
$tasksActive = request()->routeIs('admin.tasks.*') || $formMenuActiveModule === 'tasks';
$marketingActive = request()->routeIs('admin.marketing.*');
$taleplerActive = request()->routeIs('admin.talepler.*');
$assetsActive = request()->routeIs('admin.assets.*');
$settingsActive = request()->routeIs('admin.responsibility-centers.*', 'admin.email-settings.*', 'admin.task-settings.*', 'admin.form-menus.*', 'admin.form-templates.*', 'admin.form-responses.*', 'admin.camunda.workflows.*', 'admin.camunda.settings.*', 'admin.erp-settings.*', 'admin.erp-sync-logs.*') || $formMenuActiveModule === 'settings';
$userGroupsActive = request()->routeIs('admin.departments.*', 'admin.titles.*', 'admin.positions.*');
$unitManagementActive = request()->routeIs('admin.assets.groups.*');
$sharedAreaManagementActive = request()->routeIs('admin.assets.shared-areas.*');
$userManagementActive = $userGroupsActive || $unitManagementActive || $sharedAreaManagementActive || request()->routeIs('admin.users.*') || request()->routeIs('admin.roles.*');
$managementActive = $settingsActive || $userManagementActive || request()->routeIs('admin.modules.*') || $formMenuActiveModule === 'settings';
// GORUNURLUK KONTROLLERI (Granular - Parent Module View rules)
// 1. Performance
$canHrView = $can('module.performance.view');
$showHrBaseMenu = $can('menu.hr.employees') || $can('menu.hr.questions') || $can('menu.hr.rule_sets') || $can('menu.hr.periods') || $can('menu.hr.assignments') || $can('menu.hr.reports');
$showHrMenu = $canHrView && ($showHrBaseMenu || $hasPerformanceFormMenuLinks);
// 2. Tasks
$canTasksView = $can('module.tasks.view');
$showTasksMenu = $canTasksView && ($can('menu.tasks.my') || $can('menu.tasks.assign') || $can('menu.tasks.track') || $can('menu.tasks.camunda_pending') || $hasTasksFormMenuLinks);
// 3. Marketing
$canMarketingView = $can('module.marketing.view');
$showMarketingMenu = $canMarketingView && ($can('menu.marketing.board') || $can('menu.marketing.destek') || $can('menu.marketing.worklist') || $can('menu.marketing.kreatif') || $can('menu.marketing.marka_tescil') || $can('menu.marketing.musteri_sikayetleri') || $can('menu.marketing.franchise') || $can('menu.marketing.test'));
// 4. Assets
$canTaleplerView = $can('module.talepler.view');
$canTaleplerIndex = $can('menu.talepler.index') && \App\Support\TaleplerAccess::canOpenRequestScreen($user);
$showTaleplerMenu = $canTaleplerView && $canTaleplerIndex;
$canAssetsView = $can('module.assets.view');
$showAssetsMenu = $canAssetsView && ($can('menu.assets.my_inventory') || $can('menu.assets.my_faults') || $can('menu.assets.manage') || $can('menu.assets.user_assets') || $can('menu.assets.fault_manage') || $isAssetsGroupAuthority || $can('menu.assets.workflow'));
// 5. Management (Yönetim)
$canManagementView = $can('module.management.view');
$showSettingsMenu = $canManagementView && ($can('menu.settings.responsibility_centers') || $can('menu.settings.email_settings') || $can('menu.settings.task_settings') || $can('menu.settings.form_templates') || $can('menu.settings.form_responses') || $can('menu.settings.form_menus') || $can('menu.settings.erp_settings') || $can('menu.settings.erp_logs') || $can('menu.settings.workflow_management') || $can('menu.settings.module_permissions') || $hasSettingsFormMenuLinks);
$showUserManagementMenu = $canManagementView && ($can('menu.users.index') || $can('menu.users.permissions') || $can('menu.users.permission_users') || $can('menu.users.role_permissions') || $can('menu.users.roles') || $can('menu.users.departments') || $can('menu.users.titles') || $can('menu.users.positions') || $can('menu.assets.groups') || $can('menu.assets.shared_areas'));
$showManagementMenu = $showSettingsMenu || $showUserManagementMenu;
$canDashboard = $can('menu.dashboard');
$canPerformanceEvaluations = $canHrView && $can('menu.performance.evaluations');
$canAssetsManage = $can('module.assets.manage') || $isAssetsAdmin || $isAssetsGroupAuthority;
$showUserGroupsMenu = $canManagementView && ($can('menu.users.departments') || $can('menu.users.titles') || $can('menu.users.positions'));
$logo = $logo ?? null;
$notifyReady = (bool) ($notifyReady ?? false);
$notifyCount = (int) ($notifyCount ?? 0);
$notifyItems = collect($notifyItems ?? []);
@endphp
@if (session('access_error'))
{{ session('access_error') }}
@endif
@yield('content')