diff --git a/packages/admin-ui/src/pages/Maintenance/CashUnits.jsx b/packages/admin-ui/src/pages/Maintenance/CashUnits.jsx index 66ae3976..5457d014 100644 --- a/packages/admin-ui/src/pages/Maintenance/CashUnits.jsx +++ b/packages/admin-ui/src/pages/Maintenance/CashUnits.jsx @@ -139,10 +139,9 @@ const CashCassettes = () => { const timezone = R.path(['config', 'locale_timezone'], data) - const bills = R.groupBy(bill => bill.deviceId)(R.path(['bills'])(data) ?? []) - const deviceIds = R.uniq( - R.map(R.prop('deviceId'))(R.path(['bills'])(data) ?? []), - ) + const bills = data?.bills ?? [] + const billsByDeviceID = R.groupBy(bill => bill.deviceId)(bills) + const deviceIds = R.keys(billsByDeviceID) const cashout = data?.config && fromNamespace('cashOut')(data.config) const locale = data?.config && fromNamespace('locale')(data.config) const fiatCurrency = locale?.fiatCurrency @@ -195,7 +194,7 @@ const CashCassettes = () => { const InnerCashUnitDetails = ({ it }) => ( @@ -291,7 +290,7 @@ const CashCassettes = () => { currencyCode={fiatCurrency} machines={machines} config={config} - bills={R.path(['bills'])(data)} + bills={bills} deviceIds={deviceIds} /> {wizard && ( diff --git a/packages/server/lib/new-admin/services/bills.js b/packages/server/lib/new-admin/services/bills.js index 78092ab8..8224cccc 100644 --- a/packages/server/lib/new-admin/services/bills.js +++ b/packages/server/lib/new-admin/services/bills.js @@ -3,32 +3,55 @@ const pgp = require('pg-promise')() const db = require('../../db') -const getBills = filters => { - const deviceStatement = !_.isNil(filters.deviceId) - ? `WHERE device_id = ${pgp.as.text(filters.deviceId)}` - : `` - const batchStatement = filter => { - switch (filter) { - case 'none': - return `WHERE b.cashbox_batch_id IS NULL` - case 'any': - return `WHERE b.cashbox_batch_id IS NOT NULL` - default: - return _.isNil(filter) - ? `` - : `WHERE b.cashbox_batch_id = ${pgp.as.text(filter)}` - } +const AND = (...clauses) => clauses.filter(clause => !!clause).join(' AND ') + +const getBatchIDCondition = filter => { + switch (filter) { + case 'none': + return 'b.cashbox_batch_id IS NULL' + case 'any': + return 'b.cashbox_batch_id IS NOT NULL' + default: + return _.isNil(filter) + ? '' + : `b.cashbox_batch_id = ${pgp.as.text(filter)}` } +} - const sql = `SELECT b.id, b.fiat, b.fiat_code, b.created, b.cashbox_batch_id, cit.device_id AS device_id FROM bills b LEFT OUTER JOIN ( - SELECT id, device_id FROM cash_in_txs ${deviceStatement} - ) AS cit ON cit.id = b.cash_in_txs_id ${batchStatement(filters.batch)} ${_.isNil(batchStatement(filters.batch)) ? `WHERE` : `AND`} b.destination_unit = 'cashbox'` +const getBills = filters => { + const deviceIDCondition = !_.isNil(filters.deviceId) + ? `device_id = ${pgp.as.text(filters.deviceId)}` + : '' + const batchIDCondition = getBatchIDCondition(filters.batch) - const sql2 = `SELECT b.id, b.fiat, b.fiat_code, b.created, b.cashbox_batch_id, b.device_id FROM empty_unit_bills b ${deviceStatement} ${!_.isNil(filters.deviceId) && !_.isNil(filters.batch) ? `AND ${_.replace('WHERE', '', batchStatement(filters.batch))}` : `${batchStatement(filters.batch)}`}` + const cashboxBills = `SELECT b.id, b.fiat, b.fiat_code, b.created, b.cashbox_batch_id, cit.device_id AS device_id + FROM bills b + LEFT OUTER JOIN ( + SELECT id, device_id + FROM cash_in_txs + WHERE ${AND( + deviceIDCondition, + 'device_id NOT IN (SELECT device_id FROM unpaired_devices)', + )} + ) AS cit + ON cit.id = b.cash_in_txs_id + WHERE ${AND( + batchIDCondition, + "b.destination_unit = 'cashbox'", + 'cit.device_id IS NOT NULL', + )}` - return Promise.all([db.any(sql), db.any(sql2)]).then( - ([bills, operationalBills]) => - _.map(_.mapKeys(_.camelCase), _.concat(bills, operationalBills)), + const recyclerBills = `SELECT b.id, b.fiat, b.fiat_code, b.created, b.cashbox_batch_id, b.device_id + FROM empty_unit_bills b + WHERE ${AND( + deviceIDCondition, + batchIDCondition, + 'b.device_id NOT IN (SELECT device_id FROM unpaired_devices)', + )}` + + return Promise.all([db.any(cashboxBills), db.any(recyclerBills)]).then( + ([cashboxBills, recyclerBills]) => + [].concat(cashboxBills, recyclerBills).map(_.mapKeys(_.camelCase)), ) }