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