This section contains sections describing how to do various things.
Note that 'Administering OpenVPMS' covers topics such as Backup that are not accomplished with the OpenVPMS web application.
This section includes things that are not done using the OpenVPMS web application.
This section covers how to backup your OpenVPMS system - both what to backup and how to.
In the following it is assumed that you are running OpenVPMS on a Windows system. If you are using a linux system, then you should be able to do the appropriate folder name conversions.
Note also that you really should practice disaster recovery, ie assume that your system was lost or destroyed and that you have to start from scratch with a new computer. That is, your backups are only any good if they can be restored. Backups should be periodically tested or restored to a backup server as part of your backup process. If you don't have a 'backup server', at least get your hands on a system that you can install OpenVPMS on and check that you can restore your database.
The MySQL database itself. OpenVPMS keeps everything in the database including the report and document templates and all patient and customer documents, attachments and images. So backing up the openvpms database itself secures most of what you will need to recover in the event of a disaster. Note that MySQL will normally have two other databases (or 'schemas'), mysql and performance_schema. You don't need to backup these.
Other files. Apart from the database itself, you should backup:
It is also wise to occasionally make a 'system image' that you can restore the system disk from in the event of a disk failure (otherwise you are going to have to reinstall all your software). In Windows 7 this can be done via Control Program|Backup and Restore, in Windows 8 via Control Program|File History and in Windows 10 via Settings|Update & Security|Backup.
Essentially this is governed by the amount of data you can afford to lose and have to re-enter. If you do a daily backup at 6pm each business day, and the system fails at 2pm, then you will have to re-enter everything that happened after 6pm the previous day. Hence a weekly backup is probably not a viable option.
Essentially you need to take a copy and put it somewhere else, where 'somewhere else' means, at a minimum, an external disk or storage device. You should also strongly consider having a copy held off-site so that you can cope with your building being destroyed or all your computer equipment being stolen.
Although USB memory sticks are now available with large capacities, and are wonderful for transferring files, they are not reliable enough to use as backup storage. Use a USB hard drive or NAS (Network Attached Storage) device instead.
Backing up to 'the cloud' is a possibility, but most sites do not have sufficient upload bandwidth to make this a viable solution.
So how to backup MySQL. There are at least three ways to do this: mysqldump, raw file copy, and database replication.
mysqldump
The mysqldump command line utility has lots of options, but for our purposes it is invoked as follows:
mysqldump -u <username> --password=<password> --single-transaction --quick --extended-insert --add-locks --result-file=<dumpfile> openvpms
where both <username> and <password> will be 'openvpms' unless you have set these differently in your system, and <dumpfile> is where you want the data to go, eg E:\backups\opvdump.sql
The single-transaction option allows for the fact that someone may be using the system entering data - and as this implies you do not have to shut down Tomcat to prevent people using the system while mysql dump runs. You certainly do not want to shutdown mysql itself - it has to be running for mysqldump to work.
The quick option functionally decreases the impact of running mysqldump so that it minimises the impact on normal users (otherwise they will notice a slow down in the system response).
The extended-insert and add-locks options make the restore process more efficient.
In the windows environment, especially with a large database, it is more efficient to use the results-file argument as above rather than piping the output, eg as follows but in the unix environment piping is just as efficient.
mysqldump -u <username> --password=<password> ... openvpms > E:\backups\opvdump.sql
You will see examples on the web of compressing the .sql file to save space. This is normally not worthwhile with OpenVPMS databases because typically such a large part of the data is uncompressible jpeg images.
To restore the database, you use the mysql command line utility as follows:
mysql -u <username> -p openvpms < <dumpfile>
Note that MySQL dumps can be large - see also 'File Sizes' below. Compression can achieve some space saving at the cost of the extra time required to do the compression. Linux users will be familiar with the process or piping the output of one program into another, and thus on a linux system one can do:
On Windows systems the same can be done using the 7-Zip compression utility (see http://www.7-zip.org) as follows:
However, because a typical OpenVPMS database contains a large number of uncompressable images (from x-rays and ultra-sounds), the saving is space is normally only about 25%.
raw file copy
If you want to minimise the database restore time, then you can simply copy the MySQL database files to another device. In MySQL terminology, this is called a 'cold backup' - see http://dev.mysql.com/doc/refman/5.5/en/innodb-backup.html. To do this you need to shut down MySQL before you copy the files, and you have to copy nearly everything in the MySQL data folder. Specifically you need to copy the ibdata files and each of the sub-folders, ie mysql, performance_schema, and openvpms. You do not need to copy ib_logfile1 and ib_logfile2.
In the windows environment, the best copy program to use is robocopy.
Note that when do the recovery (by copying the files back) you MUST still be using the same version of MySQL, and you may need to be wary about the log files. If you have not been backing these up, then when you copy the other files back you must ensure that any old log files are deleted
database replication
If you have a large busy practice, you should consider using MySQL's ability to replicate the database on another machine. There is a slave database on the other machine, and updates to the master database are continuously copied to the slave. When a disaster occurs, it is quite easy and very quick to switch operations to the backup machine which was running the slave database which now becomes the master.
See http://dev.mysql.com/doc/refman/5.1/en/replication-howto.html
other information
For more information on backing up and restoring MySQL databases, see:
The size of an OpenVPMS database depends mainly on two things, the number of transactions recorded, and the number (and size) of the stored documents. The following data is taken from a reasonably sized business. ('participations' counts the number of links between data.)
Item | Size (GB) | Count | Time (min) |
---|---|---|---|
MySQL Database | 20.4 | 12 | |
documents.ibd file | 11.2 | 48,500 | |
participations.ibd file | 5.6 | 13,500,000 | |
mysql dump | 15.5 | 20 | |
compressed mysql dump | 11.8 | 35 |
As you can see, the documents and participations files make up some 80% of the total database size. The Time column shows the time required for the raw file copy, and the uncompressed and compressed mysql dumps. In all cases the data is moved to a NAS unit via a 1gigabit network connection. Note that although compression gives a space saving of 24%, it increases the time required by 175%. The relatively small space saving is due to the fact that many of the documents are jpeg images and thus uncompressible.
Apart from backing up, it is possible to decrease the probability of failure by providing some redundancy in the system. There are two things to consider, RAID and server class systems.
RAID (Redundant Array of Inexpensive Disks) - see http://en.wikipedia.org/wiki/RAID - provides a storage system that is resilient to failure. These can be configured as a simple 2 disk mirror RAID-1 setup where data is written to both drives, and the system will continue to operate when one fails. At the other end of the scale there are multi-disk RAID-5 and -6 systems with hot stand-by drives.
Server class hardware There is a very real difference between a standard desktop machine and a server class system (apart from the price and weight). Server machines typically offer a remote access console (so you can power on the system from afar), large fast storage systems, and dual power supplies.
Even if you don't use a server class machine, you should consider the use of enterprise rather than consumer class disk drives.
Second system The simplest approach to hardware redundancy is simply to have a second system that is a exact duplicate. You can use this system for other non-critical things (perhaps as a spare worstation). You can then make an image backup of the primary system. When it fails, you disconnect the primary system from the network (in case it is still partially alive), restore the image backup to the backup system, and then restore your last database backup. You may also need to unplug any printers from the failed system and plug them into the backup system. Your users can then resume work - but they will have to re-key transactions since the last backup.
Note we need the backup machine to be an exact duplicate so that the image backup from the primary system can be restored and run without any changes.
Backups are all very well, but sometimes you have a catastrophic hard drive failure or software failure and it can be easier to restore a system image.
A system image will take a complete snapshot of your PC's hard drive which you can use to restore your system with all its software, settings and data intact.
I also create a system image before I upgrade my server so that if it "all goes to hell in a hand basket" I can restore the system to its previous (bungled-free) state rather than spend hours trying to work out where I went wrong (and risk incurring the wrath of my staff if the server's not up and running when the clinic opens ).
Click Start | Settings (gear wheel) | Update & Security:
Click Backup, then click on "Go to Windows 7 Backup and Restore (don't worry, this works perfectly well under Windows 7, 8 and 10 - I've used it very often! unfortunately):
Click on Create a system image:
Windows will search for an usable hard drive, either a separate internal hard drive (but not the disk containing C:drive) or any attached external hard drive: I usually use an external USB3 WD Passport drive.
You can use a DVD-RW (but be mindful that DVDs only have a capacity of 4.7GB (or 8.2GB if you're using double-sided DVDs). Be aware you may not be able to access the ontents of an internal hard drive if you've had a serious HD failure.
If you have more than one external drive available and attached, click on the down arrow to reveal the other drives. Windows seems to pick the most suitable (and external) hard drive.
Click Next:
Windows is pretty good at picking what you'll need on your system image - generally just your C drive and its associated recovery partition and System Reserved partition.
Click Next:
Confirm the list of drives to be included in the system image and click Start Backup:
Windows will create a system image:
When it's finished, you'll be given the option to create a system repair disk: you'll need a DVD-R (and a DVD drive (of course): this can be useful if you can no longer boot your computer from its internal hard drive.
If you've already created a disk previously, click No, then Close and you're done.
If you want to create a bootable repair disc, click Yes:
Windows will find your DVD drive and prompt you to insert a blank DVD: clcik Create disc to commence:
Remove the completed disk and click Close then Ok.
The image will be in the root folder of your external hard drive and is contained in a folder named WindowsImageBackup. You may want to rename it to something such as WindowsImageBackup_XPS13_2021_11_21 because performing a subsequent backup may overwrite an existing one.
When it comes time to restore your system image, you will need to rename the required image to plain ordinary WindowsImageBackup because Windows Restore will not recognise any other name.
This section deals with various housekeeping activities.
The openvpms log files (in <TOMCAT-HOME>/logs) are kept under control by the settings in <TOMCAT-HOME>/webapps/openvpms/WEB-INF/classes/log4j.properties file. The standard setup is to 'rotate' these when they get to 1024KB and keep only 1 backup. Thus in a mature system you will see an openvpms.log.1 of size 1MB and a smaller openvpms.log (and similarly for the openvpms-full.log).
You can keep more data by increasing the log4j.appender.fileout.MaxBackupIndex parameter from 1 to something greater.
Note that the openvpms.log and openvps-full.log backups are not in sync (ie openvpms-full.log.1 does not contain the full data for the events in openvpms.log.1). This is because the full log grows significantly faster than the standard log.
If you wish to keep older synchronised versions then you need to implement a system for renaming the log files on a regular basis before they grow to 1MB in size. In unix systems this can be done using the logrotate facility. In windows systems you can have a bat file containing commands like the following and run it via the task scheduler.
set DSTAMP=%date:~6,4%-%date:~3,2%-%date:~0,2%
net stop "Apache Tomcat 6.0 Tomcat6"
net stop "MySQL55"
sleep 10
ren C:\openvpms\data\mysql-slow.log %DSTAMP%-mysql-slow.log
ren C:\openvpms\data\mysql-slow.log %DSTAMP%-mysql-error.log
ren "C:\Program Files\Apache Software Foundation\Tomcat 6.0\logs\openvpms.log" %DSTAMP%-openvpms.log
ren "C:\Program Files\Apache Software Foundation\Tomcat 6.0\logs\openvpms-full.log" %DSTAMP%-openvpms-full.log
..... other stuff to backup database etc
net start "MySQL55"
net start "Apache Tomcat 6.0 Tomcat6"
exit
The document loader destination directory receives the files that have been loaded. Since the documents are now in the database, these files can either be deleted or archived elsewhere.
Note that regularly sweeping this directory allows the document loader to load updated copies of documents when the overwrite option is set. Otherwise if the document 3214567_xray.jpg was previously loaded, then when an attempt is made to load an updated copy, this will fail because the file 3214567_xray.jpg is already present in the destination directory.
Ok, so you need to restore a system image. I usually perform a System Image every month or so and certainly after any app change to my server. As I take openVPMS backups daily, I can restore a crashed server with a combination of System Restore to get back to within 30 days, followed by the most recent MySQL OpenVPMS backup restore.
Remember:
Click Start | Settings (gear wheel) | Update & Security.
Click Recovery, then click Restart Now in theAdvanced Startup section.
The Advanced Startup screen will appear.
Click on Troubleshoot.
Click on Advanced Options
Click on System Image Recovery
The PC will ask you to log in with your account and password. Provide the Windows account credentials and click "Continue".
The PC will now fully reboot and restart.
It will scan for a system image backup on your external hard drives.
If it can't find a suitable image, you will be warned. Generally it means you haven't correctly renamed the image file to WindowsImageBackup.
When it finds an image, it presents the details as to date and location on your PC. If you have more than one image on separate external drives, it will generally default to the most recent image. Note that the time zone and time of creating the system image may have been set to Microsoft's home state of Seattle, Washington (!) - add 18 hours for Au EST or 19 hours for AU EDST. One another of my systems, the time zone is set to GMT (GMT-00:00) - add 10 hours for Au EST or 11 hours for AU EDST. Confirm that this is the system image toy wish to restore.
Click Next
Click Next
Click Yes
Confirm restoration of image. Click Yes.
The restore starts. You can stop the restore if you wish but do not turn off the PC while the restore is underway.
When the restore has completed, the system will reboot.
You have now reverted your system (apps, data, everything) completely to the configuration at the time of taking the image.
HTH.
OpenVPMS can send SMS reminders for unpaid invoices and counter sales.
For example, if an invoice is still unpaid 4 weeks after it was finalised, an SMS reminder can be sent out with the text:
Reminder: your invoice from Vets R Us on Tuesday 24/08/21 has an outstanding balance of $100.25. Contact us on (03) 12345678 if you have any issues. Please ignore this if you have recently made a payment.
This is fully configurable.
To do this:
1. The Practice must have SMS configured
2. Invoices and Counter Sales must have their Send Reminder flag ticked.
This is enabled by default for new charges; historical charges must have this flag selected manually using the Enable Reminders button in Customers - Charges and Customers - Account
3. Customers must be able to receive SMS messages
This is done by selecting Allow SMS on their phone contact. If the customer has multiple phone contacts with Allow SMS set, then the preferred one will be used, and if none are preferred, then the first one created.
4. The Account Reminder Sender must be configured.
This automatically sends account reminders.
Reminders can be monitored in Reporting - Debtors - Reminders.
OpenVPMS can send SMS reminders for upcoming appointments, automatically or manually.
To do this:
1. The Practice must have a Mail Server configured
The SMS gateways supported by OpenVPMS use email, so a Mail Server must be configured on the Practice.
2. The Practice must have SMS configured
3. An Appointment Reminder SMS Template must be configured
Reminder templates can be linked to the Practice and/or Practice Location. If a template is linked to a Practice Location, it will be used in preference to any linked to the Practice.
4. Schedules must be configured to send appointment reminders
This is done be selecting the Send Appointment Reminders flags for each Schedule that may send appointment reminders
5. Appointment Types must be configured to send appointment reminders
This is done be selecting the Send Appointment Reminders flags for each Appointment Type that may send appointment reminders
6. Customers must be able to receive SMS messages
This is done by selecting Allow SMS on their phone contact. If the customer has multiple phone contacts with Allow SMS set, then the preferred one will be used, and if none are preferred, then the first one created.
7. The Appointment Reminder Sender can be configured
This is required to send reminders automatically.
If you do not configure this (or create the sender job, but deactivate it) then appointment reminders will not be sent automatically, but can still be sent manually via the Remind button in Workflow - Scheduling. Doing things this way allows you the convenience of automatically generating the SMS text, but because the text is generated and then displayed, and allows you to personalise the reminder if required. The date and time of sending the reminder will also be recorded against the appointment.
8. The Appointment itself must have its 'Send Reminder' box ticked
This will be automatically ticked for new appointments provided that the previous conditions are satisfied. However, if you have appointments created before the Appointment Reminders system was activated, then in order to enable the automatic sending of reminders for these, you will have to edit each appointment to tick the 'Send Reminder' box.
If you have a situation is which a patient was mistakenly added to the wrong customer some time ago and you need to currect the situation and keep the patient's medical history but move all financial transations involving the patient to the correct owner, then do as follows:
1. Reverse any transactions on the OLD Customer that involved the patient to be transferred....even if they included another pet from that customer's file.
2. Reverse any payments associated with those invoices. If payments cannot be reversed that match the invoice total - create a REFUND of the correct payment type.
3. At this point the OLD customer balance should be the same before you started.
4. Transfer the Patient to the NEW(Correct) Customer.
5. At this point you have the history, patient and customer correct - you just need to fix the transaction history.
6. If invoices that you reversed contained transactions that were still relevant to the OLD Customer, recreate these invoices and pay them using the same payment type you reversed.
7. In the new Customer recreate the relevant invoice items you reversed from the old customer and pay them using the same payment method you either created the refund for OR reversed in step 2. Adjust line item costs to be the same (if prices have risen).
8. Make notes on each new invoice about the actual date the transaction took place on - do the same for payments.
9. At this point both client Balances would be in theory either zero or reflect the balance before you started the process.
10. Run a balance check over each customer.
11. The TILL for this day will have a lot of transactions that don't really exist - but the reversals and payments should balance each other out, so the nett effect on the daily total should be zero.
OpenVPMS supports integrating Workflow - Rostering with Deputy:
This requires:
Deputy accounts can be obtained at https://www.deputy.com.
This includes free trial accounts.
See How To - Rostering.
In order for OpenVPMS to connect to Deputy, a Permanent Token must be generated.
There is an animated GIF showing this under the Permanent Token section of Deputy's API Authentication page.
Access Token is 9878a0425d4b6287131501751a407e19. This is a long life token that will last 10 years.
To install the Deputy plugin:
To configure the Deputy plugin:
The following are tips and tricks to make Email Templates that generate impressive looking emails using Open Office.
Set the Content Type to Document, and if possible use an Open Office document for the Content. Avoid RTF and HTML content as these do not allow merging, and use Jasper Report (jrxml) content only if you need Jasper Reports abilities to run sub-reports. Avoid Microsoft Office content if possible, because although it does allow merging, it does not provide some of the Open Office facilities (such as conditional content).
When preparing the Open Office document, you need to be careful when you insert images. You cannot simply inset the image, and you MUST use an image that resides on a publicly accessible website (so that the person who receives the email can access the images), and you MUST link to the image.
Thus, you insert the image, use Insert|Picture|From File... and enter the URL of the image, and ensure that the Link box is ticked - as follows:
Note that the easiest way of getting the image's URL is to open the web page where it is displayed and then right click on the image, then:
In Firefox, use Copy Image Location
In Chrome, use Copy Image Address
Having inserted your image, if you want to centre or right-align it then you must do as follows:
First right-click on the image and select Anchor|As Character:
Click just after the image - by default it is left aligned:
To centre or right-align, click the appropriate icon.
Finally, in normal use, it is quite common to use empty paragraphs to space between items (as has been done above). However, you will find that doing this leads to big gaps in the email text. Just letting the paragraphs follow one after the other provides perfectly adequate spacing.
Hence, with an invoice cover-note like the following:
the generated email looks like:
Using spaces for spacing
If you have not played with HTML, you may not realise that if text in HTML documents contains multiple consecutive spaces, then these are replaced by a single space. More strictly, multiple whitespace characters are replaced by a single space. Hence if you wish to space say two graphics apart by 3 spaces, then you cannot use space characters - instead you must use 'non-breaking space' characters. In Open Office Writer and Microsoft Word you inject these using Ctrl-Shift-Space on a Windows machine or Option-Space on a Mac).
No gaps between paragraphs
The paragraph spacing used in Open Office Writer will be ignored. Hence if your text in Writer looks like:
then the email text will look like:
To bring the lines together, use 'New Lines' (Ctrl-Shift-Enter) instead, so that in Writer you have:
then the email text will look like:
Wrong font
There is a bug in Open Office 4.1.2 that results in a user field at the beginning of a paragraph being given no font specification and thus shows up as (the default) Times.
That is, if in Writer you have:
then the email text will look like:
Looking closely you will see that although the 'Regards' has font Arial, that for Dr Crossling has font Times.
If you change the paragraph mark after the Regards, to a new line, ie like:
then the email text will look like:
The following are tips and tricks to make Email Templates that generate impressive looking emails using Jaspersoft Studio.
Studio is designed to generate pixel-accurate documents. This works well when generating PDF format output, but for HTML format output one needs top take into account the fact that HTML is designed to handle different screen formats.
In order to make a best effort at generating HTML output that is pixel-acurate, Studio generates the HTML using tables to position items.
To quote https://community.jaspersoft.com/wiki/making-html-xls-or-csv-friendly-re..., the guidelines are:
To do that, you have to make sure you align your report elements as often as you can, both on the horizontal and the vertical axis and that you eliminate the space between elements.
Inefficient Layout:
Grid friendly layout:
Avoiding overlapping report elements.
Make sure report element will not overlap when the report will be generated. This is because if you have two elements that share some region, it will be impossible for them to share the same cell in the resulting grid structure. You might obtain some unexpected results if elements overlap.
Give up using page headers and page footers.
Especially when you want to obtain documents in which the page breaks are not relevant (CSV for example), make sure that you suppress the page header and page footer sections in your report design. You could also minimize the top and bottom margins for your report, so that when exported to HTML, XLS or CSV, your documents will be made of a single chunk, without page separators.
We also want the email to look good in the email clients that are commonly used. It is suggested that you test with Microsoft Outlook, Gmail using a browser on a workstation or laptop, and Gmail on a smartphone.
To achieve this:
Image guidlines:
This page describes how to configure OpenVPMS to interface with an HL7 laboratory such as IDEXX LabLink. For an overview of HL7 in OpenVPMS, see Concepts - HL7.
To configure OpenVPMS to interface with an HL7 laboratory the following steps must be performed:
1. Configure an HL7 MLLP Sender, to send HL7 messages to the laboratory
2. Configure an HL7 MLLP Receiver, to receive HL7 messages from the laboratory
3. Configure an HL7 Laboratory with the Receiver and Sender
4. Configure an HL7 Laboratory Group (optional)
5. Configure investigations to be ordered via the Laboratory/Laboratory Group
The HL7 MLLP Sender is used to send orders, and patient admission and discharge messages to the laboratory. It is configured via the Aministration - HL7 - Connectors page.
Select New - HL7 MLLP Sender and enter the laboratory connection information as per your laboratory provider's instructions.
The HL7 MLLP Receiver is used to receive order cancellation messages from the laboratory. It is configured via the Aministration - HL7 - Connectors page.
Select New - HL7 MLLP Receiver and enter the laboratory information as per your laboratory provider's instructions.
Note that Port is a TCP/IP port that OpenVPMS listens on. It must be accessible to the laboratory through any firewall. Appropriate security precautions should be taken to avoid other parties from accessing the port.
The HL7 Laboratory is used to specify a pharmacy to send pharmacy orders to, and receive dispense messages from. It is configured via the Administration - HL7 - Services page.
Select New - HL7 Laboratory and enter the:
An HL7 Laboratory Group is used to group laboratories by Practice Location.
It is only required for multi-location practices that use different laboratories for each practice location.
It is configured via the Administration - HL7 - Services page.
Select New - HL7 Laboratory Group and enter the HL7 Laboratory or Laboratories configured in step 3.
To configure investigations to be ordered by a Laboratory/Laboratory Group, edit the Investigation Types and set the appropriate Universal Service Identifier and Laboratory.
The simplest way to test the connection between OpenVPMS and the laboratory provider is to admit a patient. This will send an HL7 ADT A01 message via the Order Connector to the laboratory.
Its progress can be viewed on the OpenVPMS side by going to Administration - HL7 - Connectors, selecting the appropriate HL7 MLLP Sender, and clicking Messages.
To test the connection from the laboratory to OpenVPMS, charge an investigation, and then cancel the corresponding order at the laboratory. A corresponding:
This page describes how to configure OpenVPMS to interface with an HL7 pharmacy such as Cubex. For an overview of HL7 in OpenVPMS, see Concepts - HL7.
To configure OpenVPMS to interface with an HL7 pharmacy the following steps must be performed:
1. Configure an HL7 MLLP Sender, to send HL7 messages to the pharmacy
2. Configure an HL7 MLLP Receiver, to receive HL7 messages from the pharmacy
3. Configure an HL7 Pharmacy with the Receiver and Sender
4. Configure an HL7 Pharmacy Group (optional)
5. Configure products to be dispensed via the Pharmacy/Pharmacy Group
The HL7 MLLP Sender is used to send pharmacy orders, and patient admission and discharge messages to the pharmacy. It is configured via the Aministration - HL7 - Connectors page.
Select New - HL7 MLLP Sender and enter the pharmacy connection information as per your pharmacy provider's instructions.
The HL7 MLLP Receiver is used to receive pharmacy dispense messages from the pharmacy. It is configured via the Aministration - HL7 - Connectors page.
Select New - HL7 MLLP Receiver and enter the pharmacy information as per your pharmacy provider's instructions.
Note that Port is a TCP/IP port that OpenVPMS listens on. It must be accessible to the pharmacy through any firewall. Appropriate security precautions should be taken to avoid other parties from accessing the port.
The HL7 Pharmacy is used to specify a pharmacy to send pharmacy orders to, and receive dispense messages from. It is configured via the Administration - HL7 - Services page.
Select New - HL7 Pharmacy and enter the:
An HL7 Pharmacy Group is used to group pharmacies by Practice Location.
It is only required for multi-location practices that use different pharmacies for each practice location.
It is configured via the Administration - HL7 - Services page.
Select New - HL7 Pharmacy Group and enter the HL7 Pharmacy or Pharmacies configured in step 3.
To configure products to be dispensed by a Pharmacy/Pharmacy Group, set the Pharmacy on the appropriate Medication or Merchandise product, or the Product Type.
For large numbers of products, specifying the Pharmacy on the Product Type is the preferred approach, although all products with the Product Type must be dispensed this way.
The simplest way to test the connection between OpenVPMS and the pharmacy provider is to admit a patient. This will send an HL7 ADT A01 message via the Order Connector to the pharmacy.
Its progress can be viewed on the OpenVPMS side by going to Aministration - HL7 - Connectors, selecting the appropriate HL7 MLLP Sender, and clicking Messages.
To test the connection from the pharmacy to OpenVPMS, dispense a product. A corresponding:
The following instructions can be used to configure a Mail Server that connects to Gmail using OAuth2.
These instructions apply to the Email Document Loader Job as well, although the ports will be different.
Enter the following details:
Name | Gmail |
Description | Account settings for Gmail |
Host | smtp.gmail.com |
Port | 587 |
Timeout | 120 |
Connection Security | STARTTLS |
Authentication Method | OAuth2 - Gmail |
The first time this is done, a New OAuth2 Client Registration window will be displayed.
This prompts for the following details:
These are obtained in the following steps. Note the Redirect URI.
ix. On completion, Your non-sensitive scopes should display:
while Your restricted scopes should display:
iv. Click SAVE AND CONTINUE
i. Under APIs & Services, select Credentials
ii. Click CREATE CREDENTIALS
iii. Click OAuth client ID
iv. Under Create OAuth client ID, enter
A popup will display, containing the Client ID and Client Secret:
Click OK. This should automatically start the Authorise flow. A new browser will be displayed.
After logging in, follow the prompts, and select 'Read, compose, send and permantly delete all your mail from Gmail'
Click Continue.
In the Mail Server window, click Check Authorisation.
If successful, the Gmail account will appear in the Username field. Click OK.
Authorisation will fail if details haven't been entered correctly. Google error messages can be range from the helpful "Access blocked: authorisation error. The OAuth client was deleted" (indicating that a OAuth 2.0 Client IDs has been deleted in the Google console), to the not so helpful "Sorry, something went wrong there. Try again".
If authorisation fails, ensure that the:
1. The Client Id and Client Secret from step 7 v. have been correctly entered in the OAuth2 Client Registration window in step 8.
2. Authorized redirect URI in step 7 iv matches that shown in step 8.
3. Scopes match those in step 5 ix.
If the above all match, try performing authorisation in a different browser. The "Sorry, something went wrong there. Try again" error has been seen in Firefox (117.0), but was resolved by using Google Chrome (116.0).
The following instructions can be used to configure a Mail Server that connects to Microsoft Outlook using OAuth2.
These instructions apply to the Email Document Loader Job as well, although the ports will be different.
Enter the following details:
Name | Microsoft Outlook |
Description | Account settings for Microsoft Outlook |
Host | smtp.office365.com |
Port | 587 |
Timeout | 120 |
Connection Security | STARTTLS |
Authentication Method | OAuth2 - Outlook |
The first time this is done, a New OAuth2 Client Registration window will be displayed.
This prompts for the following details:
These are obtained in the following steps. Note the Redirect URI.
Select Manage Azure Active Directory
This displays a Register an application page.
Enter:
This displays an Overview page.
The Application (client) ID is copied into the Client Id field in step 3
The Directory (tenant) ID is copied into the Tenant Id field 3
This displays a popup. Enter:
This displays the new secret. The Value field must be copied to the Client Secret field in step 3.
This displays a Request API permissions popup.
Select Microsoft Graph.
Then select the permissions:
Click Add permissions.
On completion, API permissions should look as follows:
Back in the OAuth2 Client Registration editor, enter the Tenant Id, Client Id and Client Secret.
Click OK. This should automatically start the Authorise flow. A new browser will be displayed.
After logging in, follow the prompts:
If successful, the Outlook account will appear in the Username field.
Click OK.
OpenVPMS can accept online bookings from external providers, such as MyHealth1st's PetYeti Find A Vet portal.
To enable support for online booking, the following are required:
Online booking appointments will appear in the Scheduling display with a computer icon. In the Appointment editor, the Online Booking flag will be ticked.
If the customer is new or unrecognised, the appointment will display:
No Customer
The customer details will be displayed in the Booking Notes when editing the appointment.
Check-In may not be performed on the appointment until a customer is entered.
If the patient is new or unrecognised, its name will appear in the Booking Notes.
There are a number of security considerations to be aware of:
OpenVPMS can submit online orders for patient Investigations, and automatically have the results attached and displayed in patient history.
To do this:
Plugin support is provided in Administration - System - Plugins.
See the corresponding help for instructions on enabling plugins.
The IDEXX VetConnect plugin is a file with a .jar extension provided by IDEXX, and will be named something like vetconnect-openvpms-plugin-2.2.jar.
To install it:
The IDEXX VetConnect PLUS plugin needs to be configured to enter the user name and password to connect to IDEXX VetConnect PLUS.
To configure it for the first time:
With the IDEXX VetConnect PLUS laboratory created in step 3 selected, click the Synchronise Data button.
This will create Investigation Types, Laboratory Devices and Laboratory Tests for use with IDEXX VetConnect PLUS.
Two Investigation Types will be created:
All IDEXX VetConnect PLUS test will be linked to one of these two Investigation Types.
Practices with multiple Practice Locations should limit which Practice Locations can use which Laboratory Devices.
To do this:
Tests are ordered by attaching them to products. When the product is charged, the associated tests will be used to create an Investigation which will be submitted to IDEXX VetConnect PLUS.
The results will be automatically attached to the investigation as they become available.
To attach tests to a product:
OpenVPMS can submit insurance claims to insurers managed by PetSure VetHub.
To do this:
Plugin support is provided in Administration - System - Plugins.
See the corresponding help for instructions on enabling plugins.
The PetSure VetHub plugin is a file with a .jar extension provided by PetSure, and will be named something like vethub-openvpms-plugin-2.0.jar.
To install it:
The PetSure VetHub Insurance Service needs to be configured to enter the user name and password to connect to VetHub.
To configure it for the first time:
The Synchronise Insurers button makes all insurers supported by PetSure VetHub available for use in OpenVPMS.
It:
Only insurers that have been added via Synchronise Insurers can be used to submit claims to PetSure VetHub.
New insurance policies can be created via Patient - Medical Records - Insurance by clicking the New Policy button.
This will display a New Insurance Policy window.
In order for claims to be made via PetSure VetHub, the Insurer must be one of the insurers added via Synchronise Insurers.
New insurance policies can be created via Patient - Medical Records - Insurance by clicking the Claim button.
This will display a New Insurance Claim window.
Once the claim is filled out, click the Submit button to submit it to PetSure VetHub.
This will display a declaration an Accept and Decline option. For the claim to be submitted, click Accept.
This page covers how to run the Supplier's side of OpenVPMS - ie how to generate orders and receive deliveries.
Note that the ESCI system is not covered here.
The first thing to do is to ensure that you have things set up so that ordering system will work. ie
The basic flow is:
Note that when you press the Finalise button you are finalising THIS delivery - you are not necessarily indicating that the complete order has all been delivered - just the stuff that arrived today. The act of finalising the delivery updates the stock and and if you have Auto-Price update set, then the cost price (and hence your sell price) will be automatically updated.
If this was a part delivery, when more stuff arrives, create the delivery, edit if required, and finalise this delivery.
If you receive less than you ordered, and you know that there will be no more deliveries, then you need to edit the order (not the delivery) to indicate this. There are two ways to do this: either you can change the order's status to Cancelled, or (more correctly), for those line items that short-shipped, set the Quantity Cancelled equal to (Quantity Ordered - Quantity Received). In this second case, the order's delivery status will change to Full when all the line items have (Ordered - Received - Cancelled) less than or equal to zero.
We have now done all that is really required. However, if you want OpenVPMS to track the supplier financials, then you need to generate the supplier invoices and enter the payments. Note that you do not need to do this, and many practices use their accounting system to handle the supplier finances.
Invoices and payments are handled as follows:
Given the above flow, when the system is running happily, you use the Generate Orders button on the Suppliers|Orders screen to generate the order (s). See the above link for the algorithm used.
In a startup situation, you will have orders outstanding that the system does not know about. You could use Suppliers|Orders|New to enter the order. However, this is not mandatory - you can simply create the delivery records as the stuff is delivered. Note that because you have not entered the order, when you press New on the Suppliers|Deliveries screen, the system will not find any orders to be delivered. Just OK this and it will generate an empty delivery record for you and you can manually add it all the line items that have been delivered. Finalising this delivery will cause the stock to be updated.
If you do an OTC sale to an anonymous customer, and then they return the goods and you want to do a refund, the procedure is as follows:
Now do the physical reversal - ie put the item(s) back on the shelf, and give the customer back their money.
Note that the refund created by reversing the payment will have the same payment type as the original payment, and you will need to do the refund the same way.
Thus, if they paid by credit card, you will need to do a credit on their credit card. You should NOT just give them money from the till.
The fastest way to add a new customer and their patient(s) is to do as follows:
1. On Customers|Information screen, click New then fill in the name etc, and then press the Add button on the Patient tab, and then the binoculars after the Patient name slot - ie as follows:
Having pressed the Patient binoculars, you will get:
Press the New button, and fill in the patient details so it looks like the following (note the use of the relative date facility to quickly set the Date of Birth and hence Age):
And then press the OK button, which will bring you back to the new customer screen as follows:
If you want you can set the ownership date to the real ownership start date (ie ask Mr Smith when he acquired Rover) but it’s not necessary.
If there are more patients, press Apply to save what you have entered, and then click the Patient Add button to add the next patient.
Having added the patients, you can now click the Contacts tab so that you can add Mr Smith’s contact details.
Finally, press the OK button and you have a new customer with their patient(s).
If you have already found your customer, then you can either select the patient from the Customers|Information screen, or you can click Patients in the top menu and use the Select button (useful if the customer is a boarding kennel and has 300 patients recorded).
If you are looking for a patient and have not already found the customer, then Patients|Information|Select may be used.
As shown below, if you omit any customer information, but provide some or all of the patient name, you will be shown all the matching patients, irrespective of owner.
The standard drug label templates include a facility to generate a general purpose label. A general purpose label will be printed for any medication product with the Printe Name set to "LABEL-CSB". For example:
This will generate a label like:
(this is using the Diskette sized label). As you can see the 'Animal Use Only' gets suppressed and the product name is replaced by the patient's Colour/Species/Breed (hence the CSB).
Note that because you can do a New Medication on the Patients|Medical records screen, select this product, fill in the label text and print the label, and THEN cancel, you can generate a label and not leave an entry in the medical records.
If you have multiple locations, you may wish to limit which products are visible to each location in charges, estimates, reminders and patient documents.
By default, all products are available at all locations, and there is no block against invoicing an item for which there is no record of any stock at the current location. (You will get a no stock warning, but if you go ahead and finalise the invoice, a stock record for that item will be created with a negative quantity.)
If you want to limit what products are available then you need to set the 'Use Location Products' flag in the Practice. Having does this, then:
If there has been stock at the location, and you wish to make it unavailable at that location, then you simply edit the product and, on the Stock Locations tab, simply delete the Product Stock Location record for that location. (Obviously, if there is stock at that location, then you will want to transfer it elsewhere before deleting the record.)
In addition, templates can indicate what should happen if an included product isn't available at the location. It the the Skip If Missing option is checked then the product will be ignored if it isn't available at the current practice location. This allows a common template to be used that selectively includes products based on the location. The Skip If Missing is not checked (the default) then the template expansion will fail if the product isn't available at the location.
Rostering enables employees to be scheduled to work, and identifies which clinicians can be scheduled for online booking.
To set up rostering:
In order to do rostering it needs to be enabled. This is done on a per-Practice Location basis.
Roster Areas are areas within a Practice Location where employees work, e.g. Surgery, Reception, Grooming, or Boarding.
They can be assigned Schedules, indicating which schedules a clinician can work on.
This step applies to multiple-locaction practices, where employees only work at one or several of the practices. It can be skipped for single-location practices.
In the Employees view of the Rostering workspace, all employees who can work at the current location are displayed.
To ensure that only those employees who work at the current location are displayed:
By default, online bookings aren't associated with any particular clinician. To allow customers make an online booking with specific clinicians:
Notes:
Rostering data is cached for performance reasons. Two caches are used, Roster By Area, and Roster By Employee. The default sizes of these are determined by the number of Roster Areas and the number of Users respectively.
These only need to be changed if Roster Areas or Users are added or deleted or marked inactive.
To configure Rostering data caching:
Employees are rostered to areas by creating Shifts in Workflow - Rostering.
New shifts can be created by double-clicking in an empty cell on the Areas or Employees tab. Shifts can be copied using Ctrl-C and pasted into an empty cell using Ctrl-V.
To avoid scheduling warnings when assigning clincians to appointments, shifts should be created at least a week beyond the Roster Check Period.
OpenVPMS can connect to Smart Flow Sheet to:
To use Smart Flow Sheet:
See Troubleshooting to diagnose Smart Flow Sheet related errors.
Smart Flow Sheet needs to be enabled for each Practice Location where it will be used. This is done by:
Multiple Smart Flow Sheet accounts are required if you have multiple Practice Locations, and:
You will need to log out after making this change for it to take effect.
Once enabled:
In order to see OpenVPMS products in Smart Flow Sheet, they need to be synchronised.
This:
* To be available at the current Practice Location:
Before synchronising products for the first time, log in as an administrator and go to Administration - Types. Edit each Product Type that should be synchronised, selecting Synchronise with Smart Flow Sheet.
To synchronise products, log in as an administrator user and go to Products - Information and click Synchronise with Smart Flow Sheet
Whenever products are updated, they should be synchronised.
Medication products that have a Concentration must also specify the concentration units and Dispensing Units in order to fully synchronise.
In multi-location practices, product synchronisation needs to be done for each practice location that has Smart Flow Sheet configured.
If the Practice Use Location Products option is selected, only the products linked to the current location will be synchronised. All other products will be removed.
In order to see OpenVPMS clinicians in Smart Flow Sheet, they need to be synchronised. This:
To synchronise clinicians, log in as administrator user, and go to Administration - Users and click Synchronise with Smart Flow Sheet.
Whenever clinicians are updated, they should be synchronised.
In multi-location practices, clinician synchronisation needs to be done for each practice location that has Smart Flow Sheet configured.
Only the clinicians that are available at the current practice location will be synchronised.
Work Lists have a Create Flow Sheet option. When ticked, this will create a new Flow Sheet for a patient when the patient is:
Flow Sheets are linked to the patient Visit, so no new Flow Sheet will be created if one already exists for the Visit.
Smart Flow Sheet provides an EMR Integration Settings page that determines the notifications that OpenVPMS receives.
To invoice treatments given in Smart Flow Sheet, set the following options to ON:
When OpenVPMS receives treatment notifications, it creates Customer Pharmacy Orders. If a treatment is amended or removed, it may create a Customer Pharmacy Return to reverse any invoiced amount.
Where possible, these will be automatically invoiced during the Check-In, Consult and Check-Out workflows.
NOTE: if you have multiple practice locations, you must use a separate Smart Flow Sheet account for each location when using these options to avoid charges being associated with the wrong location.
If you connect Smart Flow Sheet and OpenVPMS to Cubex, you should set the options to OFF, to avoid double charging.
Notes entered into Smart Flow Sheet will automatically be added to patient history.
By default, notes shorter than 5 words are excluded, as they typically aren't very useful.
This behaviour can be changed by adding a Smart Flow Sheet Configuration to the Practice. The Synchronise Notes and Minimum Word Count options affect note synchronisation:
This allows OpenVPMS to automatically attach the reports to the patient Visit.
By default, all available reports are attached as individual PDF files. This includes:
To detemine which reports are attached, and which aren't, add a Smart Flow Sheet Configuration to the Practice.
For each report that should be attached, it's corresponding Files to Retain After Discharge option must be set to YES.
If the Merge reports into one PDF option in Documents Management is set to YES, Smart Flow Sheet will generate a single PDF containing all of the reports.
In this case, add a Smart Flow Sheet Configuration to the Practice with the Save Flow Sheet Report On Discharge selected, and all of the other Save .. On Discharge deselected.
Check that the Smart Flow Sheet Clinic API Key matches that provided by Smart Flow Sheet.
The report needs to have its corresponding Files to Retain After Discharge option set to YES on the Documents Management page.
disable Smart Flow Sheet integration in the test system; or
discharge any patients that have had flow sheets created by the test system, before using it for production
This is because Smart Flow Sheet hospitalisations are linked to OpenVPMS by the patient's Visit identifier, and you cannot have two flow sheets for the same Visit identifier.
If you are building or modifying reminder templates, then you will want to test them.
A convenient way to do so is as follows.
First set up the following:
Now call up Patients|Medical Records|Reminders for ZZ Dog and use New to create two reminders, one for ZZ Test1 and the other for ZZ Test2. For each, add an item for each type of reminder (Print, Email, SMS, Export or List) that you want to test, eg:
Now go to Reporting|Reminders, set the Location to ZZ Test and you will see something like:
You can now press the Send All button and it will send these reminders.
If you have a Gmail account, you can use Gmail's SMTP server to send out mail from OpenVPMS. Setting up things this way is particularly useful if you are using your Gmail address as the From address in OpenVPMS - because some mail systems (Gmail in particular) check the From address against the SMTP server used to transmit the email and will generate warnings to the recipient if the SMTP server used does not match the from address.
To use your Gmail account as an SMTP server, you need to set up a Mail Server record (via Administration|Organisation) as follows:
The Name, Description, Username, and Password should be set to suit your setup.
You will then need to set this Mail Server in the Practice and/or Practice Location records as required.
Note that one idiosyncrasy of the Gmail SMTP server is that if the From address in the email differs from that being used then the From address will be updated to reflect the name of the account used to send the email.
Hence if the From address is set to "XYZ Vets Inc<xyzvets[at]gmail[dot]com>", and the above Mail Server is used, then the From address will be changed to "XYZ Vets Inc<dg12345[at]gmail[dot]com>". Thus, in the above case, it would be better to use the xyzvets[at]gmail[dot]com account in the Mail Server record.
OpenVPMS supports integration with VetCheck.
VetCheck can generate digital practice forms with e-signature, digital dental or GA monitoring charts, vaccination certifications, discharge instructions, home care videos, pet healthcare programs & handouts.
VetCheck emails generated forms to the customer, and these are also included as clickable links in patient history.
To use VetCheck:
1. Sign up for an account at https://vetcheck.it/
2. Select the Enable VetCheck flag in the Practice.
Log out and back in for the changes to take effect.
This adds a VetCheck button in:
To generate handouts etc for a patient:
1. Click the button in the patient summary.
The VetCheck website will be displayed in a popup window, with the following details submitted:
2. Enter your VetCheck credentials to log in
3. Search for a handout
4. Click SINGLE SHARE
5. Fill out the details and click SHARE A SINGLE HANDOUT
To administer VetCheck templates, click the VetCheck button in Administration - Templates.