Separate normal task review from AQMM review
This commit is contained in:
@@ -31,6 +31,29 @@ TASK_STATUSES = [
|
||||
OPEN_TASK_STATUSES = {"pending", "in_progress", "blocked"}
|
||||
CLOSED_TASK_STATUSES = {"completed", "not_applicable", "cancelled"}
|
||||
|
||||
NORMAL_REVIEW_ROLES = {"manager", "partner", "manager_or_partner"}
|
||||
|
||||
|
||||
def normal_review_role_for_template(template) -> str | None:
|
||||
if not getattr(template, "requires_review", False):
|
||||
return None
|
||||
explicit = (getattr(template, "normal_review_role", None) or "").strip().lower()
|
||||
if explicit in NORMAL_REVIEW_ROLES:
|
||||
return explicit
|
||||
default_role = (getattr(template, "default_role_name", None) or "").strip().lower()
|
||||
eligible = {
|
||||
part.strip().lower()
|
||||
for part in (getattr(template, "eligible_role_names", None) or "").split(",")
|
||||
if part.strip()
|
||||
}
|
||||
if default_role in {"manager", "branch manager"} and "partner" in eligible:
|
||||
return "partner"
|
||||
if default_role not in {"manager", "branch manager", "partner"} and ({"manager", "branch manager"} & eligible):
|
||||
return "manager"
|
||||
if "partner" in eligible and not ({"manager", "branch manager"} & eligible):
|
||||
return "partner"
|
||||
return "manager"
|
||||
|
||||
|
||||
TASK_COMMENT_TYPES = [
|
||||
("internal_note", "Internal Note"),
|
||||
@@ -307,6 +330,9 @@ def generate_tasks_for_subscription(db: Session, *, subscription: ClientServiceS
|
||||
response_type=(getattr(template, "response_type", "NONE") or "NONE").upper(),
|
||||
evidence_required=getattr(template, "evidence_required", False),
|
||||
remarks_required_if_no=getattr(template, "remarks_required_if_no", False),
|
||||
normal_review_required=bool(getattr(template, "requires_review", False)),
|
||||
normal_review_role=normal_review_role_for_template(template),
|
||||
normal_review_status="not_ready" if getattr(template, "requires_review", False) else "not_required",
|
||||
is_aqmm_task=getattr(template, "is_aqmm_task", False),
|
||||
aqmm_mandatory=getattr(template, "aqmm_mandatory", False),
|
||||
aqmm_evidence_required=getattr(template, "aqmm_evidence_required", False),
|
||||
@@ -372,6 +398,12 @@ def _copy_template_snapshot_to_task(
|
||||
task.response_type = (getattr(template, "response_type", "NONE") or "NONE").upper()
|
||||
task.evidence_required = getattr(template, "evidence_required", False)
|
||||
task.remarks_required_if_no = getattr(template, "remarks_required_if_no", False)
|
||||
task.normal_review_required = bool(getattr(template, "requires_review", False))
|
||||
task.normal_review_role = normal_review_role_for_template(template)
|
||||
if not task.normal_review_required:
|
||||
task.normal_review_status = "not_required"
|
||||
elif (getattr(task, "normal_review_status", None) or "not_required") == "not_required":
|
||||
task.normal_review_status = "not_ready"
|
||||
task.is_aqmm_task = getattr(template, "is_aqmm_task", False)
|
||||
task.aqmm_mandatory = getattr(template, "aqmm_mandatory", False)
|
||||
task.aqmm_evidence_required = getattr(template, "aqmm_evidence_required", False)
|
||||
@@ -465,6 +497,9 @@ def sync_open_engagement_tasks_for_service(
|
||||
response_type=(getattr(template, "response_type", "NONE") or "NONE").upper(),
|
||||
evidence_required=getattr(template, "evidence_required", False),
|
||||
remarks_required_if_no=getattr(template, "remarks_required_if_no", False),
|
||||
normal_review_required=bool(getattr(template, "requires_review", False)),
|
||||
normal_review_role=normal_review_role_for_template(template),
|
||||
normal_review_status="not_ready" if getattr(template, "requires_review", False) else "not_required",
|
||||
is_aqmm_task=getattr(template, "is_aqmm_task", False),
|
||||
aqmm_mandatory=getattr(template, "aqmm_mandatory", False),
|
||||
aqmm_evidence_required=getattr(template, "aqmm_evidence_required", False),
|
||||
@@ -1323,6 +1358,11 @@ def submit_task_for_review(db: Session, *, task: ClientServiceTaskInstance, note
|
||||
now = datetime.now(timezone.utc)
|
||||
task.submitted_for_review_by_user_id = user_id
|
||||
task.submitted_for_review_at_utc = now
|
||||
if getattr(task, "normal_review_required", False):
|
||||
task.normal_review_status = "pending"
|
||||
task.normal_review_note = None
|
||||
task.normal_reviewed_by_user_id = None
|
||||
task.normal_reviewed_at_utc = None
|
||||
if getattr(task, "aqmm_manager_review_required", False) and task.manager_review_status != "reviewed":
|
||||
task.manager_review_status = "pending"
|
||||
if getattr(task, "aqmm_partner_review_required", False) and task.partner_review_status != "reviewed":
|
||||
@@ -1339,6 +1379,53 @@ def submit_task_for_review(db: Session, *, task: ClientServiceTaskInstance, note
|
||||
recalculate_task_aqmm_status(db, task)
|
||||
|
||||
|
||||
|
||||
def apply_normal_task_review(
|
||||
db: Session,
|
||||
*,
|
||||
task: ClientServiceTaskInstance,
|
||||
decision: str,
|
||||
note: str,
|
||||
user_id: int,
|
||||
) -> None:
|
||||
if getattr(task, "is_locked", False) or getattr(getattr(task, "subscription", None), "is_locked", False):
|
||||
return
|
||||
if not getattr(task, "normal_review_required", False):
|
||||
raise ValueError("Normal review is not required for this task.")
|
||||
clean_decision = (decision or "reviewed").strip().lower()
|
||||
if clean_decision not in {"reviewed", "rework_required"}:
|
||||
clean_decision = "reviewed"
|
||||
clean_note = (note or "").strip()
|
||||
if clean_decision == "rework_required" and not clean_note:
|
||||
raise ValueError("Rework reason is required.")
|
||||
now = datetime.now(timezone.utc)
|
||||
task.normal_review_status = clean_decision
|
||||
task.normal_review_note = clean_note or task.normal_review_note
|
||||
task.normal_reviewed_by_user_id = user_id
|
||||
task.normal_reviewed_at_utc = now
|
||||
if clean_decision == "rework_required":
|
||||
task.rework_status = "open"
|
||||
task.rework_reason = clean_note
|
||||
task.rework_requested_by_user_id = user_id
|
||||
task.rework_requested_at_utc = now
|
||||
task.rework_resolved_at_utc = None
|
||||
task.status = "blocked"
|
||||
comment_type = "rework_note"
|
||||
else:
|
||||
if getattr(task, "rework_status", "none") == "open":
|
||||
task.rework_status = "resolved"
|
||||
task.rework_resolved_at_utc = now
|
||||
comment_type = "manager_review_note" if (getattr(task, "normal_review_role", "") or "").startswith("manager") else "partner_review_note"
|
||||
task.updated_by_user_id = user_id
|
||||
_append_system_task_comment(
|
||||
db,
|
||||
task=task,
|
||||
comment_type=comment_type,
|
||||
message=clean_note or ("Normal review approved." if clean_decision == "reviewed" else clean_note),
|
||||
user_id=user_id,
|
||||
)
|
||||
|
||||
|
||||
def apply_task_review(
|
||||
db: Session,
|
||||
*,
|
||||
|
||||
Reference in New Issue
Block a user