"use client"; import { cancelInstallmentAnticipationAction } from "@/app/(dashboard)/lancamentos/anticipation-actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import type { InstallmentAnticipationWithRelations } from "@/lib/installments/anticipation-types"; import { displayPeriod } from "@/lib/utils/period"; import { RiCalendarCheckLine, RiCloseLine, RiEyeLine } from "@remixicon/react"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; import { useTransition } from "react"; import { toast } from "sonner"; import MoneyValues from "@/components/money-values"; interface AnticipationCardProps { anticipation: InstallmentAnticipationWithRelations; onViewLancamento?: (lancamentoId: string) => void; onCanceled?: () => void; } export function AnticipationCard({ anticipation, onViewLancamento, onCanceled, }: AnticipationCardProps) { const [isPending, startTransition] = useTransition(); const isSettled = anticipation.lancamento.isSettled === true; const canCancel = !isSettled; const formatDate = (date: Date) => { return format(date, "dd 'de' MMMM 'de' yyyy", { locale: ptBR }); }; const handleCancel = async () => { startTransition(async () => { const result = await cancelInstallmentAnticipationAction({ anticipationId: anticipation.id, }); if (result.success) { toast.success(result.message); onCanceled?.(); } else { toast.error(result.error || "Erro ao cancelar antecipação"); } }); }; const handleViewLancamento = () => { onViewLancamento?.(anticipation.lancamentoId); }; return (
{anticipation.installmentCount}{" "} {anticipation.installmentCount === 1 ? "parcela antecipada" : "parcelas antecipadas"} {formatDate(anticipation.anticipationDate)}
{displayPeriod(anticipation.anticipationPeriod)}
Valor Original
{Number(anticipation.discount) > 0 && (
Desconto
-
)}
0 ? "col-span-2 border-t pt-3" : ""}>
{Number(anticipation.discount) > 0 ? "Valor Final" : "Valor Total"}
Status do Lançamento
{isSettled ? "Pago" : "Pendente"}
{anticipation.pagador && (
Pagador
{anticipation.pagador.name}
)} {anticipation.categoria && (
Categoria
{anticipation.categoria.name}
)}
{anticipation.note && (
Observação
{anticipation.note}
)}
{canCancel && ( Cancelar Antecipação } title="Cancelar antecipação?" description="Esta ação irá reverter a antecipação e restaurar as parcelas originais. O lançamento de antecipação será removido." confirmLabel="Cancelar Antecipação" confirmVariant="destructive" pendingLabel="Cancelando..." onConfirm={handleCancel} /> )} {isSettled && (
Não é possível cancelar uma antecipação paga
)}
); }