from __future__ import annotations from typing import ClassVar, Optional from sqlmodel import Field, SQLModel from domain.modelling.scenario import Scenario class ScenarioRow(SQLModel, table=True): """SQLModel mirror of the live ``scenario`` table (ADR-0017). Declares only the columns the Modelling stage reads — the legacy file-path columns (`trigger_file_path`, `exclusions`, …) and the portfolio-level aggregates are left to the legacy SQLAlchemy model (`backend/app/db/models/recommendations.py::ScenarioModel`), which still owns the live reads. The physical table is the shared contract; this mirror is read-only from the rebuild's side. `goal` is a Postgres enum in production; mapped here as its string value (the Modelling stage does not yet branch on it — #1160). """ __tablename__: ClassVar[str] = "scenario" # pyright: ignore[reportIncompatibleVariableOverride] id: Optional[int] = Field(default=None, primary_key=True) goal: str goal_value: str budget: Optional[float] = Field(default=None) is_default: bool = Field(default=False) def to_domain(self) -> Scenario: if self.id is None: raise ValueError("scenario row has no id") return Scenario( id=self.id, goal=self.goal, goal_value=self.goal_value, budget=self.budget, is_default=self.is_default, )