diff --git a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.component.jsx b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.component.jsx
index 0117279d5..af4f28695 100644
--- a/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.component.jsx
+++ b/client/src/components/scoreboard-timetickets-stats/scoreboard-timetickets.component.jsx
@@ -29,7 +29,7 @@ export default connect(
export function ScoreboardTimeTicketsStats({ bodyshop }) {
const { t } = useTranslation();
- const startDate = moment().startOf("month")
+ const startDate = moment().startOf("month");
const endDate = moment().endOf("month");
const fixedPeriods = useMemo(() => {
@@ -84,6 +84,8 @@ export function ScoreboardTimeTicketsStats({ bodyshop }) {
end: endDate.format("YYYY-MM-DD"),
fixedStart: fixedPeriods.start.format("YYYY-MM-DD"),
fixedEnd: fixedPeriods.end.format("YYYY-MM-DD"),
+ jobStart: startDate,
+ jobEnd: endDate,
},
fetchPolicy: "network-only",
nextFetchPolicy: "network-only",
@@ -340,11 +342,21 @@ export function ScoreboardTimeTicketsStats({ bodyshop }) {
larData.push({ ...r, ...lar });
});
+ const jobData = {};
+ data.jobs.forEach((job) => {
+ job.tthrs = job.joblines.reduce((acc, val) => acc + val.mod_lb_hrs, 0);
+ });
+ jobData.tthrs = data.jobs
+ .reduce((acc, val) => acc + val.tthrs, 0)
+ .toFixed(1);
+ jobData.count = data.jobs.length.toFixed(0);
+
return {
fixed: ret,
combinedData: combinedData,
labData: labData,
larData: larData,
+ jobData: jobData,
};
}, [fixedPeriods, data, bodyshop]);
@@ -356,7 +368,10 @@ export function ScoreboardTimeTicketsStats({ bodyshop }) {
-
+
{/* This Month */}
-
+
@@ -482,7 +482,7 @@ export function ScoreboardTicketsStats({ data, bodyshop }) {
{/* Last Month */}
-
+
@@ -556,7 +556,7 @@ export function ScoreboardTicketsStats({ data, bodyshop }) {
{/* Efficiency Over Period */}
-
+
+
+
+
+
+
+
+
+
+
+
+ {t("scoreboard.labels.totalhrs")}
+
+ }
+ value={jobData.tthrs}
+ valueStyle={{
+ fontSize: statisticSize,
+ fontWeight: statisticWeight,
+ }}
+ />
+
+
+
+
{/* Disclaimer */}
diff --git a/client/src/graphql/timetickets.queries.js b/client/src/graphql/timetickets.queries.js
index bb90c4e9d..9f3dec512 100644
--- a/client/src/graphql/timetickets.queries.js
+++ b/client/src/graphql/timetickets.queries.js
@@ -143,9 +143,14 @@ export const QUERY_TIME_TICKETS_IN_RANGE_SB = gql`
$end: date!
$fixedStart: date!
$fixedEnd: date!
+ $jobStart: timestamptz!
+ $jobEnd: timestamptz!
) {
timetickets(
- where: { date: { _gte: $start, _lte: $end }, cost_center: {_neq: "timetickets.labels.shift"} }
+ where: {
+ date: { _gte: $start, _lte: $end }
+ cost_center: { _neq: "timetickets.labels.shift" }
+ }
order_by: { date: desc_nulls_first }
) {
actualhrs
@@ -176,7 +181,10 @@ export const QUERY_TIME_TICKETS_IN_RANGE_SB = gql`
}
}
fixedperiod: timetickets(
- where: { date: { _gte: $fixedStart, _lte: $fixedEnd }, cost_center: {_neq: "timetickets.labels.shift"} }
+ where: {
+ date: { _gte: $fixedStart, _lte: $fixedEnd }
+ cost_center: { _neq: "timetickets.labels.shift" }
+ }
order_by: { date: desc_nulls_first }
) {
actualhrs
@@ -205,6 +213,25 @@ export const QUERY_TIME_TICKETS_IN_RANGE_SB = gql`
last_name
}
}
+ jobs(
+ where: {
+ date_invoiced: { _is_null: true }
+ ro_number: { _is_null: false }
+ voided: { _eq: false }
+ _or: [
+ { actual_completion: { _gte: $jobStart, _lte: $jobEnd } }
+ { actual_delivery: { _gte: $jobStart, _lte: $jobEnd } }
+ ]
+ }
+ ) {
+ id
+ joblines(order_by: { line_no: asc }, where: { removed: { _eq: false } }) {
+ convertedtolbr
+ convertedtolbr_data
+ mod_lb_hrs
+ mod_lbr_ty
+ }
+ }
}
`;
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index bbac4cc7b..04a647924 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -2695,6 +2695,7 @@
"efficiencyoverperiod": "Efficiency over Selected Dates",
"entries": "Scoreboard Entries",
"jobs": "Jobs",
+ "jobscompletednotinvoiced": "Completed Not Invoiced",
"lastmonth": "Last Month",
"lastweek": "Last Week",
"monthlytarget": "Monthly",
@@ -2709,6 +2710,7 @@
"timetickets": "Time Tickets",
"timeticketsemployee": "Time Tickets by Employee",
"todateactual": "Actual (MTD)",
+ "totalhrs": "Total Hours",
"totaloverperiod": "Total over Selected Dates",
"weeklyactual": "Actual (W)",
"weeklytarget": "Weekly",
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 33cf621da..56ca50899 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -2695,6 +2695,7 @@
"efficiencyoverperiod": "",
"entries": "",
"jobs": "",
+ "jobscompletednotinvoiced": "",
"lastmonth": "",
"lastweek": "",
"monthlytarget": "",
@@ -2709,6 +2710,7 @@
"timetickets": "",
"timeticketsemployee": "",
"todateactual": "",
+ "totalhrs": "",
"totaloverperiod": "",
"weeklyactual": "",
"weeklytarget": "",
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index 3b5251fa7..690bf246b 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -2695,6 +2695,7 @@
"efficiencyoverperiod": "",
"entries": "",
"jobs": "",
+ "jobscompletednotinvoiced": "",
"lastmonth": "",
"lastweek": "",
"monthlytarget": "",
@@ -2709,6 +2710,7 @@
"timetickets": "",
"timeticketsemployee": "",
"todateactual": "",
+ "totalhrs": "",
"totaloverperiod": "",
"weeklyactual": "",
"weeklytarget": "",