# /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) # ── P0 3D CAPABILITY MATRIX: feature_capabilities JSONB ── # Defines what features/capabilities this subscription tier unlocks. # Example: {"can_export_data": True, "can_use_analytics": True, "max_vehicles": 50} feature_capabilities: Mapped[dict] = mapped_column( JSONB, nullable=False, default=dict, server_default=text("'{}'::jsonb") ) 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) # ── P0 BOOSTER ARCHITECTURE: extra_allowances JSONB ── # Tárolja a darabáron vett extra kvótákat a csomag keretein felül. # Példa: {"extra_vehicles": 1, "extra_garages": 1, "extra_credits": 100} extra_allowances: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb"), default=dict) class UserSubscription(Base): """ Felhasználók aktuális előfizetései és azok érvényessége. Tábla: finance.user_subscriptions """ __tablename__ = "user_subscriptions" __table_args__ = {"schema": "finance"} id: Mapped[int] = mapped_column(Integer, primary_key=True) # Kapcsolat a felhasználóval (identity séma) user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.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) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=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") class ServiceCatalog(Base): """ Szolgáltatás Katalógus (Service Catalog). A rendszer által kínált szolgáltatások definíciói, pl. 'SRV_DATA_EXPORT'. Tábla: system.service_catalog """ __tablename__ = "service_catalog" __table_args__ = {"schema": "system"} id: Mapped[int] = mapped_column(Integer, primary_key=True) service_code: Mapped[str] = mapped_column(String, unique=True, index=True, nullable=False) # pl. 'SRV_DATA_EXPORT' name: Mapped[str] = mapped_column(String, nullable=False) description: Mapped[Optional[str]] = mapped_column(String) credit_cost: Mapped[int] = mapped_column(Integer, default=0) # alapértelmezett ár kreditben is_active: Mapped[bool] = mapped_column(Boolean, default=True)