Protecting Patient Privacy - Points for Effort

It's a difficult time for health care providers to practice, given the constant changes in computer technology, patient requests, and government regulations.

One particular difficulty relates to how sometimes it's easy to miss the forest for the trees when it comes to IT security, as in this DVD that we recently received from a third-party wherein the password for decrypting the files stored on the DVD was simply written on the DVD itself.

For context, Magenta Health physicians commonly request the medical records of patients from former physicians and health care facilities.  Once we send this request off, the requested documents are sent to us via various means such as fax, mail, flash drives, or DVD.

Particularly when physically mailing information, there is a risk of the package being misdirected, and accordingly, if the information is being mailed on physical media such as a DVD or flash drive, it will sometimes be encrypted.  In theory, this is a great idea, although it raises the issue of how to convey to us the password to decrypt the information.  There's no perfect answer, but what is commonly done is that the password and the information will be sent separately. This is similar to how, for example, banks send credit card PINs separate from the credit card itself.

Where this breaks down is if the password is sent together with the information, as in the image above.  In these circumstances, the entire purpose of encrypting the information on the DVD (to protect it from inadvertent disclosure) is defeated since anyone who happens across the DVD would be able to readily access the information.

Suffice it to say, this is an example of why we think it's always important to take a step back and think about, in practical terms, why a particular measure or precaution is being taken, and to evaluate whether it's being deployed and utilized correctly.

OSCAR EMR + Greasemonkey = Amazing Customizability

As users, we all gripe about software and how software is "poorly designed" or "hard to use". In practice, there's usually a good reason, whether it's legacy code that can't be easily rewritten, or the simple fact that a single piece of software needs to meet the needs of diverse individuals with different requirements.

Accordingly, one of the advantages of OSCAR EMR, the electronic medical record system that we've selected as a platform for our organization, is that it is highly customizable and so we can adapt it to meet our organization's unique needs.  (This is not to say that we're the only organization with unique needs - the fundamental issue is that every organization will have unique needs and the challenge when it comes to procuring software is finding the right software for you.)

One particular advantageous aspect of OSCAR is that it is built as a web application, and as a result, common web tools can be used to adapt and customize OSCAR.  One particular tool is called Greasemonkey - a Firefox extension that enables users to dynamically insert javascript into webpages.  A whole slew of scripts have already been developed by OSCAR community members, but we've been writing a few of our own to resolve certain issues that our physicians or staff complain about.  Hopefully the below can help other OSCAR users down the road, whether as inspiration, or as a starting point for your own scripts.  There may be errors though we warn; everything remains a work in progress and we are constantly revising.

  • Resizing most windows to a consistent spot in the screen.  For example, the echart is automatically moved and resized to the right half of the screen, whereas eforms, consults, ticklers, forms, preventions, Rxs, etc... are moved/resized to the left half of the screen.  Just adapt the code below as required.
if (url.indexOf('labDisplay.jsp') != - 1) {
window.moveTo(0, 0);
window.resizeTo(screen.width / 2, screen.height - 40);
}
  • Making more of the patient's name show up in the scheduling screen.   Our receptionists were having trouble because the patient's name was being truncated
if (url.indexOf('provider/providercontrol.jsp') != - 1) {

var links = document.evaluate("//a[contains(@class,'apptLink')]",document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);

for (var j =0 ;j < links.snapshotLength; j++){

var thisLink = links.snapshotItem(j);

thisLink.innerHTML = thisLink.title.split("reason:")[0].trim();

}

}
  • Making it so that when the "tickler" link is clicked from the calendar view, a report of the user's ticklers is automatically run
//changing tickler link so that providerNum is passed in when tickler link clicked
if (url.indexOf('provider/providercontrol.jsp') != - 1) {
var tareas = document.getElementsByTagName('a'); 
var providerNum;
for (var i = 0;i <tareas.length; i++){ 
if (tareas[i].title=="View lab reports"){
var onclickValue = tareas[i].getAttribute('onclick');
 providerNum = onclickValue.substr(79,3); 
}
}

for (var i = 0;i <tareas.length; i++){ 
if (tareas[i].title=="Tickler"){
var onclickValue = tareas[i].getAttribute('onclick');
var split = onclickValue.split(',');
var newStr = split[0].substring(0,38) + "?customProviderNum=" + providerNum + "'," +split[1]; 
tareas[i].setAttribute('onclick',newStr);
}
}
}

//automatically running report of relevant ticklers
if (url.indexOf('Oscar12_1/tickler/ticklerMain.jsp?customProviderNum') != - 1) { 
var provider = getUrlParameters("customProviderNum","",true);
if (provider){ 
 var assignedTo = document.getElementsByName('assignedTo')[0];
 for (var i=0; i<assignedTo.length; i++){
if (assignedTo.options[i].value == provider){
 assignedTo.selectedIndex = i;
}
 }
 eval("document.forms['serviceform'].Submit.value='Create Report'; document.forms['serviceform'].submit();");
} 
}
  • changing the functionality of the ticklers in the echart so that a) if viewTicklers is clicked, a report of all completed ticklers is displayed, and b) if a particular active tickler is clicked, then the corresponding tickler in editable form is opened.

//echart to rewrite the tickler links
if (url.indexOf('Oscar12_1/casemgmt/forward.jsp') != -1){
setTimeout(redirectTicklers,3000);
}

//to simulate clicking on correct tickler edit button if certain parameters passed
if (url.indexOf('CustomTicklerTitle') != -1 && url.indexOf('tickler/ticklerMain.jsp') != -1){ 
var pN = getUrlParameters("CustomPatientName","",true);
var tT = getUrlParameters("CustomTicklerTitle","",true); 
var trs = document.getElementById('sortableTable0').getElementsByTagName('tr'); 

for (var i= 0;i < trs.length; i++){
if (trs[i].textContent.indexOf(pN.split(", ")[0] + "," + pN.split(", ")[1])!=-1 && trs[i].textContent.indexOf(tT) != -1){
var tds = trs[i].getElementsByTagName('td');
tds[1].childNodes[0].click();
window.close();
}
}
}

//to delete all ticklers except for those related to a particular patient
if (url.indexOf('CustomShowAllForPatient') != -1 && url.indexOf('tickler/ticklerMain.jsp') != -1){
var mainPatientName = getUrlParameters("CustomShowAllForPatient","",true);
var trs = document.getElementById('sortableTable0').getElementsByTagName('tr'); 
var markDelete = new Array(trs.length);
var mostRecentPatientName = "";
for (var i= 2;i < trs.length; i++){if (trs[i].childNodes[1].childNodes.length > 0){mostRecentPatientName = trs[i].childNodes[5].textContent.trim(); } 
if (mostRecentPatientName.indexOf(mainPatientName.split(", ")[0] + "," + mainPatientName.split(", ")[1])==-1){ 
 markDelete[i] = true;
}else {
markDelete[i] = false;
}
markDelete[0] = false;
markDelete[1] = false;
} 
for (i = trs.length-1; i>=2; i--){
if (markDelete[i]){
trs[i].parentElement.removeChild(trs[i]);
}
}
}

function redirectTicklers(){
var tareas = document.getElementsByTagName('a'); 
var patientName;
for (var i = 0;i <tareas.length; i++){ 
var title = tareas[i].title;
if (title == "Master File"){ 
 patientName = tareas[i].textContent;
i = tareas.length;
}
}

for ( i = 0;i <tareas.length; i++){ 
var onclickvalue = tareas[i].getAttribute('onclick'); 
var ticklerTitle;
var ticklerDate; 
if (onclickvalue != null){
 if (onclickvalue.indexOf("ticklerDemoMain") != -1 && onclickvalue.indexOf("ViewTickler") == -1){ 
 var ticklerTitle = tareas[i].title.split("...")[0].trim(); 
 var ticklerDate = tareas[i].title.split("...")[1].trim(); 
var newStr = "window.open('../tickler/ticklerMain.jsp?xml_vdate=1900-01-01&xml_appointment_date=8888-12-31&ticklerview=A&mrpview=all&providerview=all&assignedTo=all&Submit=Create+Report";
newStr += "&CustomPatientName=" +encodeURIComponent(patientName);
newStr += "&CustomTicklerTitle=" +encodeURIComponent(ticklerTitle);
newStr += "&CustomTicklerDate=" +encodeURIComponent(ticklerDate);
newStr += "','MagentaCustom','height=100,width=100');return false;"; 
tareas[i].setAttribute('onclick',newStr);
} else if (onclickvalue.indexOf("ticklerDemoMain") != -1 && onclickvalue.indexOf("ViewTickler") != -1){ 
var newStr = "window.open('../tickler/ticklerMain.jsp?xml_vdate=1900-01-01&xml_appointment_date=8888-12-31&ticklerview=C&mrpview=all&providerview=all&assignedTo=all&Submit=Create+Report";
newStr += "&CustomShowAllForPatient=" +encodeURIComponent(patientName);
newStr += "','MagentaCustom2','height=100,width=100');return false;"; 
tareas[i].setAttribute('onclick',newStr);
}
}
}
}
//helper function
function getUrlParameters(parameter, staticURL, decode){
 /*
Function: getUrlParameters
Description: Get the value of URL parameters either from
 current URL or static URL
Author: Tirumal
URL: www.code-tricks.com
 */

 var currLocation = (staticURL.length)? staticURL : window.location.search,
 parArr = currLocation.split("?")[1].split("&"),
 returnBool = true;

 for(var i = 0; i < parArr.length; i++){
parr = parArr[i].split("=");
if(parr[0] == parameter){
return (decode) ? decodeURIComponent(parr[1]) : parr[1];
returnBool = true;
}else{
returnBool = false; 
}
 }
 if(!returnBool) return false; 
}

Online Booking Walkthrough - Regular Appointments

Patients occasionally aren't quite sure how to book appointments (including regular, urgent, and physical health exams) with their physician. This post will walk through the steps with screenshots exemplifying what to do and where to click.

Step 1 - The first step is always to have a new patient intake appointment with your physician. Only once you've had this appointment will you be provided by email a link to book subsequent follow-up appointments with your doctor. Please bookmark the link for future reference although this search tool is available if you have lost the link.

Step 2 - When you wish to book a regular appointment with your physician, access the link provided to you.  You'll be taken to a page similar to the following:

Step 3 - Towards the bottom, you will be presented with a number of different appointment types. These will differ from physician to physician.  Select the type of appointment that is appropriate for your circumstances.  In most circumstances, "Regular Visit" will be the correct choice.  

Step 4 - Once you select from the options, the webpage will display a booking form such as the below:

Step 5 - Use the booking form to book your appointment.  You'll need to choose a date and time for your appointment, and also complete the form questions.  A completed form appears as follows.  

Step 8 - Once you've completed the form, click the "Send request" button.  A login screen will appear, such as the following. Type in the email address that you had previously selected when creating your booking account (see step 9 of this walkthrough) and your password.

Step 9 - Once you enter your credentials, click "Login".  Your booking will proceed, and you will be displayed a green confirmation box as follows:

You'll also receive an email confirmation to the email address that you provided the first time you used the username (see step 9 of this walkthrough).

Online Booking Walkthrough - New Patient Intake Appointment

Patients occasionally aren't quite sure how to book their new patient intake appointment.  This post will walk through the steps with screenshots exemplifying what to do and where to click.

Step 1 - The first step is always to register here.  Only after a patient registers will they receive by email a link to book a new patient intake appointment with a particular doctor. This email will have the subject "Magenta Health - Invitation for Scheduling Patient Intake Appointment"

Step 2 - Once you receive the email, read through the email, and there will be a section that states the following:

With this in mind, you have been assigned to [doctor] and new patient intake appointments can now be scheduled, as follows:

1. Visit the following link: [link]

2. You will need to register for an account as part of the booking workflow....

Step 3 - Click on the link provided, and you'll be taken to a page that appears similar to the below:

Step 4 - There's a bit of overlap with the invitation email, but we strongly recommend that you read through this webpage carefully.

Step 5 - If you're ready to schedule your appointment, look towards the bottom of the page. It first asks you how many family members, including yourself, you are booking for.  If you're booking for just yourself, select 1, if you're booking for you and a spouse, select 2, if you're booking for yourself and two children, select 3, etc...

Step 6 - Once you select from the options, the webpage will display a booking form such as the below:

Step 7 - Use the booking form to book your appointment.  You'll need to choose a date and time for your appointment, and also complete the form questions and check off the required check-boxes.  A completed form appears as follows:

Step 8 - Once you've completed the form, click the "Send request" button.  A login screen will appear where you can choose the option "Create an Account".  

Step 9 - Once you have clicked on "Create an Account", you'll need to provide a "Display Name", password and email address of your choosing then click the "Register" button. This process provides you with an appointment booking account which you can use for all future bookings.  Please note that in the future you will be able to use your email address to login.

Step 10 - After you have properly created an account, you will be displayed a green confirmation box as follows:

You'll also receive an email confirmation to the email address that you provided at Step 9.

I have been referred to Magenta Health by the Health Care Connect service, what do I do next?

Health Care Connect helps Ontarians who are without a family health care provider (family doctor or nurse practitioner) to find one. People without a family health care provider are referred to a family doctor or a nurse practitioner who is accepting new patients in their community.

Magenta Health is part of this program as part of our commitment to help service the medical needs of our community. 

Being referred by HCC does not automatically mean that you are a patient of the suggested doctor. Individuals still have to register via our website and the suggested physician may not be available when the registration is processed.

Thanks, and we look forward to meeting soon!

A Belated Update - Photos & New Patient Appts

Although some walls still need to be painted and we can't wash our hands in the washroom quite yet, we're just days away from the completion of construction. It's somewhat hard to believe (since the photos below suggest - at least to us - that there's quite a lot of work left to do) but that's what we're told!

We'll share more once we're officially open for business, but in the meantime, we've started to schedule new patient intake appointments.

Only a few dozen invitations have been sent out so that we have a opportunity to confirm our electronic systems are working properly. Once we're confident everything is working well, we'll be sending everyone else who registered with us a personalized email with information on how to schedule their intake appointment.

In the meantime, at least for us, it's interesting to look back and see where we started from. Here was the first mock-up of the space that we drew ourselves after we visited the unit back in the middle of 2013!


Learning something new: Off-Lease Computers Make Amazing Thin Clients

For those who don't know, thin clients are computers used primarily to connect to some other computer where the actual "computing" takes place on the remote computer.

We need thin clients because we're using a remote desktop session host based IT infrastructure. Sounds complicated, but it'll help our physicians see patients more effectively and efficiently (well, that's the promise anyways).

So what did we learn today? It's amazing the value you get from off-lease computers. These are computers leased by large corporations for a few years, and then returned as "obsolete" even though, in practice, they are still fully usable.  They aren't the fastest or prettiest machines on the block anymore, but as thin clients, they are more that adequate (frankly, some of these off-lease computers are comparable to many people's home desktop, and blow most "special-purpose" thin client machines out of the water).  They even come with fully licensed versions of Windows, which, at $150, is oftentimes more expensive than these off-lease desktops!

Here are thin clients 3, 4, 5, and 6 (of 30) being tested on our highly sophisticated test bench (a.k.a. a dining table).

Construction Update #2 - Walls, walls, walls everywhere!

An amazing amount of work has been done to transform the space into a clinic these last couple weeks.  Indeed, there are steel studs everywhere now, and the drywall is starting to go up in certain places.

This third photo is particularly interesting.  For scale, the ceiling here is 16' height, and the opening is 12' x 5'

Online Booking

One of the ways our clinic seeks to offer our patients an improved experience is by offering real-time online bookings.

What we mean by this is that all appointments will be available to be scheduled online, with our online schedule fully up-to-date at all times.  For example, if a patient cancels an appointment, that timeslot will become available to other patients immediately.

Our hope is that this system will enable our patients to have better and more convenient access to their physicians.

Here's an example of how our online booking system will work.