125 lines
4.2 KiB
Python
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")
|