refactor: simplify computeAvailableCassettes similarly to computeAvailableRecyclers

This commit is contained in:
siiky 2023-10-23 10:51:03 +01:00
parent ca706c24a9
commit be63cd6ccb

View file

@ -112,38 +112,30 @@ function plugins (settings, deviceId) {
function computeAvailableCassettes (cassettes, redeemableTxs) { function computeAvailableCassettes (cassettes, redeemableTxs) {
if (_.isEmpty(redeemableTxs)) return cassettes if (_.isEmpty(redeemableTxs)) return cassettes
const sumTxs = (sum, tx) => { const accountProvisioned = (cassettes, 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 => _.includes('cassette', it.name) && it.denomination > 0, tx.bills) const cassettesBills = _.flow(
const sameDenominations = a => a[0]?.denomination === a[1]?.denomination _.get(['bills']),
_.filter(it => _.includes('cassette', it.name) && it.denomination > 0)
_.zip(cassettes)
)(tx)
const doDenominationsMatch = _.every(sameDenominations, _.zip(cassettes, bills)) const sameDenominations = ([cassette, bill]) => cassette?.denomination === bill?.denomination
if (!_.every(sameDenominations, cassettesBills))
if (!doDenominationsMatch) {
throw new Error('Denominations don\'t add up, cassettes were changed.') throw new Error('Denominations don\'t add up, cassettes were changed.')
return _.map(
([cassette, { provisioned }]) => _.set('count', cassette.count - provisioned, cassette),
cassettesBills
)
} }
return _.map(r => r[0] + r[1].provisioned, _.zip(sum, tx.bills)) cassettes = _.reduce(accountProvisioned, cassettes, redeemableTxs)
}
const provisioned = _.reduce(sumTxs, _.times(_.constant(0), _.size(cassettes)), redeemableTxs) if (_.some(({ count }) => count < 0, cassettes))
const zipped = _.zip(_.map('count', cassettes), provisioned)
const counts = _.map(r => r[0] - r[1], zipped)
if (_.some(_.lt(_, 0), counts)) {
throw new Error('Negative note count: %j', counts) throw new Error('Negative note count: %j', counts)
}
const computedCassettes = [] return cassettes
_.forEach(it => {
computedCassettes.push({
name: cassettes[it].name,
denomination: cassettes[it].denomination,
count: counts[it]
})
}, _.times(_.identity(), _.size(cassettes)))
return computedCassettes
} }
function computeAvailableRecyclers (recyclers, redeemableTxs) { function computeAvailableRecyclers (recyclers, redeemableTxs) {