swedish-salary-day
Version:
Calculate the next or previous salary payout date according to configured rules.
85 lines (65 loc) • 2.23 kB
JavaScript
// Bundled with Packemon: https://packemon.dev
// Platform: browser, Support: stable, Format: lib
;
Object.defineProperty(exports, '__esModule', {
value: true
});
const seBankHolidays = require('se-bank-holidays'); // Config for which day
const defaultConfig = {
dayOfMonth: 25,
resolveSaturday: 'previous-work-day',
resolveSunday: 'previous-work-day',
isHoliday: seBankHolidays.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;
}
exports.nextSalaryDay = nextSalaryDay;
exports.previousSalaryDay = previousSalaryDay;
//# sourceMappingURL=index.js.map