daniel-san
Version:
a node-based budget-projection engine that helps your routines and finances find balance. The program features aggregates, terminal and file-based reporting output, multi-currency conversion capability and multi-frequency accounting triggers, including: o
237 lines (194 loc) • 7.59 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var moment = require('moment-timezone');
var _require = require('../utility/errorHandling'),
errorDisc = _require.errorDisc;
var _require2 = require('../core/eventGeneration'),
generateTimeSpan = _require2.generateTimeSpan;
var _require3 = require('../constants'),
UTC = _require3.UTC,
DATE_TIME_DELIMITER = _require3.DATE_TIME_DELIMITER,
DATE_FORMAT_STRING = _require3.DATE_FORMAT_STRING,
TIME_FORMAT_STRING = _require3.TIME_FORMAT_STRING,
OBSERVER_SOURCE = _require3.OBSERVER_SOURCE;
var initializeTimeZoneData = function initializeTimeZoneData(obj) {
try {
var thisTimeZoneType = obj.timeZoneType || UTC; // default value
var thisTimeZone; // default value is set below
if (!obj.timeZone) {
thisTimeZone = moment.tz.guess();
} else {
thisTimeZone = obj.timeZone;
}
obj.timeZoneType = thisTimeZoneType;
obj.timeZone = thisTimeZone;
return {
timeZoneType: thisTimeZoneType,
timeZone: thisTimeZone
};
} catch (err) {
throw errorDisc({
err: err,
data: {
obj: obj
}
});
}
};
/* TODO: for some reason, npm was throwing the following warning when attempting
to require createTimeZone from the timeZone directory, so it had to be redefined in core/eventGeneration:
warning message as follows:
Warning: Accessing non-existent property 'createTimeZone' of module exports inside circular dependency
*/
var createTimeZone = function createTimeZone(_ref) {
var timeZone = _ref.timeZone,
timeZoneType = _ref.timeZoneType,
_ref$date = _ref.date,
date = _ref$date === void 0 ? null : _ref$date,
_ref$dateString = _ref.dateString,
dateString = _ref$dateString === void 0 ? null : _ref$dateString,
_ref$timeString = _ref.timeString,
timeString = _ref$timeString === void 0 ? null : _ref$timeString;
try {
var DATE_TIME_FORMAT_STRING = timeString ? "".concat(DATE_FORMAT_STRING).concat(DATE_TIME_DELIMITER).concat(TIME_FORMAT_STRING) : DATE_FORMAT_STRING;
var dateTimeString = timeString ? "".concat(dateString).concat(DATE_TIME_DELIMITER).concat(timeString) : dateString;
var outputDate = date; // default value
var thisMoment = timeZoneType === UTC ? moment.utc : moment.tz; // process date
if (date) {
outputDate = thisMoment(date, timeZone);
} else {
outputDate = thisMoment(dateTimeString, DATE_TIME_FORMAT_STRING, timeZone);
}
return outputDate;
} catch (err) {
throw errorDisc({
err: err,
data: {
date: date,
timeZone: timeZone,
timeZoneType: timeZoneType,
dateString: dateString,
timeString: timeString
}
});
}
};
var convertTimeZone = function convertTimeZone(_ref2) {
var timeZone = _ref2.timeZone,
timeZoneType = _ref2.timeZoneType,
date = _ref2.date,
timeString = _ref2.timeString;
try {
var newDate = date.clone();
var outputDate = newDate; // default value;
outputDate = timeZoneType === UTC ? newDate.utc(timeZone) : newDate.tz(timeZone);
var DATE_TIME_FORMAT_STRING = "".concat(DATE_FORMAT_STRING).concat(DATE_TIME_DELIMITER).concat(TIME_FORMAT_STRING);
var dateTimeString = outputDate.format(DATE_TIME_FORMAT_STRING); // lowercase the AM/PM
var _dateTimeString$split = dateTimeString.split(DATE_TIME_DELIMITER),
_dateTimeString$split2 = (0, _slicedToArray2["default"])(_dateTimeString$split, 2),
dateString = _dateTimeString$split2[0],
newTimeString = _dateTimeString$split2[1];
return {
date: outputDate,
weekday: outputDate.day(),
dateString: dateString,
// generic dateString information / without time
timeString: timeString ? newTimeString.toLowerCase() : null // only return timeString if the user intended so (via setting the timeStart property on the rule which will be passed as timeString into this function)
};
} catch (err) {
throw errorDisc({
err: err,
data: {
date: date,
timeZone: timeZone,
timeZoneType: timeZoneType,
timeString: timeString
}
});
}
};
var timeTravel = function timeTravel(danielSan) {
var _danielSan$config = danielSan.config,
timeZone = _danielSan$config.timeZone,
timeZoneType = _danielSan$config.timeZoneType;
var eventTracker; // for errorDisc
var targetTimeStartObj = {};
try {
danielSan.events.forEach(function (event) {
eventTracker = event;
targetTimeStartObj = convertTimeZone({
timeZone: timeZone,
timeZoneType: timeZoneType,
date: event.dateTimeStartEventSource,
timeString: event.timeStart
});
event.context = OBSERVER_SOURCE; // simply so the user understands the context
event.eventSourceTimeZoneType = timeZoneType; // for future convenience
event.eventSourceTimeZone = timeZone; // for future convenience
event.dateTimeStartObserverSource = targetTimeStartObj.date; // for future convenience, store the full converted moment-timezone date for the event
if (event.effectiveDateStart) {
var transientDateObj = createTimeZone({
timeZone: event.timeZone,
timeZoneType: event.timeZoneType,
dateString: event.effectiveDateStart
});
var transientDateObjConverted = convertTimeZone({
timeZone: timeZone,
timeZoneType: timeZoneType,
date: transientDateObj
}); // for future convenience
event.effectiveDateStart = transientDateObjConverted.date.format(DATE_FORMAT_STRING);
}
if (event.effectiveDateEnd) {
var _transientDateObj = createTimeZone({
timeZone: event.timeZone,
timeZoneType: event.timeZoneType,
dateString: event.effectiveDateEnd
});
var _transientDateObjConverted = convertTimeZone({
timeZone: timeZone,
timeZoneType: timeZoneType,
date: _transientDateObj
}); // for future convenience
event.effectiveDateEnd = _transientDateObjConverted.date.format(DATE_FORMAT_STRING);
}
if (event.anchorSyncDate) {
var _transientDateObj2 = createTimeZone({
timeZone: event.timeZone,
timeZoneType: event.timeZoneType,
dateString: event.anchorSyncDate
});
var _transientDateObjConverted2 = convertTimeZone({
timeZone: timeZone,
timeZoneType: timeZoneType,
date: _transientDateObj2
}); // for future convenience
event.anchorSyncDate = _transientDateObjConverted2.date.format(DATE_FORMAT_STRING);
}
event.dateStart = targetTimeStartObj.dateString; // as seen from the observer
event.timeStart = event.timeStart ? targetTimeStartObj.timeString : null;
generateTimeSpan({
event: event,
date: targetTimeStartObj.date,
weekday: targetTimeStartObj.weekday
});
});
} catch (err) {
throw errorDisc({
err: err,
data: {
timeZone: timeZone,
timeZoneType: timeZoneType,
event: eventTracker,
targetTimeStartObj: targetTimeStartObj
}
});
}
};
module.exports = {
initializeTimeZoneData: initializeTimeZoneData,
createTimeZone: createTimeZone,
convertTimeZone: convertTimeZone,
timeTravel: timeTravel
};