/** * ClaimManagementWorkflowTab Component * Displays the 8-step workflow process specific to Claim Management requests */ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { TrendingUp, CircleCheckBig, Clock, Mail, Download, Receipt, Activity, AlertCircle, } from 'lucide-react'; import { format } from 'date-fns'; interface WorkflowStep { stepNumber: number; stepName: string; stepDescription: string; assignedTo: string; assignedToType: 'dealer' | 'requestor' | 'department_lead' | 'finance' | 'system'; status: 'pending' | 'in_progress' | 'approved' | 'rejected' | 'skipped'; tatHours: number; elapsedHours?: number; remarks?: string; approvedAt?: string; approvedBy?: string; ioDetails?: { ioNumber: string; ioRemarks: string; organisedBy: string; organisedAt: string; }; dmsDetails?: { dmsNumber: string; dmsRemarks: string; pushedBy: string; pushedAt: string; }; hasEmailNotification?: boolean; hasDownload?: boolean; downloadUrl?: string; } interface ClaimManagementWorkflowTabProps { steps: WorkflowStep[]; currentStep: number; totalSteps?: number; onViewEmailTemplate?: (stepNumber: number) => void; onDownloadDocument?: (stepNumber: number, url: string) => void; className?: string; } export function ClaimManagementWorkflowTab({ steps, currentStep, totalSteps = 8, onViewEmailTemplate, onDownloadDocument, className = '', }: ClaimManagementWorkflowTabProps) { const formatDate = (dateString?: string) => { if (!dateString) return 'N/A'; try { return format(new Date(dateString), 'MMM d, yyyy, h:mm a'); } catch { return dateString; } }; const getStepBorderColor = (status: string) => { switch (status) { case 'approved': return 'border-green-500 bg-green-50'; case 'in_progress': return 'border-blue-500 bg-blue-50'; case 'rejected': return 'border-red-500 bg-red-50'; case 'pending': return 'border-gray-300 bg-white'; case 'skipped': return 'border-gray-400 bg-gray-50'; default: return 'border-gray-300 bg-white'; } }; const getStepIconBg = (status: string) => { switch (status) { case 'approved': return 'bg-green-100'; case 'in_progress': return 'bg-blue-100'; case 'rejected': return 'bg-red-100'; case 'pending': return 'bg-gray-100'; case 'skipped': return 'bg-gray-200'; default: return 'bg-gray-100'; } }; const getStepIcon = (status: string) => { switch (status) { case 'approved': return ; case 'in_progress': return ; case 'rejected': return ; case 'pending': return ; default: return ; } }; const getStatusBadgeColor = (status: string) => { switch (status) { case 'approved': return 'bg-green-100 text-green-800 border-green-200'; case 'in_progress': return 'bg-blue-100 text-blue-800 border-blue-200'; case 'rejected': return 'bg-red-100 text-red-800 border-red-200'; case 'pending': return 'bg-gray-100 text-gray-600 border-gray-200'; case 'skipped': return 'bg-gray-200 text-gray-700 border-gray-300'; default: return 'bg-gray-100 text-gray-600 border-gray-200'; } }; return (
Claim Management Workflow 8-Step approval process for dealer claim management
Step {currentStep} of {totalSteps}
{steps.map((step, index) => (
{/* Step Content */}
{/* Icon */}
{getStepIcon(step.status)}
{/* Step Details */}
{/* Header Row */}

Step {step.stepNumber}: {step.stepName}

{step.status} {/* Action Buttons */} {step.hasEmailNotification && onViewEmailTemplate && ( )} {step.hasDownload && onDownloadDocument && step.downloadUrl && ( )}

{step.assignedTo}

{step.stepDescription}

{/* TAT Info */}

TAT: {step.tatHours}h

{step.elapsedHours !== undefined && (

Elapsed: {step.elapsedHours}h

)}
{/* Remarks */} {step.remarks && (

{step.remarks}

)} {/* IO Details */} {step.ioDetails && (

IO Organisation Details

IO Number: {step.ioDetails.ioNumber}

IO Remark:

{step.ioDetails.ioRemarks}

Organised by {step.ioDetails.organisedBy} on{' '} {formatDate(step.ioDetails.organisedAt)}
)} {/* DMS Details */} {step.dmsDetails && (

DMS Processing Details

DMS Number: {step.dmsDetails.dmsNumber}

DMS Remarks:

{step.dmsDetails.dmsRemarks}

Pushed by {step.dmsDetails.pushedBy} on{' '} {formatDate(step.dmsDetails.pushedAt)}
)} {/* Approval Timestamp */} {step.approvedAt && (

{step.status === 'approved' ? 'Approved' : 'Updated'} on{' '} {formatDate(step.approvedAt)}

)}
))}
); }