UNPKG

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
"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 };