UNPKG

ynab-api-importer

Version:

Import bank transactions into YNAB

98 lines 7.13 kB
"use strict"; /// <reference path="./types/ofx-js.d.ts" /> var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ofxToSaveTransactions = exports.importID = exports.amountFromString = void 0; const ofx_js_1 = require("ofx-js"); const luxon_1 = require("luxon"); const O = __importStar(require("fp-ts/Option")); const F = __importStar(require("fp-ts/function")); const padDecimals = (input) => input.length < 2 ? padDecimals(input + "0") : input; const amountFromString = (input) => { const split = input.split("."); const int = split[0]; const decimals = F.pipe(O.fromNullable(split[1]), O.map(padDecimals), O.getOrElse(() => "00")); return +`${int}${decimals}0`; }; exports.amountFromString = amountFromString; const importID = () => { const counters = new Map(); return (date, amount) => { const prefix = `YNAB:${amount}:${date.toISODate()}`; if (counters.has(prefix)) { const count = counters.get(prefix); counters.set(prefix, count + 1); } else { counters.set(prefix, 1); } return `${prefix}:${counters.get(prefix)}`; }; }; exports.importID = importID; async function ofxToSaveTransactions(input, ynabAccountID) { const res = await (0, ofx_js_1.parse)(input); const counters = {}; function getImportID(date, amount) { const prefix = `YNAB:${amount}:${date}`; if (!counters[prefix]) { counters[prefix] = 1; } else { counters[prefix]++; } return `${prefix}:${counters[prefix]}`; } let transactionList; if (res.OFX.BANKMSGSRSV1) { transactionList = res.OFX.BANKMSGSRSV1.STMTTRNRS.STMTRS.BANKTRANLIST.STMTTRN; } else if (res.OFX.CREDITCARDMSGSRSV1) { transactionList = res.OFX.CREDITCARDMSGSRSV1.CCSTMTTRNRS.CCSTMTRS.BANKTRANLIST.STMTTRN; } else { return []; } if (!Array.isArray(transactionList)) { transactionList = [transactionList]; } return transactionList.map((trans) => { const amount = +(trans.TRNAMT.replace(".", "") + "0"); const parsedDate = luxon_1.DateTime.fromFormat(trans.DTPOSTED, "yyyyMMdd"); const date = parsedDate.toFormat("yyyy-MM-dd"); return { account_id: ynabAccountID, amount, date, import_id: getImportID(date, amount), memo: trans.MEMO, payee_name: trans.NAME, }; }); } exports.ofxToSaveTransactions = ofxToSaveTransactions; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW5hYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy95bmFiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw0Q0FBNEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTVDLG1DQUErRDtBQUUvRCxpQ0FBaUM7QUFDakMsZ0RBQWtDO0FBQ2xDLGtEQUFvQztBQUVwQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQzVDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFFL0MsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQ2hELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ3JCLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3hCLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQ3hCLENBQUM7SUFFRixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBVlcsUUFBQSxnQkFBZ0Isb0JBVTNCO0FBRUssTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRTNDLE9BQU8sQ0FBQyxJQUFjLEVBQUUsTUFBYyxFQUFFLEVBQUU7UUFDeEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxNQUFNLElBQUksSUFBSSxD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