From 0915ad12236ee4722994cebaa39b9dcf5f5fc2c3 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Thu, 4 Jun 2026 11:32:38 -0300 Subject: [PATCH] feat: enhance date handling and formatting in quotes and belo features --- apps/backend/src/lib/utils.ts | 10 ++++++++++ apps/backend/src/modules/expenses/expenses.service.ts | 4 +++- .../src/modules/quotes/handlers/getDailyMinMax.ts | 7 +++---- .../src/modules/quotes/handlers/getDailyQuotes.ts | 7 +++---- .../src/modules/quotes/handlers/getQuoteHistory.ts | 7 +++---- apps/frontend/src/features/belo/BeloAnalysisPage.tsx | 9 +++------ apps/frontend/src/features/belo/BeloPage.tsx | 11 ++++------- 7 files changed, 29 insertions(+), 26 deletions(-) diff --git a/apps/backend/src/lib/utils.ts b/apps/backend/src/lib/utils.ts index 17a2eaf..75502d6 100644 --- a/apps/backend/src/lib/utils.ts +++ b/apps/backend/src/lib/utils.ts @@ -8,3 +8,13 @@ export function startOfToday(): Date { d.setHours(0, 0, 0, 0); return d; } + +export function parseLocalDate(dateStr: string): Date { + const [y, m, d] = dateStr.split("-").map(Number); + return new Date(y, m - 1, d); +} + +export function startOfNextLocalDay(dateStr: string): Date { + const [y, m, d] = dateStr.split("-").map(Number); + return new Date(y, m - 1, d + 1); +} diff --git a/apps/backend/src/modules/expenses/expenses.service.ts b/apps/backend/src/modules/expenses/expenses.service.ts index 5e42a38..a529429 100644 --- a/apps/backend/src/modules/expenses/expenses.service.ts +++ b/apps/backend/src/modules/expenses/expenses.service.ts @@ -25,7 +25,9 @@ export const payExpenseSchema = z.object({ export const updateExpenseSchema = z.object({ amount: z.number().positive("El monto debe ser mayor a 0"), - dueDate: z.string().datetime({ message: "La fecha debe ser una fecha ISO válida" }), + dueDate: z + .string() + .datetime({ message: "La fecha debe ser una fecha ISO válida" }), }); function lastDayOfMonth(year: number, month: number): number { diff --git a/apps/backend/src/modules/quotes/handlers/getDailyMinMax.ts b/apps/backend/src/modules/quotes/handlers/getDailyMinMax.ts index 4b42e83..2b5d1c6 100644 --- a/apps/backend/src/modules/quotes/handlers/getDailyMinMax.ts +++ b/apps/backend/src/modules/quotes/handlers/getDailyMinMax.ts @@ -2,6 +2,7 @@ import type { Context } from "hono"; import type { QuoteType } from "../../../generated/prisma/client"; import { cache } from "../../../lib/cache"; import { prisma } from "../../../lib/prisma"; +import { parseLocalDate, startOfNextLocalDay } from "../../../lib/utils"; const VALID_TYPES = ["BLUE", "BNA", "BELO"] as const; @@ -22,11 +23,9 @@ export async function getDailyMinMax(c: Context) { const now = new Date(); const startDate = startDateParam - ? new Date(startDateParam) + ? parseLocalDate(startDateParam) : new Date(now.getFullYear(), now.getMonth(), 1); - const endDate = endDateParam - ? new Date(new Date(endDateParam).getTime() + 86_400_000) - : now; + const endDate = endDateParam ? startOfNextLocalDay(endDateParam) : now; if (Number.isNaN(startDate.getTime()) || Number.isNaN(endDate.getTime())) { return c.json({ error: "Invalid date format. Use ISO 8601." }, 400); diff --git a/apps/backend/src/modules/quotes/handlers/getDailyQuotes.ts b/apps/backend/src/modules/quotes/handlers/getDailyQuotes.ts index 0a45d61..d72d94a 100644 --- a/apps/backend/src/modules/quotes/handlers/getDailyQuotes.ts +++ b/apps/backend/src/modules/quotes/handlers/getDailyQuotes.ts @@ -1,6 +1,7 @@ import type { Context } from "hono"; import { cache } from "../../../lib/cache"; import { prisma } from "../../../lib/prisma"; +import { parseLocalDate, startOfNextLocalDay } from "../../../lib/utils"; const VALID_TYPES = ["BLUE", "BNA", "BELO"] as const; @@ -21,11 +22,9 @@ export async function getDailyQuotes(c: Context) { const now = new Date(); const startDate = startDateParam - ? new Date(startDateParam) + ? parseLocalDate(startDateParam) : new Date(now.getFullYear(), now.getMonth(), 1); - const endDate = endDateParam - ? new Date(new Date(endDateParam).getTime() + 86_400_000) - : now; + const endDate = endDateParam ? startOfNextLocalDay(endDateParam) : now; if (Number.isNaN(startDate.getTime()) || Number.isNaN(endDate.getTime())) { return c.json({ error: "Invalid date format. Use ISO 8601." }, 400); diff --git a/apps/backend/src/modules/quotes/handlers/getQuoteHistory.ts b/apps/backend/src/modules/quotes/handlers/getQuoteHistory.ts index c5e2012..36df196 100644 --- a/apps/backend/src/modules/quotes/handlers/getQuoteHistory.ts +++ b/apps/backend/src/modules/quotes/handlers/getQuoteHistory.ts @@ -2,6 +2,7 @@ import type { Context } from "hono"; import type { QuoteType } from "../../../generated/prisma/client"; import { cache } from "../../../lib/cache"; import { prisma } from "../../../lib/prisma"; +import { parseLocalDate, startOfNextLocalDay } from "../../../lib/utils"; const VALID_TYPES = ["BLUE", "BNA", "BELO"] as const; @@ -23,11 +24,9 @@ export async function getQuoteHistory(c: Context) { const now = new Date(); const startDate = startDateParam - ? new Date(startDateParam) + ? parseLocalDate(startDateParam) : new Date(now.getFullYear(), now.getMonth(), 1); - const endDate = endDateParam - ? new Date(new Date(endDateParam).getTime() + 86_400_000) - : now; + const endDate = endDateParam ? startOfNextLocalDay(endDateParam) : now; if (Number.isNaN(startDate.getTime()) || Number.isNaN(endDate.getTime())) { return c.json({ error: "Invalid date format. Use ISO 8601." }, 400); diff --git a/apps/frontend/src/features/belo/BeloAnalysisPage.tsx b/apps/frontend/src/features/belo/BeloAnalysisPage.tsx index 882bf62..01fd895 100644 --- a/apps/frontend/src/features/belo/BeloAnalysisPage.tsx +++ b/apps/frontend/src/features/belo/BeloAnalysisPage.tsx @@ -28,11 +28,8 @@ function formatDate(d: Date): string { } function formatShortDate(iso: string): string { - const d = new Date(iso); - return d.toLocaleDateString("es-AR", { - day: "2-digit", - month: "2-digit", - }); + const [, m, d] = iso.split("-"); + return `${d}/${m}`; } export function BeloAnalysisPage() { @@ -315,7 +312,7 @@ export function BeloAnalysisPage() { }} />