Settings
These three numbers decide what the register calls urgent. They are not cosmetic — every deadline on every screen is recomputed from them.
Reference data
The values every dropdown in the register offers. Departments are a list. Statuses and renewal types are behavior, so a custom one is your wording mapped onto something the engine already knows how to compute.
Naming convention
A contract number should tell you what something is before you open it. The register does not depend on it — reports aggregate on the recorded group — but a consistent number is what lets somebody find a contract by guessing, and stops two people filing the same agreement twice.
RHP-VBC-PAY-0001Groups
VBCManaged CarePayer agreements, risk and shared-savings arrangements.CLNClinical OperationsPhysician arrangements, anesthesia, interpretation.LABLaboratory & ImagingReference lab, imaging equipment and reads.TECInformation TechnologyEHR, platforms, subscriptions, data sharing.OPSFacilitiesLeases, waste, linen, janitorial, security.PPLHuman ResourcesStaffing, locums, benefits, occupational health.REVRevenue CycleCollections, purchasing, med-surg distribution.LGLLegal & ComplianceInsurance, outside counsel, governance documents.
Types
PAYPayer agreementPHYPhysician arrangementSVCServicesLSELeaseSFWSoftwareSUPSupplySTFStaffingINSInsuranceGOVGovernance
Locations
- Main Campus
- Jefferson Park
- Stonebridge
- Riverbend
- Cumberland Surgery Center
A contract with no location applies organization-wide. That is a deliberate answer, not a blank.
Worth doing
- Number by group rather than by year. A contract signed in 2019 is still live; a number starting 2019 makes people assume it is not.
- Never reuse a number, even after a contract is closed out. The old one is printed on something.
- Record the notice period even when it is awkward to find. A blank there is the single most expensive empty field in the register.
- Leave legacy numbers alone. Renaming contracts that predate the convention breaks every reference to them; the register reports the mismatch instead.
Departments
Used to scope what a department manager can see, so this list is also an access-control list — and its code is the middle segment of every contract number filed under it. Retiring one hides it from the pickers but never deletes it; contracts already reference it by name.
The code is required because every contract number is built from it — a department without one produces contracts that cannot be numbered.
Lifecycle statuses
A status is not just a label — it decides which actions are legal. You cannot terminate something that was never executed. So a custom status is your wording mapped onto a behavior the engine already understands: call it “Pending Legal Review” and have it behave like in-negotiation, and the register keeps computing correctly.
No custom statuses yet.
Renewal types
These decide arithmetic, not wording. Automatic and evergreen roll the term forward; manual and fixed-end do not. A custom type borrows one of those four behaviors, so every deadline stays computable no matter what you call it.
No custom renewal types yet.
How this demonstration stores things
What is real here, what is standing in, and what changes in a deployment.
Real, not simulated
- The 51 seeded contracts live in Postgres. Signing in as a different person re-runs every query as that account.
- Who can see what is decided by the database, not by this application. A department manager receives fewer rows because fewer rows were returned — not because the screen hid them. Commercial terms sit in a separate table with its own policy.
- A contract outside your department is not merely hidden. It returns the same response as a contract that does not exist, so its existence leaks nothing.
- The notice, renewal and amendment calculations are the production engine.
Held in your browser, on purpose
Everything you do here — contracts you enter, actions you record, checklist steps, reference data, people you invite, and the notices those generate — is written to your own browser rather than the shared database. That is deliberate: several people can open this link at once and none of them can change what the others see, and nothing anyone types here reaches the seeded register.
It also means nobody needs an account to try it. Anyone with the link drives the whole register immediately, and every one of them starts from the same seeded contracts — there is no state to hand out and nothing to clean up afterwards.
A browser gives about four kilobytes per store, which is what produces the limits below.
What that costs, stated exactly
- History runs out before contract state does
- Around five contracts keep their full audit trail. After that the oldest entries are given up rather than refusing your change — status, version and recorded documents are never what gets dropped.
- Reset clears only your own browser
- It cannot affect anyone else viewing the demonstration, and nothing it clears was ever on the server.
- Sign-in counts come from this browser
- The role switcher stands in for signing in. A deployment reads these from the identity provider’s log.
- A role change moves permissions, not visibility
- The application honors the new role immediately. Which rows Postgres returns still follows what that account is provisioned for, which is the correct behavior and worth knowing before you test it.
- Uploaded files record a name, not the file
- Document storage arrives with the deployment. Recording a filename that could never be produced later would be worse than useless.
- Nothing follows you to another device
- Open this link on your phone and you get the seeded register, not what you just entered here.
In a deployment every one of these goes away. Entered contracts and recorded actions write to the same Postgres the seeded register already uses, with an append-only events table behind the audit trail, object storage behind the documents, and your own identity provider behind sign-in. Nothing above is a limit of the product — they are the price of letting strangers share one link without any of them being able to affect another.