ynab-api-importer
Version:
Import bank transactions into YNAB
98 lines • 7.13 kB
JavaScript
;
/// <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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW5hYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy95bmFiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw0Q0FBNEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTVDLG1DQUErRDtBQUUvRCxpQ0FBaUM7QUFDakMsZ0RBQWtDO0FBQ2xDLGtEQUFvQztBQUVwQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQzVDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFFL0MsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQ2hELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ3JCLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3hCLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQ3hCLENBQUM7SUFFRixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxHQUFHLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBVlcsUUFBQSxnQkFBZ0Isb0JBVTNCO0FBRUssTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRTNDLE9BQU8sQ0FBQyxJQUFjLEVBQUUsTUFBYyxFQUFFLEVBQUU7UUFDeEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFFcEQsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFFLENBQUM7WUFDcEMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2pDO2FBQU07WUFDTCxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU8sR0FBRyxNQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQWZXLFFBQUEsUUFBUSxZQWVuQjtBQUVLLEtBQUssVUFBVSxxQkFBcUIsQ0FDekMsS0FBYSxFQUNiLGFBQXFCO0lBRXJCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxjQUFLLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsTUFBTSxRQUFRLEdBQWdDLEVBQUUsQ0FBQztJQUVqRCxTQUFTLFdBQVcsQ0FBQyxJQUFZLEVBQUUsTUFBYztRQUMvQyxNQUFNLE1BQU0sR0FBRyxRQUFRLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUV4QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3JCLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEI7YUFBTTtZQUNMLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1NBQ3BCO1FBRUQsT0FBTyxHQUFHLE1BQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxlQUFnRCxDQUFDO0lBQ3JELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUU7UUFDeEIsZUFBZTtZQUNiLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztLQUM5RDtTQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRTtRQUNyQyxlQUFlO1lBQ2IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7S0FDeEU7U0FBTTtRQUNMLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUNuQyxlQUFlLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUNyQztJQUVELE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FDeEIsQ0FBQyxLQUFLLEVBQW1CLEVBQUU7UUFDekIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxnQkFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFL0MsT0FBTztZQUNMLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLE1BQU07WUFDTixJQUFJO1lBQ0osU0FBUyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1lBQ3BDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUk7U0FDdkIsQ0FBQztJQUNKLENBQUMsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQWxERCxzREFrREMifQ==