2025-07-01 12:54:48 +00:00

107 lines
3.4 KiB
Python

from sqlalchemy import (
Boolean,
Column,
Integer,
String,
DateTime,
Text,
ForeignKey,
Enum,
Numeric,
)
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.db.base import Base
import enum
class DonationType(enum.Enum):
TITHE = "tithe"
OFFERING = "offering"
SPECIAL_OFFERING = "special_offering"
BUILDING_FUND = "building_fund"
MISSIONS = "missions"
CHARITY = "charity"
OTHER = "other"
class PaymentMethod(enum.Enum):
CASH = "cash"
CHECK = "check"
CARD = "card"
BANK_TRANSFER = "bank_transfer"
MOBILE_MONEY = "mobile_money"
ONLINE = "online"
class Donation(Base):
__tablename__ = "donations"
id = Column(Integer, primary_key=True, index=True)
donor_id = Column(Integer, ForeignKey("users.id"), nullable=False)
amount = Column(Numeric(10, 2), nullable=False)
currency = Column(String, default="USD")
donation_type = Column(Enum(DonationType), nullable=False)
payment_method = Column(Enum(PaymentMethod), nullable=False)
reference_number = Column(String, nullable=True)
notes = Column(Text, nullable=True)
is_anonymous = Column(Boolean, default=False)
is_recurring = Column(Boolean, default=False)
recurring_frequency = Column(String, nullable=True) # weekly, monthly, yearly
next_due_date = Column(DateTime, nullable=True)
donation_date = Column(DateTime, nullable=False, default=func.now())
created_at = Column(DateTime, nullable=False, default=func.now())
# Relationships
donor = relationship("User", back_populates="donations")
class DonationGoal(Base):
__tablename__ = "donation_goals"
id = Column(Integer, primary_key=True, index=True)
title = Column(String, nullable=False)
description = Column(Text, nullable=True)
target_amount = Column(Numeric(10, 2), nullable=False)
current_amount = Column(Numeric(10, 2), default=0)
currency = Column(String, default="USD")
start_date = Column(DateTime, nullable=False)
end_date = Column(DateTime, nullable=False)
is_active = Column(Boolean, default=True)
created_by = Column(Integer, ForeignKey("users.id"), nullable=False)
created_at = Column(DateTime, nullable=False, default=func.now())
# Relationships
creator = relationship("User")
donations = relationship("GoalDonation", back_populates="goal")
class GoalDonation(Base):
__tablename__ = "goal_donations"
id = Column(Integer, primary_key=True, index=True)
goal_id = Column(Integer, ForeignKey("donation_goals.id"), nullable=False)
donation_id = Column(Integer, ForeignKey("donations.id"), nullable=False)
amount = Column(Numeric(10, 2), nullable=False)
created_at = Column(DateTime, nullable=False, default=func.now())
# Relationships
goal = relationship("DonationGoal", back_populates="donations")
donation = relationship("Donation")
class TithePledge(Base):
__tablename__ = "tithe_pledges"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
monthly_amount = Column(Numeric(10, 2), nullable=False)
currency = Column(String, default="USD")
start_date = Column(DateTime, nullable=False)
end_date = Column(DateTime, nullable=True)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, nullable=False, default=func.now())
# Relationships
user = relationship("User")