import React, { useState, useMemo } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card'; import { Badge } from './ui/badge'; import { Button } from './ui/button'; import { toast } from 'sonner@2.0.3'; import { DealerDocumentModal } from './modals/DealerDocumentModal'; import { InitiatorVerificationModal } from './modals/InitiatorVerificationModal'; import { Progress } from './ui/progress'; import { Avatar, AvatarFallback } from './ui/avatar'; import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs'; import { CLAIM_MANAGEMENT_DATABASE } from '../utils/claimManagementDatabase'; import { ArrowLeft, Clock, FileText, MessageSquare, CheckCircle, XCircle, Download, Eye, Flame, Target, TrendingUp, RefreshCw, Activity, MapPin, Mail, Phone, Building, Receipt, Upload, UserPlus, ClipboardList, DollarSign, Calendar } from 'lucide-react'; interface ClaimManagementDetailProps { requestId: string; onBack?: () => void; onOpenModal?: (modal: string) => void; dynamicRequests?: any[]; } // Utility functions const getPriorityConfig = (priority: string) => { switch (priority) { case 'express': case 'urgent': return { color: 'bg-red-100 text-red-800 border-red-200', icon: Flame }; case 'standard': return { color: 'bg-blue-100 text-blue-800 border-blue-200', icon: Target }; default: return { color: 'bg-gray-100 text-gray-800 border-gray-200', icon: Target }; } }; const getStatusConfig = (status: string) => { switch (status) { case 'pending': return { color: 'bg-yellow-100 text-yellow-800 border-yellow-200', icon: Clock }; case 'in-review': return { color: 'bg-blue-100 text-blue-800 border-blue-200', icon: Eye }; case 'approved': return { color: 'bg-green-100 text-green-800 border-green-200', icon: CheckCircle }; case 'rejected': return { color: 'bg-red-100 text-red-800 border-red-200', icon: XCircle }; default: return { color: 'bg-gray-100 text-gray-800 border-gray-200', icon: Clock }; } }; const getSLAConfig = (progress: number) => { if (progress >= 80) { return { bg: 'bg-red-50', color: 'bg-red-500', textColor: 'text-red-700' }; } else if (progress >= 60) { return { bg: 'bg-orange-50', color: 'bg-orange-500', textColor: 'text-orange-700' }; } else { return { bg: 'bg-green-50', color: 'bg-green-500', textColor: 'text-green-700' }; } }; const getStepIcon = (status: string) => { switch (status) { case 'approved': return ; case 'rejected': return ; case 'pending': case 'in-review': return ; default: return ; } }; const getActionTypeIcon = (type: string) => { switch (type) { case 'approval': case 'approved': return ; case 'rejection': case 'rejected': return ; case 'comment': return ; case 'status_change': return ; case 'assignment': return ; case 'created': return ; default: return ; } }; export function ClaimManagementDetail({ requestId, onBack, onOpenModal, dynamicRequests = [] }: ClaimManagementDetailProps) { const [activeTab, setActiveTab] = useState('overview'); const [dealerDocModal, setDealerDocModal] = useState(false); const [initiatorVerificationModal, setInitiatorVerificationModal] = useState(false); // Get claim from database or dynamic requests const claim = useMemo(() => { // First check static database const staticClaim = CLAIM_MANAGEMENT_DATABASE[requestId]; if (staticClaim) return staticClaim; // Then check dynamic requests const dynamicClaim = dynamicRequests.find((req: any) => req.id === requestId); if (dynamicClaim) return dynamicClaim; return null; }, [requestId, dynamicRequests]); if (!claim) { return (

Claim Not Found

The claim request you're looking for doesn't exist.

); } const priorityConfig = getPriorityConfig(claim.priority); const statusConfig = getStatusConfig(claim.status); const slaConfig = getSLAConfig(claim.slaProgress); return (
{/* Header Section */}

{claim.id}

{claim.priority} priority {claim.status} Claim Management

{claim.title}

{claim.amount && claim.amount !== 'TBD' && (

Claim Amount

{claim.amount}

)}
{/* SLA Progress */}
SLA Progress
{claim.slaRemaining}

Due: {claim.slaEndDate} • {claim.slaProgress}% elapsed

{/* Tabs */} Overview Workflow (8-Steps) Documents Activity {/* Overview Tab */}
{/* Left Column - Main Content (2/3 width) */}
{/* Activity Information */} Activity Information

{claim.claimDetails?.activityName || 'N/A'}

{claim.claimDetails?.activityType || 'N/A'}

{claim.claimDetails?.location || 'N/A'}

{claim.claimDetails?.activityDate || 'N/A'}

{claim.claimDetails?.estimatedBudget || 'N/A'}

{claim.claimDetails?.periodStart || 'N/A'} - {claim.claimDetails?.periodEnd || 'N/A'}

{claim.claimDetails?.requestDescription || claim.description || 'N/A'}

{/* Dealer Information */} Dealer Information

{claim.claimDetails?.dealerCode || 'N/A'}

{claim.claimDetails?.dealerName || 'N/A'}

{claim.claimDetails?.dealerEmail || 'N/A'}
{claim.claimDetails?.dealerPhone || 'N/A'}
{claim.claimDetails?.dealerAddress && (
{claim.claimDetails.dealerAddress}
)}
{/* Initiator Information */} Request Initiator
{claim.initiator?.avatar || 'U'}

{claim.initiator?.name || 'N/A'}

{claim.initiator?.role || 'N/A'}

{claim.initiator?.department || 'N/A'}

{claim.initiator?.email || 'N/A'}
{claim.initiator?.phone || 'N/A'}
{/* Right Column - Quick Actions Sidebar (1/3 width) */}
{/* Quick Actions */} Quick Actions
{/* Spectators */} {claim.spectators && claim.spectators.length > 0 && ( Spectators {claim.spectators.map((spectator: any, index: number) => (
{spectator.avatar}

{spectator.name}

{spectator.role}

))}
)}
{/* Workflow Tab - 8 Step Process */}
Claim Management Workflow 8-Step approval process for dealer claim management
Step {claim.currentStep} of {claim.totalSteps}
{claim.approvalFlow && claim.approvalFlow.length > 0 ? (
{claim.approvalFlow.map((step: any, index: number) => { const isActive = step.status === 'pending' || step.status === 'in-review'; const isCompleted = step.status === 'approved'; const isRejected = step.status === 'rejected'; return (
{getStepIcon(step.status)}

Step {step.step}: {step.role}

{step.status}

{step.approver}

{step.description && (

{step.description}

)}
{step.tatHours && (

TAT: {step.tatHours}h

)} {step.elapsedHours !== undefined && step.elapsedHours > 0 && (

Elapsed: {step.elapsedHours}h

)}
{step.comment && (

{step.comment}

)} {step.timestamp && (

{isCompleted ? 'Approved' : isRejected ? 'Rejected' : 'Actioned'} on {step.timestamp}

)} {/* Workflow-specific Action Buttons */} {isActive && (
{step.step === 1 && step.role === 'Dealer - Document Upload' && ( )} {step.step === 2 && step.role === 'Initiator Evaluation' && ( )} {step.step === 4 && step.role === 'Department Lead Approval' && ( )} {step.step === 5 && step.role === 'Dealer - Completion Documents' && ( )} {step.step === 6 && step.role === 'Initiator Verification' && ( )} {step.step === 8 && step.role.includes('Credit Note') && ( )}
)}
); })}
) : (

No workflow steps defined

)}
{/* Documents Tab */}
Claim Documents
{claim.documents && claim.documents.length > 0 ? (
{claim.documents.map((doc: any, index: number) => (

{doc.name}

{doc.size} • Uploaded by {doc.uploadedBy} on {doc.uploadedAt}

))}
) : (

No documents uploaded yet

)}
{/* Activity Tab - Audit Trail */} Claim Activity Timeline Complete audit trail of all claim management activities
{claim.auditTrail && claim.auditTrail.length > 0 ? claim.auditTrail.map((entry: any, index: number) => (
{getActionTypeIcon(entry.type)}

{entry.action}

{entry.details}

by {entry.user}

{entry.timestamp}
)) : (

No activity recorded yet

Actions and updates will appear here

)}
{/* Claim Management Modals */} {dealerDocModal && ( setDealerDocModal(false)} onSubmit={async (documents) => { console.log('Dealer documents submitted:', documents); toast.success('Documents Uploaded', { description: 'Your documents have been submitted for review.', }); setDealerDocModal(false); }} dealerName={claim.claimDetails?.dealerName || 'Dealer'} activityName={claim.claimDetails?.activityName || claim.title} /> )} {initiatorVerificationModal && ( setInitiatorVerificationModal(false)} onSubmit={async (data) => { console.log('Verification data:', data); toast.success('Verification Complete', { description: `Amount set to ${data.approvedAmount}. E-invoice will be generated.`, }); setInitiatorVerificationModal(false); }} activityName={claim.claimDetails?.activityName || claim.title} requestedAmount={claim.claimDetails?.estimatedBudget || claim.amount || 'TBD'} documents={claim.documents || []} /> )}
); }