Files
DentalManagement09/packages/db/shared/helpers/decimal-helpers.ts
T
GiteadandClaude Opus 5.5 2c0c595af5 feat: BCBS MA paper claim — fill 2024 ADA claim form; office NPI setting
- New GET /api/claims/:id/ada-form fills the 2024 ADA Dental Claim Form
  (J43024) with payer address, patient/subscriber, CDT lines, fees,
  missing teeth, billing (office) NPI and treating NPI; signatures blank
- "BCBS Claim (ADA Form)" button saves the claim and opens the PDF;
  Claim All routes BCBS patients to it; "Print ADA Form" in claim view
- Settings > NPI Providers: "Add Office NPI" (billing name, NPI, license,
  TIN) and optional per-provider license number
- Migration: office_contact billing fields, NpiProvider.licenseNumber

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 22:41:44 -04:00

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'
);
};