feat: start working on backend support for dynamic cassette number
fix: multiple small fixes to both the front and back-end multi-cassette support
This commit is contained in:
parent
13e6401b22
commit
3c1a58da4a
7 changed files with 86 additions and 65 deletions
|
|
@ -40,11 +40,19 @@ function mapDispense (tx) {
|
||||||
return {
|
return {
|
||||||
provisioned_1: bills[0].provisioned,
|
provisioned_1: bills[0].provisioned,
|
||||||
provisioned_2: bills[1].provisioned,
|
provisioned_2: bills[1].provisioned,
|
||||||
|
provisioned_3: bills[2].provisioned,
|
||||||
|
provisioned_4: bills[3].provisioned,
|
||||||
dispensed_1: bills[0].dispensed,
|
dispensed_1: bills[0].dispensed,
|
||||||
dispensed_2: bills[1].dispensed,
|
dispensed_2: bills[1].dispensed,
|
||||||
|
dispensed_3: bills[2].dispensed,
|
||||||
|
dispensed_4: bills[3].dispensed,
|
||||||
rejected_1: bills[0].rejected,
|
rejected_1: bills[0].rejected,
|
||||||
rejected_2: bills[1].rejected,
|
rejected_2: bills[1].rejected,
|
||||||
|
rejected_3: bills[2].rejected,
|
||||||
|
rejected_4: bills[3].rejected,
|
||||||
denomination_1: bills[0].denomination,
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -112,13 +112,17 @@ function updateCassettes (t, tx) {
|
||||||
|
|
||||||
const sql = `update devices set
|
const sql = `update devices set
|
||||||
cassette1 = cassette1 - $1,
|
cassette1 = cassette1 - $1,
|
||||||
cassette2 = cassette2 - $2
|
cassette2 = cassette2 - $2,
|
||||||
where device_id = $3
|
cassette3 = cassette3 - $3,
|
||||||
returning cassette1, cassette2`
|
cassette4 = cassette4 - $4
|
||||||
|
where device_id = $5
|
||||||
|
returning cassette1, cassette2, cassette3, cassette4`
|
||||||
|
|
||||||
const values = [
|
const values = [
|
||||||
tx.bills[0].dispensed + tx.bills[0].rejected,
|
tx.bills[0]?.dispensed ?? 0 + tx.bills[0]?.rejected ?? 0,
|
||||||
tx.bills[1].dispensed + tx.bills[1].rejected,
|
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
|
tx.deviceId
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,21 +37,25 @@ function convertField (key) {
|
||||||
|
|
||||||
function addDbBills (tx) {
|
function addDbBills (tx) {
|
||||||
const bills = tx.bills
|
const bills = tx.bills
|
||||||
|
console.log('tx', tx)
|
||||||
if (_.isEmpty(bills)) return tx
|
if (_.isEmpty(bills)) return tx
|
||||||
|
|
||||||
return _.assign(tx, {
|
const billsObj = {
|
||||||
provisioned1: bills[0].provisioned,
|
provisioned1: bills[0]?.provisioned ?? 0,
|
||||||
provisioned2: bills[1].provisioned,
|
provisioned2: bills[1]?.provisioned ?? 0,
|
||||||
provisioned3: bills[2].provisioned,
|
provisioned3: bills[2]?.provisioned ?? 0,
|
||||||
provisioned4: bills[3].provisioned,
|
provisioned4: bills[3]?.provisioned ?? 0,
|
||||||
denomination1: bills[0].denomination,
|
denomination1: bills[0]?.denomination ?? 0,
|
||||||
denomination2: bills[1].denomination,
|
denomination2: bills[1]?.denomination ?? 0,
|
||||||
denomination3: bills[2].denomination,
|
denomination3: bills[2]?.denomination ?? 0,
|
||||||
denomination4: bills[3].denomination
|
denomination4: bills[3]?.denomination ?? 0
|
||||||
})
|
}
|
||||||
|
|
||||||
|
return _.assign(tx, billsObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
function toDb (tx) {
|
function toDb (tx) {
|
||||||
|
console.log('tx1', tx)
|
||||||
const massager = _.flow(convertBigNumFields, addDbBills,
|
const massager = _.flow(convertBigNumFields, addDbBills,
|
||||||
_.omit(['direction', 'bills']), _.mapKeys(convertField))
|
_.omit(['direction', 'bills']), _.mapKeys(convertField))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,14 +72,22 @@ function postProcess (txVector, justAuthorized, pi) {
|
||||||
.then(bills => {
|
.then(bills => {
|
||||||
const provisioned1 = bills[0].provisioned
|
const provisioned1 = bills[0].provisioned
|
||||||
const provisioned2 = bills[1].provisioned
|
const provisioned2 = bills[1].provisioned
|
||||||
|
const provisioned3 = bills[2].provisioned
|
||||||
|
const provisioned4 = bills[3].provisioned
|
||||||
const denomination1 = bills[0].denomination
|
const denomination1 = bills[0].denomination
|
||||||
const denomination2 = bills[1].denomination
|
const denomination2 = bills[1].denomination
|
||||||
|
const denomination3 = bills[2].denomination
|
||||||
|
const denomination4 = bills[3].denomination
|
||||||
|
|
||||||
const rec = {
|
const rec = {
|
||||||
provisioned_1: provisioned1,
|
provisioned_1: provisioned1,
|
||||||
provisioned_2: provisioned2,
|
provisioned_2: provisioned2,
|
||||||
|
provisioned_3: provisioned3,
|
||||||
|
provisioned_4: provisioned4,
|
||||||
denomination_1: denomination1,
|
denomination_1: denomination1,
|
||||||
denomination_2: denomination2
|
denomination_2: denomination2,
|
||||||
|
denomination_3: denomination3,
|
||||||
|
denomination_4: denomination4
|
||||||
}
|
}
|
||||||
|
|
||||||
return cashOutActions.logAction(db, 'provisionNotes', rec, newTx)
|
return cashOutActions.logAction(db, 'provisionNotes', rec, newTx)
|
||||||
|
|
|
||||||
|
|
@ -109,12 +109,12 @@ function plugins (settings, deviceId) {
|
||||||
if (_.isEmpty(redeemableTxs)) return orderedCassettes
|
if (_.isEmpty(redeemableTxs)) return orderedCassettes
|
||||||
|
|
||||||
const sumTxs = (sum, tx) => {
|
const sumTxs = (sum, tx) => {
|
||||||
const bills = tx.bills
|
// cash-out-helper sends 0 as fallback value, need to filter it out as there are no '0' denominations
|
||||||
const sameDenominations = a => a[0].denomination === a[1].denomination
|
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
|
// Order cassettes and bills to make sure they match
|
||||||
const orderedBills = _.orderBy(['denomination'], ['desc'], bills)
|
const orderedBills = _.orderBy(['denomination'], ['desc'], bills)
|
||||||
console.log('orderedBills', orderedBills)
|
|
||||||
|
|
||||||
const doDenominationsMatch = _.every(sameDenominations, _.zip(orderedCassettes, orderedBills))
|
const doDenominationsMatch = _.every(sameDenominations, _.zip(orderedCassettes, orderedBills))
|
||||||
|
|
||||||
|
|
@ -133,24 +133,15 @@ function plugins (settings, deviceId) {
|
||||||
throw new Error('Negative note count: %j', counts)
|
throw new Error('Negative note count: %j', counts)
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
const computedCassettes = []
|
||||||
{
|
_.forEach(it => {
|
||||||
denomination: orderedCassettes[0].denomination,
|
computedCassettes.push({
|
||||||
count: counts[0]
|
denomination: orderedCassettes[it].denomination,
|
||||||
},
|
count: counts[it]
|
||||||
{
|
})
|
||||||
denomination: orderedCassettes[1].denomination,
|
}, _.times(_.identity(), _.size(orderedCassettes)))
|
||||||
count: counts[1]
|
|
||||||
},
|
return computedCassettes
|
||||||
{
|
|
||||||
denomination: orderedCassettes[2].denomination,
|
|
||||||
count: counts[2]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
denomination: orderedCassettes[3].denomination,
|
|
||||||
count: counts[3]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildAvailableCassettes (excludeTxId) {
|
function buildAvailableCassettes (excludeTxId) {
|
||||||
|
|
@ -158,36 +149,32 @@ function plugins (settings, deviceId) {
|
||||||
|
|
||||||
if (!cashOutConfig.active) return Promise.resolve()
|
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)])
|
return Promise.all([dbm.cassetteCounts(deviceId), cashOutHelper.redeemableTxs(deviceId, excludeTxId)])
|
||||||
.then(([rec, _redeemableTxs]) => {
|
.then(([rec, _redeemableTxs]) => {
|
||||||
const redeemableTxs = _.reject(_.matchesProperty('id', excludeTxId), _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
|
const counts = argv.cassettes
|
||||||
? argv.cassettes.split(',')
|
? argv.cassettes.split(',')
|
||||||
: rec.counts
|
: rec.counts
|
||||||
|
|
||||||
const cassettes = [
|
if (rec.counts.length !== denominations.length) {
|
||||||
{
|
throw new Error('Denominations and respective counts do not match!')
|
||||||
denomination: parseInt(denominations[0], 10),
|
}
|
||||||
count: parseInt(counts[0], 10)
|
|
||||||
},
|
const cassettes = []
|
||||||
{
|
_.forEach(it => {
|
||||||
denomination: parseInt(denominations[1], 10),
|
cassettes.push({
|
||||||
count: parseInt(counts[1], 10)
|
denomination: parseInt(denominations[it], 10),
|
||||||
},
|
count: parseInt(counts[it], 10)
|
||||||
{
|
})
|
||||||
denomination: parseInt(denominations[2], 10),
|
}, _.times(_.identity(), rec.numberOfCassettes))
|
||||||
count: parseInt(counts[2], 10)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
denomination: parseInt(denominations[3], 10),
|
|
||||||
count: parseInt(counts[3], 10)
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return {
|
return {
|
||||||
|
|
@ -267,8 +254,6 @@ function plugins (settings, deviceId) {
|
||||||
const coinsWithoutRate = _.map(mapCoinSettings, coinParams)
|
const coinsWithoutRate = _.map(mapCoinSettings, coinParams)
|
||||||
const areThereAvailablePromoCodes = arr[arr.length - 1] > 0
|
const areThereAvailablePromoCodes = arr[arr.length - 1] > 0
|
||||||
|
|
||||||
console.log('cassettes', cassettes)
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
cassettes,
|
cassettes,
|
||||||
rates: buildRates(tickers),
|
rates: buildRates(tickers),
|
||||||
|
|
|
||||||
|
|
@ -26,13 +26,17 @@ exports.recordDeviceEvent = function recordDeviceEvent (deviceId, event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.cassetteCounts = function cassetteCounts (deviceId) {
|
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'
|
'WHERE device_id=$1'
|
||||||
|
|
||||||
return db.one(sql, [deviceId])
|
return db.one(sql, [deviceId])
|
||||||
.then(row => {
|
.then(row => {
|
||||||
const counts = [row.cassette1, row.cassette2, row.cassette3, row.cassette4]
|
const counts = []
|
||||||
return {counts}
|
_.forEach(it => {
|
||||||
|
counts.push(row[`cassette${it + 1}`])
|
||||||
|
}, _.times(_.identity(), row.number_of_cassettes))
|
||||||
|
|
||||||
|
return { numberOfCassettes: row.number_of_cassettes, counts }
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 provisioned_4 INTEGER',
|
||||||
'ALTER TABLE cash_out_txs ADD COLUMN denomination_3 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_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'
|
'ALTER TABLE devices ADD COLUMN number_of_cassettes INTEGER NOT NULL DEFAULT 2'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue