diff --git a/app/modules/manager_dashboard/ui.py b/app/modules/manager_dashboard/ui.py index fb42707..c5da6e2 100644 --- a/app/modules/manager_dashboard/ui.py +++ b/app/modules/manager_dashboard/ui.py @@ -167,6 +167,7 @@ def manager_review_task_submit( decision=decision, note=review_note, user_id=current_user.id, + reviewer_kind="manager", ) else: apply_task_review( diff --git a/app/modules/partner_dashboard/ui.py b/app/modules/partner_dashboard/ui.py index caf25ad..219d2f6 100644 --- a/app/modules/partner_dashboard/ui.py +++ b/app/modules/partner_dashboard/ui.py @@ -156,6 +156,7 @@ def partner_review_task_submit( decision=decision, note=review_note, user_id=current_user.id, + reviewer_kind="partner", ) else: apply_task_review( diff --git a/app/modules/services/execution.py b/app/modules/services/execution.py index ddaf843..fc0ca44 100644 --- a/app/modules/services/execution.py +++ b/app/modules/services/execution.py @@ -378,6 +378,28 @@ def generate_tasks_for_subscription_if_ready( ) +def _sync_normal_review_snapshot_preserving_history( + task: ClientServiceTaskInstance, + *, + template: FirmServiceTaskTemplate, +) -> None: + """Sync only normal-review configuration without rewriting execution/review history.""" + task.normal_review_required = bool(getattr(template, "requires_review", False)) + task.normal_review_role = normal_review_role_for_template(template) + current_status = (getattr(task, "normal_review_status", None) or "not_required").strip().lower() + if not task.normal_review_required: + task.normal_review_status = "not_required" + return + if current_status in {"reviewed", "rework_required"}: + return + if getattr(task, "rework_status", "none") == "open": + task.normal_review_status = "rework_required" + elif getattr(task, "submitted_for_review_at_utc", None) is not None or (getattr(task, "status", "pending") or "pending").strip().lower() == "completed": + task.normal_review_status = "pending" + else: + task.normal_review_status = "not_ready" + + def _copy_template_snapshot_to_task( task: ClientServiceTaskInstance, *, @@ -398,12 +420,7 @@ 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" + _sync_normal_review_snapshot_preserving_history(task, template=template) 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) @@ -547,9 +564,14 @@ def sync_open_engagement_tasks_for_service( template.default_role_name, ) task.assigned_to_user_id = _default_assignee_for_template(subscription, template) + _sync_normal_review_snapshot_preserving_history(task, template=template) task.updated_by_user_id = user_id result["updated_started"] += 1 else: + # Preserve task execution/history, but allow an explicit template sync to + # update only the separated normal-review configuration for existing tasks. + _sync_normal_review_snapshot_preserving_history(task, template=template) + task.updated_by_user_id = user_id result["preserved_history"] += 1 return result @@ -1387,6 +1409,7 @@ def apply_normal_task_review( decision: str, note: str, user_id: int, + reviewer_kind: str | None = None, ) -> None: if getattr(task, "is_locked", False) or getattr(getattr(task, "subscription", None), "is_locked", False): return @@ -1415,7 +1438,13 @@ def apply_normal_task_review( 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" + reviewer = (reviewer_kind or "").strip().lower() + if reviewer == "partner": + comment_type = "partner_review_note" + elif reviewer == "manager": + comment_type = "manager_review_note" + else: + 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,