@nqminds/fin-genie-gl-reconciliator
Version:
A databot for general ledger reconciliation for FinGenie
54 lines (46 loc) • 1.9 kB
JavaScript
/* eslint-disable jsdoc/valid-types */
;
const {compact, groupBy, sumBy, uniq} = require("lodash");
const {nanoid} = require("nanoid");
const {financialRound} = require("./utils");
/**
* @typedef FormattedTransaction
* @property {string} id - unique id for transaction chain
* @property {string[]} glEntries - array of gl entry ids
* @property {string[]} cc - cost centres affected by transaction
* @property {string[]} ac - account codes affected by transaction
* @property {string[]} inv - invoice numbers associated with transaction
* @property {string[]} po - purchase order references associated with transaction
* @property {string[]} splr - suppliers associated with transaction
* @property {number[]} absBal - array of absolute balance of entries
*/
/**
* @typedef {import("./verify-transaction-complete").TransactionChain} TransactionChain
*/
/**
* Formats a transaction chain for upload to the audit transactions dataset
*
* @param {TransactionChain} transaction - a transaction chain to format
* @returns {FormattedTransaction} - transaction formatted for transactions dataset
*/
function formatTransaction(transaction) {
const byAccountCode = groupBy(transaction.glEntries, ({ac}) => ac);
const nonZeroValues = [];
for (const ac in byAccountCode) {
const total = financialRound(sumBy(byAccountCode[ac], ({bal}) => bal));
if (total) {
nonZeroValues.push(total);
}
}
return {
id: nanoid(10),
glEntries: transaction.glEntries.map(({id}) => id),
cc: uniq(transaction.glEntries.map(({cc}) => cc)),
inv: compact(uniq(transaction.glEntries.map(({inv}) => inv))),
ac: uniq(transaction.glEntries.map(({ac}) => ac)),
po: compact(uniq(transaction.glEntries.map(({po}) => po))),
splr: uniq(transaction.glEntries.map(({splr}) => splr)),
nonZeroBal: nonZeroValues,
};
}
module.exports = formatTransaction;