|
|
@@ -35,6 +35,37 @@ const get = async (req, res) => {
|
|
|
}
|
|
|
})
|
|
|
|
|
|
+ const metricsOverTimeSql = (serviceColumn) => `
|
|
|
+ select
|
|
|
+ terminals.key,
|
|
|
+ workdays.date,
|
|
|
+ sum(distinct labors.laborCost) as laborCost,
|
|
|
+ sum(distinct services.${serviceColumn}) as ${serviceColumn},
|
|
|
+ cast(sum(distinct labors.laborCost) as double) / sum(distinct services.${serviceColumn}) as costPer
|
|
|
+
|
|
|
+ -- Start with Terminals
|
|
|
+ from terminals
|
|
|
+
|
|
|
+ -- Link to labor cost
|
|
|
+ join workdays on workdays.terminalId = terminals.id
|
|
|
+ join services on services.workdayId = workdays.id
|
|
|
+ join labors on labors.workdayId = workdays.id
|
|
|
+
|
|
|
+ -- Link to LaborCategory
|
|
|
+ join staffMembers on labors.staffMemberId = staffMembers.id
|
|
|
+ join laborCategories on staffMembers.laborCategoryId = laborCategories.id
|
|
|
+
|
|
|
+ -- Link to ServiceCategory
|
|
|
+ join laborServiceCategories on laborServiceCategories.laborCategoryId = laborCategories.id
|
|
|
+ join serviceCategories on laborServiceCategories.serviceCategoryId = serviceCategories.id
|
|
|
+
|
|
|
+ where terminals.id in(:terminalIds)
|
|
|
+ and serviceCategories.key = :serviceCategory
|
|
|
+ and workdays.date <= :date
|
|
|
+ and workdays.date >= :startDate
|
|
|
+ group by terminals.key, workdays.date
|
|
|
+ `
|
|
|
+
|
|
|
const metricsSql = (serviceColumn) => `
|
|
|
select
|
|
|
terminals.key as terminal,
|
|
|
@@ -146,7 +177,8 @@ const get = async (req, res) => {
|
|
|
replacements: {
|
|
|
terminalIds,
|
|
|
serviceCategory: sc.key,
|
|
|
- date: date.format('YYYY-MM-DD')
|
|
|
+ date: date.format('YYYY-MM-DD'),
|
|
|
+ startDate: date.add(-30, 'days').format('YYYY-MM-DD')
|
|
|
}
|
|
|
}
|
|
|
const [mpsc] = await sequelize.query(metricsPerServiceCategorySql(sc.serviceColumn), opts)
|
|
|
@@ -154,6 +186,7 @@ const get = async (req, res) => {
|
|
|
const [mptsc] = await sequelize.query(metricsPerTerminalAndServiceCategorySql(sc.serviceColumn), opts)
|
|
|
const [mptlc] = await sequelize.query(metricsPerTerminalAndLaborCategorySql(sc.serviceColumn), opts)
|
|
|
const [lastMetrics] = await sequelize.query(lastMetricsSql(sc.serviceColumn), opts)
|
|
|
+ const [metricsOverTime] = await sequelize.query(metricsOverTimeSql(sc.serviceColumn), opts)
|
|
|
return {
|
|
|
...mpsc[0],
|
|
|
key: sc.key,
|
|
|
@@ -165,7 +198,8 @@ const get = async (req, res) => {
|
|
|
key: t.terminal,
|
|
|
laborCategories: mptlc.filter(l => l.terminal === t.terminal)
|
|
|
})),
|
|
|
- lastMetrics: lastMetrics[0]
|
|
|
+ lastMetrics: lastMetrics[0],
|
|
|
+ metricsOverTime
|
|
|
}
|
|
|
})
|
|
|
),
|
|
|
@@ -190,7 +224,8 @@ const get = async (req, res) => {
|
|
|
terminals: queries[i].metricsPerTerminalAndServiceCategory.filter(mpt => mpt.serviceCategory === sc.key).map(mpt => Object.assign(mpt, {
|
|
|
laborCategories: queries[i].metricsPerTerminalAndLaborCategory.filter(mptlc => mptlc.serviceCategory === sc.key && mptlc.terminal === mpt.terminal)
|
|
|
})),
|
|
|
- lastMetrics: queries[i].lastMetrics
|
|
|
+ lastMetrics: queries[i].lastMetrics,
|
|
|
+ metricsOverTime: queries[i].metricsOverTime
|
|
|
})),
|
|
|
metricsOverTime
|
|
|
}
|