From e83e74f9d1312240f1e2b11a866480f718ed12f9 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Jun 2025 13:18:57 +0100 Subject: [PATCH 1/6] chore: format SQL queries --- .../server/lib/new-admin/services/bills.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/server/lib/new-admin/services/bills.js b/packages/server/lib/new-admin/services/bills.js index 78092ab8..67babaf3 100644 --- a/packages/server/lib/new-admin/services/bills.js +++ b/packages/server/lib/new-admin/services/bills.js @@ -20,11 +20,22 @@ const getBills = filters => { } } - 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 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 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 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)}`}` return Promise.all([db.any(sql), db.any(sql2)]).then( ([bills, operationalBills]) => From 1331aad0accd292189689b9741eba6144ad8fd06 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Jun 2025 15:27:56 +0100 Subject: [PATCH 2/6] refactor: simplify bills query building --- .../server/lib/new-admin/services/bills.js | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/packages/server/lib/new-admin/services/bills.js b/packages/server/lib/new-admin/services/bills.js index 67babaf3..e71947a8 100644 --- a/packages/server/lib/new-admin/services/bills.js +++ b/packages/server/lib/new-admin/services/bills.js @@ -3,39 +3,42 @@ 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 WHERE = conds => (conds ? 'WHERE ' + conds : '') + +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 getBills = filters => { + const deviceIDCondition = !_.isNil(filters.deviceId) + ? `device_id = ${pgp.as.text(filters.deviceId)}` + : '' + const batchIDCondition = getBatchIDCondition(filters.batch) 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} + WHERE ${AND(deviceIDCondition)} ) AS cit ON cit.id = b.cash_in_txs_id - ${batchStatement(filters.batch)} - ${_.isNil(batchStatement(filters.batch)) ? `WHERE` : `AND`} - b.destination_unit = 'cashbox'` + WHERE ${AND(batchIDCondition, "b.destination_unit = 'cashbox'")}` 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)}`}` + ${WHERE(AND(deviceIDCondition, batchIDCondition))}` return Promise.all([db.any(sql), db.any(sql2)]).then( ([bills, operationalBills]) => From 2f7724bd127cdf62d89c8715d4bf623d682c4162 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Jun 2025 16:32:08 +0100 Subject: [PATCH 3/6] fix: exclude unbatched bills of unpaired machines --- .../server/lib/new-admin/services/bills.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/server/lib/new-admin/services/bills.js b/packages/server/lib/new-admin/services/bills.js index e71947a8..c68d3363 100644 --- a/packages/server/lib/new-admin/services/bills.js +++ b/packages/server/lib/new-admin/services/bills.js @@ -3,8 +3,6 @@ const pgp = require('pg-promise')() const db = require('../../db') -const WHERE = conds => (conds ? 'WHERE ' + conds : '') - const AND = (...clauses) => clauses.filter(clause => !!clause).join(' AND ') const getBatchIDCondition = filter => { @@ -31,14 +29,25 @@ const getBills = filters => { LEFT OUTER JOIN ( SELECT id, device_id FROM cash_in_txs - WHERE ${AND(deviceIDCondition)} + 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'")}` + WHERE ${AND( + batchIDCondition, + "b.destination_unit = 'cashbox'", + 'cit.device_id IS NOT NULL', + )}` const sql2 = `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))}` + WHERE ${AND( + deviceIDCondition, + batchIDCondition, + 'b.device_id NOT IN (SELECT device_id FROM unpaired_devices)', + )}` return Promise.all([db.any(sql), db.any(sql2)]).then( ([bills, operationalBills]) => From 317660e8d94961dd873a67e776a35b4841d6b69e Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Jun 2025 16:38:44 +0100 Subject: [PATCH 4/6] chore: use meaningful names --- packages/server/lib/new-admin/services/bills.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/server/lib/new-admin/services/bills.js b/packages/server/lib/new-admin/services/bills.js index c68d3363..5377dd17 100644 --- a/packages/server/lib/new-admin/services/bills.js +++ b/packages/server/lib/new-admin/services/bills.js @@ -24,7 +24,7 @@ const getBills = filters => { : '' const batchIDCondition = getBatchIDCondition(filters.batch) - const sql = `SELECT b.id, b.fiat, b.fiat_code, b.created, b.cashbox_batch_id, cit.device_id AS device_id + 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 @@ -41,7 +41,7 @@ const getBills = filters => { 'cit.device_id IS NOT NULL', )}` - const sql2 = `SELECT b.id, b.fiat, b.fiat_code, b.created, b.cashbox_batch_id, b.device_id + 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, @@ -49,9 +49,9 @@ const getBills = filters => { 'b.device_id NOT IN (SELECT device_id FROM unpaired_devices)', )}` - return Promise.all([db.any(sql), db.any(sql2)]).then( - ([bills, operationalBills]) => - _.map(_.mapKeys(_.camelCase), _.concat(bills, operationalBills)), + return Promise.all([db.any(cashboxBills), db.any(recyclerBills)]).then( + ([cashboxBills, recyclerBills]) => + _.map(_.mapKeys(_.camelCase), _.concat(cashboxBills, recyclerBills)), ) } From 7ba933243606ec277a21510988391076f78498d3 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Jun 2025 16:49:13 +0100 Subject: [PATCH 5/6] refactor: simplify bills handling code --- packages/admin-ui/src/pages/Maintenance/CashUnits.jsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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 && ( From 8b0ac8a18263f8a4c910e5253ec55d16be4112de Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 23 Jun 2025 16:50:09 +0100 Subject: [PATCH 6/6] refactor: simplify bills processing code --- packages/server/lib/new-admin/services/bills.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/lib/new-admin/services/bills.js b/packages/server/lib/new-admin/services/bills.js index 5377dd17..8224cccc 100644 --- a/packages/server/lib/new-admin/services/bills.js +++ b/packages/server/lib/new-admin/services/bills.js @@ -51,7 +51,7 @@ const getBills = filters => { return Promise.all([db.any(cashboxBills), db.any(recyclerBills)]).then( ([cashboxBills, recyclerBills]) => - _.map(_.mapKeys(_.camelCase), _.concat(cashboxBills, recyclerBills)), + [].concat(cashboxBills, recyclerBills).map(_.mapKeys(_.camelCase)), ) }