@gameroom/cli
Version:
A command line tool for Gameroom
119 lines (111 loc) • 3.68 kB
JavaScript
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()
}