From 940b2113ccb457cedbb49403aaeca453973083e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Wed, 6 May 2026 09:58:10 -0300 Subject: [PATCH] fix: use robust date parsing utility to handle varying n8n date formats --- src/dataService.ts | 17 +++++++++++++++++ src/pages/Clients.tsx | 4 ++-- src/pages/Dashboard.tsx | 4 ++-- src/pages/ProductDetails.tsx | 9 ++++----- src/pages/Products.tsx | 4 ++-- vite.config.ts | 9 +++++++++ 6 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/dataService.ts b/src/dataService.ts index 8c75211..5f442d8 100644 --- a/src/dataService.ts +++ b/src/dataService.ts @@ -52,3 +52,20 @@ export const fetchData = async (): Promise => { return []; } }; + +export const parseOrderDate = (dateStr: string): Date => { + if (!dateStr) return new Date(0); + if (dateStr.includes('T')) return new Date(dateStr); + const parts = dateStr.split(/[-/]/); + if (parts.length === 3) { + if (parts[0].length === 4) { + // YYYY-MM-DD + return new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2])); + } else { + // DD-MM-YYYY + return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0])); + } + } + const fallback = new Date(dateStr); + return isNaN(fallback.getTime()) ? new Date(0) : fallback; +}; diff --git a/src/pages/Clients.tsx b/src/pages/Clients.tsx index 315867a..cf75098 100644 --- a/src/pages/Clients.tsx +++ b/src/pages/Clients.tsx @@ -2,6 +2,7 @@ import { useMemo, useState } from 'react'; import { Link, useOutletContext } from 'react-router-dom'; import { Search, ChevronRight, Filter } from 'lucide-react'; import type { OrderData } from '../types'; +import { parseOrderDate } from '../dataService'; type SortOption = 'recent' | 'spent_desc' | 'spent_asc' | 'items_desc' | 'items_asc'; @@ -26,8 +27,7 @@ const Clients = () => { clientMap[clientName].totalItems += order.Quantidade; clientMap[clientName].uniqueOrders.add(`${order.Data_Pedido}_${order.Valor_Pedido}`); - const [day, month, year] = order.Data_Pedido.split('-').map(Number); - const orderTime = new Date(year, month - 1, day).getTime(); + const orderTime = parseOrderDate(order.Data_Pedido).getTime(); if (orderTime > clientMap[clientName].lastPurchase) { clientMap[clientName].lastPurchase = orderTime; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index 5ffbdbf..12c6325 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -4,6 +4,7 @@ import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContaine import { DollarSign, ShoppingCart, TrendingUp } from 'lucide-react'; import DateRangePicker from '../components/DateRangePicker'; import type { OrderData, DateRange } from '../types'; +import { parseOrderDate } from '../dataService'; const COLORS = [ '#10b981', '#3b82f6', '#8b5cf6', '#f43f5e', '#f97316', @@ -16,8 +17,7 @@ const Dashboard = () => { const filteredData = useMemo(() => { const orders = ordersData; return orders.filter(order => { - const [day, month, year] = order.Data_Pedido.split('-').map(Number); - const orderDate = new Date(year, month - 1, day); + const orderDate = parseOrderDate(order.Data_Pedido); return orderDate >= dateRange.start && orderDate <= dateRange.end; }); }, [dateRange, ordersData]); diff --git a/src/pages/ProductDetails.tsx b/src/pages/ProductDetails.tsx index 2c0995d..840034f 100644 --- a/src/pages/ProductDetails.tsx +++ b/src/pages/ProductDetails.tsx @@ -4,6 +4,7 @@ import { ArrowLeft, Package, DollarSign } from 'lucide-react'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'; import DateRangePicker from '../components/DateRangePicker'; import type { OrderData, DateRange } from '../types'; +import { parseOrderDate } from '../dataService'; const ProductDetails = () => { const { id } = useParams<{ id: string }>(); @@ -25,11 +26,9 @@ const ProductDetails = () => { let revenue = 0; orders.forEach(order => { - const [day, month, year] = order.Data_Pedido.split('-').map(Number); - const orderDate = new Date(year, month - 1, day); - - if (orderDate >= dateRange.start && orderDate <= dateRange.end) { - const dateStr = order.Data_Pedido; + const orderDate = parseOrderDate(order.Data_Pedido); + + if (orderDate >= dateRange.start && orderDate <= dateRange.end) { const dateStr = order.Data_Pedido; salesByDate[dateStr] = (salesByDate[dateStr] || 0) + order.Quantidade; sold += order.Quantidade; revenue += (order.Quantidade * order.Valor_Unitario); diff --git a/src/pages/Products.tsx b/src/pages/Products.tsx index 62e5aad..7889ca7 100644 --- a/src/pages/Products.tsx +++ b/src/pages/Products.tsx @@ -3,6 +3,7 @@ import { Link, useOutletContext } from 'react-router-dom'; import { Search, Package, TrendingUp } from 'lucide-react'; import DateRangePicker from '../components/DateRangePicker'; import type { OrderData, DateRange } from '../types'; +import { parseOrderDate } from '../dataService'; const Products = () => { const { dateRange, setDateRange, ordersData } = useOutletContext<{ dateRange: DateRange, setDateRange: (range: DateRange) => void, ordersData: OrderData[] }>(); @@ -13,8 +14,7 @@ const Products = () => { const productMap: Record = {}; orders.forEach(order => { - const [day, month, year] = order.Data_Pedido.split('-').map(Number); - const orderDate = new Date(year, month - 1, day); + const orderDate = parseOrderDate(order.Data_Pedido); if (orderDate < dateRange.start || orderDate > dateRange.end) return; if (!productMap[order.ID_Produto]) { diff --git a/vite.config.ts b/vite.config.ts index 982ffda..b310aec 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,5 +13,14 @@ export default defineConfig({ changeOrigin: true, } } + }, + preview: { + port: 3000, + proxy: { + '/api': { + target: 'http://localhost:3004', + changeOrigin: true, + } + } } })