actual/packages/loot-core/src/server/accounts/qif2json.js
2022-04-28 22:44:38 -04:00

87 lines
2.2 KiB
JavaScript

export default function parse(qif, options) {
var lines = qif.split('\n'),
line = lines.shift(),
type = /!Type:([^$]*)$/.exec(line.trim()),
data = {},
transactions = (data.transactions = []),
transaction = {};
options = options || {};
if (!type || !type.length) {
throw new Error('File does not appear to be a valid qif file: ' + line);
}
data.type = type[1];
var division = {};
while ((line = lines.shift())) {
line = line.trim();
if (line === '^') {
transactions.push(transaction);
transaction = {};
continue;
}
switch (line[0]) {
case 'D':
transaction.date = line.substring(1);
break;
case 'T':
transaction.amount = line.substring(1);
break;
case 'N':
transaction.number = line.substring(1);
break;
case 'M':
transaction.memo = line.substring(1);
break;
case 'A':
transaction.address = (transaction.address || []).concat(
line.substring(1)
);
break;
case 'P':
transaction.payee = line.substring(1).replace(/&/g, '&');
break;
case 'L':
var lArray = line.substring(1).split(':');
transaction.category = lArray[0];
if (lArray[1] !== undefined) {
transaction.subcategory = lArray[1];
}
break;
case 'C':
transaction.clearedStatus = line.substring(1);
break;
case 'S':
var sArray = line.substring(1).split(':');
division.category = sArray[0];
if (sArray[1] !== undefined) {
division.subcategory = sArray[1];
}
break;
case 'E':
division.description = line.substring(1);
break;
case '$':
division.amount = parseFloat(line.substring(1));
if (!(transaction.division instanceof Array)) {
transaction.division = [];
}
transaction.division.push(division);
division = {};
break;
default:
throw new Error('Unknown Detail Code: ' + line[0]);
}
}
if (Object.keys(transaction).length) {
transactions.push(transaction);
}
data.dateFormat = options.dateFormat;
return data;
}