Services & Components
Comprehensive platform built specifically for Fire & EMS operations
🏗️ Core Infrastructure
Foundation layer that powers all features
Aladtec API Integration
High ComplexityINFRA_001
Full OAuth2 integration with Aladtec scheduling system provides the foundational data layer for all ResponseIQ features.
What It Does:
- Establishes secure OAuth2 connection to Aladtec
- Pulls member data, schedules, time entries, and attributes
- Maintains real-time sync with your scheduling system
- Handles authentication, token refresh, and error recovery
Metrics Provided:
Member data, scheduled time entries, time types, shift labels, positions, attributes
Algorithm:
1. Authenticate via OAuth2 flow
2. Request access token with scheduling read scope
3. Fetch member roster (GET /api/members)
4. For each member:
- Fetch schedule entries (GET /api/schedules/{id}/entries)
- Fetch time-off requests (GET /api/time-off)
- Parse attributes (DOB, hire date, rank, etc.)
5. Cache results with 15-minute TTL
6. Auto-refresh on filter changes
Business Value:
Without this integration, no other features work. This is the data pipeline that feeds your entire analytics platform.
Real-Time Data Sync
Medium ComplexityINFRA_002
Automatic data synchronization ensures you're always viewing current information without manual refresh.
What It Does:
- Monitors for changes in schedule, roster, or time-off data
- Automatically refreshes views when filters change
- Implements intelligent caching to reduce API calls
- Provides visual indicators when data is refreshing
Algorithm:
1. On filter change (date range, personnel, shift):
- Check cache for matching dataset
- If cache miss or expired (>15 min):
a. Show loading state
b. Fetch fresh data from Aladtec API
c. Update cache with timestamp
d. Recalculate all dependent views
2. Listen for user actions (checkbox changes, slider moves)
3. Debounce rapid changes (300ms)
4. Trigger cascading updates to all dependent components
Performance Optimization:
Uses debouncing, memoization, and smart caching to minimize API calls while maintaining data freshness.
Pay Rate Integration
Medium ComplexityINFRA_003
CSV-based pay rate matching enables accurate cost calculations across all time types.
What It Does:
- Imports pay rate data from CSV file
- Matches employees to their rates by name and time type
- Calculates costs for all hours worked
- Supports multiple pay rates per employee (regular, OT, etc.)
Algorithm:
1. Load pay rate CSV (format: Name, TimeType, Rate)
2. Create lookup map: employeeName -> { timeType -> rate }
3. For each time entry:
a. Extract employeeName, timeType, hours
b. Lookup rate = payRateMap[employeeName][timeType]
c. If not found, use default rate or flag as missing
d. Calculate cost = hours × rate
4. Aggregate costs by employee, department, time type
5. Handle edge cases (missing rates, partial matches)
Data Security:
Pay rate data remains client-side only. CSV is parsed in-browser and never sent to external servers.
👥 Employee Analytics
Individual-level insights and performance tracking
Workload Intensity Gauge
High ComplexityEMPL_005
Predictive burnout risk scoring system identifies employees at risk before issues arise.
What It Does:
- Calculates multi-factor workload intensity score (0-100%)
- Identifies employees at risk of burnout
- Tracks consecutive days worked, overtime ratio, shift frequency
- Provides visual alerts (green/yellow/red)
Algorithm:
// Burnout Risk Score Calculation
function calculateIntensityScore(employee, dateRange) {
const totalDays = getDaysBetween(dateRange.start, dateRange.end);
const shiftsWorked = employee.shifts.length;
const avgShiftsPerMonth = (shiftsWorked / totalDays) * 30;
// Component 1: Shift Frequency (0-40 points)
let shiftScore = 0;
if (avgShiftsPerMonth > 20) shiftScore = 40;
else if (avgShiftsPerMonth > 15) shiftScore = 30;
else if (avgShiftsPerMonth > 10) shiftScore = 20;
else shiftScore = avgShiftsPerMonth;
// Component 2: Overtime Ratio (0-35 points)
const otHours = employee.overtimeHours;
const regularHours = employee.regularHours;
const otRatio = otHours / (regularHours + otHours);
const otScore = Math.min(otRatio * 100, 35);
// Component 3: Consecutive Days (0-25 points)
const longestStreak = findLongestConsecutiveStreak(employee.shifts);
let consecScore = 0;
if (longestStreak >= 10) consecScore = 25;
else if (longestStreak >= 7) consecScore = 20;
else if (longestStreak >= 5) consecScore = 15;
else consecScore = longestStreak * 2;
// Total Intensity Score (capped at 100)
const intensity = Math.min(shiftScore + otScore + consecScore, 100);
return {
score: intensity,
status: intensity >= 70 ? 'High Risk' :
intensity >= 50 ? 'Moderate' : 'Normal',
shiftScore,
otScore,
consecScore,
shiftsPerMonth: avgShiftsPerMonth,
overtimeRatio: (otRatio * 100).toFixed(1) + '%',
longestStreak
};
}
Thresholds:
- 0-49%: Normal workload (Green)
- 50-69%: Elevated workload (Yellow)
- 70-100%: Burnout risk (Red)
Business Value:
Proactively identify at-risk employees before burnout occurs. Reduces sick leave, improves retention, and supports wellness initiatives.