New in 1.9

The following is a list of new features and improvements in the 1.9 release. You should also check Known Issues and the Implementation Checklist.

Major Features in this release include:



Appointment Reminders

Appointment reminders can now be sent via SMS, manually or automatically.

See Appointment Reminders for details.

Boarding Views

Four new views have been added to Workflows - Scheduling for boarding:

  • Cages - view appointment schedules by Cage Type
    Schedules can now be linked to a Cage Type, to indicate that they are used for boarding and in-hospital stay. This view groups schedules by Cage Type and displays:
  • total slots by Cage Type
  • available slots by Cage Type, by day
  • Summary - summary view
    This is similar to the Cages view, except that the appointment details are displayed as one of:
    • B - indicates that the pet is boarding, i.e. is staying overnight
    • D - indicates that the pet is in for the day only
    • > - indicates that the pet is leaving on the day
  • Check-Ins - displays all schedules that have check-ins for the selected day
  • Check-Outs - displays all schedules that have check-outs for the selected day

Boarding Invoicing

Boarding can now be automatically charged at Check-Out.

  • charges are based on the number of nights that a pet has boarded for
  • multiple pets can be housed in a single kennel/cage, charged at different rates e.g.:
    • Luxury Suite Charge - $65/day
    • Luxury Suite 2nd Pet - $30/day
  • day and overnight boarding rates are supported
  • a late checkout fee can be charged if Check-Out occurs after a certain time
  • multiple boarding pets can be checked out at once

See Cage Type for more details.

Calendar Blocking

Calendar blocking enables times on schedules to be marked as unavailable or reserved:

  • a warning is displayed if an attempt is made to schedule an appointment where there is a calendar block e.g. if the appointment is scheduled outside hours, or on a public holiday.
  • times can be reserved so that appointments can only be created for customers with specific classifications e.g. it can be used to reserve boarding cages during holidays for valued customers

See Calendar Block for more details.

Strike-through for Completed and Cancelled appointments

Completed and Cancelled appoinments can now be displayed with strike-through text. This is configured via the Schedule View.

VeNom Coding 'Reason for visit'

Appointments and Visits can now be classified using 284 Visit Reason codes specified by the VeNom Veterinary Nomenclature. This is in addition to the user-specified Visit Reason codes.

These codes need to be loaded.

Charges and Estimates

Dose Calculation

Medication products can now have doses. These are used to automatically calculate the quantity of a product during charging and estimating. Quantities calculated in this manner are highlighted in blue, until changed or the editor is closed.

Template and Product Type display

The Items tables for Invoices, Counter Sales, Credits and Estimates can now display:

  • the Template that a product came from
  • the Product Type associated with the product

By default, these columns are suppressed, but can be enabled via the Practice, or by clicking the Show Template and Show Product Type check boxes.

Charge Auto Save

Invoices, counter sales and customer credits are now automatically saved when the Add button is pressed to add a new item if:

  • the charge is valid; and
  • has been saved previously; and
  • is not Finalised

This limits data entry loss if two users happen to edit the same charge simultaneously. The second user to save will see an error message like:

Microchip Entry During Invoicing

Microchips (and Pet and Rabies Tags) can now be added to a patient when invoicing a product. This is done by configuring the appropriate Patient Identity on medication, merchandise or service products.

Minimum Quantities

A Minimum Quantities feature has been introduced. This can reduce charging errors by ensuring that a product has a minimum quantity.

When enabled, product template and estimate Low Quantities set a mininum quantity for a product. When expanding a template into an estimate or charge, the low quantity of the included product becomes the minimum quantity for an item. When invoicing an estimate, the estimate low quantities set the minimum quantities on the invoice.

  • For estimates, an item is invalid if its Low Qty is less than the minimum quantity
  • For charges, an item is invalid if its Quantity is less than the minimum quantity

If an item has a minimum quantity:

  • it cannot be swapped for another product, if it is a service
  • it can be swapped for another medication, if it is a medication
  • it can be swapped for other merchandise, if it is merchandise
  • deletion can be restricted to a specific user type

The Minimum Quantities feature is enabled via the Practice.

Out of Stock warning

An On Hand quantity is now displayed in invoices to show the stock on hand for the selected product. If a product has no stock, or the quantity exceeds the available stock, this is highlighted red.

If a template is entered that has one or more items with no stock, or where the quantities exceed the available stock, an Out of Stock warning will be displayed. 

Template Invoice and Visit Notes in Estimates

When an Estimate is invoiced via:

  • Customers - Estimates, any templates used will now have their Invoice Notes copied to the Invoice
  • the Visit editor, any templates used will now have their:
    • Invoice Notes copied to the invoice
    • Visit Notes create a corresponding Note record in the patient's history.


Customer Communications Log

Communications with customers can now be recorded, either automatically or manually. When automatic logging is enabled, the following are logged:

  • emails to the customer, or to other parties regarding the customer's pets.
  • SMS messages

This includes:

  • emails and SMS messages sent for reminders
  • SMS appointment reminders

See Customers - Communications & Alerts for more details.


Prior to OpenVPMS 1.9, new customers were given a new location and phone contact. These were saved even if no details were provided.

Now, new and existing customers will be given a location, phone and email contact when the customer is edited, if one isn't already present. If any of these contacts remain unchanged, they will not be saved when the customer is saved. 

This simplifies data entry, and means that customers are less likely to be saved with incomplete contact details.

Document Editing

OpenOffice and Microsoft Word documents can now be edited from within OpenVPMS. An External Edit button is provided to launch OpenOffice for the selected document in:

  • Customers - Documents
  • Patients - Medical Records
    • Summary
    • Problems
    • Documents
  • Suppliers - Documents
  • Administration - Templates


HTML Email

OpenVPMS can now:

  • edit and send HTML email
  • generate HTML emails from:
    • JasperReports
    • OpenOffice or Microsoft Word documents. These may contain merge fields.
    • static HTML pages

For more information, see:

Prefilled Emails

OpenVPMS can now automatically generate email content based on the type of document being sent. This is done by attaching an Email Template to a Document Template.
When content for a particular Document Template is sent (e.g an Invoice or Patient Visit), the Email Template is expanded into the email, and the content added as an attachment.


IDEXX LabLink integration

OpenVPMS can now order patient Investigations using HL7 messages. This is supported by IDEXX LabLink. See: How To - HL7 Laboratories

Investigations now have an Order Status (to track the status of the lab request) as well as a Status (to track the investigation status). See here.

Medical Record Locking

Patient medical records can now be automatically locked to prevent editing after a period of time. See Medical Record Locking for details.


  • the patient summary now includes a shortcut to add a microchip, if the patient doesn't have one.
  • product batches may now be displayed in medical records by selecting Show Batches in Preferences
  • when merging patients, if either patient is desexed or deceased, this will be refected in the merged patient

Practice Locations


A Practice Location specific logo may now be displayed at the top of the screen.

This is configured via the Practice Location.


Tax-exclusive Product Prices

Product fixed and unit prices are now stored exclusive of tax. This change:

  • simplifies product pricing - tax is automatically calculated.
  • means that no product prices need to be manually updated should tax rates change.
  • does not impact estimates and charging; the prices displayed are tax-inclusive
  • affects price import and export; the prices must be ex-tax

Note that service ratios are now applied to the tax-exclusive price; previously they were applied to the tax-inclusive price.

Product Price Rounding

Product prices can now be rounded to a minimum price. This can be used to round prices to the nearest 5 cents or dollar for example. See Pricing for more details.

Use only in Templates flag

Products now can be excluded during charging and estimating via a new Use only in Templates flag. This is designed to stop direct entry of products that should only be included in charges and estimates via a Product Template.

Any product with this flag set:

  • will be excluded from queries during charging and estimating
  • may not be entered into an invoice/estimate even if its full name is used
  • may still be selected in supplier orders and deliveries, and customer orders and returns

Use Location Products flag

Multi-location practices can now limit which products are visible to each location in charges, estimates, reminders and patient documents. See here.


Reminder Export

The Reminder Export file now includes a Practice Location column, indicating the usual practice location that the customer attends, if any.


SMS reminders can now be generated from templates containing macros or expressions. See Patient SMS Reminder Template for more details.

Smart Flow Sheet

OpenVPMS can now connect to Smart Flow Sheet. See Smart Flow Sheet integration for details.

Supplier Orders

On Hand

Supplier Order line items now include an On Hand field, to show the current stock on hand for a product.

Duplicate Order Item warning

If a supplier order contains duplicate items, a message indicating the duplicate will be displayed e.g.:

There are multiple orders for Acepromazine 10mg Injection

Template Improvements

US Letter and A5 formats

All document templates are now available in US Letter format. A5 versions are provided for everything except the reports accessed via Reporting|Reports. Support is also provided for using all A4 templates except for a limited set of A5 versions, for example invoices and receipts.

Simple Customisation

The Letterhead & Document Control facility enables the customisation of system documents (ie invoices, credits, statements etc) without the need to edit the jrxml content files. In particular, this enables new OpenVPMS users to quickly be able to generate documents customised to their practice without the necessity to either become proficient with Jaspersoft Studio or to employ an integrator to do the customisation. Existing users may also wish to switch to using the standard documents rather than their own customised versions to avoid any need to update theirs to handle new features.

Different locales (ie regions) are catered for by using report resource bundles which set things that vary by region such as the tax name and document title.


Via the Letterhead & Document Control facility, invoices can:

  • optionally be set to group products by Product Type. When using Product Types, the Product Type's 'Detail on Invoice' setting is honoured
  • have a payment instruction added
  • optionally display patient reminders and/or upcoming appointments in an efficient compact format


Via the Letterhead & Document Control facility, statements:

  • can display up to 4 different types of payment instructions (credit card, direct deposit, cheque, and other)
  • show the line item detail for invoices and credits either never, always or only if not previously printed

The statement now displays the General and Overdue messages set for the customer's Account Type.

Drug Labels

Drug label templates for the sizes below are now provided. These are designed for use with plain label stationary and include Animal Use Only/Keep out of reach of children warnings and a footer containing the location name, phone number and address. The sizes are:

  • 30258 Diskette 54x70mm   2 1/8 x 2 3/4 inch
  • 30323 Shipping 54x101mm  2 1/8 x 4 inch
  • 30326 Video Top 46x79mm   1 4/5 x 3 1/10 inch

The templates are provided in <OPENVPMS-HOME>/reports/Patient/Labels.

See also How to: Print General Labels

Date Formats

All dates are either locale sensitive, or switched to US format (ie MM/DD/YY) in the Letter template set.

Clinician Name Formatting

Title, first and last name, and qualifications fields have been added to the User record. When generating reports and documents, the user:format() function can be used to obtain a short, medium or long format name. The User Name Format facility allows various formats to be defined, and in the Practice you can set which of these is to be used for each of the short, medium and long formats.

The standard report and document templates now use this facility.

Quantity Units

The standard customer invoice, credit, counter sale and statements now use the new Printed Name field in the Unit of Measure lookup to show the units for the quantity (eg 0.25 ml).

Hidden and un-Finalised

The standard customer documents (ie invoice, credit, receipt, etc) now print with a large Cancelled watermark if the transaction has been hidden.

All documents that have not been finalised show a red Draft stamp when printed.


Appointment Transfer to Work List

A Transfer button has been added to Workflows - Scheduling to transfer a checked-in patient to a Work List.

Follow-up Tasks

A button has been added to the patient summary to quickly add a task for the current patient. The work list is selectable from follow-up work lists linked to the current clinician, user and practice location.

A Follow-Up At Check Out option can be selected to pop up a new task editor at check-out to optionally create a follow up task for the patient.

Preselect documents for printing on check-in and transfer

Schedule and Work List templates now have a Print option to pre-select a template for printing when:

  • checking in a patient to a schedule or work list
  • transferring a patient to a work list

Use this to pre-select documents that are always printed.


User Preferences

Preferences can now be set on a per-user basis, via the gear icon in the top right of the screen.

See Preferences for more details.

Document Loader

The Document Loader can now:

  • be configured to move files that fail to load to an error directory.
  • automatically rename files if a file exists in the destination directory.

Ignore List Price Decreases

The Practice now has an Ignore List Price Decreases option to skip auto-price updates if a delivery is finalised with a List Price less than the existing Product Supplier List Price.

User Interface improvements

  • most Search fields now perform contains rather than starts-with matches by default. There are a few exceptions (e.g. Customer and Patient searches), for performance reasons.
  • query filters and table page navigators are now fixed so that they no longer scroll off screen when the results matching the query don't fit on the screen
  • Alt-V can now be used on most screens as a shortcut for Print - Preview.
  • you can now tailor how referrals are displayed in the patient section of the left panel via the Show Referrals option in the practice.
  • the My Recent history is now retained between sessions, with the last 25 viewed customer/patient pairs stored.

New JXPath Extension Functions

  • Additional date functions
    • date:add(dateTime, period)
      Adds a period to a date/time. E.g.:
          date:add(openvpms:get(., "startTime"), "1w")
      adds one week to the startTime node of the supplied object.
      Use the date:format functions to format the returned date.
    • date:now() returns the current date & time
    • date:today() returns the current date with the time set to 00:00:00
    • date:yesterday() returns yesterday's date with the time set to 00:00:00
    • date:tomorrow() returns the tomorrow's date with the time set to 00:00:00

See Date Functions for more details.

  • Patient history functions:
    • history:charges(patient, date)
      Returns all invoice items for a patient for the specified date
    • history:charges(patient, from, to)
      Returns all invoice items for a patient where startTime >= from and startTime < to
    • history:charges(patient, productTypeName, from, to)
      Returns all invoice items for a patient with a product type name matching that specified, where startTime >= from and startTime < to.
      The product type name may contain wildcards
    • history:charges(patient, productTypeName, date)
      Returns all invoice items for a patient done on the specified date, with a product type name matching that specified.
      The product type name may contain wildcards
    • history:medication(patient, date)
      Returns all medication acts for a patient on the specified date, ordered on descending start time.
    • history:medication(patient, productTypeName, date)
      Returns all medication acts for a patient that have the specified product type name, on the specified date, ordered on descending start time.

      See History Functions for more details.

  • Party functions
    • party:getAppointments(party, interval, units)
      Returns the Pending appointments for a customer or patient starting from now up to the specified interval.

      See Party Functions for details.

  • Product functions:
    • product:price(product, taxExPrice)
      Returns the price for a product, given the tax-exclusive price.
      This will either be tax-inclusive or tax-exclusive, depending on the practice preference.
    • product:price(product, taxExPrice, taxInclusive)
      Returns the price for a product, given the tax-exclusive price.
    • product:taxRate(product)
      Returns the tax rate for a product, expressed as a percentage
    • product:round(price)
      Rounds a price according to the practice currency rounding conventions

      See Product Functions for details.

  • Reminder functions:
    • reminder:getReminders(patient, date)
      Returns all reminders for a patient starting on a date.
    • reminder:getReminders(patient, from, to)
      Returns all reminders for a patient starting between the from and to dates.
    • reminder:getReminders(patient, productTypeName, date)
      Returns all reminders for a patient starting on a date having a product with the specified product type. The product type can contain wildcards.
    • reminder:getReminders(patient, productTypeName, from, to)
      Returns all reminders for a patient starting between the from and to dates having a product with the specified product type. The product type can contain wildcards.

      See Reminder Functions for more details.

  • Appointment function:
    • party:getAppointments(party, interval, units)
      Returns the Pending appointments for a customer or patient starting from now to the specified interval.

      See here for more details.

Performance Improvements

The implementation of OVPMS-1567, OVPMS-1570OVPMS-1569 improves memory use and performance during charging, estimating, and ordering but requires changes in SQL based reports that previously referenced the archetypes:

  • entityRelationship.productStockLocation
  • entityRelationship.productTypeProduct
  • entityRelationship.productSupplier

If you are upgrading, the following standard reports need to be reloaded:

  • Customer Product Sales Report.jrxml
  • Export Customer Addresses for Sales.jrxml
  • Export Customer Email Addresses for Sales.jrxml
  • Practice Summary_ProdSalesLocation.jrxml
  • Practice Summary_ProdSalesType.jrxml
  • Product List Report.jrxml
  • Product Price List Report.jrxml
  • Stock Movement Report.jrxml
  • Stock Reorder Report
  • Stock Valuation Report.jrxml
  • Stocktake Export Report.jrxml
  • Stocktake List Report.jrxml
  • Stock Valuation Report


See the Implementation Checklist for assistance in identifying any custom reports that you have that will require modification.


Syndicate content