"""Cálculos de precio compartidos del proceso comercial. Peso volumétrico / a cobrar de carga aérea (doc maestro de cotización): P/Vol = (Largo_cm × Ancho_cm × Alto_cm × cantidad) / 6000 El peso a cobrar es el mayor entre el peso bruto y el P/Vol (estándar aéreo). 6000 cm³/kg es el factor internacional (equivale a ~167 kg/m³). """ from __future__ import annotations from decimal import Decimal # Factor internacional de peso volumétrico aéreo (cm³ por kg). AIR_VOLUMETRIC_DIVISOR = Decimal("6000") def _d(value) -> Decimal: if value is None: return Decimal(0) return value if isinstance(value, Decimal) else Decimal(str(value)) def air_volumetric_kg(length_cm, width_cm, height_cm, qty=1) -> Decimal: """Peso volumétrico aéreo a partir de dimensiones (cm) y cantidad de bultos. Devuelve 0 si falta alguna dimensión (no se puede calcular). """ length, width, height = _d(length_cm), _d(width_cm), _d(height_cm) if length <= 0 or width <= 0 or height <= 0: return Decimal(0) quantity = _d(qty) if _d(qty) > 0 else Decimal(1) return (length * width * height * quantity) / AIR_VOLUMETRIC_DIVISOR def air_chargeable_kg(gross_kg, length_cm, width_cm, height_cm, qty=1) -> Decimal: """Peso a cobrar aéreo: max(peso bruto, peso volumétrico por dimensiones).""" return max(_d(gross_kg), air_volumetric_kg(length_cm, width_cm, height_cm, qty))