mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-05-09 19:01:47 +00:00
refactor(dashboard): reorganiza widgets e remove magnet-lines
This commit is contained in:
104
lib/dashboard/invoices-helpers.ts
Normal file
104
lib/dashboard/invoices-helpers.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import type { DashboardInvoice } from "@/lib/dashboard/invoices";
|
||||
import type { PaymentDialogState } from "@/lib/dashboard/use-payment-dialog-controller";
|
||||
import {
|
||||
INVOICE_PAYMENT_STATUS,
|
||||
type InvoicePaymentStatus,
|
||||
} from "@/lib/faturas";
|
||||
import { getBusinessDateString } from "@/lib/utils/date";
|
||||
import {
|
||||
buildDueDateInfoFromPeriodDay,
|
||||
formatFinancialDateLabel,
|
||||
} from "@/lib/utils/financial-dates";
|
||||
import { formatPercentage } from "@/lib/utils/percentage";
|
||||
import { formatPeriodForUrl } from "@/lib/utils/period";
|
||||
|
||||
export type InvoiceDialogState = PaymentDialogState;
|
||||
export type InvoiceLogoTone = "muted" | "accent";
|
||||
|
||||
type InvoicePaymentDateInfo = {
|
||||
label: string;
|
||||
};
|
||||
|
||||
type InvoiceDueDateInfo = {
|
||||
label: string;
|
||||
date: string | null;
|
||||
};
|
||||
|
||||
export const buildInvoiceInitials = (value: string) => {
|
||||
const parts = value.trim().split(/\s+/).filter(Boolean);
|
||||
if (parts.length === 0) {
|
||||
return "CC";
|
||||
}
|
||||
if (parts.length === 1) {
|
||||
const firstPart = parts[0];
|
||||
return firstPart ? firstPart.slice(0, 2).toUpperCase() : "CC";
|
||||
}
|
||||
const firstChar = parts[0]?.[0] ?? "";
|
||||
const secondChar = parts[1]?.[0] ?? "";
|
||||
return `${firstChar}${secondChar}`.toUpperCase() || "CC";
|
||||
};
|
||||
|
||||
export const parseInvoiceDueDate = (
|
||||
period: string,
|
||||
dueDay: string,
|
||||
): InvoiceDueDateInfo => {
|
||||
return buildDueDateInfoFromPeriodDay(period, dueDay);
|
||||
};
|
||||
|
||||
export const formatInvoicePaymentDate = (
|
||||
value: string | null,
|
||||
): InvoicePaymentDateInfo | null => {
|
||||
const label = formatFinancialDateLabel(value, "Pago em");
|
||||
if (!label) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
label,
|
||||
};
|
||||
};
|
||||
|
||||
export const getCurrentDateString = () => getBusinessDateString();
|
||||
|
||||
const formatInvoiceSharePercentage = (value: number) => {
|
||||
if (!Number.isFinite(value) || value <= 0) {
|
||||
return "0%";
|
||||
}
|
||||
const digits = value >= 10 ? 0 : value >= 1 ? 1 : 2;
|
||||
return formatPercentage(value, {
|
||||
minimumFractionDigits: digits,
|
||||
maximumFractionDigits: digits,
|
||||
});
|
||||
};
|
||||
|
||||
export const getInvoiceShareLabel = (amount: number, total: number) => {
|
||||
if (total <= 0) {
|
||||
return "0% do total";
|
||||
}
|
||||
const percentage = (amount / total) * 100;
|
||||
return `${formatInvoiceSharePercentage(percentage)} do total`;
|
||||
};
|
||||
|
||||
export const getInvoiceStatusBadgeVariant = (
|
||||
statusLabel: string,
|
||||
): "success" | "info" => {
|
||||
if (statusLabel.toLowerCase() === "em aberto") {
|
||||
return "info";
|
||||
}
|
||||
return "success";
|
||||
};
|
||||
|
||||
export const buildInvoiceDetailsHref = (cardId: string, period: string) =>
|
||||
`/cartoes/${cardId}/fatura?periodo=${formatPeriodForUrl(period)}`;
|
||||
|
||||
export const markInvoiceAsPaid = (
|
||||
invoice: DashboardInvoice,
|
||||
paidAt: string,
|
||||
): DashboardInvoice => ({
|
||||
...invoice,
|
||||
paymentStatus: INVOICE_PAYMENT_STATUS.PAID,
|
||||
paidAt,
|
||||
});
|
||||
|
||||
export const isInvoicePaid = (status: InvoicePaymentStatus) =>
|
||||
status === INVOICE_PAYMENT_STATUS.PAID;
|
||||
Reference in New Issue
Block a user