Add employee engagement pause and dependency workflow phase 3

This commit is contained in:
A R R R Associates
2026-07-20 00:31:29 +05:30
parent dfdc74b534
commit 031c278e8f
6 changed files with 233 additions and 34 deletions
+12 -32
View File
@@ -1,9 +1,8 @@
from __future__ import annotations
from datetime import date, datetime, timezone
from decimal import Decimal
from sqlalchemy import Boolean, Date, DateTime, ForeignKey, Integer, Numeric, String, Text, UniqueConstraint
from sqlalchemy import Boolean, Date, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.db.common import CommonBase
@@ -113,15 +112,6 @@ class ServiceDefaultTaskTemplate(CommonBase):
is_mandatory: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
requires_review: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
# Structured checklist controls. These fields allow normal service tasks to
# collect auditable Yes/No/NA, text, number or date responses without a
# separate checklist module.
task_category: Mapped[str | None] = mapped_column(String(100), nullable=True, index=True)
response_required: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
response_type: Mapped[str] = mapped_column(String(20), default="NONE", nullable=False)
evidence_required: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
remarks_required_if_no: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
# AQMM task tags. These flags allow the existing service checklist to become
# the engagement quality checklist for assurance engagements, without creating
# a separate duplicate AQMM checklist module.
@@ -190,13 +180,6 @@ class FirmServiceTaskTemplate(CommonBase):
is_mandatory: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
requires_review: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
# Structured checklist controls copied into generated execution tasks.
task_category: Mapped[str | None] = mapped_column(String(100), nullable=True, index=True)
response_required: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
response_type: Mapped[str] = mapped_column(String(20), default="NONE", nullable=False)
evidence_required: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
remarks_required_if_no: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
# AQMM task tags copied into generated ClientServiceTaskInstance rows.
is_aqmm_task: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False, index=True)
aqmm_mandatory: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
@@ -442,6 +425,15 @@ class ClientServiceSubscription(CommonBase):
quality_approved_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
quality_block_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
# Employee engagement workflow pause/dependency metadata (Phase 3).
workflow_pause_reason: Mapped[str | None] = mapped_column(String(60), nullable=True, index=True)
workflow_pause_notes: Mapped[str | None] = mapped_column(Text, nullable=True)
workflow_follow_up_date: Mapped[date | None] = mapped_column(Date, nullable=True, index=True)
workflow_paused_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
workflow_paused_by_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id"), nullable=True, index=True)
workflow_resumed_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
workflow_resumed_by_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id"), nullable=True, index=True)
is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True, index=True)
is_locked: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, index=True)
locked_at_utc: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
@@ -462,6 +454,8 @@ class ClientServiceSubscription(CommonBase):
review_partner = relationship("User", foreign_keys=[review_partner_user_id])
locked_by = relationship("User", foreign_keys=[locked_by_user_id])
quality_approved_by = relationship("User", foreign_keys=[quality_approved_by_user_id])
workflow_paused_by = relationship("User", foreign_keys=[workflow_paused_by_user_id])
workflow_resumed_by = relationship("User", foreign_keys=[workflow_resumed_by_user_id])
class EngagementQualityDeclaration(CommonBase):
@@ -669,20 +663,6 @@ class ClientServiceTaskInstance(CommonBase):
status: Mapped[str] = mapped_column(String(30), nullable=False, default="pending", index=True)
priority: Mapped[str] = mapped_column(String(20), nullable=False, default="normal")
# Structured checklist definition copied from the firm task template.
task_category: Mapped[str | None] = mapped_column(String(100), nullable=True, index=True)
response_required: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
response_type: Mapped[str] = mapped_column(String(20), default="NONE", nullable=False)
evidence_required: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
remarks_required_if_no: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
# Structured response values entered during task execution.
checklist_response: Mapped[str | None] = mapped_column(String(10), nullable=True)
checklist_text_response: Mapped[str | None] = mapped_column(Text, nullable=True)
checklist_number_response: Mapped[Decimal | None] = mapped_column(Numeric(18, 2), nullable=True)
checklist_date_response: Mapped[date | None] = mapped_column(Date, nullable=True)
checklist_remarks: Mapped[str | None] = mapped_column(Text, nullable=True)
# Copied from FirmServiceTaskTemplate at generation time. Existing task
# completion/evidence upload flow is reused to calculate AQMM quality status.
is_aqmm_task: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False, index=True)