diff --git a/lib/machine-loader.js b/lib/machine-loader.js index a53fb75c..a7731533 100644 --- a/lib/machine-loader.js +++ b/lib/machine-loader.js @@ -25,6 +25,7 @@ function getMachines () { cassette2: r.cassette2, cassette3: r.cassette3, cassette4: r.cassette4, + numberOfCassettes: r.number_of_cassettes, version: r.version, model: r.model, pairedAt: new Date(r.created), diff --git a/lib/new-admin/graphql/schema.js b/lib/new-admin/graphql/schema.js index 096913d7..a81fbc84 100644 --- a/lib/new-admin/graphql/schema.js +++ b/lib/new-admin/graphql/schema.js @@ -79,6 +79,7 @@ const typeDefs = gql` cassette2: Int cassette3: Int cassette4: Int + numberOfCassettes: Int statuses: [MachineStatus] latestEvent: MachineEvent downloadSpeed: String diff --git a/lib/pairing.js b/lib/pairing.js index 5932878c..00916abe 100644 --- a/lib/pairing.js +++ b/lib/pairing.js @@ -20,16 +20,16 @@ function unpair (deviceId) { return Promise.all([db.none(sql, [deviceId]), db.none(deleteMachinePings, [deviceId])]) } -function pair (token, deviceId, machineModel) { +function pair (token, deviceId, machineModel, numOfCassettes) { return pullToken(token) .then(r => { if (r.expired) return false - const insertSql = `insert into devices (device_id, name) values ($1, $2) + const insertSql = `insert into devices (device_id, name, number_of_cassettes) values ($1, $2, $3) on conflict (device_id) do update set paired=TRUE, display=TRUE` - return db.none(insertSql, [deviceId, r.name]) + return db.none(insertSql, [deviceId, r.name, numOfCassettes]) .then(() => true) }) .catch(err => { diff --git a/lib/routes.js b/lib/routes.js index baee01ea..53c2fdf3 100644 --- a/lib/routes.js +++ b/lib/routes.js @@ -58,6 +58,7 @@ function checkHasLightning (settings) { function poll (req, res, next) { const machineVersion = req.query.version const machineModel = req.query.model + const numOfCassettes = req.query.numOfCassettes const deviceId = req.deviceId const deviceTime = req.deviceTime const serialNumber = req.query.sn @@ -417,8 +418,9 @@ function pair (req, res, next) { const token = req.query.token const deviceId = req.deviceId const model = req.query.model + const numOfCassettes = req.query.numOfCassettes - return pairing.pair(token, deviceId, model) + return pairing.pair(token, deviceId, model, numOfCassettes) .then(valid => { if (valid) { return res.json({ status: 'paired' }) diff --git a/migrations/1630432869178-add-more-cassette-support.js b/migrations/1630432869178-add-more-cassette-support.js index 3fd0c8d4..efd2e721 100644 --- a/migrations/1630432869178-add-more-cassette-support.js +++ b/migrations/1630432869178-add-more-cassette-support.js @@ -10,7 +10,8 @@ exports.up = function (next) { 'ALTER TABLE cash_out_txs ADD COLUMN provisioned_3 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_4 INTEGER' + 'ALTER TABLE cash_out_txs ADD COLUMN denomination_4 INTEGER', + 'ALTER TABLE devices ADD COLUMN number_of_cassettes INTEGER NOT NULL DEFAULT 2' ] return Promise.all([loadLatest(), getMachines()]) diff --git a/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js b/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js index 62d043d6..c3cbe641 100644 --- a/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js +++ b/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js @@ -61,6 +61,7 @@ const GET_MACHINES_AND_CONFIG = gql` cassette2 cassette3 cassette4 + numberOfCassettes } config } @@ -160,87 +161,39 @@ const CashCassettes = () => { inputProps: { decimalPlaces: 0 } - }, - { - name: 'cassette1', - header: 'Cassette 1', - width: 265, - stripe: true, - view: (value, { id }) => ( - - ), - input: CashCassetteInput, - inputProps: { - decimalPlaces: 0 - } - }, - { - name: 'cassette2', - header: 'Cassette 2', - width: 265, - stripe: true, - view: (value, { id }) => { - return ( - - ) - }, - input: CashCassetteInput, - inputProps: { - decimalPlaces: 0 - } - }, - { - name: 'cassette3', - header: 'Cassette 3', - width: 265, - stripe: true, - view: (value, { id }) => { - return ( - - ) - }, - input: CashCassetteInput, - inputProps: { - decimalPlaces: 0 - } - }, - { - name: 'cassette4', - header: 'Cassette 4', - width: 265, - stripe: true, - view: (value, { id }) => { - return ( - - ) - }, - input: CashCassetteInput, - inputProps: { - decimalPlaces: 0 - } } ] + R.until( + R.gt(R.__, Math.max(...R.map(it => it.numberOfCassettes, machines))), + it => { + elements.push({ + name: `cassette${it}`, + header: `Cassette ${it}`, + width: 265, + stripe: true, + view: (value, { id, numberOfCassettes }) => { + return it > numberOfCassettes ? ( + <> + ) : ( + + ) + }, + input: CashCassetteInput, + inputProps: { + decimalPlaces: 0 + } + }) + return R.add(1, it) + }, + 1 + ) + return ( <>