66 Commits
Author SHA1 Message Date
Lizandro Guarnizo 62e48bd372 fix: point to Coolify-managed Postgres wkuvmdsy39relyhnugk87eqb
ci-337446 / run (push) Has been cancelled
ci-377635 / run (push) Has been cancelled
Build & Push Docker images / build-api (push) Has been cancelled
Build & Push Docker images / build-web (push) Has been cancelled
2026-07-12 17:24:15 -05:00
Lizandro Guarnizo 136f356ab5 fix: hardcode DATABASE_URL to bypass Coolify injection
ci-337446 / run (push) Has been cancelled
ci-377635 / run (push) Has been cancelled
Build & Push Docker images / build-api (push) Has been cancelled
Build & Push Docker images / build-web (push) Has been cancelled
2026-07-12 17:20:07 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d17407a302 fix: landing page completamente responsive en moracourier.com
ci-337446 / run (push) Has been cancelled
ci-377635 / run (push) Has been cancelled
Build & Push Docker images / build-api (push) Has been cancelled
Build & Push Docker images / build-web (push) Has been cancelled
- Reemplaza todos los inline styles con clases CSS responsivas
- Agrega 230 líneas de CSS landing-específico con breakpoints 768px y 1024px
- Grids adaptivos: 4-col→2-col→1-col, 3-col→2-col→1-col, 2-col→1-col
- Nuevo componente LandingNavbar (client) con hamburger funcional y menú móvil
- Hero, Servicios, Módulos, Tracking, Calculadora, Roles y Empresas responsivos
- Agrega sección "Cómo funciona" (4 pasos) que faltaba
- Agrega sección CTA final antes del footer
- Footer con links de navegación completos

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 12:21:42 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 492dc5436c fix: auditoría UI/UX landing page y consistencia entre subpáginas
- Agrega menú móvil funcional con panel deslizable y animación hamburger
- Corrige hero stat "150 N / Day St" confuso por "$3.50/lb (flete)"
- Arregla bug CSS `flex-wrap: gap` inválido en footer-bottom
- Corrige links "Carga Pesada" en nav y footer para apuntar a #cotizacion
- Agrega acción al botón de pre-alerta con validación
- Limpia address del footer (eliminado placeholder "Suite EC-" vacío)
- Agrega favicon, OG tags y theme-color a las 4 páginas
- Consolida event listeners para evitar conflictos móvil/WhatsApp

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 11:35:15 -05:00
Lizandro Guarnizo 696ff9fa51 fix: add coolify external network to api/web for internal DB access 2026-06-25 20:55:47 -05:00
Lizandro Guarnizo 2985433ecb fix: add HOSTNAME=0.0.0.0 and fix web health check 2026-06-25 16:33:36 -05:00
Lizandro Guarnizo e76d7b5027 fix: use 127.0.0.1 instead of localhost in health check 2026-06-25 16:27:40 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 40e378bff8 fix: create uploads dir with correct ownership before dropping to app user
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 00:35:31 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d9062ce754 fix: copy .prisma to correct pnpm versioned path in Docker runner stage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 00:32:19 -05:00
Lizandro Guarnizo 2587826fa6 fix(api): copy @prisma/client package from pnpm store to deploy 2026-06-23 00:22:44 -05:00
Lizandro Guarnizo b7db0d6741 fix(api): pnpm deploy + copy prisma generated client 2026-06-23 00:13:14 -05:00
Lizandro Guarnizo 34b4c2d6d2 fix(api): flatten pnpm symlinks with cp -rL for docker COPY 2026-06-23 00:05:29 -05:00
Lizandro Guarnizo b875fe2af4 fix(api): copy full node_modules instead of pnpm deploy to preserve prisma client 2026-06-23 00:02:03 -05:00
Lizandro Guarnizo 17302ee746 fix(api): copy prisma generated files from builder to runner 2026-06-22 23:59:54 -05:00
Lizandro Guarnizo 0ec04560d4 fix(api): Dockerfile explícito para dist+node_modules; quitar image: para forzar build en Coolify 2026-06-18 23:11:01 -05:00
Lizandro Guarnizo 6aa6897f4d fix(api): usar pnpm deploy para resolver symlinks rotos de pnpm en runner 2026-06-18 23:06:47 -05:00
Lizandro Guarnizo 596dc18e82 fix(api): quitar migrate del startup para desacoplar deploy de BD 2026-06-18 22:59:50 -05:00
Lizandro Guarnizo 71cd021e60 update 2026-06-18 21:40:52 -05:00
Lizandro Guarnizo b63447af8d chore: remove .npmrc 2026-06-18 21:39:23 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b4cbb672e0 fix(coolify): quitar ports y red custom para evitar conflictos en despliegue
Coolify usa Traefik como proxy — los ports fijos causan conflicto si el
puerto ya está ocupado. Se elimina también moraworld-network (nombre fijo
choca con redes de deploys anteriores); Coolify gestiona su propia red.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 21:39:23 -05:00
Lizandro Guarnizo 5f488f698c update 2026-06-18 18:16:07 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 db19f3e1ca fix(security): rate limiting, forbidNonWhitelisted, Prisma migrations en startup y CI para GHCR
- ThrottlerGuard global: 20 req/min por IP en todos los endpoints
- forbidNonWhitelisted: true en ValidationPipe
- Dockerfile API: prisma migrate deploy antes de arrancar el proceso
- coolify-compose: depends_on api (service_healthy) en web
- GitHub Actions: build y push de imágenes api/web a GHCR en cada push a main

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 17:06:35 -05:00
Lizandro Guarnizo 1b49e3fc0e ci: copiar packages/database al runner (no linkeado en hoisted) 2026-06-09 22:03:24 -05:00
Lizandro Guarnizo 83133eef17 ci: single-stage builder + hoisted (elimina deps stage, muy problematico) 2026-06-09 22:00:11 -05:00
Lizandro Guarnizo ed24880944 ci: --force en pnpm install para evitar confirmacion interactiva 2026-06-09 21:58:40 -05:00
Lizandro Guarnizo 6c2c993ea7 ci: regenerar lockfile en builder (rm + pnpm install --no-frozen) 2026-06-09 21:56:12 -05:00
Lizandro Guarnizo 333c1aba58 ci: --no-frozen-lockfile explicito (Coolify corre con CI=true) 2026-06-09 21:54:44 -05:00
Lizandro Guarnizo b0d22d4c15 ci: pnpm install sin frozen-lockfile en builder (lockfile actualizado con workspace completo) 2026-06-09 21:52:25 -05:00
Lizandro Guarnizo 7cd5138ab9 ci: node-linker=hoisted para compatibilidad con Docker COPY 2026-06-09 21:49:45 -05:00
Lizandro Guarnizo e5e22e4f58 ci: cambiar host port web 3000->3002 (otro servicio usa 3000) 2026-06-09 21:47:53 -05:00
Lizandro Guarnizo e4abd806bb ci: Dockerfiles funcionales - ambos builds exitosos en servidor 2026-06-09 21:38:24 -05:00
Lizandro Guarnizo a6b9edd256 ci: pnpm install sin --offline (descarga solo faltante del store) 2026-06-09 21:33:05 -05:00
Lizandro Guarnizo 4ef190c7a2 ci: pnpm install --offline en builder para recrear symlinks de workspace 2026-06-09 21:32:18 -05:00
Lizandro Guarnizo dd62a048d2 ci: quitar prisma generate del web (next no lo necesita) 2026-06-09 21:30:47 -05:00
Lizandro Guarnizo 8c6fd24ed8 ci: usar npx prisma en vez de pnpm exec (prisma no esta en root node_modules) 2026-06-09 21:30:05 -05:00
Lizandro Guarnizo 941ba09978 debug: check prisma binary location 2026-06-09 21:29:12 -05:00
Lizandro Guarnizo dca9e7a879 ci: corregir ruta de prisma generate - ejecutar desde packages/database 2026-06-09 21:28:33 -05:00
Lizandro Guarnizo 6425976918 ci: usar pnpm exec prisma en vez de global (evita auto-install) 2026-06-09 21:27:51 -05:00
Lizandro Guarnizo 60350e4343 ci: quitar database/dist del web (no existe en deps) 2026-06-09 21:27:03 -05:00
Lizandro Guarnizo b2d9d06cbe ci: copiar packages/database/dist desde deps (excluido por .dockerignore) 2026-06-09 21:21:09 -05:00
Lizandro Guarnizo 9fe1d29e75 ci: volver a enfoque multi-stage estandar con prisma global en builder 2026-06-09 21:18:30 -05:00
Lizandro Guarnizo 696b29df10 ci: .prisma esta en node_modules raiz (pnpm hoisted) 2026-06-09 21:12:48 -05:00
Lizandro Guarnizo 37e39db85d ci: COPY . . antes que deps para no pisar prisma generado 2026-06-09 21:10:22 -05:00
Lizandro Guarnizo 675f3bf0e5 ci: copiar packages/database completo en deps y generar prisma ahi 2026-06-09 21:06:01 -05:00
Lizandro Guarnizo d3cab7539e ci: debug web — ls schema, which prisma, prisma version 2026-06-09 20:58:40 -05:00
Lizandro Guarnizo 8459ecc33d ci: fix prisma generate — instalar prisma global, limpiar dockerignore 2026-06-09 20:57:13 -05:00
Lizandro Guarnizo 52f5f66b54 ci: debug prisma generate — show actual error in logs 2026-06-09 20:55:05 -05:00
Lizandro Guarnizo dfc5e5233a ci: set DATABASE_URL env in builder for prisma generate 2026-06-09 20:47:21 -05:00
Lizandro Guarnizo 30cfa67bab ci: web Dockerfile copia database package.json y genera Prisma client 2026-06-09 20:35:31 -05:00
Lizandro Guarnizo fb3b62ea44 ci: quita depends_on de api — redis/postgres solo en profile storage 2026-06-09 20:32:00 -05:00
Lizandro Guarnizo 933dd75ca3 ci: docker-compose.yml usa profiles para BD/Redis/MinIO — Coolify usa default (solo api+web) 2026-06-09 20:28:27 -05:00
Lizandro Guarnizo 8f2de37c0d feat(storage): auto-create S3 bucket on module init 2026-06-04 21:33:54 -05:00
Lizandro Guarnizo fff5e198b7 ci: Coolify deployment config — docker-compose, env example, docs, dockerignore 2026-06-04 20:55:38 -05:00
Lizandro Guarnizo 84c1fdec54 feat: C-8/C-1/C-2/C-3/C-4/C-6/M-1/M-5/M-6 — WebSocket gateway, SENAE real, SP-API, Twilio SMS, WhatsApp Business, soporte portal, HMAC audit, reportes CSV 2026-06-01 21:28:42 -05:00
Lizandro Guarnizo a5842278fb fix: C-7 webhook tenant lookup, C-5 full tax calc §15, M-2/M-3/M-4/M-8/L-7/L-8/L-9 gap fixes 2026-06-01 21:10:43 -05:00
Lizandro Guarnizo a047a8b032 feat: StorageService S3/MinIO, POST /users, invoice upload, portal dashboard §08 statuses + notifications 2026-06-01 20:55:30 -05:00
Lizandro Guarnizo 98ab5a309c feat: Stripe Checkout, Zeptomail, pre-alert linking, perfil 3-tab, carga-pesada landing
- payments: real Stripe Checkout Session (redirect flow), confirmBySession, webhook handler
- notifications: Zeptomail REST email, wa.me WhatsApp links, IntegrationsService injection
- auth: changePassword, updateProfile, disableMfa (TOTP-verified) endpoints
- packages: tryLinkPreAlert() auto-links on create (non-blocking)
- integrations: catalog updated (zeptomail, stripe_webhook_secret; removed sendgrid/whatsapp-api)
- web/portal/perfil: 3-tab layout (datos / contraseña / MFA)
- web/portal/pago: Stripe redirect + ?success=1&session_id= callback, cancelled banner
- web/admin/b2b: fix enum values (EN_COTIZACION, ACEPTADO)
- web/carga-pesada: rich marketing landing (FCL/LCL, 7-step process, sectors, INEN callout)
- tests: fix payments.service.spec (IntegrationsService+ConfigService mocks)
- tests: fix notifications.service.spec (IntegrationsService mock, phone in mockUser)
- all 104 tests passing, API + web builds clean
2026-06-01 20:24:35 -05:00
Lizandro Guarnizo b2f03e654f feat: timestamp component (§19), admin B2B page (§13)
## §19 Zona horaria
- New _components/timestamp.tsx: Intl.DateTimeFormat-based, auto-detects
  timezone from user role in localStorage
  · OPERADOR_BODEGA → America/New_York (EST/EDT)
  · All others → America/Guayaquil (ECT)
- Integrated in portal/mis-paquetes (list dates + status history)
- Integrated in portal/pago (paidAt timestamp)
- Integrated in admin/auditoria (replaces hardcoded toLocaleString)

## §13 B2B Admin page (/admin/b2b)
- Full admin UI for B2B import requests
- KPIs: total, pendientes, cotizados, aprobados, valor total cotizaciones
- Table with search + status filter
- Gestionar modal: change status, enter quotation amount + notes
- Uses api.b2b.list() + api.b2b.updateStatus()
- Added B2B link to admin sidebar nav

Build: clean (Next.js, no TS errors)
2026-06-01 18:35:46 -05:00
Lizandro Guarnizo 7682b11dff feat: consolidations, aduanero portal, payments admin, bug fixes, tests
## Bugs corregidos
- bodega/page.tsx: estados correctos §08 (RECIBIDO_BODEGA, EN_VERIFICACION, EN_TRANSITO_ECUADOR)
- admin/page.tsx: carga paquetes reales, alertas de incidencias/B2B/cobros pendientes, barras de estado

## Nuevos portales y páginas
- /aduanero/ — portal propio para AGENTE_ADUANERO (layout + dashboard §11 + declaraciones DSI)
- /aduanero/declaraciones — cola de declaraciones con formulario DSI y detección DAI automática
- /admin/pagos — gestión de cobros: KPIs, filtros por estado, tabla con breakdown
- /portal/consolidacion — cliente crea/gestiona consolidaciones §21
- /bodega/consolidacion — operador cierra y despacha consolidaciones (→ EN_TRANSITO_ECUADOR)

## API nueva (ConsolidationsModule)
- GET/POST /consolidations
- GET /consolidations/:id
- POST /consolidations/:id/packages
- DELETE /consolidations/:id/packages/:packageId
- POST /consolidations/:id/close
- POST /consolidations/:id/dispatch (→ actualiza paquetes a EN_TRANSITO_ECUADOR)

## Prisma schema v0.5
- ConsolidationStatus enum (ABIERTA, CERRADA, DESPACHADA, ENTREGADA, CANCELADA)
- Consolidation model con totales calculados (totalWeightLb, totalValue)
- ConsolidationPackage (tabla intermedia, un paquete = una consolidación)
- db push aplicado a remote DB (46.202.93.92)

## Navegación
- Login: AGENTE_ADUANERO → /aduanero (ya no /bodega)
- Bodega nav: añadido Consolidaciones
- Portal nav: añadido Consolidar
- Admin nav: añadido Cobros

## Tests (104 total, 8 suites)
- payments.service.spec.ts: 16 tests (createIntent, confirm, list, findByPackageForUser)
- notifications.service.spec.ts: 12 tests (getTemplates, updateTemplate, seedDefaultTemplates, notifyStatusChange, findByUser)

## Legal §21
- Registro: aviso LOPDP Ecuador + normativa NJ en footer del formulario
- Landing footer: aviso detallado de protección de datos LOPDP/NJ

## api.ts: consolidations.* client methods
2026-06-01 18:29:26 -05:00
Lizandro Guarnizo 5565eef554 feat: payments module, notification templates, WA float, route fixes
- Add PaymentsModule: POST /payments/intent, POST /:id/confirm, GET /payments, GET /payments/package/:id, GET /payments/track/:trackingId
- Add Payment model to Prisma schema (PaymentStatus enum, Payment table)
- Add NotificationTemplate model + NotificationsController (GET/PUT /notification-templates, POST /notification-templates/seed)
- Update NotificationsService: DB-backed templates with variable interpolation {{trackingId}} {{firstName}} {{status}} {{suiteCode}}
- Fix /bodega/paquetes: replace 11 wrong status strings with correct §08 enum values
- Fix /admin/reportes: replace EN_CAMINO_A_ECUADOR with correct §08 statuses, rewrite report page with proper KPIs and bar charts
- Fix /portal/mis-paquetes: correct §08 statuses, add 'Pagar envío' button for VERIFICADO/DECLARACION_ADUANERA packages
- Add WhatsApp float component (_components/whatsapp-float.tsx, 2 contacts: NJ ops + Cuenca aduana)
- Add /casillero/calculadora and /casillero/registro redirects (§20)
- Add /portal/pago payment page with cost breakdown (§09/§14/§15)
- Add /admin/notificaciones page: view/edit/toggle templates per event×channel
- Admin nav: add Notificaciones link
- api.ts: add notificationTemplates.* and payments.* client methods
- schema.prisma v0.4: PaymentStatus enum, Payment model, NotificationTemplate model
- db push applied to remote DB (46.202.93.92)
- All builds pass (API nest build + Next.js build)
2026-06-01 17:09:05 -05:00
Lizandro Guarnizo b2b292c50a feat: add Warehouses + Integrations modules, /admin/configuracion page
- Schema v0.3: Warehouse + Integration models (db push applied)
- WarehousesModule: CRUD, set-default, multi-warehouse support
- IntegrationsModule: 26 keys across 7 groups (payment, notifications,
  customs, courier, marketplace, compliance, warehouse)
- AuthService: suite address pulled from default Warehouse in DB (env fallback)
- AuthModule: imports WarehousesModule
- Seed: creates default warehouse from WAREHOUSE_ADDRESS_* env vars
- Web: /admin/configuracion page (3 tabs: Bodegas, Integraciones, Estado APIs)
- Web: admin layout adds Configuracion nav link
- api.ts: warehouses + integrations client methods
2026-06-01 16:49:19 -05:00
Lizandro Guarnizo 03b18e7a84 fix: add multer as explicit runtime dep (required by packages.controller) 2026-06-01 16:13:12 -05:00
Lizandro Guarnizo 6e90f06f6d feat: Fase 2 — SENAE DSI, verificación bodega, fotos, notificaciones, auditoría, tarifas CRUD, páginas faltantes
API:
- PackagesService: verifyPackage (discrepancia >10%), addPhotos (multer disk), generateSenaeDeclaration (DSI stub)
- PATCH /packages/:id/verify — peso real + dimensiones + detección automática de discrepancia
- POST  /packages/:id/photos — upload multipart fotos (hasta 10, 10 MB c/u)
- POST  /packages/:id/senae/declare — genera DSI, N° autorización SENAE, cambia estado DECLARACION_ADUANERA
- GET   /packages/pending-declaration — cola de paquetes VERIFICADO para agente aduanero
- AuditLogModule: GET /audit-logs con filtros (acción, recurso, fechas, paginación)
- NotificationsModule: notifyStatusChange → crea registros EMAIL/WHATSAPP/PUSH en DB (stub dispatch)
- TariffsModule: GET/PUT /tariffs — configuración de tarifas por tenant (pricePerLb, IVA, FODINFA…)
- ProductsModule: POST /products/scan — stub extracción de producto desde URL Amazon/eBay/Walmart
- StorageModule: saveFile/deleteFile con disco local (S3-ready)
- main.ts: NestExpressApplication + useStaticAssets('/uploads')
- Dirección bodega: de hardcoded a env vars (WAREHOUSE_ADDRESS_*)

Web:
- /bodega/verificacion — formulario real: peso real, dims, fotos, detección discrepancia, notificación
- /bodega/despacho — lista paquetes DECLARACION_ADUANERA → despacha a EN_TRANSITO_ECUADOR
- /bodega/declaraciones — cola SENAE: auto-detecta categoría 4×4, genera DSI por paquete
- /bodega/layout — agrega enlace Declaraciones SENAE, corrige ALLOWED roles
- /admin/tarifas — CRUD real: edita pricePerLb, IVA, FODINFA, límites 4×4; preview fórmulas
- /admin/auditoria — tabla paginada con filtros desde GET /audit-logs
- /portal/pre-alerta — tabs URL-scan / Manual, upload de factura, campos correctos
- /casillero/como-usar — timeline 9 pasos con dirección NJ y CTA
- /carga-pesada/como-funciona — flujo B2B 5 pasos, servicios incluidos
- /carga-pesada/inen — 6 categorías reguladas, callout de advertencia, proceso de asistencia
- api.ts: verify, uploadPhotos, senaeDeclare, pendingDeclaration, tariffs, auditLogs, products.scan
2026-06-01 10:27:52 -05:00
Lizandro Guarnizo 4872053fd1 feat: Fase 1 — Auth JWT+MFA, portales CRUD, UI completa
API:
- AuthModule: register, login, refresh, logout, MFA/TOTP setup+verify
- JwtStrategy + JwtAuthGuard + RolesGuard + CurrentUser decorator
- PackagesModule: CRUD paquetes + historial de estados
- PreAlertsModule: pre-alertas por usuario
- UsersModule: gestión de usuarios + roles + activación
- B2BModule: solicitudes de carga pesada/cotización
- ValidationPipe global + CORS configurado

Web (Next.js 15):
- globals.css completo (design system + utility classes)
- Layout raíz con WhatsApp flotante
- /login + /registro funcionales con JWT y redirección por rol
- /portal: dashboard, mi-casillero, mis-paquetes, pre-alerta, calculadora, perfil
- /admin: dashboard, usuarios (gestión roles/activación), tarifas, reportes, auditoría
- /bodega: dashboard, paquetes (crear+actualizar estado), verificación, despacho
- /tracking: tracking real con progreso visual + historial
- /calculadora: calculadora interactiva real (API SENAE §15)
- /como-funciona, /tarifas, /quienes-somos, /casillero
- /carga-pesada + /carga-pesada/cotizacion (formulario B2B)
- lib/api.ts: cliente HTTP con auto-refresh de token

Roles sincronizados con schema: SUPER_ADMIN, ADMIN_EMPRESA,
OPERADOR_BODEGA, AGENTE_ADUANERO, CLIENTE, SOPORTE
2026-06-01 09:42:38 -05:00
Lizandro Guarnizo 93db76897d feat: audit & sync with documentacion.html v1.1 — schema, tests, modules, web
Schema (packages/database/prisma/schema.prisma):
- Add SenaeCategory, B2BRequestStatus, NotificationChannel enums
- Add Package fields: lengthCm, widthCm, heightCm, hasDiscrepancy, photos[],
  senaeCategory, senaeAuthNumber, senaeDeclarationId
- Add userId field to PreAlert
- Add RefreshToken model (JWT auth — Fase 1)
- Add Tariff model (configurable rates: pricePerLb, insurancePct, etc.)
- Add B2BRequest model (heavy cargo imports — doc §13)
- Add Notification model (multi-channel: email, whatsapp, sms, push — doc §16)
- Add userAgent to AuditLog

API (apps/api):
- Add CalculatorModule: calculates SENAE cost breakdown (flete, seguro,
  FODINFA, arancel, IVA) per formulas in doc §15
- Add TrackingModule: public GET /api/tracking/:id endpoint (doc §07)
- Register both modules in AppModule
- Add Jest config + test scripts (test, test:watch, test:cov, test:ci)

Tests (80 tests, 97.45% coverage):
- calculator.util.spec.ts: 35 tests — SENAE formulas, volumetric weight,
  4x4 regime, tariff rates, error validation, breakdown
- tracking-id.util.spec.ts: 13 tests — format, uniqueness, validation
- suite-code.util.spec.ts: 13 tests — generation, parsing, address builder
- health.controller.spec.ts: 5 tests — ok/degraded/timestamp
- calculator.spec.ts: 8 tests — controller + service unit tests
- tracking.controller.spec.ts: 9 tests — public search, 404, no sensitive data

Web (apps/web):
- page.tsx: Full landing page matching documentation (Hero, Services,
  8 Modules, Tracking states, SENAE calculator preview, 6 Roles, Companies)
- /calculadora: SENAE categories + API usage guide
- /tracking: Tracking ID format + 11 states reference

Seed (packages/database/prisma/seed.ts):
- Creates all 6 roles (SUPER_ADMIN, ADMIN_EMPRESA, OPERADOR_BODEGA,
  AGENTE_ADUANERO, CLIENTE, SOPORTE)
- Assigns Suite EC-00001 to demo client
- Creates demo Package EC-20260506-000001 with status history
- Creates demo PreAlert and B2BRequest

.env.example: Added all 9 integrations from doc §18:
  Amazon SP-API, SENAE WebService, Stripe/PayPhone, WhatsApp Business API,
  SendGrid/SES, SMS/Twilio, FedEx/DHL/UPS couriers, S3/MinIO, Sentry

migration.sql: Updated to reflect all new models and fields
turbo.json + package.json: Added test, test:cov, test:ci tasks + db:seed script
2026-06-01 08:25:01 -05:00
Lizandro Guarnizo 094ea9cf81 feat: initial commit - Moraworld Imports project 2026-06-01 08:06:40 -05:00