Functional contract

SOAP notes

Clinical record for one visit. Organization-visible on the patient chart; authored at the visit’s Location. Appointments without a visit have no SOAP.

Structured SOAP + history shipped Voice-to-text deferred Source: docs/functional/soap-notes.md

Domain

ModelWhat it is
SoapNoteOne per visit. jsonb columns: subjective, objective, assessment, plan
PatientHistoryTimeline of visits + appointments without a visit on the chart

Lazy find_or_create on first open (not at check-in). Partial notes allowed. No draft or signed/locked state.

Structure

Patient history

On GET /app/patients/:id, newest first:

RowWhen
VisitEvery visit; linked appointment time as secondary meta (not duplicated)
AppointmentMaterialized appointments with no visit (scheduled, canceled, no-show)

Cross-location. Virtual series slots excluded. Visit rows link to SOAP.

Routes

RouteWho
GET /app/visits/:visit_id/soap_notepatients.read
GET/PATCH …/soap_note/editsoap.manage at visit Location

RBAC

Manage: org admin, location admin, veterinarian. Read: anyone with patients.read. Receptionist reads only.

Out of scope

Voice-to-text, mobile API, note lock/sign, billing Rx fulfillment, photos, SMS.

Full contract: docs/functional/soap-notes.md.