
The hard part wasn't the CRUD — it was modeling one job's lifecycle (quote → schedule → dispatch → invoice → payment) so status changes stay consistent across customers, technicians and billing. I designed the PostgreSQL schema and REST API around that state machine first, then built the UI on top. Handles scheduling and invoicing for [X] simulated jobs/week in testing. If I rebuilt it today, I'd add optimistic UI updates for technician status changes instead of full refetches.


