export const dynamic = 'force-dynamic' import Link from 'next/link' import { asAdmin } from '@/lib/db/with-user' import { redirect, notFound } from 'next/navigation' import { getSession } from '@/lib/auth/get-session' import { incidents, sites, zones, capaActions } from '@/lib/db/schema' import { eq, and } from 'drizzle-orm' const STATUS_LABELS: Record = { reported: 'Reported', triaged: 'Triaged', investigating: 'Investigating', capa_pending: 'CAPA Pending', verification: 'Verification', closed: 'Closed', } const STATUS_COLORS: Record = { reported: 'bg-gray-100 text-gray-600', triaged: 'bg-yellow-100 text-yellow-800', investigating: 'bg-blue-100 text-blue-700', capa_pending: 'bg-orange-100 text-orange-700', verification: 'bg-purple-100 text-purple-700', closed: 'bg-green-100 text-green-700', } export default async function ReporterIncidentDetail({ params, }: { params: Promise<{ id: string }> }) { const { id } = await params const session = await getSession() if (!session) redirect('/login') const [inc] = await asAdmin(db => db.select({ id: incidents.id, referenceNo: incidents.referenceNo, incidentType: incidents.incidentType, status: incidents.status, severity: incidents.severity, reportedAt: incidents.reportedAt, closedAt: incidents.closedAt, description: incidents.description, injuryInvolved: incidents.injuryInvolved, medicalStatus: incidents.medicalStatus, lostDays: incidents.lostDays, siteName: sites.name, zoneName: zones.name, }) .from(incidents) .leftJoin(sites, eq(incidents.siteId, sites.id)) .leftJoin(zones, eq(incidents.zoneId, zones.id)) .where(and(eq(incidents.id, id), eq(incidents.reportedBy, session.sub))) .limit(1) ) if (!inc) notFound() const capas = await asAdmin(db => db.select({ id: capaActions.id, description: capaActions.description, status: capaActions.status, dueDate: capaActions.dueDate, }) .from(capaActions) .where(eq(capaActions.incidentId, id)) ) return (
← My Reports

{inc.referenceNo ?? inc.id.slice(0, 8)}

{inc.incidentType?.replace(/_/g, ' ')}

{STATUS_LABELS[inc.status] ?? inc.status}
{inc.siteName &&

Site

{inc.siteName}

} {inc.zoneName &&

Zone

{inc.zoneName}

} {inc.severity &&

Severity

{inc.severity} / 5

} {inc.reportedAt && (

Reported

{new Date(inc.reportedAt).toLocaleDateString('en-MY')}

)} {inc.closedAt && (

Closed

{new Date(inc.closedAt).toLocaleDateString('en-MY')}

)}
{inc.description && (

Description

{inc.description}

)}
{capas.length > 0 && (

Corrective Actions ({capas.length})

{capas.map(c => (

{c.description}

{c.status.replace(/_/g, ' ')}
))}
)}
) }