const _ = require('lodash/fp') const pgp = require('pg-promise')() const db = require('../../db') 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 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 IN (SELECT device_id FROM devices WHERE paired)', )} ) AS cit ON cit.id = b.cash_in_txs_id WHERE ${AND( batchIDCondition, "b.destination_unit = 'cashbox'", 'cit.device_id IS NOT NULL', )}` 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 IN (SELECT device_id FROM devices WHERE paired)', )}` return Promise.all([db.any(cashboxBills), db.any(recyclerBills)]).then( ([cashboxBills, recyclerBills]) => [].concat(cashboxBills, recyclerBills).map(_.mapKeys(_.camelCase)), ) } module.exports = { getBills, }