@@ -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