v11.17Dental Workflow Rebuild & Data Integrity

Release Notes

Every version of CuraVerto. From a single appointments tool to an AI-first Care OS.

37

Releases

34

in 2026

134

Modules

v11.17CurrentAugust 2026

Dental Workflow Rebuild & Data Integrity

v11.17 rebuilds the dental Rx-session modal across two more phases (an explicit, touch-friendly multi-tooth selection mode, an auto-starting case sheet, a treatment-history drill-down, and a legibility pass on the clinical documentation card), and finally wires the treatment-plan-to-payment loop end to end, from acceptance through an optional payment schedule to the bill itself. A root-cause fix stops WhatsApp from creating duplicate patient records when a phone number wasn't sanitized before the very first write, followed by a one-time cleanup of the records that fix leaves behind. An audit-log coverage sweep closes gaps across roughly 40 API routes, the WhatsApp Doctor Daily Summary gains a full per-appointment list, and legal-document signing links can now be recovered after the page that generated them closes. Underneath it all, a run of finance and cron fixes correct how journal entries post on partially-paid invoices and make the billing-reconciliation cron check data it had been silently skipping.

⚡ See what's new in v11.17 →
🦷
Dental Workflow Rebuild

Odontogram multi-select rebuilt as a visible control

Hidden shift-click multi-select, invisible by design and unusable on touch devices, is replaced with an explicit "Select multiple" toggle and a floating batch bar for applying a condition or adding a procedure to every selected tooth at once.

Rx-session modal redesign, phases 3 and 4

The case sheet now auto-starts instead of requiring the same "start" action from three different places; the exam/investigation/outcome block reads as clearly optional rather than a mandatory checklist; treatment history gets a drill-down into a past visit's full record; and the odontogram no longer grays out teeth based on an age profile.

Clinical Documentation legibility pass

Retired sub-AA contrast pairs on the card's most consequential controls (a disabled "Present plan" button was rendering at 1.48:1 contrast), merged two separate fold-in sections into one card, and shortened row labels that repeated their own section header.

Fixed Treatment Plan history silently empty for most real visits

The history join keyed exclusively on appointment_id, which is null on the large majority of production case-sheet and treatment rows because the cockpit frequently has no appointment in scope. Now falls back to matching by the same clinical day in IST, verified against real production data.

Fixed case-sheet PDF 403ing on every request, and inconsistent module-gating errors

A bad column selection in the PDF route's auth check 403'd every request for every dental-enabled tenant. Separately, five routes each carried their own copy-pasted guard that reported a missing dental module as a misleading 401 instead of 403, now centralized so the two failures are never confused again.

💳
Dental Plan-to-Payment Loop

Plan acceptance now actually reaches billing

The plumbing to carry an accepted treatment plan into a payment schedule and onto the bill existed in code but had never carried a real payment in production. It is now reachable end to end, gated only on an explicit acceptance step.

Fixed the acceptance modal closing before the payment-schedule step could render

A React update-batching order meant the modal unmounted in the same render pass that set the payment-schedule step, discarding it before it ever painted. The schedule table had rows only from test walkthroughs, never from a real accepted plan.

The plan-confirmation prompt now names the actual amount

A "Confirm plan cost" button previously showed no figure anywhere on screen. It now displays the quoted price, and a plan with no recorded cost can no longer be silently committed at zero.

Quick Bill no longer auto-seeds a consultation-fee line

A walk-in bill was opening pre-filled with the doctor's own configured consultation rate, guessed from a catalog search the modal was never supposed to run for a quick bill.

Plan prompt rebuilt as a peer of the balance bar; unsaved edits now flush on Present

The plan-cost row now takes the same icon/label/money-column layout as the "Settled in full" strip above it instead of reading as an unstyled leftover, and a plan built earlier in the same visit no longer needs a full Save & Send round-trip before it can be presented to the patient.

🔒
Patient Data Integrity

Root-cause fix for WhatsApp-created duplicate patients

Add Patient and self-service intake both wrote phone numbers in raw, unsanitized form, invisible to the WhatsApp bot's canonical-format patient lookup, so the next inbound message from that number harvested a second, duplicate patient record. Both write paths now sanitize to the same canonical format the lookup matches against.

One-time cleanup of records created by the mismatch

Twenty-two hand-reviewed duplicate patient records were merged non-destructively: every appointment, invoice and other child record re-pointed to the surviving patient, with consent and legally-immutable records left untouched.

Family-linked genuine phone-collision pairs

Nine pairs that looked like duplicates but turned out to be two different real people sharing one household or registration phone number were linked as family members instead of merged, so WhatsApp now offers a member picker for that number rather than an unreliable exact-match guess.

🛡️
Audit Coverage & Communications

Closed audit-log coverage gaps across roughly 40 API routes

A sweep against the platform's mandatory audit-entity list found three systemic causes: a logging helper that only wrote to the console instead of the database, wallet debit/refund never writing an audit entry at all, and six data-migration routes silently rejected by the database for using column names that don't exist on the real table.

Fixed lead-to-patient conversion silently dropping its audit trail

The same wrong-column-shape bug meant all three audit events fired on converting a lead to a patient were rejected by the database on every single call, with no error surfaced anywhere.

Doctor Daily Summary WhatsApp digest gains a full appointment list

The morning digest now lists every appointment, with patient, time and service, instead of just a count. The new template is with Meta for review; the current digest keeps sending unchanged until it's approved.

Legal-document signing links can now be recovered

A packet's signing link previously lived only in the browser tab that created it and was gone for good on reload, forcing a second, disconnected packet for the same clinic. Links now persist and can be recovered from the Outstanding Packets screen.

📈
IVF Journey & Platform Correctness

New guided IVF treatment journey

A clinic-authored 20-step treatment protocol is now a structured, trackable journey per cycle. Clinical steps auto-resolve from existing records (scan results, stimulation medications, transfer records) where the data exists; the journey view stays hidden on cycles that never opted into it rather than rendering as a phantom checklist.

FET cycle linkage and package-entitlement foundation

Frozen-embryo-transfer cycles gain proper parent-cycle linkage and corrected cycle typing. Package procedure entitlements (included vs. priced-extra procedures) shipped as a data foundation only, not yet enabled for any tenant.

Journal entries now post what was actually collected

A part-paid invoice (an advance, a course credit, an installment) was posting its receipt journal entry for the full billed amount instead of the amount actually collected, overstating cash-in-hand on the books. The receipt leg now posts the real collected amount; income recognition is unaffected.

Billing-reconciliation cron checks data it had been silently skipping

The cron's driver queries never paginated past a 1,000-row database cap, so roughly 45% of the largest tenants' bills were never actually examined despite the cron reporting a clean run. Now paginates fully, stops double-counting corrected split-payment invoices, and scopes its journal-entry check to clinical invoices only: pharmacy invoices post through a different accounting path and were being flagged as false positives.

All Changes in v11.17

  • Odontogram multi-select rebuilt as an explicit, touch-friendly control with a floating bulk-action bar
  • Dental Rx-session modal redesign phases 3-4: auto-starting case sheet, optional exam block, treatment-history drill-down
  • Clinical Documentation legibility pass: fixed sub-AA contrast on the modal's most consequential controls
  • Fixed Treatment Plan history silently empty for most real visits, re-keyed off IST clinical day rather than appointment_id
  • Fixed dental case-sheet PDF 403ing on every request; centralized module-gating so a missing module always reports 403
  • Dental plan-to-payment loop now reaches billing end to end for the first time in production
  • Fixed the plan-acceptance modal closing itself before the payment-schedule step could render
  • Plan-confirmation prompt now names the actual quoted amount instead of asking staff to confirm a number they can't see
  • Quick Bill no longer auto-seeds a consultation-fee line onto a walk-in bill
  • Root-cause fix for WhatsApp-created duplicate patients: phone numbers sanitized before every write, not just at lookup
  • One-time cleanup: 22 duplicate patient records merged non-destructively, 9 genuine phone-collision pairs family-linked instead
  • Closed audit-log coverage gaps across roughly 40 API routes, with three systemic root causes fixed at once
  • Fixed lead-to-patient conversion silently dropping all three of its audit-log entries
  • Doctor Daily Summary WhatsApp digest gains a full per-appointment list (patient, time, service)
  • Legal-document packet signing links now persist and can be recovered after the creating session ends
  • New guided IVF treatment journey: a clinic-authored 20-step protocol, with clinical steps auto-resolved from existing records
  • FET cycle parent-linkage and typing fixes; package-entitlement foundation shipped, not yet enabled for any tenant
  • Journal entries on a part-paid invoice now post the amount actually collected, not the full billed total
  • Billing-reconciliation cron now checks past a 1,000-row cap that had silently excluded ~45% of the largest tenants' bills
  • Billing-reconciliation cron stops flagging paid pharmacy invoices as drift, scoped to clinical invoices only