@gameroom/cli
Version:
A command line tool for Gameroom
96 lines (90 loc) • 3.42 kB
JavaScript
const Table = require('tabley'),
{ models: { Line, Payment, Sale, Store } } = require('@gameroom/kit'),
{ dateAddDays, dateLocaleString, dateString, getAll, grGreen, printTable } = require('../../helpers'),
{ prompt } = require('../../consoleIO'),
{ spinner } = require('../../refs')
module.exports = async ({ start_at, end_at, target }) => {
if (target === true) {
target = await prompt('target (dollars): ')
target = parseFloat(target) * 100
} else if (target) {
target = parseFloat(target) * 100
} else {
target = 100
}
spinner.start()
spinner.info(`generating ${grGreen('small cash payouts')} report`)
spinner.info(`from ${grGreen(start_at.toLocaleString())} to ${grGreen(end_at.toLocaleString())}`)
spinner.info(`under ${grGreen(`$${(target * .01).toFixed(2)}`)}`)
spinner.text = `getting ${grGreen('stores')}`
const stores = await Store.get({ sort: { name: 1 }})
spinner.succeed(`got ${stores.length} ${grGreen('stores')}`)
spinner.text = `getting ${grGreen('sales')}`
const sales = await getAll(Sale, { filter: {
and: [
{ key: 'updated_at', comparison: '>=', value: start_at },
{ key: 'updated_at', comparison: '<', value: end_at }
]
} })
spinner.succeed(`got ${sales.length} ${grGreen('sales')}`)
spinner.text = `getting ${grGreen('payments')}`
const payments = await getAll(Payment, { filter: { and: [
{ key: 'updated_at', comparison: '>=', value: start_at },
{ key: 'updated_at', comparison: '<', value: end_at },
{ key: 'amount', comparison: '<', value: 0 },
{ key: 'gateway', value: 'cash' }
] } })
spinner.succeed(`got ${payments.length} ${grGreen('payments')}`)
spinner.text = `getting ${grGreen('lines')}`
const lines = await getAll(Line, { filter: { and: [
{ key: 'updated_at', comparison: '>=', value: start_at },
{ key: 'updated_at', comparison: '<', value: end_at },
{ key: 'amount', comparison: '<', value: 0 },
{ key: 'amount', comparison: '>=', value: -target }
] } })
spinner.succeed(`got ${lines.length} ${grGreen('lines')}`)
const total = {
store: 'Total',
lines: 0,
amount: 0
}
const rows = []
for (const store of stores) {
const store_sales = sales.filter(s => s.store_id === store.id)
if (store_sales.length === 0) continue
const store_row = {
store: store.name,
lines: 0,
amount: 0
}
for (const sale of store_sales) {
const sale_payments = payments.filter(p => p.sale_id === sale.id)
if (sale_payments.length === 0) continue
const sale_lines = lines.filter(s => s.sale_id === sale.id)
if (sale_lines.length === 0) continue
store_row.lines += sale_lines.length
const amount = sale_lines.map(l => Math.abs(l.amount)).reduce((t, a) => t += a)
store_row.amount += amount
}
total.lines += store_row.lines
total.amount += store_row.amount
rows.push(store_row)
}
const value = (v) => `${(v * .01).toFixed(2)}`
const table = new Table(rows, {
title: grGreen('Small Cash Payouts Report'),
columns: [
{ key: 'store', title: 'Store' },
{ key: 'lines', title: 'Lines' },
{ key: 'amount', title: 'Amount', value },
],
meta: [ total ],
align: 'center',
margin: 4
})
spinner.stop()
console.log()
table.print()
console.log()
spinner.succeed(`generated ${grGreen('small cash payouts')} report`).stop()
}