Solución
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