/** * Pending Payments Widget * Displays bookings with pending payments */ import React from "react"; import { __ } from "../../lib/i18n"; import { toDateValue } from "../../lib/dateFormat"; import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"; import { Badge } from "../ui/badge"; import { Button } from "../ui/button"; import { DollarSign, Clock, User } from "lucide-react"; import { ConditionalRender } from "../ui/conditional-render"; import { formatYatraMoney } from "../../lib/currency-display"; interface PendingPayment { id: number; booking_id: number; customer_name: string; trip_title: string; amount: number; due_date?: string | null; days_overdue?: number; payment_method?: string; payment_method_label?: string; } interface PendingPaymentsProps { payments: PendingPayment[]; loading?: boolean; onView?: (payment: PendingPayment) => void; onCollect?: (payment: PendingPayment) => void; } /** * Pending Payments Widget */ export const PendingPayments: React.FC = ({ payments, loading = false, onView, onCollect, }) => { const globalCurrency = (window as any)?.yatraAdmin?.currency || "USD"; const formatCurrency = (amount: number) => formatYatraMoney(Number(amount) || 0, globalCurrency, { zeroAsUnknown: false, }); const formatDate = (dateString?: string | null) => { // toDateValue: a date-only due_date must not roll back a day in behind-UTC zones. // A payment can arrive with no due date, so render a dash rather than throwing. const date = toDateValue(dateString); if (isNaN(date.getTime())) return "-"; return date.toLocaleDateString(); }; const totalPending = payments?.reduce((sum, p) => sum + p.amount, 0) || 0; if (loading) { return ( {__("Pending Payments", "yatra")}
{__("Loading...", "yatra")}
); } return (
{__("Pending Payments", "yatra")} {totalPending > 0 && ( {formatCurrency(totalPending)} )}
{payments && payments.length > 0 ? (
{payments.slice(0, 2).map((payment) => (

{payment.trip_title}

{payment.days_overdue && payment.days_overdue > 0 && ( {payment.days_overdue} {__("days overdue", "yatra")} )}
{payment.customer_name}
{/* Payments carry no due date today, so this line stays hidden rather than printing an empty "Due:" for every row. */} {formatDate(payment.due_date) !== "-" && (
{__("Due", "yatra")}: {formatDate(payment.due_date)}
)}

{formatCurrency(payment.amount)}

{payment.payment_method && (

{payment.payment_method_label || payment.payment_method}

)}
{onView && ( )} {onCollect && ( )}
))}
) : (

{__("No pending payments", "yatra")}

)}
); }; export default PendingPayments;