From cdcef798df724934bc7e9dad78f23c0576cf7881 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 5 Sep 2024 12:47:19 -0400 Subject: [PATCH] - Use Dinero in place of straight math in production board Signed-off-by: Dave Richer --- .../production-board-kanban.statistics.jsx | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx b/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx index 1af5ec59c..e2f5b6f08 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx @@ -3,6 +3,7 @@ import { Card, Statistic } from "antd"; import { useTranslation } from "react-i18next"; import PropTypes from "prop-types"; import { defaultKanbanSettings, statisticsItems } from "./settings/defaultKanbanSettings.js"; +import Dinero from "dinero.js"; export const StatisticType = { HOURS: "hours", @@ -32,7 +33,31 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { }; const calculateTotalAmount = (items, key) => { - return items.reduce((acc, item) => acc + (item[key]?.totals?.subtotal?.amount || 0), 0); + return items.reduce( + (acc, item) => { + const amountInCents = item[key]?.totals?.subtotal?.amount || 0; + const dineroAmount = Dinero({ amount: amountInCents }); + return acc.add(dineroAmount); + }, + Dinero({ amount: 0 }) + ); + }; + + const calculateReducerTotalAmount = (lanes, key) => { + return lanes.reduce( + (acc, lane) => { + const laneTotal = lane.cards.reduce( + (laneAcc, card) => { + const amountInCents = card.metadata[key]?.totals?.subtotal?.amount || 0; + const dineroAmount = Dinero({ amount: amountInCents }); + return laneAcc.add(dineroAmount); + }, + Dinero({ amount: 0 }) + ); + return acc.add(laneTotal); + }, + Dinero({ amount: 0 }) + ); }; const calculateReducerTotal = (lanes, key, subKey) => { @@ -43,14 +68,6 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { }, 0); }; - const calculateReducerTotalAmount = (lanes, key) => { - return lanes.reduce((acc, lane) => { - return ( - acc + lane.cards.reduce((laneAcc, card) => laneAcc + (card.metadata[key]?.totals?.subtotal?.amount || 0), 0) - ); - }, 0); - }; - const formatValue = (value, type) => { if (type === StatisticType.JOBS) { return value.toFixed(0); @@ -87,9 +104,15 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { const totalAmountInProduction = useMemo(() => { if (!cardSettings.totalAmountInProduction) return null; const total = calculateTotalAmount(data, "job_totals"); - return parseFloat(total.toFixed(2)); + return total.toFormat("$0,0.00"); // Formatting the Dinero object to a string }, [data, cardSettings.totalAmountInProduction]); + const totalAmountOnBoard = useMemo(() => { + if (!reducerData || !cardSettings.totalAmountOnBoard) return null; + const total = calculateReducerTotalAmount(reducerData.lanes, "job_totals"); + return total.toFormat("$0,0.00"); // Formatting the Dinero object to a string + }, [reducerData, cardSettings.totalAmountOnBoard]); + const totalHrsOnBoard = useMemo(() => { if (!reducerData || !cardSettings.totalHrsOnBoard) return null; const total = @@ -118,12 +141,6 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { [reducerData, cardSettings.jobsOnBoard] ); - const totalAmountOnBoard = useMemo(() => { - if (!reducerData || !cardSettings.totalAmountOnBoard) return null; - const total = calculateReducerTotalAmount(reducerData.lanes, "job_totals"); - return parseFloat(total.toFixed(2)); - }, [reducerData, cardSettings.totalAmountOnBoard]); - const tasksInProduction = useMemo(() => { if (!data || !cardSettings.tasksInProduction) return null; return data.reduce((acc, item) => acc + (item.tasks_aggregate?.aggregate?.count || 0), 0); @@ -191,7 +208,6 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => {