Add staff visibility workstation enrollment registration vault and category task views

This commit is contained in:
A R R R Associates
2026-09-02 14:05:20 +05:30
parent 1fe1597d6f
commit 97777e13a1
22 changed files with 538 additions and 103 deletions
+29 -5
View File
@@ -24,6 +24,8 @@ from app.modules.services.models import (
ClientServiceTaskInstance,
ServiceCatalogue,
ServiceTaskComment,
FirmServiceTaskTemplate,
ServiceTaskCategory,
)
from app.modules.employees.service import _engagement_sla, _engagement_team, _weighted_progress
@@ -266,7 +268,6 @@ def _staff_rows(db: Session, tenant_id: int | None, branch_id: int | None, tasks
.join(Role, Role.id == UserRole.role_id)
.where(
User.tenant_id == tenant_id,
User.is_active.is_(True),
Role.is_active.is_(True),
Role.name.in_(("Staff", "Branch Manager")),
)
@@ -300,13 +301,14 @@ def _staff_rows(db: Session, tenant_id: int | None, branch_id: int | None, tasks
"name": user.full_name or user.email,
"email": user.email,
"designation": user.designation,
"is_active": bool(user.is_active),
"active": stats["active"],
"overdue": stats["overdue"],
"review": stats["review"],
"client_pending": stats["client_pending"],
"load_status": "Heavy" if total >= 40 else ("Balanced" if total >= 10 else "Light"),
})
rows.sort(key=lambda r: (r["active"] + r["review"], r["overdue"]), reverse=True)
rows.sort(key=lambda r: (not r["is_active"], -(r["active"] + r["review"]), -r["overdue"], r["name"].lower()))
return rows[:25]
@@ -442,7 +444,7 @@ def _display_user(user) -> str:
def _partner_task_category(task: ClientServiceTaskInstance) -> str:
return (getattr(task, "task_category", None) or "General Workflow").strip() or "General Workflow"
return (getattr(task, "_resolved_task_category", None) or getattr(task, "task_category", None) or "General Workflow").strip() or "General Workflow"
def _partner_review_level_for_task(task: ClientServiceTaskInstance, subscription: ClientServiceSubscription, current_user) -> str | None:
@@ -650,12 +652,34 @@ def get_partner_review_workspace(db: Session, request, current_user, *, subscrip
.order_by(ClientServiceTaskInstance.sequence_no.asc(), ClientServiceTaskInstance.id.asc())
)
tasks = list(db.execute(task_stmt).scalars().all())
template_ids = {int(t.firm_task_template_id) for t in tasks if getattr(t, "firm_task_template_id", None) is not None}
resolved_categories: dict[int, tuple[str, int]] = {}
if template_ids:
for template_id, legacy_name, master_name, sort_order in db.execute(
select(
FirmServiceTaskTemplate.id,
FirmServiceTaskTemplate.task_category,
ServiceTaskCategory.name,
ServiceTaskCategory.sort_order,
)
.outerjoin(ServiceTaskCategory, ServiceTaskCategory.id == FirmServiceTaskTemplate.task_category_id)
.where(FirmServiceTaskTemplate.id.in_(template_ids))
).all():
name = (master_name or legacy_name or "").strip()
if name:
resolved_categories[int(template_id)] = (name, int(sort_order or 100))
for task in tasks:
template_id = getattr(task, "firm_task_template_id", None)
resolved = resolved_categories.get(int(template_id)) if template_id is not None else None
task._resolved_task_category = resolved[0] if resolved else ((getattr(task, "task_category", None) or "").strip() or "General Workflow")
task._resolved_task_category_sort = resolved[1] if resolved else 100
task_rows = [_partner_task_payload(task, subscription, current_user) for task in tasks]
categories_by_name: dict[str, dict[str, Any]] = {}
for row in task_rows:
source_task = next((t for t in tasks if int(t.id) == int(row["id"])), None)
cat = categories_by_name.setdefault(row["category"], {
"name": row["category"], "tasks": [], "total": 0, "pending": 0,
"name": row["category"], "sort_order": int(getattr(source_task, "_resolved_task_category_sort", 100) or 100), "tasks": [], "total": 0, "pending": 0,
"reviewed": 0, "rework": 0, "exceptions": 0, "blockers": 0,
})
cat["tasks"].append(row)
@@ -665,7 +689,7 @@ def get_partner_review_workspace(db: Session, request, current_user, *, subscrip
if row["review_state"] == "rework": cat["rework"] += 1
if row["is_exception"]: cat["exceptions"] += 1
if row["blocks_final_release"] and row["aqmm_status"] != "completed": cat["blockers"] += 1
categories = list(categories_by_name.values())
categories = sorted(categories_by_name.values(), key=lambda item: (int(item.get("sort_order", 100)), item["name"].lower()))
for cat in categories:
denominator = cat["pending"] + cat["reviewed"] + cat["rework"]
cat["progress_percent"] = int(round((cat["reviewed"] / denominator) * 100)) if denominator else 100