Contractor safety management — site checklists, incident reporting, OSHA compliance tracking, team safety scores, and certification management.
SafetyDashboard — primary safety hub with compliance score ring, KPI metrics, and quick actions
useSafety() hook • api.safety.dashboard.get
SiteChecklist — toggleable pre-job items with photo verification, disabled sign-off until 100% complete
useChecklist(jobId) • api.safety.checklists.submit
IncidentReport — structured form with type chips, severity selector, photo grid, and witness fields
useIncidentForm() • api.safety.incidents.create
IncidentHistory — timeline view with severity badges, filter chips, and insurance export
useIncidents(filters) • api.safety.incidents.list
TrainingCerts — segmented tabs for certs, training, schedule with expiration tracking and upload
useCertifications() • api.safety.certifications.list
TeamSafetyScores — individual member scores, checklist counts, incident tracking, and zero-incident streak badges
useTeamSafety() • api.safety.team.scores
OSHACompliance — categorized requirements checklist, inspection readiness score, and common violations awareness
useCompliance() • api.safety.osha.status
SafetyReports — period selector, incident rate chart, KPIs, top concerns, meeting notes, and PDF export
useSafetyReports(period) • api.safety.reports.generate
_id: Id<"safetyIncidents">
contractorId: Id<"contractorUsers">
jobId: Id<"jobs"> | undefined
type: "injury" | "near_miss" | "property_damage" | "equipment"
severity: "low" | "medium" | "high"
description: string
location: string
dateTime: number (timestamp)
photos: Id<"_storage">[]
witnessName: string | undefined
witnessContact: string | undefined
resolution: "pending" | "investigating" | "resolved"
correctiveAction: string | undefined
reportedBy: Id<"contractorUsers">
_creationTime: number
_id: Id<"safetyChecklists">
contractorId: Id<"contractorUsers">
jobId: Id<"jobs">
items: ChecklistItem[]
.label: string
.description: string
.completed: boolean
photos: Id<"_storage">[]
signedOffBy: Id<"contractorUsers"> | undefined
signedOffAt: number | undefined
status: "in_progress" | "completed"
_creationTime: number
_id: Id<"certifications">
contractorId: Id<"contractorUsers">
name: string
type: "osha" | "first_aid" | "fall_protection" | "electrical" | "other"
issuedDate: number
expirationDate: number
documentUrl: Id<"_storage"> | undefined
status: "valid" | "expiring" | "expired"
verifiedBy: Id<"adminUsers"> | undefined
_creationTime: number
_id: Id<"trainingRecords">
contractorId: Id<"contractorUsers">
courseName: string
provider: string
dueDate: number
completedDate: number | undefined
status: "assigned" | "in_progress" | "completed" | "overdue"
certificateUrl: Id<"_storage"> | undefined
assignedBy: Id<"contractorUsers">
_creationTime: number
useSafety()
dashboard score, KPIs, recent activity
useChecklist(jobId)
checklist items, toggle state, photo uploads
useIncidentForm()
form state, validation, submission
useIncidents(filters)
paginated incident list with filters
useCertifications()
cert list, expiration alerts, upload
useTeamSafety()
member scores, streaks, aggregates
useCompliance()
OSHA categories, readiness score
useSafetyReports(period)
incident rate, KPIs, concerns, meetings
api.safety.dashboard.get
api.safety.checklists.getByJob
api.safety.checklists.submit
api.safety.checklists.toggleItem
api.safety.incidents.create
api.safety.incidents.list
api.safety.incidents.update
api.safety.incidents.export
api.safety.certifications.list
api.safety.certifications.upload
api.safety.team.scores
api.safety.osha.status
api.safety.reports.generate
api.safety.reports.meetingNotes