Incident management, Permit to Work (PTW), toolbox talks, PPE compliance, safety audits, hazard register, and HSE statistics tracking.
HSE (Health, Safety & Environment) is critical for construction sites. The module manages incident reporting and investigation, Permit to Work (PTW) for hazardous activities, daily toolbox talks, PPE compliance checks, safety observations, safety audits, emergency drills, and aggregate HSE statistics. Zero-incident target tracked through proactive leading indicators and reactive lagging indicators.
| Status | Description | Allowed Actions | Next States |
|---|---|---|---|
| Reported | Incident reported within 1 hour | Investigate, First Aid | Under Investigation |
| Under Investigation | Root cause analysis in progress | Update Findings, CAPA | CAPA Assigned |
| CAPA Assigned | Corrective actions being implemented | Complete Actions, Verify | Closed |
| Closed | Investigation complete, CAPA verified | Archive, Lessons Learned | — |
| Active | PTW valid for authorized work | Monitor, Extend, Close | Expired, Closed |
| Expired | PTW validity period ended | Renew or Close | Active, Closed |
Loss of life or permanent disability — immediate investigation, regulatory reporting within 2 hours.
Lost Time Injury (LTI), Medical Treatment Case (MTC) — investigation within 24 hours.
Minor injury treated on-site — recorded in first aid register, root cause documented.
Event with potential for injury but no actual harm — encouraged reporting, trend analysis for prevention.
incident_id — PK, unique incident recordproject_id — FK → project.projectincident_date, incident_time, location — When and wherecategory — fatal | ltw | mtc | first_aid | near_miss | property_damagedescription, root_cause — Details and analysisinjured_person_id — FK → optional worker/employee referenceseverity, status — Impact level and lifecycleptw_id — PK, Permit to Workproject_id — FK → project.projectwork_type — hot_work | confined_space | height | excavation | electricallocation, description — Work detailsvalid_from, valid_to — Permit validity periodissued_by, authorized_by — Approval chainstatus — Active / Expired / Closedtalk_id — PKproject_id — FK → project.projecttalk_date, topic — Daily safety briefingconducted_by, attendee_count — Facilitator and attendancekey_points, photos_url — Content and evidencecompliance_id — PKproject_id — FK → project.projectcheck_date, checked_by — Inspection detailsworkers_checked, compliant_count, non_compliant_count — PPE check resultsviolations_json — Detailed violation recordsaudit_id — PKproject_id — FK → project.projectaudit_date, audit_type — Scheduled / Surprise / Externalscore, max_score — Percentage compliancefindings_count, critical_findings — Issue summaryauditor — Internal / External auditor referenceSite safety team maintains hazard register with identified hazards, risk ratings, and control measures. Daily site walk-throughs identify new hazards.
Before hazardous activities (hot work, confined space, height work), PTW issued by Safety Officer and authorized by Site-in-Charge. PTW has validity period and specific precautions.
15-minute safety briefing at start of each shift. Topic selected from safety calendar or based on upcoming activities. Attendance mandatory for all site workers.
Random and scheduled checks for proper PPE usage — helmet, safety shoes, vest, goggles, harness. Non-compliance results in warning → penalty → site removal escalation.
All incidents reported within 1 hour via mobile/web. Investigation team formed based on severity. Root cause analysis (5-Why, Fishbone) conducted. CAPA defined with target dates.
Monthly internal audits score site against safety checklist. Quarterly external audits by independent HSE consultants. Findings tracked until closure.
-- Monthly HSE KPIs for project SELECT COUNT(CASE WHEN category = 'ltw' THEN 1 END) AS lti_count, COUNT(CASE WHEN category = 'near_miss' THEN 1 END) AS near_miss_count, COUNT(CASE WHEN category = 'first_aid' THEN 1 END) AS first_aid_count, ss.man_hours, ss.safe_man_hours, ROUND(ss.lti_count * 1000000.0 / NULLIF(ss.man_hours, 0), 2) AS ltifr FROM hse.incident i JOIN hse.hse_statistics ss ON ss.project_id = i.project_id WHERE i.project_id = :project_id AND i.incident_date BETWEEN :start_date AND :end_date GROUP BY ss.man_hours, ss.safe_man_hours, ss.lti_count;