Upgrade unified reports centre to v2

This commit is contained in:
A R R R Associates
2026-07-06 12:15:32 +05:30
parent 2689cb28a6
commit 47f5080d43
10 changed files with 250 additions and 100 deletions
+92 -64
View File
@@ -10,6 +10,7 @@ MANAGER = {"Manager", "Branch Manager"}
STAFF = {"Staff", "Employee"}
CLIENT = {"Client"}
CONSULTANT = {"Consultant"}
ALL_DASHBOARD_ROLES = SYSTEM_ADMIN | FIRM_ADMIN | PARTNER | MANAGER | STAFF | CLIENT | CONSULTANT
@dataclass(frozen=True)
@@ -20,10 +21,12 @@ class ReportCard:
group: str
roles: tuple[str, ...]
badge: str = "Open"
area: str = "General"
importance: int = 50
def _role_set(roles: Iterable[str] | None) -> set[str]:
return {str(r).strip() for r in (roles or []) if str(r).strip()}
return {str(role).strip() for role in (roles or []) if str(role).strip()}
def _has_any(user_roles: set[str], allowed: set[str]) -> bool:
@@ -33,7 +36,7 @@ def _has_any(user_roles: set[str], allowed: set[str]) -> bool:
def can_access_reports(roles: Iterable[str] | None, permissions: Iterable[str] | None = None) -> bool:
role_set = _role_set(roles)
permission_set = set(permissions or [])
if role_set.intersection(SYSTEM_ADMIN | FIRM_ADMIN | PARTNER | MANAGER | STAFF | CLIENT | CONSULTANT):
if role_set.intersection(ALL_DASHBOARD_ROLES):
return True
return bool(permission_set.intersection({
"system.settings.view",
@@ -44,77 +47,86 @@ def can_access_reports(roles: Iterable[str] | None, permissions: Iterable[str] |
"employees.ess.view",
"employees.work.view_self",
"consultants.view",
"alerts.view",
}))
def _all_cards() -> list[ReportCard]:
return [
# System Admin
ReportCard("Firm Setup Completeness", "Review firm, branch, FY, admin invite, services and branding readiness.", "/system-admin/dashboard?tab=firm-setup-health", "system", ("System Admin",), "Dashboard"),
ReportCard("Firm List / Tenant Report", "Open platform firm list with branch, user and setup summary.", "/system-admin/dashboard?tab=firms", "system", ("System Admin",), "Dashboard"),
ReportCard("Service Catalogue Readiness", "Check service categories, catalogue items and default task template readiness.", "/system-admin/dashboard?tab=catalogue", "system", ("System Admin",), "Dashboard"),
ReportCard("Platform SMTP Status", "Review platform SMTP configuration used for firm invites and system emails.", "/system-admin/dashboard?tab=smtp", "system", ("System Admin",), "Dashboard"),
ReportCard("Storage Status", "Review persistent storage, branding storage and backup storage readiness.", "/system-admin/dashboard?tab=storage", "system", ("System Admin",), "Dashboard"),
ReportCard("Platform Audit Logs", "Open audit log trail for platform-level actions.", "/system-admin/dashboard?tab=audit-logs", "audit", ("System Admin",), "Dashboard"),
ReportCard("Platform Billing Readiness", "Review platform billing and subscription readiness indicators.", "/system-admin/dashboard?tab=billing", "billing", ("System Admin",), "Dashboard"),
ReportCard("Platform Overview", "Open platform KPIs, firm status, SMTP, storage and setup indicators.", "/system-admin/dashboard", "system", ("System Admin",), "Dashboard", "Platform", 5),
ReportCard("Firm Setup Completeness", "Review firm, branch, FY, admin invite, services and branding readiness.", "/system-admin/dashboard?tab=firm-setup-health", "system", ("System Admin",), "Dashboard", "Setup", 10),
ReportCard("Firm List / Tenant Report", "Open platform firm list with branch, user and setup summary.", "/system-admin/dashboard?tab=firms", "system", ("System Admin",), "Dashboard", "Platform", 20),
ReportCard("Service Catalogue Readiness", "Check service categories, catalogue items and default task template readiness.", "/system-admin/dashboard?tab=catalogue", "system", ("System Admin",), "Dashboard", "Services", 30),
ReportCard("Platform SMTP Status", "Review platform SMTP configuration used for firm invites and system emails.", "/system-admin/dashboard?tab=smtp", "system", ("System Admin",), "Dashboard", "Email", 35),
ReportCard("Storage Status", "Review persistent storage, branding storage and backup storage readiness.", "/system-admin/dashboard?tab=storage", "system", ("System Admin",), "Dashboard", "Storage", 40),
ReportCard("Platform Billing Readiness", "Review platform billing and subscription readiness indicators.", "/system-admin/dashboard?tab=billing", "billing", ("System Admin",), "Dashboard", "Billing", 45),
ReportCard("Platform Audit Logs", "Open audit log trail for platform-level actions.", "/system-admin/dashboard?tab=audit-logs", "audit", ("System Admin",), "Dashboard", "Audit", 50),
# Firm Admin
ReportCard("Branch Setup Report", "Review branches, primary branch readiness and branch setup shortcuts.", "/firm-admin/dashboard?tab=branches", "system", ("Firm Admin",), "Dashboard"),
ReportCard("Users & Roles Report", "Review user access, roles and invite/admin readiness for the firm.", "/firm-admin/dashboard?tab=users", "system", ("Firm Admin",), "Dashboard"),
ReportCard("Firm Settings Completion", "Open firm profile, branding, SMTP and setup status.", "/firm-admin/dashboard?tab=firm-settings", "system", ("Firm Admin",), "Dashboard"),
ReportCard("Services Setup Readiness", "Review selected services and task-template setup readiness.", "/firm-admin/dashboard?tab=services", "work", ("Firm Admin",), "Dashboard"),
ReportCard("Financial Year Report", "Review active FY, FY backup/lock and year setup readiness.", "/firm-admin/dashboard?tab=financial-years", "system", ("Firm Admin",), "Dashboard"),
ReportCard("Firm Audit Logs", "Open firm administration audit activity.", "/firm-admin/dashboard?tab=audit-logs", "audit", ("Firm Admin",), "Dashboard"),
ReportCard("Firm Administration Overview", "Open firm setup health, branches, users, services, FY and settings.", "/firm-admin/dashboard", "system", ("Firm Admin",), "Dashboard", "Firm Setup", 5),
ReportCard("Branch Setup Report", "Review branches, primary branch readiness and branch setup shortcuts.", "/firm-admin/dashboard?tab=branches", "system", ("Firm Admin",), "Dashboard", "Branches", 10),
ReportCard("Users & Roles Report", "Review user access, roles and invite/admin readiness for the firm.", "/firm-admin/dashboard?tab=users", "system", ("Firm Admin",), "Dashboard", "Users", 15),
ReportCard("Firm Settings Completion", "Open firm profile, branding, SMTP and setup status.", "/firm-admin/dashboard?tab=firm-settings", "system", ("Firm Admin",), "Dashboard", "Settings", 20),
ReportCard("Services Setup Readiness", "Review selected services and task-template setup readiness.", "/firm-admin/dashboard?tab=services", "work", ("Firm Admin",), "Dashboard", "Services", 25),
ReportCard("Financial Year Report", "Review active FY, FY backup/lock and year setup readiness.", "/firm-admin/dashboard?tab=financial-years", "system", ("Firm Admin",), "Dashboard", "FY", 30),
ReportCard("Firm Administration Audit Logs", "Open firm administration audit activity.", "/firm-admin/dashboard?tab=audit-logs", "audit", ("Firm Admin",), "Dashboard", "Audit", 35),
# Partner
ReportCard("Branch Work Report", "Review branch work status, due work and service-wise operational load.", "/partner/dashboard?tab=branch-work", "work", ("Partner",), "Dashboard"),
ReportCard("Partner Client Report", "Review branch clients, service mapping, pending work and status.", "/partner/dashboard?tab=clients", "client", ("Partner",), "Dashboard"),
ReportCard("Partner Staff Workload", "Review staff workload, open tasks, overdue and review pending work.", "/partner/dashboard?tab=staff", "work", ("Partner",), "Dashboard"),
ReportCard("Partner Review Pending", "Open partner-level review queue and pending approvals.", "/partner/dashboard?tab=review", "work", ("Partner",), "Dashboard"),
ReportCard("Branch Billing Report", "Review branch billing, unbilled work and collection indicators.", "/partner/dashboard?tab=billing", "billing", ("Partner",), "Dashboard"),
ReportCard("Partner Operations Overview", "Open branch operations, client work, staff load, review and billing status.", "/partner/dashboard", "work", ("Partner",), "Dashboard", "Operations", 5),
ReportCard("Branch Work Report", "Review branch work status, due work and service-wise operational load.", "/partner/dashboard?tab=branch-work", "work", ("Partner",), "Dashboard", "Work", 10),
ReportCard("Partner Client Report", "Review branch clients, service mapping, pending work and status.", "/partner/dashboard?tab=clients", "client", ("Partner",), "Dashboard", "Clients", 15),
ReportCard("Partner Staff Workload", "Review staff workload, open tasks, overdue and review pending work.", "/partner/dashboard?tab=staff", "work", ("Partner",), "Dashboard", "Staff", 20),
ReportCard("Partner Review Pending", "Open partner-level review queue and pending approvals.", "/partner/dashboard?tab=review", "work", ("Partner",), "Dashboard", "Review", 25),
ReportCard("Branch Billing Report", "Review branch billing, unbilled work and collection indicators.", "/partner/dashboard?tab=billing", "billing", ("Partner",), "Dashboard", "Billing", 30),
# Manager
ReportCard("Team Work Report", "Review team work, due tasks, workload and current execution status.", "/manager/dashboard?tab=team-work", "work", ("Manager", "Branch Manager"), "Dashboard"),
ReportCard("Manager Due Calendar", "Review due calendar, upcoming work and ageing buckets.", "/manager/dashboard?tab=due-calendar", "work", ("Manager", "Branch Manager"), "Dashboard"),
ReportCard("Manager Review Queue", "Open tasks waiting for manager review or correction.", "/manager/dashboard?tab=review-queue", "work", ("Manager", "Branch Manager"), "Dashboard"),
ReportCard("Client Pending Under Manager", "Review tasks blocked because client data or documents are pending.", "/manager/dashboard?tab=client-pending", "client", ("Manager", "Branch Manager"), "Dashboard"),
ReportCard("Document Pending Report", "Review document requirements, uploads and pending work papers.", "/manager/dashboard?tab=documents", "work", ("Manager", "Branch Manager"), "Dashboard"),
ReportCard("Escalation Register", "Review overdue, ageing and escalation items under manager control.", "/manager/dashboard?tab=escalations", "audit", ("Manager", "Branch Manager"), "Dashboard"),
ReportCard("Manager Execution Overview", "Open team work, due calendar, review queue and escalations.", "/manager/dashboard", "work", ("Manager", "Branch Manager"), "Dashboard", "Execution", 5),
ReportCard("Team Work Report", "Review team work, due tasks, workload and current execution status.", "/manager/dashboard?tab=team-work", "work", ("Manager", "Branch Manager"), "Dashboard", "Team", 10),
ReportCard("Manager Due Calendar", "Review due calendar, upcoming work and ageing buckets.", "/manager/dashboard?tab=due-calendar", "work", ("Manager", "Branch Manager"), "Dashboard", "Due Dates", 15),
ReportCard("Manager Review Queue", "Open tasks waiting for manager review or correction.", "/manager/dashboard?tab=review-queue", "work", ("Manager", "Branch Manager"), "Dashboard", "Review", 20),
ReportCard("Client Pending Under Manager", "Review tasks blocked because client data or documents are pending.", "/manager/dashboard?tab=client-pending", "client", ("Manager", "Branch Manager"), "Dashboard", "Client Pending", 25),
ReportCard("Document Pending Report", "Review document requirements, uploads and pending work papers.", "/manager/dashboard?tab=documents", "work", ("Manager", "Branch Manager"), "Dashboard", "Documents", 30),
ReportCard("Escalation Register", "Review overdue, ageing and escalation items under manager control.", "/manager/dashboard?tab=escalations", "audit", ("Manager", "Branch Manager"), "Dashboard", "Escalations", 35),
# Employee / Staff
ReportCard("My Pending Tasks", "Open my work board and pending assigned tasks.", "/employee/dashboard?tab=work", "my", ("Staff", "Employee"), "Portal"),
ReportCard("My Due Today", "Open work due today from the employee portal.", "/employee/dashboard?tab=work", "my", ("Staff", "Employee"), "Portal"),
ReportCard("My Overdue Tasks", "Open overdue and returned work from the employee portal.", "/employee/dashboard?tab=work", "my", ("Staff", "Employee"), "Portal"),
ReportCard("My Attendance Report", "Open attendance punch details and attendance history.", "/employee/dashboard?tab=attendance", "hr", ("Staff", "Employee"), "Portal"),
ReportCard("My Leave Report", "Open leave, balances and leave activity from HR profile.", "/employee/dashboard?tab=hr", "hr", ("Staff", "Employee"), "Portal"),
ReportCard("My Documents Report", "Open my documents and uploaded work papers.", "/employee/dashboard?tab=work", "my", ("Staff", "Employee"), "Portal"),
ReportCard("Employee Portal Overview", "Open staff dashboard with attendance, work, HR, documents and reports.", "/employee/dashboard", "my", ("Staff", "Employee"), "Portal", "Personal", 5),
ReportCard("My Pending Tasks", "Open my work board and pending assigned tasks.", "/employee/dashboard?tab=work", "my", ("Staff", "Employee"), "Portal", "Work", 10),
ReportCard("My Due Today", "Open due today work from the employee portal work section.", "/employee/dashboard?tab=work", "my", ("Staff", "Employee"), "Portal", "Work", 15),
ReportCard("My Overdue Tasks", "Open overdue and returned work from the employee portal.", "/employee/dashboard?tab=work", "my", ("Staff", "Employee"), "Portal", "Work", 20),
ReportCard("My Attendance Report", "Open attendance punch details and attendance history.", "/employee/dashboard?tab=attendance", "hr", ("Staff", "Employee"), "Portal", "Attendance", 25),
ReportCard("My Leave Report", "Open leave, balances and leave activity from HR profile.", "/employee/dashboard?tab=hr", "hr", ("Staff", "Employee"), "Portal", "Leave", 30),
ReportCard("My Documents Report", "Open my documents and uploaded work papers.", "/employee/dashboard?tab=work", "my", ("Staff", "Employee"), "Portal", "Documents", 35),
# Client
ReportCard("My Compliance Status", "Review service-wise compliance and current work status.", "/client/dashboard?tab=services-documents", "client", ("Client",), "Portal"),
ReportCard("Pending From Me", "Open documents, data and replies pending from the client side.", "/client/dashboard?tab=action-centre", "client", ("Client",), "Portal"),
ReportCard("Document History", "Open uploaded documents, firm shared documents and acknowledgements.", "/client/dashboard?tab=services-documents", "client", ("Client",), "Portal"),
ReportCard("Invoice Outstanding", "Open invoices, outstanding amounts and payment status.", "/client/dashboard?tab=billing-messages", "billing", ("Client",), "Portal"),
ReportCard("Payment History", "Open payment and receipt information in the client portal.", "/client/dashboard?tab=billing-messages", "billing", ("Client",), "Portal"),
ReportCard("Messages / Queries", "Open firm messages and query responses.", "/client/dashboard?tab=billing-messages", "client", ("Client",), "Portal"),
ReportCard("Client Portal Overview", "Open client portal with pending actions, services, documents, billing and messages.", "/client/dashboard", "client", ("Client",), "Portal", "Client Portal", 5),
ReportCard("Pending From Me", "Open documents, data and replies pending from the client side.", "/client/dashboard?tab=action-centre", "client", ("Client",), "Portal", "Action Centre", 10),
ReportCard("My Compliance Status", "Review service-wise compliance and current work status.", "/client/dashboard?tab=services-documents", "client", ("Client",), "Portal", "Services", 15),
ReportCard("Document History", "Open uploaded documents, firm shared documents and acknowledgements.", "/client/dashboard?tab=services-documents", "client", ("Client",), "Portal", "Documents", 20),
ReportCard("Invoice Outstanding", "Open invoices, outstanding amounts and payment status.", "/client/dashboard?tab=billing-messages", "billing", ("Client",), "Portal", "Billing", 25),
ReportCard("Payment History", "Open payment and receipt information in the client portal.", "/client/dashboard?tab=billing-messages", "billing", ("Client",), "Portal", "Payments", 30),
ReportCard("Messages / Queries", "Open firm messages and query responses.", "/client/dashboard?tab=billing-messages", "client", ("Client",), "Portal", "Messages", 35),
# Consultant
ReportCard("Assigned Work Report", "Review consultant work centre and assigned tasks.", "/consultant/dashboard?tab=work-centre", "my", ("Consultant",), "Portal"),
ReportCard("Consultant Pending Work", "Review pending, due and overdue consultant assignments.", "/consultant/dashboard?tab=work-centre", "my", ("Consultant",), "Portal"),
ReportCard("Consultant Client Report", "Review consultant-linked clients and service requests.", "/consultant/dashboard?tab=clients-requests", "client", ("Consultant",), "Portal"),
ReportCard("Document Pending for Consultant", "Review consultant document and working paper requirements.", "/consultant/dashboard?tab=documents-clarifications", "my", ("Consultant",), "Portal"),
ReportCard("Clarification Pending", "Review clarifications between firm and consultant.", "/consultant/dashboard?tab=documents-clarifications", "my", ("Consultant",), "Portal"),
ReportCard("Consultant Service Requests", "Review consultant service requests and status.", "/consultant/dashboard?tab=clients-requests", "client", ("Consultant",), "Portal"),
ReportCard("Consultant Portal Overview", "Open consultant portal with work centre, clients, requests, documents and reports.", "/consultant/dashboard", "my", ("Consultant",), "Portal", "Consultant Portal", 5),
ReportCard("Assigned Work Report", "Review consultant work centre and assigned tasks.", "/consultant/dashboard?tab=work-centre", "my", ("Consultant",), "Portal", "Work", 10),
ReportCard("Consultant Pending Work", "Review pending, due and overdue consultant assignments.", "/consultant/dashboard?tab=work-centre", "my", ("Consultant",), "Portal", "Work", 15),
ReportCard("Consultant Client Report", "Review consultant-linked clients and service requests.", "/consultant/dashboard?tab=clients-requests", "client", ("Consultant",), "Portal", "Clients", 20),
ReportCard("Document Pending for Consultant", "Review consultant document and working paper requirements.", "/consultant/dashboard?tab=documents-clarifications", "my", ("Consultant",), "Portal", "Documents", 25),
ReportCard("Clarification Pending", "Review clarifications between firm and consultant.", "/consultant/dashboard?tab=documents-clarifications", "my", ("Consultant",), "Portal", "Clarifications", 30),
ReportCard("Consultant Service Requests", "Review consultant service requests and status.", "/consultant/dashboard?tab=clients-requests", "client", ("Consultant",), "Portal", "Requests", 35),
# Existing module shortcuts visible to operational users
ReportCard("Client Master", "Open the existing client master list and filters.", "/clients", "client", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module"),
ReportCard("Work Tracker", "Open the existing work tracker for operational task follow-up.", "/services/work-tracker", "work", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module"),
ReportCard("Subscriptions", "Open client service subscriptions and task generation readiness.", "/services/work-tracker/subscriptions", "work", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module"),
ReportCard("Billing Register", "Open existing billing invoices and payments area.", "/billing", "billing", ("System Admin", "Firm Admin", "Partner"), "Module"),
ReportCard("Billing Payments", "Open existing payment receipts and collections.", "/billing/payments", "billing", ("System Admin", "Firm Admin", "Partner"), "Module"),
ReportCard("Employee Attendance", "Open employee attendance administration page.", "/employees/attendance", "hr", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module"),
ReportCard("Employee Progress", "Open employee progress and performance page.", "/employees/progress", "hr", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module"),
ReportCard("Alerts", "Open alerts and notification centre.", "/alerts", "audit", ("System Admin", "Firm Admin", "Partner", "Manager", "Staff", "Employee", "Client", "Consultant"), "Module"),
ReportCard("Audit Logs", "Open existing audit log page.", "/system-settings/audit-logs", "audit", ("System Admin", "Firm Admin"), "Module"),
ReportCard("Client Master", "Open the existing client master list and filters.", "/clients", "client", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module", "Clients", 40),
ReportCard("Documents Module", "Open document management and client/task document records.", "/documents", "client", ("System Admin", "Firm Admin", "Partner", "Manager", "Staff", "Employee"), "Module", "Documents", 45),
ReportCard("Work Tracker", "Open the existing work tracker for operational task follow-up.", "/services/work-tracker", "work", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module", "Tasks", 40),
ReportCard("Subscriptions", "Open client service subscriptions and task generation readiness.", "/services/work-tracker/subscriptions", "work", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module", "Services", 45),
ReportCard("Billing Register", "Open existing billing invoices and payments area.", "/billing", "billing", ("System Admin", "Firm Admin", "Partner"), "Module", "Invoices", 40),
ReportCard("Billing Payments", "Open existing payment receipts and collections.", "/billing/payments", "billing", ("System Admin", "Firm Admin", "Partner"), "Module", "Payments", 45),
ReportCard("Employee Attendance", "Open employee attendance administration page.", "/employees/attendance", "hr", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module", "Attendance", 40),
ReportCard("Employee Progress", "Open employee progress and performance page.", "/employees/progress", "hr", ("System Admin", "Firm Admin", "Partner", "Manager"), "Module", "Progress", 45),
ReportCard("Alerts", "Open alerts and notification centre.", "/alerts", "audit", ("System Admin", "Firm Admin", "Partner", "Manager", "Staff", "Employee", "Client", "Consultant"), "Module", "Alerts", 40),
ReportCard("Audit Logs", "Open existing audit log page.", "/system-settings/audit-logs", "audit", ("System Admin", "Firm Admin"), "Module", "Audit", 45),
]
@@ -126,33 +138,45 @@ def _visible(card: ReportCard, roles: set[str]) -> bool:
def get_visible_report_cards(roles: Iterable[str] | None, permissions: Iterable[str] | None = None) -> list[ReportCard]:
roles_set = _role_set(roles)
cards = [card for card in _all_cards() if _visible(card, roles_set)]
cards = sorted([card for card in _all_cards() if _visible(card, roles_set)], key=lambda c: (c.importance, c.title))
# Permission fallback for older accounts where explicit role names may be absent.
permission_set = set(permissions or [])
if not cards:
if "clients.view" in permission_set:
cards.append(ReportCard("Client Master", "Open the existing client master list and filters.", "/clients", "client", tuple(), "Module"))
cards.append(ReportCard("Client Master", "Open the existing client master list and filters.", "/clients", "client", tuple(), "Module", "Clients", 10))
if "services.view" in permission_set:
cards.append(ReportCard("Work Tracker", "Open the existing work tracker for operational task follow-up.", "/services/work-tracker", "work", tuple(), "Module"))
cards.append(ReportCard("Work Tracker", "Open the existing work tracker for operational task follow-up.", "/services/work-tracker", "work", tuple(), "Module", "Tasks", 10))
if "billing.view" in permission_set:
cards.append(ReportCard("Billing Register", "Open existing billing invoices and payments area.", "/billing", "billing", tuple(), "Module"))
cards.append(ReportCard("Billing Register", "Open existing billing invoices and payments area.", "/billing", "billing", tuple(), "Module", "Invoices", 10))
if "employees.ess.view" in permission_set or "employees.work.view_self" in permission_set:
cards.append(ReportCard("My Employee Portal", "Open your employee dashboard, attendance and work board.", "/employee/dashboard", "my", tuple(), "Portal"))
cards.append(ReportCard("My Employee Portal", "Open your employee dashboard, attendance and work board.", "/employee/dashboard", "my", tuple(), "Portal", "Personal", 10))
return cards
def cards_by_group(cards: Iterable[ReportCard]) -> dict[str, list[ReportCard]]:
groups = {"my": [], "work": [], "client": [], "billing": [], "hr": [], "system": [], "audit": []}
groups = {"overview": [], "my": [], "work": [], "client": [], "billing": [], "hr": [], "system": [], "audit": []}
for card in cards:
groups.setdefault(card.group, []).append(card)
return groups
def cards_by_area(cards: Iterable[ReportCard]) -> dict[str, list[ReportCard]]:
area_groups: dict[str, list[ReportCard]] = {}
for card in cards:
area_groups.setdefault(card.area, []).append(card)
return dict(sorted(area_groups.items(), key=lambda item: item[0]))
def recommended_cards(cards: Iterable[ReportCard], limit: int = 8) -> list[ReportCard]:
return sorted(list(cards), key=lambda c: (c.importance, c.title))[:limit]
def get_report_summary(cards: Iterable[ReportCard]) -> dict[str, int]:
groups = cards_by_group(cards)
all_cards = list(cards)
return {
"total": sum(len(v) for v in groups.values()),
"total": len(all_cards),
"my": len(groups.get("my", [])),
"work": len(groups.get("work", [])),
"client": len(groups.get("client", [])),
@@ -160,17 +184,21 @@ def get_report_summary(cards: Iterable[ReportCard]) -> dict[str, int]:
"hr": len(groups.get("hr", [])),
"system": len(groups.get("system", [])),
"audit": len(groups.get("audit", [])),
"dashboards": len([card for card in all_cards if card.badge == "Dashboard"]),
"portals": len([card for card in all_cards if card.badge == "Portal"]),
"modules": len([card for card in all_cards if card.badge == "Module"]),
}
def get_report_tabs(cards: Iterable[ReportCard]) -> list[dict[str, str | int]]:
summary = get_report_summary(cards)
return [
{"key": "overview", "label": "Overview", "count": summary["total"]},
{"key": "my-reports", "label": "My Reports", "count": summary["my"]},
{"key": "work", "label": "Work Reports", "count": summary["work"]},
{"key": "client", "label": "Client Reports", "count": summary["client"]},
{"key": "billing", "label": "Billing Reports", "count": summary["billing"]},
{"key": "work", "label": "Work", "count": summary["work"]},
{"key": "client", "label": "Client & Documents", "count": summary["client"]},
{"key": "billing", "label": "Billing", "count": summary["billing"]},
{"key": "hr", "label": "HR / Attendance", "count": summary["hr"]},
{"key": "system", "label": "System Reports", "count": summary["system"]},
{"key": "system", "label": "System & Setup", "count": summary["system"]},
{"key": "audit", "label": "Audit / Alerts", "count": summary["audit"]},
]