import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'; import { useAuth } from '../modules/auth/composables/useAuth'; // Importar vistas import Login from '../modules/auth/components/Login.vue'; import MainLayout from '../MainLayout.vue'; import WarehouseIndex from '../modules/warehouse/components/WarehouseIndex.vue'; import WarehouseForm from '../modules/warehouse/components/WarehouseForm.vue'; import WarehouseDetails from '../modules/warehouse/components/WarehouseDetails.vue'; import WarehouseClassification from '../modules/warehouse/components/WarehouseClassification.vue'; import Units from '../modules/catalog/components/units/Units.vue'; import ProductsIndex from '../modules/products/components/ProductsIndex.vue'; import ProductForm from '../modules/products/components/ProductForm.vue'; import StoresIndex from '../modules/stores/components/StoresIndex.vue'; import RolesIndex from '../modules/users/components/RoleIndex.vue'; import RoleForm from '../modules/users/components/RoleForm.vue'; import UserIndex from '../modules/users/components/UserIndex.vue'; import StoreDetails from '../modules/stores/components/StoreDetails.vue'; import Positions from '../modules/rh/components/positions/Positions.vue'; import Departments from '../modules/rh/components/departments/Departments.vue'; import Companies from '../modules/catalog/components/companies/Companies.vue'; import '../modules/catalog/components/suppliers/Suppliers.vue'; import Suppliers from '../modules/catalog/components/suppliers/Suppliers.vue'; import Purchases from '../modules/purchases/components/Purchases.vue'; import PurchaseDetails from '../modules/purchases/components/PurchaseDetails.vue'; import PurchaseForm from '../modules/purchases/components/PurchaseForm.vue'; import WarehouseAddInventory from '../modules/warehouse/components/WarehouseAddInventory.vue'; import ModelDocuments from '../modules/catalog/components/ModelDocuments.vue'; import Requisitions from '../modules/requisitions/Requisitions.vue'; import CreateRequisition from '../modules/requisitions/CreateRequisition.vue'; import ClassificationsComercial from '../modules/catalog/components/comercial-classification/ClassificationsComercial.vue'; import WarehouseOutInventory from '../modules/warehouse/components/WarehouseOutInventory.vue'; import companiesRouter from '@/modules/catalog/components/companies/companies.router'; const routes: RouteRecordRaw[] = [ { path: '/login', name: 'Login', component: Login, meta: { requiresAuth: false, title: 'Iniciar Sesión' } }, { path: '/', component: MainLayout, meta: { requiresAuth: true }, children: [ { path: '', name: 'Dashboard', component: WarehouseIndex, meta: { title: 'Dashboard', requiresAuth: true } }, { path: 'warehouse', name: 'Warehouse', meta: { title: 'Almacén', requiresAuth: true }, children: [ { path: '', name: 'WarehouseHome', component: WarehouseIndex, meta: { title: 'Almacén - Dashboard', requiresAuth: true } }, { path: 'create', name: 'WarehouseCreate', component: WarehouseForm, meta: { title: 'Crear Almacén', requiresAuth: true } }, { path: ':id', name: 'WarehouseDetails', component: WarehouseDetails, meta: { title: 'Detalles del Almacén', requiresAuth: true } }, { path: 'classifications', name: 'WarehouseClassifications', component: WarehouseClassification, meta: { title: 'Clasificaciones de Almacén', requiresAuth: true } }, { path: 'batch-add', name: 'WarehouseAddInventory', component: WarehouseAddInventory, meta: { title: 'Agregar Items al Inventario', requiresAuth: true } }, { path: 'out-of-stock', name: 'WarehouseOutOfStock', component: WarehouseOutInventory, meta: { title: 'Salida de Inventario', requiresAuth: true } }, { path: 'inventory', name: 'WarehouseInventory', component: WarehouseIndex, meta: { title: 'Inventario - Almacén', requiresAuth: true } }, { path: 'movements', name: 'WarehouseMovements', component: WarehouseIndex, meta: { title: 'Movimientos - Almacén', requiresAuth: true } } ] }, { path: 'catalog', name: 'Catalog', meta: { title: 'Catálogo', requiresAuth: true }, children: [ { path: 'units-of-measure', name: 'UnitsOfMeasure', component: Units, meta: { title: 'Unidades de Medida', requiresAuth: true } }, { path: 'classifications-comercial', name: 'ClassificationsComercial', component: ClassificationsComercial, meta: { title: 'Clasificaciones Comerciales', requiresAuth: true } }, { path: 'companies', name: 'Companies', component: Companies, meta: { title: 'Empresas', requiresAuth: true } }, { path: 'suppliers', name: 'Suppliers', component: Suppliers, meta: { title: 'Proveedores', requiresAuth: true } }, { path: 'model-documents', name: 'ModelDocuments', component: ModelDocuments, meta: { title: 'Documentos del Modelo', requiresAuth: true } }, companiesRouter ] }, { path: 'purchases', name: 'Purchases', meta: { title: 'Compras', requiresAuth: true }, children: [ { path: 'requests', name: 'PurchaseRequests', component: Purchases, }, { path: ':id', name: 'PurchaseDetails', component: PurchaseDetails, }, { path: 'create', name: 'PurchaseCreate', component: PurchaseForm, }, ] }, { path: 'products', name: 'Products', component: ProductsIndex, meta: { title: 'Productos', requiresAuth: true }, children: [ { path: 'create', name: 'ProductCreate', component: ProductForm, meta: { title: 'Crear Producto', requiresAuth: true } }, ] }, { path: 'stores', name: 'Stores', component: StoresIndex, meta: { title: 'Tiendas', requiresAuth: true } }, { path: 'stores/:id', name: 'StoreDetails', component: StoreDetails, meta: { title: 'Detalles de la Tienda', requiresAuth: true } }, { path: 'users', name: 'Usuarios', meta: { title: 'Roles', requiresAuth: true }, children: [ { path: '', name: 'UserIndex', component: UserIndex, }, ] }, { path: 'roles', name: 'Roles', meta: { title: 'Roles', requiresAuth: true }, children: [ { path: '', name: 'RoleIndex', component: RolesIndex, meta: { title: 'Roles', requiresAuth: true } }, { path: 'permissions/:id', name: 'RolePermissions', component: RoleForm, meta: { title: 'Administrar Permisos', requiresAuth: true } }, ] }, { path: 'rh', name: 'RH', meta: { title: 'Recursos Humanos', requiresAuth: true }, children: [ { path: 'departments', name: 'Departments', component: Departments, meta: { title: 'Gestión de Departamentos', requiresAuth: true } }, { path: 'positions', name: 'Positions', component: Positions, meta: { title: 'Gestión de Puestos', requiresAuth: true } }, ] }, { path: 'requisitions', name: 'RequisitionsModule', meta: { title: 'Requisiciones', requiresAuth: true }, children: [ { path: '', name: 'Requisitions', component: Requisitions, meta: { title: 'Gestión de Requisiciones', requiresAuth: true } }, { path: 'create', name: 'RequisitionCreate', component: CreateRequisition, meta: { title: 'Crear Requisición', requiresAuth: true } }, { path: 'edit/:id', name: 'RequisitionEdit', component: CreateRequisition, meta: { title: 'Editar Requisición', requiresAuth: true } }, { path: ':id', name: 'RequisitionView', component: CreateRequisition, meta: { title: 'Ver Requisición', requiresAuth: true } } ] } ] }, { path: '/:pathMatch(.*)*', redirect: '/' } ]; const router = createRouter({ history: createWebHistory(), routes }); // Navigation Guard router.beforeEach((to, _from, next) => { const { isAuthenticated } = useAuth(); // Actualizar título de la página document.title = to.meta.title ? `${to.meta.title} - GOLS Control` : 'GOLS Control'; // Verificar si la ruta requiere autenticación if (to.meta.requiresAuth && !isAuthenticated.value) { // Redirigir al login si no está autenticado next({ name: 'Login', query: { redirect: to.fullPath } // Guardar ruta para redireccionar después del login }); } else if (to.name === 'Login' && isAuthenticated.value) { // Si ya está autenticado y va al login, redirigir al dashboard next({ name: 'Dashboard' }); } else { next(); } }); export default router;