import enum from uuid import uuid4 from sqlalchemy import JSON, Column, DateTime, Enum, Float, ForeignKey, String from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.core.database import Base class PaymentStatus(enum.Enum): PENDING = "pending" PROCESSING = "processing" COMPLETED = "completed" FAILED = "failed" REFUNDED = "refunded" class PaymentMethod(enum.Enum): CREDIT_CARD = "credit_card" PAYPAL = "paypal" BANK_TRANSFER = "bank_transfer" CASH_ON_DELIVERY = "cash_on_delivery" STRIPE = "stripe" APPLE_PAY = "apple_pay" GOOGLE_PAY = "google_pay" class Payment(Base): __tablename__ = "payments" id = Column(String(36), primary_key=True, default=lambda: str(uuid4())) order_id = Column(String(36), ForeignKey("orders.id"), nullable=False) amount = Column(Float, nullable=False) payment_method = Column(Enum(PaymentMethod), nullable=False) status = Column(Enum(PaymentStatus), default=PaymentStatus.PENDING) transaction_id = Column(String(255), nullable=True, unique=True) payment_details = Column(JSON, nullable=True) # JSON with payment provider details error_message = Column(String(512), nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) # Relationships order = relationship("Order", back_populates="payments") def __repr__(self): return f""