Timecard Visualization Service
In production at FCP InsightA Flask microservice that turns raw timecard exports into two kinds of chart: a sunburst showing where a crew's hours actually went, and a bar chart comparing worked hours against the estimate, per job phase.
The source is private and the real data isn't mine to publish, so what follows is the concept, explained, plus an interactive rebuild below with invented numbers standing in for the real thing.
How it works
No hand-classification, no separate approval workflow. One flag per timecard entry, set at the source, drives the whole breakdown.
- 01
InputEvery timecard entry carries a work type and an hours split
Each row is one person, one entry: how many hours were reported, how many of those were realized (billable, on a completed job), and a flag for whether the remainder was necessary but not billable, or pure overhead.
- 02
RollupHours roll up into three buckets
Realized time adds to the Realized bucket. The rest splits by that one flag: Utilized for necessary-but-not-billable work, Reported for everything else. That three-way split is the whole idea; everything downstream is just ways to look at it.
- 03
SunburstA sunburst renders a crew's week at a glance
Work-type leaves nest under each bucket, sized by hours. The real service has three variants of this chart, from a plain two-ring version up to one that breaks each bucket down by job code, for when you need to see which project actually ate the week.
- 04
VarianceA companion chart compares worked vs. estimated hours
Per job phase, the taller of worked/estimated draws first and the shorter overlays on top, so a phase running over budget reads as an obviously mismatched pair of bars rather than a table you have to do the subtraction on yourself.
Why a sunburst at all: a table of hours by work type answers "how much"; nesting work types under Realized/Utilized/Reported answers "how much, of what kind" in one shape, which is the actual question an ops manager has when they open this.
Try the concept
Three scenarios, six work types, the same three-bucket rollup described above. Hover a segment for the exact split; the numbers are invented, the shape of the chart is real.
- Realized Billable time on a completed job. 192h · 51%
- Utilized Necessary but not directly billable: diagnostics, setup. 113h · 30%
- Non-billable Admin, training, and other overhead. 75h · 20%
Show the numbers
| Work type | Bucket | Hours | % of week |
|---|---|---|---|
| Install | Realized | 118h | 31% |
| Service call | Realized | 74h | 19% |
| Diagnostics | Utilized | 52h | 14% |
| Travel & setup | Utilized | 61h | 16% |
| Admin | Non-billable | 40h | 11% |
| Training | Non-billable | 35h | 9% |
Illustrative rebuild of the real chart's concept. The numbers above are made up for this page, not FCP Insight's actual timecard data.