/catalog-entry, with the catalog field saying which list a row
belongs to.
This is separate from codes. Cost, union and per diem
codes predate catalogs and keep their own endpoints. New lists are added here.
code, description
Standard CRUD applies, minus bulk delete. See
standard endpoints.
Fields
Entries are referenced by value
A record does not point at an entry by id — it stores thecode string.
The same rule the code lists follow, and for the same
reason: a timesheet keeps the classification it was approved under.
Two consequences worth planning for:
- Deactivate, do not delete. An entry still referenced by history should be
set
isActive: false. It disappears from pickers for new records while staying readable on the ones that already use it. Bulk delete is refused for this reason. - Renaming a code rewrites the records that use it. Changing
codequeues a background job that updates every stored reference — for pay types, thepayTypeson every timesheet record holding the old code. It is not instant: a read taken immediately after a rename can still return the old one. - Codes are case-insensitive within a list. With
OTalready a pay type, creatingotis rejected as a duplicate. Across lists they are unrelated, so a future catalog may reuse the string freely.
A catalog cannot be changed
catalog is fixed at creation. Moving an entry between lists would silently
retarget every record holding its code, and codes are only unique within a
list, so the move could also collide. Create a new entry in the other catalog.
Examples
catalog when listing. Without it you get every catalog at once.