Solución

@aventuradev·2/6/2026TypeScript
solution.tsTypeScript
export function calculateElectricityBill(k: number, t: string): number {
  const clientType = t;
  const kiloWatts = k;

  const RESIDENTIAL_CLIENT_TYPE = 'residential';
  const COMMERCIAL_CLIENT_TYPE = 'commercial';
  const INDUSTRIAL_CLIENT_TYPE = 'industrial';

  const RESIDENTIAL_LOW_RATE = 0.10;
  const RESIDENTIAL_MEDIUM_RATE = 0.15;
  const RESIDENTIAL_HIGH_RATE = 0.20;

  const COMMERCIAL_RATE = 0.18;
  const COMMERCIAL_HIGH_CONSUMPTION_DISCOUNT = 0.90;

  const INDUSTRIAL_RATE = 0.12;
  const INDUSTRIAL_HIGH_CONSUMPTION_DISCOUNT = 0.85;
  const INDUSTRIAL_FIXED_CHARGE = 50;

  const MINIMUM_BILL_AMOUNT = 5;

  let consumption = 0;

  // Calcular costo según el tipo de cliente
  if (clientType === RESIDENTIAL_CLIENT_TYPE) {
    // Aplicar tarifa por tramos según consumo
    if (kiloWatts <= 100) {
      consumption = kiloWatts * RESIDENTIAL_LOW_RATE;
    } else if (kiloWatts <= 300) {
      consumption =
        100 * RESIDENTIAL_LOW_RATE +
        (kiloWatts - 100) * RESIDENTIAL_MEDIUM_RATE;
    } else {
      consumption =
        100 * RESIDENTIAL_LOW_RATE +
        200 * RESIDENTIAL_MEDIUM_RATE +
        (kiloWatts - 300) * RESIDENTIAL_HIGH_RATE;
    }
  } else if (clientType === COMMERCIAL_CLIENT_TYPE) {
    // Aplicar tarifa plana con posible descuento por alto consumo
    if (kiloWatts > 500) {
      consumption =
        kiloWatts *
        COMMERCIAL_RATE *
        COMMERCIAL_HIGH_CONSUMPTION_DISCOUNT;
    } else {
      consumption = kiloWatts * COMMERCIAL_RATE;
    }
  } else if (clientType === INDUSTRIAL_CLIENT_TYPE) {
    // Aplicar tarifa plana con posible descuento y cargo fijo
    if (kiloWatts > 1000) {
      consumption =
        kiloWatts *
          INDUSTRIAL_RATE *
          INDUSTRIAL_HIGH_CONSUMPTION_DISCOUNT +
        INDUSTRIAL_FIXED_CHARGE;
    } else {
      consumption =
        kiloWatts * INDUSTRIAL_RATE +
        INDUSTRIAL_FIXED_CHARGE;
    }
  }

  // Aplicar cobro mínimo si el costo calculado es menor al permitido
  if (isMinAmount(consumption)) {
    consumption = MINIMUM_BILL_AMOUNT;
  }

  return +consumption.toFixed(2);
}

function isMinAmount(consumption: number): boolean {
  return consumption < 5;
}
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.