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() {
}}
/>