retail-calendar
Version:
A configurable retail calendar
33 lines (32 loc) • 1.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var date_utils_1 = require("./date_utils");
var LastDayNearestEOMStrategy = /** @class */ (function () {
function LastDayNearestEOMStrategy() {
}
LastDayNearestEOMStrategy.prototype.getLastDayForGregorianLastDay = function (lastDayOfGregorianYear, lastDayOfIsoWeek, _retailCalendarYear) {
var mutableLastDay = new Date(lastDayOfGregorianYear);
// Generate 3 candidates which has the same day of week.
// Current week, last week, next week
var currentWeekCandidate = date_utils_1.setIsoWeekDay(mutableLastDay, lastDayOfIsoWeek);
var lastWeekCandidate = date_utils_1.setIsoWeekDay(date_utils_1.addWeeksToDate(mutableLastDay, -1), lastDayOfIsoWeek);
var nextWeekCandidate = date_utils_1.setIsoWeekDay(date_utils_1.addWeeksToDate(mutableLastDay, 1), lastDayOfIsoWeek);
// Calculate absolute day differences from each candidate to EOM
var currentWeekDiff = Math.abs(date_utils_1.getDayDifference(mutableLastDay, currentWeekCandidate));
var lastWeekDiff = Math.abs(date_utils_1.getDayDifference(mutableLastDay, lastWeekCandidate));
var nextWeekDiff = Math.abs(date_utils_1.getDayDifference(mutableLastDay, nextWeekCandidate));
// Find nearest difference
var minDiff = Math.min(currentWeekDiff, lastWeekDiff, nextWeekDiff);
if (minDiff === nextWeekDiff) {
return nextWeekCandidate;
}
else if (minDiff === lastWeekDiff) {
return lastWeekCandidate;
}
else {
return currentWeekCandidate;
}
};
return LastDayNearestEOMStrategy;
}());
exports.LastDayNearestEOMStrategy = LastDayNearestEOMStrategy;