Sistema completo para administración de operaciones de envío y carga, incluyendo gestión de clientes, generación de facturas, seguimiento de paquetes y reportes financieros.
- Framework: SvelteKit 5 con TypeScript (modo estricto)
- Base de datos: MySQL con Drizzle ORM
- Autenticación: Sistema dual (sesiones para admin + magic links para clientes)
- Validación: Superforms + Zod
- UI: Tailwind CSS + bits-ui
- Generación PDF: jsPDF + jspdf-autotable
- Almacenamiento: AWS S3 SDK (Backblaze B2)
- Email: Resend API
- Runtime: Bun
- Bun instalado
- Docker (para MySQL)
- Cuenta de Backblaze B2 (almacenamiento)
- API key de Resend (emails)
-
Clonar el repositorio
git clone <repository-url> cd cargo
-
Instalar dependencias
bun install
-
Configurar variables de entorno
cp .env.example .env
Editar
.envcon tus credenciales:DATABASE_URL- Conexión MySQL (debe incluirtimezone=Z)PRIVATE_RESEND_API_KEY- API key de ResendBLACKBLAZE_KEY_ID- ID de Backblaze B2PRIVATE_BLACKBLAZE_API_KEY- Key de Backblaze B2B2_BUCKET_NAME- Nombre del bucketAPI_BASE_URL- URL del servicio externo de emailsAPI_KEY- Key del servicio externo de emails
-
Configurar base de datos
# Iniciar contenedor MySQL bun run db:start # Las migraciones se ejecutan automáticamente en postinstall # O ejecutar manualmente: bun run db:migrate
# Iniciar servidor de desarrollo
bun run dev
# Verificación de tipos
bun run check
bun run check:watchbun run db:start # Iniciar contenedor MySQL
bun run db:push # Aplicar cambios de schema
bun run db:migrate # Ejecutar migraciones
bun run db:generate # Generar nueva migración
bun run db:studio # Abrir Drizzle Studio UI# Build de producción
bun run build
# Preview del build
bun run previewEl sistema soporta múltiples compañías con jerarquía de tres niveles:
- Compañías - Organización de nivel superior
- Sucursales - Ubicaciones físicas dentro de una compañía
- Usuarios - Empleados asignados a sucursales específicas
1. Autenticación de Administradores
- Para empleados (tabla
users) - Basado en sesiones con tokens seguros
- Niveles: EMPLEADO, SECRETARIA, ADMIN
2. Autenticación de Clientes
- Para clientes (tabla
usuarios) - Magic links sin contraseña
- Tipos: REGULAR, ESPECIAL, CORPORATIVO
- Usuarios (Clientes): Clientes que reciben paquetes
- Facturas: Facturas con múltiples paquetes (trackings)
- Trackings: Paquetes individuales dentro de facturas
- Reportes: Reportes financieros agregados
Portal de Clientes:
/ - Dashboard del cliente
/login - Login con magic link
/packages - Lista de paquetes
/invoices - Facturas del cliente
/profile - Perfil y logout
Portal de Administración:
/admin - Dashboard administrativo
/admin/login - Login de empleados
/admin/clientes - Gestión de clientes
/admin/facturas - Gestión de facturas
/admin/trackings - Seguimiento de paquetes
/admin/reportes - Reportes financieros
/admin/settings - Configuración
API:
/api/auth/* - Autenticación de clientes
/api/* - Endpoints JSON
CRÍTICO: La producción usa MariaDB (no MySQL 8.0+)
- NUNCA usar la cláusula
withde Drizzle (genera LATERAL joins no soportados) - SIEMPRE usar
.select()con.leftJoin()o.innerJoin()manualmente
- Zona horaria UTC aplicada doble veces (parámetro de conexión + SET por conexión)
- Crítico para operaciones multi-zona horaria
- Sesiones httpOnly, sameSite: lax
- Tokens criptográficamente seguros (32 bytes)
- Magic links de un solo uso con expiración de 15 minutos
- Soft delete con flag
archivado(nunca borrar registros) - Middleware de suspensión de compañías
- Protección contra bots/spam
- Idioma: Interfaz y comentarios en español, código en inglés
- TypeScript Estricto: Tipos inferidos de Drizzle
- Patrón de Servicios: Servicios singleton, no repositorios
- Manejo de Errores: Wrapper
apiHandler()para APIs - Validación: Schemas Zod en cliente y servidor
- Archivado: Soft delete con
archivado = true - Svelte 5 Runes: Usar
$state,$derived,$props,$effect
- bits-ui: Componentes headless
- Tailwind CSS: Estilos utility-first
- Mobile-first: Diseño responsive
- Portal de Clientes: Navegación inferior móvil
Para guías detalladas de desarrollo, consultar:
src/lib/server/db/schema.ts- Schema de base de datos.env.example- Variables de entorno requeridas
Este proyecto usa Bun como gestor de paquetes. No uses npm, pnpm o yarn.
# Ejemplo de flujo de trabajo
bun run db:start # 1. Iniciar MySQL
bun run dev # 2. Iniciar desarrollo
bun run check:watch # 3. Verificación de tipos en vivo
bun run db:studio # 4. Explorar DB (opcional)Propietario - Todos los derechos reservados