From 96fa94fde6f792b50529ac7605c3b410ef2e0b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Salgado?= Date: Mon, 6 Sep 2021 19:21:57 +0100 Subject: [PATCH] fix: backend dynamic bill array usage --- lib/bill-math.js | 6 ++++-- lib/cash-out/cash-out-actions.js | 28 ++++++++++------------------ lib/cash-out/cash-out-atomic.js | 30 +++++++++++++++++------------- lib/cash-out/cash-out-helper.js | 8 +++++--- lib/cash-out/cash-out-tx.js | 23 +++++------------------ 5 files changed, 41 insertions(+), 54 deletions(-) diff --git a/lib/bill-math.js b/lib/bill-math.js index 132be98e..72e26174 100644 --- a/lib/bill-math.js +++ b/lib/bill-math.js @@ -16,6 +16,8 @@ exports.makeChange = function makeChange (cassettes, amount) { })) const amountNum = amount.toNumber() + console.log('cassettes', cassettes) + const sortedCassettes = _.orderBy(cassetteMap, ['denomination'], ['desc']) const finalDist = [] @@ -25,7 +27,7 @@ exports.makeChange = function makeChange (cassettes, amount) { while(mutableAmount >= 0) { _.each(sortedCassettes, it => { if (mutableAmount === 0) { - finalDist.push({provisioned: 0, denomination: it.denomination, id: uuid.v4()}) + finalDist.push({ provisioned: 0, denomination: it.denomination, id: uuid.v4() }) return } @@ -34,7 +36,7 @@ exports.makeChange = function makeChange (cassettes, amount) { const numberOfBills = amountToSub / it.denomination mutableAmount -= amountToSub - finalDist.push({provisioned: numberOfBills, denomination: it.denomination, id: uuid.v4()}) + finalDist.push({ provisioned: numberOfBills, denomination: it.denomination, id: uuid.v4() }) return }) diff --git a/lib/cash-out/cash-out-actions.js b/lib/cash-out/cash-out-actions.js index bfe4a59c..bae631fb 100644 --- a/lib/cash-out/cash-out-actions.js +++ b/lib/cash-out/cash-out-actions.js @@ -37,22 +37,14 @@ function mapDispense (tx) { if (_.isEmpty(bills)) return {} - return { - provisioned_1: bills[0].provisioned, - provisioned_2: bills[1].provisioned, - provisioned_3: bills[2].provisioned, - provisioned_4: bills[3].provisioned, - dispensed_1: bills[0].dispensed, - dispensed_2: bills[1].dispensed, - dispensed_3: bills[2].dispensed, - dispensed_4: bills[3].dispensed, - rejected_1: bills[0].rejected, - rejected_2: bills[1].rejected, - rejected_3: bills[2].rejected, - rejected_4: bills[3].rejected, - denomination_1: bills[0].denomination, - denomination_2: bills[1].denomination, - denomination_3: bills[2].denomination, - denomination_4: bills[3].denomination - } + const res = {} + + _.forEach(it => { + res[`provisioned_${it + 1}`] = bills[it].provisioned + res[`denomination_${it + 1}`] = bills[it].denomination + res[`dispensed_${it + 1}`] = bills[it].dispensed + res[`rejected_${it + 1}`] = bills[it].rejected + }, _.times(_.identity(), _.size(bills))) + + return res } diff --git a/lib/cash-out/cash-out-atomic.js b/lib/cash-out/cash-out-atomic.js index 5ea93056..2fb772a7 100644 --- a/lib/cash-out/cash-out-atomic.js +++ b/lib/cash-out/cash-out-atomic.js @@ -111,20 +111,24 @@ function updateCassettes (t, tx) { if (!dispenseOccurred(tx.bills)) return Promise.resolve() const sql = `update devices set - cassette1 = cassette1 - $1, - cassette2 = cassette2 - $2, - cassette3 = cassette3 - $3, - cassette4 = cassette4 - $4 - where device_id = $5 - returning cassette1, cassette2, cassette3, cassette4` + ${_.size(tx.bills) > 0 ? `cassette1 = cassette1 - $1` : ``} + ${_.size(tx.bills) > 1 ? `, cassette2 = cassette2 - $2` : ``} + ${_.size(tx.bills) > 2 ? `, cassette3 = cassette3 - $3` : ``} + ${_.size(tx.bills) > 3 ? `, cassette4 = cassette4 - $4` : ``} + where device_id = $${_.size(tx.bills) + 1} + returning + ${_.size(tx.bills) > 0 ? `cassette1` : ``} + ${_.size(tx.bills) > 1 ? `, cassette2`: ``} + ${_.size(tx.bills) > 2 ? `, cassette3` : ``} + ${_.size(tx.bills) > 3 ? `, cassette4` : ``}` - const values = [ - tx.bills[0]?.dispensed ?? 0 + tx.bills[0]?.rejected ?? 0, - tx.bills[1]?.dispensed ?? 0 + tx.bills[1]?.rejected ?? 0, - tx.bills[2]?.dispensed ?? 0 + tx.bills[2]?.rejected ?? 0, - tx.bills[3]?.dispensed ?? 0 + tx.bills[3]?.rejected ?? 0, - tx.deviceId - ] + const values = [] + + _.forEach(it => values.push( + tx.bills[it].dispensed + tx.bills[it].rejected + ), _.times(_.identity(), _.size(tx.bills))) + + values.push(tx.deviceId) return t.one(sql, values) .then(r => socket.emit(_.assign(r, {op: 'cassetteUpdate', deviceId: tx.deviceId}))) diff --git a/lib/cash-out/cash-out-helper.js b/lib/cash-out/cash-out-helper.js index 9e8d71ca..aecb0eb9 100644 --- a/lib/cash-out/cash-out-helper.js +++ b/lib/cash-out/cash-out-helper.js @@ -37,7 +37,6 @@ function convertField (key) { function addDbBills (tx) { const bills = tx.bills - console.log('tx', tx) if (_.isEmpty(bills)) return tx const billsObj = { @@ -55,7 +54,6 @@ function addDbBills (tx) { } function toDb (tx) { - console.log('tx1', tx) const massager = _.flow(convertBigNumFields, addDbBills, _.omit(['direction', 'bills']), _.mapKeys(convertField)) @@ -89,7 +87,7 @@ function toObj (row) { if (_.every(_.isNil, _.at(billFields, newObj))) return newObj if (_.some(_.isNil, _.at(billFields, newObj))) throw new Error('Missing cassette values') - const bills = [ + const billFieldsArr = [ { denomination: newObj.denomination1, provisioned: newObj.provisioned1 @@ -108,6 +106,10 @@ function toObj (row) { } ] + // There can't be bills with denomination === 0. + // If a bill has denomination === 0, then that cassette is not set and should be filtered out. + const bills = _.filter(it => it.denomination > 0, billFieldsArr) + return _.set('bills', bills, _.omit(billFields, newObj)) } diff --git a/lib/cash-out/cash-out-tx.js b/lib/cash-out/cash-out-tx.js index a52d8534..e4016fa3 100644 --- a/lib/cash-out/cash-out-tx.js +++ b/lib/cash-out/cash-out-tx.js @@ -70,25 +70,12 @@ function postProcess (txVector, justAuthorized, pi) { return bills }) .then(bills => { - const provisioned1 = bills[0].provisioned - const provisioned2 = bills[1].provisioned - const provisioned3 = bills[2].provisioned - const provisioned4 = bills[3].provisioned - const denomination1 = bills[0].denomination - const denomination2 = bills[1].denomination - const denomination3 = bills[2].denomination - const denomination4 = bills[3].denomination + const rec = {} - const rec = { - provisioned_1: provisioned1, - provisioned_2: provisioned2, - provisioned_3: provisioned3, - provisioned_4: provisioned4, - denomination_1: denomination1, - denomination_2: denomination2, - denomination_3: denomination3, - denomination_4: denomination4 - } + _.forEach(it => { + rec[`provisioned_${it + 1}`] = bills[it].provisioned + rec[`denomination_${it + 1}`] = bills[it].denomination + }, _.times(_.identity(), _.size(bills))) return cashOutActions.logAction(db, 'provisionNotes', rec, newTx) .then(_.constant({bills}))