TGM Expert provides comprehensive environmental permit and compliance management, enabling energy operators to track permits, compliance obligations, and submissions to regulatory authorities.

Table of Contents


Overview

Key Features

  • Permit Tracking - Track all environmental permits with expiry dates and conditions
  • Compliance Calendar - Monitor upcoming and overdue compliance obligations
  • Submission Management - Full lifecycle for regulatory submissions
  • Permit-Obligation Linking - Each obligation is linked to a specific permit
  • Expiry Alerts - Proactively find permits approaching expiry
  • Regulatory Authority Tracking - Store issuing authority contact details
  • Multi-Frequency Support - Handle daily, weekly, monthly, quarterly, semi-annual, annual, and one-time obligations

Architecture

EnvironmentalPermit
  ├── Company (tenant isolation)
  ├── Unit (affected asset)
  └── ComplianceObligation[]
        ├── ResponsibleUser (assigned user)
        └── ComplianceSubmission[]
              ├── SubmittedBy (User)
              └── ReviewedBy (User)

Data Model

EnvironmentalPermit Entity

Field Type Description
id Long Auto-generated primary key
permitNumber String Unique permit identifier
title String Permit title
description String Detailed description
permitType PermitType AIR, WATER, WASTE, NOISE, LAND_USE, ENVIRONMENTAL_IMPACT
status PermitStatus ACTIVE, EXPIRED, SUSPENDED, REVOKED, PENDING_RENEWAL
issuingAuthority String Name of the regulatory authority
authorityContact String Contact person at the authority
authorityEmail String Authority email
authorityPhone String Authority phone number
issueDate LocalDateTime When the permit was issued
expiryDate LocalDateTime When the permit expires
renewalDate LocalDateTime Scheduled renewal date
unit Unit Associated generating unit
conditions String Permit conditions
restrictions String Operating restrictions
emissionLimits String Emission limit requirements
permitFee BigDecimal Initial permit fee
annualFee BigDecimal Annual renewal/maintenance fee
notes String Additional notes

ComplianceObligation Entity

Field Type Description
id Long Auto-generated primary key
permit EnvironmentalPermit Parent permit
title String Obligation title
description String What needs to be done
obligationType ObligationType REPORTING, MONITORING, INSPECTION, TESTING, FILING
status ObligationStatus ACTIVE, COMPLETED, OVERDUE, WAIVED
frequency ObligationFrequency How often it must be fulfilled
nextDueDate LocalDateTime Next due date
lastCompletedDate LocalDateTime When it was last completed
responsibleUser User Assigned responsible person
requirements String Detailed requirements
submissionFormat String Required format (e.g., PDF, Excel, online portal)
notes String Additional notes

ComplianceSubmission Entity

Field Type Description
id Long Auto-generated primary key
obligation ComplianceObligation Parent obligation
submissionReference String External reference number
title String Submission title
description String Submission details
status ComplianceSubmissionStatus Submission lifecycle status
periodStart LocalDateTime Start of reporting period
periodEnd LocalDateTime End of reporting period
submittedDate LocalDateTime When it was submitted
reviewDate LocalDateTime When it was reviewed
approvalDate LocalDateTime When it was approved
submittedBy User User who submitted
reviewedBy User User who reviewed
submissionData String Submission content/data
reviewNotes String Reviewer's notes
rejectionReason String Reason for rejection
notes String Additional notes

Database Tables

-- Migration: V55__environmental_permits.sql
-- Tables: environmental_permits, compliance_obligations, compliance_submissions

Permit Types

Type Value Description
Air AIR Air emissions permits
Water WATER Water discharge/usage permits
Waste WASTE Waste disposal/management permits
Noise NOISE Noise emissions permits
Land Use LAND_USE Land use and zoning permits
Environmental Impact ENVIRONMENTAL_IMPACT Environmental impact assessment permits

Permit Status

Status Value Description
Active ACTIVE Permit is currently valid
Expired EXPIRED Permit has passed its expiry date
Suspended SUSPENDED Permit temporarily suspended
Revoked REVOKED Permit permanently revoked
Pending Renewal PENDING_RENEWAL Renewal application submitted

Compliance Obligations

Obligation Types

Type Value Description
Reporting REPORTING Regular report submissions
Monitoring MONITORING Continuous or periodic monitoring
Inspection INSPECTION Scheduled inspections
Testing TESTING Environmental testing requirements
Filing FILING Regulatory filings

Obligation Frequencies

Frequency Value Description
Daily DAILY Every day
Weekly WEEKLY Every week
Monthly MONTHLY Every month
Quarterly QUARTERLY Every 3 months
Semi-Annual SEMI_ANNUAL Every 6 months
Annual ANNUAL Every year
One-Time ONE_TIME Single occurrence

Obligation Status

Status Value Description
Active ACTIVE Obligation is active and tracking
Completed COMPLETED Obligation has been fulfilled
Overdue OVERDUE Past the due date without completion
Waived WAIVED Obligation waived by authority

Submission Workflow

  ┌───────┐     ┌───────────┐     ┌──────────────┐     ┌──────────┐
  │ DRAFT │ ──> │ SUBMITTED │ ──> │ UNDER_REVIEW │ ──> │ APPROVED │
  └───────┘     └───────────┘     └──────────────┘     └──────────┘
                                         │
                                         ├──────> ┌──────────┐
                                         │        │ REJECTED │
                                         │        └──────────┘
                                         │
                                         └──────> ┌───────────────────┐
                                                  │ REVISION_REQUIRED │
                                                  └───────────────────┘

Submission Status Transitions

From To Action Endpoint
DRAFT SUBMITTED Submit POST /api/compliance-submissions/{id}/submit
SUBMITTED UNDER_REVIEW Review POST /api/compliance-submissions/{id}/review
UNDER_REVIEW APPROVED Approve POST /api/compliance-submissions/{id}/approve

API Reference

Environmental Permits API

Base URL

/api/permits

Inherited CRUD Endpoints

Method Endpoint Description
GET /api/permits List all permits
GET /api/permits/{id} Get permit by ID
POST /api/permits Create new permit
PUT /api/permits/{id} Update permit
DELETE /api/permits/{id} Delete permit
GET /api/permits/count Get total count

Custom Endpoints

Get Expiring Permits
GET /api/permits/expiring?daysAhead=90&page=1&pageSize=25

Returns active permits expiring within the specified number of days (default: 90).

Get Permits by Status
GET /api/permits/by-status?status=ACTIVE&page=1&pageSize=25

Valid status values: ACTIVE, EXPIRED, SUSPENDED, REVOKED, PENDING_RENEWAL

Compliance Obligations API

Base URL

/api/compliance-obligations

Inherited CRUD Endpoints

Method Endpoint Description
GET /api/compliance-obligations List all obligations
GET /api/compliance-obligations/{id} Get obligation by ID
POST /api/compliance-obligations Create new obligation
PUT /api/compliance-obligations/{id} Update obligation
DELETE /api/compliance-obligations/{id} Delete obligation
GET /api/compliance-obligations/count Get total count

Custom Endpoints

Get Overdue Obligations
GET /api/compliance-obligations/overdue?page=1&pageSize=25

Returns all active obligations past their due date.

Get Upcoming Obligations
GET /api/compliance-obligations/upcoming?daysAhead=30&page=1&pageSize=25

Returns obligations due within the specified number of days (default: 30).

Get Obligations by Permit
GET /api/compliance-obligations/permit/{permitId}?page=1&pageSize=25

Returns all obligations associated with a specific permit.

Compliance Submissions API

Base URL

/api/compliance-submissions

Inherited CRUD Endpoints

Method Endpoint Description
GET /api/compliance-submissions List all submissions
GET /api/compliance-submissions/{id} Get submission by ID
POST /api/compliance-submissions Create new submission
PUT /api/compliance-submissions/{id} Update submission
DELETE /api/compliance-submissions/{id} Delete submission
GET /api/compliance-submissions/count Get total count

Custom Endpoints

Submit a Submission
POST /api/compliance-submissions/{id}/submit

Transitions from DRAFT to SUBMITTED and records the submission date.

Review a Submission
POST /api/compliance-submissions/{id}/review
Content-Type: application/json

{
  "reviewNotes": "Data looks complete. Forwarding for final approval."
}
Approve a Submission
POST /api/compliance-submissions/{id}/approve

Multi-Tenancy

All permits, obligations, and submissions are scoped to a company via the company_id foreign key. Users can only access environmental data belonging to their company.


Examples

Create an Environmental Permit

POST /api/permits
Content-Type: application/json

{
  "permitNumber": "EPA-AIR-2024-001",
  "title": "Air Emissions Permit - Plant Alpha",
  "description": "Annual air emissions permit for natural gas combined cycle plant",
  "permitType": "AIR",
  "issuingAuthority": "Environmental Protection Agency",
  "authorityContact": "Jane Doe",
  "authorityEmail": "jane.doe@epa.gov",
  "issueDate": "2024-01-01T00:00:00",
  "expiryDate": "2025-01-01T00:00:00",
  "unitId": 42,
  "conditions": "NOx emissions not to exceed 25 ppm. CO emissions not to exceed 10 ppm.",
  "emissionLimits": "NOx: 25 ppm, CO: 10 ppm, SO2: 2 ppm",
  "permitFee": 5000.00,
  "annualFee": 2000.00
}

Create a Compliance Obligation

POST /api/compliance-obligations
Content-Type: application/json

{
  "title": "Monthly Emissions Report",
  "description": "Submit monthly stack emissions monitoring data to EPA",
  "permitId": 1,
  "obligationType": "REPORTING",
  "frequency": "MONTHLY",
  "nextDueDate": "2024-02-15T17:00:00",
  "responsibleUserId": 10,
  "requirements": "CEMS data in CSV format with daily averages",
  "submissionFormat": "CSV via EPA online portal"
}

Create and Submit a Compliance Submission

# Step 1: Create the submission
POST /api/compliance-submissions
Content-Type: application/json

{
  "title": "January 2024 Emissions Report",
  "obligationId": 1,
  "periodStart": "2024-01-01T00:00:00",
  "periodEnd": "2024-01-31T23:59:59",
  "submissionData": "CEMS data attached. All parameters within permit limits."
}

# Step 2: Submit it
POST /api/compliance-submissions/1/submit

# Step 3: Review it
POST /api/compliance-submissions/1/review
{ "reviewNotes": "All data verified against CEMS records." }

# Step 4: Approve it
POST /api/compliance-submissions/1/approve

Permission Resource Names

environmental_permits   - for permit CRUD
compliance_obligations  - for obligation CRUD
compliance_submissions  - for submission CRUD