Add staff visibility workstation enrollment registration vault and category task views
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user