# /opt/docker/dev/service_finder/backend/app/models/core_logic.py from typing import Optional, List, Any from datetime import datetime # Python saját típusa a típusjelöléshez from sqlalchemy import String, Integer, ForeignKey, Boolean, DateTime, Numeric, text from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.sql import func # MB 2.0: A központi aszinkron adatbázis motorból húzzuk be a Base-t from app.database import Base class SubscriptionTier(Base): """ Előfizetési csomagok definíciója (pl. Free, Premium, VIP). A csomagok határozzák meg a korlátokat (pl. max járműszám). """ __tablename__ = "subscription_tiers" __table_args__ = {"schema": "system"} id: Mapped[int] = mapped_column(Integer, primary_key=True) name: Mapped[str] = mapped_column(String, unique=True, index=True) # pl. 'premium' rules: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) # pl. {"max_vehicles": 5} is_custom: Mapped[bool] = mapped_column(Boolean, default=False) class OrganizationSubscription(Base): """ Szervezetek aktuális előfizetései és azok érvényessége. """ __tablename__ = "org_subscriptions" __table_args__ = {"schema": "finance"} id: Mapped[int] = mapped_column(Integer, primary_key=True) # Kapcsolat a szervezettel (fleet séma) org_id: Mapped[int] = mapped_column(Integer, ForeignKey("fleet.organizations.id"), nullable=False) # Kapcsolat a csomaggal (system séma) tier_id: Mapped[int] = mapped_column(Integer, ForeignKey("system.subscription_tiers.id"), nullable=False) valid_from: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) valid_until: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) is_active: Mapped[bool] = mapped_column(Boolean, default=True) class CreditTransaction(Base): """ Kreditnapló (Pontok, kreditek vagy virtuális egyenleg követése). """ __tablename__ = "credit_logs" __table_args__ = {"schema": "finance"} id: Mapped[int] = mapped_column(Integer, primary_key=True) # Kapcsolat a szervezettel (fleet séma) org_id: Mapped[int] = mapped_column(Integer, ForeignKey("fleet.organizations.id"), nullable=False) amount: Mapped[float] = mapped_column(Numeric(10, 2), nullable=False) description: Mapped[Optional[str]] = mapped_column(String) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) class ServiceSpecialty(Base): """ Hierarchikus fa struktúra a szerviz szolgáltatásokhoz (pl. Motor -> Futómű). """ __tablename__ = "service_specialties" __table_args__ = {"schema": "marketplace"} id: Mapped[int] = mapped_column(Integer, primary_key=True) # Önmagára mutató idegen kulcs a hierarchiához parent_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("marketplace.service_specialties.id")) name: Mapped[str] = mapped_column(String, nullable=False) slug: Mapped[str] = mapped_column(String, unique=True, index=True) # Kapcsolat az ős-szolgáltatással (Self-referential relationship) parent: Mapped[Optional["ServiceSpecialty"]] = relationship("ServiceSpecialty", remote_side=[id], backref="children")