Lizandro Guarnizo and Claude 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 Guarnizo and Claude 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 Guarnizo and Claude 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 and Claude 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
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
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