Utilization
- Endpoint:
GET /golf-carts/analytics/utilization?tenantId=1&clubId=10&windowDays=7
- Report fields:
totalCarts, totalAssignments, activeAssignments, avgDailyAssignments, avgUseHours, utilizationRate (0-1), windowDays.
- GraphQL:
utilizationReport(input: { tenantId, clubId?, windowDays? }).
- Default window: 7 days; validation rejects
windowDays <= 0.
UI ideas
- KPI: utilization %, active vs total carts.
- Trend: bar/line of assignments per day; average hours per assignment.
Zones
- List carts in a zone:
GET /golf-carts/zones?tenantId=1&clubId=10&zone=Clubhouse.
- Summary:
GET /golf-carts/zones/summary?tenantId=1&clubId=10 -> zone, cartCount, inUse, available.
- GraphQL:
cartsByZone(input: { tenantId, clubId?, zone }), zoneSummary(tenantId, clubId?).
- Validation:
zone is required for the list endpoint.
UI ideas
- Map/heatmap: color by status (available/in use/out of service).
- Table with drill-down links to
cartsByZone.
Predictive Maintenance
- Endpoint:
GET /golf-carts/maintenance/predictive?tenantId=1&clubId=10&horizonDays=7&odometerMargin=50&hoursThreshold=20.
- GraphQL:
predictiveMaintenance(input: { tenantId, clubId?, horizonDays?, odometerMargin?, hoursThreshold? }).
- Heuristics:
nextServiceDue <= horizonDays from today
nextServiceOdo - odometer <= odometerMargin
hoursUsed >= hoursThreshold when no nextServiceOdo
- Defaults:
horizonDays=7, odometerMargin=50, hoursThreshold=20; validation rejects horizonDays <= 0.
UI ideas
- List with reason badges (Due soon / Odometer near / Hours high).
- Quick actions: mark serviced, schedule maintenance, assign to bay/zone.
GPS Fields
lastLatitude, lastLongitude, lastLocationAt, currentZone.
- Update via
PUT /golf-carts/:id/location or GraphQL updateGolfCartLocation.
- Recommended: show stale-location indicator when
lastLocationAt age exceeds threshold (e.g., 15 minutes).