UNPKG

@nqminds/fin-genie-gl-reconciliator

Version:

A databot for general ledger reconciliation for FinGenie

54 lines (46 loc) 1.9 kB
/* eslint-disable jsdoc/valid-types */ "use strict"; 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;