feat: fix DDMA eligibility — patient list, name extraction, PDF page, OTP session

- Filter patient list by userId so each user sees only their own patients
- Sort patients by updatedAt DESC so recently checked patients appear first
- Add updatedAt field to Patient model (DB migration via raw SQL + db:generate)
- Fix DDMA name extraction: read from detail page "Name:" label, not search
  results row text which included appended dates
- Fix PDF capture: use driver.get() instead of click() to avoid race condition
  that was saving the search results page instead of the patient detail page
- Strip trailing bare dates from extracted names (e.g. "Rodriguez 04/27/2026")
- Handle "Last, First" comma format and single-word last names in splitName
- Normalize insuranceId consistently in createOrUpdatePatientByInsuranceId
- Fix OTP persistent session: stop clearing LocalStorage/IndexedDB on startup
  (these hold the DDMA device trust token that skips OTP on subsequent logins)
- Increase post-navigation wait time for full page render before PDF generation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Gitead
2026-05-01 21:40:04 -04:00
parent 24bbaed6ab
commit e26ebf7fd5
213 changed files with 1698 additions and 1425 deletions

View File

@@ -1,6 +1,7 @@
import * as z from 'zod';
import { Prisma } from '../../../generated/prisma';
import Decimal from 'decimal.js';
import type { Prisma } from '../../../generated/prisma';
import Decimal from "decimal.js";
export declare const AppointmentProcedureUncheckedUpdateManyInputObjectSchema: z.ZodType<Prisma.AppointmentProcedureUncheckedUpdateManyInput>;
export declare const AppointmentProcedureUncheckedUpdateManyInputObjectZodSchema: z.ZodObject<{
id: z.ZodOptional<z.ZodUnion<[z.ZodNumber, z.ZodLazy<z.ZodType<Prisma.IntFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.IntFieldUpdateOperationsInput>>]>>;
@@ -8,7 +9,7 @@ export declare const AppointmentProcedureUncheckedUpdateManyInputObjectZodSchema
patientId: z.ZodOptional<z.ZodUnion<[z.ZodNumber, z.ZodLazy<z.ZodType<Prisma.IntFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.IntFieldUpdateOperationsInput>>]>>;
procedureCode: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodLazy<z.ZodType<Prisma.StringFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.StringFieldUpdateOperationsInput>>]>>;
procedureLabel: z.ZodNullable<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodLazy<z.ZodType<Prisma.NullableStringFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.NullableStringFieldUpdateOperationsInput>>]>>>;
fee: z.ZodNullable<z.ZodOptional<z.ZodUnion<[z.ZodEffects<z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodType<Decimal, z.ZodTypeDef, Decimal>, z.ZodType<Prisma.Decimal, z.ZodTypeDef, Prisma.Decimal>, z.ZodType<import("../../../generated/prisma/runtime/client").DecimalJsLike, z.ZodTypeDef, import("../../../generated/prisma/runtime/client").DecimalJsLike>]>, string | number | import("../../../generated/prisma/runtime/client").DecimalJsLike | Prisma.Decimal | Decimal, string | number | import("../../../generated/prisma/runtime/client").DecimalJsLike | Prisma.Decimal | Decimal>, z.ZodLazy<z.ZodType<Prisma.NullableDecimalFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.NullableDecimalFieldUpdateOperationsInput>>]>>>;
fee: z.ZodNullable<z.ZodOptional<z.ZodUnion<[z.ZodEffects<z.ZodUnion<[z.ZodNumber, z.ZodString, z.ZodType<Decimal, z.ZodTypeDef, Decimal>, z.ZodType<Decimal, z.ZodTypeDef, Decimal>, z.ZodType<import("../../../generated/prisma/runtime/client").DecimalJsLike, z.ZodTypeDef, import("../../../generated/prisma/runtime/client").DecimalJsLike>]>, string | number | import("../../../generated/prisma/runtime/client").DecimalJsLike | Decimal | Decimal, string | number | import("../../../generated/prisma/runtime/client").DecimalJsLike | Decimal | Decimal>, z.ZodLazy<z.ZodType<Prisma.NullableDecimalFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.NullableDecimalFieldUpdateOperationsInput>>]>>>;
category: z.ZodNullable<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodLazy<z.ZodType<Prisma.NullableStringFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.NullableStringFieldUpdateOperationsInput>>]>>>;
toothNumber: z.ZodNullable<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodLazy<z.ZodType<Prisma.NullableStringFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.NullableStringFieldUpdateOperationsInput>>]>>>;
toothSurface: z.ZodNullable<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodLazy<z.ZodType<Prisma.NullableStringFieldUpdateOperationsInput, z.ZodTypeDef, Prisma.NullableStringFieldUpdateOperationsInput>>]>>>;
@@ -22,7 +23,7 @@ export declare const AppointmentProcedureUncheckedUpdateManyInputObjectZodSchema
patientId?: number | Prisma.IntFieldUpdateOperationsInput | undefined;
procedureCode?: string | Prisma.StringFieldUpdateOperationsInput | undefined;
procedureLabel?: string | Prisma.NullableStringFieldUpdateOperationsInput | null | undefined;
fee?: string | number | import("../../../generated/prisma/runtime/client").DecimalJsLike | Prisma.Decimal | Decimal | Prisma.NullableDecimalFieldUpdateOperationsInput | null | undefined;
fee?: string | number | import("../../../generated/prisma/runtime/client").DecimalJsLike | Decimal | Decimal | Prisma.NullableDecimalFieldUpdateOperationsInput | null | undefined;
category?: string | Prisma.NullableStringFieldUpdateOperationsInput | null | undefined;
toothNumber?: string | Prisma.NullableStringFieldUpdateOperationsInput | null | undefined;
toothSurface?: string | Prisma.NullableStringFieldUpdateOperationsInput | null | undefined;
@@ -36,7 +37,7 @@ export declare const AppointmentProcedureUncheckedUpdateManyInputObjectZodSchema
patientId?: number | Prisma.IntFieldUpdateOperationsInput | undefined;
procedureCode?: string | Prisma.StringFieldUpdateOperationsInput | undefined;
procedureLabel?: string | Prisma.NullableStringFieldUpdateOperationsInput | null | undefined;
fee?: string | number | import("../../../generated/prisma/runtime/client").DecimalJsLike | Prisma.Decimal | Decimal | Prisma.NullableDecimalFieldUpdateOperationsInput | null | undefined;
fee?: string | number | import("../../../generated/prisma/runtime/client").DecimalJsLike | Decimal | Decimal | Prisma.NullableDecimalFieldUpdateOperationsInput | null | undefined;
category?: string | Prisma.NullableStringFieldUpdateOperationsInput | null | undefined;
toothNumber?: string | Prisma.NullableStringFieldUpdateOperationsInput | null | undefined;
toothSurface?: string | Prisma.NullableStringFieldUpdateOperationsInput | null | undefined;