diff --git a/lib/cash-out/cash-out-actions.js b/lib/cash-out/cash-out-actions.js index 420e0ae9..bfe4a59c 100644 --- a/lib/cash-out/cash-out-actions.js +++ b/lib/cash-out/cash-out-actions.js @@ -40,11 +40,19 @@ function mapDispense (tx) { 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_2: bills[1].denomination, + denomination_3: bills[2].denomination, + denomination_4: bills[3].denomination } } diff --git a/lib/cash-out/cash-out-atomic.js b/lib/cash-out/cash-out-atomic.js index 25bbc184..5ea93056 100644 --- a/lib/cash-out/cash-out-atomic.js +++ b/lib/cash-out/cash-out-atomic.js @@ -112,13 +112,17 @@ function updateCassettes (t, tx) { const sql = `update devices set cassette1 = cassette1 - $1, - cassette2 = cassette2 - $2 - where device_id = $3 - returning cassette1, cassette2` + cassette2 = cassette2 - $2, + cassette3 = cassette3 - $3, + cassette4 = cassette4 - $4 + where device_id = $5 + returning cassette1, cassette2, cassette3, cassette4` const values = [ - tx.bills[0].dispensed + tx.bills[0].rejected, - tx.bills[1].dispensed + tx.bills[1].rejected, + 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 ] diff --git a/lib/cash-out/cash-out-helper.js b/lib/cash-out/cash-out-helper.js index 49adb2c2..9e8d71ca 100644 --- a/lib/cash-out/cash-out-helper.js +++ b/lib/cash-out/cash-out-helper.js @@ -37,21 +37,25 @@ function convertField (key) { function addDbBills (tx) { const bills = tx.bills + console.log('tx', tx) if (_.isEmpty(bills)) return tx - return _.assign(tx, { - provisioned1: bills[0].provisioned, - provisioned2: bills[1].provisioned, - provisioned3: bills[2].provisioned, - provisioned4: bills[3].provisioned, - denomination1: bills[0].denomination, - denomination2: bills[1].denomination, - denomination3: bills[2].denomination, - denomination4: bills[3].denomination - }) + const billsObj = { + provisioned1: bills[0]?.provisioned ?? 0, + provisioned2: bills[1]?.provisioned ?? 0, + provisioned3: bills[2]?.provisioned ?? 0, + provisioned4: bills[3]?.provisioned ?? 0, + denomination1: bills[0]?.denomination ?? 0, + denomination2: bills[1]?.denomination ?? 0, + denomination3: bills[2]?.denomination ?? 0, + denomination4: bills[3]?.denomination ?? 0 + } + + return _.assign(tx, billsObj) } function toDb (tx) { + console.log('tx1', tx) const massager = _.flow(convertBigNumFields, addDbBills, _.omit(['direction', 'bills']), _.mapKeys(convertField)) diff --git a/lib/cash-out/cash-out-tx.js b/lib/cash-out/cash-out-tx.js index c83c1dc7..a52d8534 100644 --- a/lib/cash-out/cash-out-tx.js +++ b/lib/cash-out/cash-out-tx.js @@ -72,14 +72,22 @@ function postProcess (txVector, justAuthorized, pi) { .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 = { provisioned_1: provisioned1, provisioned_2: provisioned2, + provisioned_3: provisioned3, + provisioned_4: provisioned4, denomination_1: denomination1, - denomination_2: denomination2 + denomination_2: denomination2, + denomination_3: denomination3, + denomination_4: denomination4 } return cashOutActions.logAction(db, 'provisionNotes', rec, newTx) diff --git a/lib/plugins.js b/lib/plugins.js index 85e74d85..28a18ee9 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -109,12 +109,12 @@ function plugins (settings, deviceId) { if (_.isEmpty(redeemableTxs)) return orderedCassettes const sumTxs = (sum, tx) => { - const bills = tx.bills - const sameDenominations = a => a[0].denomination === a[1].denomination + // cash-out-helper sends 0 as fallback value, need to filter it out as there are no '0' denominations + const bills = _.filter(it => it.denomination > 0, tx.bills) + const sameDenominations = a => a[0]?.denomination === a[1]?.denomination // Order cassettes and bills to make sure they match const orderedBills = _.orderBy(['denomination'], ['desc'], bills) - console.log('orderedBills', orderedBills) const doDenominationsMatch = _.every(sameDenominations, _.zip(orderedCassettes, orderedBills)) @@ -133,24 +133,15 @@ function plugins (settings, deviceId) { throw new Error('Negative note count: %j', counts) } - return [ - { - denomination: orderedCassettes[0].denomination, - count: counts[0] - }, - { - denomination: orderedCassettes[1].denomination, - count: counts[1] - }, - { - denomination: orderedCassettes[2].denomination, - count: counts[2] - }, - { - denomination: orderedCassettes[3].denomination, - count: counts[3] - } - ] + const computedCassettes = [] + _.forEach(it => { + computedCassettes.push({ + denomination: orderedCassettes[it].denomination, + count: counts[it] + }) + }, _.times(_.identity(), _.size(orderedCassettes))) + + return computedCassettes } function buildAvailableCassettes (excludeTxId) { @@ -158,36 +149,32 @@ function plugins (settings, deviceId) { if (!cashOutConfig.active) return Promise.resolve() - const denominations = [cashOutConfig.cassette1, cashOutConfig.cassette2, cashOutConfig.cassette3, cashOutConfig.cassette4] - - const virtualCassettes = [Math.max(...denominations) * 2] - return Promise.all([dbm.cassetteCounts(deviceId), cashOutHelper.redeemableTxs(deviceId, excludeTxId)]) .then(([rec, _redeemableTxs]) => { const redeemableTxs = _.reject(_.matchesProperty('id', excludeTxId), _redeemableTxs) + const denominations = [] + _.forEach(it => { + denominations.push(cashOutConfig[`cassette${it + 1}`]) + }, _.times(_.identity(), rec.numberOfCassettes)) + + const virtualCassettes = [Math.max(...denominations) * 2] + const counts = argv.cassettes ? argv.cassettes.split(',') : rec.counts - const cassettes = [ - { - denomination: parseInt(denominations[0], 10), - count: parseInt(counts[0], 10) - }, - { - denomination: parseInt(denominations[1], 10), - count: parseInt(counts[1], 10) - }, - { - denomination: parseInt(denominations[2], 10), - count: parseInt(counts[2], 10) - }, - { - denomination: parseInt(denominations[3], 10), - count: parseInt(counts[3], 10) - } - ] + if (rec.counts.length !== denominations.length) { + throw new Error('Denominations and respective counts do not match!') + } + + const cassettes = [] + _.forEach(it => { + cassettes.push({ + denomination: parseInt(denominations[it], 10), + count: parseInt(counts[it], 10) + }) + }, _.times(_.identity(), rec.numberOfCassettes)) try { return { @@ -267,8 +254,6 @@ function plugins (settings, deviceId) { const coinsWithoutRate = _.map(mapCoinSettings, coinParams) const areThereAvailablePromoCodes = arr[arr.length - 1] > 0 - console.log('cassettes', cassettes) - return { cassettes, rates: buildRates(tickers), diff --git a/lib/postgresql_interface.js b/lib/postgresql_interface.js index 864dc44a..1ae15ae1 100644 --- a/lib/postgresql_interface.js +++ b/lib/postgresql_interface.js @@ -26,13 +26,17 @@ exports.recordDeviceEvent = function recordDeviceEvent (deviceId, event) { } exports.cassetteCounts = function cassetteCounts (deviceId) { - const sql = 'SELECT cassette1, cassette2, cassette3, cassette4 FROM devices ' + + const sql = 'SELECT cassette1, cassette2, cassette3, cassette4, number_of_cassettes FROM devices ' + 'WHERE device_id=$1' return db.one(sql, [deviceId]) .then(row => { - const counts = [row.cassette1, row.cassette2, row.cassette3, row.cassette4] - return {counts} + const counts = [] + _.forEach(it => { + counts.push(row[`cassette${it + 1}`]) + }, _.times(_.identity(), row.number_of_cassettes)) + + return { numberOfCassettes: row.number_of_cassettes, counts } }) } diff --git a/migrations/1630432869178-add-more-cassette-support.js b/migrations/1630432869178-add-more-cassette-support.js index efd2e721..d1268057 100644 --- a/migrations/1630432869178-add-more-cassette-support.js +++ b/migrations/1630432869178-add-more-cassette-support.js @@ -11,6 +11,14 @@ exports.up = function (next) { 'ALTER TABLE cash_out_txs ADD COLUMN provisioned_4 INTEGER', 'ALTER TABLE cash_out_txs ADD COLUMN denomination_3 INTEGER', 'ALTER TABLE cash_out_txs ADD COLUMN denomination_4 INTEGER', + 'ALTER TABLE cash_out_actions ADD COLUMN provisioned_3 INTEGER', + 'ALTER TABLE cash_out_actions ADD COLUMN provisioned_4 INTEGER', + 'ALTER TABLE cash_out_actions ADD COLUMN dispensed_3 INTEGER', + 'ALTER TABLE cash_out_actions ADD COLUMN dispensed_4 INTEGER', + 'ALTER TABLE cash_out_actions ADD COLUMN rejected_3 INTEGER', + 'ALTER TABLE cash_out_actions ADD COLUMN rejected_4 INTEGER', + 'ALTER TABLE cash_out_actions ADD COLUMN denomination_3 INTEGER', + 'ALTER TABLE cash_out_actions ADD COLUMN denomination_4 INTEGER', 'ALTER TABLE devices ADD COLUMN number_of_cassettes INTEGER NOT NULL DEFAULT 2' ]