Skip to main content

Overview

v1.10 is a quality-and-analytics release. The Financial Hub gains four new revenue chart sections — by service, by doctor, AR aging, and payment methods — giving clinic admins actionable breakdowns instead of a single-number summary. The WhatsApp sidebar now lets you attach invoice PDFs directly (matching the existing receipt and quotation attachment). Prescriptions get three critical fixes around saving, sorting, and exporting. Permissions caching is fixed so role changes take effect immediately instead of 30 seconds to 5 minutes later. And required fields across the app now show their red asterisk markers consistently.

Finance — Revenue Analytics Dashboard

The Financial Hub’s Revenue Overview now shows where your money comes from.
  • Revenue by Service. A horizontal bar chart of your top 10 procedures by billed revenue. See at a glance which treatments drive your practice.
  • Revenue by Provider. Per-doctor revenue breakdown so you can understand each provider’s contribution.
  • AR Aging. Outstanding balances grouped into 30-day buckets (0–30, 31–60, 61–90, 90+) as a stacked bar chart. Instantly spot which accounts need follow-up.
  • Payment Methods. Cash, card, and online payments shown as a donut chart with percentages.
  • Field-name corrections. The analytics queries were referencing column names that don’t exist in the database schema. Revenue data is now accurate.

WhatsApp Sidebar — Invoice PDF Attachment

The chat sidebar now lets you attach invoice PDFs directly to the message composer.
  • Invoice paperclip button. Every invoice row in the sidebar now has a paperclip icon. Click it to download the invoice PDF, upload it as a chat attachment, and stage it in the composer — identical to how receipts and quotations already worked.
  • “Sent ×N” counter badge. After you attach a document, a blue badge appears showing how many times it’s been shared in this session. Attach the same invoice again and the counter increments to “Sent ×2,” “Sent ×3,” and so on. You always know which documents have already gone to the patient.
  • Always-visible attach buttons. Paperclip icons are now shown at 50% opacity instead of being completely hidden until hover. This makes the feature discoverable on touch devices and improves keyboard accessibility.

Prescriptions — Three Critical Fixes

  • Custom medications now save. Prescriptions with non-library medications (where you type the medicine name instead of selecting from the catalogue) were silently rejected by the database. They now save correctly.
  • Prescription list works again. The status filter was comparing against the wrong capitalisation (“Active” vs “active”), so filtering for active prescriptions always returned empty. Now filters correctly. The list also sorts newest-first.
  • Save & Export actually exports. The Export button now opens the PDF in a new browser tab (ready to print) and triggers a file download. Previously it did nothing visible.

Permissions — “Toggle On But Doesn’t Work” Fixed

Three cache-invalidation bugs meant staff saw old permissions long after an admin changed them.
  • UI cache cleared on save. The 30-second browser-side permission cache is now invalidated immediately when an admin saves a role template. Previously staff could see old permissions for up to 30 seconds — exactly matching the “toggle shows on but features don’t work” symptom.
  • Server cache cleared on mutation. The 5-minute server-side module cache is now invalidated whenever a superadmin toggles a module, changes odontogram version, or syncs templates to a plan. Staff no longer wait 5 minutes for module changes to take effect.
  • Write database used for mutations. Permission and module writes now use the primary write database connection instead of the read replica. On Neon serverless, writes through the read pool can fail silently.
  • Module IDs aligned. The permission tree’s module IDs now match the server’s module registry keys. “Billing” is now “finance” (the actual Financial Hub key), and “lab” is now “lab_tracking” — so toggling these permissions actually controls access to the right features.

Patients — Required Fields & Medical History

  • Date of birth and address are now mandatory. When creating a new patient, both date of birth (or age) and address must be filled in. The server enforces this at the API level, and the form shows red asterisks and blocks submission until completed.
  • MRN / Patient # required when the module is active. The field is marked with a red asterisk and validated both client-side and server-side.
  • Required-field asterisk markers fixed across the app. Four definite bugs where asterisks would never appear (Service Catalog name/price, Prescription Wizard patient selector, Booking Form label) are fixed. Eight additional forms now use explicit required props instead of relying on a delayed auto-detection effect that missed fields on first render.
  • Medical history now persists. Two separate bugs — the server ignored medical history on patient updates, and the UI wasn’t wired to send updates — meant any medical history entered through the Edit Patient form was silently discarded. It now saves to the database and survives page refresh.

Appointments — Conflict Detection & Slot Reliability

  • Exclusion-based conflict detection. The conflict checker now blocks slots for every status except “cancelled” instead of only checking “scheduled” and “confirmed.” This means “requested” appointments now properly block their slots, and cancelled appointments free their slots instantly everywhere. New statuses added in the future will block by default — the safer default.
  • Patient names in conflict messages. When a booking conflicts, the error now includes the conflicting patient’s name: “Doctor already has an appointment from 10:00 to 10:30 (John Doe).” Staff can identify the conflict without opening the calendar.
  • Staff can cancel past appointments. The 48-hour cancellation restriction now only applies to patients and doctors. Admin and reception staff can cancel past appointments for schedule cleanup.
  • Add Note from the clinical tab. The Clinical Notes tab on appointments now has an “Add Note” button that opens an inline creation form with all standard fields (visit date, chief complaint, diagnosis, treatment, prescriptions, notes, follow-up).
  • SlotPicker respects selected duration. When editing an appointment, changing the duration dropdown instantly updates the time slot grid to match — a 15-minute appointment shows 15-minute slots, not the clinic’s default interval.
  • Timezone offset applied to cancellation window. The 48-hour cancellation window was parsing Pakistan time (PKT) as UTC, making it off by 5 hours. Fixed to match the timezone handling already applied elsewhere.
  • Corrupted operating hours no longer block all bookings. If a clinic’s operating hours JSON is corrupted, the slot calculator now logs the error and falls back gracefully instead of blocking all appointment creation with a 500 error.
  • DELETE route can no longer bypass validation. The DELETE endpoint was cancelling appointments without checking role permissions or the 48-hour patient window. Now uses the same validation guards as the status-change endpoint.
  • Slot minimums raised to 10 minutes. 5-minute appointment slots were never practical for dental practice and generated 100+ slots per day, harming performance. Minimum step is now 10 minutes.

Reliability

  • Non-existent clinic IDs return a clear 404 instead of silently generating incorrect slots.
  • Missing operating hours return clinicClosed instead of defaulting to 24/7 availability.
  • Doctor/clinic intersection failures return accurate flags instead of always reporting both as false.
  • Optional chaining on execution context prevents a test-environment crash that turned successful status updates into 500 errors.