feat(contracts): finish PMS-64 story (contracts, items, balances, rate cards) #29

Closed
David wants to merge 0 commits from feat/contracts-story-pms-64 into main
Owner

Closes #PMS-64

Closes #PMS-64
feat(contracts): scaffold + CRUD for contracts, items, balances, rate cards
All checks were successful
Create release / Create release from merged PR (pull_request) Has been skipped
7298b901d1
Batches PMS-65..70 (per-task splitting would have been arbitrary churn across two files):

- PMS-65 scaffold + router wire (replaces `/contracts` and `/rate-cards` stubs)
- PMS-66 contracts CRUD with `company_id` / `contract_type` / `status` filters
- PMS-67 contract items CRUD; `total_price` is server-computed as `quantity * unit_price`
- PMS-68 `GET /api/v1/contracts/:id/hour-balance` (read-only). Decrement on time-entry creation will arrive when the time-tracking story (PMS-42) merges and we can wire `contract_id` propagation; deliberately decoupled here.
- PMS-69 rate cards CRUD; setting `is_default` demotes the prior default in the same transaction
- PMS-70 rate card items: `POST /api/v1/rate-cards/:id/items` upserts on `(rate_card_id, work_type_id)` per the schema's UNIQUE constraint.

Gated on `RequireFinance` for writes; reads are any authenticated user.

#PMS-65 State Done
#PMS-66 State Done
#PMS-67 State Done
#PMS-68 State Done
#PMS-69 State Done
#PMS-70 State Done
vas2000-work closed this pull request 2026-05-21 02:42:56 +02:00
Some checks are pending
Create release / Create release from merged PR (pull_request) Has been skipped
Check / * (pull_request)
Required
E2E / * (pull_request)
Required

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/mokosh-server!29
No description provided.