Solución

@eltamales
·hace 3dTypeScript
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
Respuestas
0

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.
Markdown