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
203 lines (160 loc) • 8.14 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var moment = require('moment');
var _require = require('../utility/errorHandling'),
errorDisc = _require.errorDisc;
var _require2 = require('../constants'),
UTC = _require2.UTC,
DATE_FORMAT_STRING = _require2.DATE_FORMAT_STRING,
MODIFIED = _require2.MODIFIED,
DATE_TIME_DELIMITER = _require2.DATE_TIME_DELIMITER,
TIME_FORMAT_STRING = _require2.TIME_FORMAT_STRING,
EVENT = _require2.EVENT;
/* 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 here:
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 generateTimeSpan = function generateTimeSpan(_ref2) {
var event = _ref2.event,
date = _ref2.date,
weekday = _ref2.weekday;
event.weekdayStart = weekday;
event.timeEnd = null;
if (event.timeStart) {
var spanningTime = false;
var targetTimeEndDateClone = date;
if (event.spanningMinutes) {
targetTimeEndDateClone.add(event.spanningMinutes, 'minute');
spanningTime = true;
}
if (event.spanningHours) {
targetTimeEndDateClone.add(event.spanningHours, 'hour');
spanningTime = true;
}
if (event.spanningDays) {
targetTimeEndDateClone.add(event.spanningDays, 'day');
spanningTime = true;
}
if (spanningTime) {
var DATE_TIME_FORMAT_STRING = "".concat(DATE_FORMAT_STRING).concat(DATE_TIME_DELIMITER).concat(TIME_FORMAT_STRING);
var dateTimeString = targetTimeEndDateClone.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];
event.dateEnd = dateString;
event.timeEnd = newTimeString.toLowerCase();
event.weekdayEnd = targetTimeEndDateClone.day();
}
}
};
var redefineTimeStartAndTimeSpan = function redefineTimeStartAndTimeSpan(_ref3) {
var event = _ref3.event,
_ref3$skipTimeTravel = _ref3.skipTimeTravel,
skipTimeTravel = _ref3$skipTimeTravel === void 0 ? null : _ref3$skipTimeTravel;
if (!createTimeZone) {
// TODO: check to see why this function was undefined at runtime
createTimeZone = require('../timeZone').createTimeZone; // eslint-disable-line global-require
}
var newTargetTimeStartDate = createTimeZone({
timeZone: event.timeZone,
timeZoneType: event.timeZoneType,
dateString: event.dateStart,
timeString: event.timeStart
});
event.dateTimeStartEventSource = newTargetTimeStartDate; // for future convenience, store the full original moment-timezone date from the rule
event.dateTimeStartObserverSource = newTargetTimeStartDate; // default value (in the event that timeTravel does not execute)
// note: perform the following only if skipTimeTravel is true since it would otherwise execute the same pattern with converted values
// define timeStart
// then define dateEnd / timeEnd IF there is a timeStart
if (skipTimeTravel) {
if (event.timeStart) {
var DATE_TIME_FORMAT_STRING = "".concat(DATE_FORMAT_STRING).concat(DATE_TIME_DELIMITER).concat(TIME_FORMAT_STRING);
var dateTimeString = newTargetTimeStartDate.format(DATE_TIME_FORMAT_STRING); // lowercase the AM/PM
var _dateTimeString$split3 = dateTimeString.split(DATE_TIME_DELIMITER),
_dateTimeString$split4 = (0, _slicedToArray2["default"])(_dateTimeString$split3, 2),
dateString = _dateTimeString$split4[0],
newTimeString = _dateTimeString$split4[1];
event.timeStart = newTimeString;
} else {
event.timeStart = null;
}
generateTimeSpan({
event: event,
date: newTargetTimeStartDate,
weekday: newTargetTimeStartDate.day()
});
}
};
/*
function: generateEvent
description:
when a rule satisfies all of its conditions, the rule gets imprinted as an event in this function
*/
var generateEvent = function generateEvent(_ref4) {
var danielSan = _ref4.danielSan,
rule = _ref4.rule,
date = _ref4.date,
_ref4$skipTimeTravel = _ref4.skipTimeTravel,
skipTimeTravel = _ref4$skipTimeTravel === void 0 ? null : _ref4$skipTimeTravel;
var newEvent = _objectSpread({}, rule);
newEvent.entityType = EVENT; // can be used to categorize if an object is a rule, event, or an aggregate
// define dateStart
newEvent.dateStart = date.format(DATE_FORMAT_STRING); // whether or not we timeTravel, the output timeZone is always assumed to be from OBSERVER_SOURCE
newEvent.timeZone = danielSan.config.timeZone;
newEvent.timeZoneType = danielSan.config.timeZoneType; // this is currently redundant since we are auto-assigning the danielSan value to event???
// however, if we ever want to change that behavior and add additional options, we'd still want to be sure that this value matches the event output???
newEvent.eventSourceTimeZoneType = newEvent.timeZoneType; // for future convenience
newEvent.eventSourceTimeZone = newEvent.timeZone; // default value and for future convenience
// related code block
redefineTimeStartAndTimeSpan({
event: newEvent,
skipTimeTravel: skipTimeTravel
});
danielSan.events.push(_objectSpread({}, newEvent));
var processPhase = MODIFIED;
return processPhase;
};
module.exports = {
redefineTimeStartAndTimeSpan: redefineTimeStartAndTimeSpan,
generateTimeSpan: generateTimeSpan,
generateEvent: generateEvent
};