|
|
|
|
@@ -28,11 +28,14 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => {
|
|
|
|
|
const { t } = useTranslation();
|
|
|
|
|
|
|
|
|
|
const calculateTotal = (items, key, subKey) => {
|
|
|
|
|
return items.reduce((acc, item) => acc + (item[key]?.aggregate?.sum?.[subKey] || 0), 0);
|
|
|
|
|
return items.reduce((acc, item) => acc + (item?.[key]?.aggregate?.sum?.[subKey] ?? 0), 0);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const calculateTotalAmount = (items, key) => {
|
|
|
|
|
return items.reduce((acc, item) => acc.add(Dinero(item[key]?.totals?.subtotal ?? Dinero())), Dinero({ amount: 0 }));
|
|
|
|
|
return items.reduce(
|
|
|
|
|
(acc, item) => acc.add(Dinero(item?.[key]?.totals?.subtotal ?? Dinero())),
|
|
|
|
|
Dinero({ amount: 0 })
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const calculateReducerTotalAmount = (lanes, key) => {
|
|
|
|
|
@@ -67,58 +70,83 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => {
|
|
|
|
|
return value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const filteredData = cardSettings.excludeSuspended === true ? data.filter((item) => item.suspended !== true) : data;
|
|
|
|
|
const filteredReducerData =
|
|
|
|
|
cardSettings.excludeSuspended === true
|
|
|
|
|
? {
|
|
|
|
|
...reducerData,
|
|
|
|
|
lanes: reducerData.lanes.map((lane) => ({
|
|
|
|
|
...lane,
|
|
|
|
|
cards: lane.cards.filter((card) => card.metadata.suspended !== true)
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
: reducerData;
|
|
|
|
|
|
|
|
|
|
const totalHrs = cardSettings.totalHrs
|
|
|
|
|
? parseFloat((calculateTotal(data, "labhrs", "mod_lb_hrs") + calculateTotal(data, "larhrs", "mod_lb_hrs")).toFixed(2))
|
|
|
|
|
? parseFloat(
|
|
|
|
|
(
|
|
|
|
|
calculateTotal(filteredData, "labhrs", "mod_lb_hrs") + calculateTotal(filteredData, "larhrs", "mod_lb_hrs")
|
|
|
|
|
).toFixed(2)
|
|
|
|
|
)
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const totalLAB = cardSettings.totalLAB
|
|
|
|
|
? parseFloat(calculateTotal(data, "labhrs", "mod_lb_hrs").toFixed(2))
|
|
|
|
|
? parseFloat(calculateTotal(filteredData, "labhrs", "mod_lb_hrs").toFixed(2))
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const totalLAR = cardSettings.totalLAR
|
|
|
|
|
? parseFloat(calculateTotal(data, "larhrs", "mod_lb_hrs").toFixed(2))
|
|
|
|
|
? parseFloat(calculateTotal(filteredData, "larhrs", "mod_lb_hrs").toFixed(2))
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const jobsInProduction = cardSettings.jobsInProduction ? data.length : null;
|
|
|
|
|
const jobsInProduction = cardSettings.jobsInProduction ? filteredData.length : null;
|
|
|
|
|
|
|
|
|
|
const totalAmountInProduction = cardSettings.totalAmountInProduction
|
|
|
|
|
? calculateTotalAmount(data, "job_totals").toFormat("$0,0.00")
|
|
|
|
|
? calculateTotalAmount(filteredData, "job_totals").toFormat("$0,0.00")
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const totalAmountOnBoard = reducerData && cardSettings.totalAmountOnBoard
|
|
|
|
|
? calculateReducerTotalAmount(reducerData.lanes, "job_totals").toFormat("$0,0.00")
|
|
|
|
|
: null;
|
|
|
|
|
const totalAmountOnBoard =
|
|
|
|
|
filteredReducerData && cardSettings.totalAmountOnBoard
|
|
|
|
|
? calculateReducerTotalAmount(filteredReducerData.lanes, "job_totals").toFormat("$0,0.00")
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const totalHrsOnBoard = reducerData && cardSettings.totalHrsOnBoard
|
|
|
|
|
? parseFloat((
|
|
|
|
|
calculateReducerTotal(reducerData.lanes, "labhrs", "mod_lb_hrs") +
|
|
|
|
|
calculateReducerTotal(reducerData.lanes, "larhrs", "mod_lb_hrs")
|
|
|
|
|
).toFixed(2))
|
|
|
|
|
: null;
|
|
|
|
|
const totalHrsOnBoard =
|
|
|
|
|
filteredReducerData && cardSettings.totalHrsOnBoard
|
|
|
|
|
? parseFloat(
|
|
|
|
|
(
|
|
|
|
|
calculateReducerTotal(filteredReducerData.lanes, "labhrs", "mod_lb_hrs") +
|
|
|
|
|
calculateReducerTotal(filteredReducerData.lanes, "larhrs", "mod_lb_hrs")
|
|
|
|
|
).toFixed(2)
|
|
|
|
|
)
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const totalLABOnBoard = reducerData && cardSettings.totalLABOnBoard
|
|
|
|
|
? parseFloat(calculateReducerTotal(reducerData.lanes, "labhrs", "mod_lb_hrs").toFixed(2))
|
|
|
|
|
: null;
|
|
|
|
|
const totalLABOnBoard =
|
|
|
|
|
filteredReducerData && cardSettings.totalLABOnBoard
|
|
|
|
|
? parseFloat(calculateReducerTotal(filteredReducerData.lanes, "labhrs", "mod_lb_hrs").toFixed(2))
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const totalLAROnBoard = reducerData && cardSettings.totalLAROnBoard
|
|
|
|
|
? parseFloat(calculateReducerTotal(reducerData.lanes, "larhrs", "mod_lb_hrs").toFixed(2))
|
|
|
|
|
: null;
|
|
|
|
|
const totalLAROnBoard =
|
|
|
|
|
filteredReducerData && cardSettings.totalLAROnBoard
|
|
|
|
|
? parseFloat(calculateReducerTotal(filteredReducerData.lanes, "larhrs", "mod_lb_hrs").toFixed(2))
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const jobsOnBoard = reducerData && cardSettings.jobsOnBoard
|
|
|
|
|
? reducerData.lanes.reduce((acc, lane) => acc + lane.cards.length, 0)
|
|
|
|
|
: null;
|
|
|
|
|
const jobsOnBoard =
|
|
|
|
|
filteredReducerData && cardSettings.jobsOnBoard
|
|
|
|
|
? filteredReducerData.lanes.reduce((acc, lane) => acc + lane.cards.length, 0)
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const tasksInProduction = cardSettings.tasksInProduction
|
|
|
|
|
? data.reduce((acc, item) => acc + (item.tasks_aggregate?.aggregate?.count || 0), 0)
|
|
|
|
|
? filteredData.reduce((acc, item) => acc + (item.tasks_aggregate?.aggregate?.count || 0), 0)
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const tasksOnBoard = reducerData && cardSettings.tasksOnBoard
|
|
|
|
|
? reducerData.lanes.reduce((acc, lane) => {
|
|
|
|
|
return (
|
|
|
|
|
acc + lane.cards.reduce((laneAcc, card) => laneAcc + (card.metadata.tasks_aggregate?.aggregate?.count || 0), 0)
|
|
|
|
|
);
|
|
|
|
|
}, 0)
|
|
|
|
|
: null;
|
|
|
|
|
const tasksOnBoard =
|
|
|
|
|
filteredReducerData && cardSettings.tasksOnBoard
|
|
|
|
|
? filteredReducerData.lanes.reduce((acc, lane) => {
|
|
|
|
|
return (
|
|
|
|
|
acc +
|
|
|
|
|
lane.cards.reduce((laneAcc, card) => laneAcc + (card.metadata.tasks_aggregate?.aggregate?.count || 0), 0)
|
|
|
|
|
);
|
|
|
|
|
}, 0)
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
const statistics = mergeStatistics(statisticsItems, [
|
|
|
|
|
{ id: 0, value: totalHrs, type: StatisticType.HOURS },
|
|
|
|
|
|