46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
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"<Payment {self.id} for Order {self.order_id}>"
|