25 KiB
Data Model
This document describes the current data models implemented in the Calminer application, including SQLAlchemy ORM models and Pydantic schemas for API validation and serialization.
SQLAlchemy Models
User Management
User
Represents authenticated platform users with optional elevated privileges.
Table: users
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| String(255) | Unique email address | |
| username | String(128) | Unique username |
| password_hash | String(255) | Argon2 hashed password |
| is_active | Boolean | Account activation status |
| is_superuser | Boolean | Superuser privileges |
| last_login_at | DateTime | Last login timestamp |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
role_assignments: Many-to-many with Role via UserRoleroles: Many-to-many with Role (viewonly)
Role
Role encapsulating a set of permissions.
Table: roles
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| name | String(64) | Unique role name |
| display_name | String(128) | Human-readable name |
| description | Text | Role description |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
assignments: One-to-many with UserRoleusers: Many-to-many with User (viewonly)
UserRole
Association between users and roles with assignment metadata.
Table: user_roles
| Attribute | Type | Description |
|---|---|---|
| user_id | Integer (FK → users.id) | User foreign key |
| role_id | Integer (FK → roles.id) | Role foreign key |
| granted_at | DateTime | Assignment timestamp |
| granted_by | Integer (FK → users.id) | Granting user |
Relationships:
user: Many-to-one with Userrole: Many-to-one with Rolegranted_by_user: Many-to-one with User
Project Management
Project
Top-level mining project grouping multiple scenarios.
Table: projects
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| name | String(255) | Unique project name |
| location | String(255) | Project location |
| operation_type | MiningOperationType | Mining operation type |
| description | Text | Project description |
| pricing_settings_id | Integer (FK → pricing_settings.id) | Pricing settings |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
scenarios: One-to-many with Scenariopricing_settings: Many-to-one with PricingSettings
Scenario
A specific configuration of assumptions for a project.
Table: scenarios
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| project_id | Integer (FK → projects.id) | Project foreign key |
| name | String(255) | Scenario name |
| description | Text | Scenario description |
| status | ScenarioStatus | Scenario lifecycle status |
| start_date | Date | Scenario start date |
| end_date | Date | Scenario end date |
| discount_rate | Numeric(5,2) | Discount rate percentage |
| currency | String(3) | ISO currency code |
| primary_resource | ResourceType | Primary resource type |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
project: Many-to-one with Projectfinancial_inputs: One-to-many with FinancialInputsimulation_parameters: One-to-many with SimulationParameter
FinancialInput
Line-item financial assumption attached to a scenario.
Table: financial_inputs
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| scenario_id | Integer (FK → scenarios.id) | Scenario foreign key |
| name | String(255) | Input name |
| category | FinancialCategory | Financial category |
| cost_bucket | CostBucket | Cost bucket classification |
| amount | Numeric(18,2) | Monetary amount |
| currency | String(3) | ISO currency code |
| effective_date | Date | Effective date |
| notes | Text | Additional notes |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
scenario: Many-to-one with Scenario
SimulationParameter
Probability distribution settings for scenario simulations.
Table: simulation_parameters
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| scenario_id | Integer (FK → scenarios.id) | Scenario foreign key |
| name | String(255) | Parameter name |
| distribution | DistributionType | Distribution type |
| variable | StochasticVariable | Stochastic variable type |
| resource_type | ResourceType | Resource type |
| mean_value | Numeric(18,4) | Mean value |
| standard_deviation | Numeric(18,4) | Standard deviation |
| minimum_value | Numeric(18,4) | Minimum value |
| maximum_value | Numeric(18,4) | Maximum value |
| unit | String(32) | Unit of measurement |
| configuration | JSON | Additional configuration |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
scenario: Many-to-one with Scenario
Pricing Configuration
PricingSettings
Persisted pricing defaults applied to scenario evaluations.
Table: pricing_settings
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| name | String(128) | Unique settings name |
| slug | String(64) | Unique slug identifier |
| description | Text | Settings description |
| default_currency | String(3) | Default ISO currency code |
| default_payable_pct | Numeric(5,2) | Default payable percentage |
| moisture_threshold_pct | Numeric(5,2) | Moisture threshold percentage |
| moisture_penalty_per_pct | Numeric(14,4) | Moisture penalty per percent |
| metadata_payload | JSON | Additional metadata |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
metal_overrides: One-to-many with PricingMetalSettingsimpurity_overrides: One-to-many with PricingImpuritySettingsprojects: One-to-many with Project
PricingMetalSettings
Contract-specific overrides for a particular metal.
Table: pricing_metal_settings
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| pricing_settings_id | Integer (FK → pricing_settings.id) | Pricing settings foreign key |
| metal_code | String(32) | Metal code |
| payable_pct | Numeric(5,2) | Payable percentage |
| moisture_threshold_pct | Numeric(5,2) | Moisture threshold |
| moisture_penalty_per_pct | Numeric(14,4) | Moisture penalty |
| data | JSON | Additional data |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
pricing_settings: Many-to-one with PricingSettings
PricingImpuritySettings
Impurity penalty thresholds associated with pricing settings.
Table: pricing_impurity_settings
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| pricing_settings_id | Integer (FK → pricing_settings.id) | Pricing settings foreign key |
| impurity_code | String(32) | Impurity code |
| threshold_ppm | Numeric(14,4) | Threshold in ppm |
| penalty_per_ppm | Numeric(14,4) | Penalty per ppm |
| notes | Text | Additional notes |
| created_at | DateTime | Creation timestamp |
| updated_at | DateTime | Last update timestamp |
Relationships:
pricing_settings: Many-to-one with PricingSettings
Monitoring and Auditing
PerformanceMetric
Performance metrics for monitoring system health.
Table: performance_metrics
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| timestamp | DateTime | Metric timestamp |
| metric_name | String | Metric name |
| value | Float | Metric value |
| labels | String | JSON string of labels |
| endpoint | String | API endpoint |
| method | String | HTTP method |
| status_code | Integer | HTTP status code |
| duration_seconds | Float | Request duration |
ImportExportLog
Audit log for import and export operations.
Table: import_export_logs
| Attribute | Type | Description |
|---|---|---|
| id | Integer (PK) | Primary key |
| action | String(32) | Action type (preview, commit, export) |
| dataset | String(32) | Dataset type (projects, scenarios) |
| status | String(16) | Operation status |
| filename | String(255) | File name |
| row_count | Integer | Number of rows |
| detail | Text | Additional details |
| user_id | Integer (FK → users.id) | User foreign key |
| created_at | DateTime | Creation timestamp |
Enumerations
MiningOperationType
Supported mining operation categories.
OPEN_PIT: Open pit miningUNDERGROUND: Underground miningIN_SITU_LEACH: In-situ leachingPLACER: Placer miningQUARRY: Quarry operationsMOUNTAINTOP_REMOVAL: Mountaintop removalOTHER: Other operations
ScenarioStatus
Lifecycle states for project scenarios.
DRAFT: Draft statusACTIVE: Active statusARCHIVED: Archived status
FinancialCategory
Enumeration of cost and revenue classifications.
CAPITAL_EXPENDITURE: Capital expendituresOPERATING_EXPENDITURE: Operating expendituresREVENUE: RevenueCONTINGENCY: ContingencyOTHER: Other
DistributionType
Supported stochastic distribution families for simulations.
NORMAL: Normal distributionTRIANGULAR: Triangular distributionUNIFORM: Uniform distributionLOGNORMAL: Lognormal distributionCUSTOM: Custom distribution
ResourceType
Primary consumables and resources used in mining operations.
DIESEL: Diesel fuelELECTRICITY: Electrical powerWATER: Process waterEXPLOSIVES: Blasting agentsREAGENTS: Processing reagentsLABOR: Direct laborEQUIPMENT_HOURS: Equipment operating hoursTAILINGS_CAPACITY: Tailings storage
CostBucket
Granular cost buckets aligned with project accounting.
CAPITAL_INITIAL: Initial capitalCAPITAL_SUSTAINING: Sustaining capitalOPERATING_FIXED: Fixed operating costsOPERATING_VARIABLE: Variable operating costsMAINTENANCE: Maintenance costsRECLAMATION: Reclamation costsROYALTIES: RoyaltiesGENERAL_ADMIN: General and administrative
StochasticVariable
Domain variables that typically require probabilistic modelling.
ORE_GRADE: Ore grade variabilityRECOVERY_RATE: Metallurgical recoveryMETAL_PRICE: Commodity priceOPERATING_COST: Operating cost per tonneCAPITAL_COST: Capital costDISCOUNT_RATE: Discount rateTHROUGHPUT: Plant throughput
Pydantic Schemas
Authentication Schemas (schemas/auth.py)
RegistrationForm
Form model for user registration.
| Field | Type | Validation |
|---|---|---|
| username | str | 3-128 characters |
| str | Valid email format, 5-255 chars | |
| password | str | 8-256 characters |
| confirm_password | str | Must match password |
LoginForm
Form model for user login.
| Field | Type | Validation |
|---|---|---|
| username | str | 1-255 characters |
| password | str | 1-256 characters |
PasswordResetRequestForm
Form model for password reset request.
| Field | Type | Validation |
|---|---|---|
| str | Valid email format, 5-255 chars |
PasswordResetForm
Form model for password reset.
| Field | Type | Validation |
|---|---|---|
| token | str | Required |
| password | str | 8-256 characters |
| confirm_password | str | Must match password |
Project Schemas (schemas/project.py)
ProjectBase
Base schema for project data.
| Field | Type | Description |
|---|---|---|
| name | str | Project name |
| location | str | None | Project location |
| operation_type | MiningOperationType | Mining operation type |
| description | str | None | Project description |
ProjectCreate
Schema for creating projects (inherits ProjectBase).
ProjectUpdate
Schema for updating projects.
| Field | Type | Description |
|---|---|---|
| name | str | None | Project name |
| location | str | None | Project location |
| operation_type | MiningOperationType | None | Mining operation type |
| description | str | None | Project description |
ProjectRead
Schema for reading projects (inherits ProjectBase).
| Field | Type | Description |
|---|---|---|
| id | int | Project ID |
| created_at | datetime | Creation timestamp |
| updated_at | datetime | Update timestamp |
Scenario Schemas (schemas/scenario.py)
ScenarioBase
Base schema for scenario data.
| Field | Type | Description |
|---|---|---|
| name | str | Scenario name |
| description | str | None | Scenario description |
| status | ScenarioStatus | Scenario status (default: DRAFT) |
| start_date | date | None | Start date |
| end_date | date | None | End date |
| discount_rate | float | None | Discount rate |
| currency | str | None | ISO currency code |
| primary_resource | ResourceType | None | Primary resource |
ScenarioCreate
Schema for creating scenarios (inherits ScenarioBase).
ScenarioUpdate
Schema for updating scenarios.
| Field | Type | Description |
|---|---|---|
| name | str | None | Scenario name |
| description | str | None | Scenario description |
| status | ScenarioStatus | None | Scenario status |
| start_date | date | None | Start date |
| end_date | date | None | End date |
| discount_rate | float | None | Discount rate |
| currency | str | None | ISO currency code |
| primary_resource | ResourceType | None | Primary resource |
ScenarioRead
Schema for reading scenarios (inherits ScenarioBase).
| Field | Type | Description |
|---|---|---|
| id | int | Scenario ID |
| project_id | int | Project ID |
| created_at | datetime | Creation timestamp |
| updated_at | datetime | Update timestamp |
ScenarioComparisonRequest
Schema for scenario comparison requests.
| Field | Type | Description |
|---|---|---|
| scenario_ids | list[int] | List of scenario IDs (minimum 2 unique) |
ScenarioComparisonResponse
Schema for scenario comparison responses.
| Field | Type | Description |
|---|---|---|
| project_id | int | Project ID |
| scenarios | list[ScenarioRead] | List of scenario data |
Import Schemas (schemas/imports.py)
ProjectImportRow
Schema for importing project data.
| Field | Type | Description |
|---|---|---|
| name | str | Project name (required) |
| location | str | None | Project location |
| operation_type | MiningOperationType | Mining operation type |
| description | str | None | Project description |
| created_at | datetime | None | Creation timestamp |
| updated_at | datetime | None | Update timestamp |
ScenarioImportRow
Schema for importing scenario data.
| Field | Type | Description |
|---|---|---|
| project_name | str | Project name (required) |
| name | str | Scenario name (required) |
| status | ScenarioStatus | Scenario status (default: DRAFT) |
| start_date | date | None | Start date |
| end_date | date | None | End date |
| discount_rate | float | None | Discount rate |
| currency | str | None | ISO currency code |
| primary_resource | ResourceType | None | Primary resource |
| description | str | None | Scenario description |
| created_at | datetime | None | Creation timestamp |
| updated_at | datetime | None | Update timestamp |
Export Schemas (schemas/exports.py)
ExportFormat
Enumeration for export formats.
CSV: CSV formatXLSX: Excel format
BaseExportRequest
Base schema for export requests.
| Field | Type | Description |
|---|---|---|
| format | ExportFormat | Export format (default: CSV) |
| include_metadata | bool | Include metadata (default: False) |
ProjectExportRequest
Schema for project export requests (inherits BaseExportRequest).
| Field | Type | Description |
|---|---|---|
| filters | ProjectExportFilters | None | Export filters |
ScenarioExportRequest
Schema for scenario export requests (inherits BaseExportRequest).
| Field | Type | Description |
|---|---|---|
| filters | ScenarioExportFilters | None | Export filters |
ExportTicket
Schema for export tickets.
| Field | Type | Description |
|---|---|---|
| token | str | Export token |
| format | ExportFormat | Export format |
| resource | Literal["projects", "scenarios"] | Resource type |
ExportResponse
Schema for export responses.
| Field | Type | Description |
|---|---|---|
| ticket | ExportTicket | Export ticket |
Discrepancies Between Data Models and Pydantic Schemas
Missing Pydantic Schemas
The following SQLAlchemy models do not have corresponding Pydantic schemas:
User- Authentication handled through forms, not API schemasRole- Role management not exposed via APIUserRole- User-role associations not exposed via APIFinancialInput- Financial inputs managed through scenario contextSimulationParameter- Simulation parameters managed through scenario contextPricingSettings- Pricing settings managed through project contextPricingMetalSettings- Pricing overrides managed through settings contextPricingImpuritySettings- Pricing overrides managed through settings contextPerformanceMetric- Metrics not exposed via APIImportExportLog- Audit logs not exposed via API
Schema Differences
- Project schemas include
operation_typeas required enum, while the model allows null but defaults toOTHER - Scenario schemas include currency normalization validation not present in the model validator
- Import schemas include extensive validation and coercion logic for CSV/Excel data parsing
- Export schemas reference filter classes (
ProjectExportFilters,ScenarioExportFilters) not defined in this document
Additional Validation
Pydantic schemas include additional validation beyond SQLAlchemy model constraints:
- Email format validation in auth forms
- Password confirmation matching
- Currency code normalization and validation
- Date range validation (end_date >= start_date)
- Required field validation for imports
- Enum value coercion with aliases for imports
This documentation reflects the current implementation as of the latest development cycle.