Back to projects
Finished

OdontoCare

A management system for a dental practice: patients, quotes, invoices and reminders in one place, with passwordless access and documents built from the data.

|
RoleAnalysis, design, development and server management
TeamSolo project
Technologies10 technologies

What it is

An ASP.NET Core Razor Pages application built around a clinic's daily work: the patient record, the quote with its instalment plan, the invoice, the reminder. Forms patients fill in online file themselves, documents come out as real PDFs generated from the data, and whoever works the front desk signs in with a one-time code instead of a password written down somewhere. The same code runs on two different databases — SQL Server in development, PostgreSQL in production — because the production machine moved house twice and the project had to be able to follow it.

Main features

Patients

  • Records and the individual patient file
  • Forms filled in online that file themselves
  • Treatment price list, per clinic

Documents

  • Quotes with a calculated instalment plan
  • Invoices with the line items taken from the quote
  • PDFs generated from the data, not filled in by hand

Practice

  • Several clinics under the same sign-in
  • Collaborators with distinct roles, invited by the owner
  • Sign-in with a one-time code by email

Upkeep

  • Automatic reminder when a backup is missing
  • Push notifications, with no app to install
  • A log of every backup operation

Problems and solutions

The online forms arrive from an external service, and the temptation was to read them against a schema invented at the desk. That would have worked right up until the owner added a question to the form: from then on every submission would have landed in the wrong place, silently.

SolutionThe message is read the way it is actually built: each question carries the wording the owner wrote, and that is where the name, the phone number and the preferred contact time are looked for. A record is created only when all three are there. Test submissions, half-finished forms and requests with no contact details are ignored — the external service is still told everything went fine, so it does not retry forever.

The production machine ran on ARM, where SQL Server simply does not exist. In development, though, SQL Server is the one already installed, with nothing to download.

SolutionThe database engine is chosen from configuration, and each one has its own migrations project: two separate histories, neither trying to apply instructions written for its neighbour. Development starts by pressing F5, production starts on Postgres, and nothing in between has to be edited by hand.

The hosting provider closed the account without warning and with no way to recover what was on it.

SolutionThe project was running again on a different provider within a day, because the installation procedure was written down step by step rather than remembered, and the production database was already the portable one. The old guide was not deleted: it is still there, with a note at the top saying why it no longer applies.

Project access

Technologies

C#
.NET
ASP.NET Core
Razor Pages
Entity Framework Core
PostgreSQL
SQL Server
QuestPDF
Linux
nginx

Contents

  • What it is
  • Main features
  • Problems and solutions