87 lines
2.2 KiB
JavaScript
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;
|
|
}
|