open-webui/backend/beyond_the_loop/models/stripe_payment_histories.py
2025-02-20 15:36:58 +01:00

87 lines
3.3 KiB
Python

from datetime import datetime
from decimal import Decimal
from typing import Optional, List
# SQLAlchemy imports
from sqlalchemy import (
String, Text, Boolean, Column, DECIMAL, ForeignKey, DateTime, JSON, func
)
from sqlalchemy.orm import relationship
# Internal imports
from open_webui.internal.db import Base, get_db
class StripePaymentHistory(Base):
__tablename__ = "stripe_payment_history"
id = Column(String, primary_key=True, unique=True)
stripe_transaction_id = Column(String, unique=True, nullable=False)
company_id = Column(String, ForeignKey("company.id"), nullable=False)
user_id = Column(String, ForeignKey("user.id"), nullable=True)
description = Column(Text, nullable=False, default="Standard Subscription Charge")
charged_amount = Column(DECIMAL(10, 2), nullable=False)
currency = Column(String, nullable=False, default="EUR")
payment_status = Column(String, nullable=False) # Example: "succeeded", "failed"
payment_method = Column(String, nullable=True) # Example: "card", "bank_transfer"
payment_date = Column(DateTime, nullable=False, default=datetime.utcnow)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
payment_metadata = Column(JSON, nullable=True)
company = relationship("Company")
user = relationship('User', foreign_keys=[user_id])
class StripePaymentHistoryTable:
"""Service class for managing StripePaymentHistory records."""
def log_payment(self, payment_data: dict) -> Optional[StripePaymentHistory]:
"""Log a new payment in the database."""
try:
with get_db() as db:
new_payment = StripePaymentHistory(**payment_data)
db.add(new_payment)
db.commit()
db.refresh(new_payment)
return new_payment
except Exception as e:
print(f"Error logging payment: {e}")
return None
def get_payment_by_id(self, payment_id: str) -> Optional[StripePaymentHistory]:
"""Retrieve a payment by its ID."""
try:
with get_db() as db:
payment = db.query(StripePaymentHistory).filter_by(id=payment_id).first()
return payment
except Exception as e:
print(f"Error fetching payment by ID: {e}")
return None
def get_payments_for_company(self, company_id: str) -> List[StripePaymentHistory]:
"""Retrieve all payments for a specific company."""
try:
with get_db() as db:
payments = db.query(StripePaymentHistory).filter_by(company_id=company_id).all()
return payments
except Exception as e:
print(f"Error fetching payments for company {company_id}: {e}")
return []
def get_payments_for_user(self, user_id: str) -> List[StripePaymentHistory]:
"""Retrieve all payments for a specific user."""
try:
with get_db() as db:
payments = db.query(StripePaymentHistory).filter_by(user_id=user_id).all()
return payments
except Exception as e:
print(f"Error fetching payments for user {user_id}: {e}")
return []
StripePaymentHistories = StripePaymentHistoryTable()