feat: appointment type inference, procedure codes on cards, claim attachment fixes

- Add appointment type categories matching insurance claim form (recall, filling, pedo, dentures, implant, endo, crown, perio, extraction, ortho, consultation, emergency, other)
- Auto-infer appointment type from CDT codes with priority rules (endo > implant > crown > ...)
- typeLocked flag prevents auto-overwrite when user manually sets type
- Show appointment type label and procedure codes on schedule cards
- Background sync on /day route retroactively fixes stale appointment types
- Fix PUT /api/claims/:id to save claimFiles (previously silently dropped)
- Auto-link AppointmentFile records to ClaimFile when claim is created or updated
- Fix D5750 (denture reline) CDT range to map correctly to dentures category
- Fix typeLocked Zod rejection in appointment update route

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ff
2026-05-29 14:18:10 -04:00
parent b20dc8e976
commit 9d0cfe5dba
260 changed files with 2443 additions and 1968 deletions

File diff suppressed because one or more lines are too long

View File

@@ -162,6 +162,7 @@ exports.Prisma.AppointmentScalarFieldEnum = {
startTime: 'startTime',
endTime: 'endTime',
type: 'type',
typeLocked: 'typeLocked',
notes: 'notes',
procedureCodeNotes: 'procedureCodeNotes',
status: 'status',

View File

@@ -7893,6 +7893,7 @@ export namespace Prisma {
startTime: string | null
endTime: string | null
type: string | null
typeLocked: boolean | null
notes: string | null
procedureCodeNotes: string | null
status: string | null
@@ -7911,6 +7912,7 @@ export namespace Prisma {
startTime: string | null
endTime: string | null
type: string | null
typeLocked: boolean | null
notes: string | null
procedureCodeNotes: string | null
status: string | null
@@ -7929,6 +7931,7 @@ export namespace Prisma {
startTime: number
endTime: number
type: number
typeLocked: number
notes: number
procedureCodeNotes: number
status: number
@@ -7963,6 +7966,7 @@ export namespace Prisma {
startTime?: true
endTime?: true
type?: true
typeLocked?: true
notes?: true
procedureCodeNotes?: true
status?: true
@@ -7981,6 +7985,7 @@ export namespace Prisma {
startTime?: true
endTime?: true
type?: true
typeLocked?: true
notes?: true
procedureCodeNotes?: true
status?: true
@@ -7999,6 +8004,7 @@ export namespace Prisma {
startTime?: true
endTime?: true
type?: true
typeLocked?: true
notes?: true
procedureCodeNotes?: true
status?: true
@@ -8104,6 +8110,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked: boolean
notes: string | null
procedureCodeNotes: string | null
status: string
@@ -8141,6 +8148,7 @@ export namespace Prisma {
startTime?: boolean
endTime?: boolean
type?: boolean
typeLocked?: boolean
notes?: boolean
procedureCodeNotes?: boolean
status?: boolean
@@ -8166,6 +8174,7 @@ export namespace Prisma {
startTime?: boolean
endTime?: boolean
type?: boolean
typeLocked?: boolean
notes?: boolean
procedureCodeNotes?: boolean
status?: boolean
@@ -8187,6 +8196,7 @@ export namespace Prisma {
startTime?: boolean
endTime?: boolean
type?: boolean
typeLocked?: boolean
notes?: boolean
procedureCodeNotes?: boolean
status?: boolean
@@ -8208,6 +8218,7 @@ export namespace Prisma {
startTime?: boolean
endTime?: boolean
type?: boolean
typeLocked?: boolean
notes?: boolean
procedureCodeNotes?: boolean
status?: boolean
@@ -8216,7 +8227,7 @@ export namespace Prisma {
eligibilityStatus?: boolean
}
export type AppointmentOmit<ExtArgs extends $Extensions.InternalArgs = $Extensions.DefaultArgs> = $Extensions.GetOmit<"id" | "patientId" | "userId" | "staffId" | "title" | "date" | "startTime" | "endTime" | "type" | "notes" | "procedureCodeNotes" | "status" | "movedByAi" | "createdAt" | "eligibilityStatus", ExtArgs["result"]["appointment"]>
export type AppointmentOmit<ExtArgs extends $Extensions.InternalArgs = $Extensions.DefaultArgs> = $Extensions.GetOmit<"id" | "patientId" | "userId" | "staffId" | "title" | "date" | "startTime" | "endTime" | "type" | "typeLocked" | "notes" | "procedureCodeNotes" | "status" | "movedByAi" | "createdAt" | "eligibilityStatus", ExtArgs["result"]["appointment"]>
export type AppointmentInclude<ExtArgs extends $Extensions.InternalArgs = $Extensions.DefaultArgs> = {
patient?: boolean | PatientDefaultArgs<ExtArgs>
user?: boolean | UserDefaultArgs<ExtArgs>
@@ -8257,6 +8268,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked: boolean
notes: string | null
procedureCodeNotes: string | null
status: string
@@ -8701,6 +8713,7 @@ export namespace Prisma {
readonly startTime: FieldRef<"Appointment", 'String'>
readonly endTime: FieldRef<"Appointment", 'String'>
readonly type: FieldRef<"Appointment", 'String'>
readonly typeLocked: FieldRef<"Appointment", 'Boolean'>
readonly notes: FieldRef<"Appointment", 'String'>
readonly procedureCodeNotes: FieldRef<"Appointment", 'String'>
readonly status: FieldRef<"Appointment", 'String'>
@@ -45282,6 +45295,7 @@ export namespace Prisma {
startTime: 'startTime',
endTime: 'endTime',
type: 'type',
typeLocked: 'typeLocked',
notes: 'notes',
procedureCodeNotes: 'procedureCodeNotes',
status: 'status',
@@ -46348,6 +46362,7 @@ export namespace Prisma {
startTime?: StringFilter<"Appointment"> | string
endTime?: StringFilter<"Appointment"> | string
type?: StringFilter<"Appointment"> | string
typeLocked?: BoolFilter<"Appointment"> | boolean
notes?: StringNullableFilter<"Appointment"> | string | null
procedureCodeNotes?: StringNullableFilter<"Appointment"> | string | null
status?: StringFilter<"Appointment"> | string
@@ -46372,6 +46387,7 @@ export namespace Prisma {
startTime?: SortOrder
endTime?: SortOrder
type?: SortOrder
typeLocked?: SortOrder
notes?: SortOrderInput | SortOrder
procedureCodeNotes?: SortOrderInput | SortOrder
status?: SortOrder
@@ -46399,6 +46415,7 @@ export namespace Prisma {
startTime?: StringFilter<"Appointment"> | string
endTime?: StringFilter<"Appointment"> | string
type?: StringFilter<"Appointment"> | string
typeLocked?: BoolFilter<"Appointment"> | boolean
notes?: StringNullableFilter<"Appointment"> | string | null
procedureCodeNotes?: StringNullableFilter<"Appointment"> | string | null
status?: StringFilter<"Appointment"> | string
@@ -46423,6 +46440,7 @@ export namespace Prisma {
startTime?: SortOrder
endTime?: SortOrder
type?: SortOrder
typeLocked?: SortOrder
notes?: SortOrderInput | SortOrder
procedureCodeNotes?: SortOrderInput | SortOrder
status?: SortOrder
@@ -46449,6 +46467,7 @@ export namespace Prisma {
startTime?: StringWithAggregatesFilter<"Appointment"> | string
endTime?: StringWithAggregatesFilter<"Appointment"> | string
type?: StringWithAggregatesFilter<"Appointment"> | string
typeLocked?: BoolWithAggregatesFilter<"Appointment"> | boolean
notes?: StringNullableWithAggregatesFilter<"Appointment"> | string | null
procedureCodeNotes?: StringNullableWithAggregatesFilter<"Appointment"> | string | null
status?: StringWithAggregatesFilter<"Appointment"> | string
@@ -49067,6 +49086,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -49091,6 +49111,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -49108,6 +49129,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -49132,6 +49154,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -49153,6 +49176,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -49167,6 +49191,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -49185,6 +49210,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -51969,6 +51995,7 @@ export namespace Prisma {
startTime?: SortOrder
endTime?: SortOrder
type?: SortOrder
typeLocked?: SortOrder
notes?: SortOrder
procedureCodeNotes?: SortOrder
status?: SortOrder
@@ -51994,6 +52021,7 @@ export namespace Prisma {
startTime?: SortOrder
endTime?: SortOrder
type?: SortOrder
typeLocked?: SortOrder
notes?: SortOrder
procedureCodeNotes?: SortOrder
status?: SortOrder
@@ -52012,6 +52040,7 @@ export namespace Prisma {
startTime?: SortOrder
endTime?: SortOrder
type?: SortOrder
typeLocked?: SortOrder
notes?: SortOrder
procedureCodeNotes?: SortOrder
status?: SortOrder
@@ -57467,6 +57496,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -57489,6 +57519,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -58118,6 +58149,7 @@ export namespace Prisma {
startTime?: StringFilter<"Appointment"> | string
endTime?: StringFilter<"Appointment"> | string
type?: StringFilter<"Appointment"> | string
typeLocked?: BoolFilter<"Appointment"> | boolean
notes?: StringNullableFilter<"Appointment"> | string | null
procedureCodeNotes?: StringNullableFilter<"Appointment"> | string | null
status?: StringFilter<"Appointment"> | string
@@ -58742,6 +58774,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -58764,6 +58797,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -59805,6 +59839,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -59828,6 +59863,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -59860,6 +59896,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -59883,6 +59920,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -59959,6 +59997,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -59981,6 +60020,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -60545,6 +60585,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -60568,6 +60609,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -60692,6 +60734,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -60715,6 +60758,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -60901,6 +60945,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -60924,6 +60969,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -61262,6 +61308,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -61285,6 +61332,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -65883,6 +65931,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -66121,6 +66170,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -66143,6 +66193,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -66163,6 +66214,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -66616,6 +66668,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -66717,6 +66770,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -66739,6 +66793,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -66759,6 +66814,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -67224,6 +67280,7 @@ export namespace Prisma {
startTime: string
endTime: string
type: string
typeLocked?: boolean
notes?: string | null
procedureCodeNotes?: string | null
status?: string
@@ -67259,6 +67316,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -67281,6 +67339,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string
@@ -67301,6 +67360,7 @@ export namespace Prisma {
startTime?: StringFieldUpdateOperationsInput | string
endTime?: StringFieldUpdateOperationsInput | string
type?: StringFieldUpdateOperationsInput | string
typeLocked?: BoolFieldUpdateOperationsInput | boolean
notes?: NullableStringFieldUpdateOperationsInput | string | null
procedureCodeNotes?: NullableStringFieldUpdateOperationsInput | string | null
status?: StringFieldUpdateOperationsInput | string

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{
"name": "prisma-client-763f714d62d731c0b365e1acdf19cac05ed4e6562d30b17cc8ffd11e6278eb14",
"name": "prisma-client-ae04602e14efae70f6055fb4d588cf6860f72b63564d0ac2c7419c6c8e032b2d",
"main": "index.js",
"types": "index.d.ts",
"browser": "default.js",

View File

@@ -100,6 +100,7 @@ model Appointment {
startTime String // Store time as "hh:mm"
endTime String // Store time as "hh:mm"
type String // e.g., "checkup", "cleaning", "filling", etc.
typeLocked Boolean @default(false) // true = user manually set; auto-sync will not overwrite
notes String?
procedureCodeNotes String?
status String @default("scheduled") // "scheduled", "completed", "cancelled", "no-show"