import { useState, useEffect } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; import { Badge } from '../ui/badge'; import { Button } from '../ui/button'; import { Input } from '../ui/input'; import { Label } from '../ui/label'; import { Textarea } from '../ui/textarea'; import { ArrowLeft, IndianRupee, CheckCircle, XCircle, FileText, CreditCard, User, Wallet, AlertCircle, Clock } from 'lucide-react'; import { toast } from 'sonner'; import { onboardingService } from '../../services/onboarding.service'; import { DocumentPreviewModal } from '../ui/DocumentPreviewModal'; import { formatDateTime } from '../ui/utils'; // Simple helper for class merging if 'cn' is not available const cn = (...classes: any[]) => classes.filter(Boolean).join(' '); interface FinancePaymentDetailsPageProps { applicationId: string; onBack: () => void; } export function FinancePaymentDetailsPage({ applicationId, onBack }: FinancePaymentDetailsPageProps) { const [application, setApplication] = useState(null); const [deposits, setDeposits] = useState([]); const [activeType, setActiveType] = useState<'SECURITY_DEPOSIT' | 'FIRST_FILL'>('SECURITY_DEPOSIT'); const [loading, setLoading] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); const [configs, setConfigs] = useState({}); const [paymentDetails, setPaymentDetails] = useState({ verificationTransactionId: '', receivedAmount: '', receivedDate: new Date().toISOString().split('T')[0], verificationRemarks: '' }); const [showPreviewModal, setShowPreviewModal] = useState(false); const [previewDoc, setPreviewDoc] = useState(null); const activeDeposit = deposits.find(d => d.depositType === activeType); useEffect(() => { fetchData(); }, [applicationId]); useEffect(() => { if (activeDeposit) { setPaymentDetails({ verificationTransactionId: activeDeposit.paymentReference || '', receivedAmount: activeDeposit.amount?.toString() || '', receivedDate: activeDeposit.verifiedAt ? new Date(activeDeposit.verifiedAt).toISOString().split('T')[0] : new Date().toISOString().split('T')[0], verificationRemarks: activeDeposit.remarks || '' }); } else { const initialDefault = configs.SECURITY_DEPOSIT?.amount || 500000; const finalDefault = configs.FIRST_FILL?.amount || 1500000; setPaymentDetails({ verificationTransactionId: '', receivedAmount: activeType === 'SECURITY_DEPOSIT' ? initialDefault.toString() : finalDefault.toString(), receivedDate: new Date().toISOString().split('T')[0], verificationRemarks: '' }); } }, [activeType, activeDeposit, configs]); const fetchData = async () => { try { setLoading(true); const [appData, depositData, configData] = await Promise.all([ onboardingService.getApplicationById(applicationId), onboardingService.getSecurityDeposit(applicationId), onboardingService.getSystemConfigs({ category: 'SECURITY_DEPOSIT', format: 'map' }) ]); setApplication(appData); setDeposits(Array.isArray(depositData) ? depositData : [depositData].filter(Boolean)); setConfigs(configData || {}); } catch (error) { console.error('Fetch error:', error); toast.error('Failed to load payment data'); } finally { setLoading(false); } }; const handleApprovePayment = async () => { if (!paymentDetails.verificationTransactionId || !paymentDetails.receivedDate) { toast.error('Please fill in all required payment details'); return; } try { setIsSubmitting(true); await onboardingService.updateSecurityDeposit({ applicationId, depositType: activeType, amount: Number(paymentDetails.receivedAmount), paymentReference: paymentDetails.verificationTransactionId, status: 'Verified' }); toast.success(`${activeType === 'SECURITY_DEPOSIT' ? 'Security Deposit' : 'First Fill'} verified and approved`); await fetchData(); } catch (error) { toast.error('Failed to verify payment'); } finally { setIsSubmitting(false); } }; const handleRejectPayment = async () => { if (!paymentDetails.verificationRemarks) { toast.error('Please provide remarks for rejection'); return; } try { setIsSubmitting(true); await onboardingService.updateSecurityDeposit({ applicationId, depositType: activeType, status: 'Rejected', remarks: paymentDetails.verificationRemarks }); toast.error(`${activeType === 'SECURITY_DEPOSIT' ? 'Security Deposit' : 'First Fill'} rejected`); await fetchData(); } catch (error) { toast.error('Failed to reject payment'); } finally { setIsSubmitting(false); } }; if (loading) { return (
); } if (!application) { return
Application not found
; } return (
{/* Header */}

Payment Verification

{/* Status Banner */}

{activeType === 'SECURITY_DEPOSIT' ? 'Security Deposit' : 'First Fill'}

{activeDeposit?.status === 'Verified' ? `Verified on ${formatDateTime(activeDeposit.verifiedAt)}` : activeDeposit?.status === 'Rejected' ? 'Payment Rejected' : 'Awaiting Verification'}

{activeDeposit?.status || 'No Record'}
Applicant Information

{application.applicationId || application.id}

{application.applicantName}

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

{application.email}

{application.phone}

Deposit Tracking

₹{(activeType === 'SECURITY_DEPOSIT' ? (configs.SECURITY_DEPOSIT?.amount || 500000) : (configs.FIRST_FILL?.amount || 1500000) ).toLocaleString()}

{activeDeposit?.status || 'Not Started'}

{activeDeposit?.paymentReference && (

{activeDeposit.paymentReference}

{activeDeposit.verifier?.fullName || 'N/A'}

)}
Verification Evidence Documents uploaded by the applicant for payment proof {application.uploadedDocuments?.filter((d: any) => activeType === 'SECURITY_DEPOSIT' ? d.documentType?.toLowerCase().includes('security') && d.documentType?.toLowerCase().includes('deposit') : d.documentType?.toLowerCase().includes('first') && d.documentType?.toLowerCase().includes('fill') ).length > 0 ? (
{application.uploadedDocuments.filter((d: any) => activeType === 'SECURITY_DEPOSIT' ? d.documentType?.toLowerCase().includes('security') && d.documentType?.toLowerCase().includes('deposit') : d.documentType?.toLowerCase().includes('first') && d.documentType?.toLowerCase().includes('fill') ).map((doc: any, index: number) => (

{doc.fileName || doc.name}

{doc.documentType} • {formatDateTime(doc.createdAt)}

))}
) : (

No payment documents found in this application.

)}
Finance Action
setPaymentDetails({ ...paymentDetails, verificationTransactionId: e.target.value })} />
setPaymentDetails({ ...paymentDetails, receivedAmount: e.target.value })} />
setPaymentDetails({ ...paymentDetails, receivedDate: e.target.value })} />