import uuid import enum from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, JSON, Numeric, text, Enum from sqlalchemy.orm import relationship from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.sql import func from app.db.base import Base class UserRole(str, enum.Enum): ADMIN = "admin" USER = "user" SERVICE = "service" FLEET_MANAGER = "fleet_manager" DRIVER = "driver" class Person(Base): __tablename__ = "persons" __table_args__ = {"schema": "data"} id = Column(Integer, primary_key=True, index=True) id_uuid = Column(UUID(as_uuid=True), default=uuid.uuid4, unique=True, nullable=False) last_name = Column(String, nullable=False) first_name = Column(String, nullable=False) mothers_name = Column(String, nullable=True) birth_place = Column(String, nullable=True) birth_date = Column(DateTime, nullable=True) # KYC Okmányok és Safety adatok identity_docs = Column(JSON, server_default=text("'{}'::jsonb")) medical_emergency = Column(JSON, server_default=text("'{}'::jsonb")) ice_contact = Column(JSON, server_default=text("'{}'::jsonb")) users = relationship("User", back_populates="person") class User(Base): __tablename__ = "users" __table_args__ = {"schema": "data"} id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=True) # Social Auth esetén null lehet! # Social Auth mezők social_provider = Column(String, nullable=True) # google, facebook social_id = Column(String, nullable=True) role = Column(Enum(UserRole), default=UserRole.USER) is_active = Column(Boolean, default=True) region_code = Column(String, default="HU") # Soft Delete is_deleted = Column(Boolean, default=False) deleted_at = Column(DateTime, nullable=True) person_id = Column(Integer, ForeignKey("data.persons.id"), nullable=True) person = relationship("Person", back_populates="users") wallet = relationship("Wallet", back_populates="user", uselist=False) owned_organizations = relationship("Organization", back_populates="owner") created_at = Column(DateTime(timezone=True), server_default=func.now()) class Wallet(Base): __tablename__ = "wallets" __table_args__ = {"schema": "data"} id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("data.users.id"), unique=True) coin_balance = Column(Numeric(18, 2), default=0.00) xp_balance = Column(Integer, default=0) user = relationship("User", back_populates="wallet")