**Motivations :** * Allow associating administrative procedures to module components with status tracking * Centralize regulation characteristics configuration for better data consistency * Link regulation characteristics to wastes, regulators, ecosystems, and module components **Root causes :** * Need to track administrative procedures per module component * Regulation characteristics were hardcoded in multiple places, causing inconsistency * No centralized way to manage and reference regulation characteristics **Correctifs :** * Added ModuleComponentProcedureAssociation interface with procedureId, status, and notes * Created RegulationCharacteristic entity with name, code, category, description, unit, isBoolean, minValue, maxValue * Added regulationCharacteristicIds field to Waste, NaturalRegulator, Ecosystem, and ModuleComponent * Updated all configuration pages to use regulation characteristics from centralized configuration * Created RegulationCharacteristicsConfigurationPage for managing characteristics * Added seeds for regulation characteristics (31 characteristics covering all categories) * Added seeds for companies (4NK Water & Waste default company) **Evolutions :** * Module components can now have associated administrative procedures with status (toDo, done, na) * Regulation characteristics are now centralized and can be referenced by multiple entities * All regulation needs and characteristics are now managed through a single configuration page * Business plans can be added to all entities (already implemented, documented in data_schemas.md) * Updated data_schemas.md with complete documentation of all entities, relations, and validation rules **Page affectées :** * src/pages/configuration/ModuleComponentsConfigurationPage.tsx - Added administrative procedures section * src/pages/configuration/RegulationCharacteristicsConfigurationPage.tsx - New page for managing characteristics * src/pages/configuration/WasteConfigurationPage.tsx - Updated to use regulation characteristics * src/pages/configuration/RegulatorsConfigurationPage.tsx - Updated to use regulation characteristics * src/pages/configuration/EcosystemsConfigurationPage.tsx - Updated to use regulation characteristics * src/types/index.ts - Added new interfaces and fields * src/utils/storage.ts - Added regulation characteristics and companies to storage * data_schemas.md - Complete documentation update * data/seeds/regulation-characteristics-seeds.json - New seed file * data/seeds/companies-seeds.json - New seed file
28 KiB
28 KiB
Data Schemas and Relations
1. JSON Data Structure
1.1 Root Storage Structure
{
"version": "1.0.0",
"lastModified": "2024-01-01T00:00:00Z",
"users": [],
"wastes": [],
"regulators": [],
"services": [],
"wasteOrigins": [],
"transporters": [],
"moduleComponents": [],
"ecosystems": [],
"regulationCharacteristics": [],
"treatmentSites": [],
"wasteSites": [],
"investors": [],
"administrativeProcedures": [],
"companies": [],
"projects": []
}
2. Entity Schemas
2.1 User Schema
{
"id": "string (UUID)",
"username": "string",
"password": "string (hashed or plain for localhost)",
"createdAt": "ISO 8601 date string",
"lastLogin": "ISO 8601 date string"
}
2.2 Waste Schema
{
"id": "string (UUID)",
"name": "string",
"originType": "string (animals|markets|restaurants|other)",
"originSubType": "string (specific type, optional)",
"wasteOriginId": "string (optional, reference to WasteOrigin)",
"originUnitsPer1000m3Methane": "number",
"bmp": "number (Nm³ CH₄/kg VS)",
"waterPercentage": "number (0-100)",
"regulationNeeds": "string[] (array of regulation need codes)",
"regulationCharacteristicIds": "string[] (optional, references to RegulationCharacteristic)",
"regulatoryCharacteristics": {
"nitrogen": "number (optional)",
"ammoniacalNitrogen": "number (optional)",
"phosphorus": "number (optional)",
"potassium": "number (optional)",
"carbonNitrogenRatio": "number (optional)",
"arsenicElimination": "boolean (optional)",
"zincElimination": "boolean (optional)",
"aluminumElimination": "boolean (optional)",
"copperElimination": "boolean (optional)",
"heavyMetalsElimination": "boolean (optional)",
"pathogenElimination": "boolean (optional)",
"lowCNRatioEnrichment": "boolean (optional)",
"medicationElimination": "boolean (optional)",
"depositElimination": "boolean (optional)",
"odorElimination": "boolean (optional)",
"turbidityReduction": "boolean (optional)",
"sodiumReduction": "boolean (optional)",
"chlorineReduction": "boolean (optional)",
"electricalConductivityReduction": "boolean (optional)",
"sulfideElimination": "boolean (optional)",
"methaneElimination": "boolean (optional)",
"co2Elimination": "boolean (optional)",
"polyphenolElimination": "boolean (optional)",
"refractoryFractionsElimination": "boolean (optional)",
"microbiologicalCompetition": "boolean (optional)",
"oilEmulsification": "boolean (optional)",
"acidityReduction": "boolean (optional)",
"phIncrease": "boolean (optional)",
"phReduction": "boolean (optional)",
"phAdjustment": "number (optional, -14 to 14)"
},
"regulators": [
{
"regulatorId": "string (reference to NaturalRegulator)",
"percentage": "number (0-100, percentage of global volume)"
}
],
"maxStorageDuration": "number (days)",
"businessPlan": "BusinessPlan (optional)",
"notes": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.3 Natural Regulator Schema
{
"id": "string (UUID)",
"name": "string",
"type": "string",
"regulationCharacteristicIds": "string[] (optional, references to RegulationCharacteristic)",
"regulatoryCharacteristics": {
"nitrogen": "number (optional)",
"ammoniacalNitrogen": "number (optional)",
"phosphorus": "number (optional)",
"potassium": "number (optional)",
"carbonNitrogenRatio": "number (optional)",
"arsenicElimination": "boolean (optional)",
"zincElimination": "boolean (optional)",
"aluminumElimination": "boolean (optional)",
"copperElimination": "boolean (optional)",
"heavyMetalsElimination": "boolean (optional)",
"metalBinding": "boolean (optional)",
"pathogenReduction": "boolean (optional)",
"lowCNRatioEnrichment": "boolean (optional)",
"medicationElimination": "boolean (optional)",
"depositElimination": "boolean (optional)",
"odorElimination": "boolean (optional)",
"turbidityReduction": "boolean (optional)",
"sodiumReduction": "boolean (optional)",
"chlorineReduction": "boolean (optional)",
"electricalConductivityReduction": "boolean (optional)",
"sulfideElimination": "boolean (optional)",
"methaneElimination": "boolean (optional)",
"co2Elimination": "boolean (optional)",
"polyphenolElimination": "boolean (optional)",
"refractoryFractionsElimination": "boolean (optional)",
"microbiologicalCompetition": "boolean (optional)",
"oilEmulsification": "boolean (optional)",
"acidityReduction": "boolean (optional)",
"phIncrease": "boolean (optional)",
"phReduction": "boolean (optional)",
"phAdjustment": "number (optional, -14 to 14)"
},
"applicationConditions": "string",
"dosageRequirements": {
"min": "number",
"max": "number",
"unit": "string (kg/t|L/t|%)"
},
"businessPlan": "BusinessPlan (optional)",
"notes": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.4 Service Schema
{
"id": "string (UUID)",
"name": "string",
"type": "string (rawRental|biologicalTreatment|bitcoinManagement|fertilizers|wasteHeat|carbonCredits|brownfield|transport)",
"pricing": {
"year1": "number (€/module/year)",
"year2": "number (€/module/year)",
"year3": "number (€/module/year)",
"year4": "number (€/module/year)",
"year5": "number (€/module/year)",
"year6": "number (€/module/year)",
"year7": "number (€/module/year)",
"year8": "number (€/module/year)",
"year9": "number (€/module/year)",
"year10": "number (€/module/year)"
},
"businessPlan": "BusinessPlan (optional)",
"notes": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.5 WasteOrigin Schema
{
"id": "string (UUID)",
"name": "string",
"type": "string",
"subType": "string (optional)",
"description": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.6 Transporter Schema
{
"id": "string (UUID)",
"name": "string",
"type": "string",
"description": "string (optional)",
"contact": {
"name": "string",
"email": "string (optional)",
"phone": "string (optional)",
"address": "string (optional)"
},
"capacity": "string (e.g., '10 tons', '20 m³')",
"transportConditions": "string (e.g., 'refrigerated', 'hazardous materials')",
"businessPlan": "BusinessPlan (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.7 ModuleComponent Schema
{
"id": "string (UUID)",
"name": "string",
"type": "string (firstMethanization|waterEvaporation|bioremediationEcosystem1|bioremediationEcosystem2|bioremediationEcosystem3|secondMethanization|waterEvaporationComposting|waterUvcTreatment|waterStorage|spirulinaWaterStorage|solarPanels|bitcoinMining)",
"isOptional": "boolean",
"defaultDuration": "number",
"durationUnit": "string (days|hours)",
"waterConsumptionPerDay": {
"january": "number (optional)",
"february": "number (optional)",
"march": "number (optional)",
"april": "number (optional)",
"may": "number (optional)",
"june": "number (optional)",
"july": "number (optional)",
"august": "number (optional)",
"september": "number (optional)",
"october": "number (optional)",
"november": "number (optional)",
"december": "number (optional)"
},
"heatConsumptionPerDay": {
"january": "number (optional)",
"february": "number (optional)",
"march": "number (optional)",
"april": "number (optional)",
"may": "number (optional)",
"june": "number (optional)",
"july": "number (optional)",
"august": "number (optional)",
"september": "number (optional)",
"october": "number (optional)",
"november": "number (optional)",
"december": "number (optional)"
},
"powerConsumption": {
"kwh": "number (optional)",
"kw": "number (optional)"
},
"totalWetWasteCapacity": "number (optional, tons)",
"totalDryWasteCapacity": "number (optional, tons)",
"totalCompostCapacity": "number (optional, tons)",
"totalWaterCapacity": "number (optional, m³ or L)",
"methaneProduction": "number (optional, m³/day or m³/cycle)",
"addedBiomassProduction": "number (optional, tons/day or tons/cycle)",
"waterProduction": "number (optional, m³/day or L/day)",
"heatProduction": "number (optional, kJ/day or kWh/day)",
"immobilizationDuration": "number (optional, days)",
"wasteTypes": "string[] (optional, array of waste IDs)",
"dimensions": {
"length": "number (optional, meters)",
"height": "number (optional, meters)",
"width": "number (optional, meters)"
},
"groundSurface": "number (optional, m²)",
"heatNeedsPerDay": {
"january": "number (optional)",
"february": "number (optional)",
"march": "number (optional)",
"april": "number (optional)",
"may": "number (optional)",
"june": "number (optional)",
"july": "number (optional)",
"august": "number (optional)",
"september": "number (optional)",
"october": "number (optional)",
"november": "number (optional)",
"december": "number (optional)"
},
"coolingNeedsPerDay": {
"january": "number (optional)",
"february": "number (optional)",
"march": "number (optional)",
"april": "number (optional)",
"may": "number (optional)",
"june": "number (optional)",
"july": "number (optional)",
"august": "number (optional)",
"september": "number (optional)",
"october": "number (optional)",
"november": "number (optional)",
"december": "number (optional)"
},
"productionPower": {
"kwh": "number (optional)",
"kw": "number (optional)"
},
"annualExploitationETP": "number (optional, Full Time Equivalent)",
"annualMaintenanceETP": "number (optional, Full Time Equivalent)",
"annualSupervisionETP": "number (optional, Full Time Equivalent)",
"totalMaterialCost": "number (optional, CAPEX, €/year)",
"annualExploitationConsumablesCost": "number (optional, €/year)",
"annualMaintenanceConsumablesCost": "number (optional, €/year)",
"lifetime": "number (optional, years)",
"regulators": [
{
"regulatorId": "string (reference to NaturalRegulator)",
"percentage": "number (0-100, percentage of total volume)",
"dosage": "number (optional, specific dosage)"
}
],
"services": [
{
"serviceId": "string (reference to Service)",
"notes": "string (optional)"
}
],
"administrativeProcedures": [
{
"procedureId": "string (reference to AdministrativeProcedure)",
"status": "string (toDo|done|na)",
"notes": "string (optional)"
}
],
"regulationCharacteristicIds": "string[] (optional, references to RegulationCharacteristic)",
"businessPlan": "BusinessPlan (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.8 Ecosystem Schema
{
"id": "string (UUID)",
"name": "string",
"description": "string (optional)",
"primaryRegulationNeeds": [
"string (regulation need code)",
"string (regulation need code)",
"string (regulation need code)"
],
"regulationCharacteristicIds": "string[] (optional, references to RegulationCharacteristic)",
"regulators": [
{
"regulatorId": "string (reference to NaturalRegulator)",
"percentage": "number (0-100, percentage of contribution)",
"role": "string (primary|secondary|support)"
}
],
"effectiveness": {
"regulationNeedCode": "number (0-100, percentage effectiveness)"
},
"compatibleWasteTypes": "string[] (optional, array of waste IDs, empty means all)",
"applicationConditions": "string (optional)",
"treatmentDuration": "number (optional, days)",
"businessPlan": "BusinessPlan (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.9 RegulationCharacteristic Schema
{
"id": "string (UUID)",
"name": "string",
"code": "string (unique identifier, e.g., 'pathogenElimination', 'heavyMetalsElimination')",
"category": "string (nutrient|heavyMetal|biological|chemical|biologicalProcess|ph|other)",
"description": "string (optional)",
"unit": "string (optional, e.g., 'kg/t', '%', 'pH')",
"isBoolean": "boolean (true for capability/need, false for numeric value)",
"minValue": "number (optional, minimum value if numeric)",
"maxValue": "number (optional, maximum value if numeric)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.10 Treatment Site Schema
{
"id": "string (UUID)",
"name": "string",
"status": "string (toBeApproached|loiOk|inProgress|completed)",
"location": {
"address": "string (optional)",
"coordinates": {
"lat": "number (optional)",
"lng": "number (optional)"
}
},
"altitude": "number (meters)",
"availableGroundSurface": "number (m²)",
"monthlyTemperatures": [
"number (January, °C)",
"number (February, °C)",
"number (March, °C)",
"number (April, °C)",
"number (May, °C)",
"number (June, °C)",
"number (July, °C)",
"number (August, °C)",
"number (September, °C)",
"number (October, °C)",
"number (November, °C)",
"number (December, °C)"
],
"subscribedServices": "string[] (array of service IDs)",
"transporters": [
{
"transporterId": "string (reference to Transporter)",
"isPrimary": "boolean (optional)",
"notes": "string (optional)"
}
],
"investors": [
{
"investorId": "string (reference to Investor)",
"status": "string (toBeApproached|loiOk|inProgress|completed)",
"amount": "number (€)",
"notes": "string (optional)"
}
],
"administrativeProcedures": [
{
"procedureId": "string (reference to AdministrativeProcedure)",
"status": "string (toDo|done|na)",
"notes": "string (optional)"
}
],
"businessPlan": "BusinessPlan (optional)",
"notes": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.11 Waste Site Schema
{
"id": "string (UUID)",
"name": "string",
"type": "string",
"status": "string (toBeApproached|loiOk|inProgress|completed)",
"wasteType": "string (reference to waste ID)",
"quantityRange": {
"min": "number (t/day)",
"max": "number (t/day)"
},
"contact": {
"name": "string",
"email": "string (optional)",
"phone": "string (optional)",
"address": "string (optional)"
},
"collectionType": "string",
"distance": "number (km, from treatment site)",
"transporters": [
{
"transporterId": "string (reference to Transporter)",
"isPrimary": "boolean (optional)",
"notes": "string (optional)"
}
],
"businessPlan": "BusinessPlan (optional)",
"notes": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.12 Investor Schema
{
"id": "string (UUID)",
"name": "string",
"type": "string",
"amountRange": {
"min": "number (€)",
"max": "number (€)"
},
"geographicRegions": "string[]",
"wasteRange": {
"min": "number (t/day)",
"max": "number (t/day)"
},
"wasteTypes": "string[] (array of waste type IDs)",
"solarPanelsRange": {
"min": "number (kW)",
"max": "number (kW)"
},
"notes": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.13 Administrative Procedure Schema
{
"id": "string (UUID)",
"name": "string",
"type": "string (ICPE|spreading|other)",
"delays": "number (days)",
"contact": {
"name": "string",
"email": "string (optional)",
"phone": "string (optional)",
"organization": "string (optional)"
},
"regions": "string[]",
"businessPlan": "BusinessPlan (optional)",
"notes": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.14 Company Schema
{
"id": "string (UUID)",
"name": "string",
"legalName": "string (optional)",
"registrationNumber": "string (optional)",
"address": "string (optional)",
"contact": {
"email": "string (optional)",
"phone": "string (optional)",
"website": "string (optional)"
},
"businessPlan": "BusinessPlan (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
2.15 BusinessPlan Schema
{
"revenues": {
"rawRental": "number[] (10 years, €/year)",
"biologicalTreatment": "number[] (10 years, €/year)",
"bitcoinManagement": "number[] (10 years, €/year)",
"fertilizers": "number[] (10 years, €/year)",
"wasteHeat": "number[] (10 years, €/year)",
"carbonCredits": "number[] (10 years, €/year)",
"brownfield": "number[] (10 years, €/year)",
"transport": "number[] (10 years, €/year)",
"commercialPartnerships": "number[] (10 years, €/year)",
"other": "number[] (10 years, €/year)"
},
"variableCosts": {
"rentalServices": "number[] (10 years, €/year)",
"commissions": "number[] (10 years, €/year)",
"otherVariable": "number[] (10 years, €/year)",
"transport": "number[] (10 years, €/year)"
},
"fixedCosts": {
"salaries": "number[] (10 years, €/year)",
"marketing": "number[] (10 years, €/year)",
"rd": "number[] (10 years, €/year)",
"administrative": "number[] (10 years, €/year)",
"otherGeneral": "number[] (10 years, €/year)"
},
"investments": {
"equipment": "number[] (10 years, €/year)",
"technology": "number[] (10 years, €/year)",
"patents": "number[] (10 years, €/year)"
},
"useOfFunds": {
"productDevelopment": "number[] (10 years, €/year)",
"marketing": "number[] (10 years, €/year)",
"team": "number[] (10 years, €/year)",
"structure": "number[] (10 years, €/year)"
},
"kpis": {
"activeUsers": "number[] (10 years)",
"cac": "number[] (10 years, €)",
"ltv": "number[] (10 years, €)",
"breakEvenDays": "number[] (10 years)"
}
}
2.16 Project Schema
{
"id": "string (UUID)",
"name": "string",
"startDate": "ISO 8601 date string",
"endDate": "ISO 8601 date string",
"treatmentSiteId": "string (reference to treatment site)",
"collectionSiteIds": "string[] (array of waste site IDs)",
"numberOfModules": "number",
"transportBySite": "boolean",
"wasteCharacteristicsOverride": {
"wasteId": "string (optional, reference to waste)",
"bmp": "number (optional, override)",
"waterPercentage": "number (optional, override)",
"regulatoryNeeds": "string[] (optional, override)"
},
"administrativeProcedures": [
{
"procedureId": "string (reference to administrative procedure)",
"status": "string (toDo|done|na)"
}
],
"investments": [
{
"investorId": "string (reference to investor)",
"status": "string (toBeApproached|loiOk|inProgress|completed)",
"amount": "number (€)"
}
],
"businessPlan": "BusinessPlan (optional)",
"notes": "string (optional)",
"createdAt": "ISO 8601 date string",
"updatedAt": "ISO 8601 date string"
}
3. Relations Between Entities
3.1 Project Relations
Project (1) ──→ (1) TreatmentSite
Project (1) ──→ (N) WasteSite
Project (1) ──→ (N) AdministrativeProcedure (with status)
Project (1) ──→ (N) Investment (with investor reference and status)
Project (1) ──→ (1) Waste (optional override)
Project (1) ──→ (1) BusinessPlan (optional)
3.2 Treatment Site Relations
TreatmentSite (1) ──→ (N) Service (subscribed services)
TreatmentSite (1) ──→ (N) Project
TreatmentSite (1) ──→ (N) Transporter (with isPrimary flag)
TreatmentSite (1) ──→ (N) Investor (with status and amount)
TreatmentSite (1) ──→ (N) AdministrativeProcedure (with status)
TreatmentSite (1) ──→ (1) BusinessPlan (optional)
3.3 Waste Site Relations
WasteSite (1) ──→ (1) Waste (waste type)
WasteSite (N) ──→ (1) Project
WasteSite (1) ──→ (N) Transporter (with isPrimary flag)
WasteSite (1) ──→ (1) BusinessPlan (optional)
3.4 Waste Relations
Waste (N) ──→ (1) WasteOrigin (optional, allows n wastes to 1 origin)
Waste (1) ──→ (N) NaturalRegulator (with percentage of global volume)
Waste (1) ──→ (N) RegulationCharacteristic (via regulationCharacteristicIds)
Waste (1) ──→ (1) BusinessPlan (optional)
3.5 Natural Regulator Relations
NaturalRegulator (1) ──→ (N) RegulationCharacteristic (via regulationCharacteristicIds)
NaturalRegulator (1) ──→ (N) Waste (via WasteRegulatorAssociation)
NaturalRegulator (1) ──→ (N) Ecosystem (via EcosystemRegulatorAssociation)
NaturalRegulator (1) ──→ (N) ModuleComponent (via ModuleComponentRegulatorAssociation)
NaturalRegulator (1) ──→ (1) BusinessPlan (optional)
3.6 Module Component Relations
ModuleComponent (1) ──→ (N) NaturalRegulator (with percentage and optional dosage)
ModuleComponent (1) ──→ (N) Service (with optional notes)
ModuleComponent (1) ──→ (N) AdministrativeProcedure (with status and notes)
ModuleComponent (1) ──→ (N) RegulationCharacteristic (via regulationCharacteristicIds)
ModuleComponent (1) ──→ (N) Waste (compatible waste types)
ModuleComponent (1) ──→ (1) BusinessPlan (optional)
3.7 Ecosystem Relations
Ecosystem (1) ──→ (N) NaturalRegulator (with percentage and role)
Ecosystem (1) ──→ (N) RegulationCharacteristic (via regulationCharacteristicIds)
Ecosystem (1) ──→ (N) Waste (compatible waste types, optional, empty means all)
Ecosystem (1) ──→ (1) BusinessPlan (optional)
3.8 Service Relations
Service (N) ──→ (1) TreatmentSite (subscribed)
Service (N) ──→ (N) ModuleComponent (via ModuleComponentServiceAssociation)
Service (1) ──→ (1) BusinessPlan (optional)
3.9 Transporter Relations
Transporter (N) ──→ (1) TreatmentSite (via SiteTransporterAssociation)
Transporter (N) ──→ (1) WasteSite (via SiteTransporterAssociation)
Transporter (1) ──→ (1) BusinessPlan (optional)
3.10 Investor Relations
Investor (1) ──→ (N) Investment (in projects)
Investor (1) ──→ (N) Waste (waste type preferences)
Investor (N) ──→ (1) TreatmentSite (via TreatmentSiteInvestorAssociation)
3.11 Administrative Procedure Relations
AdministrativeProcedure (1) ──→ (N) Project (with status per project)
AdministrativeProcedure (1) ──→ (N) TreatmentSite (via TreatmentSiteProcedureAssociation)
AdministrativeProcedure (1) ──→ (N) ModuleComponent (via ModuleComponentProcedureAssociation)
AdministrativeProcedure (1) ──→ (1) BusinessPlan (optional)
3.12 RegulationCharacteristic Relations
RegulationCharacteristic (1) ──→ (N) Waste (via regulationCharacteristicIds)
RegulationCharacteristic (1) ──→ (N) NaturalRegulator (via regulationCharacteristicIds)
RegulationCharacteristic (1) ──→ (N) Ecosystem (via regulationCharacteristicIds)
RegulationCharacteristic (1) ──→ (N) ModuleComponent (via regulationCharacteristicIds)
3.13 Company Relations
Company (1) ──→ (1) BusinessPlan (optional)
4. Data Validation Rules
4.1 Required Fields
- All entities must have:
id,createdAt - Projects must have:
name,startDate,endDate,treatmentSiteId,numberOfModules - Wastes must have:
name,bmp,waterPercentage,regulationNeeds - Services must have:
name,type,pricing(all 10 years) - Natural Regulators must have:
name,type,applicationConditions,dosageRequirements - Module Components must have:
name,type,isOptional,defaultDuration,durationUnit - Ecosystems must have:
name,primaryRegulationNeeds(exactly 3),regulators,effectiveness - Regulation Characteristics must have:
name,code,category - Companies must have:
name
4.2 Value Constraints
waterPercentage: 0-100bmp: > 0numberOfModules: > 0startDate<endDate- All monetary values: >= 0
- All quantities: >= 0
- Regulator percentages in WasteRegulatorAssociation: 0-100, total <= 100
- Regulator percentages in EcosystemRegulatorAssociation: 0-100, total should equal 100
- Regulator percentages in ModuleComponentRegulatorAssociation: 0-100, total <= 100
- Effectiveness values: 0-100
- pH adjustment: -14 to 14
primaryRegulationNeedsin Ecosystem: exactly 3 unique values
4.3 Reference Integrity
treatmentSiteIdmust exist intreatmentSitescollectionSiteIdsmust exist inwasteSiteswasteIdin wasteCharacteristicsOverride must exist inwastes- All
procedureIdmust exist inadministrativeProcedures - All
investorIdmust exist ininvestors - All
serviceIdin subscribedServices must exist inservices - All
regulatorIdin associations must exist inregulators - All
transporterIdin associations must exist intransporters - All
wasteOriginIdmust exist inwasteOrigins - All
regulationCharacteristicIdsmust exist inregulationCharacteristics - All
wasteTypein WasteSite must exist inwastes - All
wasteTypesin ModuleComponent and Ecosystem must exist inwastes
5. Import/Export Format
5.1 Export
- Export complete storage structure as JSON
- Include all entities
- Include version number
- Include lastModified timestamp
5.2 Import
- Replace entire storage with imported JSON
- Validate structure
- Validate references
- Validate constraints
- If validation fails, keep existing data and show error
5.3 Import Validation
- Check JSON structure validity
- Check version compatibility
- Validate all required fields
- Validate all value constraints
- Validate all reference integrity
- If any validation fails, reject import and show detailed errors
6. Data Storage Keys
6.1 LocalStorage Keys
"4nkwaste_simulator_data" - Complete application data (JSON string)
"4nkwaste_simulator_user" - Current user session
"4nkwaste_simulator_version" - Data version
6.2 IndexedDB Structure (if used)
Database: "4nkwaste_simulator"
- ObjectStore: "wastes"
- ObjectStore: "regulators"
- ObjectStore: "services"
- ObjectStore: "wasteOrigins"
- ObjectStore: "transporters"
- ObjectStore: "moduleComponents"
- ObjectStore: "ecosystems"
- ObjectStore: "regulationCharacteristics"
- ObjectStore: "treatmentSites"
- ObjectStore: "wasteSites"
- ObjectStore: "investors"
- ObjectStore: "administrativeProcedures"
- ObjectStore: "companies"
- ObjectStore: "projects"
- ObjectStore: "users"
7. Business Plan Aggregation
Business plans can be associated with multiple entities:
- Waste: Business plan for waste-specific operations
- NaturalRegulator: Business plan for regulator-specific operations
- Service: Business plan for service-specific operations
- Transporter: Business plan for transport operations
- ModuleComponent: Business plan for component-specific operations
- Ecosystem: Business plan for ecosystem-specific operations
- TreatmentSite: Business plan for site-specific operations
- WasteSite: Business plan for waste site operations
- AdministrativeProcedure: Business plan for procedure-related operations
- Company: Business plan for company-level operations
- Project: Business plan for project-level operations
The Yields page aggregates all business plans from entities associated with a project:
- Project's own business plan
- Treatment Site's business plan
- All Waste Sites' business plans
- All Module Components' business plans (if used in the project)
- All Services' business plans (if subscribed)
- Company's business plan (if applicable)