@gameroom/cli
Version:
A command line tool for Gameroom
124 lines (116 loc) • 4.77 kB
JavaScript
const Table = require('tabley'),
{ join, resolve } = require('path'),
{ models: { Changelog, Unit_Extended, User } } = require('@gameroom/kit'),
{ dollarString, getAll, grGreen, writeCSVFile } = require('../../helpers'),
{ spinner } = require('../../refs')
const user_ids = [
'd00d2a91-7edc-4e23-827b-3f543791e6ef', // Ian
'60361d83-0b44-413a-8c77-799316ce8cac', // Tim E
'8c3012e8-b3f3-40de-9385-398fb716b234', // Tim O,
'3b93601d-1de5-4281-ab70-d302d2159192', // Dave
'f937d5a2-d987-42c2-96ce-9e4db57d69c6', // Nate E
'34daab85-2bfe-4221-881c-87922def1d42' // Nate J
]
const store_ids = [
'397d6fc7-4edd-4c05-932c-8bda6012f70f', // Repair
]
module.exports = async ({ start_at, end_at, write }) => {
spinner.start()
spinner.info(`generating ${grGreen('repairs')} report`)
spinner.info(`from ${grGreen(start_at.toLocaleString())} to ${grGreen(end_at.toLocaleString())}`)
const date_filters = [
{ key: 'updated_at', comparison: '>', value: start_at },
{ key: 'updated_at', comparison: '<', value: end_at }
]
// Users
spinner.text = `getting ${grGreen('users')}`
let user_filters = user_ids.reduce((a, i) => [ ...a, { key: 'id', value: i } ], [])
const users = await User.getAll({ filter: { or: user_filters } },
(batch) => spinner.text = `getting ${grGreen('users')} (${batch.length})`,
(err) => spinner.fail(`error getting ${grGreen('users')}: ${err}`)
)
spinner.succeed(`got ${users.length} ${grGreen('users')}`)
// Units
spinner.text = `getting ${grGreen('units')}`
const store_filters = store_ids.reduce((a, i) => [ ...a, { key: 'store_id', value: i } ], [])
const units = await Unit_Extended.getAll({
filter: { and: [ ...date_filters, { or: store_filters } ] },
sort: [{ name: 1 }, { price: 1 }]
},
(batch) => spinner.text = `getting ${grGreen('units')} (${batch.length})`,
(err) => spinner.fail(`error getting ${grGreen('units')}: ${err}`)
)
spinner.succeed(`got ${units.length} ${grGreen('units')}`)
// Changelogs
spinner.text = `getting ${grGreen('changelogs')}`
// user_filters = user_ids.reduce((a, i) => [ ...a, { key: 'user_id', value: i } ], [])
// const unit_filters = units.reduce((a, i) => [ ...a, { key: 'changeable_id', value: i.id } ], [])
const changelogs = []
for (const [i, unit] of units.entries()) {
spinner.text = `getting ${grGreen('changelogs')} for ${grGreen('units')} ${i}/${units.length}`
const unit_changelogs = await Changelog.getAll({ filter: { key: 'changeable_id', value: unit.id } },
null,
// (batch) => spinner.text = `getting ${grGreen('changelogs')} (${batch.length})`,
// (err) => { spinner.fail(`error getting ${grGreen('changelogs')}: ${err}`); console.log(err); throw err }
(err) => spinner.fail(`error getting ${grGreen('changelogs')}: ${err}`)
)
changelogs.push(...unit_changelogs)
}
spinner.succeed(`got ${changelogs.length} ${grGreen('changelogs')}`)
spinner.text = `generating ${grGreen('repairs')} report`
const total = {
name: 'Total',
price: null,
changes: 0,
user: null,
quantity: 0,
amount: 0
}
let rows = []
for (const unit of units) {
const unit_changelogs = changelogs.filter(i => i.changeable_id === unit.id && user_ids.includes(i.user_id))
let user_string = ''
for (const changelog of unit_changelogs) {
const user = users.find(i => i.id === changelog.user_id)
if (!user) continue
const name = `${user.first_name} ${user.last_name.substring(0, 1)}`
if (!user_string.includes(name)) user_string += `${user_string ? ', ' : ''}${name}`
}
let row = {
name: unit.name.replace('Repair Service ', ''),
price: unit.price,
changes: unit_changelogs.length,
user: user_string,
quantity: unit.quantity,
amount: unit.amount
}
rows.push(row)
total.changes += row.changes
total.quantity += row.quantity
total.amount += unit.amount
}
total.quantity = `${total.quantity}/${units.length}`
const table = new Table(rows, {
title: grGreen('repairs report'),
columns: [
{ key: 'name', title: 'Name' },
{ key: 'price', title: 'Price' },
{ key: 'changes', title: 'Changes' },
{ key: 'user', title: 'User' },
{ key: 'quantity', title: 'Quantity' },
{ key: 'amount', title: 'Amount', value: dollarString }
],
meta: [ 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-repairs-report.csv'), [...rows, total])
spinner.succeed(`wrote data to ${path}`)
}
spinner.succeed(`generated ${grGreen('repairs')} report`).stop()
}