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

125 lines
4.2 KiB
Python

from sqlalchemy import (
Boolean,
Column,
Integer,
String,
DateTime,
Text,
ForeignKey,
Enum,
Date,
)
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.db.base import Base
import enum
class ServiceType(enum.Enum):
SUNDAY_SERVICE = "sunday_service"
BIBLE_STUDY = "bible_study"
PRAYER_MEETING = "prayer_meeting"
YOUTH_SERVICE = "youth_service"
WOMEN_MEETING = "women_meeting"
MEN_MEETING = "men_meeting"
SPECIAL_SERVICE = "special_service"
OTHER = "other"
class AttendanceStatus(enum.Enum):
PRESENT = "present"
ABSENT = "absent"
LATE = "late"
EXCUSED = "excused"
class Service(Base):
__tablename__ = "services"
id = Column(Integer, primary_key=True, index=True)
title = Column(String, nullable=False)
description = Column(Text, nullable=True)
service_type = Column(Enum(ServiceType), nullable=False)
service_date = Column(Date, nullable=False)
start_time = Column(DateTime, nullable=False)
end_time = Column(DateTime, nullable=True)
location = Column(String, nullable=True)
minister_id = Column(Integer, ForeignKey("users.id"), nullable=True)
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
minister = relationship("User", foreign_keys=[minister_id])
creator = relationship("User", foreign_keys=[created_by])
attendance_records = relationship(
"AttendanceRecord", back_populates="service", cascade="all, delete-orphan"
)
class AttendanceRecord(Base):
__tablename__ = "attendance_records"
id = Column(Integer, primary_key=True, index=True)
service_id = Column(Integer, ForeignKey("services.id"), nullable=False)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
status = Column(Enum(AttendanceStatus), default=AttendanceStatus.PRESENT)
check_in_time = Column(DateTime, nullable=True)
check_out_time = Column(DateTime, nullable=True)
notes = Column(Text, nullable=True)
recorded_by = Column(Integer, ForeignKey("users.id"), nullable=False)
recorded_at = Column(DateTime, nullable=False, default=func.now())
# Relationships
service = relationship("Service", back_populates="attendance_records")
user = relationship("User", foreign_keys=[user_id])
recorder = relationship("User", foreign_keys=[recorded_by])
class AttendanceGoal(Base):
__tablename__ = "attendance_goals"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
service_type = Column(Enum(ServiceType), nullable=False)
target_percentage = Column(Integer, default=80) # Target attendance percentage
start_date = Column(Date, nullable=False)
end_date = Column(Date, nullable=False)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, nullable=False, default=func.now())
# Relationships
user = relationship("User")
class FamilyGroup(Base):
__tablename__ = "family_groups"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, nullable=False)
head_of_family_id = Column(Integer, ForeignKey("users.id"), nullable=False)
description = Column(Text, nullable=True)
created_at = Column(DateTime, nullable=False, default=func.now())
# Relationships
head_of_family = relationship("User")
members = relationship(
"FamilyMember", back_populates="family_group", cascade="all, delete-orphan"
)
class FamilyMember(Base):
__tablename__ = "family_members"
id = Column(Integer, primary_key=True, index=True)
family_group_id = Column(Integer, ForeignKey("family_groups.id"), nullable=False)
user_id = Column(Integer, ForeignKey("users.id"), nullable=True)
name = Column(String, nullable=False) # For non-registered family members
relationship = Column(String, nullable=True) # spouse, child, parent, etc.
date_of_birth = Column(Date, nullable=True)
is_registered_user = Column(Boolean, default=False)
# Relationships
family_group = relationship("FamilyGroup", back_populates="members")
user = relationship("User")