From 104f9061f9601ed380e472b6eb52df04f4fd7095 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:06:57 +0100 Subject: [PATCH 01/16] refactor: destruct recycler object --- lib/plugins.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 6b81f158..dc04615b 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -236,19 +236,17 @@ function plugins (settings, deviceId) { if (!cashOutConfig.active) return Promise.resolve() return Promise.all([dbm.recyclerCounts(deviceId), cashOutHelper.redeemableTxs(deviceId, excludeTxId)]) - .then(([_recyclers, _redeemableTxs]) => { + .then(([{ counts, numberOfRecyclers }, _redeemableTxs]) => { const redeemableTxs = _.reject(_.matchesProperty('id', excludeTxId), _redeemableTxs) const denominations = [] _.forEach(it => { denominations.push(cashOutConfig[`recycler${it + 1}`]) - }, _.times(_.identity(), _recyclers.numberOfRecyclers)) + }, _.times(_.identity(), numberOfRecyclers)) const virtualRecyclers = denominations.length ? [Math.max(..._.flatten(denominations)) * 2] : [] - const counts = _recyclers.counts - if (counts.length !== denominations.length) { throw new Error('Denominations and respective counts do not match!') } @@ -261,7 +259,7 @@ function plugins (settings, deviceId) { denomination: parseInt(denominations[it], 10), count: parseInt(counts[it], 10) }) - }, _.times(_.identity(), _recyclers.numberOfRecyclers)) + }, _.times(_.identity(), numberOfRecyclers)) try { return { From ef3ba710ff74b1ce5db70ddcea9fed2787260d1e Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:08:14 +0100 Subject: [PATCH 02/16] refactor: declutter unnecessary variables --- lib/plugins.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index dc04615b..6f799acf 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -236,8 +236,8 @@ function plugins (settings, deviceId) { if (!cashOutConfig.active) return Promise.resolve() return Promise.all([dbm.recyclerCounts(deviceId), cashOutHelper.redeemableTxs(deviceId, excludeTxId)]) - .then(([{ counts, numberOfRecyclers }, _redeemableTxs]) => { - const redeemableTxs = _.reject(_.matchesProperty('id', excludeTxId), _redeemableTxs) + .then(([{ counts, numberOfRecyclers }, redeemableTxs]) => { + redeemableTxs = _.reject(_.matchesProperty('id', excludeTxId), redeemableTxs) const denominations = [] From 491031a1b524e01ac3f98e495b52d177978f7082 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:10:08 +0100 Subject: [PATCH 03/16] refactor: map instead of pushing --- lib/plugins.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 6f799acf..50442334 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -239,11 +239,10 @@ function plugins (settings, deviceId) { .then(([{ counts, numberOfRecyclers }, redeemableTxs]) => { redeemableTxs = _.reject(_.matchesProperty('id', excludeTxId), redeemableTxs) - const denominations = [] - - _.forEach(it => { - denominations.push(cashOutConfig[`recycler${it + 1}`]) - }, _.times(_.identity(), numberOfRecyclers)) + const denominations = _.map( + it => cashOutConfig[`recycler${it}`], + _.range(1, numberOfRecyclers+1) + ) const virtualRecyclers = denominations.length ? [Math.max(..._.flatten(denominations)) * 2] : [] From dd6bb6a8d3262a729a917ec7b10f5f3e13a79fe7 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:12:07 +0100 Subject: [PATCH 04/16] refactor: map instead of pushing --- lib/plugins.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 50442334..60fd51d4 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -250,15 +250,15 @@ function plugins (settings, deviceId) { throw new Error('Denominations and respective counts do not match!') } - const recyclers = [] - _.forEach(it => { - recyclers.push({ + const recyclers = _.map( + it => ({ number: it + 1, name: `recycler${it + 1}`, denomination: parseInt(denominations[it], 10), count: parseInt(counts[it], 10) - }) - }, _.times(_.identity(), numberOfRecyclers)) + }), + _.range(0, numberOfRecyclers) + ) try { return { From 23eadc171750fb7a7b86a474310fcf78a426e422 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:19:07 +0100 Subject: [PATCH 05/16] refactor: use destructuring instead of indexing --- lib/plugins.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 60fd51d4..df97d8d7 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -152,11 +152,9 @@ function plugins (settings, deviceId) { const sumTxs = (sum, tx) => { // cash-out-helper sends 0 as fallback value, need to filter it out as there are no '0' denominations const bills = _.filter(it => _.includes('recycler', it.name) && it.denomination > 0, tx.bills) - const sameDenominations = a => a[0]?.denomination === a[1]?.denomination - const doDenominationsMatch = _.every(sameDenominations, _.zip(recyclers, bills)) - - if (!doDenominationsMatch) { + const sameDenominations = ([recycler, bill]) => recycler?.denomination === bill?.denomination + if (!_.every(sameDenominations, _.zip(recyclers, bills))) { throw new Error('Denominations don\'t add up, recyclers were changed.') } From 738f4f5b13f60db9b9fdc36a9baa2af13ab4af11 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:19:26 +0100 Subject: [PATCH 06/16] refactor: use destructuring instead of indexing --- lib/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins.js b/lib/plugins.js index df97d8d7..315d8dfe 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -158,7 +158,7 @@ function plugins (settings, deviceId) { throw new Error('Denominations don\'t add up, recyclers were changed.') } - return _.map(r => r[0] + r[1].provisioned, _.zip(sum, tx.bills)) + return _.map(([acc, bill]) => acc + bill.provisioned, _.zip(sum, bills)) } const provisioned = _.reduce(sumTxs, _.times(_.constant(0), _.size(recyclers)), redeemableTxs) From bec0ec4ee629847ced411161ee507b8b26f35a49 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:21:21 +0100 Subject: [PATCH 07/16] refactor: map array of recyclers directly --- lib/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins.js b/lib/plugins.js index 315d8dfe..43eb8b45 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -161,7 +161,7 @@ function plugins (settings, deviceId) { return _.map(([acc, bill]) => acc + bill.provisioned, _.zip(sum, bills)) } - const provisioned = _.reduce(sumTxs, _.times(_.constant(0), _.size(recyclers)), redeemableTxs) + const provisioned = _.reduce(sumTxs, _.map(_.constant(0), recyclers), redeemableTxs) const zipped = _.zip(_.map('count', recyclers), provisioned) const counts = _.map(r => r[0] - r[1], zipped) From 0085c22003a3c4a3e2d234e1c91ae83585e23298 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:23:36 +0100 Subject: [PATCH 08/16] refactor: avoid using unnecessary variables --- lib/plugins.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 43eb8b45..cf6d2d7a 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -161,9 +161,11 @@ function plugins (settings, deviceId) { return _.map(([acc, bill]) => acc + bill.provisioned, _.zip(sum, bills)) } - const provisioned = _.reduce(sumTxs, _.map(_.constant(0), recyclers), redeemableTxs) - const zipped = _.zip(_.map('count', recyclers), provisioned) - const counts = _.map(r => r[0] - r[1], zipped) + const counts = _.flow( + _.reduce(sumTxs, _.map(_.constant(0), recyclers)), + _.zip(_.map('count', recyclers)), + _.map(([count, provisioned]) => count - provisioned), + )(redeemableTxs) if (_.some(_.lt(_, 0), counts)) { throw new Error('Negative note count: %j', counts) From 347844610c035cbe0fbc2701ad1bee20fbd11e3e Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:29:27 +0100 Subject: [PATCH 09/16] refactor: don't rebuild the whole recycler object --- lib/plugins.js | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index cf6d2d7a..9356137a 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -171,17 +171,10 @@ function plugins (settings, deviceId) { throw new Error('Negative note count: %j', counts) } - const computedRecyclers = [] - _.forEach(it => { - computedRecyclers.push({ - number: recyclers[it].number, - name: recyclers[it].name, - denomination: recyclers[it].denomination, - count: counts[it] - }) - }, _.times(_.identity(), _.size(recyclers))) - - return computedRecyclers + return _.map( + recycler => _.set('count', counts[recycler.number], recycler), + recyclers + ) } function buildAvailableCassettes (excludeTxId) { From d47101215f5e347abd899fde75401cd5a73f67b3 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:35:28 +0100 Subject: [PATCH 10/16] refactor: inline one step --- lib/plugins.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 9356137a..7f4934b5 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -161,20 +161,18 @@ function plugins (settings, deviceId) { return _.map(([acc, bill]) => acc + bill.provisioned, _.zip(sum, bills)) } - const counts = _.flow( + recyclers = _.flow( + // Sum "used" bills per recycler _.reduce(sumTxs, _.map(_.constant(0), recyclers)), - _.zip(_.map('count', recyclers)), - _.map(([count, provisioned]) => count - provisioned), + _.zip(recyclers), + // Remove used bills from recycler counts + _.map(([recycler, provisioned]) => _.set('count', recycler.count - provisioned, recycler)), )(redeemableTxs) - if (_.some(_.lt(_, 0), counts)) { + if (_.some(({ count }) => count < 0, recyclers)) throw new Error('Negative note count: %j', counts) - } - return _.map( - recycler => _.set('count', counts[recycler.number], recycler), - recyclers - ) + return recyclers } function buildAvailableCassettes (excludeTxId) { From ca706c24a90e6afd54a7053611d75ddca1eab173 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:38:33 +0100 Subject: [PATCH 11/16] refactor: inline computations into reduce --- lib/plugins.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 7f4934b5..a882ffbd 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -149,25 +149,25 @@ function plugins (settings, deviceId) { function computeAvailableRecyclers (recyclers, redeemableTxs) { if (_.isEmpty(redeemableTxs)) return recyclers - const sumTxs = (sum, tx) => { + const accountProvisioned = (recyclers, tx) => { // cash-out-helper sends 0 as fallback value, need to filter it out as there are no '0' denominations - const bills = _.filter(it => _.includes('recycler', it.name) && it.denomination > 0, tx.bills) + const recyclersBills = _.flow( + _.get(['bills']), + _.filter(it => _.includes('recycler', it.name) && it.denomination > 0) + _.zip(recyclers) + )(tx) const sameDenominations = ([recycler, bill]) => recycler?.denomination === bill?.denomination - if (!_.every(sameDenominations, _.zip(recyclers, bills))) { + if (!_.every(sameDenominations, recyclersBills)) throw new Error('Denominations don\'t add up, recyclers were changed.') - } - return _.map(([acc, bill]) => acc + bill.provisioned, _.zip(sum, bills)) + return _.map( + ([recycler, { provisioned }]) => _.set('count', recycler.count - provisioned, recycler), + recyclersBills + ) } - recyclers = _.flow( - // Sum "used" bills per recycler - _.reduce(sumTxs, _.map(_.constant(0), recyclers)), - _.zip(recyclers), - // Remove used bills from recycler counts - _.map(([recycler, provisioned]) => _.set('count', recycler.count - provisioned, recycler)), - )(redeemableTxs) + recyclers = _.reduce(accountProvisioned, recyclers, redeemableTxs) if (_.some(({ count }) => count < 0, recyclers)) throw new Error('Negative note count: %j', counts) From be63cd6ccbd519f590e09713aea649f2361edb33 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:51:03 +0100 Subject: [PATCH 12/16] refactor: simplify `computeAvailableCassettes` similarly to `computeAvailableRecyclers` --- lib/plugins.js | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index a882ffbd..8c849a79 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -112,38 +112,30 @@ function plugins (settings, deviceId) { function computeAvailableCassettes (cassettes, redeemableTxs) { 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 - const bills = _.filter(it => _.includes('cassette', it.name) && it.denomination > 0, tx.bills) - const sameDenominations = a => a[0]?.denomination === a[1]?.denomination + const cassettesBills = _.flow( + _.get(['bills']), + _.filter(it => _.includes('cassette', it.name) && it.denomination > 0) + _.zip(cassettes) + )(tx) - const doDenominationsMatch = _.every(sameDenominations, _.zip(cassettes, bills)) - - if (!doDenominationsMatch) { + const sameDenominations = ([cassette, bill]) => cassette?.denomination === bill?.denomination + if (!_.every(sameDenominations, cassettesBills)) throw new Error('Denominations don\'t add up, cassettes were changed.') - } - return _.map(r => r[0] + r[1].provisioned, _.zip(sum, tx.bills)) + return _.map( + ([cassette, { provisioned }]) => _.set('count', cassette.count - provisioned, cassette), + cassettesBills + ) } - const provisioned = _.reduce(sumTxs, _.times(_.constant(0), _.size(cassettes)), redeemableTxs) - const zipped = _.zip(_.map('count', cassettes), provisioned) - const counts = _.map(r => r[0] - r[1], zipped) + cassettes = _.reduce(accountProvisioned, cassettes, redeemableTxs) - if (_.some(_.lt(_, 0), counts)) { + if (_.some(({ count }) => count < 0, cassettes)) throw new Error('Negative note count: %j', counts) - } - const computedCassettes = [] - _.forEach(it => { - computedCassettes.push({ - name: cassettes[it].name, - denomination: cassettes[it].denomination, - count: counts[it] - }) - }, _.times(_.identity(), _.size(cassettes))) - - return computedCassettes + return cassettes } function computeAvailableRecyclers (recyclers, redeemableTxs) { From 3accb2b54ede7f46f444a39ae1aaf9b151455959 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 10:58:54 +0100 Subject: [PATCH 13/16] refactor: generalize `accountProvisioned` to cassettes&recyclers --- lib/plugins.js | 52 ++++++++++++++++---------------------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 8c849a79..c81f8813 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -109,61 +109,41 @@ function plugins (settings, deviceId) { return tx.fiat.lte(zeroConfLimit) } - function computeAvailableCassettes (cassettes, redeemableTxs) { - if (_.isEmpty(redeemableTxs)) return cassettes - - const accountProvisioned = (cassettes, tx) => { + const accountProvisioned = (cashUnitType, cashUnits, redeemableTxs) => { + const kons = (cashUnits, tx) => { // cash-out-helper sends 0 as fallback value, need to filter it out as there are no '0' denominations - const cassettesBills = _.flow( + const cashUnitsBills = _.flow( _.get(['bills']), - _.filter(it => _.includes('cassette', it.name) && it.denomination > 0) - _.zip(cassettes) + _.filter(it => _.includes(cashUnitType, it.name) && it.denomination > 0), + _.zip(cashUnits), )(tx) - const sameDenominations = ([cassette, bill]) => cassette?.denomination === bill?.denomination - if (!_.every(sameDenominations, cassettesBills)) - throw new Error('Denominations don\'t add up, cassettes were changed.') + const sameDenominations = ([cashUnit, bill]) => cashUnit?.denomination === bill?.denomination + if (!_.every(sameDenominations, cashUnitsBills)) + throw new Error(`Denominations don't add up, ${cashUnitType}s were changed.`) return _.map( - ([cassette, { provisioned }]) => _.set('count', cassette.count - provisioned, cassette), - cassettesBills + ([cashUnit, { provisioned }]) => _.set('count', cashUnit.count - provisioned, cashUnit), + cashUnitsBills ) } - cassettes = _.reduce(accountProvisioned, cassettes, redeemableTxs) + return _.reduce(kons, cashUnits, redeemableTxs) + } + function computeAvailableCassettes (cassettes, redeemableTxs) { + if (_.isEmpty(redeemableTxs)) return cassettes + cassettes = accountProvisioned('cassette', cassettes, redeemableTxs) if (_.some(({ count }) => count < 0, cassettes)) throw new Error('Negative note count: %j', counts) - return cassettes } function computeAvailableRecyclers (recyclers, redeemableTxs) { if (_.isEmpty(redeemableTxs)) return recyclers - - const accountProvisioned = (recyclers, tx) => { - // cash-out-helper sends 0 as fallback value, need to filter it out as there are no '0' denominations - const recyclersBills = _.flow( - _.get(['bills']), - _.filter(it => _.includes('recycler', it.name) && it.denomination > 0) - _.zip(recyclers) - )(tx) - - const sameDenominations = ([recycler, bill]) => recycler?.denomination === bill?.denomination - if (!_.every(sameDenominations, recyclersBills)) - throw new Error('Denominations don\'t add up, recyclers were changed.') - - return _.map( - ([recycler, { provisioned }]) => _.set('count', recycler.count - provisioned, recycler), - recyclersBills - ) - } - - recyclers = _.reduce(accountProvisioned, recyclers, redeemableTxs) - + recyclers = accountProvisioned('recycler', recyclers, redeemableTxs) if (_.some(({ count }) => count < 0, recyclers)) throw new Error('Negative note count: %j', counts) - return recyclers } From f2d07c8cc7501be6ed03e46a758e745cfc1cf52a Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 11:32:38 +0100 Subject: [PATCH 14/16] refactor: don't build `virtualRecyclers` in case of error --- lib/plugins.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index c81f8813..935a13a4 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -207,11 +207,8 @@ function plugins (settings, deviceId) { _.range(1, numberOfRecyclers+1) ) - const virtualRecyclers = denominations.length ? [Math.max(..._.flatten(denominations)) * 2] : [] - - if (counts.length !== denominations.length) { + if (counts.length !== denominations.length) throw new Error('Denominations and respective counts do not match!') - } const recyclers = _.map( it => ({ @@ -223,6 +220,8 @@ function plugins (settings, deviceId) { _.range(0, numberOfRecyclers) ) + const virtualRecyclers = denominations.length ? [Math.max(..._.flatten(denominations)) * 2] : [] + try { return { recyclers: computeAvailableRecyclers(recyclers, redeemableTxs), From 02cfe7530b51bd5b0b78361fcaa9c7abf200aeb7 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 11:38:48 +0100 Subject: [PATCH 15/16] refactor: simplify `buildAvailableCassettes` similarly to `buildAvailableRecyclers` --- lib/plugins.js | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 935a13a4..4a7ba823 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -153,30 +153,27 @@ function plugins (settings, deviceId) { if (!cashOutConfig.active) return Promise.resolve() return Promise.all([dbm.cassetteCounts(deviceId), cashOutHelper.redeemableTxs(deviceId, excludeTxId)]) - .then(([_cassettes, _redeemableTxs]) => { - const redeemableTxs = _.reject(_.matchesProperty('id', excludeTxId), _redeemableTxs) + .then(([{ counts, numberOfCassettes }, redeemableTxs]) => { + redeemableTxs = _.reject(_.matchesProperty('id', excludeTxId), redeemableTxs) - const denominations = [] - _.forEach(it => { - denominations.push(cashOutConfig[`cassette${it + 1}`]) - }, _.times(_.identity(), _cassettes.numberOfCassettes)) + const denominations = _.map( + it => cashOutConfig[`cassette${it}`], + _.range(1, numberOfCassettes+1) + ) - const virtualCassettes = denominations.length ? [Math.max(...denominations) * 2] : [] - - const counts = _cassettes.counts - - if (counts.length !== denominations.length) { + if (counts.length !== denominations.length) throw new Error('Denominations and respective counts do not match!') - } - const cassettes = [] - _.forEach(it => { - cassettes.push({ + const cassettes = _.map( + it => ({ name: `cassette${it + 1}`, denomination: parseInt(denominations[it], 10), count: parseInt(counts[it], 10) - }) - }, _.times(_.identity(), _cassettes.numberOfCassettes)) + }), + _.range(0, numberOfCassettes) + ) + + const virtualCassettes = denominations.length ? [Math.max(...denominations) * 2] : [] try { return { From e65458eb1bc084426cf874944f1e088c187bafa1 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Oct 2023 11:59:13 +0100 Subject: [PATCH 16/16] fix: retrieve recycler bills --- lib/cash-out/cash-out-helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cash-out/cash-out-helper.js b/lib/cash-out/cash-out-helper.js index f86086a6..a98f7a31 100644 --- a/lib/cash-out/cash-out-helper.js +++ b/lib/cash-out/cash-out-helper.js @@ -138,7 +138,7 @@ function toObj (row) { const billFieldsArr = _.concat( _.map(it => ({ name: `cassette${it + 1}`, denomination: newObj[`denomination${it + 1}`], provisioned: newObj[`provisioned${it + 1}`] }))(_.range(0, MAX_CASSETTES)), - _.map(it => ({ name: `recycler${it + 1}`, denomination: newObj[`denomination_recycler${it + 1}`], provisioned: newObj[`provisioned_recycler${it + 1}`] }))(_.range(0, MAX_RECYCLERS)), + _.map(it => ({ name: `recycler${it + 1}`, denomination: newObj[`denominationRecycler${it + 1}`], provisioned: newObj[`provisionedRecycler${it + 1}`] }))(_.range(0, MAX_RECYCLERS)), ) // There can't be bills with denomination === 0.