import { useState, useEffect } from 'react'; import { IndianRupee, Calendar, Eye, Send, FileCheck, Loader2 } from 'lucide-react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; import { Badge } from '../ui/badge'; import { Button } from '../ui/button'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'; import { User } from '../../lib/mock-data'; import { API } from '../../api/API'; import { toast } from 'sonner'; interface FnFPageProps { currentUser: User | null; onViewDetails: (id: string) => void; } const getStatusColor = (status: string) => { switch (status) { case 'New': return 'bg-blue-100 text-blue-700 border-blue-300'; case 'In Progress': return 'bg-yellow-100 text-yellow-700 border-yellow-300'; case 'Under Review': return 'bg-orange-100 text-orange-700 border-orange-300'; case 'Completed': return 'bg-green-100 text-green-700 border-green-300'; default: return 'bg-slate-100 text-slate-700 border-slate-300'; } }; const getTypeColor = (type: string) => { return type === 'Resignation' ? 'bg-amber-100 text-amber-700 border-amber-300' : 'bg-red-100 text-red-700 border-red-300'; }; export function FnFPage({ currentUser, onViewDetails }: FnFPageProps) { const [settlements, setSettlements] = useState([]); const [loading, setLoading] = useState(true); const canSendToStakeholders = currentUser && ['DD Lead', 'DD Head', 'NBH', 'DD Admin', 'Super Admin'].includes(currentUser.role); useEffect(() => { fetchSettlements(); }, []); const fetchSettlements = async () => { try { setLoading(true); const response = await API.getFnFSettlements(); const data = response.data as any; if (data.success) { setSettlements(data.settlements || []); } } catch (error) { console.error('Fetch settlements error:', error); toast.error('Failed to fetch settlement cases'); } finally { setLoading(false); } }; const handleSendToStakeholders = (caseId: string) => { console.log('Sending to stakeholders for case:', caseId); toast.success('Notifications sent to all stakeholders'); }; if (loading) { return (
); } // Helper to map backend data to UI-friendly format const getMappedData = (s: any) => ({ id: s.id, caseNumber: s.id.substring(0, 8).toUpperCase(), status: s.status, requestType: s.resignationId ? 'Resignation' : 'Termination', dealerName: s.outlet?.dealer?.name || 'N/A', dealerCode: s.outlet?.code || 'N/A', dealershipName: s.outlet?.name || 'N/A', location: s.outlet?.city || s.outlet?.location || 'N/A', originalRequestId: s.resignation?.resignationId || s.terminationRequest?.id || 'N/A', submittedOn: new Date(s.createdAt).toLocaleDateString(), financeReportStatus: s.status === 'Calculated' || s.status === 'Settled' ? 'Completed' : 'Pending', totalRecoveryAmount: parseFloat(s.totalReceivables) || 0, totalPayableAmount: parseFloat(s.totalPayables) || 0, completedOn: s.settlementDate ? new Date(s.settlementDate).toLocaleDateString() : null, departmentResponses: s.lineItems || [] }); const displaySettlements: any[] = settlements.map(getMappedData); return (
{/* Header Stats */}
New Cases {displaySettlements.filter(c => c.status === 'Initiated' || c.status === 'New').length}

Just Arrived

In Progress {displaySettlements.filter(c => c.status === 'In Progress').length}

Awaiting Response

Under Review {displaySettlements.filter(c => c.status === 'Under Review' || c.status === 'Calculated').length}

Discussion Ongoing

Completed {displaySettlements.filter(c => c.status === 'Completed' || c.status === 'Settled').length}

Finalized

All Cases {displaySettlements.length}

Total

{/* Main Content */} Full & Final Settlement Cases Manage dealer exit dues clearance and settlement {currentUser && ` • Current Role: ${currentUser.role}`} New Cases All Cases In Progress Under Review Completed {/* New Cases Tab */}
{displaySettlements .filter(c => c.status === 'New' || c.status === 'Initiated') .map((fnfCase) => (

{fnfCase.caseNumber}

{fnfCase.status} {fnfCase.requestType}

Dealer Name

{fnfCase.dealerName}

Dealer Code

{fnfCase.dealerCode}

Dealership Name

{fnfCase.dealershipName}

Location

{fnfCase.location}

Original Request ID

{fnfCase.originalRequestId}

Submitted On

{fnfCase.submittedOn}

Finance Report

{fnfCase.financeReportStatus}

{canSendToStakeholders && ( )}
))} {displaySettlements.filter((c: any) => c.status === 'New' || c.status === 'Initiated').length === 0 && (

No new cases to display

)}
{/* All Cases Tab */}
{displaySettlements.map((fnfCase) => (

{fnfCase.caseNumber}

{fnfCase.status} {fnfCase.requestType}

Dealer Name

{fnfCase.dealerName}

Dealership Name

{fnfCase.dealershipName}

Location

{fnfCase.location}

Submitted On

{fnfCase.submittedOn}

{canSendToStakeholders && fnfCase.status === 'New' && ( )}
))}
{/* In Progress Tab */}
{displaySettlements .filter(c => c.status === 'In Progress') .map((fnfCase) => (

{fnfCase.caseNumber}

{fnfCase.status} {fnfCase.requestType}

Dealer Name

{fnfCase.dealerName}

Departments Responded

{fnfCase.departmentResponses.filter((d: any) => d.status !== 'Pending').length} / {fnfCase.departmentResponses.length}

Submitted On

{fnfCase.submittedOn}

))} {displaySettlements.filter((c: any) => c.status === 'In Progress').length === 0 && (

No cases in progress

)}
{/* Under Review Tab */}
{displaySettlements .filter(c => c.status === 'Under Review' || c.status === 'Calculated') .map((fnfCase) => (

{fnfCase.caseNumber}

{fnfCase.status} {fnfCase.requestType}

Dealer Name

{fnfCase.dealerName}

Recovery Amount

₹{fnfCase.totalRecoveryAmount?.toLocaleString()}

Payable Amount

₹{fnfCase.totalPayableAmount?.toLocaleString()}

Finance Status

{fnfCase.financeReportStatus}

))} {displaySettlements.filter(c => c.status === 'Under Review' || c.status === 'Calculated').length === 0 && (

No cases under review

)}
{/* Completed Tab */}
{displaySettlements .filter(c => c.status === 'Completed' || c.status === 'Settled') .map((fnfCase) => (

{fnfCase.caseNumber}

{fnfCase.status} {fnfCase.requestType}

Dealer Name

{fnfCase.dealerName}

Completed On

{fnfCase.completedOn || 'N/A'}

Submitted On

{fnfCase.submittedOn}

))} {displaySettlements.filter(c => c.status === 'Completed' || c.status === 'Settled').length === 0 && (

No completed cases

)}
); }