Solución

@alexiis-dev·30/5/2026TypeScript
solution.tsTypeScript
const DEFAULT_VALUE = -1
const LOCAL_ZONE = 'local'
const LOCAL_WEIGHT = 2
const LOCAL_DISTANCE = 0.10

const REGIONAL_ZONE = 'regional'
const REGIONAL_WEIGHT = 5
const REGIONAL_DISTANCE = 0.05

const NATIONAL_ZONE = 'nacional'
const NATIONAL_WEIGHT = 10
const NATIONAL_DISTANCE = 0.02

const DISCOUNT_PACKAGE = 0.90
const PRICE_PACKAGE = 20

type ValueType = 'price' | 'recharge'

function calculatePriceAndRecharge(weight:number, distance:number, zone: string, valueType: ValueType){
  let value = {price: 0, recharge: 0}

  if (zone === LOCAL_ZONE) 
  {
    value.price = weight * LOCAL_WEIGHT
    value.recharge = distance * LOCAL_DISTANCE
    return valueType === 'price' ? value.price : value.recharge
  }
  if(zone === REGIONAL_ZONE){
    value.price = weight * REGIONAL_WEIGHT
    value.recharge = distance * REGIONAL_DISTANCE
    return valueType === 'price' ? value.price : value.recharge
  }
  if(zone === NATIONAL_ZONE) {
    value.price = weight * NATIONAL_WEIGHT
    value.recharge = distance * NATIONAL_DISTANCE
    return valueType === 'price' ? value.price : value.recharge
  }
  return valueType === 'price' ? value.price : value.recharge
}

export function calculateShippingCost(weight: number, disctance: number, zone: string): number {
  if(weight <= 0) return DEFAULT_VALUE
  if(disctance <= 0) return DEFAULT_VALUE

  let price = calculatePriceAndRecharge(weight, disctance, zone, 'price');
  let recharge = calculatePriceAndRecharge(weight, disctance, zone, 'recharge');
  // Sumar precio base más recargo por distancia
  let total = price + recharge;

  // Aplicar descuento si el paquete es pesado
  if (weight > PRICE_PACKAGE) total *= DISCOUNT_PACKAGE

  // Redondear a dos decimales
  return +total.toFixed(2);
}
0respuestas
Respuestas

Aún no hay respuestas

¡Sé el primero en responder!

Escribir un comentario

Recuerda ser amable. Estás comentando la solución de otra persona. Comparte tu perspectiva de forma constructiva y respetuosa.

Debes iniciar sesión para publicar un comentario.