export const dynamic = 'force-dynamic' import { notFound, redirect } from 'next/navigation' import Link from 'next/link' import { asAdmin } from '@/lib/db/with-user' import { getSession } from '@/lib/auth/get-session' import { capaActions, incidents, users } from '@/lib/db/schema' import { eq } from 'drizzle-orm' import { aliasedTable } from 'drizzle-orm' import { VerifyForm } from '@/components/capa/verify-form' import { CloseCapaButton } from '@/components/capa/close-capa-button' interface Props { params: Promise<{ id: string }> } const PRIORITY_BADGE: Record = { low: 'bg-gray-100 text-gray-600', med: 'bg-yellow-100 text-yellow-700', high: 'bg-red-100 text-red-700', } export default async function CapaDetailPage({ params }: Props) { const { id } = await params const session = await getSession() if (!session) redirect(`/login?redirect=/hse/capa/${id}`) const ownerAlias = aliasedTable(users, 'owner') const [capa] = await asAdmin(db => db.select({ id: capaActions.id, incidentId: capaActions.incidentId, rootCauseRef: capaActions.rootCauseRef, description: capaActions.description, department: capaActions.department, dueDate: capaActions.dueDate, priority: capaActions.priority, status: capaActions.status, completedAt: capaActions.completedAt, ownerNotes: capaActions.ownerNotes, incidentRefNo: incidents.referenceNo, ownerName: ownerAlias.name, }) .from(capaActions) .leftJoin(incidents, eq(capaActions.incidentId, incidents.id)) .leftJoin(ownerAlias, eq(capaActions.ownerUserId, ownerAlias.id)) .where(eq(capaActions.id, id)) .limit(1) ) if (!capa) notFound() const isHse = session && ['hse', 'admin'].includes(session.role) const status = capa.status return (
← CAPA Board

Incident: {capa.incidentRefNo ?? '—'}

{capa.description}

{capa.priority}

Owner

{capa.ownerName ?? '—'}

Department

{capa.department}

Due Date

{capa.dueDate}

Status

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

{capa.ownerNotes && (

Owner Notes

{capa.ownerNotes}

)}
{capa.rootCauseRef && (

Root Cause Reference

{capa.rootCauseRef}

)} {capa.completedAt && (

Completed: {new Date(capa.completedAt).toLocaleString('en-MY', { timeZone: 'Asia/Kuala_Lumpur' })}

)}
{isHse && status === 'pending_verification' && ( )} {isHse && status === 'verified' && ( )}
) }