Solución
solution.tsTypeScript
const COBRO_MINIMO = 5;
const CONSUMO_RESIDENCIAL_BASE = 100;
const CONSUMO_RESIDENCIAL_MEDIO = 300;
const TARIFA_RESIDENCIAL_BASE = 0.10;
const TARIFA_RESIDENCIAL_MEDIA = 0.15;
const TARIFA_RESIDENCIAL_EXCEDENTE = 0.20;
const MAXIMO_DESCUENTO_COMERCIAL = 500;
const TARIFA_COMERCIAL = 0.18;
const DESCUENTO_COMERCIAL = 0.10;
const MAXIMO_DESCUENTO_INDUSTRIAL = 1000;
const TARIFA_INDUSTRIAL = 0.12;
const DESCUENTO_INDUSTRIAL = 0.15;
const CARGO_FIJO_INDUSTRIAL = 50;
export function calculateElectricityBill(consumokwh: number, tipoCliente: string): number {
let cobroTotal = 0;
// Calcular costo según el tipo de cliente
switch(tipoCliente) {
case "residential":
cobroTotal = calculateResidentialCost(consumokwh);
break;
case "commercial":
cobroTotal = calculateCommercialCost(consumokwh);
break;
case "industrial":
cobroTotal = calculateIndustrialCost(consumokwh);
break;
}
// Aplicar cobro minimo si no llega al minimo
cobroTotal = calculateMinimumCharge(cobroTotal);
return Number(cobroTotal.toFixed(2));
}
function calculateResidentialCost(consumokwh: number): number {
let cobroTotal = 0;
// Aplicar tarifa por tramos según consumo
if (consumokwh <= CONSUMO_RESIDENCIAL_BASE) {
cobroTotal = consumokwh * TARIFA_RESIDENCIAL_BASE;
} else if (consumokwh <= CONSUMO_RESIDENCIAL_MEDIO) {
cobroTotal = CONSUMO_RESIDENCIAL_BASE * TARIFA_RESIDENCIAL_BASE
+ (consumokwh - CONSUMO_RESIDENCIAL_BASE) * TARIFA_RESIDENCIAL_MEDIA;
} else {
cobroTotal = (CONSUMO_RESIDENCIAL_BASE * TARIFA_RESIDENCIAL_BASE) +
((CONSUMO_RESIDENCIAL_MEDIO - CONSUMO_RESIDENCIAL_BASE) * TARIFA_RESIDENCIAL_MEDIA) +
(consumokwh - CONSUMO_RESIDENCIAL_MEDIO) * TARIFA_RESIDENCIAL_EXCEDENTE;
}
return cobroTotal;
}
function calculateCommercialCost(consumokwh: number):number {
let cobroTotal = 0;
// Aplicar tarifa plana con posible descuento por alto consumo
if (consumokwh > MAXIMO_DESCUENTO_COMERCIAL) {
cobroTotal = consumokwh * TARIFA_COMERCIAL * (1 - DESCUENTO_COMERCIAL);
} else {
cobroTotal = consumokwh * TARIFA_COMERCIAL;
}
return cobroTotal;
}
function calculateIndustrialCost(consumokwh: number): number {
let cobroTotal = 0;
// Aplicar tarifa plana con posible descuento y cargo fijo
if (consumokwh > MAXIMO_DESCUENTO_INDUSTRIAL) {
cobroTotal = consumokwh * TARIFA_INDUSTRIAL * (1 - DESCUENTO_INDUSTRIAL) + CARGO_FIJO_INDUSTRIAL;
} else {
cobroTotal = consumokwh * TARIFA_INDUSTRIAL + CARGO_FIJO_INDUSTRIAL;
}
return cobroTotal;
}
function calculateMinimumCharge(cobroTotal: number): number {
if(cobroTotal < COBRO_MINIMO) cobroTotal = COBRO_MINIMO;
return cobroTotal;
}0respuestas