const _ = require('lodash') const app = require('../app') app.service('statistics', function(api) { const chart = ({ rows, seriesField, dataField, labelsField, format }) => { const labels = _.chain(rows).map(x => x[labelsField]).uniq().value() const series = _.chain(rows).map(x => x[seriesField]).uniq().value() const seriesData = _.chain(rows) .groupBy(x => x[seriesField]) .toPairs() .map(([key, rows]) => [ key, _.chain(rows) .map(row => [row[labelsField], row[dataField]]) .fromPairs() .value() ]) .fromPairs() .value() const data = series.map(s => { const sdata = seriesData[s] return labels.map(l => sdata[l]) }) return {labels, series, data, options: { tooltips: { callbacks: { label: (tooltipItem, data) => { const label = data.datasets[tooltipItem.datasetIndex].label || '' const value = tooltipItem.yLabel return format ? format(label, value) : `${label}: ${value}` } } } }} } this.efficiency = async () => { const rows = await api.statistics() return { delivery: chart({ rows, seriesField: 'key', dataField: 'delivered', labelsField: 'date', format: (label, value) => `${label}: ${value.toLocaleString()} cartons` }), efficiency: chart({ rows, seriesField: 'key', dataField: 'efficiency', labelsField: 'date', format: (label, value) => `${label}: $${value.toFixed(2)} per carton` }), laborCost: chart({ rows, seriesField: 'key', dataField: 'laborCost', labelsField: 'date', format: (label, value) => `${label}: $${value.toFixed(2)} labor cost` }) } } })