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")