Add client groups and family tracking

This commit is contained in:
A R R R Associates
2026-07-25 22:32:35 +05:30
parent 5e6584702c
commit 2dc2a712e8
21 changed files with 444 additions and 161 deletions
+11
View File
@@ -55,6 +55,7 @@ from app.modules.core.rbac.deps import get_user_permissions, get_user_roles
from app.modules.core.rbac.permission_guard import require_permission
from app.modules.services.execution import list_client_visible_task_comments
from app.modules.clients.auditor_service import build_client_auditor_card
from app.modules.client_groups.service import get_group, list_groups
from app.modules.clients.portal_service import (
build_client_portal_summary,
create_client_reply,
@@ -173,6 +174,9 @@ def _build_form_payload(request: Request, user, scope, *, include_client_code: b
"tenant_id": tenant_id,
"branch_id": branch_id,
"partner_id": partner_id,
"client_group_id": int(form.get("client_group_id")) if form.get("client_group_id") not in (None, "", "None") else None,
"group_relationship": form.get("group_relationship"),
"is_group_head": _form_bool(form.get("is_group_head")),
"default_review_partner_user_id": int(form.get("default_review_partner_user_id")) if form.get("default_review_partner_user_id") not in (None, "", "None") else None,
"referred_by_consultant_id": int(form.get("referred_by_consultant_id")) if form.get("referred_by_consultant_id") not in (None, "", "None") else None,
"primary_consultant_id": int(form.get("primary_consultant_id")) if form.get("primary_consultant_id") not in (None, "", "None") else None,
@@ -260,6 +264,7 @@ def _form_options(db, scope, form_mode: str):
"active_tenant_id": tenant_id,
"active_branch_id": branch_id,
"consultants": list_consultants(db, tenant_id=tenant_id, include_inactive=False) if tenant_id else [],
"client_groups": [item["group"] for item in list_groups(db, tenant_id=tenant_id)] if tenant_id else [],
}
return {
@@ -271,6 +276,7 @@ def _form_options(db, scope, form_mode: str):
branch_id=None if scope.allow_cross_branch else branch_id,
),
"consultants": list_consultants(db, tenant_id=tenant_id, branch_id=branch_id, include_inactive=False),
"client_groups": [item["group"] for item in list_groups(db, tenant_id=tenant_id)],
"review_partners": repository.list_partners_for_scope(
db,
tenant_id=tenant_id,
@@ -287,6 +293,7 @@ def clients_list(
q: str = "",
status: str = "",
client_type: str = "",
client_group_id: int | None = None,
partner_id: int | None = None,
include_archived: bool = False,
page: int = 1,
@@ -313,6 +320,7 @@ def clients_list(
status=status,
client_type=client_type,
partner_id=partner_id,
client_group_id=client_group_id,
include_archived=include_archived,
page=page,
per_page=per_page,
@@ -332,6 +340,7 @@ def clients_list(
q=filters.q,
status=filters.status,
client_type=filters.client_type,
client_group_id=filters.client_group_id,
include_archived=filters.include_archived,
page=filters.page,
per_page=filters.per_page,
@@ -354,6 +363,7 @@ def clients_list(
status=filters.status,
client_type=filters.client_type,
partner_id=filters.partner_id,
client_group_id=filters.client_group_id,
include_archived=filters.include_archived,
page=filters.page,
per_page=filters.per_page,
@@ -697,6 +707,7 @@ def client_detail(request: Request, client_id: int):
can_archive=has("clients.archive"),
can_restore=has("clients.restore"),
consultant_summary=get_client_consultant_summary(db, tenant_id=int(row["tenant_id"]), client_id=client_id),
client_group=get_group(db, tenant_id=int(row["tenant_id"]), group_id=int(row["client_group_id"])) if row.get("client_group_id") else None,
can_manage_acceptance=has("clients.acceptance.manage"),
can_approve_acceptance=has("clients.acceptance.approve"),
)