# Help Desk - Documentación del Proyecto ## Estructura del Proyecto ``` help_desk/ ├── app.js # Entry point, configura Express ├── package.json # Dependencias y scripts ├── .env # Variables de entorno ├── .gitignore ├── config/ │ ├── db.js # Conexión a MySQL/MariaDB con mysql2 │ ├── init.sql # Script SQL inicial │ └── setup.js # Script Node para inicializar BD ├── middleware/ │ └── auth.js # Middleware: isAuthenticated, isAdmin, isAgent, isClient ├── models/ │ ├── User.js # CRUD usuarios │ ├── Ticket.js # CRUD tickets + respuestas │ └── Department.js # CRUD departamentos ├── routes/ │ ├── auth.js # Login, Register, Logout │ ├── client.js # Rutas para clientes (ver/crear tickets) │ ├── agent.js # Rutas para agentes (gestionar tickets) │ └── admin.js # Rutas para admin (usuarios, departamentos) ├── views/ │ ├── partials/ │ │ ├── header.ejs # Head HTML + navbar │ │ ├── footer.ejs # Scripts + cierre │ │ ├── navbar.ejs # Barra de navegación superior │ │ └── sidebar.ejs # Menú lateral por rol │ ├── auth/ │ │ ├── login.ejs │ │ └── register.ejs │ ├── client/ │ │ ├── dashboard.ejs # Lista de tickets del cliente │ │ ├── new-ticket.ejs # Formulario crear ticket │ │ └── view-ticket.ejs # Ver ticket + respuestas │ ├── agent/ │ │ ├── dashboard.ejs # Panel con todos los tickets │ │ └── view-ticket.ejs # Ver ticket + responder + cambiar estado │ └── admin/ │ ├── dashboard.ejs # Estadísticas y accesos rápidos │ ├── users.ejs # CRUD usuarios │ ├── create-user.ejs # Formulario crear usuario │ └── departments.ejs # CRUD departamentos con modales ├── public/ │ ├── css/ │ │ └── style.css # Estilos personalizados │ └── js/ │ └── main.js # JS del lado cliente └── proyecto.md, memoria.md, readme.md ``` ## Base de Datos (MariaDB/MySQL) ### Tabla: `users` | Campo | Tipo | Descripción | |------------|-----------------------------|---------------------------| | id | INT AUTO_INCREMENT PK | ID único | | nombre | VARCHAR(100) NOT NULL | Nombre completo | | email | VARCHAR(100) NOT NULL UNIQUE| Correo electrónico | | password | VARCHAR(255) NOT NULL | Hash bcrypt | | rol | ENUM('admin','agent','client') DEFAULT 'client' | Rol del usuario | | created_at | TIMESTAMP DEFAULT CURRENT_TIMESTAMP | Fecha de registro | ### Tabla: `departments` | Campo | Tipo | Descripción | |------------|-----------------------------|---------------------------| | id | INT AUTO_INCREMENT PK | ID único | | nombre | VARCHAR(100) NOT NULL | Nombre del departamento | | descripcion| TEXT | Descripción | | created_at | TIMESTAMP DEFAULT CURRENT_TIMESTAMP | Fecha de creación | ### Tabla: `tickets` | Campo | Tipo | Descripción | |-------------|-----------------------------|------------------------------| | id | INT AUTO_INCREMENT PK | ID único (# ticket) | | user_id | INT NOT NULL FK → users.id | Cliente creador | | department_id| INT FK → departments.id | Departamento | | asunto | VARCHAR(200) NOT NULL | Asunto del ticket | | mensaje | TEXT NOT NULL | Descripción del problema | | status | ENUM('abierto','en_progreso','cerrado') DEFAULT 'abierto' | Estado | | prioridad | ENUM('baja','media','alta','critica') DEFAULT 'media' | Prioridad | | assigned_to | INT FK → users.id | Agente asignado | | created_at | TIMESTAMP DEFAULT CURRENT_TIMESTAMP | Fecha de creación | | updated_at | TIMESTAMP ON UPDATE | Última actualización | ### Tabla: `ticket_respuestas` | Campo | Tipo | Descripción | |-----------|-----------------------------|------------------------| | id | INT AUTO_INCREMENT PK | ID único | | ticket_id | INT NOT NULL FK → tickets.id| Ticket relacionado | | user_id | INT NOT NULL FK → users.id | Quién respondió | | mensaje | TEXT NOT NULL | Contenido respuesta | | created_at| TIMESTAMP DEFAULT CURRENT_TIMESTAMP | Fecha de respuesta | ## Roles y Permisos | Rol | Descripción | |--------|------------------------------------------| | admin | Acceso total: gestiona usuarios, deptos, tickets | | agent | Gestiona tickets asignados, responde, cambia estado | | client | Crea tickets, ve sus propios tickets, responde | ## Tecnologías - **Backend**: Node.js + Express 5 - **Motor de plantillas**: EJS - **Base de Datos**: MariaDB/MySQL (mysql2) - **Autenticación**: express-session + bcryptjs - **Frontend**: Bootstrap 5 + Font Awesome - **Middleware**: morgan, connect-flash, express-fileupload ## Scripts ```bash npm start # Iniciar servidor producción npm run dev # Iniciar con nodemon (auto-reload) node config/setup.js # Inicializar BD (crear tablas + datos seed) ``` ## Credenciales por defecto - **Admin**: admin@helpdesk.com / 123456