Merged in feature/IO-3562-VPB-Exclude-Suspended (pull request #3209)
IO-3562 Visual Production Board Statistics - Exclude Suspended Jobs Approved-by: Dave Richer
This commit is contained in:
@@ -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 },
|
||||
|
||||
@@ -14,7 +14,16 @@ const StatisticsSettings = ({ t, statisticsOrder, setStatisticsOrder, setHasChan
|
||||
};
|
||||
|
||||
return (
|
||||
<Card title={t("production.settings.statistics_title")}>
|
||||
<Card
|
||||
title={t("production.settings.statistics_title")}
|
||||
extra={
|
||||
<div style={{ display: "flex", alignItems: "center" }}>
|
||||
<Form.Item name="excludeSuspended" valuePropName="checked" style={{ marginBottom: 0 }}>
|
||||
<Checkbox>{t("production.settings.statistics.exclude_suspended")}</Checkbox>
|
||||
</Form.Item>
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<DragDropContext onDragEnd={onDragEnd}>
|
||||
<Droppable direction="grid" droppableId="statistics">
|
||||
{(provided) => (
|
||||
|
||||
@@ -91,7 +91,8 @@ const defaultKanbanSettings = {
|
||||
subtotal: false,
|
||||
statisticsOrder: statisticsItems.map((item) => item.id),
|
||||
selectedMdInsCos: [],
|
||||
selectedEstimators: []
|
||||
selectedEstimators: [],
|
||||
excludeSuspended: false
|
||||
};
|
||||
|
||||
const defaultFilters = { search: "", employeeId: null, alert: false };
|
||||
|
||||
Reference in New Issue
Block a user