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>
This commit is contained in:
2026-10-07 22:41:44 -04:00
co-authored by Claude Opus 5.5
parent d67e68c957
commit 2c0c595af5
294 changed files with 13054 additions and 1776 deletions
@@ -1,5 +1,5 @@
import * as z from 'zod';
export const NpiProviderScalarFieldEnumSchema = z.enum(['id', 'userId', 'npiNumber', 'providerName', 'sortOrder', 'createdAt'])
export const NpiProviderScalarFieldEnumSchema = z.enum(['id', 'userId', 'npiNumber', 'providerName', 'licenseNumber', 'sortOrder', 'createdAt'])
export type NpiProviderScalarFieldEnum = z.infer<typeof NpiProviderScalarFieldEnumSchema>;
@@ -1,5 +1,5 @@
import * as z from 'zod';
export const OfficeContactScalarFieldEnumSchema = z.enum(['id', 'userId', 'officeName', 'receptionistName', 'dentistName', 'phoneNumber', 'email', 'fax', 'streetAddress', 'city', 'state', 'zipCode'])
export const OfficeContactScalarFieldEnumSchema = z.enum(['id', 'userId', 'officeName', 'receptionistName', 'dentistName', 'phoneNumber', 'email', 'fax', 'streetAddress', 'city', 'state', 'zipCode', 'billingName', 'billingNpi', 'billingLicense', 'billingTaxId'])
export type OfficeContactScalarFieldEnum = z.infer<typeof OfficeContactScalarFieldEnumSchema>;