feat(crm): cotización aérea con peso/volumen (P/Vol) operacional #2

Closed
admin wants to merge 1 commits from feature/crm-cotizacion-aerea into feature/crm-solicitud-cotizacion-ciclo
Owner

Cotización Aérea (doc "Modulo de cotización.docx" — sección Aéreo)

Agrega la 4ª modalidad AÉREO con el cálculo operacional de peso/volumen (P/Vol) y su costeo.

Cambios

  • Solicitud (ServiceRequestFields): al elegir modalidad AÉREO se muestra la sección aérea con el cálculo en vivo P/Vol = (Largo×Ancho×Alto cm × cantidad de bultos) / 6000 (factor internacional) y el peso a cobrar = max(peso bruto, P/Vol). Fija el transporte en aéreo y oculta FCL/LCL.
  • Utilidad compartida crm/common/pricing.py: air_volumetric_kg / air_chargeable_kg.
  • Motor de costeo (Tarifario): la rama aérea usa el P/Vol por dimensiones cuando vienen (CostRequest acepta length/width/height_cm); respaldo m³ × 167 cuando solo hay m³.
  • Cotizador: en modo aéreo permite capturar dimensiones (L×A×H + bultos) y muestra el P/Vol y el peso a cobrar.
  • Solicitud → Cotización: si la modalidad es AÉREO, siembra el concepto de flete con cantidad = peso a cobrar (P/Vol) para que el ejecutivo capture la tarifa por kg.

Ejemplo del documento

3 pallets 120×120×100 cm, 200 kg → ((120×120×100)×3)/6000 = 720 → peso a cobrar max(200, 720) = 720.

Pruebas

test_pricing.py (ejemplo → 720; max bruto/volumétrico; sin dimensiones → 0) + cotización aérea desde solicitud. Suite backend en verde (108). Sin migraciones. svelte-check sin errores nuevos.

Decisión / pendiente

  • Peso a cobrar = max(bruto, P/Vol) (confirmado). Cantidad de bultos = pallets_countpieces_count → 1 (PENDIENTE confirmar campo).
  • El cálculo por dimensiones usa /6000 exacto; el motor conserva m³×167 como respaldo. ¿Unificar todo a /6000?

🤖 Generated with Claude Code

## Cotización Aérea (doc "Modulo de cotización.docx" — sección Aéreo) Agrega la 4ª modalidad **AÉREO** con el cálculo operacional de **peso/volumen (P/Vol)** y su costeo. ### Cambios - **Solicitud (ServiceRequestFields):** al elegir modalidad **AÉREO** se muestra la sección aérea con el cálculo en vivo `P/Vol = (Largo×Ancho×Alto cm × cantidad de bultos) / 6000` (factor internacional) y el **peso a cobrar = max(peso bruto, P/Vol)**. Fija el transporte en aéreo y oculta FCL/LCL. - **Utilidad compartida** `crm/common/pricing.py`: `air_volumetric_kg` / `air_chargeable_kg`. - **Motor de costeo (Tarifario):** la rama aérea usa el P/Vol por dimensiones cuando vienen (`CostRequest` acepta `length/width/height_cm`); respaldo `m³ × 167` cuando solo hay m³. - **Cotizador:** en modo aéreo permite capturar dimensiones (L×A×H + bultos) y muestra el P/Vol y el peso a cobrar. - **Solicitud → Cotización:** si la modalidad es AÉREO, siembra el concepto de flete con **cantidad = peso a cobrar (P/Vol)** para que el ejecutivo capture la tarifa por kg. ### Ejemplo del documento 3 pallets 120×120×100 cm, 200 kg → `((120×120×100)×3)/6000 = 720` → peso a cobrar `max(200, 720) = 720`. ### Pruebas `test_pricing.py` (ejemplo → 720; max bruto/volumétrico; sin dimensiones → 0) + cotización aérea desde solicitud. **Suite backend en verde (108).** Sin migraciones. `svelte-check` sin errores nuevos. ### Decisión / pendiente - Peso a cobrar = **max(bruto, P/Vol)** (confirmado). Cantidad de bultos = `pallets_count` → `pieces_count` → 1 (PENDIENTE confirmar campo). - El cálculo por dimensiones usa **/6000 exacto**; el motor conserva `m³×167` como respaldo. ¿Unificar todo a /6000? 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 1 commit 2026-08-04 13:30:13 +00:00
- Modalidad AÉREO (4ª opción en "¿Cómo desea cotizar?"): en la solicitud
  muestra la sección aérea con el cálculo en vivo P/Vol = (L×A×H cm × bultos)/6000
  y el peso a cobrar = max(peso bruto, P/Vol). Fija el transporte en aéreo.
- Utilidad compartida crm/common/pricing.py (air_volumetric_kg / air_chargeable_kg,
  factor internacional 6000).
- Motor de costeo (rates): la rama aérea usa el P/Vol por dimensiones si vienen
  (CostRequest ahora acepta length/width/height_cm); respaldo m³×167 cuando no.
- Cotizador: captura por dimensiones (L×A×H + bultos) en modo aéreo y muestra el P/Vol.
- Solicitud→Cotización: si es AÉREO, siembra el concepto de flete con cantidad =
  peso a cobrar (P/Vol) para capturar la tarifa por kg.
- Pruebas: test_pricing (ejemplo del doc → 720; max bruto/volumétrico) + cotización
  aérea desde solicitud. Suite en verde (108).

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#2
No description provided.