mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-05-09 11:01:45 +00:00
fix(financeiro): alinhar saldo, métricas e relatórios
This commit is contained in:
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user