**Motivations :** * Create a complete simulator for 4NK Waste & Water modular waste treatment infrastructure * Implement frontend-only application with client-side data persistence * Provide seed data for wastes and natural regulators from specifications **Root causes :** * Need for a simulation tool to configure and manage waste treatment projects * Requirement for localhost-only access with persistent client-side storage * Need for initial seed data to bootstrap the application **Correctifs :** * Implemented authentication system with AuthContext * Fixed login/logout functionality with proper state management * Created placeholder pages for all routes **Evolutions :** * Complete application structure with React, TypeScript, and Vite * Seed data for 9 waste types and 52 natural regulators * Settings page with import/export and seed data loading functionality * Configuration pages for wastes and regulators with CRUD operations * Project management pages structure * Business plan and yields pages placeholders * Comprehensive UI/UX design system (dark mode only) * Navigation system with sidebar and header **Page affectées :** * All pages: Login, Dashboard, Waste Configuration, Regulators Configuration, Services Configuration * Project pages: Project List, Project Configuration, Treatment Sites, Waste Sites, Investors, Administrative Procedures * Analysis pages: Yields, Business Plan * Utility pages: Settings, Help * Components: Layout, Sidebar, Header, base components (Button, Input, Select, Card, Badge, Table) * Utils: Storage, seed data, formatters, validators, constants * Types: Complete TypeScript definitions for all entities
263 lines
5.6 KiB
TypeScript
263 lines
5.6 KiB
TypeScript
// Base entity types
|
|
export interface BaseEntity {
|
|
id: string
|
|
createdAt: string
|
|
updatedAt?: string
|
|
notes?: string
|
|
}
|
|
|
|
// User
|
|
export interface User extends BaseEntity {
|
|
username: string
|
|
password: string
|
|
lastLogin?: string
|
|
}
|
|
|
|
// Waste
|
|
export interface Waste extends BaseEntity {
|
|
name: string
|
|
originType: 'animals' | 'markets' | 'restaurants' | 'other'
|
|
originSubType?: string
|
|
originUnitsPer1000m3Methane: number
|
|
bmp: number // Nm³ CH₄/kg VS
|
|
waterPercentage: number // 0-100
|
|
regulationNeeds: string[]
|
|
regulatoryCharacteristics?: {
|
|
nitrogen?: number
|
|
phosphorus?: number
|
|
potassium?: number
|
|
carbonNitrogenRatio?: number
|
|
}
|
|
maxStorageDuration: number // days
|
|
}
|
|
|
|
// Natural Regulator
|
|
export interface NaturalRegulator extends BaseEntity {
|
|
name: string
|
|
type: string
|
|
regulatoryCharacteristics?: {
|
|
nitrogen?: number
|
|
phosphorus?: number
|
|
potassium?: number
|
|
carbonNitrogenRatio?: number
|
|
phAdjustment?: number // -14 to 14
|
|
metalBinding?: boolean
|
|
pathogenReduction?: boolean
|
|
}
|
|
applicationConditions: string
|
|
dosageRequirements: {
|
|
min: number
|
|
max: number
|
|
unit: 'kg/t' | 'L/t' | '%'
|
|
}
|
|
}
|
|
|
|
// Service
|
|
export type ServiceType =
|
|
| 'rawRental'
|
|
| 'biologicalTreatment'
|
|
| 'bitcoinManagement'
|
|
| 'fertilizers'
|
|
| 'wasteHeat'
|
|
| 'carbonCredits'
|
|
| 'brownfield'
|
|
| 'transport'
|
|
|
|
export interface Service extends BaseEntity {
|
|
name: string
|
|
type: ServiceType
|
|
pricing: {
|
|
year1: number
|
|
year2: number
|
|
year3: number
|
|
year4: number
|
|
year5: number
|
|
year6: number
|
|
year7: number
|
|
year8: number
|
|
year9: number
|
|
year10: number
|
|
}
|
|
}
|
|
|
|
// Treatment Site
|
|
export type SiteStatus = 'toBeApproached' | 'loiOk' | 'inProgress' | 'completed'
|
|
|
|
export interface TreatmentSite extends BaseEntity {
|
|
name: string
|
|
status: SiteStatus
|
|
location?: {
|
|
address?: string
|
|
coordinates?: {
|
|
lat: number
|
|
lng: number
|
|
}
|
|
}
|
|
altitude: number // meters
|
|
availableGroundSurface: number // m²
|
|
monthlyTemperatures: number[] // 12 values, °C
|
|
subscribedServices: string[] // service IDs
|
|
}
|
|
|
|
// Waste Site
|
|
export interface WasteSite extends BaseEntity {
|
|
name: string
|
|
type: string
|
|
status: SiteStatus
|
|
wasteType: string // waste ID
|
|
quantityRange: {
|
|
min: number // t/day
|
|
max: number // t/day
|
|
}
|
|
contact: {
|
|
name: string
|
|
email?: string
|
|
phone?: string
|
|
address?: string
|
|
}
|
|
collectionType: string
|
|
distance: number // km
|
|
}
|
|
|
|
// Investor
|
|
export interface Investor extends BaseEntity {
|
|
name: string
|
|
type: string
|
|
amountRange: {
|
|
min: number // €
|
|
max: number // €
|
|
}
|
|
geographicRegions: string[]
|
|
wasteRange: {
|
|
min: number // t/day
|
|
max: number // t/day
|
|
}
|
|
wasteTypes: string[] // waste IDs
|
|
solarPanelsRange: {
|
|
min: number // kW
|
|
max: number // kW
|
|
}
|
|
}
|
|
|
|
// Administrative Procedure
|
|
export type ProcedureType = 'ICPE' | 'spreading' | 'other'
|
|
export type ProcedureStatus = 'toDo' | 'done' | 'na'
|
|
|
|
export interface AdministrativeProcedure extends BaseEntity {
|
|
name: string
|
|
type: ProcedureType
|
|
delays: number // days
|
|
contact: {
|
|
name: string
|
|
email?: string
|
|
phone?: string
|
|
organization?: string
|
|
}
|
|
regions: string[]
|
|
}
|
|
|
|
// Project
|
|
export interface ProjectAdministrativeProcedure {
|
|
procedureId: string
|
|
status: ProcedureStatus
|
|
}
|
|
|
|
export interface ProjectInvestment {
|
|
investorId: string
|
|
status: SiteStatus
|
|
amount: number // €
|
|
}
|
|
|
|
export interface WasteCharacteristicsOverride {
|
|
wasteId?: string
|
|
bmp?: number
|
|
waterPercentage?: number
|
|
regulatoryNeeds?: string[]
|
|
}
|
|
|
|
export interface BusinessPlanRevenues {
|
|
rawRental: number[] // 10 years, €/year
|
|
biologicalTreatment: number[]
|
|
bitcoinManagement: number[]
|
|
fertilizers: number[]
|
|
wasteHeat: number[]
|
|
carbonCredits: number[]
|
|
brownfield: number[]
|
|
transport: number[]
|
|
commercialPartnerships: number[]
|
|
other: number[]
|
|
}
|
|
|
|
export interface BusinessPlanVariableCosts {
|
|
rentalServices: number[] // 10 years, €/year
|
|
commissions: number[]
|
|
otherVariable: number[]
|
|
transport: number[]
|
|
}
|
|
|
|
export interface BusinessPlanFixedCosts {
|
|
salaries: number[] // 10 years, €/year
|
|
marketing: number[]
|
|
rd: number[]
|
|
administrative: number[]
|
|
otherGeneral: number[]
|
|
}
|
|
|
|
export interface BusinessPlanInvestments {
|
|
equipment: number[] // 10 years, €/year
|
|
technology: number[]
|
|
patents: number[]
|
|
}
|
|
|
|
export interface BusinessPlanUseOfFunds {
|
|
productDevelopment: number[] // 10 years, €/year
|
|
marketing: number[]
|
|
team: number[]
|
|
structure: number[]
|
|
}
|
|
|
|
export interface BusinessPlanKPIs {
|
|
activeUsers: number[] // 10 years
|
|
cac: number[] // €
|
|
ltv: number[] // €
|
|
breakEvenDays: number[]
|
|
}
|
|
|
|
export interface BusinessPlan {
|
|
revenues: BusinessPlanRevenues
|
|
variableCosts: BusinessPlanVariableCosts
|
|
fixedCosts: BusinessPlanFixedCosts
|
|
investments: BusinessPlanInvestments
|
|
useOfFunds: BusinessPlanUseOfFunds
|
|
kpis: BusinessPlanKPIs
|
|
}
|
|
|
|
export interface Project extends BaseEntity {
|
|
name: string
|
|
startDate: string // ISO 8601
|
|
endDate: string // ISO 8601
|
|
treatmentSiteId: string
|
|
collectionSiteIds: string[]
|
|
numberOfModules: number
|
|
transportBySite: boolean
|
|
wasteCharacteristicsOverride?: WasteCharacteristicsOverride
|
|
administrativeProcedures: ProjectAdministrativeProcedure[]
|
|
investments: ProjectInvestment[]
|
|
businessPlan?: BusinessPlan
|
|
}
|
|
|
|
// Storage structure
|
|
export interface StorageData {
|
|
version: string
|
|
lastModified: string
|
|
users: User[]
|
|
wastes: Waste[]
|
|
regulators: NaturalRegulator[]
|
|
services: Service[]
|
|
treatmentSites: TreatmentSite[]
|
|
wasteSites: WasteSite[]
|
|
investors: Investor[]
|
|
administrativeProcedures: AdministrativeProcedure[]
|
|
projects: Project[]
|
|
}
|