@nqminds/fin-genie-audit-period
Version:
A databot for extracting an audit's period for FinGenie
72 lines (59 loc) • 2.13 kB
JavaScript
;
const FinGenieDatabot = require("@nqminds/fin-genie-databot");
const split = require("split");
const dayjs = require("dayjs");
const periodPipeline = require("./period-pipeline");
class AuditPeriod extends FinGenieDatabot {
constructor(input, output, context) {
super(input, output, context);
}
async main() {
try {
const glDatasetId = this.getDatasetId("generalLedger", this.input.auditId);
this.stage = "Getting aggregated general ledger data";
const [{min, max}] = await this.getAggregatedData(glDatasetId, periodPipeline);
const settings = {
"setting": "period",
"value": {
min: this.formatDate(min),
max: this.formatDate(max),
},
"overrideId": this.input.auditId,
};
this.stage = "extract org id";
const resource = await this.api.getResource(this.input.auditId);
const orgId = resource.parents[0];
this.stage = `updating ${orgId} settings`;
const settingsDatasetId = this.getDatasetId("organisationSettings", orgId);
await this.api.updateData(settingsDatasetId, settings, true);
return Promise.resolve();
} catch (err) {
await this.reportBug(err);
this.output.result({error: err, stage: this.stage});
return Promise.resolve();
}
}
formatDate(milliseconds) {
return dayjs(milliseconds).format("MMM YY");
}
async getAggregatedData(glDatasetId, pipeline) {
const {body: dataStream} = await this.api.getAggregateDataStream(
glDatasetId, pipeline, true,
);
return new Promise((resolve, reject) => {
const data = [];
dataStream.pipe(split(JSON.parse, null, {trailing: true}))
.on("data", async(document) => data.push(document))
.on("end", () => resolve(data))
.on("error", (err) => {
// TDX sends a new line even if the dataset is empty
if (err.message === "Unexpected end of JSON input" && data.length === 0) {
resolve(data);
} else {
reject(err);
}
});
});
}
}
module.exports = AuditPeriod;