- Add appointment type categories matching insurance claim form (recall, filling, pedo, dentures, implant, endo, crown, perio, extraction, ortho, consultation, emergency, other)
- Auto-infer appointment type from CDT codes with priority rules (endo > implant > crown > ...)
- typeLocked flag prevents auto-overwrite when user manually sets type
- Show appointment type label and procedure codes on schedule cards
- Background sync on /day route retroactively fixes stale appointment types
- Fix PUT /api/claims/:id to save claimFiles (previously silently dropped)
- Auto-link AppointmentFile records to ClaimFile when claim is created or updated
- Fix D5750 (denture reline) CDT range to map correctly to dentures category
- Fix typeLocked Zod rejection in appointment update route
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix Express route ordering in appointments-procedures so /prefill-from-appointment
is matched before /:id (D0140 and other codes now always reach the claim)
- claim-form: always fetch AppointmentProcedure records when an existing claim loads
so post-save procedure edits (e.g. adding D0140) are reflected immediately
- appointments-page: replace sessionStorage with React state (newApptPrefill) for
slot-click prefill so columns B-F correctly carry their staffId into the form
- add-appointment-modal / appointment-form: thread prefillData prop; add
NewAppointmentPrefill interface; useEffect applies values via setValue
- appointments upsert: remove per-patient dedup so the same patient can have
multiple appointments on the same day in the same column
- DentaQuest / TuftsSCO: navigate to about:blank and minimize instead of
quit_driver after each run — session cookie stays in memory so OTP is only
required once per app startup, not on every eligibility or claim check
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- claims.ts: batch-column now routes each patient to the correct portal
(MH/CCA/DDMA/TuftsSCO/UnitedSCO) based on patient.insuranceProvider
- appointments-page.tsx: eligibility badge falls back to patientStatus
for all insurance types, not just MassHealth
- unitedDHClaimProcessor/ddmaClaimProcessor/tuftsSCOClaimProcessor:
auto-save claim PDF when no socketId (batch-column path)
- unitedSCOEligibilityProcessor: unknown eligibility no longer stored as INACTIVE
- queues.ts: add tuftssco-claim-submit and uniteddh-claim-submit to SeleniumJobType
- selenium_UnitedSCO_eligibilityCheckWorker.py:
- step1: add Select Insurance OK click with staleness wait; Provider &
Location page just clicks Continue; skip first/last name input
- step2: extract name from eligibility details tab (ALL CAPS → title case);
skip "not available" guard; fix name regex to match only all-caps words
- .gitignore: ignore all chrome_profile_* directories
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds stop-app.sh to kill all services by port (5000-5003, 3000/3001)
and updates setup-desktop-shortcut.sh to create both Start and Stop
desktop shortcuts in a single run. README Step 13 updated accordingly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each office sets VITE_CLOUDFLARE_HOST and CLOUDFLARE_HOST in their
local .env files instead of hardcoding the subdomain in source code.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Deleting users with patients/appointments/claims was blocked by FK
constraints. Now reassigns those records to the requesting admin before
deletion, and cleans up user-specific data (backups, cloud files).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removed per-user patient filtering so all staff accounts see the same
patient pool. Previously each user only saw patients they created.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the prisma migrate deploy subprocess with a custom
applyMissingMigrations() that reads each migration SQL file and runs it
via prisma.$executeRawUnsafe. This avoids the Prisma CLI aborting when
the restored _prisma_migrations table contains orphaned entries (migration
names that no longer have a corresponding file in the migrations folder).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- After importing a backup, run prisma migrate deploy so any schema
migrations the backup is missing are applied automatically. This
prevents pages from failing due to missing tables/columns when the
backup was taken on an older version of the app.
- Force logout and redirect to login after a successful restore so the
JWT is refreshed against the restored database (prevents userId
mismatch causing user-scoped queries to return empty results).
- Fix getTotalPatientCount() in /status route to pass userId so it
counts only the current user's patients instead of all patients.
- Add prisma.$connect() after $disconnect() to ensure a clean reconnect.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Route DDMA eligibility through InProcessQueue (concurrency=1) so it
queues behind other selenium jobs instead of running concurrently
- New ddmaEligibilityProcessor: starts Python session, polls for OTP/
completion via socket events, saves PDF and updates patient DB
- Frontend ddma-buton-modal now uses shared app socket + job:update
pattern (drops private socket connection)
- SeleniumService: upgrade ddma_browser_manager with credential hash
tracking, anti-detection options, and startup session clearing;
upgrade DDMA worker with firstName/lastName support, PDF via
printToPDF, force-logout on credential change; upgrade helpers with
dual OTP strategy (app API + browser polling); add /clear-ddma-session
endpoint; reduce fixed sleeps with smart WebDriverWait
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Reset public schema before psql restore so existing tables don't
block CREATE TABLE statements (pg_dump without --clean has no DROPs)
- Disconnect Prisma connection pool after restore so next request
gets fresh connections against the restored data
- Auto-create the USB backup subfolder if it doesn't exist instead
of failing; only fail if the destination drive itself is missing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds ordered setup steps (Node.js, Python, Chrome, PostgreSQL, Redis,
pip dependencies) so a fresh machine can be fully configured from
git clone to running the app without guessing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>