fix: allow claims without appointment + support post/core multi-tooth input

- Make appointmentId nullable/optional in Prisma Zod schema via @zod rich
  comment so claims can be submitted without an existing appointment
- Convert undefined appointmentId to null in all claim form handlers and
  the backend claim creation endpoint
- Add AI classifier rule for expanding one procedure across multiple
  comma-separated tooth numbers (e.g. "post/core on #23, 24, 25, 26")
- Add "post/core" (slash) alias to CDT lookup maps

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-28 22:57:24 -04:00
parent c9d08028a9
commit e1fe4862d5
1613 changed files with 59200 additions and 422 deletions

View File

@@ -40,34 +40,63 @@ exports.UserAggregateResultSchema = z.object({ _count: z.object({
username: z.number(),
password: z.number(),
autoBackupEnabled: z.number(),
autoBackupHour: z.number(),
usbBackupEnabled: z.number(),
usbBackupHour: z.number(),
autoMhCheckEnabled: z.number(),
autoMhCheckDayOfWeek: z.number(),
autoMhCheckHour: z.number(),
patients: z.number(),
appointments: z.number(),
staff: z.number(),
npiProviders: z.number(),
claims: z.number(),
insuranceCredentials: z.number(),
shoppingVendors: z.number(),
updatedPayments: z.number(),
backups: z.number(),
backupDestinations: z.number(),
notifications: z.number(),
cloudFolders: z.number(),
cloudFiles: z.number(),
communications: z.number()
communications: z.number(),
twilioSettings: z.number(),
aiSettings: z.number(),
officeHours: z.number(),
officeContact: z.number(),
procedureTimeslot: z.number(),
insuranceContacts: z.number(),
patientConversations: z.number()
}).optional(),
_sum: z.object({
id: z.number().nullable()
id: z.number().nullable(),
autoBackupHour: z.number().nullable(),
usbBackupHour: z.number().nullable(),
autoMhCheckDayOfWeek: z.number().nullable(),
autoMhCheckHour: z.number().nullable()
}).nullable().optional(),
_avg: z.object({
id: z.number().nullable()
id: z.number().nullable(),
autoBackupHour: z.number().nullable(),
usbBackupHour: z.number().nullable(),
autoMhCheckDayOfWeek: z.number().nullable(),
autoMhCheckHour: z.number().nullable()
}).nullable().optional(),
_min: z.object({
id: z.number().int().nullable(),
username: z.string().nullable(),
password: z.string().nullable()
password: z.string().nullable(),
autoBackupHour: z.number().int().nullable(),
usbBackupHour: z.number().int().nullable(),
autoMhCheckDayOfWeek: z.number().int().nullable(),
autoMhCheckHour: z.number().int().nullable()
}).nullable().optional(),
_max: z.object({
id: z.number().int().nullable(),
username: z.string().nullable(),
password: z.string().nullable()
password: z.string().nullable(),
autoBackupHour: z.number().int().nullable(),
usbBackupHour: z.number().int().nullable(),
autoMhCheckDayOfWeek: z.number().int().nullable(),
autoMhCheckHour: z.number().int().nullable()
}).nullable().optional() });