Skip to content

Instantly share code, notes, and snippets.

@shakked
Created August 24, 2020 15:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shakked/9ff3f50901ced2bed59756c2f79c69e8 to your computer and use it in GitHub Desktop.
Save shakked/9ff3f50901ced2bed59756c2f79c69e8 to your computer and use it in GitHub Desktop.
Parses Profit and Loss data from the Quickbooks API
const moment = require('moment');
module.exports = (json, granularity) => {
let startDate = moment(json["Header"]["StartPeriod"], 'YYYY-MM-DD');
const endDate = json["Header"]["EndPeriod"];
const columns = json["Columns"]["Column"].map(col => {
const title = col["ColTitle"];
const type = col["ColType"];
const metadata = col["MetaData"];
return {
title: title,
type: type,
metadata: metadata
}
});
const rows = json["Rows"]["Row"].map(row => {
const summary = row["Summary"];
const group = row["group"];
const values = summary["ColData"].map(a => a["value"]);
const subrows = row["Rows"];
return {
group,
values,
subrows
}
});
let data = [];
for (let i = 1; i < columns.length; ++i) {
const dateString = columns[i].title;
data.push({ Date: startDate.toDate() });
startDate.startOf(granularity).add(1, granularity);
}
for (let i = 0; i < rows.length; ++i) {
const row = rows[i];
const metric = row.group;
const values = row.values;
for (let j = 1; j < row.values.length; ++j) {
const value = values[j];
data[j - 1][metric] = parseNumber(value);
}
const hasSubrows = row.subrows !== undefined && row.subrows !== null;
if (hasSubrows) {
const subrows = row.subrows.Row;
for (let j = 0; j < subrows.length; ++j) {
const subrow = subrows[j];
if (!subrow["ColData"]) {
const subsubrow = subrow["Rows"]["Row"][0];
const subrowTitle = subsubrow["ColData"][0].value;
for (let k = 1; k < subsubrow["ColData"].length; ++k) {
data[k - 1][subrowTitle] = parseNumber(subsubrow["ColData"][k].value);
}
break;
}
const subrowTitle = subrow["ColData"][0].value;
for (let k = 1; k < subrow["ColData"].length; ++k) {
data[k - 1][subrowTitle] = parseNumber(subrow["ColData"][k].value);
}
}
}
}
const total = data.pop();
return {
total,
data,
};
}
function parseNumber(val) {
const num = parseFloat(val);
if (isNaN(num)) {
return 0.0;
}
return num;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment