feat: enhance database models with metadata and new resource types

This commit is contained in:
2025-11-09 16:54:46 +01:00
parent 203a5d08f2
commit 32a96a27c5
6 changed files with 213 additions and 2 deletions

View File

@@ -4,6 +4,18 @@ from datetime import date, datetime
from enum import Enum
from typing import TYPE_CHECKING
from sqlalchemy import (
Date,
DateTime,
Enum as SQLEnum,
ForeignKey,
Integer,
Numeric,
String,
Text,
)
from sqlalchemy.orm import Mapped, mapped_column, relationship, validates
from sqlalchemy import (
Date,
DateTime,
@@ -18,6 +30,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.sql import func
from config.database import Base
from .metadata import CostBucket
if TYPE_CHECKING: # pragma: no cover
from .scenario import Scenario
@@ -46,6 +59,9 @@ class FinancialInput(Base):
category: Mapped[FinancialCategory] = mapped_column(
SQLEnum(FinancialCategory), nullable=False
)
cost_bucket: Mapped[CostBucket | None] = mapped_column(
SQLEnum(CostBucket), nullable=True
)
amount: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False)
currency: Mapped[str | None] = mapped_column(String(3), nullable=True)
effective_date: Mapped[date | None] = mapped_column(Date, nullable=True)
@@ -59,5 +75,14 @@ class FinancialInput(Base):
scenario: Mapped["Scenario"] = relationship("Scenario", back_populates="financial_inputs")
@validates("currency")
def _validate_currency(self, key: str, value: str | None) -> str | None:
if value is None:
return value
value = value.upper()
if len(value) != 3:
raise ValueError("Currency code must be a 3-letter ISO 4217 value")
return value
def __repr__(self) -> str: # pragma: no cover
return f"FinancialInput(id={self.id!r}, scenario_id={self.scenario_id!r}, name={self.name!r})"