business-moment
Version:
Business calendar momentjs plugin
109 lines (84 loc) • 2.41 kB
JavaScript
var R = require('ramda');
var path = require('path');
var moment = require('moment');
var calendar = require('business-calendar')
var Promise = require('bluebird-ff');
var sources = {
static: require('./static-source'),
http: require('./http-source')
};
var defaultConfig = {
cacheLifetime: 24 * 60 * 60 * 1000,
source: 'static',
staticPath: calendar.getDataRoot(),
httpBase: 'https://pagarme.github.io/business-calendar/data'
};
var cache = {};
exports.configure = function(config) {
defaultConfig = R.merge(defaultConfig, config);
};
exports.queryDateInformation = function(country, date, options) {
var config = R.mergeWith(R.defaultTo, defaultConfig, options || {});
date = moment(sanitizeDateInput(date))
return Promise.resolve()
.then(loadInformation)
.then(compare);
function loadInformation() {
return getYearInformation(country, date.year(), config);
}
function compare(info) {
return getDateFromInformation(info, date);
}
}
exports.isBusinessDay = function(country, date, options) {
date = moment(sanitizeDateInput(date));
return exports.queryDateInformation(country, date, options)
.then(function(day) {
if (isWeekend(date)) {
return false;
}
if (!day) {
return true;
}
return !day.holiday && !day.limited_financial_operation;
});
};
exports.nextBusinessDay = function(country, anchorDate, options) {
var day = moment(sanitizeDateInput(anchorDate)).add(1, 'd');
return iterate(day);
function iterate(day) {
return exports.isBusinessDay(country, day, options)
.then(function(isBusinessDay) {
if (isBusinessDay) {
return day.toDate();
}
return iterate(day.add(1, 'd'));
});
}
};
function getDateFromInformation(info, date) {
var key = date.format('YYYY-MM-DD');
return R.find(R.propEq('date', key), info.calendar);
}
function getYearInformation(country, year, config) {
var cacheName = country.toLowerCase() + '_' + year;
if (cache[cacheName] && (Date.now() - cache[cacheName].time) <= config.cacheLifetime) {
return Promise.resolve(cache[cacheName].data);
}
return sources[config.source].load(country, year, config)
.tap(function(result) {
cache[cacheName] = {
time: Date.now(),
data: result
};
});
}
function isWeekend(date) {
return date.isoWeekday() == 6 || date.isoWeekday() == 7;
}
function sanitizeDateInput(date) {
if (moment.isMoment(date)) {
return date.toDate()
}
return date
}