"use client"; import { RiArrowDownSLine, RiArrowRightSLine, RiCheckboxCircleFill, } from "@remixicon/react"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; import { useState } from "react"; import MoneyValues from "@/components/money-values"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent } from "@/components/ui/card"; import { Checkbox } from "@/components/ui/checkbox"; import { Progress } from "@/components/ui/progress"; import { cn } from "@/lib/utils/ui"; import type { InstallmentGroup } from "./types"; type InstallmentGroupCardProps = { group: InstallmentGroup; selectedInstallments: Set; onToggleGroup: () => void; onToggleInstallment: (installmentId: string) => void; }; export function InstallmentGroupCard({ group, selectedInstallments, onToggleGroup, onToggleInstallment, }: InstallmentGroupCardProps) { const [isExpanded, setIsExpanded] = useState(false); const unpaidInstallments = group.pendingInstallments.filter( (i) => !i.isSettled, ); const unpaidCount = unpaidInstallments.length; const isFullySelected = selectedInstallments.size === unpaidInstallments.length && unpaidInstallments.length > 0; const progress = group.totalInstallments > 0 ? (group.paidInstallments / group.totalInstallments) * 100 : 0; const selectedAmount = group.pendingInstallments .filter((i) => selectedInstallments.has(i.id) && !i.isSettled) .reduce((sum, i) => sum + Number(i.amount), 0); // Calcular valor total de todas as parcelas (pagas + pendentes) const totalAmount = group.pendingInstallments.reduce( (sum, i) => sum + i.amount, 0, ); // Calcular valor pendente (apenas não pagas) const pendingAmount = unpaidInstallments.reduce( (sum, i) => sum + i.amount, 0, ); return ( {/* Header do card */}
{group.cartaoLogo && ( {group.cartaoName} )} {group.name}| {group.cartaoName}
Total:
Pendente:
{/* Progress bar */}
{group.paidInstallments} de {group.totalInstallments} pagas
{unpaidCount} {unpaidCount === 1 ? "pendente" : "pendentes"} {selectedInstallments.size > 0 && ( • Selecionado:{" "} )}
{/* Botão de expandir */}
{/* Lista de parcelas expandida */} {isExpanded && (
{group.pendingInstallments.map((installment) => { const isSelected = selectedInstallments.has(installment.id); const isPaid = installment.isSettled; const dueDate = installment.dueDate ? format(installment.dueDate, "dd/MM/yyyy", { locale: ptBR }) : format(installment.purchaseDate, "dd/MM/yyyy", { locale: ptBR, }); return (
!isPaid && onToggleInstallment(installment.id) } aria-label={`Selecionar parcela ${installment.currentInstallment} de ${group.totalInstallments}`} />

Parcela {installment.currentInstallment}/ {group.totalInstallments} {isPaid && ( Pago )}

Vencimento: {dueDate}

); })}
)}
); }