import { RiBarcodeLine, RiCheckboxCircleLine, RiHourglass2Line, RiWallet3Line, } from "@remixicon/react"; import { EstabelecimentoLogo } from "@/components/lancamentos/shared/estabelecimento-logo"; import MoneyValues from "@/components/money-values"; import { CardContent } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { WidgetEmptyState } from "@/components/widget-empty-state"; import type { PagadorBoletoItem, PagadorPaymentStatusData, } from "@/lib/pagadores/details"; import { cn } from "@/lib/utils/ui"; // --- Boleto helpers --- const DATE_FORMATTER = new Intl.DateTimeFormat("pt-BR", { day: "2-digit", month: "short", year: "numeric", timeZone: "UTC", }); const buildDateLabel = (value: string | null, prefix?: string) => { if (!value) return null; const [year, month, day] = value.split("-").map((part) => Number(part)); if (!year || !month || !day) return null; const formatted = DATE_FORMATTER.format( new Date(Date.UTC(year, month - 1, day)), ); return prefix ? `${prefix} ${formatted}` : formatted; }; const buildStatusLabel = (item: PagadorBoletoItem) => { if (item.isSettled) return buildDateLabel(item.boletoPaymentDate, "Pago em"); return buildDateLabel(item.dueDate, "Vence em"); }; // --- PagadorBoletoCard --- type PagadorBoletoCardProps = { items: PagadorBoletoItem[]; }; export function PagadorBoletoCard({ items }: PagadorBoletoCardProps) { if (items.length === 0) { return ( } title="Nenhum boleto cadastrado para o período" description="Quando houver despesas registradas com boleto, elas aparecerão aqui." /> ); } return ( {items.map((item) => { const statusLabel = buildStatusLabel(item); return ( {item.name} {statusLabel ? ( {statusLabel} ) : null} ); })} ); } // --- PagadorPaymentStatusCard --- type PagadorPaymentStatusCardProps = { data: PagadorPaymentStatusData; }; export function PagadorPaymentStatusCard({ data, }: PagadorPaymentStatusCardProps) { const { paidAmount, paidCount, pendingAmount, pendingCount, totalAmount } = data; if (totalAmount === 0) { return ( } title="Nenhuma despesa no período" description="Registre lançamentos para visualizar o status de pagamento." /> ); } const paidPercentage = (paidAmount / totalAmount) * 100; return ( Pago ({paidCount} registro{paidCount !== 1 ? "s" : ""}) Pendente ({pendingCount} registro{pendingCount !== 1 ? "s" : ""}) ); }