feat: makeChange function supporting multiple cassettes

This commit is contained in:
Sérgio Salgado 2021-09-01 16:22:52 +01:00
parent 575235283a
commit 0a3b78f75e
3 changed files with 60 additions and 31 deletions

View file

@ -105,19 +105,18 @@ function plugins (settings, deviceId) {
}
function computeAvailableCassettes (cassettes, redeemableTxs) {
if (_.isEmpty(redeemableTxs)) return cassettes
const orderedCassettes = _.orderBy(['denomination'], ['desc'], cassettes)
if (_.isEmpty(redeemableTxs)) return orderedCassettes
const sumTxs = (sum, tx) => {
const bills = tx.bills
const sameDenominations = a => a[0].denomination === a[1].denomination
console.log('tx', tx)
console.log('cassettes', cassettes)
console.log('bills', bills)
const doDenominationsMatch = _.every(it => {
console.log('it', it)
return sameDenominations(it)
}, _.zip(cassettes, bills))
// 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))
if (!doDenominationsMatch) {
throw new Error('Denominations don\'t add up, cassettes were changed.')
@ -126,8 +125,8 @@ function plugins (settings, deviceId) {
return _.map(r => r[0] + r[1].provisioned, _.zip(sum, tx.bills))
}
const provisioned = _.reduce(sumTxs, Array(_.size(cassettes)).fill(0), redeemableTxs)
const zipped = _.zip(_.map('count', cassettes), provisioned)
const provisioned = _.reduce(sumTxs, Array(_.size(orderedCassettes)).fill(0), redeemableTxs)
const zipped = _.zip(_.map('count', orderedCassettes), provisioned)
const counts = _.map(r => r[0] - r[1], zipped)
if (_.some(_.lt(_, 0), counts)) {
@ -136,12 +135,20 @@ function plugins (settings, deviceId) {
return [
{
denomination: cassettes[0].denomination,
denomination: orderedCassettes[0].denomination,
count: counts[0]
},
{
denomination: cassettes[1].denomination,
denomination: orderedCassettes[1].denomination,
count: counts[1]
},
{
denomination: orderedCassettes[2].denomination,
count: counts[2]
},
{
denomination: orderedCassettes[3].denomination,
count: counts[3]
}
]
}