From 811f40002bda70c847d3d44db288308ab15a4407 Mon Sep 17 00:00:00 2001 From: Giuliano Paschoalino Date: Tue, 20 Jan 2026 09:58:16 -0300 Subject: [PATCH] Refactor data processing: enhance getLastConsolidatedYear function to filter valid consolidated data and improve cost indicator handling --- .../graph/cativoXLivreChart/index.tsx | 65 ++++++++++++++----- src/pages/costIndicator/index.tsx | 38 ++++++----- src/pages/dashboard/index.tsx | 19 ++++-- src/pages/economy/index.tsx | 19 +++++- src/pages/forgotPassword/index.tsx | 2 +- src/pages/index.tsx | 4 +- src/pages/news/index.tsx | 2 +- src/pages/verifyEmail/index.tsx | 2 +- src/services/ssrApi.ts | 6 +- src/utils/dataProcessing.ts | 17 ++++- 10 files changed, 125 insertions(+), 49 deletions(-) diff --git a/src/components/graph/cativoXLivreChart/index.tsx b/src/components/graph/cativoXLivreChart/index.tsx index d2d8130..8724d37 100644 --- a/src/components/graph/cativoXLivreChart/index.tsx +++ b/src/components/graph/cativoXLivreChart/index.tsx @@ -14,6 +14,7 @@ import { CativoXLivreChartView } from './CativoXLivreChartView'; import ChartTitle from '../ChartTitle'; import pattern from 'patternomaly' import { config } from '../config'; +import { getLastConsolidatedYear } from '../../../utils/dataProcessing'; ChartJS.register( LinearScale, @@ -75,15 +76,45 @@ interface LineBarChartInterface { export function CativoXLivreChart({ title, subtitle, chartData, label, dataset1, dataset2, dataset3, barLabel, hashurado, miniature }: LineBarChartInterface) { const chartRef = useRef(null); - const labels = label + // Filter data by last consolidated year + const lastConsolidatedYear = getLastConsolidatedYear(chartData || [], true); + + // Helper function to extract year from mes field + const extractYear = (mes: string): number => { + if (!mes) return lastConsolidatedYear; + const mesStr = mes.toString(); + if (mesStr.includes('-')) { + return parseInt(mesStr.split('-')[0]); + } + if (mesStr.includes('/')) { + return parseInt(mesStr.split('/')[1]); + } + return lastConsolidatedYear; + }; + + // Filter data and labels together to keep them in sync + const filteredData: { chartData: any[], labels: any[] } = { chartData: [], labels: [] }; + + chartData?.forEach((value, index) => { + const year = extractYear(value.mes); + if (year === lastConsolidatedYear) { + filteredData.chartData.push(value); + if (label && label[index]) { + filteredData.labels.push(label[index]); + } + } + }); + + const filteredChartData = filteredData.chartData.length > 0 ? filteredData.chartData : chartData; + const labels = filteredData.labels.length > 0 ? filteredData.labels : label; const options: any = config(miniature) - const hasEstimated = chartData?.some((value) => value.dad_estimado) + const hasEstimated = filteredChartData?.some((value) => value.dad_estimado) const data: any = { labels, - datasets: chartData?.map(value => value.dad_estimado)?.includes(true) ? [ + datasets: filteredChartData?.map(value => value.dad_estimado)?.includes(true) ? [ { type: 'line' as const, label: dataset1? dataset1 : 'Dataset 1', @@ -95,53 +126,53 @@ export function CativoXLivreChart({ title, subtitle, chartData, label, dataset1, }, borderWidth: 2, fill: false, - data: chartData?.map(value => parseInt(value.economia_mensal)), + data: filteredChartData?.map(value => parseInt(value.economia_mensal)), }, { type: 'bar' as const, label: 'Cativo', - data: chartData?.map(value => { + data: filteredChartData?.map(value => { if (!value.dad_estimado) return parseInt(value.custo_cativo) }), // skipNull: true, borderRadius: 8, backgroundColor: '#C2D5FB', - skipNull: chartData?.map(value => value.dad_estimado)?.includes(true) + skipNull: filteredChartData?.map(value => value.dad_estimado)?.includes(true) }, { type: 'bar' as const, label: 'Livre', - data: chartData?.filter(value => !value.dad_estimad? true : false).map(value => { + data: filteredChartData?.filter(value => !value.dad_estimad? true : false).map(value => { if (!value.dad_estimado) return parseInt(value.custo_livre) }), // skipNull: true, borderRadius: 8, backgroundColor: '#255488', - skipNull: chartData?.map(value => value.dad_estimado)?.includes(true) + skipNull: filteredChartData?.map(value => value.dad_estimado)?.includes(true) }, { type: 'bar', label: 'Est. Cativo', - data: chartData?.map(value => { + data: filteredChartData?.map(value => { if (value.dad_estimado) return parseInt(value.custo_cativo) }), borderRadius: 8, backgroundColor: pattern.draw('diagonal-right-left', '#C2D5FB'), - skipNull: chartData?.map(value => value.dad_estimado)?.includes(true) + skipNull: filteredChartData?.map(value => value.dad_estimado)?.includes(true) }, { type: 'bar', label: 'Est. Livre', - data: chartData?.map(value => { + data: filteredChartData?.map(value => { if (value.dad_estimado) return parseInt(value.custo_livre) }), borderRadius: 8, backgroundColor: pattern.draw('diagonal-right-left', '#255488'), - skipNull: chartData?.map(value => value.dad_estimado)?.includes(true) + skipNull: filteredChartData?.map(value => value.dad_estimado)?.includes(true) } ] : [ { @@ -155,31 +186,31 @@ export function CativoXLivreChart({ title, subtitle, chartData, label, dataset1, }, borderWidth: 2, fill: false, - data: chartData?.map(value => parseInt(value.economia_mensal)), + data: filteredChartData?.map(value => parseInt(value.economia_mensal)), }, { type: 'bar' as const, label: 'Cativo', - data: chartData?.map(value => { + data: filteredChartData?.map(value => { if (!value.dad_estimado) return parseInt(value.custo_cativo) }), // skipNull: true, borderRadius: 8, backgroundColor: '#C2D5FB', - skipNull: chartData?.map(value => value.dad_estimado)?.includes(true) + skipNull: filteredChartData?.map(value => value.dad_estimado)?.includes(true) }, { type: 'bar' as const, label: 'Livre', - data: chartData?.filter(value => !value.dad_estimad? true : false).map(value => { + data: filteredChartData?.filter(value => !value.dad_estimad? true : false).map(value => { if (!value.dad_estimado) return parseInt(value.custo_livre) }), // skipNull: true, borderRadius: 8, backgroundColor: '#255488', - skipNull: chartData?.map(value => value.dad_estimado)?.includes(true) + skipNull: filteredChartData?.map(value => value.dad_estimado)?.includes(true) } ], } diff --git a/src/pages/costIndicator/index.tsx b/src/pages/costIndicator/index.tsx index 2068bbf..a82c9b0 100644 --- a/src/pages/costIndicator/index.tsx +++ b/src/pages/costIndicator/index.tsx @@ -42,11 +42,12 @@ export default function CostIndicator({graphData, userName, clients}: any) { useEffect(() => { // Calculate the last consolidated year const lastYear = getLastConsolidatedYear(graphData, true) + console.log('Last Consolidated Year:', lastYear) + console.log('Graph Data:', graphData) setLastConsolidatedYear(lastYear) - // Populate graph data with consolidated and estimated data for that year - const populatedData = populateGraphDataForYear(graphData, lastYear) - setProcessedGraphData(populatedData) + // Keep the full dataset to show both years + setProcessedGraphData(graphData) }, [graphData]) useEffect(() => { @@ -55,11 +56,11 @@ export default function CostIndicator({graphData, userName, clients}: any) { {"type" : "=", "field":"dados_cadastrais.cod_smart_unidade", "value": unity} ] }:{}).then(res => { - // Apply data processing to filtered result + // Keep full dataset without filtering by year if (res.data.data && res.data.data.length > 0) { const lastYear = getLastConsolidatedYear(res.data.data, true) - const populatedData = populateGraphDataForYear(res.data.data, lastYear) - setGraphDataState(populatedData) + setLastConsolidatedYear(lastYear) + setGraphDataState(res.data.data) } else { setGraphDataState(res.data.data) } @@ -94,17 +95,24 @@ export default function CostIndicator({graphData, userName, clients}: any) {
- value.mes.slice(0, 4).includes(lastConsolidatedYear?.toString() || '')) - .map(value => value?.custo_unit && !!parseInt(value?.custo_unit) ? value.custo_unit : null) + value.mes?.slice(0, 4) === (lastConsolidatedYear && lastConsolidatedYear - 1)?.toString() && value.custo_unit !== undefined) + .map(value => value?.custo_unit && !!parseFloat(value?.custo_unit) ? value.custo_unit : null) : - processedGraphData.filter((value, index) => value.mes.slice(0, 4).includes(lastConsolidatedYear?.toString() || '')) - .map(value => value?.custo_unit && !!parseInt(value?.custo_unit) ? value.custo_unit : null)} - data2={unity!==''? graphDataState.filter((value, index) => value.mes.slice(0, 4).includes(lastConsolidatedYear?.toString() || '')) - .map(value => value?.custo_unit && !!parseInt(value?.custo_unit) ? value.custo_unit : null) + processedGraphData + .filter(value => value.mes?.slice(0, 4) === (lastConsolidatedYear && lastConsolidatedYear - 1)?.toString() && value.custo_unit !== undefined) + .map(value => value?.custo_unit && !!parseFloat(value?.custo_unit) ? value.custo_unit : null)} + data2={unity!==''? + graphDataState + .filter(value => value.mes?.slice(0, 4) === lastConsolidatedYear?.toString() && value.custo_unit !== undefined) + .map(value => value?.custo_unit && !!parseFloat(value?.custo_unit) ? value.custo_unit : null) : - processedGraphData.filter((value, index) => value.mes.slice(0, 4).includes(lastConsolidatedYear?.toString() || '')) - .map(value => value?.custo_unit && !!parseInt(value?.custo_unit) ? value.custo_unit : null)} + processedGraphData + .filter(value => value.mes?.slice(0, 4) === lastConsolidatedYear?.toString() && value.custo_unit !== undefined) + .map(value => value?.custo_unit && !!parseFloat(value?.custo_unit) ? value.custo_unit : null)} + years={[lastConsolidatedYear ? (lastConsolidatedYear - 1).toString() : '', lastConsolidatedYear?.toString() || '']} label={months} />
diff --git a/src/pages/dashboard/index.tsx b/src/pages/dashboard/index.tsx index 9aed9f2..89d7dfd 100644 --- a/src/pages/dashboard/index.tsx +++ b/src/pages/dashboard/index.tsx @@ -69,6 +69,7 @@ export default function Dashboard({ grossAnualGraph, grossAnualYears, grossMensa const [lastDataBrutaAnualS, setLastDataBrutaAnual] = useState('') const [processedMensalData, setProcessedMensalData] = useState(grossMensalGraph) const [lastConsolidatedYear, setLastConsolidatedYear] = useState(null) + const [lastConsolidatedYearIndicator, setLastConsolidatedYearIndicator] = useState(null) const [open, setOpen] = useState(true); const handleOpen = () => setOpen(true); @@ -103,6 +104,13 @@ export default function Dashboard({ grossAnualGraph, grossAnualYears, grossMensa setLastDataBrutaAnual(`${parseFloat(lastDataAnual).toFixed(3)}`) }, [grossMensalGraph, grossAnualGraph]) + useEffect(() => { + if (costIndicator && costIndicator.length > 0) { + const lastYear = getLastConsolidatedYear(costIndicator, true) + setLastConsolidatedYearIndicator(lastYear) + } + }, [costIndicator]) + return ( @@ -153,10 +161,13 @@ export default function Dashboard({ grossAnualGraph, grossAnualYears, grossMensa value?.mes.slice(0, 4).includes(costIndicator[0].mes.slice(0, 4))).map(value => value?.custo_unit && !!parseInt(value?.custo_unit) ? value.custo_unit : null)} - data2={costIndicator?.filter((value, index) => value?.mes.slice(0, 4).includes(costIndicator[costIndicator.length - 1].mes.slice(0, 4))).map(value => value?.custo_unit && !!parseInt(value?.custo_unit) ? value.custo_unit : null)} - // years={[costIndicator[0].mes.slice(0, 4), costIndicator[costIndicator.length - 1].mes.slice(0, 4)]} - years={[previousYear+'', currentYear+'']} + data1={costIndicator + ?.filter(value => value?.mes?.slice(0, 4) === (lastConsolidatedYearIndicator ? (lastConsolidatedYearIndicator - 1).toString() : '')) + .map(value => value?.custo_unit && !!parseFloat(value?.custo_unit) ? value.custo_unit : null)} + data2={costIndicator + ?.filter(value => value?.mes?.slice(0, 4) === (lastConsolidatedYearIndicator ? lastConsolidatedYearIndicator.toString() : '')) + .map(value => value?.custo_unit && !!parseFloat(value?.custo_unit) ? value.custo_unit : null)} + years={[lastConsolidatedYearIndicator ? (lastConsolidatedYearIndicator - 1).toString() : '', lastConsolidatedYearIndicator?.toString() || '']} label={months} miniature /> diff --git a/src/pages/economy/index.tsx b/src/pages/economy/index.tsx index 74db3f8..9a2dbe2 100644 --- a/src/pages/economy/index.tsx +++ b/src/pages/economy/index.tsx @@ -33,6 +33,7 @@ export default function economy({ userName, anual, years, brutaMensal, catLiv, c const [catLivDataState, setCatLivDataState] = useState(null); const [indicatorDataState, setIndicatorDataState] = useState(null); + const [lastConsolidatedYearIndicator, setLastConsolidatedYearIndicator] = useState(null); const [processedBrutaMensal, setProcessedBrutaMensal] = useState(brutaMensal) const [lastConsolidatedYear, setLastConsolidatedYear] = useState(null) @@ -110,6 +111,14 @@ export default function economy({ userName, anual, years, brutaMensal, catLiv, c getChartsWithUnity() }, [unity]) + useEffect(() => { + if (indicatorDataState && indicatorDataState.length > 0) { + // Determine last consolidated year for cost indicator data (requires dad_estimado === false and custo_unit > 0) + const lastYear = getLastConsolidatedYear(indicatorDataState, true) + setLastConsolidatedYearIndicator(lastYear) + } + }, [indicatorDataState]) + return (
@@ -223,9 +232,13 @@ export default function economy({ userName, anual, years, brutaMensal, catLiv, c
value?.mes.slice(0, 4).includes(previousYear)).map(value => value?.custo_unit && !!parseInt(value?.custo_unit) ? value.custo_unit : null)} - data2={indicatorDataState?.filter(value => value?.mes.slice(0, 4).includes(currentYear)).map(value => value?.custo_unit && !!parseInt(value?.custo_unit) ? value.custo_unit : null)} - years={[previousYear+'', currentYear+'']} + data1={indicatorDataState?. + filter(value => value?.mes?.slice(0, 4) === (lastConsolidatedYearIndicator ? (lastConsolidatedYearIndicator - 1).toString() : '')) + .map(value => value?.custo_unit && !!parseFloat(value?.custo_unit) ? value.custo_unit : null)} + data2={indicatorDataState?. + filter(value => value?.mes?.slice(0, 4) === (lastConsolidatedYearIndicator ? lastConsolidatedYearIndicator.toString() : '')) + .map(value => value?.custo_unit && !!parseFloat(value?.custo_unit) ? value.custo_unit : null)} + years={[lastConsolidatedYearIndicator ? (lastConsolidatedYearIndicator - 1).toString() : '', lastConsolidatedYearIndicator?.toString() || '']} label={months} />
diff --git a/src/pages/forgotPassword/index.tsx b/src/pages/forgotPassword/index.tsx index 8d731dd..36ca4f4 100644 --- a/src/pages/forgotPassword/index.tsx +++ b/src/pages/forgotPassword/index.tsx @@ -87,7 +87,7 @@ export default function ForgotPassword() { Ou -

+55(41) 3012-5900
www.energiasmart.com.br

+

+55(41) 3012-5900
www.smartenergia.com.br

diff --git a/src/pages/index.tsx b/src/pages/index.tsx index b367b06..2f7f75e 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -197,11 +197,11 @@ export default function Home() { +55(41) 3012-5900
- www.energiasmart.com.br + www.smartenergia.com.br

diff --git a/src/pages/news/index.tsx b/src/pages/news/index.tsx index ea44552..858ee5f 100644 --- a/src/pages/news/index.tsx +++ b/src/pages/news/index.tsx @@ -45,7 +45,7 @@ export default function aboutUs({userName, news}: any) { }) } - Ver todas as notícias diff --git a/src/pages/verifyEmail/index.tsx b/src/pages/verifyEmail/index.tsx index 852ba0a..b1d5dc9 100644 --- a/src/pages/verifyEmail/index.tsx +++ b/src/pages/verifyEmail/index.tsx @@ -173,7 +173,7 @@ export default function VerifyEmail() { Ou -

+55(41) 3012-5900
www.energiasmart.com.br

+

+55(41) 3012-5900
www.smartenergia.com.br

diff --git a/src/services/ssrApi.ts b/src/services/ssrApi.ts index 50ef360..d6f1a5b 100644 --- a/src/services/ssrApi.ts +++ b/src/services/ssrApi.ts @@ -18,11 +18,11 @@ export default function getAPIClient( const { '@smartAuth-token': token } = parseCookies(ctx) const api = axios.create({ - // baseURL: 'https://api.energiasmart.com.br/api' - // baseURL: 'https://api.energiasmart.klupp.com.br/api' + // baseURL: 'https://api.smartenergia.com.br/api' + // baseURL: 'https://api.smartenergia.klupp.com.br/api' baseURL: process.env.NODE_ENV === 'production' - ? 'https://api.energiasmart.com.br/api' + ? 'https://api.smartenergia.com.br/api' : 'http://127.0.0.1:8000/api' }) diff --git a/src/utils/dataProcessing.ts b/src/utils/dataProcessing.ts index b483e56..c06770f 100644 --- a/src/utils/dataProcessing.ts +++ b/src/utils/dataProcessing.ts @@ -49,8 +49,21 @@ export function getLastConsolidatedYear(data: EconomyData[], isMonthly: boolean return new Date().getFullYear(); } - // Filter only consolidated data (dad_estimado === false) - const consolidatedData = data.filter(item => !item.dad_estimado); + // Filter only consolidated data (dad_estimado === false explicitly) + // Also ensure the entry has valid data (not just a date placeholder) + // For cost indicator data, also check that custo_unit is not zero + const consolidatedData = data.filter(item => { + if (item.dad_estimado !== false) return false; + + // If custo_unit exists, it must be > 0 to be considered consolidated + if (item.custo_unit !== undefined) { + const costValue = parseFloat(item.custo_unit); + return !isNaN(costValue) && costValue > 0; + } + + // For other data types, check if they have valid data fields + return item.economia_acumulada !== undefined || item.economia_mensal !== undefined; + }); // Extract all years present in the dataset (consolidated + estimated) const allYears = data