For government (prevailing-wage) jobs, WA L&I requires a certified payroll report filed online at least monthly. Instead of re-typing every worker, day, and wage by hand on the L&I website, this tool builds the official upload file (an XML file) from the data already in the portal. Emily picks the government project and the week(s), the tool builds the file, she downloads it, and uploads that one file to L&I — which then creates the certified payroll report(s) automatically.
On the dashboard (bellaterra.services), the tile 🏛️ L&I Certified Payroll. The page has three tabs: ① Generate XML, ② Workers, and ③ Trade map.
EMAILJRN…pdf that PNW emails you for that period. It fills each
worker's Gross, Federal withholding, and FICA automatically — matched by employee number..xml to Claude to double-check it against L&I's official format first. Once we've confirmed
one real upload is accepted by L&I, you can file directly from then on.
The PNW "Payroll Journal" PDF lists each worker's employee number, Gross, FED, and FICA. That employee number is the same number as in our system (e.g. Rena = 1509, Emily = 33775, Liz = 1630), so the tool matches by number — not by name-spelling — which makes it accurate. Tested against a real journal: all 18 workers read correctly. Do one pay period at a time.
| Piece | How it was checked |
|---|---|
| The XML file format | Validated against L&I's official schema file — the same one their uploader uses. |
| Reading the PNW journal | Parsed the real EMAILJRN572067000047.pdf — all workers, gross/FED/FICA correct. |
| Turning clock-ins into the file | Ran sample clock-ins (regular + overtime + two trades) through the real code → produced a valid file with hours in the right days and OT split out. |
| Page, tiles, Intent #/County saving | Confirmed live on the site. |
The only thing not yet tested is a real government job's hours — because Bella Terra hasn't run one since the portal launched. The engine is ready for when that happens.
main on 2026-06-12, commit 6074bb2 → Netlify.li-certified-payroll.html. Tile in index.html. Intent #/County
added to project-setup.html.payroll_identity and
li_trade_map; new columns projects.li_intent_id and
projects.li_county. SQL kept at _security/li_certified_payroll.sql._li-cpr-schema.xsd for future validation.