Parts inventory + the tech-app parts picker turn 'I think I used 3 of those' into 'I tap, I'm done, the invoice updates.' One catalog, one workflow, used at three points: stocking, billing, and reordering.
Setting up the catalog
- 1Go to /portal/parts
Add part — name, SKU (optional), cost (what you pay), price (what you charge), unit (each / foot / pound / etc.). Set on-hand + 'reorder when ≤ X' if you want stock tracking + alerts. Leave both blank for consumables you don't track.
- 2Or import a CSV
Top-right, 'Import CSV.' Header names are flexible — name (required), sku, cost, price, stock, min_stock, category, unit, supplier. Existing parts (matched by SKU) get updated; new ones added. Cost/price accept '12.50' or '$12.50' — the importer strips dollar signs + commas.
What the tech sees
On any job's detail page (/portal/tech/[id]), there's a 'Parts used' section. Tap 'Add part' → search + tap, picker shows common-for-this-service parts at the top, full catalog after. Quantity defaults to 1 (or whatever you set as default for that service); they can override.
What happens when a part gets logged
- parts_used_on_appointment row created — snapshot of cost + price at use-time (so later catalog edits don't shift historical job profitability).
- Catalog stock decrements (when tracked).
- If there's a draft invoice for this appointment, a line item gets added at your set price — description, quantity, taxable flag all carried from the catalog. Invoice subtotal/tax/total recompute.
- Per-job profitability (Phase 2B) updates — parts cost flows into the cost block.
Plyrium can show the most-likely parts FIRST in the picker so techs don't scroll through 200 SKUs to find the 1/2 in coupling they always use on Standard Service Calls. Linking parts to service types is forward-compat — the data model supports it; the UI to manage it ships in a follow-up release.
Reorder alerts
Daily cron at 8am Mountain. For every part where current_stock ≤ min_stock, you get a single consolidated email — one email per shop, listing every part that needs ordering, sorted by how far below threshold each is. Already-alerted parts dedup for 7 days so we don't spam you about the same 12 SKUs every day; restocking a part clears the dedup so the next dip alerts fresh.
Restocking
When an order arrives: open /portal/parts, click the part, ⋯ → 'Mark restocked.' Enter quantity received. We bump current_stock + clear the alert dedup + log the restock to your activity feed.
Reversing a part-use
Tech added the wrong part by accident? Open the job detail; in 'Parts used' tap the trash icon next to the part. Plyrium deletes the parts_used row, removes the linked invoice line item, restocks the part, and recomputes invoice totals. Atomic — no half-done state.
| Untracked | current_stock blank — Plyrium doesn't decrement or alert. Right for consumables (electrical tape, plumbers putty) where you'd rather just buy more when you notice you're out. |
| Tracked | current_stock + min_stock both set — alerts fire when on-hand dips below threshold. |
| Stock-only | current_stock set but min_stock blank — counts down as you use, but no reorder alerts. Right for parts you want to track usage on without committing to a reorder threshold. |
If you log a part you didn't have a restock recorded for, current_stock goes negative. Plyrium doesn't block this — sometimes you grab a part from a different truck or pick one up from the supplier on the way and don't update inventory. The next 'Mark restocked' brings the count back to honest.