- 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>
30 lines
1013 B
Python
30 lines
1013 B
Python
"""Pruebas del cálculo de peso/volumen (P/Vol) aéreo."""
|
||
|
||
from decimal import Decimal
|
||
|
||
from api.v1.modules.crm.common.pricing import air_chargeable_kg, air_volumetric_kg
|
||
|
||
|
||
def test_air_volumetric_doc_example():
|
||
# 3 pallets 120×120×100 cm → (120*120*100*3)/6000 = 720 (ejemplo del documento)
|
||
assert air_volumetric_kg(120, 120, 100, 3) == Decimal(720)
|
||
|
||
|
||
def test_air_volumetric_zero_without_dimensions():
|
||
assert air_volumetric_kg(None, 120, 100, 3) == Decimal(0)
|
||
assert air_volumetric_kg(0, 120, 100, 3) == Decimal(0)
|
||
|
||
|
||
def test_air_qty_defaults_to_one():
|
||
assert air_volumetric_kg(100, 100, 100, 0) == air_volumetric_kg(100, 100, 100, 1)
|
||
|
||
|
||
def test_air_chargeable_takes_gross_when_larger():
|
||
# bruto 800 > volumétrico 720 → se cobra 800
|
||
assert air_chargeable_kg(800, 120, 120, 100, 3) == Decimal(800)
|
||
|
||
|
||
def test_air_chargeable_takes_volumetric_when_larger():
|
||
# bruto 200 < volumétrico 720 → se cobra 720
|
||
assert air_chargeable_kg(200, 120, 120, 100, 3) == Decimal(720)
|