diff --git a/backend/app/models/contract.py b/backend/app/models/contract.py new file mode 100644 index 0000000..19a3564 --- /dev/null +++ b/backend/app/models/contract.py @@ -0,0 +1,42 @@ +from datetime import datetime, timezone +from sqlalchemy import String, DateTime, Integer, ForeignKey +from sqlalchemy.orm import Mapped, mapped_column, relationship +from app.core.database import Base + + +class Contract(Base): + __tablename__ = "contracts" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + contract_number: Mapped[str] = mapped_column(String(50), nullable=False) + year: Mapped[int] = mapped_column(Integer, nullable=False) + company: Mapped[str] = mapped_column(String(100), nullable=False) + area: Mapped[str | None] = mapped_column(String(100)) + plate: Mapped[str | None] = mapped_column(String(10)) + customer_name: Mapped[str | None] = mapped_column(String(200)) + import_batch: Mapped[str | None] = mapped_column(String(100)) + imported_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + + valuation_contracts: Mapped[list["ValuationContract"]] = relationship( + "ValuationContract", back_populates="contract" + ) + + +class ValuationContract(Base): + __tablename__ = "valuation_contracts" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + valuation_id: Mapped[int] = mapped_column(Integer, ForeignKey("valuations.id"), nullable=False) + contract_id: Mapped[int] = mapped_column(Integer, ForeignKey("contracts.id"), nullable=False) + linked_by: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False) + linked_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + + valuation: Mapped["Valuation"] = relationship("Valuation", back_populates="contracts") + contract: Mapped["Contract"] = relationship("Contract", back_populates="valuation_contracts") + + +from app.models.valuation import Valuation diff --git a/backend/app/models/stock.py b/backend/app/models/stock.py new file mode 100644 index 0000000..84e7f65 --- /dev/null +++ b/backend/app/models/stock.py @@ -0,0 +1,50 @@ +from datetime import datetime, timezone +from decimal import Decimal +from sqlalchemy import String, DateTime, DECIMAL, Integer, ForeignKey +from sqlalchemy.orm import Mapped, mapped_column +from app.core.database import Base + + +class VehicleStock(Base): + __tablename__ = "vehicle_stock" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + plate: Mapped[str] = mapped_column(String(10), nullable=False, index=True) + brand: Mapped[str | None] = mapped_column(String(50)) + model: Mapped[str | None] = mapped_column(String(100)) + version: Mapped[str | None] = mapped_column(String(200)) + registration_date: Mapped[str | None] = mapped_column(String(20)) + mileage: Mapped[int | None] = mapped_column(Integer) + location: Mapped[str | None] = mapped_column(String(100)) + import_batch: Mapped[str | None] = mapped_column(String(100)) + imported_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + + +class RepairCostAvg(Base): + __tablename__ = "repair_costs_avg" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + model: Mapped[str] = mapped_column(String(100), nullable=False, index=True) + avg_cost: Mapped[Decimal | None] = mapped_column(DECIMAL(10, 2)) + import_batch: Mapped[str | None] = mapped_column(String(100)) + imported_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + + +class VehicleSalesAvg(Base): + __tablename__ = "vehicle_sales_avg" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + model: Mapped[str] = mapped_column(String(100), nullable=False, index=True) + avg_stock_days: Mapped[Decimal | None] = mapped_column(DECIMAL(6, 1)) + avg_repair_cost: Mapped[Decimal | None] = mapped_column(DECIMAL(10, 2)) + avg_margin_eur: Mapped[Decimal | None] = mapped_column(DECIMAL(10, 2)) + avg_margin_pct: Mapped[Decimal | None] = mapped_column(DECIMAL(5, 2)) + avg_sale_price: Mapped[Decimal | None] = mapped_column(DECIMAL(10, 2)) + import_batch: Mapped[str | None] = mapped_column(String(100)) + imported_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + )