Integrate UDIN controls into final document workflow

This commit is contained in:
A R R R Associates
2026-07-06 18:05:00 +05:30
parent eb1cf6cbf2
commit 561de117e4
10 changed files with 723 additions and 10 deletions
+49 -2
View File
@@ -1,8 +1,9 @@
from __future__ import annotations
from datetime import datetime, timezone
from datetime import date, datetime, timezone
from decimal import Decimal
from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint
from sqlalchemy import Boolean, Date, DateTime, ForeignKey, Integer, Numeric, String, Text, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.db.common import CommonBase
@@ -38,6 +39,29 @@ class EngagementDocument(CommonBase):
description: Mapped[str | None] = mapped_column(Text, nullable=True)
current_version_no: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
status: Mapped[str] = mapped_column(String(30), nullable=False, default="active", index=True)
# Phase 1 - UDIN and final document release controls.
# These fields convert the existing engagement document table into the UDIN
# source register. A separate manual UDIN register is intentionally avoided:
# partner-wise/client-wise/FY-wise reports are generated from these workflow
# fields.
udin_required: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, index=True)
udin_status: Mapped[str] = mapped_column(String(30), nullable=False, default="not_required", index=True)
udin_number: Mapped[str | None] = mapped_column(String(30), nullable=True, index=True)
udin_date: Mapped[date | None] = mapped_column(Date, nullable=True, index=True)
udin_document_date: Mapped[date | None] = mapped_column(Date, nullable=True)
udin_document_type: Mapped[str | None] = mapped_column(String(120), nullable=True)
udin_financial_year: Mapped[str | None] = mapped_column(String(9), nullable=True, index=True)
udin_amount: Mapped[Decimal | None] = mapped_column(Numeric(14, 2), nullable=True)
udin_generated_by_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
udin_verified_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
udin_notes: Mapped[str | None] = mapped_column(Text, nullable=True)
final_release_status: Mapped[str] = mapped_column(String(30), nullable=False, default="draft", index=True)
released_by_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
released_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
release_notes: Mapped[str | None] = mapped_column(Text, nullable=True)
is_deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, index=True)
deleted_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
deleted_by_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), nullable=True)
@@ -244,6 +268,29 @@ class PermanentClientDocument(CommonBase):
description: Mapped[str | None] = mapped_column(Text, nullable=True)
current_version_no: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
status: Mapped[str] = mapped_column(String(30), nullable=False, default="active", index=True)
# Phase 1 - UDIN and final document release controls.
# These fields convert the existing engagement document table into the UDIN
# source register. A separate manual UDIN register is intentionally avoided:
# partner-wise/client-wise/FY-wise reports are generated from these workflow
# fields.
udin_required: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, index=True)
udin_status: Mapped[str] = mapped_column(String(30), nullable=False, default="not_required", index=True)
udin_number: Mapped[str | None] = mapped_column(String(30), nullable=True, index=True)
udin_date: Mapped[date | None] = mapped_column(Date, nullable=True, index=True)
udin_document_date: Mapped[date | None] = mapped_column(Date, nullable=True)
udin_document_type: Mapped[str | None] = mapped_column(String(120), nullable=True)
udin_financial_year: Mapped[str | None] = mapped_column(String(9), nullable=True, index=True)
udin_amount: Mapped[Decimal | None] = mapped_column(Numeric(14, 2), nullable=True)
udin_generated_by_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
udin_verified_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
udin_notes: Mapped[str | None] = mapped_column(Text, nullable=True)
final_release_status: Mapped[str] = mapped_column(String(30), nullable=False, default="draft", index=True)
released_by_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
released_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
release_notes: Mapped[str | None] = mapped_column(Text, nullable=True)
is_deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, index=True)
deleted_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
deleted_by_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), nullable=True)