UNPKG

@gameroom/cli

Version:

A command line tool for Gameroom

119 lines (111 loc) 3.68 kB
const Table = require('tabley'), { enums: { sale_status }, models: { Line, Sale, Unit } } = require('@gameroom/kit'), { join, resolve } = require('path'), { dateAddDays, dateLocaleString, dateString, getAll, grGreen, printTable, writeCSVFile } = require('../../helpers'), { spinner } = require('../../refs') const autoPriced = p => p.properties.auto_price === 'true' const lastProps = p => Object.keys(p.properties).filter(k => k.startsWith('last_')).length const sum = (t, p) => t += p module.exports = async ({ start_at, end_at, write }) => { spinner.start() spinner.info(`generating ${grGreen('lines')} report`) spinner.info(`from ${grGreen(start_at.toLocaleString())} to ${grGreen(end_at.toLocaleString())}`) const date_filters = [ { key: 'created_at', comparison: '>', value: start_at }, { key: 'created_at', comparison: '<', value: end_at } ] spinner.text = `getting ${grGreen('sales')}` const sales = await getAll(Sale, { filter: { and: [ ...date_filters, { key: 'status', comparison: '!=', value: sale_status.pending } ] } }, spinner) spinner.succeed(`got ${sales.length} ${grGreen('sales')}`) spinner.text = `getting ${grGreen('lines')}` const lines = await getAll(Line, { filter: { and: [ ...date_filters, { key: 'quantity', comparison: '>', value: 0} ] } }, spinner) spinner.succeed(`got ${lines.length} ${grGreen('lines')}`) spinner.text = `generating ${grGreen('lines')} report` const total = { line_name: 'Total', line_subname: null, number_sold: 0, amount_sold: 0, number_bought: 0, amount_bought: 0 } const misc = { line_name: 'Misc', line_subname: null, number_sold: 0, amount_sold: 0, number_bought: 0, amount_bought: 0 } let rows = [] for (const line of lines) { const sale = sales.find(s => s.id === line.sale_id) if (!sale) continue let row = line.name === 'Misc' ? misc : rows.find(r => r.line_name === line.name && r.line_subname === line.subname) if (!row) { row = { line_name: line.name, line_subname: line.subname, number_sold: 0, amount_sold: 0, number_bought: 0, amount_bought: 0 } rows.push(row) } if (line.amount >= 0) { row.number_sold += line.quantity row.amount_sold += line.amount total.number_sold += line.quantity total.amount_sold += line.amount } else { row.number_bought += line.quantity row.amount_bought += Math.abs(line.amount) total.number_bought += line.quantity total.amount_bought += Math.abs(line.amount) } // console.log(line.saleable_type, line.name) } rows = rows.sort((a, b) => a.line_name < b.line_name ? -1 : 1) const value = (v) => `${(v * .01).toFixed(2)}` const table = new Table(rows, { title: grGreen('lines report'), columns: [ { key: 'line_name', title: 'Line Name' }, { key: 'line_subname', title: 'Line Subname' }, { key: 'number_sold', title: 'Number Sold' }, { key: 'amount_sold', title: 'Amount Sold', value }, { key: 'number_bought', title: 'Number Bought' }, { key: 'amount_bought', title: 'Amount Bought', value } ], meta: [ misc, total ], align: 'center', margin: 4 }) spinner.stop() console.log() table.print() console.log() if (write) { const path = await writeCSVFile(join(resolve(write === true ? '.' : write), 'gameroom-lines-report.csv'), [...rows, misc, total]) spinner.succeed(`wrote data to ${path}`) } spinner.succeed(`generated ${grGreen('lines')} report`).stop() }