fix(analysis): use last business day of previous month for 'Vs. mes anterior' card

This commit is contained in:
Jose Selesan
2026-08-28 11:46:41 -03:00
parent 1fee87a4ce
commit 2fe8198c41

View File

@@ -1,5 +1,5 @@
import { Link, useNavigate } from "@tanstack/react-router";
import { subDays } from "date-fns";
import { subDays, subMonths } from "date-fns";
import { ArrowLeft } from "lucide-react";
import { useMemo, useState } from "react";
import {
@@ -13,7 +13,12 @@ import {
YAxis,
} from "recharts";
import { DatePicker } from "@/components/ui/date-picker";
import { useDailyQuotes, useHistoricalMinMax, useQuotes } from "@/lib/queries";
import {
useDailyQuotes,
useHistoricalMinMax,
useMonthlyLast,
useQuotes,
} from "@/lib/queries";
import { MonthlyVariationTable } from "./components/MonthlyVariationTable";
const CURRENCIES = ["BELO", "BLUE", "BNA"] as const;
@@ -86,19 +91,13 @@ export function AnalysisPage({ currency }: { currency: string }) {
const yesterday = subDays(today, 1);
const yesterdayStr = formatDate(yesterday);
const firstOfMonth = new Date(today.getFullYear(), today.getMonth(), 1);
const firstOfMonthStr = formatDate(firstOfMonth);
const { data: yesterdayQuote } = useDailyQuotes(
currency,
yesterdayStr,
yesterdayStr,
);
const { data: firstDayQuote } = useDailyQuotes(
currency,
firstOfMonthStr,
firstOfMonthStr,
);
const { data: monthlyLastData } = useMonthlyLast();
const chartData = useMemo(() => {
if (!daily) return [];
@@ -184,11 +183,21 @@ export function AnalysisPage({ currency }: { currency: string }) {
? (prevDayDiff / yesterdayBuy) * 100
: null;
const firstMonthBuy = firstDayQuote?.[0]?.buy ?? null;
const monthDiff = firstMonthBuy !== null ? currentBuy - firstMonthBuy : null;
const previousMonthBuy = useMemo(() => {
if (!monthlyLastData || monthlyLastData.length === 0) return null;
const prevMonth = subMonths(today, 1);
const prevMonthKey = `${prevMonth.getFullYear()}-${String(prevMonth.getMonth() + 1).padStart(2, "0")}`;
const entry = monthlyLastData.find(
(e) => e.month === prevMonthKey && e.type === currency,
);
return entry?.buy ?? null;
}, [monthlyLastData, currency, today]);
const monthDiff =
previousMonthBuy !== null ? currentBuy - previousMonthBuy : null;
const monthPct =
monthDiff !== null && firstMonthBuy !== null && firstMonthBuy !== 0
? (monthDiff / firstMonthBuy) * 100
monthDiff !== null && previousMonthBuy !== null && previousMonthBuy !== 0
? (monthDiff / previousMonthBuy) * 100
: null;
const backTo = currency === "BELO" ? "/quotes/belo" : "/quotes";
@@ -305,9 +314,7 @@ export function AnalysisPage({ currency }: { currency: string }) {
<VariationValue value={prevDayDiff} pct={prevDayPct} />
</div>
<div className="rounded-lg border p-4">
<p className="text-sm text-muted-foreground mb-2">
Vs. primer día del mes
</p>
<p className="text-sm text-muted-foreground mb-2">Vs. mes anterior</p>
<VariationValue value={monthDiff} pct={monthPct} />
</div>
</div>