import { IndianRupee, FileText, CheckCircle, Plus, Trash2, Save, Calculator, Clock, TrendingUp, TrendingDown } 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 { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '../ui/dialog'; import { Input } from '../ui/input'; import { Label } from '../ui/label'; import { Textarea } from '../ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; import { useState, useEffect } from 'react'; import { User } from '../../lib/mock-data'; import { toast } from 'sonner'; import { onboardingService } from '../../services/onboarding.service'; interface FinanceDashboardProps { currentUser: User | null; onNavigate?: (view: string) => void; onViewPaymentDetails?: (applicationId: string) => void; onViewAuditDetails?: (applicationId: string) => void; onViewFnFDetails?: (fnfId: string) => void; } // Mock data for F&F cases (Keeping as static for now as per original) const mockFnFCases = [ { id: 'RES-001', dealerName: 'Amit Sharma Motors', dealerCode: 'DL-MH-001', type: 'Resignation', location: 'Mumbai, Maharashtra', status: 'Pending Finance Summary', submittedOn: '2025-10-08', departmentsResponded: 16, totalDepartments: 16, hasFinanceSummary: false }, { id: 'TERM-002', dealerName: 'Sanjay Enterprises', dealerCode: 'DL-TG-033', type: 'Termination', location: 'Hyderabad, Telangana', status: 'Finance Summary Completed', submittedOn: '2025-09-20', departmentsResponded: 16, totalDepartments: 16, hasFinanceSummary: true, netAmount: -270000, completedOn: '2025-10-10' } ]; interface FinanceLineItem { id: string; department: string; description: string; type: 'payable' | 'recovery'; amount: number; } export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAuditDetails, onViewFnFDetails }: FinanceDashboardProps) { const [applications, setApplications] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { fetchData(); }, []); const fetchData = async () => { try { setLoading(true); const data = await onboardingService.getApplications(); // Filter for applications relevant to finance const financeApps = data.filter((app: any) => { const s = app.overallStatus || app.status; const stage = app.currentStage; return [ 'LOI In Progress', 'LOI Issued', 'LOA Pending', 'Dealer Code Generation', 'LOA_APPROVAL', 'PAYMENT_VERIFICATION', 'SECURITY_DEPOSIT', 'EOR Complete', 'Inauguration', 'Approved', 'Onboarded' ].includes(s) || stage === 'Finance'; }); setApplications(financeApps); } catch (error) { console.error('Fetch error:', error); } finally { setLoading(false); } }; const [fnfDialog, setFnfDialog] = useState(false); const [fnfDetailsDialog, setFnfDetailsDialog] = useState(false); const [selectedFnF, setSelectedFnF] = useState(null); const [lineItems, setLineItems] = useState([]); const [newLineItem, setNewLineItem] = useState({ department: '', description: '', type: 'recovery' as 'payable' | 'recovery', amount: '' }); const [finalRemarks, setFinalRemarks] = useState(''); const handleAddLineItem = () => { if (!newLineItem.department || !newLineItem.description || !newLineItem.amount) { toast.error('Please fill in all line item fields'); return; } const item: FinanceLineItem = { id: Date.now().toString(), department: newLineItem.department, description: newLineItem.description, type: newLineItem.type, amount: parseFloat(newLineItem.amount) }; setLineItems([...lineItems, item]); setNewLineItem({ department: '', description: '', type: 'recovery', amount: '' }); toast.success('Line item added'); }; const handleRemoveLineItem = (id: string) => { setLineItems(lineItems.filter(item => item.id !== id)); toast.info('Line item removed'); }; const calculateTotals = () => { const totalRecovery = lineItems .filter(item => item.type === 'recovery') .reduce((sum, item) => sum + item.amount, 0); const totalPayable = lineItems .filter(item => item.type === 'payable') .reduce((sum, item) => sum + item.amount, 0); const netAmount = totalPayable - totalRecovery; return { totalRecovery, totalPayable, netAmount }; }; const handleSubmitFinanceSummary = () => { if (lineItems.length === 0) { toast.error('Please add at least one line item'); return; } if (!finalRemarks) { toast.error('Please add final remarks'); return; } toast.success('Finance summary submitted successfully'); setFnfDialog(false); setSelectedFnF(null); setLineItems([]); setFinalRemarks(''); }; const getRelevantPaymentStatus = (app: any) => { if (!app.securityDeposits || app.securityDeposits.length === 0) return 'Awaiting Payment'; const s = app.overallStatus || app.status || ''; const relevantType = (s.includes('LOI') || s === 'PAYMENT_VERIFICATION') ? 'INITIAL' : 'FINAL'; const deposit = app.securityDeposits.find((d: any) => d.depositType === relevantType); return deposit ? deposit.status : 'Awaiting Payment'; }; const pendingOnboarding = applications.filter(app => getRelevantPaymentStatus(app) !== 'Verified'); const verifiedOnboarding = applications.filter(app => getRelevantPaymentStatus(app) === 'Verified'); const pendingAudits = applications.filter(app => app.status === 'FDD_VERIFICATION' || app.overallStatus === 'FDD Verification'); const pendingFnF = mockFnFCases.filter(f => !f.hasFinanceSummary); const completedFnF = mockFnFCases.filter(f => f.hasFinanceSummary); const { totalRecovery, totalPayable, netAmount } = calculateTotals(); if (loading) { return (
Loading Finance Data...
); } return (
{/* Header */}

Finance Dashboard

Verify payments and create financial settlement summaries

{/* Stats Cards */}
{ if (pendingAudits.length > 0 && onViewAuditDetails) { onViewAuditDetails(pendingAudits[0].applicationId || pendingAudits[0].id); } else { onNavigate?.('finance-onboarding'); } }} > Pending Audits {pendingAudits.length}

FDD Sign-offs

onNavigate?.('finance-onboarding')} > Pending Verification {pendingOnboarding.length}

Onboarding Payments

onNavigate?.('finance-onboarding')} > Verified {verifiedOnboarding.length}

Total Validated

onNavigate?.('finance-fnf')} > Pending F&F Summary {pendingFnF.length}

Offboarding Cases

onNavigate?.('finance-fnf')} > F&F Completed {completedFnF.length}

Settlements Done

{/* Main Tabs */} Onboarding F&F Settlement {/* Onboarding Tab */} Payment Verification Verify dealer advance payments for onboarding applications Pending ({pendingOnboarding.length}) Verified ({verifiedOnboarding.length})
{pendingOnboarding.map((app) => (

{app.applicationId || app.id}

{app.status}

Applicant Name

{app.applicantName}

Location

{app.city || app.preferredLocation}, {app.state}

Stage

{app.status === 'PAYMENT_VERIFICATION' ? 'Security Deposit' : 'First Fill'}

Email

{app.email}

))} {pendingOnboarding.length === 0 && (

No pending payment verifications

)}
{verifiedOnboarding.map((app) => (

{app.applicationId || app.id}

{getRelevantPaymentStatus(app)}

Applicant Name

{app.applicantName}

Location

{app.city || app.preferredLocation}, {app.state}

Status

Payment Verified

Email

{app.email}

))}
{/* F&F Settlement Tab */} F&F Financial Summary Create financial settlement summaries for resignation and termination cases Pending Summary ({pendingFnF.length}) Completed ({completedFnF.length})
{pendingFnF.map((fnf) => (

{fnf.id}

{fnf.type} {fnf.status}

Dealer Name

{fnf.dealerName}

Dealer Code

{fnf.dealerCode}

Location

{fnf.location}

{fnf.departmentsResponded}/{fnf.totalDepartments} Departments Responded
))} {pendingFnF.length === 0 && (

No F&F cases pending financial summary

)}
{completedFnF.map((fnf) => (

{fnf.id}

{fnf.type} {fnf.status}

Dealer Name

{fnf.dealerName}

Dealer Code

{fnf.dealerCode}

Net Settlement

= 0 ? 'text-green-700' : 'text-red-700'}> ₹{fnf.netAmount ? Math.abs(fnf.netAmount).toLocaleString('en-IN') : '0'}

{fnf.netAmount && fnf.netAmount >= 0 ? 'Payable to Dealer' : 'Recovery from Dealer'}

Completed On

{fnf.completedOn}

))}
{/* F&F Summary Creation Dialog */} Create Financial Settlement Summary {selectedFnF?.id} - {selectedFnF?.dealerName} ({selectedFnF?.dealerCode})
{/* Add Line Item Section */}

Add Financial Line Item

setNewLineItem({...newLineItem, department: e.target.value})} />
setNewLineItem({...newLineItem, description: e.target.value})} />
setNewLineItem({...newLineItem, amount: e.target.value})} />
{/* Line Items Table */} {lineItems.length > 0 && (
Department Description Type Amount {lineItems.map((item) => ( {item.department} {item.description} {item.type === 'recovery' ? 'Recovery' : 'Payable'} ₹{item.amount.toLocaleString('en-IN')} ))}
)} {/* Financial Summary */} {lineItems.length > 0 && (

Financial Settlement Summary

Total Payable

₹{totalPayable.toLocaleString('en-IN')}

Total Recovery

₹{totalRecovery.toLocaleString('en-IN')}

Net Settlement

= 0 ? 'text-green-400' : 'text-red-400'}`}> ₹{Math.abs(netAmount).toLocaleString('en-IN')}

{netAmount >= 0 ? 'Payable to Dealer' : 'Recoverable from Dealer'}

)} {/* Final Remarks */}