Skip to content

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

  1. Template Overview
  2. Stakeholder Engagement Log Template
  3. Grievance Mechanism Log Template
  4. Human Capital Metrics Templates
  5. GRI 405-1 Employee Demographics Template
  6. GRI 401 Employment Type and Turnover Template
  7. Employee Age Demographics Template
  8. Occupational Health and Safety (OHS) Templates
  9. Quarterly Incident Statistics Template (F.1)
  10. LTI Days and LTIFR Template (F.2)
  11. Environmental Metrics Templates
  12. Monthly Production Metrics (G.1)
  13. Monthly Materials Consumption (G.2)
  14. Monthly Energy Usage (G.3)
  15. Monthly Water Management (G.4)
  16. Quarterly Water Quality Monitoring (G.4.4)
  17. Quarterly Air Emissions Monitoring (G.5)
  18. Monthly Waste Generation (G.6-G.7)
  19. Monthly TSF Management (G.8)
  20. Quarterly Rehabilitation Activities (G.9)
  21. Quarterly Environmental Incidents (G.10)
  22. Community Investment Template
  23. Validation Rules
  24. Evidence Requirements
  25. Collector Workflow
  26. Multi-Row Submission Guidance
  27. 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 Email correspondence PDF, EML, MSG Email threads with stakeholders
AGREEMENT Signed agreements or MOUs PDF 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 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 PDF 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 PDF Supplier delivery documentation
UTILITY_BILL Utility bills for electricity/water PDF Grid electricity, water bills
METER_READING Meter reading logs PDF, XLSX Electricity, water meter readings
FUEL_INVOICE Fuel purchase invoices PDF 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 PDF 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 PDF 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 PDF Air, water, soil analysis
WASTE_MANIFEST Waste manifest or transfer notes PDF 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 PDF Waste weighing records
HAZMAT_DISPOSAL_CERTIFICATE Hazardous waste disposal certificates PDF Licensed facility disposal proof
RECYCLING_RECEIPT Recycling receipts PDF Recyclables sale/transfer receipts
SOIL_ANALYSIS_REPORT Soil contamination analysis PDF 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 PDF 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 PDF 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) PDF 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:

  1. Fetch current record via GET endpoint (using record ID)
  2. Modify fields in mobile app
  3. Submit as update via PUT/PATCH endpoint
  4. 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_date after submission
  • Cannot change stakeholder_category_ids after 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


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