diff --git a/lib/incidents/validate.ts b/lib/incidents/validate.ts index 63e9d64..45eeac2 100644 --- a/lib/incidents/validate.ts +++ b/lib/incidents/validate.ts @@ -1,4 +1,4 @@ -export const INCIDENT_TYPES = ['injury', 'near_miss', 'hazard', 'asset_damage', 'environmental', 'security', 'fire'] as const +export const INCIDENT_TYPES = ['injury', 'near_miss', 'hazard', 'asset_damage', 'environmental', 'security', 'fire', 'transport'] as const export const MEDICAL_STATUSES = ['none', 'first_aid', 'medical_treatment', 'lti'] as const export type IncidentType = typeof INCIDENT_TYPES[number] @@ -12,6 +12,7 @@ export interface IncidentInput { medical_status?: MedicalStatus asset_involved: boolean type_details?: Record + truck_id?: string | null } // Whitelisted type-specific intake fields per incident type (PRD ยง3). @@ -76,6 +77,8 @@ export function validateIncidentInput(input: IncidentInput): { ok: boolean; erro if (!INCIDENT_TYPES.includes(input.incident_type)) errors.push('incident_type is invalid') if (input.injury_involved && !input.medical_status) errors.push('medical_status is required when injury is involved') if (input.medical_status && !MEDICAL_STATUSES.includes(input.medical_status)) errors.push('medical_status is invalid') + if (input.incident_type === 'transport' && !input.truck_id?.trim()) + errors.push('truck_id is required for transport incidents') return { ok: errors.length === 0, errors } } diff --git a/tests/lib/incidents/validate.test.ts b/tests/lib/incidents/validate.test.ts index 201719f..64beccf 100644 --- a/tests/lib/incidents/validate.test.ts +++ b/tests/lib/incidents/validate.test.ts @@ -42,6 +42,30 @@ describe('validateIncidentInput', () => { expect(result.ok).toBe(false) expect(result.errors).toContain('incident_type is invalid') }) + + it('accepts transport type when truck_id is present', () => { + const r = validateIncidentInput({ + zone_token: 'z', + incident_type: 'transport', + description: 'Truck clipped the dock frame reversing into bay 3.', + injury_involved: false, + asset_involved: false, + truck_id: 'truck-uuid', + } as any) + expect(r.ok).toBe(true) + }) + + it('rejects transport type without a truck_id', () => { + const r = validateIncidentInput({ + zone_token: 'z', + incident_type: 'transport', + description: 'Truck clipped the dock frame reversing into bay 3.', + injury_involved: false, + asset_involved: false, + } as any) + expect(r.ok).toBe(false) + expect(r.errors).toContain('truck_id is required for transport incidents') + }) }) describe('validateTypeDetails', () => {