Skip to content

Optometry Clinic

Anterior-eye grading, a replayable chart history, and a recall book that carries its value.

The short answer

Optometry Clinic is an Odoo module for an independent optometry practice. The anterior eye is recorded as anatomy rather than prose, graded zone by zone per eye on a history that cannot be overwritten and can be replayed to any past date. Beside it sits a priced recall book: signing off an exam closes the recall it answered and writes the next one.

What it is for

A diary tells you who is coming on Thursday. It will not tell you that a patient's annual eye exam fell due a year ago and was worth a sight test plus the spectacles that usually follow it, or that a glaucoma follow-up runs on a shorter cycle than everybody else in the file. Every product in this category records the booking. Very few keep the book of patients who did not come back, and for a small practice that book is the business.

Platform
Odoo
Category
Clinical records
Works with
Odoo 18 · Odoo 19
Technical name
optometry_clinic
Status
Published on the Odoo App Store
On the store
Odoo 19 Odoo 18
Pricing
Paid

What is inside it

  1. 01

    The eye chart

    Eight clinical signs over seventeen anatomical zones per eye, graded 0 to 4 by clicking the structure the sign was seen in. A sign will not save on a structure where it cannot occur.

  2. 02

    The recall book

    A recall carries a type, an interval and an expected value. Marking an exam Done completes the recall, restamps the last-exam date and raises the next one, without duplicating a follow-up that already exists.

  3. 03

    Tiles and their lists

    A test walks sixteen tiles across three boards, rebuilds each click, evaluates every filter domain and asserts the row count equals the number printed. It exists because it caught a real mismatch here.

  4. 04

    The clinical record

    Sphere, cylinder, axis and add per eye with pupillary distance, uncorrected and corrected acuity kept as text, and a pressure per eye whose stored mean ignores an eye that was never measured.

  5. 05

    Dispensing

    A prescription becomes a frame and lens specification and moves through received, checked and collected, with remakes linked to the job they replace and carrying a reason.

  6. 06

    Release records

    Off unless the company is in the United States or you flip the per-company switch. An append-only log of every prescription handed over, plus inbound seller verification on an eight-business-hour clock.

  7. 07

    The day

    Appointments run draft, confirmed, done against a named optometrist, with lane hours computed from start to end, stored and totalled in the footer. A booking with no end time reports 0.0.

What it looks like in practice

  1. A resolving corneal finding erases the grade that justified stopping lens wear

    A finding is regraded downward at each visit as it settles. On a current-state chart the earlier, worse grade is simply gone by the time anyone reviews the case.

    Every recording, regrading and clearing appends an entry, and the model refuses a direct write and an unlink. The scrubber under the chart walks the recorded moments, and while it is showing a past state the chart will not accept a new finding.

    Grade at the fit
    2.0
    Four months later
    1.0

    Figures from the module's own demo data, on a fresh install. Install with demo data, open an eye exam chart and drag the history scrubber back to the first fit.

    The eye chartThe clinical record

  2. An overdue recall is worth money nobody has counted

    Recalls sit in a list with dates on them. Nothing on that screen says what the practice loses by not making this week's calls.

    Each recall type prefills the interval and the expected value of that visit, and the at-risk tile totals due plus overdue and opens exactly those rows. The same column totals in the list footer, so the tile can be checked by eye.

    At risk on the demo book
    $1,190
    Three due
    $670
    Two overdue
    $520

    Figures from the module's own demo data, on a fresh install. Install with demo data and open the practice board; the at-risk figure is the first tile.

    The recall bookTiles and their lists

  3. An eye is charted at exactly the pressure threshold

    A tile counts raised pressures and a filter opens them. If one asks for above and the other for at or above, an eye on the boundary sits inside the list and outside the number.

    One constant carries the threshold now. The exam row decorates red from it upward, the eye joins the watch list on the board, and a test charts the boundary value itself to hold the two together.

    Watch-list threshold
    21 mmHg
    Boundary the test charts
    21.0

    A default you can change.

    The clinical recordTiles and their lists

What it deliberately does not do

No imaging of any kind
No fundus photos, no OCT, no topography, no scanned prescription. The exam model carries no image field and no attachment tab for clinical media.
Almost no billing, nothing for insurers
A dispensing job can raise a draft sales order and that is the whole of it. Nothing else is priced, invoiced or claimed, and a recall's expected value is a planning figure only.
No calendar view, and nothing stops a double booking
Appointments are a list and a form. The model carries no overlap constraint, so two bookings can sit on one lane at once and the module will let them.
The recall prices are code
The five prices live in a dictionary inside the recall model rather than on a settings screen. The interval is editable per record; the price is not.
The chart does not print yet
A patient-facing vision report that snapshots the chart as it was handed over is specified and not built. It is the next thing to land here.

Questions

Can I install this on Odoo Online?
No. Odoo Online cannot install modules that contain Python, so this runs on Odoo.sh or a self-hosted instance. Check the versions listed above for the series and edition it is verified against.
Can it invoice a sight test or submit an insurance claim?
Sales in it amounts to one thing: a dispensing job can raise a draft sales order in Odoo's own Sales app. The module writes no invoice, takes no payment and prices nothing. There is no claim form, no voucher, no procedure or diagnosis coding and no eligibility check anywhere in it.
Are the recall prices editable?
The interval is, per record. The prices are not: they live in a dictionary inside the recall model rather than on a settings screen, so a practice with different fees edits that dictionary or overrides one compute method. Choosing a type prefills the interval, and the interval stays editable afterwards.
What are the prescription release screens, and do I get them?
They stay off unless the company's country is the United States, or you turn the per-company switch on. A US practice then gets an append-only release log and an inbound seller verification queue on an eight-business-hour clock. This keeps the records the rule asks for. It is not legal advice and it does not make a practice compliant.

Have something to build?

Tell us the problem. We'll come back with a plan, a price, and who'd actually build it.

  • Free scoping call
  • Reply within 1 business day
  • No lock-in