'Inicio',
'route' => 'admin.home.index',
];
private $user;
private $orientation;
public function __construct()
{
$this->user = Auth::user();
$this->vuexySearch = Auth::user() !== null;
$this->orientation = config('custom.custom.myLayout');
}
/**
* Obtiene el menú según el estado del usuario (autenticado o no).
*/
public function getMenu()
{
// Obtener el menú desde la caché
$menu = $this->user === null
? $this->getGuestMenu()
: $this->getUserMenu();
// Marcar la ruta actual como activa
$currentRoute = Route::currentRouteName();
return $this->markActive($menu, $currentRoute);
}
/**
* Menú para usuarios no autenticados.
*/
private function getGuestMenu()
{
return Cache::remember('vuexy_menu_guest', now()->addDays(7), function () {
return $this->getMenuArray();
});
}
/**
* Menú para usuarios autenticados.
*/
private function getUserMenu()
{
//Cache::forget("vuexy_menu_user_{$this->user->id}"); // Borrar la caché anterior para actualizarla
return Cache::remember("vuexy_menu_user_{$this->user->id}", now()->addHours(24), function () {
return $this->getMenuArray();
});
}
private function processMenu($menu)
{
foreach ($menu as &$item) {
// Determinar visibilidad actual (si no está definida, es true por defecto)
$item['visible'] = $item['visible'] ?? true;
// Procesar submenús de manera recursiva
if (isset($item['submenu']) && is_array($item['submenu'])) {
$item['submenu'] = $this->processMenu($item['submenu']);
// Un submenú es visible si al menos uno de sus hijos es visible
$item['visible'] = collect($item['submenu'])->contains('visible', true);
}
// Generar URL para los elementos del menú que tengan una ruta definida
if (isset($item['route']))
$item['url'] = Route::has($item['route']) ? route($item['route']) : '#';
}
// Filtrar los elementos del menú que no sean visibles
return array_filter($menu, fn($item) => $item['visible']);
}
private function markActive($menu, $currentRoute)
{
foreach ($menu as &$item) {
$item['active'] = false;
// Check if the route matches
if (isset($item['route']) && $item['route'] === $currentRoute)
$item['active'] = true;
// Process submenus recursively
if (isset($item['submenu']) && !empty($item['submenu'])) {
$item['submenu'] = $this->markActive($item['submenu'], $currentRoute);
// If any submenu is active, mark the parent as active
if (collect($item['submenu'])->contains('active', true))
$item['active'] = true;
}
}
return $menu;
}
/**
* Invalida el cache del menú de un usuario.
*/
public static function clearUserMenuCache()
{
$user = Auth::user();
if ($user !== null)
Cache::forget("vuexy_menu_user_{$user->id}");
}
/**
* Invalida el cache del menú de invitados.
*/
public static function clearGuestMenuCache()
{
Cache::forget('vuexy_menu_guest');
}
public function getSearch()
{
return $this->vuexySearch;
}
public function getVuexySearchData()
{
if ($this->user === null)
return null;
$pages = Cache::remember("vuexy_search_user_{$this->user->id}", now()->addDays(7), function () {
return $this->cacheVuexySearchData();
});
// Formatear como JSON esperado
return [
'pages' => $pages,
];
}
private function cacheVuexySearchData()
{
$originalMenu = $this->getUserMenu();
return $this->getPagesSearchMenu($originalMenu);
}
private function getPagesSearchMenu(array $menu, string $parentPath = '')
{
$formattedMenu = [];
foreach ($menu as $name => $item) {
// Verificar si el elemento es visible
if (isset($item['visible']) && !$item['visible']) {
continue;
}
// Construir la ruta jerárquica (menu / submenu / submenu)
$currentPath = $parentPath ? $parentPath . ' / ' . $name : $name;
// Verificar si el elemento tiene una URL o una ruta
$url = $item['url'] ?? (isset($item['route']) ? route($item['route']) : null);
// Agregar el elemento al menú formateado
if ($url) {
$formattedMenu[] = [
'name' => $currentPath, // Usar la ruta completa
'icon' => $item['icon'] ?? 'ti ti-point',
'url' => $url,
];
}
// Si hay un submenú, procesarlo recursivamente
if (isset($item['submenu']) && is_array($item['submenu'])) {
$formattedMenu = array_merge(
$formattedMenu,
$this->getPagesSearchMenu($item['submenu'], $currentPath) // Pasar el path acumulado
);
}
}
return $formattedMenu;
}
public static function clearSearchMenuCache()
{
$user = Auth::user();
if ($user !== null)
Cache::forget("vuexy_search_user_{$user->id}");
}
public function getQuickLinks()
{
if ($this->user === null)
return null;
// Recuperar enlaces desde la caché
$quickLinks = Cache::remember("vuexy_quick_links_user_{$this->user->id}", now()->addDays(7), function () {
return $this->cacheQuickLinks();
});
// Verificar si la ruta actual está en la lista
$currentRoute = Route::currentRouteName();
$currentPageInList = $this->isCurrentPageInList($quickLinks, $currentRoute);
// Agregar la verificación al resultado
$quickLinks['current_page_in_list'] = $currentPageInList;
return $quickLinks;
}
private function cacheQuickLinks()
{
$originalMenu = $this->getUserMenu();
$quickLinks = [];
$quicklinks = Setting::where('user_id', Auth::user()->id)
->where('key', 'quicklinks')
->first();
$this->quicklinksRouteNames = $quicklinks ? json_decode($quicklinks->value, true) : [];
// Ordenar y generar los quickLinks según el orden del menú
$this->collectQuickLinksFromMenu($originalMenu, $quickLinks);
$quickLinksData = [
'totalLinks' => count($quickLinks),
'rows' => array_chunk($quickLinks, 2), // Agrupar los atajos en filas de dos
];
return $quickLinksData;
}
private function collectQuickLinksFromMenu(array $menu, array &$quickLinks, string $parentTitle = null)
{
foreach ($menu as $title => $item) {
// Verificar si el elemento está en la lista de quicklinksRouteNames
if (isset($item['route']) && in_array($item['route'], $this->quicklinksRouteNames)) {
$quickLinks[] = [
'title' => $title,
'subtitle' => $parentTitle ?? env('APP_NAME'),
'icon' => $item['icon'] ?? 'ti ti-point',
'url' => isset($item['route']) ? route($item['route']) : ($item['url'] ?? '#'),
'route' => $item['route'],
];
}
// Si tiene submenú, procesarlo recursivamente
if (isset($item['submenu']) && is_array($item['submenu'])) {
$this->collectQuickLinksFromMenu(
$item['submenu'],
$quickLinks,
$title // Pasar el título actual como subtítulo
);
}
}
}
/**
* Verifica si la ruta actual existe en la lista de enlaces.
*/
private function isCurrentPageInList(array $quickLinks, string $currentRoute): bool
{
foreach ($quickLinks['rows'] as $row) {
foreach ($row as $link) {
if (isset($link['route']) && $link['route'] === $currentRoute) {
return true;
}
}
}
return false;
}
public static function clearQuickLinksCache()
{
$user = Auth::user();
if ($user !== null)
Cache::forget("vuexy_quick_links_user_{$user->id}");
}
public function getNotifications()
{
if ($this->user === null)
return null;
return Cache::remember("vuexy_notifications_user_{$this->user->id}", now()->addHours(4), function () {
return $this->cacheNotifications();
});
}
private function cacheNotifications()
{
return "
";
}
public static function clearNotificationsCache()
{
$user = Auth::user();
if ($user !== null)
Cache::forget("vuexy_notifications_user_{$user->id}");
}
public function getBreadcrumbs()
{
$originalMenu = $this->user === null
? $this->getGuestMenu()
: $this->getUserMenu();
$routeName = Route::currentRouteName() ? Route::currentRouteName() : '';
// Lógica para construir los breadcrumbs
$breadcrumbs = $this->findBreadcrumbTrail($originalMenu, $routeName);
// Asegurar que el primer elemento siempre sea "Inicio"
array_unshift($breadcrumbs, $this->homeRoute);
return $breadcrumbs;
}
private function findBreadcrumbTrail(array $menu, string $routeName, array $breadcrumbs = []): array
{
foreach ($menu as $title => $item) {
$skipBreadcrumb = isset($item['breadcrumbs']) && $item['breadcrumbs'] === false;
if (isset($item['route']) && $item['route'] === $routeName) {
if (!$skipBreadcrumb) {
$breadcrumbs[] = [
'name' => $title,
'active' => true,
];
}
return $breadcrumbs;
}
if (isset($item['submenu']) && is_array($item['submenu'])) {
$newBreadcrumbs = $breadcrumbs;
if (!$skipBreadcrumb)
$newBreadcrumbs[] = [
'name' => $title,
'route' => $item['route'] ?? null,
];
$found = $this->findBreadcrumbTrail($item['submenu'], $routeName, $newBreadcrumbs);
if ($found)
return $found;
}
}
return [];
}
private function getMenuArray()
{
if ($this->orientation === 'horizontal') {
return $this->processMenu($this->getHorizontalMenu());
} else {
return $this->processMenu($this->getVerticalMenu());
}
}
private function getVerticalMenu()
{
return $this->getHorizontalMenu();
}
private function getHorizontalMenu()
{
return [
'Inicio' => [
'breadcrumbs' => false,
'icon' => 'menu-icon tf-icons ti ti-home',
'submenu' => [
'Inicio' => [
'route' => 'admin.home.index',
'icon' => 'menu-icon tf-icons ti ti-home',
],
'Ajustes' => [
'icon' => 'menu-icon tf-icons ti ti-settings-cog',
'submenu' => [
'Aplicación' => [
'submenu' => [
'Ajustes generales' => [
'route' => 'admin.webapp.general-settings.index',
'icon' => 'menu-icon tf-icons ti ti-adjustments-alt',
'visible' => $this->canUserAccess('webapp.general-settings.allow'),
],
'Ajustes de caché' => [
'route' => 'admin.webapp.cache-manager.index',
'icon' => 'menu-icon tf-icons ti ti-cpu',
'visible' => $this->canUserAccess('webapp.cache-manager.view'),
],
'API BANXICO' => [
'route' => 'admin.webapp.api-banxico.index',
'icon' => 'menu-icon tf-icons ti ti-building-bank',
'visible' => $this->canUserAccess('webapp.api-banxico.allow'),
],
'Servidor de correo SMTP' => [
'route' => 'admin.webapp.smtp-settings.index',
'icon' => 'menu-icon tf-icons ti ti-mail-cog',
'visible' => $this->canUserAccess('webapp.smtp-settings.allow'),
],
'Catálogos' => [
'route' => 'admin.webapp.catalogs.index',
'icon' => 'menu-icon tf-icons ti ti-library',
'visible' => $this->canUserAccess('webapp.catalogs.view'),
],
],
],
'Sitio Web' => [
'submenu' => [
'Ajustes generales' => [
'route' => 'admin.website.general-settings.index',
'icon' => 'menu-icon tf-icons ti ti-tools',
'visible' => $this->canUserAccess('website.general-settings.allow'),
],
'Avisos legales' => [
'route' => 'admin.website.legal.index',
'icon' => 'menu-icon tf-icons ti ti-writing-sign',
'visible' => $this->canUserAccess('website.legal.view'),
],
],
],
'Empresa' => [
'submenu' => [
'Información general' => [
'route' => 'admin.company.general-settings.index',
'icon' => 'menu-icon tf-icons ti ti-adjustments-alt',
'visible' => $this->canUserAccess('company.general-settings.allow'),
],
'Sucursales' => [
'route' => 'admin.company.stores.index',
'icon' => 'menu-icon tf-icons ti ti-building',
'visible' => $this->canUserAccess('company.stores.view'),
],
'Centros de trabajo' => [
'route' => 'admin.company.workcenters.index',
'icon' => 'menu-icon tf-icons ti ti-map-pin-cog',
'visible' => $this->canUserAccess('company.stores.view'),
],
'Catálogos' => [
'route' => 'admin.company.catalogs.index',
'icon' => 'menu-icon tf-icons ti ti-library',
'visible' => $this->canUserAccess('company.catalogs.view'),
],
]
],
'Punto de venta' => [
'submenu' => [
'Listas de precios' => [
'route' => 'admin.pos.pricelists-config.index',
'icon' => 'menu-icon tf-icons ti ti-list-search',
'visible' => $this->canUserAccess('pos.pricelists-config.allow'),
],
'Ticket' => [
'route' => 'admin.pos.ticket-config.index',
'icon' => 'menu-icon tf-icons ti ti-receipt',
'visible' => $this->canUserAccess('pos.ticket-config.allow'),
],
'Catálogos' => [
'route' => 'admin.pos.catalogs.index',
'icon' => 'menu-icon tf-icons ti ti-library',
'visible' => $this->canUserAccess('pos.catalogs.view'),
],
]
],
'Facturación' => [
'submenu' => [
'Configuraciones' => [
'route' => 'admin.billing.general-settings.index',
'icon' => 'menu-icon tf-icons ti ti-tool',
'visible' => $this->canUserAccess('billing.general-settings.allow'),
],
'Certificados de Sello Digital' => [
'route' => 'admin.billing.csds-settings.index',
'icon' => 'menu-icon tf-icons ti ti-certificate-2',
'visible' => $this->canUserAccess('billing.csds-settings.allow'),
],
'Paquete de timbrado' => [
'route' => 'admin.billing.stamping-package.index',
'icon' => 'menu-icon tf-icons ti ti-bell-cog',
'visible' => $this->canUserAccess('billing.stamping-package.allow'),
],
'Servidor de correo SMTP' => [
'route' => 'admin.billing.smtp-settings.index',
'icon' => 'menu-icon tf-icons ti ti-mail-cog',
'visible' => $this->canUserAccess('billing.smtp-settings.allow'),
],
]
],
]
],
'Sistema' => [
'icon' => 'menu-icon tf-icons ti ti-user-cog',
'submenu' => [
'Usuarios' => [
'route' => 'admin.system.users.index',
'icon' => 'menu-icon tf-icons ti ti-users',
'visible' => $this->canUserAccess('system.users.view'),
],
'Roles y permisos' => [
'submenu' => [
'Roles' => [
'route' => 'admin.system.roles.index',
'icon' => 'menu-icon tf-icons ti ti-user-shield',
'visible' => $this->canUserAccess('system.roles.view'),
],
'Permisos' => [
'route' => 'admin.system.permissions.index',
'icon' => 'menu-icon tf-icons ti ti-user-star',
'visible' => $this->canUserAccess('system.permissions.view'),
]
]
],
'Importar' => [
'submenu' => [
'Catálogos SAT' => [
'route' => 'admin.import.catalogs-sat.index',
'icon' => 'menu-icon tf-icons ti ti-library',
'visible' => $this->canUserAccess('import.catalogs-sat.allow'),
],
]
],
]
],
env('APP_URL') => [
'url' => env('APP_URL'),
'icon' => 'menu-icon tf-icons ti ti-world-www',
],
/*
'Exportar' => [
'icon' => 'menu-icon tf-icons ti ti-database-export',
'submenu' => [
'Catálogos SAT' => [
'route' => 'admin.export.customers.index',
'visible' => $this->canUserAccess('export.customers.allow'),
],
]
],
*/
'Acerca de' => [
'route' => 'admin.about.index',
'icon' => 'menu-icon tf-icons ti ti-cat',
],
],
],
'Recursos humanos' => [
'icon' => 'menu-icon tf-icons ti ti-users-group',
'submenu' => [
'Tablero' => [
'route' => 'admin.human-resources.dashboard.index',
'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
'visible' => $this->canUserAccess('human-resources.dashboard.allow'),
],
'Empleados' => [
'route' => 'admin.human-resources.employees.index',
'icon' => 'menu-icon tf-icons ti ti-id-badge-2',
'visible' => $this->canUserAccess('human-resources.employees.view'),
],
'Puestos de trabajo' => [
'route' => 'admin.human-resources.jobs.index',
'icon' => 'menu-icon tf-icons ti ti-tie',
'visible' => $this->canUserAccess('human-resources.jobs.view'),
],
]
],
'Nómina' => [
'icon' => 'menu-icon tf-icons ti ti-user-dollar',
'submenu' => [
'Tablero' => [
'route' => 'admin.payrolls.dashboard.index',
'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
'visible' => $this->canUserAccess('payrolls.dashboard.allow'),
],
'Contratos' => [
'route' => 'admin.payrolls.contracts.index',
'icon' => 'menu-icon tf-icons ti ti-writing-sign',
'visible' => $this->canUserAccess('payrolls.contracts.view'),
],
'Asistencias' => [
'route' => 'admin.payrolls.assistance.index',
'icon' => 'menu-icon tf-icons ti ti-calendar-exclamation',
'visible' => $this->canUserAccess('payrolls.assistance.view'),
],
'CFDI Nómina' => [
'route' => 'admin.payrolls.billing.index',
'icon' => 'menu-icon tf-icons ti ti-file-certificate',
'visible' => $this->canUserAccess('billing.nomina.view'),
],
]
],
'Activos fijos' => [
'icon' => 'menu-icon tf-icons ti ti-building',
'submenu' => [
'Tablero' => [
'route' => 'admin.assets.dashboard.index',
'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
'visible' => $this->canUserAccess('assets.dashboard.allow'),
],
'Activos fijos' => [
'route' => 'admin.assets.assets.index',
'icon' => 'menu-icon tf-icons ti ti-building',
'visible' => $this->canUserAccess('assets.assets.view'),
],
'Eventos relacionados' => [
'route' => 'admin.assets.events.index',
'icon' => 'menu-icon tf-icons ti ti-list-check',
'visible' => $this->canUserAccess('assets.events.view'),
],
]
],
'CRM' => [
'icon' => 'menu-icon tf-icons ti ti-users',
'submenu' => [
'Contactos' => [
'route' => 'admin.crm.contacts.index',
'icon' => 'menu-icon tf-icons ti ti-users',
'visible' => $this->canUserAccess('crm.contacts.view'),
],
'Campañas de marketing' => [
'route' => 'admin.crm.marketing-campaigns.index',
'icon' => 'menu-icon tf-icons ti ti-ad-2',
'visible' => $this->canUserAccess('crm.marketing-campaigns.view'),
],
'Oportunidades ' => [
'route' => 'admin.crm.leads.index',
'icon' => 'menu-icon tf-icons ti ti-target-arrow',
'visible' => $this->canUserAccess('crm.leads.view'),
],
'Newsletter' => [
'route' => 'admin.crm.newsletter.index',
'icon' => 'menu-icon tf-icons ti ti-notebook',
'visible' => $this->canUserAccess('crm.newsletter.view'),
],
]
],
'Productos y servicios' => [
'icon' => 'menu-icon tf-icons ti ti-package',
'submenu' => [
'Categorias' => [
'route' => 'admin.products.categories.index',
'icon' => 'menu-icon tf-icons ti ti-category',
'visible' => $this->canUserAccess('products.categories.view'),
],
'Catálogos' => [
'route' => 'admin.products.catalogs.index',
'icon' => 'menu-icon tf-icons ti ti-library',
'visible' => $this->canUserAccess('products.catalogs.view'),
],
'Productos y servicios' => [
'route' => 'admin.products.products.index',
'icon' => 'menu-icon tf-icons ti ti-packages',
'visible' => $this->canUserAccess('products.products.view'),
],
'Agregar producto o servicio' => [
'route' => 'admin.products.products.create',
'icon' => 'menu-icon tf-icons ti ti-package',
'visible' => $this->canUserAccess('products.products.create'),
],
]
],
'Compras y Gastos' => [
'icon' => 'menu-icon tf-icons ti ti-receipt-2',
'submenu' => [
'Tablero' => [
'route' => 'admin.purchases.dashboard.index',
'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
'visible' => $this->canUserAccess('purchases.dashboard.allow'),
],
'Proveedores' => [
'route' => 'admin.purchases.supplier.index',
'icon' => 'menu-icon tf-icons ti ti-truck',
'visible' => $this->canUserAccess('purchases.supplier.view'),
],
'Ordenes de compra' => [
'icon' => 'menu-icon tf-icons ti ti-list-details',
'submenu' => [
'Nueva ordenes de compra' => [
'route' => 'admin.purchases.orders.create',
'icon' => 'menu-icon tf-icons ti ti-basket-check',
'visible' => $this->canUserAccess('purchases.orders.create'),
],
'Ordenes de compra' => [
'route' => 'admin.purchases.orders.index',
'icon' => 'menu-icon tf-icons ti ti-basket-check',
'visible' => $this->canUserAccess('purchases.orders.view'),
],
'Ordenes de compra por producto o servicio' => [
'route' => 'admin.purchases.orders-by-product.index',
'icon' => 'menu-icon tf-icons ti ti-basket-check',
'visible' => $this->canUserAccess('purchases.orders.view'),
],
]
],
'Compras y gastos' => [
'icon' => 'menu-icon tf-icons ti ti-receipt-2',
'submenu' => [
'Nueva compras o gastos' => [
'route' => 'admin.purchases.purchases.create',
'icon' => 'menu-icon tf-icons ti ti-basket-dollar',
'visible' => $this->canUserAccess('purchases.purchases.create'),
],
'Compras y gastos' => [
'route' => 'admin.purchases.purchases.index',
'icon' => 'menu-icon tf-icons ti ti-basket-dollar',
'visible' => $this->canUserAccess('purchases.purchases.view'),
],
'Compras y gastos por producto o servicio' => [
'route' => 'admin.purchases.purchases-by-product.index',
'icon' => 'menu-icon tf-icons ti ti-basket-dollar',
'visible' => $this->canUserAccess('purchases.purchases.view'),
],
]
],
]
],
'Ventas' => [
'icon' => 'menu-icon tf-icons ti ti-cash-register',
'submenu' => [
'Tablero' => [
'route' => 'admin.pos.dashboard.index',
'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
'visible' => $this->canUserAccess('pos.dashboard.allow'),
],
'Clientes' => [
'route' => 'admin.pos.customers.index',
'icon' => 'menu-icon tf-icons ti ti-users-group',
'visible' => $this->canUserAccess('pos.customers.view'),
],
'Lista de precios' => [
'route' => 'admin.pos.pricelist.index',
'icon' => 'menu-icon tf-icons ti ti-report-search',
'visible' => $this->canUserAccess('pos.sales.view'),
],
'Cotizaciones' => [
'route' => 'admin.pos.quotes.index',
'icon' => 'menu-icon tf-icons ti ti-file-dollar',
'visible' => $this->canUserAccess('pos.quotes.view'),
],
'Ventas' => [
'icon' => 'menu-icon tf-icons ti ti-cash-register',
'submenu' => [
'Crear venta' => [
'route' => 'admin.pos.sales.create',
'icon' => 'menu-icon tf-icons ti ti-cash-register',
'visible' => $this->canUserAccess('pos.sales.create'),
],
'Ventas' => [
'route' => 'admin.pos.sales.index',
'icon' => 'menu-icon tf-icons ti ti-cash-register',
'visible' => $this->canUserAccess('pos.sales.view'),
],
'Ventas por producto o servicio' => [
'route' => 'admin.pos.sales-by-product.index',
'icon' => 'menu-icon tf-icons ti ti-cash-register',
'visible' => $this->canUserAccess('pos.sales.view'),
],
]
],
'Remisiones' => [
'icon' => 'menu-icon tf-icons ti ti-receipt',
'submenu' => [
'Crear remisión' => [
'route' => 'admin.pos.remissions.create',
'icon' => 'menu-icon tf-icons ti ti-receipt',
'visible' => $this->canUserAccess('pos.remissions.create'),
],
'Remisiones' => [
'route' => 'admin.pos.remissions.index',
'icon' => 'menu-icon tf-icons ti ti-receipt',
'visible' => $this->canUserAccess('pos.remissions.view'),
],
'Remisiones por producto o servicio' => [
'route' => 'admin.pos.remissions-by-product.index',
'icon' => 'menu-icon tf-icons ti ti-receipt',
'visible' => $this->canUserAccess('pos.remissions.view'),
],
]
],
'Notas de crédito' => [
'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
'submenu' => [
'Crear nota de crédito' => [
'route' => 'admin.pos.credit-notes.create',
'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
'visible' => $this->canUserAccess('pos.credit-notes.create'),
],
'Notas de créditos' => [
'route' => 'admin.pos.credit-notes.index',
'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
'visible' => $this->canUserAccess('pos.credit-notes.view'),
],
'Notas de crédito por producto o servicio' => [
'route' => 'admin.pos.credit-notes-by-product.index',
'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
'visible' => $this->canUserAccess('pos.credit-notes.view'),
],
]
],
]
],
'Facturación' => [
'icon' => 'menu-icon tf-icons ti ti-rubber-stamp',
'submenu' => [
'Tablero' => [
'route' => 'admin.billing.dashboard.index',
'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
'visible' => $this->canUserAccess('billing.dashboard.allow'),
],
'Ingresos' => [
'icon' => 'menu-icon tf-icons ti ti-file-certificate',
'submenu' => [
'Facturar ventas' => [
'route' => 'admin.billing.ingresos-stamp.index',
'icon' => 'menu-icon tf-icons ti ti-rubber-stamp',
'visible' => $this->canUserAccess('billing.ingresos.create'),
],
'CFDI Ingresos' => [
'route' => 'admin.billing.ingresos.index',
'icon' => 'menu-icon tf-icons ti ti-file-invoice',
'visible' => $this->canUserAccess('billing.ingresos.view'),
],
'CFDI Ingresos por producto o servicio' => [
'route' => 'admin.billing.ingresos-by-product.index',
'icon' => 'menu-icon tf-icons ti ti-file-invoice',
'visible' => $this->canUserAccess('billing.ingresos.view'),
],
]
],
'Egresos' => [
'icon' => 'menu-icon tf-icons ti ti-file-certificate',
'submenu' => [
'Facturar notas de crédito' => [
'route' => 'admin.billing.egresos-stamp.index',
'icon' => 'menu-icon tf-icons ti ti-rubber-stamp',
'visible' => $this->canUserAccess('billing.egresos.create'),
],
'CFDI Engresos' => [
'route' => 'admin.billing.egresos.index',
'icon' => 'menu-icon tf-icons ti ti-file-invoice',
'visible' => $this->canUserAccess('billing.egresos.view'),
],
'CFDI Engresos por producto o servicio' => [
'route' => 'admin.billing.egresos-by-product.index',
'icon' => 'menu-icon tf-icons ti ti-lisfile-invoicet',
'visible' => $this->canUserAccess('billing.egresos.view'),
],
]
],
'Pagos' => [
'icon' => 'menu-icon tf-icons ti ti-file-certificate',
'submenu' => [
'Facturar pagos' => [
'route' => 'admin.billing.pagos-stamp.index',
'icon' => 'menu-icon tf-icons ti ti-rubber-stamp',
'visible' => $this->canUserAccess('billing.pagos.created'),
],
'CFDI Pagos' => [
'route' => 'admin.billing.pagos.index',
'icon' => 'menu-icon tf-icons ti ti-file-invoice',
'visible' => $this->canUserAccess('billing.pagos.view'),
],
]
],
'CFDI Nómina' => [
'route' => 'admin.billing.nomina.index',
'icon' => 'menu-icon tf-icons ti ti-file-certificate',
'visible' => $this->canUserAccess('billing.nomina.view'),
],
'Verificador de CFDI 4.0' => [
'route' => 'admin.billing.verify-cfdi.index',
'icon' => 'menu-icon tf-icons ti ti-rosette-discount-check',
'visible' => $this->canUserAccess('billing.verify-cfdi.allow'),
],
]
],
'Finanzas' => [
'icon' => 'menu-icon tf-icons ti ti-coins',
'submenu' => [
'Tablero' => [
'route' => 'admin.finance.dashboard.index',
'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
'visible' => $this->canUserAccess('finance.dashboard.allow'),
],
'Catálogos de cuentas contables' => [
'route' => 'admin.finance.accounting-charts.index',
'icon' => 'menu-icon tf-icons ti ti-chart-histogram',
'visible' => $this->canUserAccess('finance.accounting-charts.view'),
],
'Cuentas por pagar' => [
'route' => 'admin.finance.accounts-payable.index',
'icon' => 'menu-icon tf-icons ti ti-businessplan',
'visible' => $this->canUserAccess('finance.accounts-payable.view'),
],
'Cuentas por cobrar' => [
'route' => 'admin.finance.accounts-receivable.index',
'icon' => 'menu-icon tf-icons ti ti-cash-register',
'visible' => $this->canUserAccess('finance.accounts-receivable.view'),
],
]
],
'Sitio Web' => [
'icon' => 'menu-icon tf-icons ti ti-wand',
'submenu' => [
'Slider' => [
'route' => 'admin.website.slider.index',
'icon' => 'menu-icon tf-icons ti ti-table-row',
'visible' => $this->canUserAccess('website.slider.view'),
],
'Concierge Magazine' => [
'route' => 'admin.website.cmagazine.index',
'icon' => 'menu-icon tf-icons ti ti-book',
'visible' => $this->canUserAccess('website.cmagazine.view'),
],
'Preguntas frecuentes' => [
'route' => 'admin.website.faq.index',
'icon' => 'menu-icon tf-icons ti ti-bubble-text',
'visible' => $this->canUserAccess('website.faq.view'),
],
]
],
'Blog' => [
'icon' => 'menu-icon tf-icons ti ti-news',
'submenu' => [
'Categorias' => [
'route' => 'admin.blog.categories.index',
'icon' => 'menu-icon tf-icons ti ti-category',
'visible' => $this->canUserAccess('blog.categories.view'),
],
'Etiquetas' => [
'route' => 'admin.blog.tags.index',
'icon' => 'menu-icon tf-icons ti ti-tags',
'visible' => $this->canUserAccess('blog.tags.view'),
],
'Articulos' => [
'route' => 'admin.blog.articles.index',
'icon' => 'menu-icon tf-icons ti ti-news',
'visible' => $this->canUserAccess('blog.articles.view'),
],
'Comentarios' => [
'route' => 'admin.blog.comments.index',
'icon' => 'menu-icon tf-icons ti ti-message',
'visible' => $this->canUserAccess('blog.comments.view'),
],
]
],
'Iniciar sesión' => [
'route' => 'login',
'icon' => 'menu-icon tf-icons ti ti-login',
'visible' => $this->user === null,
],
'Recuperar contraseña' => [
'route' => 'password.request',
'icon' => 'menu-icon tf-icons ti ti-key',
'visible' => !$this->user === null,
],
];
}
private function canUserAccess($permission)
{
return $this->user && $this->user->can($permission);
}
}