UNPKG

@gameroom/cli

Version:

A command line tool for Gameroom

96 lines (90 loc) 3.42 kB
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() }