17 KiB
Dashboard Formulas & Calculations Documentation
This document provides a comprehensive breakdown of all formulas and calculations used in the Dashboard for both Admin/Management users and Regular Users.
📊 1. REQUEST VOLUME STATISTICS
Admin/Management View
Scope: All requests across the organization
Formulas:
Total Requests = COUNT(*)
WHERE submission_date BETWEEN :start AND :end
AND is_draft = false
AND is_deleted = false
AND submission_date IS NOT NULL
Approved Requests = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND is_draft = false
Rejected Requests = COUNT(*)
WHERE status = 'REJECTED'
AND submission_date BETWEEN :start AND :end
AND is_draft = false
Pending Requests = COUNT(*)
WHERE status IN ('PENDING', 'IN_PROGRESS')
AND is_draft = false
(Note: Includes ALL pending requests regardless of creation date)
Draft Requests = COUNT(*)
WHERE is_draft = true
Regular User View
Scope: Only requests initiated by the user
Formulas:
Total Requests = COUNT(*)
WHERE submission_date BETWEEN :start AND :end
AND is_draft = false
AND initiator_id = :userId
Approved Requests = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND initiator_id = :userId
AND is_draft = false
Rejected Requests = COUNT(*)
WHERE status = 'REJECTED'
AND submission_date BETWEEN :start AND :end
AND initiator_id = :userId
AND is_draft = false
Pending Requests = COUNT(*)
WHERE status IN ('PENDING', 'IN_PROGRESS')
AND initiator_id = :userId
AND is_draft = false
Draft Requests = COUNT(*)
WHERE is_draft = true
AND initiator_id = :userId
⏱️ 2. TAT EFFICIENCY & SLA COMPLIANCE
Admin/Management View
Scope: All completed requests in date range
Formulas:
Completed Requests = COUNT(*)
WHERE status IN ('APPROVED', 'REJECTED')
AND is_draft = false
AND submission_date IS NOT NULL
AND (
(closure_date IS NOT NULL AND closure_date BETWEEN :start AND :end)
OR (closure_date IS NULL AND updated_at BETWEEN :start AND :end)
)
Breached Requests = COUNT(DISTINCT request_id)
WHERE EXISTS (
SELECT 1 FROM tat_alerts ta
WHERE ta.request_id = wf.request_id
AND ta.is_breached = true
)
Compliant Requests = Total Completed - Breached Requests
SLA Compliance % = ROUND((Compliant Requests / Total Completed) × 100, 0)
If Total Completed = 0, then Compliance = 0%
Average Cycle Time (Hours) = ROUND(SUM(cycle_times) / COUNT(cycle_times), 1)
Where cycle_time = calculateElapsedWorkingHours(submission_date, completion_date, priority)
(Respects working hours, weekends, holidays based on priority)
Average Cycle Time (Days) = ROUND(Average Cycle Time (Hours) / 8, 1)
(Assumes 8 working hours per day)
Regular User View
Scope: Only completed requests initiated by the user
Formulas:
Completed Requests = COUNT(*)
WHERE status IN ('APPROVED', 'REJECTED')
AND is_draft = false
AND submission_date IS NOT NULL
AND initiator_id = :userId
AND (
(closure_date IS NOT NULL AND closure_date BETWEEN :start AND :end)
OR (closure_date IS NULL AND updated_at BETWEEN :start AND :end)
)
Breached Requests = COUNT(DISTINCT request_id)
WHERE initiator_id = :userId
AND EXISTS (
SELECT 1 FROM tat_alerts ta
WHERE ta.request_id = wf.request_id
AND ta.is_breached = true
)
Compliant Requests = Total Completed - Breached Requests
SLA Compliance % = ROUND((Compliant Requests / Total Completed) × 100, 0)
Average Cycle Time (Hours) = Same calculation as Admin
Average Cycle Time (Days) = Same calculation as Admin
Note: Breaches are tracked at approver/level level but counted at request level for SLA compliance.
👤 3. APPROVER LOAD STATISTICS
Admin/Management View
Not Applicable - This metric is user-specific
Regular User View
Scope: User's approval workload
Formulas:
Pending Actions = COUNT(DISTINCT level_id)
WHERE approver_id = :userId
AND status = 'IN_PROGRESS'
AND request.status IN ('PENDING', 'IN_PROGRESS')
AND is_draft = false
AND level_number = request.current_level
(Only counts requests at user's current active level)
Completed Today = COUNT(*)
WHERE approver_id = :userId
AND status IN ('APPROVED', 'REJECTED')
AND action_date BETWEEN :start AND :end
(Date range start/end for "today")
Completed This Week = COUNT(*)
WHERE approver_id = :userId
AND status IN ('APPROVED', 'REJECTED')
AND action_date >= start_of_week
AND action_date BETWEEN :start AND :end
📝 4. ENGAGEMENT STATISTICS
Admin/Management View
Scope: All work notes and documents across organization
Formulas:
Work Notes Added = COUNT(*)
FROM work_notes wn
WHERE wn.created_at BETWEEN :start AND :end
Attachments Uploaded = COUNT(*)
FROM documents d
WHERE d.uploaded_at BETWEEN :start AND :end
Regular User View
Scope: Only from requests initiated by the user
Formulas:
Work Notes Added = COUNT(*)
FROM work_notes wn
WHERE wn.created_at BETWEEN :start AND :end
AND EXISTS (
SELECT 1 FROM workflow_requests wf
WHERE wf.request_id = wn.request_id
AND wf.initiator_id = :userId
AND wf.is_draft = false
)
Attachments Uploaded = COUNT(*)
FROM documents d
WHERE d.uploaded_at BETWEEN :start AND :end
AND EXISTS (
SELECT 1 FROM workflow_requests wf
WHERE wf.request_id = d.request_id
AND wf.initiator_id = :userId
AND wf.is_draft = false
)
🤖 5. AI INSIGHTS
Admin/Management View
Scope: All approved requests with conclusion remarks
Formulas:
Total with Conclusion = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND conclusion_remark IS NOT NULL
AND is_draft = false
AI Generated Count = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND ai_generated_conclusion IS NOT NULL
AND ai_generated_conclusion != ''
AND is_draft = false
Manual Count = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND (ai_generated_conclusion IS NULL OR ai_generated_conclusion = '')
AND is_draft = false
AI Adoption % = ROUND((AI Generated Count / Total with Conclusion) × 100, 0)
Average Remark Length = ROUND(AVG(LENGTH(conclusion_remark)), 0)
WHERE status = 'APPROVED'
AND conclusion_remark IS NOT NULL
Regular User View
Scope: Only approved requests initiated by the user
Formulas:
Total with Conclusion = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND conclusion_remark IS NOT NULL
AND initiator_id = :userId
AND is_draft = false
AI Generated Count = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND ai_generated_conclusion IS NOT NULL
AND ai_generated_conclusion != ''
AND initiator_id = :userId
AND is_draft = false
Manual Count = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND (ai_generated_conclusion IS NULL OR ai_generated_conclusion = '')
AND initiator_id = :userId
AND is_draft = false
AI Adoption % = ROUND((AI Generated Count / Total with Conclusion) × 100, 0)
Average Remark Length = Same calculation as Admin (filtered by initiator_id)
📈 6. SUCCESS RATE (Regular Users Only)
Formula:
Success Rate % = ROUND((Approved Requests / Total Requests) × 100, 0)
If Total Requests = 0, then Success Rate = 0%
Where:
Approved Requests = From Request Volume Statistics
Total Requests = From Request Volume Statistics
🏢 7. DEPARTMENT STATISTICS (Admin Only)
Scope: All requests grouped by initiator's department
Formulas:
Department Stats = GROUP BY initiator.department
Total Requests per Dept = COUNT(*)
WHERE submission_date BETWEEN :start AND :end
AND is_draft = false
GROUP BY initiator.department
Approved per Dept = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND is_draft = false
GROUP BY initiator.department
Rejected per Dept = COUNT(*)
WHERE status = 'REJECTED'
AND submission_date BETWEEN :start AND :end
AND is_draft = false
GROUP BY initiator.department
In Progress per Dept = COUNT(*)
WHERE status IN ('PENDING', 'IN_PROGRESS')
AND submission_date BETWEEN :start AND :end
AND is_draft = false
GROUP BY initiator.department
Approval Rate per Dept = ROUND((Approved / Total Requests) × 100, 0)
If Total Requests = 0, then Approval Rate = 0%
Note: Limited to top 10 departments by total requests.
🎯 8. PRIORITY DISTRIBUTION (Admin Only)
Scope: All requests grouped by priority (EXPRESS vs STANDARD)
Formulas:
Total Count per Priority = COUNT(*)
WHERE submission_date BETWEEN :start AND :end
AND is_draft = false
GROUP BY priority
Approved Count per Priority = COUNT(*)
WHERE status = 'APPROVED'
AND submission_date BETWEEN :start AND :end
AND is_draft = false
GROUP BY priority
Breached Count per Priority = COUNT(DISTINCT request_id)
WHERE EXISTS (
SELECT 1 FROM tat_alerts ta
WHERE ta.request_id = wf.request_id
AND ta.is_breached = true
)
GROUP BY priority
Average Cycle Time per Priority = ROUND(SUM(cycle_times) / COUNT(cycle_times), 1)
Where cycle_time = calculateElapsedWorkingHours(submission_date, completion_date, priority)
Only for COMPLETED requests (status IN ('APPROVED', 'REJECTED'))
GROUP BY priority
Compliance Rate per Priority = ROUND(((Total Count - Breached Count) / Total Count) × 100, 0)
If Total Count = 0, then Compliance Rate = 0%
👥 9. APPROVER PERFORMANCE (Admin Only)
Scope: All approvers who completed approvals in date range
Formulas:
Total Approved per Approver = COUNT(DISTINCT level_id)
WHERE approver_id = :approverId
AND action_date BETWEEN :start AND :end
AND status IN ('APPROVED', 'REJECTED')
AND action_date IS NOT NULL
AND level_start_time IS NOT NULL
AND tat_hours > 0
AND elapsed_hours > 0
Within TAT Count = COUNT(DISTINCT level_id)
WHERE approver_id = :approverId
AND action_date BETWEEN :start AND :end
AND status IN ('APPROVED', 'REJECTED')
AND elapsed_hours IS NOT NULL
AND elapsed_hours > 0
AND (
elapsed_hours < tat_hours
OR (elapsed_hours <= tat_hours AND (tat_breached IS NULL OR tat_breached = false))
OR (tat_breached IS NOT NULL AND tat_breached = false)
)
Breached Count = COUNT(DISTINCT level_id)
WHERE approver_id = :approverId
AND action_date BETWEEN :start AND :end
AND status IN ('APPROVED', 'REJECTED')
AND elapsed_hours IS NOT NULL
AND elapsed_hours > 0
AND (
elapsed_hours > tat_hours
OR (tat_breached IS NOT NULL AND tat_breached = true)
)
TAT Compliance % = ROUND((Within TAT Count / Total Approved) × 100, 0)
If Total Approved = 0, then TAT Compliance = 0%
Average Response Hours = ROUND(AVG(elapsed_hours), 1)
WHERE approver_id = :approverId
AND action_date BETWEEN :start AND :end
AND status IN ('APPROVED', 'REJECTED')
AND elapsed_hours IS NOT NULL
AND elapsed_hours > 0
Pending Count = COUNT(DISTINCT level_id)
WHERE approver_id = :approverId
AND status IN ('PENDING', 'IN_PROGRESS')
AND request.status IN ('PENDING', 'IN_PROGRESS')
AND is_draft = false
AND level_number = request.current_level
(Only current active level for each request)
Sorting Order:
- TAT Compliance % (DESC - highest first)
- Average Response Hours (ASC - fastest first)
- Total Approved (DESC - most approvals first)
🤖 10. AI REMARK UTILIZATION (Admin Only)
Scope: All conclusion remarks generated in date range
Formulas:
Total Usage = COUNT(*)
FROM conclusion_remarks cr
WHERE cr.generated_at BETWEEN :start AND :end
Total Edits = COUNT(*)
FROM conclusion_remarks cr
WHERE cr.generated_at BETWEEN :start AND :end
AND cr.is_edited = true
Edit Rate % = ROUND((Total Edits / Total Usage) × 100, 0)
If Total Usage = 0, then Edit Rate = 0%
Monthly Trends (Last 7 Months):
AI Usage = COUNT(*)
WHERE generated_at >= NOW() - INTERVAL '7 months'
GROUP BY DATE_TRUNC('month', generated_at)
Manual Edits = COUNT(*)
WHERE generated_at >= NOW() - INTERVAL '7 months'
AND is_edited = true
GROUP BY DATE_TRUNC('month', generated_at)
📅 11. DATE RANGE CALCULATIONS
Date Range Parsing:
Today:
start = start_of_day(today)
end = end_of_day(today)
This Week:
start = start_of_week(today)
end = end_of_week(today)
This Month:
start = start_of_month(today)
end = end_of_month(today)
This Quarter:
start = start_of_quarter(today)
end = end_of_quarter(today)
This Year:
start = start_of_year(today)
end = end_of_year(today)
Custom Range:
start = start_of_day(custom_start_date)
end = end_of_day(custom_end_date)
(Capped at current date if future date provided)
Default (if not specified):
start = 30 days ago (start of day)
end = today (end of day)
🔍 12. CRITICAL ALERTS
Admin/Management View
Scope: All requests with critical TAT status
Formulas:
Critical Requests = Requests where:
- TAT percentage used >= 80% (approaching deadline)
- OR TAT percentage used >= 100% (breached)
- OR has breach alerts (is_breached = true in tat_alerts)
Breached Count = COUNT(*)
WHERE breachCount > 0
(From critical requests)
Warning Count = COUNT(*)
WHERE breachCount = 0
AND TAT percentage >= 80%
(From critical requests)
Regular User View
Scope: Only requests initiated by the user
Formulas:
Critical Requests = Same logic as Admin, filtered by initiator_id = :userId
Breached Count = Same calculation as Admin (filtered by user)
Warning Count = Same calculation as Admin (filtered by user)
📊 13. UPCOMING DEADLINES
Scope: Requests with active levels approaching TAT deadline
Formulas:
Upcoming Deadlines = Requests where:
- Current level is active (status IN ('PENDING', 'IN_PROGRESS'))
- remainingHours > 0 (not yet breached)
- tatPercentageUsed < 100 (not yet breached)
TAT Percentage Used = ROUND((elapsedHours / tatHours) × 100, 0)
Where elapsedHours = calculateElapsedWorkingHours(level_start_time, current_time, priority)
Remaining Hours = MAX(0, tatHours - elapsedHours)
Elapsed Hours = calculateElapsedWorkingHours(level_start_time, current_time, priority)
(Respects working hours, weekends, holidays based on priority)
Note: Only shows requests that are NOT yet breached (remainingHours > 0 and tatPercentage < 100).
📝 14. RECENT ACTIVITY
Admin/Management View
Scope: All workflow activities across organization
Formulas:
Recent Activity = All activities from workflow_requests
ORDER BY activity.created_at DESC
(No user filter)
Regular User View
Scope: Activities from user's requests or where user is a participant
Formulas:
Recent Activity = Activities where:
- request.initiator_id = :userId
- OR user is a participant in the request
ORDER BY activity.created_at DESC
🔑 KEY DIFFERENCES: ADMIN vs REGULAR USER
| Metric | Admin/Management | Regular User |
|---|---|---|
| Request Volume | All organization requests | Only user-initiated requests |
| TAT Efficiency | All completed requests | Only user-initiated completed requests |
| Approver Load | N/A | User's own approval workload |
| Engagement | All work notes/documents | Only from user's requests |
| AI Insights | All approved requests | Only user's approved requests |
| Department Stats | ✅ Available | ❌ Not available |
| Priority Distribution | ✅ Available | ❌ Not available |
| Approver Performance | ✅ Available | ❌ Not available |
| AI Remark Utilization | ✅ Available | ❌ Not available |
| Success Rate | ❌ Not shown | ✅ Available |
📌 IMPORTANT NOTES
-
Date Filtering:
- Most metrics use
submission_date(when request was submitted), notcreated_at - Completed requests use
closure_dateorupdated_atfor completion date - Pending requests are counted regardless of creation date
- Most metrics use
-
Working Hours Calculation:
- Cycle time uses
calculateElapsedWorkingHours()which respects:- Working hours (9 AM - 6 PM)
- Weekends (for STANDARD priority)
- Holidays (configured in system)
- Priority type (EXPRESS vs STANDARD)
- Cycle time uses
-
Breach Tracking:
- Breaches are tracked at approver/level level (each level has its own TAT)
- But SLA compliance counts at request level (if any level breaches, entire request is non-compliant)
-
Rounding:
- Percentages: Rounded to nearest integer (0 decimal places)
- Hours: Rounded to 1 decimal place
- Days: Rounded to 1 decimal place
-
Null Handling:
- All COUNT operations handle NULL values
- Division operations use NULLIF to prevent division by zero
- Default values are 0 if no data exists
🔄 DATA REFRESH
All calculations are performed in real-time when:
- Dashboard is loaded
- Date range filter is changed
- Refresh button is clicked
- Custom date range is applied
Data is fetched in parallel for optimal performance.
Last Updated: Based on codebase as of current date Version: 1.0