samaan / models /dbt.py
Copilot Sync Bot
Sync backend from main branch
26c9046
"""
DBT under PCR/PoA Acts models
"""
from sqlalchemy import Column, Integer, String, Float, DateTime, Boolean, Enum, ForeignKey, Text
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import enum
from database import Base
class CaseType(str, enum.Enum):
"""Case type enumeration"""
PCR = "pcr" # Protection of Civil Rights
POA = "poa" # Prevention of Atrocities
class VerificationStatus(str, enum.Enum):
"""Verification status"""
PENDING = "pending"
VERIFIED = "verified"
REJECTED = "rejected"
class AssistanceType(str, enum.Enum):
"""Assistance type enumeration"""
RELIEF = "relief"
REHABILITATION = "rehabilitation"
INTER_CASTE_MARRIAGE_INCENTIVE = "inter_caste_marriage_incentive"
class DBTStatus(str, enum.Enum):
"""DBT case status"""
REGISTERED = "registered"
UNDER_REVIEW = "under_review"
SANCTIONED = "sanctioned"
DISBURSED = "disbursed"
CLOSED = "closed"
class GrievanceCategory(str, enum.Enum):
"""Grievance categories"""
DELAY = "delay"
WRONG_AMOUNT = "wrong_amount"
HARASSMENT = "harassment"
OTHER = "other"
class GrievanceStatus(str, enum.Enum):
"""Grievance status"""
OPEN = "open"
IN_PROGRESS = "in_progress"
RESOLVED = "resolved"
class Victim(Base):
"""Victim registration"""
__tablename__ = "victims"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(100), nullable=False)
aadhaar_last4 = Column(String(4), nullable=True)
mobile = Column(String(10), nullable=False)
state = Column(String(50), nullable=False)
district = Column(String(50), nullable=False)
case_type = Column(Enum(CaseType), nullable=False)
fir_number = Column(String(50), nullable=False)
court_case_number = Column(String(50), nullable=True)
incident_date = Column(DateTime(timezone=True), nullable=False)
verification_status = Column(Enum(VerificationStatus), default=VerificationStatus.PENDING)
digilocker_verified = Column(Boolean, default=False)
cctns_verified = Column(Boolean, default=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
dbt_cases = relationship("DBTCase", back_populates="victim")
grievances = relationship("GrievanceTicket", back_populates="victim")
class DBTCase(Base):
"""DBT case for victims"""
__tablename__ = "dbt_cases"
id = Column(Integer, primary_key=True, index=True)
victim_id = Column(Integer, ForeignKey("victims.id"), nullable=False)
assistance_type = Column(Enum(AssistanceType), nullable=False)
approved_amount = Column(Float, nullable=False)
disbursed_amount = Column(Float, default=0.0)
status = Column(Enum(DBTStatus), default=DBTStatus.REGISTERED)
assigned_officer_id = Column(Integer, ForeignKey("users.id"), nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
victim = relationship("Victim", back_populates="dbt_cases")
assigned_officer = relationship("User", foreign_keys=[assigned_officer_id], back_populates="dbt_cases_assigned")
disbursements = relationship("Disbursement", back_populates="dbt_case")
grievances = relationship("GrievanceTicket", back_populates="dbt_case")
class Disbursement(Base):
"""Disbursement records"""
__tablename__ = "disbursements"
id = Column(Integer, primary_key=True, index=True)
case_id = Column(Integer, ForeignKey("dbt_cases.id"), nullable=False)
amount = Column(Float, nullable=False)
disbursed_at = Column(DateTime(timezone=True), server_default=func.now())
transaction_ref = Column(String(50), nullable=False)
bank_account_last4 = Column(String(4), nullable=True)
remarks = Column(Text, nullable=True)
# Relationships
dbt_case = relationship("DBTCase", back_populates="disbursements")
class GrievanceTicket(Base):
"""Grievance tickets"""
__tablename__ = "grievance_tickets"
id = Column(Integer, primary_key=True, index=True)
case_id = Column(Integer, ForeignKey("dbt_cases.id"), nullable=True)
victim_id = Column(Integer, ForeignKey("victims.id"), nullable=True)
category = Column(Enum(GrievanceCategory), nullable=False)
description = Column(Text, nullable=False)
status = Column(Enum(GrievanceStatus), default=GrievanceStatus.OPEN)
created_at = Column(DateTime(timezone=True), server_default=func.now())
resolution_notes = Column(Text, nullable=True)
resolved_at = Column(DateTime(timezone=True), nullable=True)
# Relationships
dbt_case = relationship("DBTCase", back_populates="grievances")
victim = relationship("Victim", back_populates="grievances")