fix: bug related with ordering the cassettes during computation

This commit is contained in:
Sérgio Salgado 2021-10-15 16:31:38 +01:00
parent 03fc35e9d1
commit 68d5f2b998

View file

@ -105,18 +105,14 @@ function plugins (settings, deviceId) {
} }
function computeAvailableCassettes (cassettes, redeemableTxs) { function computeAvailableCassettes (cassettes, redeemableTxs) {
const orderedCassettes = _.orderBy(['denomination'], ['desc'], cassettes) if (_.isEmpty(redeemableTxs)) return cassettes
if (_.isEmpty(redeemableTxs)) return orderedCassettes
const sumTxs = (sum, tx) => { const sumTxs = (sum, tx) => {
// cash-out-helper sends 0 as fallback value, need to filter it out as there are no '0' denominations // 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 bills = _.filter(it => it.denomination > 0, tx.bills)
const sameDenominations = a => a[0]?.denomination === a[1]?.denomination const sameDenominations = a => a[0]?.denomination === a[1]?.denomination
// Order cassettes and bills to make sure they match const doDenominationsMatch = _.every(sameDenominations, _.zip(cassettes, bills))
const orderedBills = _.orderBy(['denomination'], ['desc'], bills)
const doDenominationsMatch = _.every(sameDenominations, _.zip(orderedCassettes, orderedBills))
if (!doDenominationsMatch) { if (!doDenominationsMatch) {
throw new Error('Denominations don\'t add up, cassettes were changed.') throw new Error('Denominations don\'t add up, cassettes were changed.')
@ -125,8 +121,8 @@ function plugins (settings, deviceId) {
return _.map(r => r[0] + r[1].provisioned, _.zip(sum, tx.bills)) return _.map(r => r[0] + r[1].provisioned, _.zip(sum, tx.bills))
} }
const provisioned = _.reduce(sumTxs, _.times(_.constant(0), _.size(orderedCassettes)), redeemableTxs) const provisioned = _.reduce(sumTxs, _.times(_.constant(0), _.size(cassettes)), redeemableTxs)
const zipped = _.zip(_.map('count', orderedCassettes), provisioned) const zipped = _.zip(_.map('count', cassettes), provisioned)
const counts = _.map(r => r[0] - r[1], zipped) const counts = _.map(r => r[0] - r[1], zipped)
if (_.some(_.lt(_, 0), counts)) { if (_.some(_.lt(_, 0), counts)) {
@ -136,10 +132,10 @@ function plugins (settings, deviceId) {
const computedCassettes = [] const computedCassettes = []
_.forEach(it => { _.forEach(it => {
computedCassettes.push({ computedCassettes.push({
denomination: orderedCassettes[it].denomination, denomination: cassettes[it].denomination,
count: counts[it] count: counts[it]
}) })
}, _.times(_.identity(), _.size(orderedCassettes))) }, _.times(_.identity(), _.size(cassettes)))
return computedCassettes return computedCassettes
} }