107 lines
3.4 KiB
Python
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")
|