from sqlalchemy import Column, Integer, String, DateTime, JSON, ForeignKey, text, Numeric, Boolean, BigInteger from sqlalchemy.sql import func from app.db.base_class import Base class SecurityAuditLog(Base): """ Kiemelt biztonsági események és a 4-szem elv. """ __tablename__ = "security_audit_logs" __table_args__ = {"schema": "data", "extend_existing": True} id = Column(Integer, primary_key=True) action = Column(String(50)) # 'ROLE_CHANGE', 'MANUAL_CREDIT_ADJUST', 'SUB_EXTEND' actor_id = Column(Integer, ForeignKey("data.users.id")) # Aki kezdeményezte target_id = Column(Integer, ForeignKey("data.users.id")) # Akivel történt # 4-szem elv: csak akkor válik élessé, ha ez nem NULL confirmed_by_id = Column(Integer, ForeignKey("data.users.id"), nullable=True) is_critical = Column(Boolean, default=False) # Szuperadmin hívásoknál True payload_before = Column(JSON) payload_after = Column(JSON) created_at = Column(DateTime(timezone=True), server_default=func.now()) class OperationalLog(Base): """ Napi üzemi események (Operational). """ __tablename__ = "operational_logs" __table_args__ = {"schema": "data", "extend_existing": True} id = Column(Integer, primary_key=True, index=True) # <--- EZ HIÁNYZOTT! user_id = Column(Integer, ForeignKey("data.users.id", ondelete="SET NULL"), nullable=True) action = Column(String(100), nullable=False) # pl. "ADD_VEHICLE", "UPDATE_COST" resource_type = Column(String(50)) # pl. "Asset", "Expense" resource_id = Column(String(100)) details = Column(JSON, server_default=text("'{}'::jsonb")) ip_address = Column(String(45)) created_at = Column(DateTime(timezone=True), server_default=func.now()) class FinancialLedger(Base): """ Minden pénz- és kreditmozgás központi naplója. """ __tablename__ = "financial_ledger" __table_args__ = {"schema": "data", "extend_existing": True} id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey("data.users.id")) person_id = Column(BigInteger, ForeignKey("data.persons.id")) amount = Column(Numeric(18, 4), nullable=False) currency = Column(String(10)) # 'HUF', 'CREDIT', 'COIN' transaction_type = Column(String(50)) # 'PURCHASE', 'HUNTING_COMMISSION', 'FARMING_COMMISSION' # Üzletkötői követhetőség related_agent_id = Column(Integer, ForeignKey("data.users.id"), nullable=True) details = Column(JSON, server_default=text("'{}'::jsonb")) created_at = Column(DateTime(timezone=True), server_default=func.now())