Add phase 4 registration and renewal lifecycle management
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
from __future__ import annotations
|
||||
from datetime import date, datetime, timezone
|
||||
from sqlalchemy import Boolean, Date, DateTime, ForeignKey, Integer, JSON, Numeric, String, Text, UniqueConstraint
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
from app.core.db.common import CommonBase
|
||||
|
||||
|
||||
def utcnow(): return datetime.now(timezone.utc)
|
||||
|
||||
class RegistrationType(CommonBase):
|
||||
__tablename__="registration_types"
|
||||
__table_args__=(UniqueConstraint("code", name="uq_registration_types_code"),)
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
code: Mapped[str]=mapped_column(String(60), nullable=False, index=True)
|
||||
name: Mapped[str]=mapped_column(String(160), nullable=False)
|
||||
category: Mapped[str]=mapped_column(String(80), nullable=False, default="registration")
|
||||
issuing_authority: Mapped[str|None]=mapped_column(String(200))
|
||||
identifier_label: Mapped[str]=mapped_column(String(100), nullable=False, default="Registration Number")
|
||||
supports_expiry: Mapped[bool]=mapped_column(Boolean, nullable=False, default=False)
|
||||
supports_related_person: Mapped[bool]=mapped_column(Boolean, nullable=False, default=False)
|
||||
is_system: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
is_active: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
sort_order: Mapped[int]=mapped_column(Integer, nullable=False, default=0)
|
||||
created_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, nullable=False)
|
||||
updated_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=False)
|
||||
|
||||
class ClientRelatedPerson(CommonBase):
|
||||
__tablename__="client_related_persons"
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
tenant_id: Mapped[int]=mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
client_id: Mapped[int]=mapped_column(ForeignKey("clients.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
person_type: Mapped[str]=mapped_column(String(60), nullable=False, index=True)
|
||||
full_name: Mapped[str]=mapped_column(String(200), nullable=False)
|
||||
designation: Mapped[str|None]=mapped_column(String(120))
|
||||
pan: Mapped[str|None]=mapped_column(String(20), index=True)
|
||||
din: Mapped[str|None]=mapped_column(String(20), index=True)
|
||||
date_of_birth: Mapped[date|None]=mapped_column(Date)
|
||||
appointment_date: Mapped[date|None]=mapped_column(Date)
|
||||
cessation_date: Mapped[date|None]=mapped_column(Date)
|
||||
mobile: Mapped[str|None]=mapped_column(String(20))
|
||||
email: Mapped[str|None]=mapped_column(String(255))
|
||||
authorised_signatory: Mapped[bool]=mapped_column(Boolean, nullable=False, default=False)
|
||||
is_active: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
notes: Mapped[str|None]=mapped_column(Text)
|
||||
created_by_user_id: Mapped[int|None]=mapped_column(ForeignKey("users.id", ondelete="SET NULL"))
|
||||
created_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, nullable=False)
|
||||
updated_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=False)
|
||||
|
||||
class ClientRegistration(CommonBase):
|
||||
__tablename__="client_registrations"
|
||||
__table_args__=(UniqueConstraint("tenant_id","registration_type_id","registration_number", name="uq_client_registration_number"),)
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
tenant_id: Mapped[int]=mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
branch_id: Mapped[int|None]=mapped_column(ForeignKey("branches.id", ondelete="SET NULL"), index=True)
|
||||
client_id: Mapped[int]=mapped_column(ForeignKey("clients.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
registration_type_id: Mapped[int]=mapped_column(ForeignKey("registration_types.id"), nullable=False, index=True)
|
||||
related_person_id: Mapped[int|None]=mapped_column(ForeignKey("client_related_persons.id", ondelete="SET NULL"), index=True)
|
||||
registration_number: Mapped[str]=mapped_column(String(120), nullable=False, index=True)
|
||||
jurisdiction: Mapped[str|None]=mapped_column(String(160))
|
||||
state_code: Mapped[str|None]=mapped_column(String(10))
|
||||
issue_date: Mapped[date|None]=mapped_column(Date)
|
||||
effective_from: Mapped[date|None]=mapped_column(Date)
|
||||
valid_until: Mapped[date|None]=mapped_column(Date, index=True)
|
||||
next_action_date: Mapped[date|None]=mapped_column(Date, index=True)
|
||||
status: Mapped[str]=mapped_column(String(40), nullable=False, default="active", index=True)
|
||||
primary_registration: Mapped[bool]=mapped_column(Boolean, nullable=False, default=False)
|
||||
lifecycle_rule_id: Mapped[int|None]=mapped_column(ForeignKey("registration_lifecycle_rules.id", use_alter=True, name="fk_client_registration_rule"), index=True)
|
||||
responsible_party: Mapped[str]=mapped_column(String(30), nullable=False, default="firm")
|
||||
assigned_user_id: Mapped[int|None]=mapped_column(ForeignKey("users.id", ondelete="SET NULL"), index=True)
|
||||
assigned_consultant_id: Mapped[int|None]=mapped_column(ForeignKey("consultant_profiles.id", ondelete="SET NULL"), index=True)
|
||||
auto_create_task: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
portal_url: Mapped[str|None]=mapped_column(String(500))
|
||||
notes: Mapped[str|None]=mapped_column(Text)
|
||||
metadata_json: Mapped[dict|None]=mapped_column(JSON)
|
||||
created_by_user_id: Mapped[int|None]=mapped_column(ForeignKey("users.id", ondelete="SET NULL"))
|
||||
created_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, nullable=False)
|
||||
updated_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=False)
|
||||
|
||||
class ClientDigitalSignature(CommonBase):
|
||||
__tablename__="client_digital_signatures"
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
tenant_id: Mapped[int]=mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
client_id: Mapped[int]=mapped_column(ForeignKey("clients.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
related_person_id: Mapped[int]=mapped_column(ForeignKey("client_related_persons.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
certificate_serial_number: Mapped[str|None]=mapped_column(String(200), index=True)
|
||||
provider: Mapped[str|None]=mapped_column(String(120))
|
||||
token_make: Mapped[str|None]=mapped_column(String(120))
|
||||
class_type: Mapped[str|None]=mapped_column(String(60))
|
||||
issued_on: Mapped[date|None]=mapped_column(Date)
|
||||
expires_on: Mapped[date]=mapped_column(Date, nullable=False, index=True)
|
||||
status: Mapped[str]=mapped_column(String(30), nullable=False, default="active", index=True)
|
||||
custody_location: Mapped[str|None]=mapped_column(String(200))
|
||||
renewal_responsibility: Mapped[str]=mapped_column(String(30), nullable=False, default="firm")
|
||||
assigned_consultant_id: Mapped[int|None]=mapped_column(ForeignKey("consultant_profiles.id", ondelete="SET NULL"), index=True)
|
||||
notes: Mapped[str|None]=mapped_column(Text)
|
||||
created_by_user_id: Mapped[int|None]=mapped_column(ForeignKey("users.id", ondelete="SET NULL"))
|
||||
created_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, nullable=False)
|
||||
updated_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=False)
|
||||
|
||||
class RegistrationLifecycleRule(CommonBase):
|
||||
__tablename__="registration_lifecycle_rules"
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
tenant_id: Mapped[int|None]=mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), index=True)
|
||||
registration_type_id: Mapped[int]=mapped_column(ForeignKey("registration_types.id"), nullable=False, index=True)
|
||||
entity_type: Mapped[str|None]=mapped_column(String(100), index=True)
|
||||
jurisdiction: Mapped[str|None]=mapped_column(String(160))
|
||||
state_code: Mapped[str|None]=mapped_column(String(10))
|
||||
cycle_type: Mapped[str]=mapped_column(String(40), nullable=False, default="expiry_renewal")
|
||||
frequency_months: Mapped[int|None]=mapped_column(Integer)
|
||||
renewal_window_days: Mapped[int]=mapped_column(Integer, nullable=False, default=60)
|
||||
reminder_days_csv: Mapped[str]=mapped_column(String(100), nullable=False, default="90,60,30,15,7,0")
|
||||
grace_period_days: Mapped[int]=mapped_column(Integer, nullable=False, default=0)
|
||||
service_catalogue_id: Mapped[int|None]=mapped_column(ForeignKey("service_catalogue.id", ondelete="SET NULL"), index=True)
|
||||
requires_client_approval: Mapped[bool]=mapped_column(Boolean, nullable=False, default=False)
|
||||
requires_partner_review: Mapped[bool]=mapped_column(Boolean, nullable=False, default=False)
|
||||
auto_create_task: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
is_active: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
effective_from: Mapped[date|None]=mapped_column(Date)
|
||||
effective_to: Mapped[date|None]=mapped_column(Date)
|
||||
created_by_user_id: Mapped[int|None]=mapped_column(ForeignKey("users.id", ondelete="SET NULL"))
|
||||
created_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, nullable=False)
|
||||
updated_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=False)
|
||||
|
||||
class RegistrationDocumentTemplate(CommonBase):
|
||||
__tablename__="registration_document_templates"
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
tenant_id: Mapped[int|None]=mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), index=True)
|
||||
registration_type_id: Mapped[int]=mapped_column(ForeignKey("registration_types.id"), nullable=False, index=True)
|
||||
action_type: Mapped[str]=mapped_column(String(40), nullable=False, default="renewal", index=True)
|
||||
document_name: Mapped[str]=mapped_column(String(200), nullable=False)
|
||||
description: Mapped[str|None]=mapped_column(Text)
|
||||
mandatory: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
sort_order: Mapped[int]=mapped_column(Integer, nullable=False, default=0)
|
||||
is_active: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
|
||||
class RegistrationRenewalTask(CommonBase):
|
||||
__tablename__="registration_renewal_tasks"
|
||||
__table_args__=(UniqueConstraint("registration_id","cycle_due_date", name="uq_registration_renewal_cycle"),)
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
tenant_id: Mapped[int]=mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
branch_id: Mapped[int|None]=mapped_column(ForeignKey("branches.id", ondelete="SET NULL"), index=True)
|
||||
client_id: Mapped[int]=mapped_column(ForeignKey("clients.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
registration_id: Mapped[int]=mapped_column(ForeignKey("client_registrations.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
lifecycle_rule_id: Mapped[int|None]=mapped_column(ForeignKey("registration_lifecycle_rules.id", ondelete="SET NULL"), index=True)
|
||||
cycle_due_date: Mapped[date]=mapped_column(Date, nullable=False, index=True)
|
||||
action_type: Mapped[str]=mapped_column(String(40), nullable=False, default="renewal")
|
||||
title: Mapped[str]=mapped_column(String(255), nullable=False)
|
||||
status: Mapped[str]=mapped_column(String(40), nullable=False, default="pending", index=True)
|
||||
priority: Mapped[str]=mapped_column(String(20), nullable=False, default="normal")
|
||||
assigned_user_id: Mapped[int|None]=mapped_column(ForeignKey("users.id", ondelete="SET NULL"), index=True)
|
||||
assigned_consultant_id: Mapped[int|None]=mapped_column(ForeignKey("consultant_profiles.id", ondelete="SET NULL"), index=True)
|
||||
client_approval_required: Mapped[bool]=mapped_column(Boolean, nullable=False, default=False)
|
||||
partner_review_required: Mapped[bool]=mapped_column(Boolean, nullable=False, default=False)
|
||||
submitted_on: Mapped[date|None]=mapped_column(Date)
|
||||
acknowledgement_number: Mapped[str|None]=mapped_column(String(160))
|
||||
completed_on: Mapped[date|None]=mapped_column(Date)
|
||||
notes: Mapped[str|None]=mapped_column(Text)
|
||||
created_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, nullable=False)
|
||||
updated_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=False)
|
||||
|
||||
class RegistrationRenewalTaskDocument(CommonBase):
|
||||
__tablename__="registration_renewal_task_documents"
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
renewal_task_id: Mapped[int]=mapped_column(ForeignKey("registration_renewal_tasks.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
template_id: Mapped[int|None]=mapped_column(ForeignKey("registration_document_templates.id", ondelete="SET NULL"))
|
||||
document_name: Mapped[str]=mapped_column(String(200), nullable=False)
|
||||
mandatory: Mapped[bool]=mapped_column(Boolean, nullable=False, default=True)
|
||||
status: Mapped[str]=mapped_column(String(30), nullable=False, default="pending")
|
||||
document_id: Mapped[int|None]=mapped_column(Integer)
|
||||
remarks: Mapped[str|None]=mapped_column(Text)
|
||||
|
||||
class ClientRegistrationAction(CommonBase):
|
||||
__tablename__="client_registration_actions"
|
||||
id: Mapped[int]=mapped_column(Integer, primary_key=True)
|
||||
tenant_id: Mapped[int]=mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
client_id: Mapped[int]=mapped_column(ForeignKey("clients.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
registration_id: Mapped[int]=mapped_column(ForeignKey("client_registrations.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
renewal_task_id: Mapped[int|None]=mapped_column(ForeignKey("registration_renewal_tasks.id", ondelete="SET NULL"), index=True)
|
||||
action_type: Mapped[str]=mapped_column(String(40), nullable=False, index=True)
|
||||
previous_valid_until: Mapped[date|None]=mapped_column(Date)
|
||||
new_valid_until: Mapped[date|None]=mapped_column(Date)
|
||||
application_date: Mapped[date|None]=mapped_column(Date)
|
||||
submission_date: Mapped[date|None]=mapped_column(Date)
|
||||
acknowledgement_number: Mapped[str|None]=mapped_column(String(160))
|
||||
completion_date: Mapped[date|None]=mapped_column(Date)
|
||||
status: Mapped[str]=mapped_column(String(40), nullable=False, default="completed")
|
||||
performed_by_user_id: Mapped[int|None]=mapped_column(ForeignKey("users.id", ondelete="SET NULL"))
|
||||
performed_by_consultant_id: Mapped[int|None]=mapped_column(ForeignKey("consultant_profiles.id", ondelete="SET NULL"))
|
||||
notes: Mapped[str|None]=mapped_column(Text)
|
||||
created_at_utc: Mapped[datetime]=mapped_column(DateTime(timezone=True), default=utcnow, nullable=False)
|
||||
Reference in New Issue
Block a user