fix(financeiro): alinhar saldo, métricas e relatórios

This commit is contained in:
Felipe Coutinho
2026-04-03 18:10:43 +00:00
parent acaf9d5c27
commit 549a5bdba1
32 changed files with 960 additions and 118 deletions

View File

@@ -1,6 +1,9 @@
import {
buildDateOnlyStringFromPeriodDay,
formatDateOnlyLabel,
getBusinessDateString,
parseUtcDateString,
toDateOnlyString,
} from "@/shared/utils/date";
type FinancialStatusLabelInput = {
@@ -16,6 +19,8 @@ type FinancialDueDateInfo = {
date: string | null;
};
type RelativeFinancialDateContext = "due" | "paid";
export function formatFinancialDateLabel(
value: string | null,
prefix?: string,
@@ -24,6 +29,63 @@ export function formatFinancialDateLabel(
return formatDateOnlyLabel(value, prefix, options);
}
function getOffsetDateString(
referenceDate: string,
offset: number,
): string | null {
const parsedReference = parseUtcDateString(referenceDate);
if (!parsedReference) {
return null;
}
parsedReference.setUTCDate(parsedReference.getUTCDate() + offset);
return toDateOnlyString(parsedReference);
}
export function formatRelativeFinancialDateLabel(
value: string | null,
context: RelativeFinancialDateContext,
options?: {
referenceDate?: string | Date | null;
},
): string | null {
const normalizedValue = toDateOnlyString(value);
if (!normalizedValue) {
return null;
}
const referenceDate =
toDateOnlyString(options?.referenceDate) ?? getBusinessDateString();
const yesterday = getOffsetDateString(referenceDate, -1);
const tomorrow = getOffsetDateString(referenceDate, 1);
if (context === "due") {
if (normalizedValue === referenceDate) {
return "Vence hoje";
}
if (normalizedValue === tomorrow) {
return "Vence amanhã";
}
if (normalizedValue === yesterday) {
return "Venceu ontem";
}
return formatFinancialDateLabel(normalizedValue, "Vence em");
}
if (normalizedValue === referenceDate) {
return "Pago hoje";
}
if (normalizedValue === yesterday) {
return "Pago ontem";
}
return formatFinancialDateLabel(normalizedValue, "Pago em");
}
export function buildFinancialStatusLabel({
isSettled,
dueDate,
@@ -38,6 +100,18 @@ export function buildFinancialStatusLabel({
return formatFinancialDateLabel(dueDate, duePrefix);
}
export function buildRelativeFinancialStatusLabel({
isSettled,
dueDate,
paidAt,
}: FinancialStatusLabelInput): string | null {
if (isSettled) {
return formatRelativeFinancialDateLabel(paidAt, "paid");
}
return formatRelativeFinancialDateLabel(dueDate, "due");
}
export function buildDueDateInfoFromPeriodDay(
period: string,
dueDay: string,
@@ -64,3 +138,28 @@ export function buildDueDateInfoFromPeriodDay(
date: dueDate,
};
}
export function buildRelativeDueDateInfoFromPeriodDay(
period: string,
dueDay: string,
options?: {
fallbackPrefix?: string;
},
): FinancialDueDateInfo {
const fallbackPrefix = options?.fallbackPrefix ?? "Vence dia";
const dueDate = buildDateOnlyStringFromPeriodDay(period, dueDay);
if (!dueDate) {
return {
label: `${fallbackPrefix} ${dueDay}`,
date: null,
};
}
return {
label:
formatRelativeFinancialDateLabel(dueDate, "due") ??
`${fallbackPrefix} ${dueDay}`,
date: dueDate,
};
}