15 KiB
✅ Enhanced TAT Alerts Display - Complete Guide
🎯 What's Been Enhanced
TAT alerts now display detailed time tracking information inline with each approver, making it crystal clear what's happening!
📊 Enhanced Alert Display
What Shows Now:
┌──────────────────────────────────────────────────────┐
│ ⏳ Reminder 1 - 50% TAT Threshold [WARNING] │
│ │
│ 50% of SLA breach reminder have been sent │
│ │
│ ┌──────────────┬──────────────┐ │
│ │ Allocated: │ Elapsed: │ │
│ │ 12h │ 6.0h │ │
│ ├──────────────┼──────────────┤ │
│ │ Remaining: │ Due by: │ │
│ │ 6.0h │ Oct 7, 2024 │ │
│ └──────────────┴──────────────┘ │
│ │
│ Reminder sent by system automatically [TEST MODE] │
│ Sent at: Oct 6 at 2:30 PM │
│ Note: Test mode active (1 hour = 1 minute) │
└──────────────────────────────────────────────────────┘
🔑 Key Information Displayed
For Each Alert:
| Field | Description | Example |
|---|---|---|
| Reminder # | Sequential number | "Reminder 1" |
| Threshold | Percentage reached | "50% TAT Threshold" |
| Status Badge | Warning or Breach | WARNING / BREACHED |
| Allocated | Total TAT hours | "12h" |
| Elapsed | Hours used when alert sent | "6.0h" |
| Remaining | Hours left when alert sent | "6.0h" |
| Due by | Expected completion date | "Oct 7, 2024" |
| Sent at | When reminder was sent | "Oct 6 at 2:30 PM" |
| Test Mode | If in test mode | Purple badge + note |
🎨 Color Coding
50% Alert (⏳):
- Background:
bg-yellow-50 - Border:
border-yellow-200 - Badge:
bg-amber-100 text-amber-800 - Icon: ⏳
75% Alert (⚠️):
- Background:
bg-orange-50 - Border:
border-orange-200 - Badge:
bg-amber-100 text-amber-800 - Icon: ⚠️
100% Breach (⏰):
- Background:
bg-red-50 - Border:
border-red-200 - Badge:
bg-red-100 text-red-800 - Icon: ⏰
- Text: Shows "BREACHED" instead of "WARNING"
🧪 Test Mode vs Production Mode
Test Mode (TAT_TEST_MODE=true):
Purpose: Fast testing during development
Behavior:
- ✅ 1 hour = 1 minute
- ✅ 6-hour TAT = 6 minutes
- ✅ Purple "TEST MODE" badge shown
- ✅ Note: "Test mode active (1 hour = 1 minute)"
- ✅ All times are in working time (no weekend skip)
Example Alert (Test Mode):
⏳ Reminder 1 - 50% TAT Threshold [WARNING] [TEST MODE]
Allocated: 6h | Elapsed: 3.0h
Remaining: 3.0h | Due by: Today 2:06 PM
Note: Test mode active (1 hour = 1 minute)
Sent at: Today at 2:03 PM
Timeline:
- Submit at 2:00 PM
- 50% alert at 2:03 PM (3 minutes)
- 75% alert at 2:04:30 PM (4.5 minutes)
- 100% breach at 2:06 PM (6 minutes)
Production Mode (TAT_TEST_MODE=false):
Purpose: Real-world usage
Behavior:
- ✅ 1 hour = 1 hour (real time)
- ✅ 48-hour TAT = 48 hours
- ✅ No "TEST MODE" badge
- ✅ No test mode note
- ✅ Respects working hours (Mon-Fri, 9 AM-6 PM)
- ✅ Skips weekends
Example Alert (Production Mode):
⏳ Reminder 1 - 50% TAT Threshold [WARNING]
Allocated: 48h | Elapsed: 24.0h
Remaining: 24.0h | Due by: Oct 8, 2024
Reminder sent by system automatically
Sent at: Oct 6 at 10:00 AM
Timeline:
- Submit Monday 10:00 AM
- 50% alert Tuesday 10:00 AM (24 hours)
- 75% alert Wednesday 10:00 AM (36 hours)
- 100% breach Thursday 10:00 AM (48 hours)
📡 New API Endpoints
1. Get TAT Alerts for Request
GET /api/tat/alerts/request/:requestId
Response:
{
"success": true,
"data": [
{
"alertId": "...",
"alertType": "TAT_50",
"thresholdPercentage": 50,
"tatHoursAllocated": 12,
"tatHoursElapsed": 6.0,
"tatHoursRemaining": 6.0,
"alertSentAt": "2024-10-06T14:30:00Z",
"level": {
"levelNumber": 2,
"approverName": "Lisa Wong",
"status": "PENDING"
}
}
]
}
2. Get TAT Compliance Summary
GET /api/tat/compliance/summary?startDate=2024-10-01&endDate=2024-10-31
Response:
{
"success": true,
"data": {
"total_alerts": 150,
"alerts_50": 50,
"alerts_75": 45,
"breaches": 25,
"completed_on_time": 35,
"completed_late": 15,
"compliance_percentage": 70.00
}
}
3. Get TAT Breach Report
GET /api/tat/breaches
4. Get Approver Performance
GET /api/tat/performance/:approverId
🔍 Database Fields Available
In tat_alerts Table:
| Field | Type | Use In UI |
|---|---|---|
alert_type |
ENUM | Determine icon (⏳/⚠️/⏰) |
threshold_percentage |
INT | Show "50%", "75%", "100%" |
tat_hours_allocated |
DECIMAL | Display "Allocated: Xh" |
tat_hours_elapsed |
DECIMAL | Display "Elapsed: Xh" |
tat_hours_remaining |
DECIMAL | Display "Remaining: Xh" (red if < 2h) |
level_start_time |
TIMESTAMP | Calculate time since start |
alert_sent_at |
TIMESTAMP | Show "Sent at: ..." |
expected_completion_time |
TIMESTAMP | Show "Due by: ..." |
alert_message |
TEXT | Full notification message |
is_breached |
BOOLEAN | Show "BREACHED" badge |
metadata |
JSONB | Test mode indicator, priority, etc. |
was_completed_on_time |
BOOLEAN | Show compliance status |
completion_time |
TIMESTAMP | Show actual completion |
💡 Production Recommendation
For Development/Testing:
# .env
TAT_TEST_MODE=true
WORK_START_HOUR=9
WORK_END_HOUR=18
Benefits:
- ✅ Fast feedback (minutes instead of hours/days)
- ✅ Easy to test multiple scenarios
- ✅ Clear test mode indicators prevent confusion
For Production:
# .env
TAT_TEST_MODE=false
WORK_START_HOUR=9
WORK_END_HOUR=18
Benefits:
- ✅ Real-world timing
- ✅ Accurate TAT tracking
- ✅ Meaningful metrics
📋 Complete Alert Card Template
Full Display Structure:
<div className="bg-yellow-50 border-yellow-200 p-3 rounded-lg">
{/* Header */}
<div className="flex items-center justify-between">
<span>⏳ Reminder 1 - 50% TAT Threshold</span>
<Badge>WARNING</Badge>
{testMode && <Badge>TEST MODE</Badge>}
</div>
{/* Main Message */}
<p>50% of SLA breach reminder have been sent</p>
{/* Time Grid */}
<div className="grid grid-cols-2 gap-2">
<div>Allocated: 12h</div>
<div>Elapsed: 6.0h</div>
<div>Remaining: 6.0h</div>
<div>Due by: Oct 7</div>
</div>
{/* Footer */}
<div className="border-t pt-2">
<p>Reminder sent by system automatically</p>
<p>Sent at: Oct 6 at 2:30 PM</p>
{testMode && <p>Note: Test mode (1h = 1min)</p>}
</div>
</div>
🎯 Key Benefits of Enhanced Display
1. Full Transparency
Users see exactly:
- How much time was allocated
- How much was used when alert fired
- How much was remaining
- When it's due
2. Context Awareness
- Test mode clearly indicated
- Color-coded by severity
- Badge shows warning vs breach
3. Actionable Information
- "Remaining: 2.5h" → Approver knows they have 2.5h left
- "Due by: Oct 7 at 6 PM" → Clear deadline
- "Elapsed: 6h" → Understand how long it's been
4. Confusion Prevention
- Test mode badge prevents misunderstanding
- Note explains "1 hour = 1 minute" in test mode
- Clear visual distinction from production
🧪 Testing Workflow
Step 1: Enable Detailed Logging
In Re_Backend/.env:
TAT_TEST_MODE=true
LOG_LEVEL=debug
Step 2: Create Test Request
- TAT: 6 hours
- Priority: Standard or Express
- Submit request
Step 3: Watch Alerts Populate
At 3 minutes (50%):
⏳ Reminder 1 - 50% TAT Threshold [WARNING] [TEST MODE]
Allocated: 6h | Elapsed: 3.0h
Remaining: 3.0h | Due by: Today 2:06 PM
Note: Test mode active (1 hour = 1 minute)
At 4.5 minutes (75%):
⚠️ Reminder 2 - 75% TAT Threshold [WARNING] [TEST MODE]
Allocated: 6h | Elapsed: 4.5h
Remaining: 1.5h | Due by: Today 2:06 PM
Note: Test mode active (1 hour = 1 minute)
At 6 minutes (100%):
⏰ Reminder 3 - 100% TAT Threshold [BREACHED] [TEST MODE]
Allocated: 6h | Elapsed: 6.0h
Remaining: 0.0h | Due by: Today 2:06 PM (OVERDUE)
Note: Test mode active (1 hour = 1 minute)
📊 KPI Queries Using Alert Data
Average Response Time After Each Alert Type:
SELECT
alert_type,
ROUND(AVG(tat_hours_elapsed), 2) as avg_elapsed,
ROUND(AVG(tat_hours_remaining), 2) as avg_remaining,
COUNT(*) as alert_count,
COUNT(CASE WHEN was_completed_on_time = true THEN 1 END) as completed_on_time
FROM tat_alerts
GROUP BY alert_type
ORDER BY threshold_percentage;
Approvers Who Frequently Breach:
SELECT
u.display_name,
u.department,
COUNT(CASE WHEN ta.is_breached = true THEN 1 END) as breach_count,
AVG(ta.tat_hours_elapsed) as avg_time_taken,
COUNT(DISTINCT ta.level_id) as total_approvals
FROM tat_alerts ta
JOIN users u ON ta.approver_id = u.user_id
WHERE ta.is_breached = true
GROUP BY u.user_id, u.display_name, u.department
ORDER BY breach_count DESC
LIMIT 10;
Time-to-Action After Alert:
SELECT
alert_type,
threshold_percentage,
ROUND(AVG(
EXTRACT(EPOCH FROM (completion_time - alert_sent_at)) / 3600
), 2) as avg_hours_to_respond_after_alert
FROM tat_alerts
WHERE completion_time IS NOT NULL
GROUP BY alert_type, threshold_percentage
ORDER BY threshold_percentage;
🔄 Alert Lifecycle
1. Alert Created (When Threshold Reached)
{
alertType: 'TAT_50',
thresholdPercentage: 50,
tatHoursAllocated: 12,
tatHoursElapsed: 6.0,
tatHoursRemaining: 6.0,
alertSentAt: '2024-10-06T14:30:00Z',
expectedCompletionTime: '2024-10-06T18:00:00Z',
isBreached: false,
wasCompletedOnTime: null, // Not completed yet
metadata: { testMode: true, ... }
}
2. Approver Takes Action
// Updated when level is approved/rejected
{
...existingFields,
wasCompletedOnTime: true, // or false
completionTime: '2024-10-06T16:00:00Z'
}
3. Displayed in UI
// Shows all historical alerts for that level
// Color-coded by threshold
// Shows completion status if completed
🎓 Understanding the Data
Allocated Hours (tat_hours_allocated)
Total TAT time given to approver for this level
Example: 12 hours
Meaning: Approver has 12 hours to approve/reject
Elapsed Hours (tat_hours_elapsed)
Time used when the alert was sent
Example: 6.0 hours (at 50% alert)
Meaning: 6 hours have passed since level started
Remaining Hours (tat_hours_remaining)
Time left when the alert was sent
Example: 6.0 hours (at 50% alert)
Meaning: 6 hours remaining before TAT breach
Note: Turns red if < 2 hours
Expected Completion Time
When the level should be completed
Example: Oct 6 at 6:00 PM
Meaning: Deadline for this approval level
⚙️ Configuration Options
Disable Test Mode for Production:
Edit .env:
# Production settings
TAT_TEST_MODE=false
WORK_START_HOUR=9
WORK_END_HOUR=18
Adjust Working Hours:
# Custom working hours (e.g., 8 AM - 5 PM)
WORK_START_HOUR=8
WORK_END_HOUR=17
Redis Configuration:
# Upstash (recommended)
REDIS_URL=rediss://default:PASSWORD@host.upstash.io:6379
# Local Redis
REDIS_URL=redis://localhost:6379
# Production Redis with auth
REDIS_URL=redis://username:password@prod-redis.com:6379
📱 Mobile Responsive
The alert cards are responsive:
- ✅ 2-column grid on desktop
- ✅ Single column on mobile
- ✅ All information remains visible
- ✅ Touch-friendly spacing
🚀 API Endpoints Available
Get Alerts for Request:
GET /api/tat/alerts/request/:requestId
Get Alerts for Level:
GET /api/tat/alerts/level/:levelId
Get Compliance Summary:
GET /api/tat/compliance/summary
GET /api/tat/compliance/summary?startDate=2024-10-01&endDate=2024-10-31
Get Breach Report:
GET /api/tat/breaches
Get Approver Performance:
GET /api/tat/performance/:approverId
✅ Benefits Summary
For Users:
- Clear Visibility - See exact time tracking
- No Confusion - Test mode clearly labeled
- Actionable Data - Know exactly how much time left
- Historical Record - All alerts preserved
For Management:
- KPI Ready - All data for reporting
- Compliance Tracking - On-time vs late completion
- Performance Analysis - Response time after alerts
- Trend Analysis - Breach patterns
For System:
- Audit Trail - Every alert logged
- Scalable - Queue-based architecture
- Reliable - Automatic retries
- Maintainable - Clear configuration
🎯 Quick Switch Between Modes
Development (Fast Testing):
# .env
TAT_TEST_MODE=true
Restart backend → Alerts fire in minutes
Staging (Semi-Real):
# .env
TAT_TEST_MODE=false
# But use shorter TATs (2-4 hours instead of 48 hours)
Restart backend → Alerts fire in hours
Production (Real):
# .env
TAT_TEST_MODE=false
# Use actual TATs (24-48 hours)
Restart backend → Alerts fire in days
📊 What You See in Workflow Tab
For each approval level, you'll see:
┌────────────────────────────────────────────┐
│ Step 2: Lisa Wong (Finance Manager) │
│ Status: pending │
│ TAT: 12 hours │
│ Elapsed: 8h │
│ │
│ [50% Alert Card with full details] │
│ [75% Alert Card with full details] │
│ │
│ Comment: (if any) │
└────────────────────────────────────────────┘
Clear, informative, and actionable!
🎉 Status: READY!
✅ Enhanced display with all timing details
✅ Test mode indicator to prevent confusion
✅ Color-coded by severity
✅ Responsive design
✅ API endpoints for custom queries
✅ KPI-ready data structure
Just setup Upstash Redis and start testing!
See: START_HERE.md for 2-minute Redis setup
Last Updated: November 4, 2025
Team: Royal Enfield Workflow