Collection Templates for Data Collection
Status: Final Version: 1.5 Last Updated: 2026-01-20
Purpose
This document defines the collection templates, validation schemas, and submission workflows for ESG data collection, including: - Stakeholder engagement logs and grievance mechanism records (GRI 2-29) - Human capital metrics including employee demographics (GRI 405-1), employment type and turnover (GRI 401), and employee age demographics - Occupational Health and Safety (OHS) metrics including quarterly incident statistics and LTI performance metrics (GRI 403-9, GRI 403-10) - Environmental metrics including production, materials consumption (GRI 301), energy usage (GRI 302), water management (GRI 303), air emissions (GRI 305), waste generation (GRI 306), TSF management, rehabilitation activities, and environmental incidents (GRI 307) - Community investment activities (GRI 203)
Table of Contents
- Template Overview
- Stakeholder Engagement Log Template
- Grievance Mechanism Log Template
- Human Capital Metrics Templates
- GRI 405-1 Employee Demographics Template
- GRI 401 Employment Type and Turnover Template
- Employee Age Demographics Template
- Occupational Health and Safety (OHS) Templates
- Quarterly Incident Statistics Template (F.1)
- LTI Days and LTIFR Template (F.2)
- Environmental Metrics Templates
- Monthly Production Metrics (G.1)
- Monthly Materials Consumption (G.2)
- Monthly Energy Usage (G.3)
- Monthly Water Management (G.4)
- Quarterly Water Quality Monitoring (G.4.4)
- Quarterly Air Emissions Monitoring (G.5)
- Monthly Waste Generation (G.6-G.7)
- Monthly TSF Management (G.8)
- Quarterly Rehabilitation Activities (G.9)
- Quarterly Environmental Incidents (G.10)
- Community Investment Template
- Validation Rules
- Evidence Requirements
- Collector Workflow
- Multi-Row Submission Guidance
- API Integration
Template Overview
Collection Model
Unlike single-metric submissions, stakeholder engagement and grievance data use a log-based collection model where collectors submit multiple rows over time:
- Quarterly logs: Engagements and grievances accumulate throughout the quarter
- Multi-row submissions: Each engagement or grievance is a separate record
- Incremental updates: Collectors can add new rows or update existing rows
- Status tracking: Records transition through Open → WIP → Closed lifecycle
Template Types
| Template Type | Record Entity | Collection Frequency | Mandatory |
|---|---|---|---|
| Stakeholder Engagement Log | stakeholder_engagements |
Quarterly | Yes |
| Grievance Mechanism Log | grievances |
Quarterly | Yes |
| GRI 405-1 Employee Demographics | metric_submissions |
Quarterly | Yes |
| GRI 401 Employment Type and Turnover | metric_submissions |
Monthly | Yes |
| Employee Age Demographics | metric_submissions |
Monthly | Yes |
| OHS Quarterly Incident Statistics (F.1) | metric_submissions |
Quarterly | Yes |
| OHS LTI Days and LTIFR (F.2) | metric_submissions |
Quarterly | Yes |
| Environmental Production Metrics (G.1) | metric_submissions |
Monthly | Yes |
| Environmental Materials Consumption (G.2) | metric_submissions |
Monthly | Yes |
| Environmental Energy Usage (G.3) | metric_submissions |
Monthly | Yes |
| Environmental Water Management (G.4) | metric_submissions |
Monthly | Yes |
| Environmental Water Quality (G.4.4) | metric_submissions |
Quarterly | Yes |
| Environmental Air Emissions (G.5) | metric_submissions |
Quarterly | Yes |
| Environmental Waste Generation (G.6-G.7) | metric_submissions |
Monthly | Yes |
| Environmental TSF Management (G.8) | metric_submissions |
Monthly | Yes |
| Environmental Rehabilitation (G.9) | environmental_activities |
Quarterly | Yes |
| Environmental Incidents (G.10) | environmental_incidents |
Quarterly | Yes |
| Community Investment Log (H.1) | community_investment_activities |
Quarterly | Yes |
Stakeholder Engagement Log Template
Template Schema
Template ID: STAKEHOLDER_ENGAGEMENT_LOG_V1
Collection Frequency: Quarterly
Dimensionality: Organisation, Reporting Period, Site (optional)
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
initial_date |
Date (ISO 8601) | Yes | Must be within reporting period, not future | 2025-01-24 |
stakeholder_category_ids |
Array\<UUID> | Yes | At least one category, all IDs must exist in master list | ["cat-uuid-1", "cat-uuid-2"] |
stakeholder_name |
String (500 chars) | Yes | Non-empty, group/organisation name (not individuals) | "Guruve Local Gvt, OPC, Ministry of Education" |
purpose |
Text (2000 chars) | Yes | Non-empty, describes engagement objective | "Muroiwa Primary School Additional Block Construction" |
outcome |
Text (5000 chars) | Conditional | Required if status = Closed | "The block is currently at ring beam level..." |
owner |
String (500 chars) | Yes | Non-empty, can be multiple names/roles | "T.Tinago/L.Khumalo/D. Tavenhave" |
status |
Enum | Yes | Open, WIP, Closed (one-way transitions) | WIP |
status_date |
Date (ISO 8601) | Yes | Must be >= initial_date | 2025-04-30 |
engagement_platform_ids |
Array\<UUID> | No | All IDs must exist in master list | ["platform-uuid-1"] |
organisation_id |
UUID | Yes | Must exist and match tenant | "org-uuid" |
site_id |
UUID | No | If provided, must exist and match organisation | "site-uuid" |
JSON Template Structure
{
"template_id": "STAKEHOLDER_ENGAGEMENT_LOG_V1",
"template_name": "Stakeholder Engagement Log",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "reporting_period", "site"],
"is_mandatory": true,
"submission_type": "LOG",
"fields": [
{
"field_name": "initial_date",
"field_label": "Initial Date of Engagement",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "REPORTING_PERIOD_START",
"max_date_rule": "TODAY",
"error_message": "Date must be within the reporting period and not in the future"
},
"help_text": "Enter the date when the engagement began"
},
{
"field_name": "stakeholder_category_ids",
"field_label": "Stakeholder Categories",
"data_type": "MULTI_SELECT",
"required": true,
"validation_rules": {
"min_items": 1,
"reference_table": "stakeholder_categories",
"tenant_scoped": true,
"error_message": "Select at least one stakeholder category"
},
"help_text": "Select all stakeholder categories that participated in this engagement",
"ui_hint": "CHECKBOX_LIST"
},
{
"field_name": "stakeholder_name",
"field_label": "Stakeholder Name",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 500,
"min_length": 1,
"pattern": "^[\\w\\s,./'-]+$",
"error_message": "Provide the name of the stakeholder group or organisation"
},
"help_text": "Enter the name of the stakeholder group, organisation, or entity (avoid individual names)",
"ui_hint": "TEXT_INPUT"
},
{
"field_name": "purpose",
"field_label": "Purpose of Engagement",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 2000,
"min_length": 10,
"error_message": "Describe the purpose of the engagement"
},
"help_text": "Briefly describe the objective or purpose of this engagement",
"ui_hint": "TEXTAREA"
},
{
"field_name": "outcome",
"field_label": "Outcome of Engagement",
"data_type": "TEXT",
"required": false,
"validation_rules": {
"max_length": 5000,
"required_if": "status == 'Closed'",
"error_message": "Outcome is required when status is Closed"
},
"help_text": "Describe the results, decisions, or actions from this engagement",
"ui_hint": "TEXTAREA"
},
{
"field_name": "owner",
"field_label": "Person Responsible for Closing Out",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 500,
"min_length": 2,
"error_message": "Specify the person(s) responsible for follow-up"
},
"help_text": "Enter the name(s) or role(s) responsible for follow-up actions (use '/' to separate multiple)",
"ui_hint": "TEXT_INPUT"
},
{
"field_name": "status",
"field_label": "Status of Engagement",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": ["Open", "WIP", "Closed"],
"transition_rules": {
"Open": ["WIP", "Closed"],
"WIP": ["Closed"],
"Closed": []
},
"error_message": "Invalid status transition (Open → WIP → Closed only)"
},
"help_text": "Select the current status of this engagement",
"ui_hint": "DROPDOWN"
},
{
"field_name": "status_date",
"field_label": "Status Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "FIELD:initial_date",
"error_message": "Status date must be on or after initial date"
},
"help_text": "Enter the target completion date (Open/WIP) or actual completion date (Closed)",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "engagement_platform_ids",
"field_label": "Engagement Platforms",
"data_type": "MULTI_SELECT",
"required": false,
"validation_rules": {
"reference_table": "engagement_platforms",
"tenant_scoped": true,
"error_message": "Select valid engagement platforms"
},
"help_text": "Select the platform(s) used for this engagement (e.g., Community Meeting, Email)",
"ui_hint": "CHECKBOX_LIST"
}
],
"evidence_requirements": {
"min_items": 1,
"allowed_types": ["MEETING_MINUTES", "ATTENDANCE_REGISTER", "LETTER", "EMAIL", "AGREEMENT", "PHOTO", "OTHER"],
"help_text": "Attach evidence such as meeting minutes, attendance registers, correspondence, or photos"
}
}
Grievance Mechanism Log Template
Template Schema
Template ID: GRIEVANCE_LOG_V1
Collection Frequency: Quarterly
Dimensionality: Organisation, Reporting Period, Site (optional)
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
date_reported |
Date (ISO 8601) | Yes | Must be within reporting period, not future | 2025-03-13 |
source_type |
Enum | Yes | Internal, External | External |
stakeholder_group |
String (255 chars) | Yes | General category (no individual names) | "Community" |
nature |
Text (5000 chars) | Yes | Description of the grievance | "Host communities raised a plea for clinic..." |
intervention |
Text (5000 chars) | Yes | Action taken or planned | "Construction of a Clinic at Bome is underway..." |
resolution_status |
Enum | Yes | RESOLVED, OUTSTANDING | RESOLVED |
organisation_id |
UUID | Yes | Must exist and match tenant | "org-uuid" |
site_id |
UUID | No | If provided, must exist and match organisation | "site-uuid" |
JSON Template Structure
{
"template_id": "GRIEVANCE_LOG_V1",
"template_name": "Grievance Mechanism Log",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "reporting_period", "site"],
"is_mandatory": true,
"submission_type": "LOG",
"fields": [
{
"field_name": "date_reported",
"field_label": "Date Grievance Reported",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "REPORTING_PERIOD_START",
"max_date_rule": "TODAY",
"error_message": "Date must be within the reporting period and not in the future"
},
"help_text": "Enter the date when the grievance was received"
},
{
"field_name": "source_type",
"field_label": "Internal/External Grievance",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": ["Internal", "External"],
"error_message": "Select whether this grievance is internal or external"
},
"help_text": "Indicate if the grievance came from internal staff or external stakeholders",
"ui_hint": "RADIO_BUTTONS"
},
{
"field_name": "stakeholder_group",
"field_label": "Department/Stakeholder Group",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 255,
"min_length": 2,
"pattern": "^[\\w\\s,/-]+$",
"pii_check": true,
"error_message": "Use general group names, not individual names"
},
"help_text": "Enter the department (internal) or stakeholder group (external) that raised the grievance. Use group names, not individuals.",
"ui_hint": "TEXT_INPUT"
},
{
"field_name": "nature",
"field_label": "General Nature of Grievance",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 5000,
"min_length": 10,
"error_message": "Describe the nature of the grievance"
},
"help_text": "Provide a description of the grievance or issue raised",
"ui_hint": "TEXTAREA"
},
{
"field_name": "intervention",
"field_label": "Intervention Measure",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 5000,
"min_length": 10,
"error_message": "Describe the intervention measure"
},
"help_text": "Describe the action taken or planned to address the grievance",
"ui_hint": "TEXTAREA"
},
{
"field_name": "resolution_status",
"field_label": "Resolved/Outstanding",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": ["RESOLVED", "OUTSTANDING"],
"error_message": "Select the resolution status"
},
"help_text": "Indicate whether the grievance has been resolved or is still outstanding",
"ui_hint": "DROPDOWN"
}
],
"evidence_requirements": {
"min_items": 0,
"allowed_types": ["GRIEVANCE_FORM", "LETTER", "EMAIL", "MEETING_MINUTES", "RESOLUTION_DOCUMENT", "PHOTO", "OTHER"],
"help_text": "Attach grievance forms, correspondence, resolution documents, or other supporting evidence"
}
}
Human Capital Metrics Templates
Human capital metrics use a dimensional data model where metrics are submitted with disaggregations by employment level, gender, age group, employment type, and local community status. Unlike log-based templates, these metrics use the raw_data and processed_data JSONB fields on metric_submissions to store dimensional breakdowns.
Collection Model for HR Metrics
- Quarterly collection: GRI 405-1 Employee Demographics (E.1)
- Monthly collection: GRI 401 Employment Type/Turnover (E.2), Employee Age Demographics (E.3)
- Dimensional data: Submitted as JSONB with nested structures
- Organisation-level: Most HR metrics collected at organisation level (except site-specific metrics for Salaried/Waged staff)
GRI 405-1 Employee Demographics Template
Template ID: GRI_405_1_EMPLOYEE_DEMOGRAPHICS_V1
Collection Frequency: Quarterly
Dimensionality: Organisation (Executive), Site (Salaried/Waged)
Metrics Included:
- GRI_405_1_EXECUTIVE_HEADCOUNT
- GRI_405_1_SALARIED_NON_NEC_HEADCOUNT
- GRI_405_1_WAGED_NEC_HEADCOUNT
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
metric_id |
String | Yes | Must be one of the 3 GRI 405-1 metrics | GRI_405_1_EXECUTIVE_HEADCOUNT |
reporting_period_id |
UUID | Yes | Must exist, must be quarterly period | period-uuid |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
site_id |
UUID | Conditional | Required for Salaried/Waged, null for Executive | site-uuid |
activity_date |
Date (ISO 8601) | Yes | End of quarter date | 2025-03-31 |
raw_data |
JSONB | Yes | Must contain dimensional breakdown | See JSON structure below |
JSON Template Structure
{
"template_id": "GRI_405_1_EMPLOYEE_DEMOGRAPHICS_V1",
"template_name": "GRI 405-1 Employee Demographics",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "DIMENSIONAL_METRIC",
"fields": [
{
"field_name": "metric_id",
"field_label": "Metric ID",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"GRI_405_1_EXECUTIVE_HEADCOUNT",
"GRI_405_1_SALARIED_NON_NEC_HEADCOUNT",
"GRI_405_1_WAGED_NEC_HEADCOUNT"
],
"error_message": "Select a valid GRI 405-1 metric"
},
"help_text": "Select the employment level metric to submit",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Quarter End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_quarter_end": true,
"error_message": "Date must be the last day of the quarter"
},
"help_text": "Enter the last day of the quarter (e.g., Mar 31, Jun 30, Sep 30, Dec 31)",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "raw_data",
"field_label": "Demographic Breakdown",
"data_type": "JSONB",
"required": true,
"validation_rules": {
"schema": {
"type": "object",
"required": ["total_headcount", "male_count", "female_count", "local_community_count"],
"properties": {
"total_headcount": {"type": "integer", "minimum": 0},
"male_count": {"type": "integer", "minimum": 0},
"female_count": {"type": "integer", "minimum": 0},
"local_community_count": {"type": "integer", "minimum": 0}
}
},
"business_rules": [
"male_count + female_count = total_headcount",
"local_community_count <= total_headcount"
],
"error_message": "Demographic counts must be valid and sum correctly"
},
"help_text": "Enter headcount broken down by gender and local community status",
"ui_hint": "DIMENSIONAL_FORM"
}
],
"evidence_requirements": {
"min_items": 1,
"allowed_types": ["HR_REGISTER", "PAYROLL_REPORT", "BOARD_REPORT", "ORG_CHART", "SITE_ROSTER"],
"help_text": "Attach HR register, payroll report, or other headcount evidence"
}
}
Example Submission Payload
{
"submission_uuid": "demo-405-1-exec-uuid",
"metric_id": "GRI_405_1_EXECUTIVE_HEADCOUNT",
"reporting_period_id": "period-uuid-q3-2025",
"organisation_id": "org-uuid",
"site_id": null,
"activity_date": "2025-09-30",
"raw_data": {
"total_headcount": 2,
"male_count": 2,
"female_count": 0,
"local_community_count": 0
},
"metadata": {
"collector_notes": "Q3 2025 Executive headcount snapshot"
}
}
GRI 401 Employment Type and Turnover Template
Template ID: GRI_401_EMPLOYMENT_TYPE_TURNOVER_V1
Collection Frequency: Monthly
Dimensionality: Organisation
Metrics Included:
- GRI_401_PERMANENT_EMPLOYEES_MONTHLY
- GRI_401_FIXED_TERM_EMPLOYEES_MONTHLY
- GRI_401_NEW_RECRUITS_PERMANENT_MALE_MONTHLY
- GRI_401_NEW_RECRUITS_PERMANENT_FEMALE_MONTHLY
- GRI_401_DEPARTURES_PERMANENT_MONTHLY
- GRI_401_CASUAL_WORKERS_MONTHLY
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
metric_id |
String | Yes | Must be one of the 6 GRI 401 metrics | GRI_401_PERMANENT_EMPLOYEES_MONTHLY |
reporting_period_id |
UUID | Yes | Must exist, must be monthly period | period-uuid |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
activity_date |
Date (ISO 8601) | Yes | Last day of month | 2025-01-31 |
value |
Integer | Yes | Non-negative integer | 417 |
JSON Template Structure
{
"template_id": "GRI_401_EMPLOYMENT_TYPE_TURNOVER_V1",
"template_name": "GRI 401 Employment Type and Turnover",
"template_version": 1,
"collection_frequency": "MONTHLY",
"dimensionality": ["organisation"],
"is_mandatory": true,
"submission_type": "SIMPLE_METRIC",
"fields": [
{
"field_name": "metric_id",
"field_label": "Metric ID",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"GRI_401_PERMANENT_EMPLOYEES_MONTHLY",
"GRI_401_FIXED_TERM_EMPLOYEES_MONTHLY",
"GRI_401_NEW_RECRUITS_PERMANENT_MALE_MONTHLY",
"GRI_401_NEW_RECRUITS_PERMANENT_FEMALE_MONTHLY",
"GRI_401_DEPARTURES_PERMANENT_MONTHLY",
"GRI_401_CASUAL_WORKERS_MONTHLY"
],
"error_message": "Select a valid GRI 401 metric"
},
"help_text": "Select the employment or turnover metric to submit",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Month End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_month_end": true,
"error_message": "Date must be the last day of the month"
},
"help_text": "Enter the last day of the month (e.g., Jan 31, Feb 28/29, etc.)",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "value",
"field_label": "Headcount or Count",
"data_type": "INTEGER",
"required": true,
"validation_rules": {
"minimum": 0,
"error_message": "Value must be a non-negative integer"
},
"help_text": "Enter the monthly headcount, recruitment count, departure count, or casual worker count",
"ui_hint": "NUMBER_INPUT"
}
],
"evidence_requirements": {
"min_items": 1,
"allowed_types": ["HR_REGISTER", "PAYROLL_REPORT", "RECRUITMENT_REPORT", "EXIT_REPORT", "TIME_SHEET", "CONTRACT_REGISTER"],
"help_text": "Attach HR register, payroll report, recruitment report, or exit report as evidence"
}
}
Example Submission Payload
{
"submission_uuid": "demo-401-perm-uuid",
"metric_id": "GRI_401_PERMANENT_EMPLOYEES_MONTHLY",
"reporting_period_id": "period-uuid-jan-2025",
"organisation_id": "org-uuid",
"site_id": null,
"activity_date": "2025-01-31",
"value": 417,
"metadata": {
"collector_notes": "January 2025 permanent employee headcount"
}
}
Employee Age Demographics Template
Template ID: EMPLOYEE_AGE_DEMOGRAPHICS_V1
Collection Frequency: Monthly
Dimensionality: Organisation
Metrics Included: - Monthly headcount by age group (Under 30, Aged 30-50, Over 50)
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
reporting_period_id |
UUID | Yes | Must exist, must be monthly period | period-uuid |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
activity_date |
Date (ISO 8601) | Yes | Last day of month | 2025-01-31 |
raw_data |
JSONB | Yes | Must contain age group breakdown | See JSON structure below |
JSON Template Structure
{
"template_id": "EMPLOYEE_AGE_DEMOGRAPHICS_V1",
"template_name": "Employee Age Demographics",
"template_version": 1,
"collection_frequency": "MONTHLY",
"dimensionality": ["organisation"],
"is_mandatory": true,
"submission_type": "DIMENSIONAL_METRIC",
"fields": [
{
"field_name": "activity_date",
"field_label": "Month End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_month_end": true,
"error_message": "Date must be the last day of the month"
},
"help_text": "Enter the last day of the month",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "raw_data",
"field_label": "Age Group Breakdown",
"data_type": "JSONB",
"required": true,
"validation_rules": {
"schema": {
"type": "object",
"required": ["under_30", "aged_30_50", "over_50", "total"],
"properties": {
"under_30": {"type": "integer", "minimum": 0},
"aged_30_50": {"type": "integer", "minimum": 0},
"over_50": {"type": "integer", "minimum": 0},
"total": {"type": "integer", "minimum": 0}
}
},
"business_rules": [
"under_30 + aged_30_50 + over_50 = total"
],
"error_message": "Age group counts must sum to total"
},
"help_text": "Enter headcount broken down by age group",
"ui_hint": "DIMENSIONAL_FORM"
}
],
"evidence_requirements": {
"min_items": 1,
"allowed_types": ["HR_REGISTER", "PAYROLL_REPORT"],
"help_text": "Attach HR register or payroll report showing age distribution"
}
}
Example Submission Payload
{
"submission_uuid": "demo-age-jan-uuid",
"metric_id": "EMPLOYEE_AGE_MONTHLY",
"reporting_period_id": "period-uuid-jan-2025",
"organisation_id": "org-uuid",
"site_id": null,
"activity_date": "2025-01-31",
"raw_data": {
"under_30": 189,
"aged_30_50": 358,
"over_50": 74,
"total": 621
},
"metadata": {
"collector_notes": "January 2025 age distribution snapshot"
}
}
Occupational Health and Safety (OHS) Templates
OHS metrics use a dimensional data model with quarterly collection frequency. Unlike simple metrics, OHS data requires dimensional breakdowns by workforce type (Mine vs Contractors), incident type, and reporting quarter. These metrics support GRI 403-9 (work-related injuries) and GRI 403-10 (work-related ill health) disclosures.
Collection Model for OHS Metrics
- Quarterly collection: All OHS metrics collected at quarter end
- Site-level dimensionality: Collected at site level, aggregated to organization level for reporting
- Dimensional data: Submitted as structured JSONB with nested breakdowns
- Evidence requirements: Severity-based (MANDATORY for fatalities/LTIs, RECOMMENDED for medical treatment, OPTIONAL for first aid)
- Confidentiality: All OHS data classified as CONFIDENTIAL due to safety and health information
Quarterly Incident Statistics Template (F.1)
Template ID: OHS_QUARTERLY_INCIDENT_STATS_V1
Collection Frequency: Quarterly
Dimensionality: Site (aggregated to Organisation for reporting)
Metrics Included:
- OHS_INCIDENT_NEAR_MISS: Near miss incidents
- OHS_INCIDENT_FIRST_AID: First aid incidents
- OHS_INCIDENT_RESTRICTED_WORK: Restricted work incidents
- OHS_INCIDENT_MEDICAL_TREATMENT: Medical treatment incidents
- OHS_INCIDENT_LTI: Lost Time Injury incidents
- OHS_INCIDENT_FATALITY: Work-related fatalities
- OHS_INCIDENT_HIGH_POTENTIAL: High potential incidents
- OHS_INCIDENT_PROPERTY_DAMAGE: Property damage incidents
- OHS_INCIDENT_SILICOSIS: Silicosis/Pneumoconiosis cases
- OHS_INCIDENT_OTHER_CLINIC: Other clinic visits
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
reporting_period_id |
UUID | Yes | Must exist, must be quarterly period | period-uuid |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
site_id |
UUID | Yes | Must exist and match organisation | site-uuid |
activity_date |
Date (ISO 8601) | Yes | End of quarter date | 2025-03-31 |
raw_data |
JSONB | Yes | Must contain breakdown by incident type and workforce type | See JSON structure below |
JSON Template Structure
{
"template_id": "OHS_QUARTERLY_INCIDENT_STATS_V1",
"template_name": "OHS Quarterly Incident Statistics (F.1)",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "DIMENSIONAL_METRIC",
"fields": [
{
"field_name": "activity_date",
"field_label": "Quarter End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_quarter_end": true,
"error_message": "Date must be the last day of the quarter (Mar 31, Jun 30, Sep 30, or Dec 31)"
},
"help_text": "Enter the last day of the quarter",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "raw_data",
"field_label": "Incident Statistics by Type and Workforce",
"data_type": "JSONB",
"required": true,
"validation_rules": {
"schema": {
"type": "object",
"required": [
"near_miss",
"first_aid",
"restricted_work",
"medical_treatment",
"lti",
"fatality",
"high_potential",
"property_damage",
"silicosis_pneumoconiosis",
"other_clinic_visits"
],
"properties": {
"near_miss": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"first_aid": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"restricted_work": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"medical_treatment": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"lti": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"fatality": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"high_potential": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"property_damage": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"silicosis_pneumoconiosis": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"other_clinic_visits": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
}
}
},
"business_rules": [
"All incident counts must be non-negative integers",
"Zero values allowed for no-incident quarters (do not use null or blank)",
"If fatality.mine > 0 or fatality.contractors > 0, MANDATORY evidence required",
"If lti.mine > 0 or lti.contractors > 0, MANDATORY evidence required",
"If high_potential.mine > 0 or high_potential.contractors > 0, MANDATORY evidence required",
"If silicosis_pneumoconiosis.mine > 0 or silicosis_pneumoconiosis.contractors > 0, MANDATORY evidence required"
],
"error_message": "Incident statistics must contain valid counts for all incident types by workforce type"
},
"help_text": "Enter quarterly incident counts broken down by incident type and workforce type (Mine vs Contractors). Use 0 for no incidents.",
"ui_hint": "DIMENSIONAL_FORM"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"fatality count > 0: FATALITY_REPORT, INVESTIGATION_REPORT, ACCIDENT_REPORT required",
"lti count > 0: LTI_REGISTER, ACCIDENT_REPORT required",
"high_potential count > 0: INCIDENT_REGISTER, INVESTIGATION_REPORT required",
"silicosis_pneumoconiosis count > 0: OCCUPATIONAL_DISEASE_REGISTER, MEDICAL_TREATMENT_RECORD required"
],
"RECOMMENDED_IF": [
"medical_treatment count > 0: MEDICAL_TREATMENT_RECORD, CLINIC_REGISTER recommended",
"restricted_work count > 0: ACCIDENT_REPORT, HSE_REPORT recommended",
"property_damage count > 0: PROPERTY_DAMAGE_REPORT, INCIDENT_REGISTER recommended"
]
},
"allowed_types": [
"ACCIDENT_REPORT",
"INCIDENT_REGISTER",
"HSE_REPORT",
"CLINIC_REGISTER",
"FIRST_AID_REGISTER",
"MEDICAL_TREATMENT_RECORD",
"LTI_REGISTER",
"FATALITY_REPORT",
"INVESTIGATION_REPORT",
"PROPERTY_DAMAGE_REPORT",
"OCCUPATIONAL_DISEASE_REGISTER"
],
"help_text": "Attach incident reports, registers, or investigation reports. Evidence is MANDATORY for fatalities, LTIs, high potential incidents, and occupational diseases."
}
}
Example Submission Payload
{
"submission_uuid": "ohs-f1-q1-2025-uuid",
"template_id": "OHS_QUARTERLY_INCIDENT_STATS_V1",
"reporting_period_id": "period-uuid-q1-2025",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"activity_date": "2025-03-31",
"raw_data": {
"near_miss": {
"mine": 12,
"contractors": 8
},
"first_aid": {
"mine": 5,
"contractors": 3
},
"restricted_work": {
"mine": 2,
"contractors": 1
},
"medical_treatment": {
"mine": 3,
"contractors": 2
},
"lti": {
"mine": 1,
"contractors": 0
},
"fatality": {
"mine": 0,
"contractors": 0
},
"high_potential": {
"mine": 1,
"contractors": 0
},
"property_damage": {
"mine": 2,
"contractors": 1
},
"silicosis_pneumoconiosis": {
"mine": 0,
"contractors": 0
},
"other_clinic_visits": {
"mine": 15,
"contractors": 10
}
},
"metadata": {
"collector_notes": "Q1 2025 incident statistics for Site A",
"quarter": "Q1",
"fiscal_year": "FY2025"
}
}
LTI Days and LTIFR Template (F.2)
Template ID: OHS_LTI_PERFORMANCE_V1
Collection Frequency: Quarterly
Dimensionality: Site (aggregated to Organisation for reporting)
Metrics Included:
- OHS_LTI_DAYS: Lost time injury days (total days/shifts lost)
- OHS_LTIFR: Lost Time Injury Frequency Rate (calculated metric)
- OHS_HOURS_WORKED: Total hours worked (required for LTIFR calculation)
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
reporting_period_id |
UUID | Yes | Must exist, must be quarterly period | period-uuid |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
site_id |
UUID | Yes | Must exist and match organisation | site-uuid |
activity_date |
Date (ISO 8601) | Yes | End of quarter date | 2025-03-31 |
raw_data |
JSONB | Yes | Must contain LTI days, hours worked, and optionally LTIFR by workforce type | See JSON structure below |
JSON Template Structure
{
"template_id": "OHS_LTI_PERFORMANCE_V1",
"template_name": "OHS LTI Days and LTIFR (F.2)",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "DIMENSIONAL_METRIC",
"fields": [
{
"field_name": "activity_date",
"field_label": "Quarter End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_quarter_end": true,
"error_message": "Date must be the last day of the quarter (Mar 31, Jun 30, Sep 30, or Dec 31)"
},
"help_text": "Enter the last day of the quarter",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "raw_data",
"field_label": "LTI Performance Metrics by Workforce",
"data_type": "JSONB",
"required": true,
"validation_rules": {
"schema": {
"type": "object",
"required": ["lti_days", "hours_worked", "ltifr"],
"properties": {
"lti_days": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "integer", "minimum": 0},
"contractors": {"type": "integer", "minimum": 0}
}
},
"hours_worked": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "number", "minimum": 0},
"contractors": {"type": "number", "minimum": 0}
}
},
"ltifr": {
"type": "object",
"required": ["mine", "contractors"],
"properties": {
"mine": {"type": "number", "minimum": 0, "maximum": 9999.99},
"contractors": {"type": "number", "minimum": 0, "maximum": 9999.99}
}
}
}
},
"business_rules": [
"LTI days must be non-negative integers",
"Hours worked must be non-negative numbers",
"LTIFR must be non-negative with 2 decimal places",
"LTIFR calculation: (LTI count × 1,000,000) / Hours worked",
"If LTI count from F.1 = 0, then LTI days must = 0 and LTIFR must = 0.00",
"If LTI days > 0, then corresponding LTI count in F.1 must be > 0",
"Cross-validation: LTI count from F.1 must match LTIFR calculation input"
],
"error_message": "LTI performance metrics must be valid and consistent with F.1 incident counts"
},
"help_text": "Enter LTI days, total hours worked, and LTIFR for Mine and Contractors. LTIFR = (LTI count × 1,000,000) / Hours worked. Use 0 for no LTIs.",
"ui_hint": "DIMENSIONAL_FORM"
}
],
"evidence_requirements": {
"min_items": 1,
"allowed_types": [
"LTI_REGISTER",
"TIME_SHEET",
"PAYROLL_REPORT",
"HR_REGISTER",
"HSE_REPORT",
"ACCIDENT_REPORT"
],
"help_text": "Attach LTI register, time sheets, payroll reports, or HR register showing hours worked and LTI days. Evidence is MANDATORY for all LTI performance submissions."
}
}
Example Submission Payload
{
"submission_uuid": "ohs-f2-q1-2025-uuid",
"template_id": "OHS_LTI_PERFORMANCE_V1",
"reporting_period_id": "period-uuid-q1-2025",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"activity_date": "2025-03-31",
"raw_data": {
"lti_days": {
"mine": 15,
"contractors": 0
},
"hours_worked": {
"mine": 245000,
"contractors": 180000
},
"ltifr": {
"mine": 4.08,
"contractors": 0.00
}
},
"metadata": {
"collector_notes": "Q1 2025 LTI performance metrics for Site A. 1 LTI for Mine workforce resulted in 15 days lost.",
"quarter": "Q1",
"fiscal_year": "FY2025",
"calculation_notes": "Mine LTIFR: (1 LTI × 1,000,000) / 245,000 hours = 4.08"
}
}
CSV Template Example
For collectors preferring CSV upload, the OHS templates can be provided as CSV files:
F.1 Quarterly Incident Statistics CSV:
Site,Quarter,Workforce Type,Near Miss,First Aid,Restricted Work,Medical Treatment,LTI,Fatality,High Potential,Property Damage,Silicosis/Pneumoconiosis,Other Clinic Visits
Site A,Q1 2025,Mine,12,5,2,3,1,0,1,2,0,15
Site A,Q1 2025,Contractors,8,3,1,2,0,0,0,1,0,10
F.2 LTI Days and LTIFR CSV:
Site,Quarter,Workforce Type,LTI Days,Hours Worked,LTIFR
Site A,Q1 2025,Mine,15,245000,4.08
Site A,Q1 2025,Contractors,0,180000,0.00
Environmental Metrics Templates
Environmental metrics use a mix of simple metric submissions, dimensional data submissions, and log-based collection depending on the data type. Environmental data collection supports monthly and quarterly frequencies aligned to the G. ENVIRONMENT report structure (G.1-G.10).
Collection Model for Environmental Metrics
- Monthly collection: Production (G.1), Materials (G.2), Energy (G.3), Water volumes (G.4), Waste (G.6-G.7), TSF (G.8)
- Quarterly collection: Water quality (G.4.4), Air emissions (G.5), Rehabilitation (G.9), Incidents (G.10)
- Site-level dimensionality: Most metrics collected at site level, aggregated to organization level for reporting
- Dimensional data: Water, waste, and emissions metrics use JSONB for dimensional breakdowns
- Log-based collection: Rehabilitation activities and environmental incidents use log models (similar to stakeholder engagement)
- Evidence requirements: Severity-based (MANDATORY for hazardous waste, TSF freeboard, critical incidents; RECOMMENDED for other metrics)
- Confidentiality: Environmental data classified as INTERNAL; incidents classified as CONFIDENTIAL
Monthly Production Metrics (G.1)
Template ID: ENV_PRODUCTION_MONTHLY_V1
Collection Frequency: Monthly
Dimensionality: Site
Metrics Included:
- ENV_PRODUCTION_CRUSHED_ORE: Monthly crushed ore produced (tonnes)
- ENV_PRODUCTION_MILLED_ORE: Monthly milled ore produced (tonnes)
- ENV_PRODUCTION_GOLD: Monthly gold produced (troy ounces)
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
metric_id |
String | Yes | Must be one of the 3 production metrics | ENV_PRODUCTION_CRUSHED_ORE |
reporting_period_id |
UUID | Yes | Must exist, must be monthly period | period-uuid |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
site_id |
UUID | Yes | Must exist and match organisation | site-uuid |
activity_date |
Date (ISO 8601) | Yes | Last day of month | 2025-01-31 |
value |
Number | Yes | Non-negative number with 2 decimal places | 125000.50 |
JSON Template Structure
{
"template_id": "ENV_PRODUCTION_MONTHLY_V1",
"template_name": "Environmental Production Metrics (G.1)",
"template_version": 1,
"collection_frequency": "MONTHLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "SIMPLE_METRIC",
"fields": [
{
"field_name": "metric_id",
"field_label": "Production Metric",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"ENV_PRODUCTION_CRUSHED_ORE",
"ENV_PRODUCTION_MILLED_ORE",
"ENV_PRODUCTION_GOLD"
],
"error_message": "Select a valid production metric"
},
"help_text": "Select the production metric to submit",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Month End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_month_end": true,
"error_message": "Date must be the last day of the month"
},
"help_text": "Enter the last day of the month",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "value",
"field_label": "Production Quantity",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Value must be a non-negative number with up to 2 decimal places"
},
"help_text": "Enter monthly production quantity (tonnes for ore, troy ounces for gold)",
"ui_hint": "NUMBER_INPUT"
}
],
"evidence_requirements": {
"min_items": 0,
"allowed_types": ["PRODUCTION_LOG", "MILL_REPORT", "SHIFT_REPORT", "METALLURGICAL_REPORT"],
"help_text": "Attach production logs, mill reports, or shift reports as evidence (recommended)"
}
}
Example Submission Payload
{
"submission_uuid": "env-prod-jan-2025-uuid",
"metric_id": "ENV_PRODUCTION_CRUSHED_ORE",
"reporting_period_id": "period-uuid-jan-2025",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"activity_date": "2025-01-31",
"value": 125000.50,
"metadata": {
"collector_notes": "January 2025 crushed ore production",
"unit": "tonnes"
}
}
Monthly Materials Consumption (G.2)
Template ID: ENV_MATERIALS_MONTHLY_V1
Collection Frequency: Monthly
Dimensionality: Site
Metrics Included:
- ENV_MATERIAL_ACTIVATED_CARBON: Activated carbon (kg)
- ENV_MATERIAL_CYANIDE: Cyanide (kg, hazardous material - MANDATORY evidence)
- ENV_MATERIAL_HYDROGEN_PEROXIDE: Hydrogen peroxide (L)
- ENV_MATERIAL_CAUSTIC_SODA: Caustic soda (kg)
- ENV_MATERIAL_BLASTING_EMULSION: Blasting emulsion (kg)
- ENV_MATERIAL_MILL_BALLS: Mill balls (kg)
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
metric_id |
String | Yes | Must be one of the 6 materials metrics | ENV_MATERIAL_CYANIDE |
reporting_period_id |
UUID | Yes | Must exist, must be monthly period | period-uuid |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
site_id |
UUID | Yes | Must exist and match organisation | site-uuid |
activity_date |
Date (ISO 8601) | Yes | Last day of month | 2025-01-31 |
value |
Number | Yes | Non-negative number with 2 decimal places | 3500.00 |
JSON Template Structure
{
"template_id": "ENV_MATERIALS_MONTHLY_V1",
"template_name": "Environmental Materials Consumption (G.2)",
"template_version": 1,
"collection_frequency": "MONTHLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "SIMPLE_METRIC",
"fields": [
{
"field_name": "metric_id",
"field_label": "Material Type",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"ENV_MATERIAL_ACTIVATED_CARBON",
"ENV_MATERIAL_CYANIDE",
"ENV_MATERIAL_HYDROGEN_PEROXIDE",
"ENV_MATERIAL_CAUSTIC_SODA",
"ENV_MATERIAL_BLASTING_EMULSION",
"ENV_MATERIAL_MILL_BALLS"
],
"error_message": "Select a valid materials metric"
},
"help_text": "Select the material consumed",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Month End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_month_end": true,
"error_message": "Date must be the last day of the month"
},
"help_text": "Enter the last day of the month",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "value",
"field_label": "Consumption Quantity",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Value must be a non-negative number with up to 2 decimal places"
},
"help_text": "Enter monthly consumption quantity (kg for solids, L for liquids). Calculated as: Opening Stock + Purchases - Closing Stock.",
"ui_hint": "NUMBER_INPUT"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"metric_id = ENV_MATERIAL_CYANIDE: INVOICE, STOCK_CARD, MATERIALS_REGISTER, HAZMAT_REGISTER required"
],
"RECOMMENDED_FOR_ALL": ["INVOICE", "STOCK_CARD", "MATERIALS_REGISTER"]
},
"allowed_types": ["INVOICE", "STOCK_CARD", "MATERIALS_REGISTER", "HAZMAT_REGISTER", "DELIVERY_NOTE"],
"help_text": "Attach invoices, stock cards, or materials registers. Evidence is MANDATORY for cyanide (hazardous material)."
}
}
Monthly Energy Usage (G.3)
Template ID: ENV_ENERGY_MONTHLY_V1
Collection Frequency: Monthly
Dimensionality: Site
Metrics Included:
- ENV_ENERGY_GRID_ELECTRICITY: Grid-supplied electricity (kWh)
- ENV_ENERGY_GENERATOR_ELECTRICITY: Generator-supplied electricity (kWh)
- ENV_FUEL_DIESEL_OTHER: Diesel for other uses (L)
- ENV_FUEL_DIESEL_MINING_DRILLING: Diesel for mining/drilling (L)
- ENV_FUEL_DIESEL_GENERATORS: Diesel for generators (L)
- ENV_FUEL_PETROL_OTHER: Petrol for vehicles/equipment (L)
JSON Template Structure
{
"template_id": "ENV_ENERGY_MONTHLY_V1",
"template_name": "Environmental Energy Usage (G.3)",
"template_version": 1,
"collection_frequency": "MONTHLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "SIMPLE_METRIC",
"fields": [
{
"field_name": "metric_id",
"field_label": "Energy/Fuel Metric",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"ENV_ENERGY_GRID_ELECTRICITY",
"ENV_ENERGY_GENERATOR_ELECTRICITY",
"ENV_FUEL_DIESEL_OTHER",
"ENV_FUEL_DIESEL_MINING_DRILLING",
"ENV_FUEL_DIESEL_GENERATORS",
"ENV_FUEL_PETROL_OTHER"
],
"error_message": "Select a valid energy/fuel metric"
},
"help_text": "Select the energy or fuel type consumed",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Month End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_month_end": true,
"error_message": "Date must be the last day of the month"
},
"help_text": "Enter the last day of the month",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "value",
"field_label": "Consumption Quantity",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Value must be a non-negative number with up to 2 decimal places"
},
"help_text": "Enter monthly consumption (kWh for electricity, L for fuel)",
"ui_hint": "NUMBER_INPUT"
}
],
"evidence_requirements": {
"min_items": 0,
"allowed_types": ["UTILITY_BILL", "METER_READING", "FUEL_INVOICE", "FUEL_LOG", "GENERATOR_LOG", "DELIVERY_NOTE"],
"help_text": "Attach utility bills, meter readings, fuel invoices, or fuel logs (recommended)"
}
}
Monthly Water Management (G.4)
Template ID: ENV_WATER_MONTHLY_V1
Collection Frequency: Monthly
Dimensionality: Site
Metrics Included:
- Water Abstraction: ENV_WATER_ABSTRACTION_FRESH_GROUNDWATER, ENV_WATER_ABSTRACTION_FRESH_SURFACE_WATER, ENV_WATER_ABSTRACTION_LOW_QUALITY_GROUNDWATER
- Recycled Water: ENV_WATER_RECYCLED_TSF_RETURN, ENV_WATER_RECYCLED_OTHER_STREAMS
- Water Consumed: ENV_WATER_CONSUMED_PROCESSING_PLANT, ENV_WATER_CONSUMED_MINING_OPERATIONS, ENV_WATER_CONSUMED_POTABLE
JSON Template Structure
{
"template_id": "ENV_WATER_MONTHLY_V1",
"template_name": "Environmental Water Management (G.4)",
"template_version": 1,
"collection_frequency": "MONTHLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "SIMPLE_METRIC",
"fields": [
{
"field_name": "metric_id",
"field_label": "Water Metric",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"ENV_WATER_ABSTRACTION_FRESH_GROUNDWATER",
"ENV_WATER_ABSTRACTION_FRESH_SURFACE_WATER",
"ENV_WATER_ABSTRACTION_LOW_QUALITY_GROUNDWATER",
"ENV_WATER_RECYCLED_TSF_RETURN",
"ENV_WATER_RECYCLED_OTHER_STREAMS",
"ENV_WATER_CONSUMED_PROCESSING_PLANT",
"ENV_WATER_CONSUMED_MINING_OPERATIONS",
"ENV_WATER_CONSUMED_POTABLE"
],
"error_message": "Select a valid water metric"
},
"help_text": "Select the water abstraction, recycling, or consumption metric",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Month End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_month_end": true,
"error_message": "Date must be the last day of the month"
},
"help_text": "Enter the last day of the month",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "value",
"field_label": "Water Volume",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Value must be a non-negative number with up to 2 decimal places"
},
"help_text": "Enter monthly water volume in cubic metres (m³)",
"ui_hint": "NUMBER_INPUT"
}
],
"evidence_requirements": {
"min_items": 0,
"allowed_types": ["WATER_METER_READING", "UTILITY_BILL", "BOREHOLE_LOG", "FLOW_LOG", "TSF_INSPECTION_REPORT", "WATER_TRUCK_LOG"],
"help_text": "Attach water meter readings, utility bills, borehole logs, or flow logs (recommended)"
}
}
Quarterly Water Quality Monitoring (G.4.4)
Template ID: ENV_WATER_QUALITY_QUARTERLY_V1
Collection Frequency: Quarterly
Dimensionality: Site, Sampling Point
Metrics Included:
- ENV_WATER_QUALITY_PH: pH (0-14 scale)
- ENV_WATER_QUALITY_TURBIDITY: Turbidity (NTU)
- ENV_WATER_QUALITY_SUSPENDED_SOLIDS: Suspended solids (mg/L)
- ENV_WATER_QUALITY_CYANIDE: Cyanide concentration (mg/L, MANDATORY evidence)
- ENV_WATER_QUALITY_HEAVY_METALS: Heavy metals concentration (mg/L, MANDATORY evidence)
- ENV_WATER_QUALITY_BAND: Quality band (Green/Amber/Red)
- ENV_WATER_QUALITY_NON_COMPLIANCE: Non-compliant parameters
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
reporting_period_id |
UUID | Yes | Must exist, must be quarterly period | period-uuid |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
site_id |
UUID | Yes | Must exist and match organisation | site-uuid |
sampling_point_id |
UUID | Yes | Must exist in master data | sampling-point-uuid |
activity_date |
Date (ISO 8601) | Yes | End of quarter date | 2025-03-31 |
raw_data |
JSONB | Yes | Must contain water quality parameters | See JSON structure below |
JSON Template Structure
{
"template_id": "ENV_WATER_QUALITY_QUARTERLY_V1",
"template_name": "Environmental Water Quality Monitoring (G.4.4)",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "site", "sampling_point"],
"is_mandatory": true,
"submission_type": "DIMENSIONAL_METRIC",
"fields": [
{
"field_name": "sampling_point_id",
"field_label": "Sampling Point",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"reference_table": "water_sampling_points",
"tenant_scoped": true,
"site_scoped": true,
"error_message": "Select a valid sampling point for this site"
},
"help_text": "Select the water sampling point (e.g., Upstream River, Downstream River, TSF Seepage Point)",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Quarter End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_quarter_end": true,
"error_message": "Date must be the last day of the quarter (Mar 31, Jun 30, Sep 30, or Dec 31)"
},
"help_text": "Enter the last day of the quarter",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "raw_data",
"field_label": "Water Quality Parameters",
"data_type": "JSONB",
"required": true,
"validation_rules": {
"schema": {
"type": "object",
"required": ["ph", "turbidity", "suspended_solids", "cyanide", "heavy_metals", "quality_band"],
"properties": {
"ph": {"type": "number", "minimum": 0, "maximum": 14},
"turbidity": {"type": "number", "minimum": 0},
"suspended_solids": {"type": "number", "minimum": 0},
"cyanide": {"type": "number", "minimum": 0},
"heavy_metals": {"type": "number", "minimum": 0},
"quality_band": {"type": "string", "enum": ["Green", "Amber", "Red"]},
"non_compliance_parameters": {"type": "string"}
}
},
"business_rules": [
"pH must be between 0 and 14 (typically 6.0-9.0 for environmental limits)",
"Turbidity in NTU (Nephelometric Turbidity Units)",
"Suspended solids, cyanide, heavy metals in mg/L",
"Quality band: Green = all parameters compliant, Amber = 1-2 parameters with minor exceedance (≤20%), Red = ≥3 parameters exceed or any >20% exceedance",
"Non-compliance parameters: comma-separated list of parameters exceeding limits"
],
"error_message": "Water quality parameters must be valid measurements with quality band classification"
},
"help_text": "Enter quarterly water quality measurements from lab analysis. Quality band calculated based on exceedance thresholds.",
"ui_hint": "DIMENSIONAL_FORM"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"cyanide measured: LAB_TEST_REPORT from accredited laboratory required",
"heavy_metals measured: LAB_TEST_REPORT from accredited laboratory required"
],
"RECOMMENDED_FOR_ALL": ["LAB_TEST_REPORT", "WATER_QUALITY_REPORT", "FIELD_MEASUREMENT_LOG"]
},
"allowed_types": ["LAB_TEST_REPORT", "WATER_QUALITY_REPORT", "FIELD_MEASUREMENT_LOG", "CHAIN_OF_CUSTODY"],
"help_text": "Attach lab test reports (MANDATORY for cyanide and heavy metals from accredited lab), water quality reports, or field measurement logs"
}
}
Example Submission Payload
{
"submission_uuid": "env-water-quality-q1-2025-uuid",
"template_id": "ENV_WATER_QUALITY_QUARTERLY_V1",
"reporting_period_id": "period-uuid-q1-2025",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"sampling_point_id": "sp-downstream-river-uuid",
"activity_date": "2025-03-31",
"raw_data": {
"ph": 7.2,
"turbidity": 15.5,
"suspended_solids": 45.0,
"cyanide": 0.03,
"heavy_metals": 0.08,
"quality_band": "Green",
"non_compliance_parameters": ""
},
"metadata": {
"collector_notes": "Q1 2025 water quality monitoring - Downstream River sampling point",
"lab_name": "ABC Environmental Lab (ISO 17025 accredited)",
"sample_date": "2025-03-28"
}
}
Quarterly Air Emissions Monitoring (G.5)
Template ID: ENV_AIR_EMISSIONS_QUARTERLY_V1
Collection Frequency: Quarterly
Dimensionality: Site, Monitoring Area
Metrics Included:
- ENV_AIR_PM10: PM10 concentration (μg/m³)
- ENV_AIR_SO2: SO₂ concentration (μg/m³)
- ENV_AIR_NO2: NO₂ concentration (μg/m³)
- ENV_AIR_CO: CO concentration (μg/m³)
- ENV_AIR_QUALITY_BAND: Air quality band (Green/Amber/Red)
JSON Template Structure
{
"template_id": "ENV_AIR_EMISSIONS_QUARTERLY_V1",
"template_name": "Environmental Air Emissions Monitoring (G.5)",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "site", "monitoring_area"],
"is_mandatory": true,
"submission_type": "DIMENSIONAL_METRIC",
"fields": [
{
"field_name": "monitoring_area_id",
"field_label": "Monitoring Area",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"reference_table": "air_monitoring_areas",
"tenant_scoped": true,
"site_scoped": true,
"error_message": "Select a valid monitoring area for this site"
},
"help_text": "Select the air quality monitoring area (e.g., Processing Plant, Mine Site Boundary, Residential Area)",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Quarter End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_quarter_end": true,
"error_message": "Date must be the last day of the quarter"
},
"help_text": "Enter the last day of the quarter",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "raw_data",
"field_label": "Air Pollutant Concentrations",
"data_type": "JSONB",
"required": true,
"validation_rules": {
"schema": {
"type": "object",
"required": ["pm10", "so2", "no2", "co", "quality_band"],
"properties": {
"pm10": {"type": "number", "minimum": 0},
"so2": {"type": "number", "minimum": 0},
"no2": {"type": "number", "minimum": 0},
"co": {"type": "number", "minimum": 0},
"quality_band": {"type": "string", "enum": ["Green", "Amber", "Red"]}
}
},
"business_rules": [
"All concentrations in μg/m³ (micrograms per cubic metre)",
"Quality band: Green = all pollutants within limits, Amber = 1 pollutant exceeds by ≤20%, Red = ≥2 pollutants exceed or any >20% exceedance"
],
"error_message": "Air pollutant concentrations must be valid measurements with quality band"
},
"help_text": "Enter quarterly air pollutant concentrations from monitoring equipment. All values in μg/m³.",
"ui_hint": "DIMENSIONAL_FORM"
}
],
"evidence_requirements": {
"min_items": 0,
"allowed_types": ["EMISSIONS_MONITORING_REPORT", "AIR_QUALITY_REPORT", "LAB_ANALYSIS_REPORT"],
"help_text": "Attach emissions monitoring reports or air quality reports (recommended)"
}
}
Monthly Waste Generation (G.6-G.7)
Template ID: ENV_WASTE_MONTHLY_V1
Collection Frequency: Monthly
Dimensionality: Site
Metrics Included:
- Non-Mineralised Waste: ENV_WASTE_NON_MIN_GENERAL, ENV_WASTE_NON_MIN_RECYCLABLE_METAL, ENV_WASTE_NON_MIN_RECYCLABLE_PLASTIC, ENV_WASTE_NON_MIN_HAZARDOUS, ENV_WASTE_NON_MIN_CONTAMINATED_SOIL
- Mineralised Waste: ENV_WASTE_MIN_WASTE_ROCK, ENV_WASTE_MIN_TAILINGS
JSON Template Structure
{
"template_id": "ENV_WASTE_MONTHLY_V1",
"template_name": "Environmental Waste Generation (G.6-G.7)",
"template_version": 1,
"collection_frequency": "MONTHLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "SIMPLE_METRIC",
"fields": [
{
"field_name": "metric_id",
"field_label": "Waste Type",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"ENV_WASTE_NON_MIN_GENERAL",
"ENV_WASTE_NON_MIN_RECYCLABLE_METAL",
"ENV_WASTE_NON_MIN_RECYCLABLE_PLASTIC",
"ENV_WASTE_NON_MIN_HAZARDOUS",
"ENV_WASTE_NON_MIN_CONTAMINATED_SOIL",
"ENV_WASTE_MIN_WASTE_ROCK",
"ENV_WASTE_MIN_TAILINGS"
],
"error_message": "Select a valid waste metric"
},
"help_text": "Select the waste type generated",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Month End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_month_end": true,
"error_message": "Date must be the last day of the month"
},
"help_text": "Enter the last day of the month",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "value",
"field_label": "Waste Quantity",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Value must be a non-negative number with up to 2 decimal places"
},
"help_text": "Enter monthly waste generation in tonnes",
"ui_hint": "NUMBER_INPUT"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"metric_id = ENV_WASTE_NON_MIN_HAZARDOUS: WASTE_MANIFEST, HAZMAT_DISPOSAL_CERTIFICATE required"
],
"RECOMMENDED_FOR_ALL": ["WASTE_MANIFEST", "WASTE_DISPOSAL_RECORD", "WASTE_LOG", "WEIGHBRIDGE_TICKET"]
},
"allowed_types": ["WASTE_MANIFEST", "WASTE_DISPOSAL_RECORD", "WASTE_LOG", "WEIGHBRIDGE_TICKET", "HAZMAT_DISPOSAL_CERTIFICATE", "RECYCLING_RECEIPT", "SOIL_ANALYSIS_REPORT", "WASTE_DUMP_SURVEY", "HAUL_TRUCK_LOG"],
"help_text": "Attach waste manifests, disposal records, or weighbridge tickets. Evidence is MANDATORY for hazardous waste."
}
}
Monthly TSF Management (G.8)
Template ID: ENV_TSF_MONTHLY_V1
Collection Frequency: Monthly
Dimensionality: Site
Metrics Included:
- ENV_TSF_SLURRY_DENSITY: Slurry density (g/cm³)
- ENV_TSF_FREEBOARD: Freeboard (m, MANDATORY evidence if <1.5 m)
- ENV_TSF_SURFACE_AREA: TSF pond surface area (ha)
- ENV_TSF_RATE_OF_RISE: Embankment rate of rise (m/month)
JSON Template Structure
{
"template_id": "ENV_TSF_MONTHLY_V1",
"template_name": "Environmental TSF Management (G.8)",
"template_version": 1,
"collection_frequency": "MONTHLY",
"dimensionality": ["organisation", "site"],
"is_mandatory": true,
"submission_type": "SIMPLE_METRIC",
"fields": [
{
"field_name": "metric_id",
"field_label": "TSF Metric",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"ENV_TSF_SLURRY_DENSITY",
"ENV_TSF_FREEBOARD",
"ENV_TSF_SURFACE_AREA",
"ENV_TSF_RATE_OF_RISE"
],
"error_message": "Select a valid TSF management metric"
},
"help_text": "Select the TSF parameter to submit",
"ui_hint": "DROPDOWN"
},
{
"field_name": "activity_date",
"field_label": "Month End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"must_be_month_end": true,
"error_message": "Date must be the last day of the month"
},
"help_text": "Enter the last day of the month",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "value",
"field_label": "Measurement Value",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"metric_specific_rules": {
"ENV_TSF_SLURRY_DENSITY": {"minimum": 1.0, "maximum": 2.0},
"ENV_TSF_FREEBOARD": {"minimum": 0, "critical_threshold": 1.5},
"ENV_TSF_SURFACE_AREA": {"minimum": 0},
"ENV_TSF_RATE_OF_RISE": {"minimum": 0, "warning_threshold": 1.0}
},
"error_message": "Value must be within valid range for the selected TSF metric"
},
"help_text": "Enter TSF measurement (g/cm³ for density, m for freeboard/rate, ha for area)",
"ui_hint": "NUMBER_INPUT"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"metric_id = ENV_TSF_FREEBOARD: TSF_INSPECTION_REPORT, SURVEY_REPORT required (critical safety parameter)"
],
"RECOMMENDED_FOR_ALL": ["TSF_INSPECTION_REPORT", "SLURRY_DENSITY_LOG", "SLURRY_FLOW_LOG", "SURVEY_REPORT", "AERIAL_SURVEY"]
},
"allowed_types": ["TSF_INSPECTION_REPORT", "SLURRY_DENSITY_LOG", "SLURRY_FLOW_LOG", "SURVEY_REPORT", "AERIAL_SURVEY"],
"help_text": "Attach TSF inspection reports and survey reports. Evidence is MANDATORY for freeboard measurements (critical safety parameter)."
}
}
Quarterly Rehabilitation Activities (G.9)
Template ID: ENV_REHAB_QUARTERLY_V1
Collection Frequency: Quarterly
Dimensionality: Organisation, Site (optional), Project
Record Entity: environmental_activities (log-based collection)
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
date_started |
Date (ISO 8601) | Yes | Must be within or before reporting period | 2025-01-15 |
activity_description |
Text (2000 chars) | Yes | Non-empty | "Topsoiling and revegetation of abandoned waste dump area" |
cost |
Number | Yes | Non-negative, 2 decimal places | 125000.00 |
status |
Enum | Yes | Planned, WIP, Completed, On Hold | WIP |
status_date |
Date (ISO 8601) | Yes | Must be >= date_started | 2025-03-31 |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
site_id |
UUID | No | If provided, must exist and match organisation | site-uuid |
JSON Template Structure
{
"template_id": "ENV_REHAB_QUARTERLY_V1",
"template_name": "Environmental Rehabilitation Activities (G.9)",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "reporting_period", "site"],
"is_mandatory": true,
"submission_type": "LOG",
"fields": [
{
"field_name": "date_started",
"field_label": "Date Started",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"max_date_rule": "TODAY",
"error_message": "Date started cannot be in the future"
},
"help_text": "Enter the date when rehabilitation activity commenced",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "activity_description",
"field_label": "Activity Description",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 2000,
"min_length": 10,
"error_message": "Describe the rehabilitation activity"
},
"help_text": "Provide a description of the rehabilitation work (e.g., topsoiling, revegetation, contouring, erosion control)",
"ui_hint": "TEXTAREA"
},
{
"field_name": "cost",
"field_label": "Activity Cost",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Cost must be a non-negative number"
},
"help_text": "Enter the cost of rehabilitation activity in local currency",
"ui_hint": "NUMBER_INPUT"
},
{
"field_name": "status",
"field_label": "Status",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": ["Planned", "WIP", "Completed", "On Hold"],
"error_message": "Select a valid status"
},
"help_text": "Select the current status of this rehabilitation activity",
"ui_hint": "DROPDOWN"
},
{
"field_name": "status_date",
"field_label": "Status Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "FIELD:date_started",
"error_message": "Status date must be on or after date started"
},
"help_text": "Enter the target completion date (Planned/WIP) or actual completion date (Completed)",
"ui_hint": "DATE_PICKER"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"status = Completed: REHAB_COMPLETION_REPORT, PHOTOGRAPHIC_EVIDENCE required"
],
"RECOMMENDED_FOR_ALL": ["PROJECT_LOG", "PHOTOGRAPHIC_EVIDENCE", "SURVEY_REPORT"]
},
"allowed_types": ["REHAB_COMPLETION_REPORT", "PROJECT_LOG", "PHOTOGRAPHIC_EVIDENCE", "SURVEY_REPORT", "INVOICE", "CONTRACTOR_REPORT"],
"help_text": "Attach rehabilitation completion reports and photographic evidence. Evidence is MANDATORY when status is Completed."
}
}
Example Submission Payload
{
"submission_uuid": "env-rehab-q1-2025-uuid",
"reporting_period_id": "period-uuid-q1-2025",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"date_started": "2025-01-15",
"activity_description": "Topsoiling and revegetation of abandoned waste dump area (3.5 hectares)",
"cost": 125000.00,
"status": "WIP",
"status_date": "2025-03-31",
"metadata": {
"collector_notes": "Q1 2025 rehabilitation progress - 60% complete",
"contractor": "ABC Rehabilitation Services",
"area_hectares": 3.5
}
}
Quarterly Environmental Incidents (G.10)
Template ID: ENV_INCIDENT_QUARTERLY_V1
Collection Frequency: Quarterly
Dimensionality: Organisation, Site (optional)
Record Entity: environmental_incidents (log-based collection, CONFIDENTIAL)
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
incident_number |
String (50 chars) | Yes | Unique identifier | ENV-2025-001 |
incident_date |
Date (ISO 8601) | Yes | Must be within reporting period | 2025-02-15 |
description |
Text (5000 chars) | Yes | Non-empty | "Diesel spill from refueling operations (approx. 200L)" |
severity |
Enum | Yes | Low, Medium, High, Critical | Medium |
actions_taken |
Text (5000 chars) | Yes | Non-empty | "Spill contained with absorbent pads, contaminated soil removed to hazardous waste area" |
status |
Enum | Yes | Open, WIP, Closed | Closed |
closure_date |
Date (ISO 8601) | Conditional | Required if status = Closed | 2025-02-20 |
organisation_id |
UUID | Yes | Must exist and match tenant | org-uuid |
site_id |
UUID | No | If provided, must exist and match organisation | site-uuid |
JSON Template Structure
{
"template_id": "ENV_INCIDENT_QUARTERLY_V1",
"template_name": "Environmental Incidents (G.10)",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "reporting_period", "site"],
"is_mandatory": true,
"submission_type": "LOG",
"confidentiality": "CONFIDENTIAL",
"fields": [
{
"field_name": "incident_number",
"field_label": "Incident Number",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 50,
"min_length": 3,
"pattern": "^[A-Z0-9-]+$",
"error_message": "Provide a unique incident number (e.g., ENV-2025-001)"
},
"help_text": "Enter the unique incident tracking number",
"ui_hint": "TEXT_INPUT"
},
{
"field_name": "incident_date",
"field_label": "Incident Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "REPORTING_PERIOD_START",
"max_date_rule": "TODAY",
"error_message": "Incident date must be within the reporting period and not in the future"
},
"help_text": "Enter the date when the environmental incident occurred",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "description",
"field_label": "Incident Description",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 5000,
"min_length": 20,
"error_message": "Provide a detailed description of the incident"
},
"help_text": "Describe the environmental incident (type, location, estimated impact, materials involved)",
"ui_hint": "TEXTAREA"
},
{
"field_name": "severity",
"field_label": "Severity Level",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": ["Low", "Medium", "High", "Critical"],
"severity_definitions": {
"Low": "Minor, localized, no regulatory notification",
"Medium": "Moderate impact, regulatory notification, no long-term damage",
"High": "Significant impact, regulatory investigation, potential long-term damage",
"Critical": "Major impact, regulatory enforcement, significant damage, community impact"
},
"error_message": "Select incident severity level"
},
"help_text": "Select the severity of the environmental incident",
"ui_hint": "DROPDOWN"
},
{
"field_name": "actions_taken",
"field_label": "Actions Taken",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 5000,
"min_length": 20,
"error_message": "Describe the actions taken to address the incident"
},
"help_text": "Describe immediate response actions, remediation measures, and corrective actions",
"ui_hint": "TEXTAREA"
},
{
"field_name": "status",
"field_label": "Incident Status",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": ["Open", "WIP", "Closed"],
"transition_rules": {
"Open": ["WIP", "Closed"],
"WIP": ["Closed"],
"Closed": []
},
"error_message": "Invalid status transition (Open → WIP → Closed only)"
},
"help_text": "Select the current status of this incident investigation and remediation",
"ui_hint": "DROPDOWN"
},
{
"field_name": "closure_date",
"field_label": "Closure Date",
"data_type": "DATE",
"required": false,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "FIELD:incident_date",
"required_if": "status == 'Closed'",
"error_message": "Closure date is required when status is Closed and must be on or after incident date"
},
"help_text": "Enter the date when incident was fully closed out (required for Closed status)",
"ui_hint": "DATE_PICKER"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"severity = High OR severity = Critical: INCIDENT_REPORT, INVESTIGATION_REPORT required",
"status = Closed AND (severity = High OR severity = Critical): CLOSURE_REPORT, REGULATORY_NOTIFICATION required"
],
"RECOMMENDED_FOR_ALL": ["INCIDENT_REPORT", "PHOTOGRAPHIC_EVIDENCE"]
},
"allowed_types": ["INCIDENT_REPORT", "INVESTIGATION_REPORT", "REGULATORY_NOTIFICATION", "CLOSURE_REPORT", "PHOTOGRAPHIC_EVIDENCE", "REMEDIATION_REPORT", "LAB_ANALYSIS_REPORT"],
"help_text": "Attach incident reports and investigation reports. Evidence is MANDATORY for High/Critical incidents when closed."
}
}
Example Submission Payload
{
"submission_uuid": "env-incident-q1-2025-001-uuid",
"reporting_period_id": "period-uuid-q1-2025",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"incident_number": "ENV-2025-001",
"incident_date": "2025-02-15",
"description": "Diesel spill from refueling operations (approx. 200L). Spill occurred during mobile equipment refueling near workshop area. No discharge to watercourse. Containment bund prevented off-site migration.",
"severity": "Medium",
"actions_taken": "Spill contained immediately with absorbent pads and booms. Contaminated soil excavated (approx. 2 tonnes) and removed to hazardous waste storage area pending disposal. Area rehabilitated with clean fill. Regulatory authority notified within 24 hours. Refueling procedures reviewed and refresher training conducted for operators.",
"status": "Closed",
"closure_date": "2025-02-20",
"metadata": {
"collector_notes": "Diesel spill incident - Q1 2025",
"regulatory_notification_number": "REG-2025-047",
"estimated_volume_litres": 200,
"contaminated_soil_tonnes": 2
}
}
CSV Template Examples for Environmental Data
For collectors preferring CSV/XLSX upload, environmental templates can be provided as structured CSV files. Below are examples aligned to G.1-G.10 sections:
G.1 Production Metrics CSV
Site,Month,Metric,Value,Unit
Site A,2025-01,Crushed Ore,125000.50,tonnes
Site A,2025-01,Milled Ore,118500.00,tonnes
Site A,2025-01,Gold Produced,3250.75,troy ounces
G.2 Materials Consumption CSV
Site,Month,Material,Consumption,Unit
Site A,2025-01,Activated Carbon,2500.00,kg
Site A,2025-01,Cyanide,3500.00,kg
Site A,2025-01,Hydrogen Peroxide,1200.00,L
Site A,2025-01,Caustic Soda,1800.00,kg
Site A,2025-01,Blasting Emulsion,15000.00,kg
Site A,2025-01,Mill Balls,8500.00,kg
G.3 Energy Usage CSV
Site,Month,Energy/Fuel Type,Consumption,Unit
Site A,2025-01,Grid Electricity,450000.00,kWh
Site A,2025-01,Generator Electricity,125000.00,kWh
Site A,2025-01,Diesel (Other),8500.00,L
Site A,2025-01,Diesel (Mining/Drilling),125000.00,L
Site A,2025-01,Diesel (Generators),42000.00,L
Site A,2025-01,Petrol (Other),3500.00,L
G.4 Water Management CSV
Site,Month,Water Category,Metric,Volume,Unit
Site A,2025-01,Abstraction,Fresh Groundwater,125000.00,m³
Site A,2025-01,Abstraction,Fresh Surface Water,85000.00,m³
Site A,2025-01,Abstraction,Low Quality Groundwater,15000.00,m³
Site A,2025-01,Recycled,TSF Return Water,180000.00,m³
Site A,2025-01,Recycled,Other Recycle Streams,35000.00,m³
Site A,2025-01,Consumed,Processing Plant,320000.00,m³
Site A,2025-01,Consumed,Mining Operations,85000.00,m³
Site A,2025-01,Consumed,Potable Water,5000.00,m³
G.4.4 Water Quality Monitoring CSV
Site,Quarter,Sampling Point,pH,Turbidity (NTU),Suspended Solids (mg/L),Cyanide (mg/L),Heavy Metals (mg/L),Quality Band,Non-Compliance Parameters
Site A,Q1 2025,Upstream River,7.5,12.0,35.0,0.01,0.02,Green,
Site A,Q1 2025,Downstream River,7.2,15.5,45.0,0.03,0.08,Green,
Site A,Q1 2025,TSF Seepage Point,8.1,85.0,120.0,0.08,0.15,Amber,Suspended Solids
Site A,Q1 2025,Groundwater Borehole 1,7.0,8.0,25.0,0.01,0.03,Green,
G.5 Air Emissions Monitoring CSV
Site,Quarter,Monitoring Area,PM10 (μg/m³),SO2 (μg/m³),NO2 (μg/m³),CO (μg/m³),Quality Band
Site A,Q1 2025,Processing Plant,45.0,18.0,35.0,850.0,Green
Site A,Q1 2025,Mine Site Boundary,35.0,12.0,28.0,650.0,Green
Site A,Q1 2025,Residential Area,25.0,8.0,22.0,450.0,Green
G.6 Non-Mineralised Waste CSV
Site,Month,Waste Type,Quantity (tonnes),Disposal Method
Site A,2025-01,General Waste,85.5,Landfill
Site A,2025-01,Recyclable Metal,12.3,Recycled
Site A,2025-01,Recyclable Plastic,5.8,Recycled
Site A,2025-01,Hazardous Waste,3.2,Licensed Facility
Site A,2025-01,Contaminated Soil,15.0,Treatment & Disposal
G.7 Mineralised Waste CSV
Site,Month,Waste Type,Quantity (tonnes)
Site A,2025-01,Waste Rock,425000.00
Site A,2025-01,Tailings,118500.00
G.8 TSF Management CSV
Site,Month,Metric,Value,Unit
Site A,2025-01,Slurry Density,1.45,g/cm³
Site A,2025-01,Freeboard,2.8,m
Site A,2025-01,Surface Area,12.5,ha
Site A,2025-01,Rate of Rise,0.35,m/month
G.9 Rehabilitation Activities CSV
Site,Quarter,Date Started,Activity Description,Cost,Status,Status Date
Site A,Q1 2025,2025-01-15,"Topsoiling and revegetation of abandoned waste dump area (3.5 hectares)",125000.00,WIP,2025-03-31
Site A,Q1 2025,2024-11-01,"Contouring and erosion control of pit floor area",85000.00,Completed,2025-02-28
G.10 Environmental Incidents CSV
Site,Quarter,Incident Number,Incident Date,Description,Severity,Actions Taken,Status,Closure Date
Site A,Q1 2025,ENV-2025-001,2025-02-15,"Diesel spill from refueling operations (approx. 200L)",Medium,"Spill contained immediately with absorbent pads and booms. Contaminated soil excavated (approx. 2 tonnes) and removed to hazardous waste storage area pending disposal. Area rehabilitated with clean fill. Regulatory authority notified within 24 hours. Refueling procedures reviewed and refresher training conducted for operators.",Closed,2025-02-20
XLSX Multi-Sheet Template Structure
For comprehensive monthly/quarterly environmental data submission, an XLSX workbook can be provided with the following sheet structure:
Monthly Submission (9 sheets): 1. G.1_Production: Crushed ore, milled ore, gold produced 2. G.2_Materials: All consumables (activated carbon, cyanide, hydrogen peroxide, caustic soda, blasting emulsion, mill balls) 3. G.3_Energy: Electricity (grid, generator) and fuel (diesel by use, petrol) 4. G.4_Water_Volumes: Abstraction, recycled, consumed by category 5. G.6_Non_Min_Waste: General, recyclable, hazardous, contaminated soil 6. G.7_Min_Waste: Waste rock, tailings 7. G.8_TSF: Slurry density, freeboard, surface area, rate of rise 8. Instructions: Submission guidance and data definitions 9. Master_Data: Dropdown lists for sampling points, monitoring areas, waste types, disposal methods
Quarterly Submission (5 sheets): 1. G.4.4_Water_Quality: Water quality by sampling point (pH, turbidity, suspended solids, cyanide, heavy metals, quality band) 2. G.5_Air_Emissions: Air pollutants by monitoring area (PM10, SO2, NO2, CO, quality band) 3. G.9_Rehabilitation: Rehabilitation activities log (date started, description, cost, status, status date) 4. G.10_Incidents: Environmental incidents log (incident number, date, description, severity, actions, status, closure date) 5. Instructions: Submission guidance and data definitions
Template Features: - Data validation dropdowns for categorical fields (waste types, disposal methods, quality bands, severity levels) - Conditional formatting for out-of-range values (freeboard <1.5 m, quality band = Red, severity = High/Critical) - Formula-based validation (e.g., crushed ore >= milled ore, quality band calculation from parameter exceedances) - Protected cells for metadata (site name, reporting period, organization) - Help text and field descriptions in cell comments - Auto-calculation of intensity metrics (materials/energy/water/waste per tonne crushed ore)
Community Investment & Development Templates
Community Investment metrics use a log-based collection model where collectors submit activity rows that can be specific dates or date ranges (e.g., quarterly projects). This supports GRI 203 reporting.
Collection Model for Community Investment
- Quarterly collection: Activities tracked throughout the quarter
- Log-based: Each activity or donation is a separate record
- Date ranges: Supports single-day activities or multi-month initiatives (e.g., "July - September")
- Currency: Captures original currency of expenditure
- Evidence requirements: Financial evidence mandatory for actual spend; non-financial evidence recommended for outcomes
Community Investment Log Template (H.1)
Template ID: COMMUNITY_INVESTMENT_LOG_V1
Collection Frequency: Quarterly
Dimensionality: Organisation, Reporting Period, Site (optional)
Record Entity: community_investment_activities
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
start_date |
Date (ISO 8601) | Yes | Must be within or before reporting period | 2025-07-01 |
end_date |
Date (ISO 8601) | Yes | Must be >= start_date | 2025-09-30 |
description |
Text (2000 chars) | Yes | Non-empty | "Fuel Donations for Government Stakeholders" |
pillar |
Enum | Yes | Valid pillar category | Donations & Sponsorship |
budget_amount |
Number | No | Non-negative, 2 decimal places (default 0) | 24300.00 |
actual_amount |
Number | Yes | Non-negative, 2 decimal places | 4518.47 |
variance |
Number | No | Calculated as Actual - Budget | -19781.53 |
currency_code |
String (3 chars) | Yes | Valid ISO 4217 currency code | ZWD |
beneficiaries |
Text (1000 chars) | Yes | Non-empty description of stakeholders | "Government Stakeholders" |
comments |
Text (2000 chars) | No | Optional notes | "Enabled Eureka Gold Mine events" |
JSON Template Structure
{
"template_id": "COMMUNITY_INVESTMENT_LOG_V1",
"template_name": "Community Investment Log (H.1)",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "reporting_period", "site"],
"is_mandatory": true,
"submission_type": "LOG",
"fields": [
{
"field_name": "start_date",
"field_label": "Start Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"max_date_rule": "TODAY",
"error_message": "Start date cannot be in the future"
},
"help_text": "Enter the date the activity started (or single date if one-off)",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "end_date",
"field_label": "End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "FIELD:start_date",
"error_message": "End date must be on or after start date"
},
"help_text": "Enter the date the activity ended (same as start date for one-off events)",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "description",
"field_label": "Description of Initiative",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 2000,
"min_length": 5,
"error_message": "Provide a valid description of the initiative"
},
"help_text": "Describe the CSR/CSIR activity or donation",
"ui_hint": "TEXTAREA"
},
{
"field_name": "pillar",
"field_label": "Investment Pillar",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"Education & Sports",
"Social Empowerment",
"Community Development",
"Donations & Sponsorship",
"Other"
],
"error_message": "Select a valid investment pillar"
},
"help_text": "Select the category for this investment",
"ui_hint": "DROPDOWN"
},
{
"field_name": "currency_code",
"field_label": "Currency",
"data_type": "TEXT", // or ENUM if strict list
"required": true,
"validation_rules": {
"pattern": "^[A-Z]{3}$",
"error_message": "Enter a valid 3-letter ISO currency code (e.g., USD, ZWD)"
},
"help_text": "Currency used for the budget and actual amounts",
"ui_hint": "TEXT_INPUT" // or CURRENCY_PICKER
},
{
"field_name": "budget_amount",
"field_label": "Budget Amount",
"data_type": "NUMBER",
"required": false,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Budget must be a non-negative number"
},
"help_text": "Enter the budgeted amount (optional)",
"ui_hint": "CURRENCY_INPUT"
},
{
"field_name": "actual_amount",
"field_label": "Actual Investment",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Actual investment must be a non-negative number"
},
"help_text": "Enter the actual amount spent",
"ui_hint": "CURRENCY_INPUT"
},
{
"field_name": "beneficiaries",
"field_label": "Stakeholders Affected",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 1000,
"min_length": 2,
"pii_check": true,
"error_message": "Describe the beneficiaries (groups/orgs, not individuals)"
},
"help_text": "Identify the stakeholders or beneficiaries (e.g., 'Muroiwa Primary School', 'Local Farmers')",
"ui_hint": "TEXTAREA"
},
{
"field_name": "comments",
"field_label": "Comments",
"data_type": "TEXT",
"required": false,
"validation_rules": {
"max_length": 2000,
"error_message": "Comments too long"
},
"help_text": "Any additional notes or justification",
"ui_hint": "TEXTAREA"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"actual_amount > 0: INVOICE, RECEIPT, PROOF_OF_PAYMENT required"
],
"RECOMMENDED_FOR_ALL": ["ACKNOWLEDGEMENT_LETTER", "PHOTO", "MOU", "FUEL_LOG"]
},
"allowed_types": [
"INVOICE",
"RECEIPT",
"PROOF_OF_PAYMENT",
"FUEL_LOG",
"ACKNOWLEDGEMENT_LETTER",
"PHOTO",
"MOU",
"AGREEMENT",
"EVENT_REPORT"
],
"help_text": "Attach financial evidence (invoices, receipts) for spend and non-financial evidence (letters, photos) for verification."
}
}
Validation Rules
Schema Validation
All templates enforce the following schema-level validations:
| Rule Type | Description | Applied To |
|---|---|---|
| Required fields | Non-null, non-empty values | All required fields |
| Data type | Correct type (string, date, enum, array) | All fields |
| String length | Min/max character limits | Text fields |
| Date format | ISO 8601 (YYYY-MM-DD) | Date fields |
| Enum values | Value in allowed list | Enum fields |
| Reference integrity | Foreign keys exist in master tables | Category/platform IDs |
Domain Validation
Domain-specific rules enforced at submission time:
Stakeholder Engagement Log
| Rule | Validation Logic | Error Message |
|---|---|---|
| Date within period | initial_date >= reporting_period.start_date AND initial_date <= reporting_period.end_date |
"Engagement date must be within the reporting period" |
| Date not future | initial_date <= CURRENT_DATE |
"Engagement date cannot be in the future" |
| Status date ordering | status_date >= initial_date |
"Status date must be on or after initial date" |
| Category required | stakeholder_category_ids.length > 0 |
"At least one stakeholder category must be selected" |
| Outcome required if closed | IF status = 'Closed' THEN outcome IS NOT NULL AND outcome.length >= 10 |
"Outcome is required when status is Closed" |
| Status transitions | IF old_status = 'Closed' THEN new_status = 'Closed' (immutable) |
"Cannot change status from Closed" |
Grievance Log
| Rule | Validation Logic | Error Message |
|---|---|---|
| Date within period | date_reported >= reporting_period.start_date AND date_reported <= reporting_period.end_date |
"Grievance date must be within the reporting period" |
| Date not future | date_reported <= CURRENT_DATE |
"Grievance date cannot be in the future" |
| PII protection | stakeholder_group DOES NOT CONTAIN personal identifiers (pattern check) |
"Use general group names, not individual names" |
| Source type | source_type IN ('Internal', 'External') |
"Source type must be Internal or External" |
| Resolution status | resolution_status IN ('RESOLVED', 'OUTSTANDING') |
"Resolution status must be RESOLVED or OUTSTANDING" |
GRI 405-1 Employee Demographics
| Rule | Validation Logic | Error Message |
|---|---|---|
| Gender totals | male_count + female_count = total_headcount |
"Male and female counts must sum to total headcount" |
| Local community limit | local_community_count <= total_headcount |
"Local community count cannot exceed total headcount" |
| Non-negative values | total_headcount >= 0 AND male_count >= 0 AND female_count >= 0 AND local_community_count >= 0 |
"All counts must be non-negative" |
| Quarter end date | activity_date IN (Mar 31, Jun 30, Sep 30, Dec 31) |
"Date must be the last day of a quarter" |
| Site requirement | IF metric_id IN ('GRI_405_1_SALARIED_NON_NEC_HEADCOUNT', 'GRI_405_1_WAGED_NEC_HEADCOUNT') THEN site_id IS NOT NULL |
"Site ID is required for Salaried and Waged metrics" |
| Organisation-only | IF metric_id = 'GRI_405_1_EXECUTIVE_HEADCOUNT' THEN site_id IS NULL |
"Executive metric must be organisation-level only" |
GRI 401 Employment Type and Turnover
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative value | value >= 0 |
"Value must be non-negative" |
| Integer value | value IS INTEGER |
"Value must be a whole number" |
| Month end date | activity_date = LAST_DAY_OF_MONTH |
"Date must be the last day of the month" |
| Reasonable range | IF metric_id LIKE '%DEPARTURES%' THEN value <= (permanent_headcount * 0.5) |
"Departures unusually high (>50% of headcount)" |
Employee Age Demographics
| Rule | Validation Logic | Error Message |
|---|---|---|
| Age group totals | under_30 + aged_30_50 + over_50 = total |
"Age group counts must sum to total" |
| Non-negative values | under_30 >= 0 AND aged_30_50 >= 0 AND over_50 >= 0 AND total >= 0 |
"All counts must be non-negative" |
| Month end date | activity_date = LAST_DAY_OF_MONTH |
"Date must be the last day of the month" |
OHS Quarterly Incident Statistics (F.1)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative counts | All incident counts >= 0 |
"Incident counts must be non-negative integers" |
| Quarter end date | activity_date IN (Mar 31, Jun 30, Sep 30, Dec 31) |
"Date must be the last day of a quarter" |
| Zero values allowed | count = 0 is valid (do not use NULL or blank) |
"Use 0 for no-incident quarters, not null or blank" |
| Fatality evidence | IF fatality.mine > 0 OR fatality.contractors > 0 THEN evidence_count >= 1 AND evidence_types INCLUDE ('FATALITY_REPORT', 'INVESTIGATION_REPORT') |
"Fatality incidents require mandatory evidence (fatality report and investigation report)" |
| LTI evidence | IF lti.mine > 0 OR lti.contractors > 0 THEN evidence_count >= 1 AND evidence_types INCLUDE ('LTI_REGISTER', 'ACCIDENT_REPORT') |
"LTI incidents require mandatory evidence (LTI register or accident report)" |
| High potential evidence | IF high_potential.mine > 0 OR high_potential.contractors > 0 THEN evidence_count >= 1 AND evidence_types INCLUDE ('INCIDENT_REGISTER', 'INVESTIGATION_REPORT') |
"High potential incidents require mandatory evidence" |
| Occupational disease evidence | IF silicosis_pneumoconiosis.mine > 0 OR silicosis_pneumoconiosis.contractors > 0 THEN evidence_count >= 1 AND evidence_types INCLUDE ('OCCUPATIONAL_DISEASE_REGISTER', 'MEDICAL_TREATMENT_RECORD') |
"Occupational disease cases require mandatory evidence" |
OHS LTI Days and LTIFR (F.2)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative LTI days | lti_days.mine >= 0 AND lti_days.contractors >= 0 |
"LTI days must be non-negative integers" |
| Non-negative hours worked | hours_worked.mine >= 0 AND hours_worked.contractors >= 0 |
"Hours worked must be non-negative" |
| Non-negative LTIFR | ltifr.mine >= 0 AND ltifr.contractors >= 0 |
"LTIFR must be non-negative" |
| LTIFR precision | LTIFR has maximum 2 decimal places |
"LTIFR must be formatted to 2 decimal places" |
| LTIFR calculation | LTIFR = (LTI_count × 1,000,000) / hours_worked |
"LTIFR calculation must follow standard formula" |
| Zero LTI consistency | IF LTI_count_from_F1 = 0 THEN lti_days = 0 AND ltifr = 0.00 |
"If no LTI incidents in F.1, LTI days and LTIFR must be 0" |
| Positive LTI days consistency | IF lti_days > 0 THEN LTI_count_from_F1 > 0 |
"If LTI days > 0, corresponding LTI count in F.1 must be > 0" |
| Cross-validation F.1 to F.2 | LTI_count_from_F1 = LTI_count_used_in_LTIFR_calculation |
"LTI count from F.1 must match LTI count used in LTIFR calculation" |
| Quarter end date | activity_date IN (Mar 31, Jun 30, Sep 30, Dec 31) |
"Date must be the last day of a quarter" |
| Mandatory evidence | evidence_count >= 1 AND evidence_types INCLUDE ('LTI_REGISTER', 'TIME_SHEET', 'PAYROLL_REPORT', 'HR_REGISTER') |
"LTI performance metrics require mandatory evidence showing hours worked and LTI days" |
Environmental Production (G.1)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative production | value >= 0 |
"Production value must be non-negative" |
| Precision | value has maximum 2 decimal places |
"Production value must have at most 2 decimal places" |
| Milled ore ratio | milled_ore <= crushed_ore × 1.1 |
"Milled ore exceeds crushed ore by more than 10%. Check for data entry errors or timing differences." |
| Month end date | activity_date = LAST_DAY_OF_MONTH |
"Date must be the last day of the month" |
| Site requirement | site_id IS NOT NULL |
"Production metrics require site ID (site-level collection)" |
Environmental Materials Consumption (G.2)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative materials | value >= 0 |
"Materials consumption must be non-negative" |
| Precision | value has maximum 2 decimal places |
"Materials consumption must have at most 2 decimal places" |
| Cyanide evidence | IF metric_id = 'ENV_MATERIAL_CYANIDE' THEN evidence_count >= 1 AND evidence_types INCLUDE ('INVOICE', 'STOCK_CARD', 'MATERIALS_REGISTER', 'HAZMAT_REGISTER') |
"Cyanide consumption requires MANDATORY evidence (INVOICE, STOCK_CARD, MATERIALS_REGISTER, or HAZMAT_REGISTER)" |
| Month end date | activity_date = LAST_DAY_OF_MONTH |
"Date must be the last day of the month" |
Environmental Energy and Fuel (G.3)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative energy | value >= 0 |
"Energy/fuel consumption must be non-negative" |
| Precision | value has maximum 2 decimal places |
"Energy/fuel consumption must have at most 2 decimal places" |
| Generator consistency | IF generator_electricity > 0 THEN diesel_generators > 0 AND IF diesel_generators > 0 THEN generator_electricity > 0 |
"Generator electricity and diesel for generators must both be greater than zero" |
| Generator consumption rate | consumption_rate = diesel_generators / generator_electricity WHERE 0.2 <= consumption_rate <= 0.5 |
"Generator consumption rate outside typical range (0.2-0.5 L/kWh). Check for measurement errors or inefficient generators." |
| Month end date | activity_date = LAST_DAY_OF_MONTH |
"Date must be the last day of the month" |
Environmental Water Volumes (G.4)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative water | value >= 0 |
"Water volume must be non-negative" |
| Precision | value has maximum 2 decimal places |
"Water volume must have at most 2 decimal places" |
| Water balance | ABS((abstracted + recycled) - consumed) / (abstracted + recycled) <= 0.20 |
"Water balance variance exceeds 20%. Check for measurement errors or unaccounted losses." |
| Month end date | activity_date = LAST_DAY_OF_MONTH |
"Date must be the last day of the month" |
Environmental Water Quality (G.4.4)
| Rule | Validation Logic | Error Message |
|---|---|---|
| pH range | 0 <= pH <= 14 |
"pH must be between 0 and 14" |
| pH precision | pH has maximum 1 decimal place |
"pH must have at most 1 decimal place" |
| Non-negative concentrations | turbidity >= 0 AND suspended_solids >= 0 AND cyanide >= 0 AND heavy_metals >= 0 |
"Concentrations must be non-negative" |
| Concentration precision | cyanide and heavy_metals have maximum 3 decimal places, turbidity and suspended_solids have maximum 1 decimal place |
"Concentrations must have correct precision" |
| Quality band | quality_band IN ('Green', 'Amber', 'Red') |
"Quality band must be Green, Amber, or Red" |
| Quality band logic | Green: all params within limits; Amber: 1-2 params exceed by ≤20%; Red: ≥3 params exceed OR any param exceeds by >20% |
"Quality band calculation failed" |
| Cyanide evidence | evidence_count >= 1 AND evidence_types INCLUDE ('LAB_TEST_REPORT') |
"Cyanide measurement requires MANDATORY evidence (LAB_TEST_REPORT from accredited laboratory)" |
| Heavy metals evidence | evidence_count >= 1 AND evidence_types INCLUDE ('LAB_TEST_REPORT') |
"Heavy metals measurement requires MANDATORY evidence (LAB_TEST_REPORT from accredited laboratory)" |
| Quarter end date | activity_date IN (Mar 31, Jun 30, Sep 30, Dec 31) |
"Date must be the last day of a quarter" |
Environmental Air Emissions (G.5)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative pollutants | PM10 >= 0 AND SO2 >= 0 AND NO2 >= 0 AND CO >= 0 |
"Pollutant concentrations must be non-negative" |
| Precision | All pollutants have maximum 1 decimal place |
"Pollutant concentrations must have at most 1 decimal place" |
| Air quality band | air_quality_band IN ('Green', 'Amber', 'Red') |
"Air quality band must be Green, Amber, or Red" |
| Air quality band logic | Green: all pollutants within limits; Amber: 1 pollutant exceeds by ≤20%; Red: ≥2 pollutants exceed OR any pollutant exceeds by >20% |
"Air quality band calculation failed" |
| Quarter end date | activity_date IN (Mar 31, Jun 30, Sep 30, Dec 31) |
"Date must be the last day of a quarter" |
Environmental Waste (G.6-G.7)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Non-negative waste | value >= 0 |
"Waste generation must be non-negative" |
| Precision | value has maximum 2 decimal places |
"Waste generation must have at most 2 decimal places" |
| Tailings ratio | tailings <= milled_ore × 1.1 |
"Tailings exceeds milled ore by more than 10%. Check for data entry errors or process water content." |
| Hazardous waste evidence | IF metric_id = 'ENV_WASTE_NON_MIN_HAZARDOUS' THEN evidence_count >= 1 AND evidence_types INCLUDE ('WASTE_MANIFEST', 'HAZMAT_DISPOSAL_CERTIFICATE') |
"Hazardous waste requires MANDATORY evidence (WASTE_MANIFEST or HAZMAT_DISPOSAL_CERTIFICATE)" |
| Month end date | activity_date = LAST_DAY_OF_MONTH |
"Date must be the last day of the month" |
Environmental TSF Management (G.8)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Slurry density range | 1.0 <= slurry_density <= 2.0 |
"Slurry density must be between 1.0 and 2.0 g/cm³" |
| Slurry density warning | IF slurry_density < 1.5 THEN WARNING |
"WARNING: Slurry density below typical range (1.3-1.8 g/cm³), indicating high water content" |
| Freeboard minimum | freeboard >= 0 |
"Freeboard must be non-negative" |
| Freeboard critical | IF freeboard < 1.5 THEN CRITICAL AND evidence_count >= 1 AND evidence_types INCLUDE ('TSF_INSPECTION_REPORT', 'SURVEY_REPORT') |
"CRITICAL: Freeboard below regulatory minimum (1.5 m). MANDATORY evidence required. Immediate action required to ensure TSF safety." |
| Surface area non-negative | surface_area >= 0 |
"Surface area must be non-negative" |
| Rate of rise warning | IF rate_of_rise > 1.0 THEN WARNING |
"WARNING: Rate of rise exceeds typical range (0.2-0.5 m/month), indicating rapid embankment construction" |
| Precision | All values have maximum 2 decimal places |
"TSF values must have at most 2 decimal places" |
| Month end date | activity_date = LAST_DAY_OF_MONTH |
"Date must be the last day of the month" |
Environmental Rehabilitation (G.9)
| Rule | Validation Logic | Error Message |
|---|---|---|
| Status values | status IN ('Planned', 'WIP', 'Completed', 'On Hold') |
"Rehabilitation status must be Planned, WIP, Completed, or On Hold" |
| Status date ordering | status_date >= date_started |
"Rehabilitation status date must be on or after date started" |
| Cost non-negative | cost >= 0 |
"Rehabilitation cost must be non-negative" |
| Completed evidence | IF status = 'Completed' THEN evidence_count >= 1 AND evidence_types INCLUDE ('REHAB_COMPLETION_REPORT', 'PHOTOGRAPHIC_EVIDENCE') |
"Completed rehabilitation requires MANDATORY evidence (REHAB_COMPLETION_REPORT or PHOTOGRAPHIC_EVIDENCE)" |
| Quarter end date | activity_date IN (Mar 31, Jun 30, Sep 30, Dec 31) |
"Date must be the last day of a quarter" |
Environmental Incidents (G.10) - CONFIDENTIAL
| Rule | Validation Logic | Error Message |
|---|---|---|
| Severity values | severity IN ('Low', 'Medium', 'High', 'Critical') |
"Incident severity must be Low, Medium, High, or Critical" |
| Status values | status IN ('Open', 'WIP', 'Closed') |
"Incident status must be Open, WIP, or Closed" |
| Closure date ordering | IF closure_date IS NOT NULL THEN closure_date >= incident_date |
"Incident closure date must be on or after incident date" |
| Closure date required | IF status = 'Closed' THEN closure_date IS NOT NULL |
"Incident closure date is required when status is Closed" |
| High/Critical evidence | IF (severity = 'High' OR severity = 'Critical') AND status = 'Closed' THEN evidence_count >= 1 AND evidence_types INCLUDE ('INCIDENT_REPORT', 'INVESTIGATION_REPORT', 'CLOSURE_REPORT') |
"Closed High/Critical incidents require MANDATORY evidence (INCIDENT_REPORT, INVESTIGATION_REPORT, or CLOSURE_REPORT)" |
| Confidentiality | All environmental incident data is CONFIDENTIAL |
"Environmental incidents have regulatory and reputational sensitivity" |
| Quarter end date | activity_date IN (Mar 31, Jun 30, Sep 30, Dec 31) |
"Date must be the last day of a quarter" |
Evidence Validation
| Rule | Applied To | Validation |
|---|---|---|
| Minimum evidence | Stakeholder Engagement | At least 1 evidence item required |
| File type | All | MIME type matches allowed_types list |
| File size | All | Max 50MB per file, 200MB total per submission |
| Integrity check | All | SHA-256 hash calculated and stored |
Evidence Requirements
Stakeholder Engagement Evidence
Required: Minimum 1 evidence item per engagement
Allowed Evidence Types:
| Evidence Type | Description | File Formats | Example |
|---|---|---|---|
| MEETING_MINUTES | Minutes or notes from engagement meetings | PDF, DOCX, TXT | Board meeting minutes, stakeholder meeting notes |
| ATTENDANCE_REGISTER | Sign-in sheets or attendance lists | PDF, XLSX, JPG | Participant attendance sheets |
| LETTER | Official correspondence | PDF, DOCX, JPG | Letters from stakeholders, responses to community |
| Email correspondence | PDF, EML, MSG | Email threads with stakeholders | |
| AGREEMENT | Signed agreements or MOUs | Memoranda of Understanding, community agreements | |
| PHOTO | Photos from engagement events | JPG, PNG | Community meeting photos, site visit photos |
| OTHER | Other supporting documents | PDF, DOCX, XLSX, JPG, PNG | Any other relevant documentation |
Grievance Evidence
Required: Minimum 0 evidence items (optional but recommended)
Allowed Evidence Types:
| Evidence Type | Description | File Formats | Example |
|---|---|---|---|
| GRIEVANCE_FORM | Formal grievance submission form | PDF, DOCX | Completed grievance intake form |
| LETTER | Written grievance or complaint | PDF, DOCX, JPG | Complaint letter from stakeholder |
| Email grievance submissions | PDF, EML, MSG | Email complaints or concerns | |
| MEETING_MINUTES | Minutes from grievance resolution meetings | PDF, DOCX | Grievance committee meeting notes |
| RESOLUTION_DOCUMENT | Documentation of resolution | PDF, DOCX | Resolution agreement, action plan |
| PHOTO | Photos related to grievance or resolution | JPG, PNG | Photos of issue or completed intervention |
| OTHER | Other supporting documents | PDF, DOCX, XLSX, JPG, PNG | Any other relevant documentation |
Human Capital Metrics Evidence
Required: Minimum 1 evidence item per metric submission
Allowed Evidence Types:
| Evidence Type | Description | File Formats | Example |
|---|---|---|---|
| HR_REGISTER | Human resources register with employee counts | PDF, XLSX | Monthly or quarterly HR headcount register |
| PAYROLL_REPORT | Payroll reports showing employee counts | PDF, XLSX | Payroll summary by department or site |
| BOARD_REPORT | Board reports with executive headcount | PDF, DOCX | Executive headcount summary for board |
| ORG_CHART | Organizational charts | PDF, XLSX, JPG, PNG | Org chart showing employee structure |
| SITE_ROSTER | Site-specific employee rosters | PDF, XLSX | Employee roster by site |
| RECRUITMENT_REPORT | Recruitment or new hire reports | PDF, XLSX | Monthly recruitment summary by gender |
| EXIT_REPORT | Employee departure or exit reports | PDF, XLSX | Monthly turnover report |
| TIME_SHEET | Time sheets for casual workers | PDF, XLSX | Casual worker time tracking sheets |
| CONTRACT_REGISTER | Contract register for fixed-term employees | PDF, XLSX | Fixed-term contract register |
PII Protection Requirements for HR Evidence:
- Evidence files must contain aggregated counts only (no individual employee names, IDs, or personal data)
- If evidence contains PII, it must be redacted before upload
- Minimum aggregation threshold: 5 employees per category (to prevent identification)
- Access to HR evidence limited to HR role and auditors
- Evidence files encrypted at rest in S3
Environmental Metrics Evidence
Required: Conditional based on metric type and severity
Allowed Evidence Types:
| Evidence Type | Description | File Formats | Example |
|---|---|---|---|
| PRODUCTION_LOG | Daily or monthly production logs | PDF, XLSX | Crushed ore, milled ore, gold production logs |
| MILL_REPORT | Mill operation and production reports | PDF, DOCX, XLSX | Monthly metallurgical reports |
| SHIFT_REPORT | Shift reports showing production | PDF, XLSX | Daily shift production summaries |
| METALLURGICAL_REPORT | Metallurgical performance reports | PDF, DOCX | Gold recovery and production reports |
| INVOICE | Purchase invoices for materials/fuel | Materials, fuel, chemicals invoices | |
| STOCK_CARD | Stock cards for consumables | PDF, XLSX | Materials stock movement records |
| MATERIALS_REGISTER | Materials consumption register | PDF, XLSX | Consumables tracking register |
| HAZMAT_REGISTER | Hazardous materials register | PDF, XLSX | Cyanide tracking register |
| DELIVERY_NOTE | Delivery notes for materials/fuel | Supplier delivery documentation | |
| UTILITY_BILL | Utility bills for electricity/water | Grid electricity, water bills | |
| METER_READING | Meter reading logs | PDF, XLSX | Electricity, water meter readings |
| FUEL_INVOICE | Fuel purchase invoices | Diesel, petrol invoices | |
| FUEL_LOG | Fuel dispensing and usage logs | PDF, XLSX | Fuel allocation by use |
| GENERATOR_LOG | Generator operation logs | PDF, XLSX | Generator hours and fuel consumption |
| WATER_METER_READING | Water meter readings | PDF, XLSX | Abstraction, consumption meter logs |
| BOREHOLE_LOG | Borehole abstraction logs | PDF, XLSX | Groundwater abstraction records |
| FLOW_LOG | Flow meter logs for water | PDF, XLSX | Water flow measurements |
| TSF_INSPECTION_REPORT | TSF monthly inspection reports | PDF, DOCX | Freeboard, stability inspections |
| WATER_TRUCK_LOG | Water truck delivery logs | PDF, XLSX | Potable water deliveries |
| LAB_TEST_REPORT | Laboratory test reports | Water quality, soil analysis from accredited lab | |
| WATER_QUALITY_REPORT | Water quality monitoring reports | PDF, XLSX | Quarterly water quality summaries |
| FIELD_MEASUREMENT_LOG | Field measurement logs | PDF, XLSX | pH, turbidity field measurements |
| CHAIN_OF_CUSTODY | Sample chain-of-custody forms | Lab sample tracking | |
| EMISSIONS_MONITORING_REPORT | Air emissions monitoring reports | PDF, DOCX | Quarterly air quality monitoring |
| AIR_QUALITY_REPORT | Air quality summary reports | PDF, XLSX | Pollutant concentrations by area |
| LAB_ANALYSIS_REPORT | Laboratory analysis reports | Air, water, soil analysis | |
| WASTE_MANIFEST | Waste manifest or transfer notes | Waste disposal tracking | |
| WASTE_DISPOSAL_RECORD | Waste disposal records | PDF, XLSX | Disposal site certificates |
| WASTE_LOG | Waste generation logs | PDF, XLSX | Monthly waste tracking by type |
| WEIGHBRIDGE_TICKET | Weighbridge tickets for waste | Waste weighing records | |
| HAZMAT_DISPOSAL_CERTIFICATE | Hazardous waste disposal certificates | Licensed facility disposal proof | |
| RECYCLING_RECEIPT | Recycling receipts | Recyclables sale/transfer receipts | |
| SOIL_ANALYSIS_REPORT | Soil contamination analysis | Contaminated soil characterization | |
| WASTE_DUMP_SURVEY | Waste dump survey reports | PDF, XLSX | Waste rock dump volumes |
| HAUL_TRUCK_LOG | Haul truck logs for waste rock/tailings | PDF, XLSX | Waste haulage records |
| SLURRY_DENSITY_LOG | Slurry density measurement logs | PDF, XLSX | Daily TSF slurry density |
| SLURRY_FLOW_LOG | Slurry flow logs | PDF, XLSX | Tailings deposition flow rates |
| SURVEY_REPORT | Land/TSF survey reports | TSF embankment surveys, freeboard | |
| AERIAL_SURVEY | Aerial or drone survey imagery | PDF, JPG, PNG | TSF pond surface area imagery |
| REHAB_COMPLETION_REPORT | Rehabilitation completion reports | PDF, DOCX | Rehabilitation closeout documentation |
| PROJECT_LOG | Rehabilitation project logs | PDF, XLSX | Activity tracking, contractor logs |
| PHOTOGRAPHIC_EVIDENCE | Photographic evidence of activities/incidents | JPG, PNG, PDF | Before/after photos, incident photos |
| CONTRACTOR_REPORT | Contractor progress reports | PDF, DOCX | Rehabilitation contractor reports |
| INCIDENT_REPORT | Environmental incident reports | PDF, DOCX | Spill reports, exceedance reports |
| INVESTIGATION_REPORT | Incident investigation reports | PDF, DOCX | Root cause analysis, corrective actions |
| REGULATORY_NOTIFICATION | Regulatory notification letters | Incident notifications to authorities | |
| CLOSURE_REPORT | Incident closure reports | PDF, DOCX | Incident closeout documentation |
| REMEDIATION_REPORT | Remediation action reports | PDF, DOCX | Remediation completion reports |
Evidence Requirements by Environmental Section:
| Section | Evidence Requirement | Allowed Evidence Types |
|---|---|---|
| G.1 Production | OPTIONAL | PRODUCTION_LOG, MILL_REPORT, SHIFT_REPORT, METALLURGICAL_REPORT |
| G.2 Materials (non-hazardous) | RECOMMENDED | INVOICE, STOCK_CARD, MATERIALS_REGISTER, DELIVERY_NOTE |
| G.2 Materials (cyanide) | MANDATORY | INVOICE, STOCK_CARD, MATERIALS_REGISTER, HAZMAT_REGISTER |
| G.3 Energy/Fuel | RECOMMENDED | UTILITY_BILL, METER_READING, FUEL_INVOICE, FUEL_LOG, GENERATOR_LOG |
| G.4 Water Volumes | RECOMMENDED | WATER_METER_READING, UTILITY_BILL, BOREHOLE_LOG, FLOW_LOG, TSF_INSPECTION_REPORT, WATER_TRUCK_LOG |
| G.4.4 Water Quality (standard parameters) | RECOMMENDED | LAB_TEST_REPORT, WATER_QUALITY_REPORT, FIELD_MEASUREMENT_LOG |
| G.4.4 Water Quality (cyanide, heavy metals) | MANDATORY | LAB_TEST_REPORT (accredited laboratory), CHAIN_OF_CUSTODY |
| G.5 Air Emissions | RECOMMENDED | EMISSIONS_MONITORING_REPORT, AIR_QUALITY_REPORT, LAB_ANALYSIS_REPORT |
| G.6 Non-Mineralised Waste (non-hazardous) | RECOMMENDED | WASTE_MANIFEST, WASTE_DISPOSAL_RECORD, WASTE_LOG, WEIGHBRIDGE_TICKET, RECYCLING_RECEIPT |
| G.6 Non-Mineralised Waste (hazardous) | MANDATORY | WASTE_MANIFEST, HAZMAT_DISPOSAL_CERTIFICATE |
| G.7 Mineralised Waste | RECOMMENDED | WASTE_DUMP_SURVEY, HAUL_TRUCK_LOG, PRODUCTION_LOG |
| G.8 TSF (slurry density, surface area, rate of rise) | RECOMMENDED | TSF_INSPECTION_REPORT, SLURRY_DENSITY_LOG, SLURRY_FLOW_LOG, SURVEY_REPORT, AERIAL_SURVEY |
| G.8 TSF (freeboard) | MANDATORY | TSF_INSPECTION_REPORT, SURVEY_REPORT |
| G.9 Rehabilitation (Planned/WIP) | RECOMMENDED | PROJECT_LOG, PHOTOGRAPHIC_EVIDENCE, CONTRACTOR_REPORT |
| G.9 Rehabilitation (Completed) | MANDATORY | REHAB_COMPLETION_REPORT, PHOTOGRAPHIC_EVIDENCE |
| G.10 Incidents (Low/Medium) | RECOMMENDED | INCIDENT_REPORT, PHOTOGRAPHIC_EVIDENCE |
| G.10 Incidents (High/Critical closed) | MANDATORY | INCIDENT_REPORT, INVESTIGATION_REPORT, CLOSURE_REPORT, REGULATORY_NOTIFICATION |
Confidentiality and Environmental Data Protection:
- Environmental metrics (G.1-G.9) classified as INTERNAL (may be disclosed in sustainability reports)
- Environmental incidents (G.10) classified as CONFIDENTIAL (regulatory and reputational sensitivity)
- Evidence must NOT contain individual employee names or Personal Health Information (PHI)
- Incident investigation reports require restricted access (HSE role, site managers, auditors)
- Regulatory notifications may require external sharing with appropriate redaction
- Evidence files encrypted at rest in S3
- Critical parameters (freeboard <1.5 m, hazardous waste, High/Critical incidents) trigger alert workflows
OHS Incident and Performance Metrics Evidence
Required: Conditional based on incident severity
Allowed Evidence Types:
| Evidence Type | Description | File Formats | Example |
|---|---|---|---|
| ACCIDENT_REPORT | Formal accident or incident investigation report | PDF, DOCX | Incident investigation report, root cause analysis |
| INCIDENT_REGISTER | Register or log of all incidents | PDF, XLSX | Monthly or quarterly incident register |
| HSE_REPORT | Health, Safety, and Environment reports | PDF, DOCX, XLSX | HSE committee reports, safety statistics |
| CLINIC_REGISTER | Clinic attendance register | PDF, XLSX | On-site clinic visit log |
| FIRST_AID_REGISTER | First aid treatment register | PDF, XLSX | First aid incident log |
| MEDICAL_TREATMENT_RECORD | Medical treatment records (aggregated, no PHI) | Medical treatment summary (no individual patient data) | |
| LTI_REGISTER | Lost Time Injury register | PDF, XLSX | LTI tracking register with days lost |
| FATALITY_REPORT | Fatality investigation report | PDF, DOCX | Fatality incident report, regulatory notification |
| INVESTIGATION_REPORT | Incident investigation report | PDF, DOCX | High potential incident investigation, corrective actions |
| PROPERTY_DAMAGE_REPORT | Property damage incident report | PDF, DOCX, JPG | Equipment damage report, photos |
| OCCUPATIONAL_DISEASE_REGISTER | Occupational disease register | PDF, XLSX | Silicosis/pneumoconiosis case register |
| TIME_SHEET | Time sheets showing hours worked | PDF, XLSX | Employee time tracking, contractor hours |
| PAYROLL_REPORT | Payroll reports showing hours worked | PDF, XLSX | Monthly payroll summary with hours |
| HR_REGISTER | HR register with workforce hours | PDF, XLSX | HR headcount and hours worked summary |
Evidence Requirements by Incident Severity:
| Incident Type | Evidence Requirement | Allowed Evidence Types |
|---|---|---|
| Fatality | MANDATORY (minimum 2 items) | FATALITY_REPORT, INVESTIGATION_REPORT, ACCIDENT_REPORT |
| LTI | MANDATORY (minimum 1 item) | LTI_REGISTER, ACCIDENT_REPORT |
| High Potential Incident | MANDATORY (minimum 1 item) | INCIDENT_REGISTER, INVESTIGATION_REPORT |
| Silicosis/Pneumoconiosis | MANDATORY (minimum 1 item) | OCCUPATIONAL_DISEASE_REGISTER, MEDICAL_TREATMENT_RECORD |
| Medical Treatment | RECOMMENDED | MEDICAL_TREATMENT_RECORD, CLINIC_REGISTER |
| Restricted Work | RECOMMENDED | ACCIDENT_REPORT, HSE_REPORT |
| Property Damage | RECOMMENDED | PROPERTY_DAMAGE_REPORT, INCIDENT_REGISTER |
| First Aid | OPTIONAL | FIRST_AID_REGISTER, CLINIC_REGISTER |
| Near Miss | OPTIONAL | INCIDENT_REGISTER, HSE_REPORT |
| Other Clinic Visits | OPTIONAL | CLINIC_REGISTER |
Evidence Requirements for LTI Performance Metrics (F.2):
- LTI Days: MANDATORY - LTI_REGISTER or ACCIDENT_REPORT showing days lost
- Hours Worked: MANDATORY - TIME_SHEET, PAYROLL_REPORT, or HR_REGISTER showing total hours worked by workforce type
- LTIFR: MANDATORY - Evidence supporting both LTI count and hours worked
Confidentiality and PHI Protection for OHS Evidence:
- All OHS evidence classified as CONFIDENTIAL
- Evidence must NOT contain individual employee names, medical diagnosis, or Personal Health Information (PHI)
- Aggregate counts and statistics only
- If evidence contains PHI, it must be redacted before upload
- Access to OHS evidence limited to HSE role, site managers, and auditors
- Medical treatment records require additional encryption and access controls
- Evidence files encrypted at rest in S3
- Fatality reports may require regulatory notification and external sharing (with appropriate redaction)
Evidence Chain-of-Custody
All evidence files must include:
- Content hash: SHA-256 checksum for integrity verification
- Upload timestamp: When evidence was attached
- File metadata: Original filename, MIME type, file size
- Linkage: Association to specific engagement or grievance record
Community Investment Template
Community Investment (CSR/CSIR) uses a log-based collection model where collectors submit activity records throughout the quarter. These records support the H.1 Quarterly CSR/CSIR Activities report (GRI 203).
Quarterly CSR/CSIR Activities (H.1)
Template ID: COMMUNITY_INVESTMENT_LOG_V1
Collection Frequency: Quarterly
Dimensionality: Organisation, Reporting Period, Site (optional)
Record Entity: community_investment_activities
Field Definitions
| Field Name | Data Type | Required | Validation | Example |
|---|---|---|---|---|
activity_start_date |
Date (ISO 8601) | Yes | Must be within reporting period | 2025-07-01 |
activity_end_date |
Date (ISO 8601) | Yes | Must be >= start_date | 2025-09-30 |
description |
Text (2000 chars) | Yes | Non-empty | "Fuel Donations for Community Transport" |
pillar |
Enum | Yes | Must be valid pillar | Donations & Sponsorship |
budget_amount |
Number | No | Non-negative, default 0.00 | 24300.00 |
actual_amount |
Number | Yes | Non-negative | 4518.47 |
currency_code |
String (ISO 4217) | Yes | Valid 3-letter code | USD |
variance |
Number | Yes | actual - budget (validation check) | -19781.53 |
beneficiaries |
Text (2000 chars) | Yes | Non-empty | "Government Stakeholders" |
comments |
Text (2000 chars) | No | Optional remarks | "Enabled Eureka Gold Mine events" |
organisation_id |
UUID | Yes | Must exist and match tenant | "org-uuid" |
site_id |
UUID | No | If provided, must exist | "site-uuid" |
JSON Template Structure
{
"template_id": "COMMUNITY_INVESTMENT_LOG_V1",
"template_name": "Quarterly CSR/CSIR Activities (H.1)",
"template_version": 1,
"collection_frequency": "QUARTERLY",
"dimensionality": ["organisation", "reporting_period", "site"],
"is_mandatory": true,
"submission_type": "LOG",
"fields": [
{
"field_name": "activity_start_date",
"field_label": "Start Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "REPORTING_PERIOD_START",
"error_message": "Start date must be within the reporting period"
},
"help_text": "Enter the start date of the activity or initiative",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "activity_end_date",
"field_label": "End Date",
"data_type": "DATE",
"required": true,
"validation_rules": {
"format": "ISO_8601",
"min_date_rule": "FIELD:activity_start_date",
"error_message": "End date must be after or equal to start date"
},
"help_text": "Enter the end date. For single-day events, use the same date as Start Date.",
"ui_hint": "DATE_PICKER"
},
{
"field_name": "description",
"field_label": "Description of Initiative",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 2000,
"min_length": 5,
"error_message": "Provide a description of the initiative"
},
"help_text": "Describe the CSR activity or initiative",
"ui_hint": "TEXTAREA"
},
{
"field_name": "pillar",
"field_label": "Pillar",
"data_type": "ENUM",
"required": true,
"validation_rules": {
"allowed_values": [
"Education & Sports",
"Social Empowerment",
"Community Development",
"Donations & Sponsorship",
"Other"
],
"error_message": "Select a valid investment pillar"
},
"help_text": "Select the category of investment",
"ui_hint": "DROPDOWN"
},
{
"field_name": "budget_amount",
"field_label": "Budget Amount",
"data_type": "NUMBER",
"required": false,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Budget must be a non-negative number"
},
"help_text": "Enter the budgeted amount (optional)",
"ui_hint": "CURRENCY_INPUT"
},
{
"field_name": "actual_amount",
"field_label": "Actual Investment",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"minimum": 0,
"precision": 2,
"error_message": "Actual investment must be a non-negative number"
},
"help_text": "Enter the actual amount spent",
"ui_hint": "CURRENCY_INPUT"
},
{
"field_name": "variance",
"field_label": "Variance",
"data_type": "NUMBER",
"required": true,
"validation_rules": {
"precision": 2,
"business_rules": ["variance = actual_amount - budget_amount"],
"error_message": "Variance must be calculated as Actual - Budget"
},
"help_text": "Calculated variance (Actual - Budget). Positive = Over Budget/Unbudgeted spend.",
"ui_hint": "CALCULATED_FIELD"
},
{
"field_name": "currency_code",
"field_label": "Currency",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"pattern": "^[A-Z]{3}$",
"error_message": "Enter a valid 3-letter currency code (e.g., USD)"
},
"help_text": "Enter the currency code for the amounts",
"ui_hint": "TEXT_INPUT"
},
{
"field_name": "beneficiaries",
"field_label": "Stakeholder(s) Affected",
"data_type": "TEXT",
"required": true,
"validation_rules": {
"max_length": 2000,
"error_message": "Describe the stakeholders affected"
},
"help_text": "Identify the beneficiaries (e.g., 'Local Schools', 'Host Community'). Avoid individual names.",
"ui_hint": "TEXTAREA"
},
{
"field_name": "comments",
"field_label": "Comments",
"data_type": "TEXT",
"required": false,
"validation_rules": {
"max_length": 2000,
"error_message": "Comments too long"
},
"help_text": "Enter any additional comments or notes",
"ui_hint": "TEXTAREA"
}
],
"evidence_requirements": {
"min_items": 0,
"conditional_requirements": {
"MANDATORY_IF": [
"actual_amount > 0: INVOICE, RECEIPT, PROOF_OF_PAYMENT required"
],
"RECOMMENDED_FOR_ALL": ["PHOTO", "MOU", "ACKNOWLEDGEMENT_LETTER"]
},
"allowed_types": ["INVOICE", "RECEIPT", "PROOF_OF_PAYMENT", "PHOTO", "MOU", "ACKNOWLEDGEMENT_LETTER", "DONATION_REQUEST"],
"help_text": "Attach financial evidence (mandatory for spend) and non-financial evidence (photos, letters)"
}
}
Collector Workflow
Workflow for Engagement Log Submission
┌─────────────────────────────────────────────────────────────────┐
│ MOBILE APP (Offline-First) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. Fetch Templates & Master Lists │
│ │ │
│ ├─> GET /api/v1/collector/templates (engagement log) │
│ ├─> GET /api/v1/master-data/stakeholder-categories │
│ └─> GET /api/v1/master-data/engagement-platforms │
│ │
│ 2. Create Engagement Draft (Local SQLite) │
│ │ │
│ ├─> Fill engagement form fields │
│ ├─> Select stakeholder categories (multi-select) │
│ ├─> Select engagement platforms (optional multi-select) │
│ ├─> Attach evidence files │
│ └─> Auto-save draft to local database │
│ │
│ 3. Validate & Submit │
│ │ │
│ ├─> Client-side validation (instant feedback) │
│ ├─> Mark as QUEUED │
│ └─> Trigger sync when online │
│ │
│ 4. Background Sync (Network Available) │
│ │ │
│ ├─> POST /api/v1/stakeholder-engagement/engagements │
│ │ (Idempotency-Key = UUID) │
│ │ │
│ ├─> POST /api/v1/collector/evidence │
│ │ (Upload evidence files) │
│ │ │
│ └─> GET /api/v1/collector/sync │
│ (Fetch updated status: RECEIVED → VALIDATED → APPROVED)│
│ │
└─────────────────────────────────────────────────────────────────┘
Workflow for Grievance Log Submission
Same pattern as engagement workflow, but using:
- POST /api/v1/stakeholder-engagement/grievances
- Evidence is optional (min 0 items)
Status Lifecycle
Both engagement and grievance submissions follow the standard data lifecycle:
DRAFT (mobile) → QUEUED → RECEIVED → VALIDATED → PROCESSED → APPROVED → LOCKED
↓
REJECTED (if validation fails)
↓
Fix & resubmit (new version)
Multi-Row Submission Guidance
Batch Upload Workflow
For collectors with multiple engagements or grievances, the platform supports batch submission:
Option 1: Sequential Individual Submissions
// Mobile app - submit engagements one at a time
for (engagement in engagementDrafts) {
val uuid = UUID.randomUUID().toString()
// Submit engagement
apiClient.submitEngagement(
submissionUuid = uuid,
reportingPeriodId = periodId,
organisationId = orgId,
siteId = siteId,
initialDate = engagement.initialDate,
stakeholderCategoryIds = engagement.categoryIds,
stakeholderName = engagement.name,
purpose = engagement.purpose,
outcome = engagement.outcome,
owner = engagement.owner,
status = engagement.status,
statusDate = engagement.statusDate,
engagementPlatformIds = engagement.platformIds,
idempotencyKey = uuid
)
// Upload evidence for this engagement
for (evidence in engagement.evidenceFiles) {
apiClient.uploadEvidence(
submissionUuid = uuid,
file = evidence.file,
evidenceType = evidence.type,
contentHash = evidence.hash
)
}
}
Option 2: Bulk API Endpoint (Future Enhancement)
POST /api/v1/stakeholder-engagement/engagements/batch
{
"reporting_period_id": "period-uuid",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"engagements": [
{ /* engagement 1 */ },
{ /* engagement 2 */ },
{ /* engagement 3 */ }
]
}
Update Workflow
To update an existing engagement or grievance:
- Fetch current record via GET endpoint (using record ID)
- Modify fields in mobile app
- Submit as update via PUT/PATCH endpoint
- Preserve version history (backend creates audit trail)
PUT /api/v1/stakeholder-engagement/engagements/{engagement_id}
{
"status": "Closed",
"status_date": "2025-04-30",
"outcome": "The block is now complete and handed over to the Ministry of Education."
}
Validation for Updates:
- Cannot change
initial_dateafter submission - Cannot change
stakeholder_category_idsafter submission (create new engagement instead) - Status transitions must follow one-way progression: Open → WIP → Closed
- Updates to Closed engagements require explicit unlock (audit logged)
Incremental Collection Pattern
Best practice for quarterly log collection:
Week 1-4 (Q1):
- Collector adds engagements/grievances as they occur
- Each record submitted individually when ready
- Status starts as "Open" or "WIP"
Week 5-8 (Q1):
- Collector updates existing records (status changes, outcomes)
- New engagements/grievances added as they arise
Week 9-12 (Q1):
- Collector closes out completed engagements (status → Closed)
- Adds final outcome text
- Attaches final evidence (e.g., completion photos)
End of Quarter:
- Reviewer approves all engagement/grievance records
- Reporting period locked
- Data becomes report-eligible
API Integration
Master Data Endpoints
Before collecting engagement or grievance data, mobile app must fetch master lists:
GET /api/v1/master-data/stakeholder-categories
Fetch tenant-specific stakeholder categories.
Response:
{
"data": [
{
"id": "cat-uuid-1",
"name": "Employees",
"description": "Internal staff and workforce",
"is_active": true
},
{
"id": "cat-uuid-2",
"name": "Community",
"description": "Local community members and organizations",
"is_active": true
}
]
}
GET /api/v1/master-data/engagement-platforms
Fetch tenant-specific engagement platforms.
Response:
{
"data": [
{
"id": "platform-uuid-1",
"name": "Community Meeting",
"description": "In-person community meetings or town halls",
"is_active": true
},
{
"id": "platform-uuid-2",
"name": "Email",
"description": "Email correspondence with stakeholders",
"is_active": true
}
]
}
Submission Endpoints
POST /api/v1/stakeholder-engagement/engagements
Submit a new stakeholder engagement record.
Request:
{
"submission_uuid": "550e8400-e29b-41d4-a716-446655440000",
"reporting_period_id": "period-uuid",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"initial_date": "2025-01-24",
"stakeholder_category_ids": ["cat-uuid-1", "cat-uuid-2"],
"stakeholder_name": "Guruve Local Gvt, OPC, Ministry of Education",
"purpose": "Muroiwa Primary School Additional Block Construction",
"outcome": null,
"owner": "T.Tinago/L.Khumalo/D. Tavenhave",
"status": "WIP",
"status_date": "2025-04-30",
"engagement_platform_ids": ["platform-uuid-1"],
"metadata": {
"collector_notes": "Initial engagement for school construction project"
}
}
Response (201 Created):
{
"id": "engagement-uuid",
"submission_uuid": "550e8400-e29b-41d4-a716-446655440000",
"state": "RECEIVED",
"submitted_at": "2025-01-25T10:30:00Z",
"submitted_by": {
"user_id": "user-uuid",
"name": "John Collector"
}
}
POST /api/v1/stakeholder-engagement/grievances
Submit a new grievance record.
Request:
{
"submission_uuid": "660e8400-e29b-41d4-a716-446655440001",
"reporting_period_id": "period-uuid",
"organisation_id": "org-uuid",
"site_id": "site-uuid",
"date_reported": "2025-03-13",
"source_type": "External",
"stakeholder_group": "Community",
"nature": "The host communities raised a plea for the mine to construct a Clinic in the Bome area.",
"intervention": "Construction of a Clinic at Bome is underway and is at window level.",
"resolution_status": "RESOLVED",
"metadata": {
"collector_notes": "Community health infrastructure request"
}
}
Response (201 Created):
{
"id": "grievance-uuid",
"submission_uuid": "660e8400-e29b-41d4-a716-446655440001",
"state": "RECEIVED",
"submitted_at": "2025-03-14T14:15:00Z",
"submitted_by": {
"user_id": "user-uuid",
"name": "Jane Collector"
}
}
Evidence Upload
Evidence files are uploaded separately after engagement/grievance submission:
POST /api/v1/collector/evidence
Request (multipart/form-data):
POST /api/v1/collector/evidence
Content-Type: multipart/form-data
submission_uuid: 550e8400-e29b-41d4-a716-446655440000
evidence_type: MEETING_MINUTES
file: [binary file data]
content_hash: a3b2c1...
Response (201 Created):
{
"id": "evidence-uuid",
"submission_uuid": "550e8400-e29b-41d4-a716-446655440000",
"filename": "meeting_minutes_2025-01-24.pdf",
"evidence_type": "MEETING_MINUTES",
"upload_status": "UPLOADED",
"uploaded_url": "s3://bucket/evidence/evidence-uuid.pdf",
"uploaded_at": "2025-01-25T10:35:00Z"
}
Cross-References
- Collector Workflow - Offline-first mobile data collection workflow
- Collector API - REST API endpoints for collectors
- Data Model Complete - Database schema for stakeholder engagement
- Report Outputs - Stakeholder engagement report formats
- Validation Engine - Validation rules and processing
- Evidence Management - File upload and storage
Change Log
| Version | Date | Author | Changes |
|---|---|---|---|
| 1.0 | 2026-01-17 | Ralph (Autonomous Agent) | Initial collection templates for stakeholder engagement and grievance logs |
| 1.1 | 2026-01-17 | Ralph (Autonomous Agent) | Added human capital metrics templates (GRI 405-1, GRI 401, Employee Age), validation rules, and evidence requirements |
| 1.2 | 2026-01-18 | Ralph (Autonomous Agent) | Added OHS collection templates (F.1 Quarterly Incident Statistics, F.2 LTI Days and LTIFR), OHS validation rules, OHS evidence requirements, CSV template examples, and confidentiality/PHI protection guidance |
| 1.3 | 2026-01-18 | Ralph (Autonomous Agent) | Added environmental collection templates (G.1-G.10): monthly production, materials, energy, water, waste, TSF; quarterly water quality, air emissions, rehabilitation, incidents. Added environmental evidence types and confidentiality guidance. |
| 1.4 | 2026-01-18 | Ralph (Autonomous Agent) | Added environmental validation rules for G.1-G.10: production (milled ore ≤ crushed ore × 1.1, month-end dates), materials (cyanide MANDATORY evidence), energy (generator consistency, consumption rate 0.2-0.5 L/kWh), water volumes (water balance ±20% variance), water quality (quality band logic Green/Amber/Red, cyanide/heavy metals MANDATORY evidence, quarter-end dates), air emissions (air quality band logic), waste (tailings ≤ milled ore × 1.1, hazardous waste MANDATORY evidence), TSF (freeboard ≥1.5 m CRITICAL threshold with MANDATORY evidence, slurry density 1.0-2.0 g/cm³ warnings), rehabilitation (status date ≥ date started, Completed status MANDATORY evidence), environmental incidents CONFIDENTIAL (closure date ≥ incident date, High/Critical closed MANDATORY evidence) |
| 1.5 | 2026-01-20 | Ralph (Autonomous Agent) | Added community investment collection template (H.1) for quarterly CSR/CSIR activities, including budget/actual variance tracking and evidence requirements. |
Glossary
- Collection Template: Structured schema defining fields, validation rules, and evidence requirements for data collection
- Log-based Collection: Data collection model where multiple records accumulate over time (vs. single-value metrics)
- Master List: Reference data (categories, platforms) maintained centrally and synced to mobile devices
- Multi-row Submission: Batch submission of multiple engagement or grievance records
- Status Lifecycle: Progression of engagement/grievance status from Open → WIP → Closed
- Dimensional Metric: Metric submission with nested breakdowns by multiple dimensions (e.g., workforce type, incident type, quarter)
- LTI (Lost Time Injury): Work-related injury resulting in at least one full day/shift absence from work
- LTIFR (Lost Time Injury Frequency Rate): Calculated safety metric = (Number of LTIs × 1,000,000) / Total hours worked
- Workforce Type: Dimension distinguishing between Mine (direct employees) and Contractors
- PHI (Personal Health Information): Individually identifiable health information that must be protected and redacted from aggregated reports
- Evidence Severity Tiers: Three-tier evidence requirement model (MANDATORY, RECOMMENDED, OPTIONAL) based on incident severity
- Cross-validation: Validation rule ensuring consistency between related metrics (e.g., F.1 LTI counts matching F.2 LTIFR calculation inputs)
- TSF (Tailings Storage Facility): Engineered structure for storing mine tailings (processed ore slurry)
- Freeboard: Vertical distance between TSF pond water level and embankment crest (critical safety parameter, regulatory minimum ≥1.5 m)
- Slurry Density: Mass per unit volume of tailings slurry (g/cm³), indicates water content and settlement characteristics
- Recycle Stream: Water recovered from TSF or other sources and reused in processing operations
- Quality Band: Traffic-light classification system (Green/Amber/Red) for environmental compliance based on exceedance thresholds
- Specific Consumption: Resource use normalized per tonne of crushed ore (enables efficiency benchmarking across periods and sites)
- Intensity Metric: Environmental metric normalized per unit of production (e.g., materials per tonne, energy per tonne, water per tonne, waste per tonne)
- Mineralised Waste: Waste rock and tailings (ore materials with low/no economic value)
- Non-Mineralised Waste: General, recyclable, hazardous, and contaminated soil waste (non-ore waste streams)
- Hazardous Material: Material requiring special handling, storage, and disposal (e.g., cyanide, contaminated soil, hazardous waste)
- Accredited Laboratory: Testing laboratory certified to ISO 17025 or equivalent standard for analytical quality assurance
- Environmental Incident Severity: Four-tier classification (Low, Medium, High, Critical) based on impact magnitude, regulatory implications, and community effects
Document Control Approved by: [Pending] Next Review: 2026-07-17 Classification: Internal Use