diff --git a/lib/cashbox-batches.js b/lib/cashbox-batches.js index f5b2de62..a6ce23d7 100644 --- a/lib/cashbox-batches.js +++ b/lib/cashbox-batches.js @@ -1,3 +1,4 @@ +const constants = require('./constants') const db = require('./db') const _ = require('lodash/fp') const uuid = require('uuid') @@ -18,6 +19,32 @@ function createCashboxBatch (deviceId, cashboxCount) { }) } +function updateMachineWithBatch (machineContext, oldCashboxCount) { + if (!_.has(['deviceId', 'cashbox', 'cassettes'], machineContext) && !_.inRange(constants.CASH_OUT_MINIMUM_AMOUNT_OF_CASSETTES, constants.CASH_OUT_MAXIMUM_AMOUNT_OF_CASSETTES + 1, _.size(machineContext.cassettes))) + throw new Error('Insufficient info to create a new cashbox batch') + if (_.isEqual(0, oldCashboxCount)) throw new Error('Cashbox is empty. Cashbox batch could not be created.') + + return db.tx(t => { + const deviceId = machineContext.deviceId + const batchId = uuid.v4() + const q1 = t.none(`INSERT INTO cashbox_batches (id, device_id, created, operation_type) VALUES ($1, $2, now(), 'cash-in-empty')`, [batchId, deviceId]) + const q2 = t.none(`UPDATE bills SET cashbox_batch_id=$1 FROM cash_in_txs + WHERE bills.cash_in_txs_id = cash_in_txs.id AND + cash_in_txs.device_id = $2 AND + bills.cashbox_batch_id IS NULL`, [batchId, deviceId]) + const q3 = t.none(`UPDATE devices SET cashbox=$1, cassette1=$2, cassette2=$3, cassette3=$4, cassette4=$5 WHERE device_id=$6`, [ + machineContext.cashbox, + machineContext.cassettes[0], + machineContext.cassettes[1], + machineContext.cassettes[2], + machineContext.cassettes[3], + machineContext.deviceId + ]) + + return t.batch([q1, q2, q3]) + }) +} + function getBatches () { const sql = ` SELECT cb.id, cb.device_id, cb.created, cb.operation_type, cb.bill_count_override, cb.performed_by, json_agg(b.*) AS bills @@ -39,4 +66,4 @@ function getBillsByBatchId (id) { return db.any(sql, [id]) } -module.exports = { createCashboxBatch, getBatches, getBillsByBatchId, editBatchById } +module.exports = { createCashboxBatch, updateMachineWithBatch, getBatches, getBillsByBatchId, editBatchById } diff --git a/lib/constants.js b/lib/constants.js index 3c2f4267..67e819a3 100644 --- a/lib/constants.js +++ b/lib/constants.js @@ -1,6 +1,13 @@ +const CASH_OUT_MINIMUM_AMOUNT_OF_CASSETTES = 2 +const CASH_OUT_MAXIMUM_AMOUNT_OF_CASSETTES = 4 + const anonymousCustomer = { uuid: '47ac1184-8102-11e7-9079-8f13a7117867', name: 'anonymous' } -module.exports = {anonymousCustomer} +module.exports = { + CASH_OUT_MINIMUM_AMOUNT_OF_CASSETTES, + CASH_OUT_MAXIMUM_AMOUNT_OF_CASSETTES, + anonymousCustomer +} diff --git a/lib/machine-loader.js b/lib/machine-loader.js index d9286e1e..b6859ccc 100644 --- a/lib/machine-loader.js +++ b/lib/machine-loader.js @@ -3,6 +3,7 @@ const pgp = require('pg-promise')() const axios = require('axios') const uuid = require('uuid') +const batching = require('./cashbox-batches') const db = require('./db') const pairing = require('./pairing') const { checkPings, checkStuckScreen } = require('./notifier') @@ -139,8 +140,15 @@ function emptyCashInBills (rec) { } function setCassetteBills (rec) { - const sql = 'update devices set cashbox=$1, cassette1=$2, cassette2=$3, cassette3=$4, cassette4=$5 where device_id=$6' - return db.none(sql, [rec.cashbox, rec.cassettes[0], rec.cassettes[1], rec.cassettes[2], rec.cassettes[3], rec.deviceId]) + return db.oneOrNone(`SELECT cashbox FROM devices WHERE device_id=$1 LIMIT 1`, [rec.deviceId]) + .then(oldCashboxValue => { + if (_.isNil(oldCashboxValue) || rec.cashbox === oldCashboxValue) { + const sql = 'UPDATE devices SET cashbox=$1, cassette1=$2, cassette2=$3, cassette3=$4, cassette4=$5 WHERE device_id=$6' + return db.none(sql, [rec.cashbox, rec.cassettes[0], rec.cassettes[1], rec.cassettes[2], rec.cassettes[3], rec.deviceId]) + } + + return batching.updateMachineWithBatch({ ...rec, oldCashboxValue }) + }) } function unpair (rec) { diff --git a/lib/new-admin/graphql/schema.js b/lib/new-admin/graphql/schema.js index 5987f298..583b34f8 100644 --- a/lib/new-admin/graphql/schema.js +++ b/lib/new-admin/graphql/schema.js @@ -439,7 +439,8 @@ const resolvers = { bills: () => bills.getBills() }, Mutation: { - machineAction: (...[, { deviceId, action, cashbox, cassette1, cassette2, cassette3, cassette4, newName }]) => machineAction({ deviceId, action, cashbox, cassette1, cassette2, cassette3, cassette4, newName }), + machineAction: (...[, { deviceId, action, cashbox, cassette1, cassette2, cassette3, cassette4, newName }]) => + machineAction({ deviceId, action, cashbox, cassette1, cassette2, cassette3, cassette4, newName }), createPairingTotem: (...[, { name }]) => pairing.totem(name), saveAccounts: (...[, { accounts }]) => settingsLoader.saveAccounts(accounts), // resetAccounts: (...[, { schemaVersion }]) => settingsLoader.resetAccounts(schemaVersion), diff --git a/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js b/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js index caf6dcf2..872b7ab8 100644 --- a/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js +++ b/new-lamassu-admin/src/pages/Maintenance/CashCassettes.js @@ -112,14 +112,6 @@ const SET_CASSETTE_BILLS = gql` } ` -const CREATE_BATCH = gql` - mutation createBatch($deviceId: ID, $cashboxCount: Int) { - createBatch(deviceId: $deviceId, cashboxCount: $cashboxCount) { - id - } - } -` - const CashCassettes = () => { const classes = useStyles() const [showHistory, setShowHistory] = useState(false) @@ -133,7 +125,6 @@ const CashCassettes = () => { const [setCassetteBills, { error }] = useMutation(SET_CASSETTE_BILLS, { refetchQueries: () => ['getData'] }) - const [createBatch] = useMutation(CREATE_BATCH) const bills = R.groupBy(bill => bill.deviceId)(R.path(['bills'])(data) ?? []) const deviceIds = R.uniq( R.map(R.prop('deviceId'))(R.path(['bills'])(data) ?? []) @@ -145,26 +136,11 @@ const CashCassettes = () => { ...R.map(it => it.numberOfCassettes, machines), 0 ) - const cashboxCounts = R.reduce( - (ret, m) => R.assoc(m.id, m.cashbox, ret), - {}, - machines - ) const getCashoutSettings = id => fromNamespace(id)(cashout) const isCashOutDisabled = ({ id }) => !getCashoutSettings(id).active const onSave = (id, cashbox, cassettes) => { - const oldCashboxCount = cashboxCounts[id] - if (cashbox < oldCashboxCount) { - createBatch({ - variables: { - deviceId: id, - cashboxCount: oldCashboxCount - } - }) - } - return setCassetteBills({ variables: { action: 'setCassetteBills',