Skip to content

Commit ff7f7f9

Browse files
committed
feat(number): add convertPayRate considering a standard work week of 40 hours
1 parent bcd15c9 commit ff7f7f9

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/number.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,45 @@ export function* range(
122122
yield start + i * direction;
123123
}
124124
}
125+
126+
export type PayRateUnit = 'hour' | 'day' | 'week' | 'month' | 'year';
127+
export interface PayRate {
128+
value: number;
129+
unit: PayRateUnit;
130+
}
131+
132+
const HOURS_PER_DAY = 8;
133+
const DAYS_PER_WEEK = 5;
134+
const WEEKS_PER_YEAR = 52;
135+
const MONTHS_PER_YEAR = 12;
136+
const HOURS_PER_WEEK = HOURS_PER_DAY * DAYS_PER_WEEK;
137+
const HOURS_PER_YEAR = HOURS_PER_DAY * DAYS_PER_WEEK * WEEKS_PER_YEAR;
138+
const HOURS_PER_MONTH = HOURS_PER_YEAR / MONTHS_PER_YEAR;
139+
140+
const toHour: Record<PayRateUnit, number> = {
141+
hour: 1,
142+
day: HOURS_PER_DAY,
143+
week: HOURS_PER_WEEK,
144+
month: HOURS_PER_MONTH,
145+
year: HOURS_PER_YEAR,
146+
};
147+
148+
/**
149+
* Converts a pay rate from one unit to another considering a standard work week of 40 hours.
150+
*
151+
* ```ts
152+
* convertPayRate({ value: 100, unit: 'hour' }, 'day'); // { value: 800, unit: 'day' }
153+
* convertPayRate({ value: 100, unit: 'day' }, 'hour'); // { value: 12.5, unit: 'hour' }
154+
* convertPayRate({ value: 100, unit: 'week' }, 'month'); // { value: 433.33, unit: 'month' }
155+
* convertPayRate({ value: 100, unit: 'year' }, 'week'); // { value: 1.92, unit: 'week' }
156+
* convertPayRate({ value: 100, unit: 'month' }, 'year'); // { value: 1200, unit: 'year' }
157+
* ```
158+
*/
159+
export function convertPayRate(
160+
payRate: PayRate,
161+
payRateUnit: PayRateUnit,
162+
): PayRate {
163+
const hourlyValue = payRate.value / toHour[payRate.unit];
164+
const newValue = hourlyValue * toHour[payRateUnit];
165+
return { value: parseFloat(newValue.toFixed(2)), unit: payRateUnit };
166+
}

0 commit comments

Comments
 (0)