Solución

@aventuradev·2/6/2026TypeScript
solution.tsTypeScript
const INVALID_SALARY = -1;

const SENIOR_CATEGORY = 'senior';
const MID_CATEGORY = 'mid';

const SENIOR_BONUS_RATE = 0.20;
const MID_BONUS_RATE = 0.10;

const HIGH_TAX_THRESHOLD = 5000;
const MEDIUM_TAX_THRESHOLD = 2000;

const HIGH_TAX_RATE = 0.25;
const MEDIUM_TAX_RATE = 0.15;
const LOW_TAX_RATE = 0.08;

const ROUNDING_FACTOR = 100;

export function calculateMonthlySalary(
  workedHours: number,
  hourlyRate: number,
  employeeCategory: string,
): number {
  if (!isValidAmount(workedHours) || !isValidAmount(hourlyRate)) {
    return INVALID_SALARY;
  }

  const grossSalary = workedHours * hourlyRate;
  const bonus = calculateBonus(grossSalary, employeeCategory);
  const totalSalary = grossSalary + bonus;
  const taxes = calculateTaxes(totalSalary);

  return (
    Math.round((totalSalary - taxes) * ROUNDING_FACTOR) /
    ROUNDING_FACTOR
  );
}

function isValidAmount(value: number): boolean {
  return value > 0;
}

function calculateBonus(
  grossSalary: number,
  employeeCategory: string,
): number {
  switch (employeeCategory) {
    case SENIOR_CATEGORY:
      return grossSalary * SENIOR_BONUS_RATE;

    case MID_CATEGORY:
      return grossSalary * MID_BONUS_RATE;

    default:
      return 0;
  }
}

function calculateTaxes(totalSalary: number): number {
  if (totalSalary > HIGH_TAX_THRESHOLD) {
    return totalSalary * HIGH_TAX_RATE;
  }

  if (totalSalary > MEDIUM_TAX_THRESHOLD) {
    return totalSalary * MEDIUM_TAX_RATE;
  }

  return totalSalary * LOW_TAX_RATE;
}
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.