import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; import { Bell, Mail, Phone, Calendar, User, Loader2 } from 'lucide-react'; import { useState, useEffect } from 'react'; import { toast } from 'sonner'; import { listNonSubmittedDealers, notifyNonSubmittedDealer, type NonSubmittedDealerItem } from '@/services/form16Api'; function formatDisplayDate(isoDate: string | null): string { if (!isoDate) return '—'; try { const d = new Date(isoDate + 'Z'); const day = d.getUTCDate(); const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; const month = months[d.getUTCMonth()]; const year = d.getUTCFullYear(); return `${day}-${month}-${year}`; } catch { return isoDate; } } const FY_OPTIONS = [ { value: '2024-25', label: '2024-25' }, { value: '2023-24', label: '2023-24' }, { value: '2022-23', label: '2022-23' }, { value: '', label: 'All Years' }, ]; export function Form16NonSubmittedDealers() { const [notifyingDealer, setNotifyingDealer] = useState(null); const [dealers, setDealers] = useState([]); const [summary, setSummary] = useState<{ totalDealers: number; nonSubmittedCount: number; neverSubmittedCount: number; overdue90Count: number; }>({ totalDealers: 0, nonSubmittedCount: 0, neverSubmittedCount: 0, overdue90Count: 0 }); const [loading, setLoading] = useState(true); const [financialYearFilter, setFinancialYearFilter] = useState('2024-25'); useEffect(() => { fetchNonSubmittedDealers(); }, [financialYearFilter]); const fetchNonSubmittedDealers = async () => { try { setLoading(true); const response = await listNonSubmittedDealers( financialYearFilter || undefined ); setDealers(response.dealers); setSummary(response.summary); } catch (error) { console.error('Error fetching non-submitted dealers:', error); toast.error('Failed to load non-submitted dealers'); setDealers([]); setSummary({ totalDealers: 0, nonSubmittedCount: 0, neverSubmittedCount: 0, overdue90Count: 0 }); } finally { setLoading(false); } }; const handleNotifyDealer = async (dealer: NonSubmittedDealerItem) => { setNotifyingDealer(dealer.id); try { await notifyNonSubmittedDealer(dealer.dealerCode, financialYearFilter || undefined); toast.success(`Notification sent to ${dealer.dealerName}`, { description: `Reminder sent for missing quarters: ${dealer.missingQuarters.join(', ')}. Last notified column updated.`, }); await fetchNonSubmittedDealers(); } catch (err) { console.error('Notify dealer error:', err); toast.error('Failed to send notification'); } finally { setNotifyingDealer(null); } }; return (

Non-Submitted Dealers

Dealers who have not submitted Form 16A for one or more quarters

{/* Summary Cards */}
Non-Submitted / Total Dealers {loading ? '...' : `${summary.nonSubmittedCount}/${summary.totalDealers}`} Never Submitted {loading ? '...' : summary.neverSubmittedCount} Overdue (90+ days) {loading ? '...' : summary.overdue90Count}
{/* Dealers Table */} Dealer List Dealers with missing Form 16A submissions
Dealer Details Contact Information Location Missing Quarters Last Submission Last Notified Action {loading ? (

Loading dealers...

) : dealers.length === 0 ? (

No dealers with missing quarters found

All dealers have submitted Form 16A for the selected period

) : ( dealers.map((dealer) => (

{dealer.dealerName}

{dealer.dealerCode}

{dealer.email || '—'}
{dealer.phone || '—'}
{dealer.location || '—'}
{dealer.missingQuarters.map((quarter, index) => ( {quarter} ))}
{dealer.lastSubmissionDate ? (

{formatDisplayDate(dealer.lastSubmissionDate)}

90 ? 'text-red-600' : 'text-gray-500' }`} > {dealer.daysSinceLastSubmission} days ago

) : ( Never Submitted )}
{dealer.lastNotifiedDate ? (
{formatDisplayDate(dealer.lastNotifiedDate)}
{dealer.notificationCount > 1 && ( {dealer.notificationCount}x )}
{dealer.lastNotifiedBy}

Notification History ({dealer.notificationCount})

{dealer.notificationHistory?.map((notification, idx) => (
{notification.date} {notification.method}

by {notification.notifiedBy}

))}
) : ( Never Notified )}
)) )}
); }