Add phase 4 registration and renewal lifecycle management

This commit is contained in:
A R R R Associates
2026-07-23 12:05:41 +05:30
parent 0f7d6f4396
commit 929ed26737
14 changed files with 507 additions and 0 deletions
+190
View File
@@ -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)