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

267 lines (246 loc) 11 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 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 DATE_DELIMITER = '-'; var TIME_DELIMITER = ':'; var DATE_TIME_DELIMITER = 'T'; var MIN_INT_DIGITS_DEFAULT = 1; var MIN_DECIMAL_DIGITS_DEFAULT = 2; var MAX_DECIMAL_DIGITS_DEFAULT = 2; var LOCALE_DEFAULT = 'en-US'; var STYLE_DEFAULT = 'currency'; var CURRENCY_DEFAULT = 'USD'; var SUNDAY = 0; var MONDAY = 1; var TUESDAY = 2; var WEDNESDAY = 3; var THURSDAY = 4; var FRIDAY = 5; var SATURDAY = 6; var appConstants = { APP_NAME: 'daniel-san', AMOUNT: 'amount', BALANCE_ENDING: 'balanceEnding', DEFAULT_ERROR_MESSAGE: 'something bad happened and a lot of robots died', DATE_DELIMITER: DATE_DELIMITER, TIME_DELIMITER: TIME_DELIMITER, DATE_TIME_DELIMITER: DATE_TIME_DELIMITER, DATE_FORMAT_STRING: "YYYY".concat(DATE_DELIMITER, "MM").concat(DATE_DELIMITER, "DD"), TIME_FORMAT_STRING: "hh".concat(TIME_DELIMITER, "mmA"), UTC: 'UTC', LOCAL: 'LOCAL', AM: 'am', PM: 'pm', EVENT_SOURCE: 'EVENT_SOURCE', OBSERVER_SOURCE: 'OBSERVER_SOURCE', BOTH: 'BOTH', ANY: 'ANY', UNION: 'UNION', INTERSECTION: 'INTERSECTION', POSITIVE: 'POSITIVE', NEGATIVE: 'NEGATIVE', STANDARD_EVENT: 'STANDARD_EVENT', STANDARD_EVENT_ROUTINE: 'STANDARD_EVENT_ROUTINE', STANDARD_EVENT_REMINDER: 'STANDARD_EVENT_ROUTINE_REMINDER', NTH_WEEKDAYS_OF_MONTH: 'NTH_WEEKDAYS_OF_MONTH', NTH_WEEKDAYS_OF_MONTH_ROUTINE: 'NTH_WEEKDAYS_OF_MONTH_ROUTINE', NTH_WEEKDAYS_OF_MONTH_REMINDER: 'NTH_WEEKDAYS_OF_MONTH_REMINDER', WEEKDAY_ON_DATE: 'WEEKDAY_ON_DATE', WEEKDAY_ON_DATE_ROUTINE: 'WEEKDAY_ON_DATE_ROUTINE', WEEKDAY_ON_DATE_REMINDER: 'WEEKDAY_ON_DATE_REMINDER', MOVE_THIS_PROCESS_DATE_BEFORE_THESE_WEEKDAYS: 'MOVE_THIS_PROCESS_DATE_BEFORE_THESE_WEEKDAYS', MOVE_THIS_PROCESS_DATE_BEFORE_THESE_DATES: 'MOVE_THIS_PROCESS_DATE_BEFORE_THESE_DATES', PRE_PAY: 'PRE_PAY', MOVE_THIS_PROCESS_DATE_AFTER_THESE_WEEKDAYS: 'MOVE_THIS_PROCESS_DATE_AFTER_THESE_WEEKDAYS', MOVE_THIS_PROCESS_DATE_AFTER_THESE_DATES: 'MOVE_THIS_PROCESS_DATE_AFTER_THESE_DATES', POST_PAY: 'POST_PAY', ADJUST_AMOUNT_ON_THESE_DATES: 'ADJUST_AMOUNT_ON_THESE_DATES', ADJUST_AMOUNT: 'ADJUST_AMOUNT', ANNUALLY: 'ANNUALLY', MONTHLY: 'MONTHLY', WEEKLY: 'WEEKLY', DAILY: 'DAILY', ONCE: 'ONCE', SUNDAY: SUNDAY, MONDAY: MONDAY, TUESDAY: TUESDAY, WEDNESDAY: WEDNESDAY, THURSDAY: THURSDAY, FRIDAY: FRIDAY, SATURDAY: SATURDAY, WEEKENDS: [6, 0], DISCOVERING_EVENT_TYPE: 'DISCOVERING_EVENT_TYPE', EVALUATING_RULE_INSERTION: 'EVALUATING_RULE_INSERTION', EXECUTING_RULE_INSERTION: 'EXECUTING_RULE_INSERTION', EXECUTING_RULE_ADJUSTMENT: 'EXECUTING_RULE_ADJUSTMENT', EXECUTION_REJECTED: 'EXECUTION_REJECTED', MODIFIED: 'MODIFIED', RETIRING_RULES: 'RETIRING_RULES', STANDARD_OUTPUT: 'STANDARD_OUTPUT', VERBOSE: 'VERBOSE', CONCISE: 'CONCISE', SHY: 'SHY', EVENTS_BY_GROUP: 'EVENTS_BY_GROUP', EVENTS_BY_GROUPS: 'EVENTS_BY_GROUPS', EVENTS_BY_NAME: 'EVENTS_BY_NAME', EVENTS_BY_NAMES: 'EVENTS_BY_NAMES', EVENTS_BY_TYPE: 'EVENTS_BY_TYPE', EVENTS_BY_TYPES: 'EVENTS_BY_TYPES', EVENTS_BY_KEYS_AND_VALUES: 'EVENTS_BY_KEYS_AND_VALUES', EVENTS: 'EVENTS', CRITICAL_SNAPSHOTS: 'CRITICAL_SNAPSHOTS', DISCARDED_EVENTS: 'DISCARDED_EVENTS', IMPORTANT_EVENTS: 'IMPORTANT_EVENTS', TIME_EVENTS: 'TIME_EVENTS', ROUTINE: 'ROUTINE', REMINDER: 'REMINDER', ROUTINE_EVENTS: 'ROUTINE_EVENTS', REMINDER_EVENTS: 'REMINDER_EVENTS', ROUTINE_AND_REMINDER_EVENTS: 'ROUTINE_AND_REMINDER_EVENTS', RULES_TO_RETIRE: 'RULES_TO_RETIRE', IRRELEVANT_RULES: 'IRRELEVANT_RULES', SUM_OF_ALL_POSITIVE_EVENT_FLOWS: 'SUM_OF_ALL_POSITIVE_EVENT_FLOWS', SUM_OF_ALL_POSITIVE_EVENT_AMOUNTS: 'SUM_OF_ALL_POSITIVE_EVENT_AMOUNTS', SUM_OF_ALL_NEGATIVE_EVENT_FLOWS: 'SUM_OF_ALL_NEGATIVE_EVENT_FLOWS', SUM_OF_ALL_NEGATIVE_EVENT_AMOUNTS: 'SUM_OF_ALL_NEGATIVE_EVENT_AMOUNTS', EVENT_FLOWS_GREATER_THAN_TARGET: 'EVENT_FLOWS_GREATER_THAN_TARGET', EVENT_FLOWS_LESS_THAN_TARGET: 'EVENT_FLOWS_LESS_THAN_TARGET', NEGATIVE_EVENT_FLOWS_GREATER_THAN_TARGET: 'NEGATIVE_EVENT_FLOWS_GREATER_THAN_TARGET', NEGATIVE_EVENT_FLOWS_LESS_THAN_TARGET: 'NEGATIVE_EVENT_FLOWS_LESS_THAN_TARGET', POSITIVE_EVENT_FLOWS_GREATER_THAN_TARGET: 'POSITIVE_EVENT_FLOWS_GREATER_THAN_TARGET', POSITIVE_EVENT_FLOWS_LESS_THAN_TARGET: 'POSITIVE_EVENT_FLOWS_LESS_THAN_TARGET', BALANCE_ENDING_SNAPSHOTS_GREATER_THAN_TARGET: 'BALANCE_ENDING_SNAPSHOTS_GREATER_THAN_TARGET', BALANCE_ENDING_SNAPSHOTS_LESS_THAN_TARGET: 'BALANCE_ENDING_SNAPSHOTS_LESS_THAN_TARGET', GREATEST_BALANCE_ENDING_SNAPSHOTS: 'GREATEST_BALANCE_ENDING_SNAPSHOTS', LEAST_BALANCE_ENDING_SNAPSHOTS: 'LEAST_BALANCE_ENDING_SNAPSHOTS', GREATEST_EVENT_FLOWS: 'GREATEST_EVENT_FLOWS', LEAST_EVENT_FLOWS: 'LEAST_EVENT_FLOWS', GREATEST_POSITIVE_EVENT_FLOWS: 'GREATEST_POSITIVE_EVENT_FLOWS', LEAST_POSITIVE_EVENT_FLOWS: 'LEAST_POSITIVE_EVENT_FLOWS', GREATEST_NEGATIVE_EVENT_FLOWS: 'GREATEST_NEGATIVE_EVENT_FLOWS', LEAST_NEGATIVE_EVENT_FLOWS: 'LEAST_NEGATIVE_EVENT_FLOWS', EVENT_FLOWS_WITHIN_X_PERCENT_OF_TARGET: 'EVENT_FLOWS_WITHIN_X_PERCENT_OF_TARGET', NEGATIVE_EVENT_FLOWS_WITHIN_X_PERCENT_OF_TARGET: 'NEGATIVE_EVENT_FLOWS_WITHIN_X_PERCENT_OF_TARGET', POSITIVE_EVENT_FLOWS_WITHIN_X_PERCENT_OF_TARGET: 'POSITIVE_EVENT_FLOWS_WITHIN_X_PERCENT_OF_TARGET', BALANCE_ENDING_SNAPSHOTS_WITHIN_X_PERCENT_OF_TARGET: 'BALANCE_ENDING_SNAPSHOTS_WITHIN_X_PERCENT_OF_TARGET', AGGREGATES: 'AGGREGATES', DAY_CYCLES: 'DAY_CYCLES', DATE_SETS: 'DATE_SETS', SUMS_AND_AVERAGES: 'SUMS_AND_AVERAGES', MEDIANS_AND_MODES: 'MEDIANS_AND_MODES', MINIMUMS_AND_MAXIMUMS: 'MINIMUMS_AND_MAXIMUMS', GREATEST_VALUES: 'GREATEST_VALUES', LEAST_VALUES: 'LEAST_VALUES', DEFAULT: 'DEFAULT', ASCENDING: 'ASCENDING', DESCENDING: 'DESCENDING', SUM: 'SUM', AVERAGE: 'AVERAGE', MEDIANS: 'MEDIANS', MODES: 'MODES', MIN: 'MIN', MAX: 'MAX', MIN_INT_DIGITS_DEFAULT: MIN_INT_DIGITS_DEFAULT, MIN_DECIMAL_DIGITS_DEFAULT: MIN_DECIMAL_DIGITS_DEFAULT, MAX_DECIMAL_DIGITS_DEFAULT: MAX_DECIMAL_DIGITS_DEFAULT, LOCALE_DEFAULT: LOCALE_DEFAULT, STYLE_DEFAULT: STYLE_DEFAULT, CURRENCY_DEFAULT: CURRENCY_DEFAULT, RULE: 'RULE', EVENT: 'EVENT', REPORT: 'REPORT', AGGREGATE: 'AGGREGATE', AGGREGATE_GROUP: 'AGGREGATE_GROUP', DEFAULT_JSON_SPACING: 4, DEFAULT_SELECTION_LIMIT: 7 }; var decimalFormatterStandard = function decimalFormatterStandard(number, _ref) { var _ref$minIntegerDigits = _ref.minIntegerDigits, minIntegerDigits = _ref$minIntegerDigits === void 0 ? MIN_INT_DIGITS_DEFAULT : _ref$minIntegerDigits, _ref$minDecimalDigits = _ref.minDecimalDigits, minDecimalDigits = _ref$minDecimalDigits === void 0 ? MIN_DECIMAL_DIGITS_DEFAULT : _ref$minDecimalDigits, _ref$maxDecimalDigits = _ref.maxDecimalDigits, maxDecimalDigits = _ref$maxDecimalDigits === void 0 ? MAX_DECIMAL_DIGITS_DEFAULT : _ref$maxDecimalDigits, _ref$locale = _ref.locale, locale = _ref$locale === void 0 ? LOCALE_DEFAULT : _ref$locale, _ref$style = _ref.style, style = _ref$style === void 0 ? STYLE_DEFAULT : _ref$style, _ref$currency = _ref.currency, currency = _ref$currency === void 0 ? CURRENCY_DEFAULT : _ref$currency; var value = null; if (currency) { value = number.toLocaleString(locale, { minimumIntegerDigits: minIntegerDigits, minimumFractionDigits: minDecimalDigits, maximumFractionDigits: maxDecimalDigits, style: style, currency: currency }); } else { value = number.toLocaleString(locale, { minimumIntegerDigits: minIntegerDigits, minimumFractionDigits: minDecimalDigits, maximumFractionDigits: maxDecimalDigits, style: style }); } return value; }; var formattingFunctionDefault = decimalFormatterStandard; var getDefaultParamsForDecimalFormatter = function getDefaultParamsForDecimalFormatter(formatting) { var formattingOptions = formatting || {}; var formattingFunction = formattingOptions && formattingOptions.formattingFunction ? formattingOptions.formattingFunction : formattingFunctionDefault; var minIntegerDigits = formattingOptions && formattingOptions.minIntegerDigits ? formattingOptions.minIntegerDigits : MIN_INT_DIGITS_DEFAULT; var minDecimalDigits = formattingOptions && formattingOptions.minDecimalDigits ? formattingOptions.minDecimalDigits : MIN_DECIMAL_DIGITS_DEFAULT; var maxDecimalDigits = formattingOptions && formattingOptions.maxDecimalDigits ? formattingOptions.maxDecimalDigits : MAX_DECIMAL_DIGITS_DEFAULT; var locale = formattingOptions && formattingOptions.locale ? formattingOptions.locale : LOCALE_DEFAULT; var style = formattingOptions && formattingOptions.style ? formattingOptions.style : STYLE_DEFAULT; var currency = formattingOptions && formattingOptions.currency ? formattingOptions.currency : CURRENCY_DEFAULT; return { formattingFunction: formattingFunction, minIntegerDigits: minIntegerDigits, minDecimalDigits: minDecimalDigits, maxDecimalDigits: maxDecimalDigits, locale: locale, style: style, currency: currency }; }; var getWeekdayString = function getWeekdayString(weekdayNum) { var weekdayString; switch (weekdayNum) { case MONDAY: weekdayString = 'monday'; break; case TUESDAY: weekdayString = 'tuesday'; break; case WEDNESDAY: weekdayString = 'wednesday'; break; case THURSDAY: weekdayString = 'thursday'; break; case FRIDAY: weekdayString = 'friday'; break; case SATURDAY: weekdayString = 'saturday'; break; case SUNDAY: weekdayString = 'sunday'; break; default: weekdayString = 'some day'; break; } return weekdayString; }; module.exports = _objectSpread({}, appConstants, { decimalFormatterStandard: decimalFormatterStandard, formattingFunctionDefault: formattingFunctionDefault, getDefaultParamsForDecimalFormatter: getDefaultParamsForDecimalFormatter, getWeekdayString: getWeekdayString });