diff --git a/backend/app/db/models/recommendations.py b/backend/app/db/models/recommendations.py index 928c96bd..36872394 100644 --- a/backend/app/db/models/recommendations.py +++ b/backend/app/db/models/recommendations.py @@ -11,6 +11,8 @@ from sqlalchemy import ( ) from sqlalchemy.orm import declarative_base, Mapped, mapped_column from sqlalchemy.sql import func +from datetime import datetime + from backend.app.db.models.portfolio import Portfolio, PropertyModel from backend.app.db.models.materials import Material from backend.app.db.models.portfolio import Epc @@ -140,47 +142,57 @@ class PlanRecommendations(Base): class Scenario(Base): __tablename__ = "scenario" - id = Column(BigInteger, primary_key=True, autoincrement=True) - name = Column(String, nullable=False) - created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) - budget = Column(Float) - portfolio_id = Column(BigInteger, ForeignKey(Portfolio.id), nullable=False) - housing_type = Column(String, nullable=False) - goal = Column(String, nullable=False) - goal_value = Column(String, nullable=False) - trigger_file_path = Column(String, nullable=False) - already_installed_file_path = Column(String) - patches_file_path = Column(String) - non_invasive_recommendations_file_path = Column(String) - exclusions = Column(String) - multi_plan = Column(Boolean, default=False) - is_default = Column(Boolean, default=False, nullable=False) + id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True) + name: Mapped[str] = mapped_column(String, nullable=False) + created_at: Mapped[datetime] = mapped_column( + TIMESTAMP, nullable=False, server_default=func.now() + ) + budget: Mapped[Optional[float]] = mapped_column(Float) + portfolio_id: Mapped[int] = mapped_column( + BigInteger, ForeignKey(Portfolio.id), nullable=False + ) + housing_type: Mapped[str] = mapped_column(String, nullable=False) + goal: Mapped[str] = mapped_column(String, nullable=False) + goal_value: Mapped[str] = mapped_column(String, nullable=False) + trigger_file_path: Mapped[str] = mapped_column(String, nullable=False) + already_installed_file_path: Mapped[Optional[str]] = mapped_column(String) + patches_file_path: Mapped[Optional[str]] = mapped_column(String) + non_invasive_recommendations_file_path: Mapped[Optional[str]] = mapped_column( + String + ) + exclusions: Mapped[Optional[str]] = mapped_column(String) + multi_plan: Mapped[bool] = mapped_column(Boolean, default=False) + is_default: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) # Add in the fields we need, which were previously sitting at the portfolio level - cost = Column(Float) - contingency = Column(Float) - funding = Column(Float) - total_work_hours = Column(Float) - energy_savings = Column(Float) - co2_equivalent_savings = Column(Float) - energy_cost_savings = Column(Float) - epc_breakdown_pre_retrofit = Column(String) - epc_breakdown_post_retrofit = Column(String) - number_of_properties = Column(BigInteger) - n_units_to_retrofit = Column(BigInteger) - co2_per_unit_pre_retrofit = Column(String) - co2_per_unit_post_retrofit = Column(String) - energy_bill_per_unit_pre_retrofit = Column(String) - energy_bill_per_unit_post_retrofit = Column(String) - energy_consumption_per_unit_pre_retrofit = Column(String) - energy_consumption_per_unit_post_retrofit = Column(String) - valuation_improvement_per_unit = Column(String) - cost_per_unit = Column(String) - cost_per_co2_saved = Column(String) - cost_per_sap_point = Column(String) - valuation_return_on_investment = Column(String) - property_valuation_increase = Column(Float) - labour_days = Column(Float) + cost: Mapped[Optional[float]] = mapped_column(Float) + contingency: Mapped[Optional[float]] = mapped_column(Float) + funding: Mapped[Optional[float]] = mapped_column(Float) + total_work_hours: Mapped[Optional[float]] = mapped_column(Float) + energy_savings: Mapped[Optional[float]] = mapped_column(Float) + co2_equivalent_savings: Mapped[Optional[float]] = mapped_column(Float) + energy_cost_savings: Mapped[Optional[float]] = mapped_column(Float) + epc_breakdown_pre_retrofit: Mapped[Optional[str]] = mapped_column(String) + epc_breakdown_post_retrofit: Mapped[Optional[str]] = mapped_column(String) + number_of_properties: Mapped[Optional[int]] = mapped_column(BigInteger) + n_units_to_retrofit: Mapped[Optional[int]] = mapped_column(BigInteger) + co2_per_unit_pre_retrofit: Mapped[Optional[str]] = mapped_column(String) + co2_per_unit_post_retrofit: Mapped[Optional[str]] = mapped_column(String) + energy_bill_per_unit_pre_retrofit: Mapped[Optional[str]] = mapped_column(String) + energy_bill_per_unit_post_retrofit: Mapped[Optional[str]] = mapped_column(String) + energy_consumption_per_unit_pre_retrofit: Mapped[Optional[str]] = mapped_column( + String + ) + energy_consumption_per_unit_post_retrofit: Mapped[Optional[str]] = mapped_column( + String + ) + valuation_improvement_per_unit: Mapped[Optional[str]] = mapped_column(String) + cost_per_unit: Mapped[Optional[str]] = mapped_column(String) + cost_per_co2_saved: Mapped[Optional[str]] = mapped_column(String) + cost_per_sap_point: Mapped[Optional[str]] = mapped_column(String) + valuation_return_on_investment: Mapped[Optional[str]] = mapped_column(String) + property_valuation_increase: Mapped[Optional[float]] = mapped_column(Float) + labour_days: Mapped[Optional[float]] = mapped_column(Float) class MeasureType(enum.Enum):