- 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>
41 lines
1.4 KiB
TypeScript
Executable File
41 lines
1.4 KiB
TypeScript
Executable File
import * as z from 'zod';
|
|
|
|
import type { Prisma } from '../../generated/prisma';
|
|
|
|
import Decimal from "decimal.js";
|
|
|
|
// DECIMAL HELPERS
|
|
//------------------------------------------------------
|
|
|
|
export const DecimalJSLikeSchema: z.ZodType<Prisma.DecimalJsLike> = z.object({
|
|
d: z.array(z.number()),
|
|
e: z.number(),
|
|
s: z.number(),
|
|
// Zod v3/v4 compatible callable check
|
|
toFixed: z.custom<Prisma.DecimalJsLike['toFixed']>((v) => typeof v === 'function'),
|
|
});
|
|
|
|
// Accept canonical decimal strings (+/-, optional fraction, optional exponent), or Infinity/NaN.
|
|
export const DECIMAL_STRING_REGEX = /^(?:[+-]?(?:[0-9]+(?:.[0-9]+)?(?:[eE][+-]?[0-9]+)?|Infinity)|NaN)$/;
|
|
|
|
export const isValidDecimalInput = (
|
|
v?: null | string | number | Prisma.DecimalJsLike,
|
|
): v is string | number | Prisma.DecimalJsLike => {
|
|
if (v === undefined || v === null) return false;
|
|
return (
|
|
// Explicit instance checks first
|
|
v instanceof Decimal ||
|
|
// If Decimal.js is present and imported by the generator, this symbol exists at runtime
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore - Decimal may be undefined when not installed; codegen controls the import
|
|
(typeof Decimal !== 'undefined' && v instanceof Decimal) ||
|
|
(typeof v === 'object' &&
|
|
'd' in v &&
|
|
'e' in v &&
|
|
's' in v &&
|
|
'toFixed' in v) ||
|
|
(typeof v === 'string' && DECIMAL_STRING_REGEX.test(v)) ||
|
|
typeof v === 'number'
|
|
);
|
|
};
|