Google Summer of Code

March 8th, 2009

Google Summer of Code 2009

PatientOS, Inc. is proud to apply to be a mentoring organization for the Google Summer of Code. We have created a list of projects which we believe can be shared with other open source healthcare applications in the interest of developers creating a lasting contribution with their summer job.

Task Tracking and Time Management

We will provide you with a JIRA account for managing tasks, updating progress, entering issues and bugs.

Communication and Collaboration

The PatientOS teams uses Google Apps as our organization communication and collaboration tool. We will provide students with their own account for email, chat, and sharing documents.

We also use Skype or Webex for direct discussion, teaching, and training.

Email

  • Student mailing list patientos-gsoc@lists.sourceforge.net
  • PatientOS Developer mailing list patientos-developers@lists.sourceforge.net
  • Need help - questions gsoc@patientos.com

Student Resources

Creating tabular layouts on forms in 0.91

February 21st, 2009

In the past it has been somewhat tedious to organize controls in a tabular format on a form and challenging to mix and match layouts with regular controls.

With version 0.91 there are two important enhancements.  One is the ability to have a section defined as a regular control on a form instead of an entire panel.  In the past you could build a section as a single form but you could only build a form of exclusively sections and tabs, you couldn’t mix regular controls and sections and the sections layout was restricted to the layout of the source form.

Now you can build a section, add controls to it - without any specific layout and then you can insert that section into the form, and control the layout from the parent form.  What it essentially does is create a panel and adds the controls to the panel using Javas flow layout by default.  But you can then apply any layout you want using the init script.  If you want to apply a tabular format you can use GridBagLayout for example.

Lets look at the process end to end.

Step 1 The original spreadsheet section

Step 2 Create the build sheet

See our guide for details but prior to adding the table we have

Step 3 Add the table

Adding the table we just paste in the following

Radial L;Radial R;Pedal L;Pedal R
Regular
Irregular
Weak
Thready
Strong
Bounding

This then creates all the controls on the build sheet.

After we create the record items the build sheet looks like this.  Select all the controls for the table and press Copy.

Step 4 Create the section

Finally create a new form, change the number of columns to match your table - in this case 4 and paste the controls in.  After modifying the label format and column widths you have a table ready to be added to another form.

PatientOS Open Source Healthcare Information System v0.90 Released

January 17th, 2009

PatientOS v0.90 Release Candidate 1

PatientOS, an Open Source EMR free under the GPL v3 license has the following new 0.90 features.

Clinical Notes

The admission, progress, discharge and any other clinical notes are enhanced to integrated categorization of clinical terms and templates, user favorites or symptoms, findings, problems, procedures, and diagnoses.

Notes and forms have integrated medication or prescription orders. Templates can be merged, automatically applying for diagnoses, symptoms or reason for visit.
This 0.90 videos demonstrate the creation of a SOAP note using Dragon Naturally Speaking with PatientOS.

http://www.patientos.org/software/video.html

Workflow

Multi-user workflow can be defined by using the GUI tools to define the states forms can transition from and the corresponding actions. This is used to track status a requisition process and typically is used to enforce signature requirements, work queue, and integrate with paper and other physical processes.

Patient portal

The web based patient portal provides patients with self registration, Multi user login, and access to the patient was appointments, messages, and the ability to update their contact information. The facility may assign any number of forms to be available in the patient portal. PatientOS has started integration with an AJAX toolkit to enhance the user experience. Forms submitted by the patient are accessed by a pending queue within the main application. Users may reply to messages entered by the patient directly and any for clients are stored within within the patient portal and the patient will get an e-mail message directing them to the login.

Patient Portal Demo

http://ec2-67-202-48-202.compute-1.amaz … /patientos

Build Tools

As PatientOS prepares for a hospital implementation the build and configuration tools have been enhanced over the past two weeks. These improvements reduce the time to create new custom forms considerably and provides the tools to creates many of the new advanced user interface controls.

Online Demo

http://www.patientos.org/features/demo.html

Configuring Custom Reference Forms

December 30th, 2008

We all know that PatientOS needs to provide the capability to design custom clinical forms - assessments, notes, consults and so on.  But we also need to provide custom forms for less likely candidates such as Payers and Businesses.  Case in point one clinics requirements was the design and build of the following forms

Travel Agency

Insurance Company

Hotel

Insurance Assistance

Travel Agency Representative

Those forms are the design - done in PatientOS (not by me) but without the proper binding (hence the null display).

In version 0.90 you will see these forms in action with the workflow specific to a clinic in Egypt.

The Insurance Company is a ‘Payer Program’ in PatientOS. All the other entitites are modelled as ‘Businesses’. In the registration form we have a ‘Business Field’ which is used to search for a business. We build these forms and then assign the form as the Form Type to our Business Field control. This triggers the capability to add a new Business using the associated form and also to edit an existing business from the search list.

business search

business search

When we click Edit it pulls in the selected business into the form.

Hotel

Hotel

Note that we are not limited to the database fields associated with a business - we can create a form with any record items you wish to add to your data model.

The requirements do not end there. Some of the forms define relationships between the businesses - Insurance Companies, Insurance Assistance, etc. These relationships have an important impact on billing from both a data integrity perspective and automating otherwise manual processes.

We will see in version 0.90 how we can integrate this workflow and use it to minimize insurance claim issues using custom business rules.

PatientOS v0.87 Building a Veterinary Dermatology Assessment

December 16th, 2008

This post shows how to build a form, in this case a veterinary skin assessment but the content is less important than the methodology.  This does not discuss integration between forms, rather a simple standalone form

I have said 0.87 but there are only a couple of bug fixes since 0.86 that I used to help build this example.  I’ll highlight those when I come to them.

There is a video (sorry no sound) that walks through the process but first lets just highlight some terminology that will be foreign to everyone.  PatientOS forms and content are intertwined with the following concepts

  1. Models
  2. Record Items
  3. Terms

Models

A model (in PatientOS) is an object representation of one or more related tables which is used to transfer data from the database to the application code and encapsulates some business logic directly related to the model in question.

We have for example a PatientModel which is one-to-one with the patients table, with fields such as first_name, last_name, gender, etc and also has child tables such as addresses, phones etc

To talk about Models in detail is out of scope of this post and for now I want to focus on 3 tables and their corresponding models.  The tables are forms, form_records, form_record_details

The models are FormModel, FormRecordModel and FormRecordDetailModel.  The FormModel object contains records (i.e. a list of FormRecordModels) and the FormRecordModel contains details.

When we are adding a control to a form we designate a ‘Model Reference’ which is a field on the model, that corresponds to the database tables column.  For the most part we are typically assigning a Model Reference If of one of the following

  • FORMRECORDS_VALUESTRING
  • FORMRECORDS_VALUEINT
  • FORMRECORDS_VALUEDATE
  • FORMRECORDS_VALUEDOUBLE

Record Items

Record items is the name of the data element that contains the value.  On the form_records table there is a column record_item_ref_id that stores this record item ref id.  So if we want to store the height of a patient we would have a control with

  • Model Ref Id: FORMRECORDS_VALUEDOUBLE
  • Record Item Ref Id: Height Simple

The system comes preloaded with Height defined as a record item and it is coded so that can be properly used throughout the system or sent externally using OpenEHR, HL7 etc.

Terms

Terms are used for a couple of purposes.  One they are used to define a concept (similar to a SNOMED concept) or coded value for record items like Symptoms, Diagnoses, Exam Findings etc.

They are also used as a handy method to have a checkbox (or other control) on the form that triggers orders, charges, and other tasks (like a form due).

In the dermatology assessment we use a few very general record item names (dermatology assessment question, etc) and use terms to distinguish each question on the form.

The important point in form building is that each control requires either

  • a unique record item or
  • a unique combination of record item + term or
  • a unique combination of record item + detail item or
  • a unique combination of record item + detail item+ term or
  • a unique combination of record item + term + term sequence

Details are used to group controls together into a logical record (which is represented in the database as a single form_record row which has multiple form_record_detail rows) and term sequences are used (rarely) to show the same value over time or some other sequential progression.

There is much more to be discussed later on this topic.

Dermatology Assessment

With those concepts in mind the video will probably still not make too much sense :-) There is still plenty of work to be done to streamline and help guide the builder through the process but that will come.

Video: Dermatology assessment (Flash)

Dermatology Assessment Creation Video

Dermatology Assessment Creation Video

The video demonstrates the following steps

  1. Opening Clinical Forms Sections
  2. Right Click on the Folder Vet Hospital
  3. Adding a form section for questions
  4. We start by assing a text field
  5. First adding a new record item
  6. Expanding the record item domain tree adding the subfolders
  7. We add a record item Dermatology Assessment Question as a string
  8. We switch to the Terms Tool
  9. We add a term category folder Vet Hospital Assessments
  10. We add a subcategory Vet Hospital Assessment Questions
  11. We copy paste and format the text from the form until we have 1 line per term
  12. We switch back to our Form Editor
  13. We add a Checkbox Group
    (This is a trick… it allows us to select all the terms we built and add them as controls to the form.  We then use the multi-select tools to change the controls to the type need…)
  14. We write a few scripts to change properties on mass (like adding the colon to the end of the label)
  15. We select a subset of controls and turn then into textfields with a model ref of FORMRECORDS_VALUESTRING
  16. The toolbar has several shortcuts to actions e.g. to change widths of controls
  17. We add new record items for Yes/No boolean checkbox controls
  18. We create a couple of picklists for selecting values from a list.
  19. When we were finished we adding the section to the main form.
  20. After one bug fix we finally ended up showing (26 mins 45 seconds into the video) opening a patients forms, viewing the orders, clicking to modify and review the order - which opened our new dermatology assessment form.

Nursing FIM Worksheet Assessment Part 2

November 11th, 2008

With version 0.85 we have a a few new features in the form editor that automate many of steps to building new forms.

Paste Controls into a form

Since I had build a form per section in the FIM assessment I wanted to paste the first 21 controls as a template into each form. Rather than going into each and using Paste, there is now a control on the form list that allows you to paste controls in your buffer into all selected forms. The forms must be empty but still this saves a fair amount of time.

Paste controls into empty forms

Paste controls into empty forms

Replicating controls for terms

Now that we have a template set of controls in the form we want to replicate each line for each term in the subcategory. This is where it became very convenient to have a subcategory per term.

First we open the template form and select the last 7 controls to replicate.

Select controls to replicate

Select controls to replicate

Next we press the replicate toolbar button and select the term subcategory for the terms we need. In this case typing the word ‘expression’ filters the list to the subcategory we need.

Select the term subcategory

Select the term subcategory

Next we are prompted to select the terms from the subcategory. It is ordered the same as they were uploaded in order to match the originating form.

Note the form can be maximized by clicking the icon in the top right toolbar corner.

select terms by double clicking

select terms by double clicking

Finally after clicking OK the system prompts for a shorter name for each term. It is just used on the form and has no direct visibility to the user. It is nice to have application control names under 50 characters though.

After all the prefixes are replace the system adds all the new controls to the form. Press the refresh button to update the form display

Press refresh to layout the form

Press refresh to layout the form

Finally we need to fix up the labels. We select each label control in the list (they end in label) and using the control key use that to select them all.

Press the command button and enter the following script:

control.setLabel(control.getApplicationControlName().replace("label", ":"));

Click OK and this form is now finished - click OK and we will complete the rest.

Updated label and form is done

Updated label and form is done

Here is a video on the process

FIM assessment build

Configuring a clinic - Part 2 Billing

November 7th, 2008

Chart of Accounts

We create accounts for the facility which will provide tracking.  However in 0.85 they are only associated with the charge items and corresponding charges.  With version 1.0 (or earlier) these accounts will be updated as the invoices are generated.

  1. Login as admin/admin
  2. Click on the Facility Accounts link in the Billing section (2nd column).

Fee Schedule

Without a fee schedule the default charge on the charge item is applied.  We are going to create two different fee schedules.  The first is a flat 20% discount.

  1. Login as admin/admin
  2. Select Fee Schedules under the billing section (2nd column)
  3. Add a ‘20 % Discount Transport free’ Fee Schedule with charge multiplier 0.8

Charge Items

First we we want to build the charge items.  Here is the list

Medical Examination
Specialist consultation
Canulation and I.V line Appling
Infusions and observation hours
Injections
Medication
Transportation
Procedures
Consumables
Investigations
Radiology procedures
Admission in the clinic

To build the charge items we

  1. Create a CSV file of charge items
  2. Login as admin
  3. Press CSV Import button
  4. Browse and upload the CSV file
  5. Click on the Charge Items link
  6. Add any fee schedule specific charges (e.g. Transportation discount)

CSV File

The spreadsheet needed requires

  1. A unique charge item name
  2. A unique charge code
  3. Optionally an identifier source (see IdentifierSource tool)
  4. Optionally an identifier value for that source
  5. A charge item type (Service)
  6. Optionally ItemCost, ItemUnit, Quantity, CostCurrency
  7. A charge (could be 0 charge)

Look at the charge items spreadsheet or CSV file here.

Alternatively for a short list of charge items just add them manually.

Charge item tool

Charge item tool

Payers

Each of the insurance companies are added

  1. Login as admin/admin
  2. Use the Payers Link under Billing (2nd column)
  3. Add the Payer
  4. Assign the fee schedule and/or invoice format
  5. Save

Procedures

We then add the procedures which will be used to generate charges.

  1. Login as admin/admin
  2. Use menu System–>Reference
  3. Select TermCategory
  4. Add a new entry for the Procedures e.g. <Clinic Name> Procedures
  5. Use menu System –> Reference
  6. Select TermSubcategory
  7. Add a new entry for Medications e.g. <Clinic Name> Medications
  8. Select the Terms Link in the Clinical Section (1st Column)
  9. Select the new term category
  10. Right click add select Add Terms
  11. Enter No for coded
  12. Select the new term subcategory
  13. Select no for coded
  14. Enter a procedure - one of each line
  15. Save and for each procedure add the charge item
  16. Procedures where the charge item has no charge should specify the charge.
  17. Procedures which flex based upon the fee schedule should have the charge defined

Configuring a clinic - Part 1 Configuration

November 7th, 2008

This post is the first of several that will walk through the steps of configuring a clinic in Egypt as an end-to-end example.  Part I will focus on the initial configuration.

Installation

The installation will be a standard install however instead of importing the demo_database.sql I imported the starter_database.sql which has only system supplied content.

Login as admin/admin and you have 4 columns of links to configuration tools.  The first column is for clinical tools, the second for administrative tools, the third column is for technical tools and the last column is for tools to build PatientOS.

Locations

Note: You must use a naming convention that produces unique location names.  Shorter/non-unique names can be assigned as ’short displays’ but the formal location name must be unique.

  1. Login as admin/admin.
  2. Click on the Locations link in the Registration group (2nd column) to open the initially empty locations.
  3. Press the Add Facility button.
  4. Enter the facility name (or if you have multiple facilities one per line) and press OK to save.
  5. Select the node and right click (sometimes it requires selecting twice) and select ‘Add Building’ from the menu.
  6. Enter the building name(s) and press OK to save.
  7. Right click on the building node.
  8. Add the clinic.
  9. Add rooms and beds.
  10. Add an address for the facility.

Users

Next we add the users.

  1. Login as admin/admin.
  2. Click on the Users link in the Security group (3rd column) to open the list of users.
  3. Press Add User
  4. Enter the name and tab through to get the display (add MD or any other credentials).
  5. Enter the user login (uppercase as the default setting is to authenticate with an uppercase username)
  6. Add the primary role
  7. Add any secondary roles if the user is allowed to switch between roles.
  8. Assign the default location to user logs into.

Insurance Companies

We add the common insurance companies to the system.

  1. Login as admin/admin
  2. Select Payers under the Billing Section (2nd column)
  3. Add each company with the default or appropriate fee schedule

Travel Agencies

We add the travel agencies as businesses

  1. Login as admin/admin
  2. Menu System Reference
  3. Select Business
  4. Add new and paste in the list

Alfa Star
Apollo
Exim Tours CZ
Exim Tours PL
Firo Tours
Kopernik
Medina Tours
Nova Tours
Orbis Travel
Sky Club
Sun & Fun
Varda
Viva Tours PL

Travel Insurance Assistance Companies

We add in these companies as businesses
AXA Assistance
Coris Varsovie
Ergo
Euro Center
Euro Cross
International SOS
Modial Assistance
SOS DK

Installing PatientOS on SUN Sparc/Solaris 10

October 28th, 2008

Solaris installation instructions are very similar to the Linux instructions.

The main difference is

a) Download gnu tar and install its dependent packages from ftp://ftp.sunfreeware.com/pub/freeware/sparc/10/ with the pkgadd -d <file> command.

libiconv-1.9.2-sol10-sparc-local
libgcc-3.4.6-sol10-sparc-local
tar-1.16-sol10-sparc-local

b) The PostgreSQL software install of postgresql-8.3.1-S10.sparc-32
https://sun-rfid.dev.java.net/postgresql-install.htm#install

c) The Java install of jdk-6u7-solaris-sparc.sh

download java 1.6.07 for Sparc Solaris 10. Unpack and then replace the patientos java directory

rm -fR /usr/local/patientos/082/jre1.6.0_02
mv jdk1.6.0_07 /usr/local/patientos/082
mv /usr/local/patientos/082/jdk1.6.0_07 /usr/local/patientos/082/jre1.6.0_02

d) Remember, like Linux, running PatientOS using X-Windows over a LAN is slooooow. NX Server/Nx Client allow you to get a fast, snappy application as long as you have a fairly recent CPU (2.2 dual core min recommended). Just install the 3 packages.
http://www.nomachine.com/download.php

e) Create users, login and start patientos (command line or setup a shortcut)

Here is PatientOS running on a Solaris 10 desktop !

PatientOS running on solaris

PatientOS running on solaris

Nursing FIM Worksheet Assessment

October 28th, 2008

Now that the PatientOS tools are becoming more mature I am able to write up instructions for administrators to build clinical documentation content - without requiring a developer to build it for them. Here are the instructions used for the FIM Worksheet Assessment.

Step 1 FIM Assessment Design

The assessment is divided into 20 or more sections, each of which have several questions to assess the patient. Each question is assigned a score and the lowest score in the section becomes the FIM score.

FIM Assessment Eating Section

FIM Assessment Eating Section

We will have one form per section and then a single form which adds the others as sections.

Step 2 Data Elements

In this form will we create 2 new data elements for the FIM assessment and assign the OpenEHR identifier for a global assessment.

  • Evaluations –> SOAP –> Assessment –> System FIM Assessment
    1. System FIM Assessment Item
      - Integer
      - openEHR-EHR-OBSERVATION.global.v1/data[at0001]/events[at0002]/data[at0003]/items[at0067]/value
    2. System FIM Assessment Score
      - Integer
FIM Assessment Data elements

FIM Assessment Data elements

Step 3 Term Subcategories

Ahead of time we create the term subcategories using the reference builder

System - FIM Worksheet Eating
System - FIM Worksheet Grooming
System - FIM Worksheet Bathing
System - FIM Worksheet Upper Body Dressing
System - FIM Worksheet Lower Body Dressing
System - FIM Worksheet Toileting
System - FIM Worksheet Bladder
System - FIM Worksheet Bladder Accidents
System - FIM Worksheet Bowel
System - FIM Worksheet Bowel Accidents
System - FIM Worksheet Transfer Bed Chair Wheelchair
System - FIM Worksheet Transfer Toilet
System - FIM Worksheet Transfer Tub Shower
System - FIM Worksheet Locomotion Ambulation
System - FIM Worksheet Locomotion Wheelchair
System - FIM Worksheet Locomotion Stairs
System - FIM Worksheet Comprehension
System - FIM Worksheet Expression
System - FIM Worksheet Social Interaction
System - FIM Worksheet Problem Solving
System - FIM Worksheet Memory

Step 3 Terms

We open the Term Builder and create a term hierarchy

Evaluations–> FIM Assessment

and right click on the category to get the menu choices.

  1. This time we want “add terms and details to FIM assessment”
  2. We are then prompted and select the appropriate term subcategory
  3. We say no to the prompt for a coded entry
  4. We say yes to apply the same detail to all items
  5. We then search for System FIM Assessment Score

6. Finally we enter the list ensuring one term per line and a semi-colon and the score at the end of the line

Term name with detail value

Term name with detail value

Step 5 Template Form

A form is created for each term subcategory and opening each form we sent the view properties to

  • Columns 11
  • Column spec

We then add 3 rows labels

  1. Row 1
    • Blank label
    • Label “Day 1″ 3 columns wide
    • Label “Day 2″ 3 columns wide
    • Label “Day 3″ 3 columns wide
    • Blank label
  2. Row 2
    • Subcategory label
    • Label for day 1 shift 1
    • Label for day 1 shift 2
    • Label for day 1 shift3
    • Label for day 2 shift 1
    • Label for day 2 shift 2
    • Label for day 2 shift 3
    • Label for day 3 shift 1
    • Label for day 3 shift 2
    • Label for day 4 shift 3
    • Label for FIM score
  3. Row 3
    • Label for first term
    • 3 state (Yes Unvalued N/A) checkbox
      - FIM Assessment record item
      - First term value
      - Term Sequence 1
    • 3 state (Yes Unvalued N/A) checkbox
      - FIM Assessment record item
      - First term value
      - Term Sequence 2
    • 3 state (Yes Unvalued N/A) checkbox
      - FIM Assessment record item
      - First term value
      - Term Sequence 3
    • etc up to Term Sequence 9
    • Integer field with
      - FIM Assessment score record item
      - First term value

The template form now looks like this

FIM assessment header and first term

FIM assessment header and first term

Step 4 Replicating the Form

  1. First we open the FIM Worksheet Eating form and select the last 11 controls
  2. We press the TERM toolbar button
  3. We search and find the first term “Completely Independent”
  4. We apply the term to all 11 controls
  5. We press the copy button
  6. We press the paste button
  7. We then repeat steps 1-4 for the second term
  8. We optionally change the control name (see below)
  9. We do need to update the first controls name (see toolbar with an A)

We then repeat for all terms in this form.

Here is a video of the process to replicate the form design:

FIM assessment replicating the forms

We then repeat for all forms and terms. For each new form we first paste all of the header and first 11 controls (25 in total).

Note to change a control name you can use the command control button and enter the following script

control.setLabel(control.getLabel().replace(”independent”,”fed slower”));


  • Categories