Sistema PWA de gestión de tickets de soporte técnico e inventario de activos TI
para empresas con múltiples sucursales.
TicketFlow TI es un ERP interno de soporte técnico. Centraliza el ciclo completo de atención: los encargados de tienda crean tickets con evidencia fotográfica, los técnicos los atienden desde su bandeja, y la administración controla inventario, personal y sucursales desde un panel central. Funciona como PWA instalable con modo offline: los técnicos pueden escanear activos y registrar movimientos sin conexión, y todo se sincroniza automáticamente al recuperar la red.
- Creación de tickets con imágenes adjuntas (Cloudinary)
- Asignación a técnicos, estados, prioridades y categorías técnicas
- Comentarios públicos e internos en cada ticket
- Vista de detalle adaptada a cada rol
- Registro de activos por sucursal y usuario asignado
- Catálogo de artículos, tipos y proveedores externos
- Movimientos de inventario: entradas, salidas y reparaciones
- Bitácora de movimientos con categorías
- Escáner de códigos de barras para números de serie (cámara del dispositivo)
- Papelera con restauración de registros eliminados
- Instalable en móvil y escritorio (
manifest.json+ service worker) - CRUD offline de activos y bitácora (IndexedDB vía Dexie)
- Sincronización automática al recuperar la conexión
- Página de respaldo para arranque en frío sin internet
- JWT en cookies
HttpOnlyconSameSite: strict - Login con username o email
- Hashing de contraseñas con bcrypt
- Versionamiento de tokens: cambiar la contraseña invalida todas las sesiones activas
- Recuperación de contraseña por correo (Gmail SMTP con App Password)
- Protección de rutas por rol en
hooks.server.ts
| Rol | Ruta | Funciones |
|---|---|---|
| ADMIN | /admin |
Gestión completa: usuarios, sucursales, tickets, activos, catálogo, bitácora, proyectos, configuración |
| TECH (Técnico) | /tecnico |
Bandeja de tickets asignados, diagnóstico, comentarios y perfil |
| STORE_MANAGER (Encargado) | /encargado |
Crear tickets con adjuntos y hacer seguimiento de sus solicitudes |
| Capa | Tecnología |
|---|---|
| Framework | SvelteKit 2 (Svelte 5 con runes) |
| Lenguaje | TypeScript |
| Base de datos | PostgreSQL (Supabase en producción) |
| ORM | Drizzle ORM (drizzle-kit push) |
| Estilos | Tailwind CSS v4 con tokens @theme |
| Autenticación | JWT propio (jsonwebtoken) + bcryptjs |
| Correo | Nodemailer (Gmail SMTP) |
| Imágenes | Cloudinary |
| Offline | IndexedDB (Dexie) + service worker |
| Escáner | html5-qrcode |
| Validación | Zod |
| Iconos | lucide-svelte |
| Despliegue | Vercel |
| Gestor de paquetes | pnpm |
Clean Architecture con patrón Repository → Service → Action:
- Repository — solo consultas SQL (Drizzle), sin lógica de negocio.
- Service — lógica de negocio (credenciales, hashing, tokens, correo).
- Action (
+page.server.ts) — controladores de SvelteKit que orquestan servicios.
src/
├── lib/
│ ├── server/
│ │ ├── db/ # Esquema Drizzle, conexión y seed
│ │ ├── repositories/ # Capa de acceso a datos
│ │ ├── services/ # Lógica de negocio
│ │ └── validation/ # Esquemas de validación (Zod)
│ └── assets/ # Logo y recursos gráficos
├── routes/
│ ├── admin/ # Panel administrativo (14 módulos)
│ ├── tecnico/ # Bandeja del técnico
│ ├── encargado/ # Vista del encargado de tienda
│ ├── api/ # Endpoints (tickets, sync offline)
│ ├── offline/ # Página de respaldo PWA
│ └── forgot-password/ # Recuperación de contraseña
└── hooks.server.ts # Middleware JWT + protección de rutas
- Node.js 20+
- pnpm
- PostgreSQL en ejecución
- (Opcional) Cuenta de Cloudinary y Gmail con App Password para adjuntos y correos
# 1. Clonar e instalar dependencias
git clone https://github.com/ashcroft08/TicketFlow-TI.git
cd TicketFlow-TI
pnpm install
# 2. Configurar variables de entorno
cp .env.example .env
# Editar .env con tus credenciales reales
# 3. Sincronizar el esquema de la base de datos
pnpm db:push
# 4. Sembrar datos iniciales (crea el usuario administrador)
pnpm db:seed
# 5. Levantar el servidor de desarrollo
pnpm dev| Variable | Requerida | Descripción |
|---|---|---|
DATABASE_URL |
✅ | Conexión a PostgreSQL local |
ORIGIN |
✅ | URL base (protección CSRF de SvelteKit) |
JWT_SECRET |
✅ | Secreto de firma de tokens (32 bytes en Base64) |
ADMIN_USER / ADMIN_PASS / ADMIN_EMAIL |
✅ | Credenciales del admin inicial (seed) |
DATABASE_URL_PROD |
— | Pooler de Supabase (solo producción) |
GMAIL_USER / GMAIL_APP_PASSWORD |
— | Correo saliente para recuperación de contraseña |
CLOUDINARY_CLOUD_NAME / CLOUDINARY_API_KEY / CLOUDINARY_API_SECRET |
— | Almacenamiento de imágenes adjuntas |
| Comando | Descripción |
|---|---|
pnpm dev |
Servidor de desarrollo |
pnpm build |
Build de producción |
pnpm preview |
Previsualizar el build |
pnpm check |
Verificación de tipos (svelte-check) |
pnpm lint |
Prettier + ESLint |
pnpm format |
Formatear el código |
pnpm db:push |
Sincronizar esquema con la base de datos |
pnpm db:generate |
Generar migraciones de Drizzle |
pnpm db:migrate |
Aplicar migraciones |
pnpm db:studio |
Explorador visual de la base de datos |
pnpm db:seed |
Sembrar datos iniciales |
pnpm db:pull |
Volcar el esquema desde la base de datos |
- ✅ Autenticación completa (login, recuperación de contraseña, invalidación de sesiones)
- ✅ Dashboards por rol: administrador, técnico y encargado
- ✅ Gestión de tickets con comentarios y adjuntos
- ✅ Inventario de activos con escáner de códigos de barras
- ✅ Bitácora de movimientos de inventario
- ✅ PWA con CRUD offline y sincronización automática
- ✅ Desplegado en producción en Vercel