feat(crm): refinamientos PDF 07-ago + Expediente (referencia única) #4

Closed
admin wants to merge 4 commits from feature/crm-refinamientos-solicitud-cotizacion into feature/crm-ajustes-sesion-doc2
Owner

Refinamientos de la sesión (PDF 07-ago) + Expediente (referencia única)

14 ajustes del PDF a Solicitudes/Cotizaciones/Cotizador/Prospecto + una referencia interna única (Expediente) que hila todo el trámite para localizar su historia de un jalón y conectarla con otros sistemas. Entregado por fases (4 commits).

Fase A — Solicitud

Fecha de solicitud automática (editable) · modalidad dependiente del transporte (marítimo→FCL/LCL/Ambas, aéreo→Aérea, terrestre→FTL/LTL, ferro/multimodal sin modalidad) · ciudad/puerto/aeropuerto dependientes del país (catálogos seed_locations, con respaldo de texto) · agente en destino filtrado a corresponsal/aduanal · volumen SIEMPRE en m³ (conversión por unidad) · P/Vol aéreo etiquetado con unidad · moneda junto al valor de la mercancía · lista con columna Cliente + filtro · "Válida hasta" en el form de tarifa.

Fase B — Cotizaciones / Cotizador

Lista de cotizaciones muestra la solicitud referenciada · Cotizador vinculado: ?service_request_id= prellena; ?quote_id= habilita "Agregar" que envía la opción como concepto(s); botón "Cotizador" en el detalle de la cotización.

Fase C — Prospecto

Se agrega "Medio de contacto preferido" (catálogo medio_contacto, conservando "Origen") · fix de visualización de documentos: endpoint proxy GET /uploads/download (transmite por backend, ya no expone minio:9000).

Fase D — Expediente (referencia única)

Tabla crm.cases con folio EXP2026-08-001; nace al crear la Oportunidad y se hereda vía case_id a Solicitud → Cotización → Operación → Factura (propagación en los create_*, avance de etapa que no retrocede). Endpoints GET /v1/crm/cases, /cases/{id}, /cases/by-ref/{ref} con timeline (para UI y otros sistemas). UI: Expedientes (lista + timeline vertical), chip "📁 Expediente" en los detalles, entrada en el sidebar. El consecutivo de folios no tiene tope (soporta > 10,000,000/mes).

Verificación

Migraciones reversibles (f0a1b2c3d4e5, d4e5f6a7b8c9) en PostgreSQL. 113 pruebas backend en verde (incl. test_cases, P/Vol, folios). svelte-check sin errores nuevos.

PENDIENTE DECISIÓN (documentado)

  • Expediente: solicitudes/cotizaciones sin oportunidad mintean expediente de respaldo (fallback). Integración externa (API/token) por definir.
  • Cotizador: ferroviario/multimodal no tienen modo de tarifario; AMBASmaritimo_fcl en el prellenado. Moneda de la opción vs. de la cotización no se reconcilia (se suma tal cual).
  • Ciudad guardada como código; seed de ubicaciones curado (extensible).

🤖 Generated with Claude Code

## Refinamientos de la sesión (PDF 07-ago) + Expediente (referencia única) 14 ajustes del PDF a Solicitudes/Cotizaciones/Cotizador/Prospecto + una **referencia interna única (Expediente)** que hila todo el trámite para localizar su historia de un jalón y conectarla con otros sistemas. Entregado por fases (4 commits). ### Fase A — Solicitud Fecha de solicitud automática (editable) · modalidad dependiente del transporte (marítimo→FCL/LCL/Ambas, aéreo→Aérea, terrestre→FTL/LTL, ferro/multimodal sin modalidad) · ciudad/puerto/aeropuerto dependientes del país (catálogos `seed_locations`, con respaldo de texto) · agente en destino filtrado a corresponsal/aduanal · volumen SIEMPRE en m³ (conversión por unidad) · P/Vol aéreo etiquetado con unidad · moneda junto al valor de la mercancía · lista con columna Cliente + filtro · "Válida hasta" en el form de tarifa. ### Fase B — Cotizaciones / Cotizador Lista de cotizaciones muestra la **solicitud referenciada** · **Cotizador vinculado**: `?service_request_id=` prellena; `?quote_id=` habilita "Agregar" que envía la opción como concepto(s); botón "Cotizador" en el detalle de la cotización. ### Fase C — Prospecto Se agrega **"Medio de contacto preferido"** (catálogo `medio_contacto`, conservando "Origen") · **fix** de visualización de documentos: endpoint **proxy** `GET /uploads/download` (transmite por backend, ya no expone `minio:9000`). ### Fase D — Expediente (referencia única) ⭐ Tabla **`crm.cases`** con folio **`EXP2026-08-001`**; **nace al crear la Oportunidad** y se hereda vía `case_id` a Solicitud → Cotización → Operación → Factura (propagación en los `create_*`, avance de etapa que no retrocede). Endpoints `GET /v1/crm/cases`, `/cases/{id}`, `/cases/by-ref/{ref}` con **timeline** (para UI y otros sistemas). UI: **Expedientes** (lista + timeline vertical), chip "📁 Expediente" en los detalles, entrada en el sidebar. El consecutivo de folios no tiene tope (soporta > 10,000,000/mes). ### Verificación Migraciones reversibles (`f0a1b2c3d4e5`, `d4e5f6a7b8c9`) en PostgreSQL. **113 pruebas backend en verde** (incl. `test_cases`, P/Vol, folios). `svelte-check` sin errores nuevos. ### PENDIENTE DECISIÓN (documentado) - Expediente: solicitudes/cotizaciones sin oportunidad mintean expediente de respaldo (fallback). Integración externa (API/token) por definir. - Cotizador: `ferroviario`/`multimodal` no tienen modo de tarifario; `AMBAS`→`maritimo_fcl` en el prellenado. Moneda de la opción vs. de la cotización no se reconcilia (se suma tal cual). - Ciudad guardada como código; seed de ubicaciones curado (extensible). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 4 commits 2026-08-07 13:59:20 +00:00
- Fecha de solicitud automática (hoy) editable al crear.
- Modalidad de carga dependiente del transporte: marítimo→FCL/LCL/Ambas,
  aéreo→Aérea (autoselección), terrestre→FTL/LTL, ferroviario/multimodal sin modalidad.
- Ciudad y Puerto/Aeropuerto dependientes del país (catálogos por parent_code) con
  respaldo de texto; el campo Puerto/Aeropuerto une ambos catálogos.
- Agente en destino filtrado a proveedores clasificados corresponsal/aduanal.
- Volumen SIEMPRE en m³ (conversión desde dimensiones según unidad de medida).
- P/Vol aéreo etiquetado con unidad (kg) y honra la unidad de medida.
- Moneda visible junto al valor de la mercancía.
- Lista de solicitudes con columna Cliente + filtro por cliente + búsqueda por nombre.
- Formulario de tarifa: campo "Válida hasta" (calendario).
- Catálogos globales ciudad/puerto/aeropuerto por país (seed_locations, extensible).
- Nuevos load types FTL/LTL. Suite backend en verde (109).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Prospecto (lead): se conserva "Origen" y se agrega "Medio de contacto preferido"
  (catálogo medio_contacto). Backend leads.preferred_contact_method + migración
  f0a1b2c3d4e5 reversible.
- Bug documentos: endpoint proxy GET /v1/crm/uploads/download transmite el archivo
  por el backend (valida aislamiento tenant/company) — evita la URL prefirmada al
  host interno minio:9000. RelatedManager.openDoc usa blob→objectURL.

Suite backend en verde (109). svelte-check sin errores nuevos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Lista de cotizaciones muestra la Solicitud referenciada (QuoteResponse enriquecido
  con service_request_reference; columna con enlace a la solicitud).
- Cotizador vinculable a una solicitud (?service_request_id=) → prellena modo
  (mapper transport+load→RateMode), ruta, peso/dimensiones, etc.
- Cotizador vinculable a una cotización (?quote_id=) → botón "Agregar" por opción
  que crea el concepto de flete + cargos en la cotización y regresa a ella.
- Botón "Cotizador" en el detalle de la cotización (entrada vinculada).

Suite de cotizaciones en verde. svelte-check sin errores nuevos.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Tabla crm.cases (expediente) con folio EXP2026-08-001 (next_folio entidad EXP,
  sin dirección). Nace al crear la Oportunidad y se hereda vía case_id a
  solicitud → cotización → operación → factura. advance_stage solo avanza.
- case_id (FK a crm.cases) en crm.opportunities/service_requests/quotes,
  ops.shipments y fin.invoices; propagación en sus create_*. Migración
  d4e5f6a7b8c9 reversible.
- Endpoints GET /v1/crm/cases, /cases/{id}, /cases/by-ref/{ref} con timeline
  (historia completa para UI y otros sistemas).
- Frontend: casesAPI, ruta /dashboard/crm/expedientes (lista + timeline vertical),
  chip "📁 Expediente" en solicitud/cotización, "Expedientes" en el sidebar.
- Consecutivo de folios sin tope (soporta >10,000,000/mes).
- 4 pruebas de expediente (minteo, propagación, timeline, no-retroceso). Suite en verde (113).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
admin closed this pull request 2026-08-07 22:36:31 +00:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ADUANASOFT/CRM_AGENTES_CARGA#4
No description provided.