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
- Data Model
- Permit Types
- Compliance Obligations
- Submission Workflow
- API Reference
- Environmental Permits API
- Compliance Obligations API
- Compliance Submissions API
- Multi-Tenancy
- Examples
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