UNPKG

@gameroom/cli

Version:

A command line tool for Gameroom

124 lines (116 loc) 4.77 kB
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() }