swedish-salary-day
Version:
Calculate the next or previous salary payout date according to configured rules.
75 lines (58 loc) • 1.99 kB
JavaScript
import { isHoliday } from 'se-bank-holidays'; // Config for which day
const defaultConfig = {
dayOfMonth: 25,
resolveSaturday: 'previous-work-day',
resolveSunday: 'previous-work-day',
isHoliday: isHoliday
};
function nextSalaryDay(referenceDate, config = defaultConfig) {
if (typeof referenceDate === 'number') {
// eslint-disable-next-line no-param-reassign
referenceDate = new Date(referenceDate);
}
let salaryDay = new Date(referenceDate.getFullYear(), referenceDate.getMonth(), config.dayOfMonth + 1);
salaryDay.setUTCMinutes(0);
salaryDay.setUTCHours(0);
if (referenceDate > salaryDay) {
salaryDay.setMonth(salaryDay.getMonth() + 1);
salaryDay.setUTCMinutes(0);
salaryDay.setUTCHours(0);
}
salaryDay = setSalaryDay(salaryDay, config);
return salaryDay;
}
function previousSalaryDay(referenceDate, config = defaultConfig) {
if (typeof referenceDate === 'number') {
// eslint-disable-next-line no-param-reassign
referenceDate = new Date(referenceDate);
}
let salaryDay = new Date(referenceDate.getFullYear(), referenceDate.getMonth(), config.dayOfMonth + 1);
salaryDay.setUTCMinutes(0);
salaryDay.setUTCHours(0);
if (referenceDate < salaryDay) {
salaryDay.setMonth(salaryDay.getMonth() - 1);
salaryDay.setUTCMinutes(0);
salaryDay.setUTCHours(0);
}
salaryDay = setSalaryDay(salaryDay, config);
return salaryDay;
}
const SATURDAY = 6;
const SUNDAY = 0;
function setSalaryDay(date, config) {
const dayOfWeek = date.getDay();
if (dayOfWeek === SATURDAY) {
date.setDate(date.getDate() + (config.resolveSaturday === 'previous-work-day' ? -1 : 2));
}
if (dayOfWeek === SUNDAY) {
date.setDate(date.getDate() + (config.resolveSunday === 'previous-work-day' ? -2 : 1));
}
if (config.isHoliday) {
while (config.isHoliday(date)) {
date.setDate(date.getDate() - 1);
}
}
return date;
}
export { nextSalaryDay, previousSalaryDay };
//# sourceMappingURL=index2.mjs.map