Active Projects

From OpenEMR Project Wiki

Overview

This is a listing of currently important active projects. This is a place to see what's going on, and also a place to see where help is needed by other developers and testers.

Calendar

Multi-facility bugs

Description of bugs:
  1. Things work great with one facility
  2. With two facility the bugs appear (different bugs happen with the $GLOBALS['restrict_user_facility'] turned off(default) and on)
  3. When $GLOBALS['restrict_user_facility'] is turned off get following behavior. In essence the calendar only shows what is set as 'default facility' in the users settings. If you choose the facility then that user won't be available. By choosing all facilities, it will actually show all appointments from all facilities, however the scrollbar display is confusing (shows the top item), and unable to schedule an appt at anything but in the scroll bar; this also screws up what you see when scrolling through new days.
  4. When $GLOBALS['restrict_user_facility'] is turned on, then only seems to work right if you place all facilities in the users settings 'Schedule facilities'. Then everything seems to work fine, but there is no option to view all facilities, which seems like should be an option. If you don' t place all facilities in the users 'schedule facilities', then you'll see other appointments at other disallowed facilties like they are on the selected on (not much of a bug since appointments shouldn' be scheduled on disallowed facilities anyways), however can only add to the allowed facility, which is good.
Seems like the bug(s) really stem from three mechanisms:
  1. When choose all facilities, don't then highlight the item below it; highlight them all and that have this supported when click other buttons (moving days or adding appt)
  2. With global restrict_user_facility off (default) allow users to be scheduled at all facilities.
  3. With global restrict_user_facility on give option to show all facilties in calendar.
Currently linked to this tracker item and this forum thread.
Awaiting a Developer to fix this bug.

Recurring appointment bugs

This problem is discussed in this forum thread and this forum thread.
Bug described in good detail by Gayll in this bug tracker item: http://sourceforge.net/tracker/?func=detail&aid=2963714&group_id=60081&atid=493001
Awaiting a Developer to fix this bug.

Clinical Decision Rules (CDR) Engine

Integrate Plans into the Admin GUI

Implement plan/rule mapping in the Admin GUI for CDR. Note this simply involves creating a screen that allows mapping of rules to plans via the 'clinical_plans_rules' mysql table (as the other rules, do not show or allow mods of the cqm rules and plans)(also, note that a rule can be in multiple plans). This would be an extremely useful feature for little time, and allows physicians to view rules by plans in the Patient Summary Clinical Reminder widget Edit button (Plans tab).
Awaiting Developer to fully analyze and implement this.

Integrate Procedures into the Admin GUI

Implement procedure filter/target creation in the Admin GUI for CDR. Note the CDR engine currently supports this (see the Coumadin rule for an example) and this feature is gonna be in high demand for users that want to create rules via the Admin GUI that involve procedures.
Awaiting Developer to fully analyze and implement this.

Provider bug fix for per-provider reporting

This is fully discussed at Description_AMC#Patient.28s.29_selection and Description_AMC#Potential_Issues (Issue #1).
Awaiting Developer to fix this bug.

Improve Performance

A page tracking this project can be found at CDR Performance.
Awaiting Further Testing/Reporting.

Diagnostic Coding

Integrating ICD10

See ICD10 Diagnostic Codes Development for details.
Awaiting Developer to fully analyze and implement this.

Integrating SNOMED

See SNOMED Diagnostic Codes Development for details.
Awaiting Developer to fully analyze and implement this.

Integrating DSMIV

See DSMIV Diagnostic Codes Development for details.
Awaiting Developer to fully analyze and implement this.

Documentation

API

Document the SOAP APIs for the third party portals.

Access Controls

Finish the Access Controls Listing page.

Insurance Eligibility Check

Finish the Insurance Eligibility Check page

Lists

Finish the OpenEMR Lists page.

Settings

Finish the OpenEMR Settings page.

Forms

Datafield Max Length Bug

Currently many fields in the Layouts engine (includes the LBF forms) are validated to not go over a set length. Plan to have this max length be dependent on the underlying mysql field and/or make more manual and have it set in the max_length setting for each element in the layout editor(then, the admin will be responsible for ensuring the max_length is consistent with the underlying sql field. This is discussed in this forum: http://sourceforge.net/projects/openemr/forums/forum/202505/topic/4775993
Awaiting developer to implement this.

Internationalization

Date formatting

Still work to do in order to support date formats across multiple languages. Here's the forum thread discussing this.
Awaiting a Analyzer to figure out a good plan for this.

Translation database maintenance/improvement

We currently have a stable collaborative system in place to allow translation of any language. The translations are entered into a OpenEMR Translation Google Doc Spreadsheet. These instructions and scripts (README files describes the pipeline in detail) then allows conversions of the translation spreadsheet to mysql tables and allow detection and insertion of new english constants into the translation spreadsheet.
A new set of official translation tables are created daily.
Bradymiller is maintaining this.


TO DO:
1. Build mechanism to import most recent translations in the Administration->Language->Manage Translation Screen.
  • Can leverage mechanism used to bring in the most recent translation set into the development demo.
  • Should use the 'standardized_tables_track' table to keep track of what is imported.
Awaiting developer to implement TODO number one.

Medications

Integrate medications and prescriptions

Awaiting Developer to fully analyze and implement this.

Integrate RXNorm

There is currently a mechanism to import the RXNorm codes, however it has not been yet implemented in OpenEMR.
Awaiting Developer to fully analyze and implement this.

Messages

Message Center

Fully integrate Messages, dated reminders and authorization within the same screen.
  • Improvements needed for Message module
  1. Include counting of uncompleted messages in the Messages link counter also. (DONE and committed 4/28/12)
  2. Refresh every 30-60 seconds (same mechanism as the dated reminders module)
  3. Place a patient to link directly from the messages (as the reminder does) (DONE and committed 4/28/12)
  4. Consider not requiring a patient linking
  5. Make the 'Done'(from Message gui) and inactive (from pnote gui) consistent (DONE and committed 4/28/12)
  • Bring in authorizations into the Message Center
  • Integrate all into a nice consistent style
  • Add a automated forwarding mechanism (for example, when a clinic member is on vacation)
  • Consider adding a flag to user table to show that they should receive local messages/reminders (if can't figure out a way to figure this out with current scheme)
Awaiting Developer to finish implementing this.

Miscellaneous

Assigned Provider ID and Referring Provider ID conflict bug

The same field appears to be used in OpenEMR to track the assigned provider at a clinic and the referring provider.
The patient_data mysql table also has the following columns:
  • providerID
  • referrer
  • referrerID
The above referrer* are not included in the demographics layout while the providerID is populated by the 'Provider' label, which has 'Referring Provider' in the details.
A grep (grep is a search method) for referrerID in the codebase showed it really isn't used anywhere.
A grep for providerID in the codebase pulls out a lot of stuff:
/var/www/openemr/contrib/util/import_mi2xml.php:      '',                           // providerID
/var/www/openemr/library/clinical_rules.php:        "WHERE providerID=?", array($provider) );
/var/www/openemr/library/amc.php:      "WHERE providerID=?", array($provider) );
/var/www/openemr/library/freeb/Procedure.class.php:                             $pkey = $results->fields['providerID'];
/var/www/openemr/library/patient.inc:function getProviderInfo($providerID = "%", $providers_only = true, $facility = '' ) {
/var/www/openemr/library/patient.inc:    if ($providerID == "%") {
/var/www/openemr/library/patient.inc:        mysql_real_escape_string($providerID) . "' " . $param1 . $param2;
/var/www/openemr/library/patient.inc:function getCalendarProviderInfo($providerID = "%", $providers_only = true) {
/var/www/openemr/library/patient.inc:    if ($providerID == "%") {
/var/www/openemr/library/patient.inc:        mysql_real_escape_string($providerID) . "' " . $param1;
/var/www/openemr/library/patient.inc:function getProviderName($providerID) {
/var/www/openemr/library/patient.inc:    $pi = getProviderInfo($providerID, 'any');
/var/www/openemr/library/patient.inc:function getPatientLnames($lname = "%", $given = "pid, id, lname, fname, mname, providerID, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS", $orderby = "lname ASC, fname ASC", $limit="all", $start="0")
/var/www/openemr/library/patient.inc:function getPatientId($pid = "%", $given = "pid, id, lname, fname, mname, providerID, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS", $orderby = "lname ASC, fname ASC", $limit="all", $start="0")
/var/www/openemr/library/patient.inc:function getByPatientDemographics($searchTerm = "%", $given = "pid, id, lname, fname, mname, providerID, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS", $orderby = "lname ASC, fname ASC", $limit="all", $start="0")
/var/www/openemr/library/patient.inc:  $given = "pid, id, lname, fname, mname, providerID, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS",
/var/www/openemr/library/patient.inc:// orig function getPatientPID($pid = "%", $given = "pid, id, lname, fname, mname, providerID, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS", $orderby = "lname ASC, fname ASC", $limit="all", $start="0")
/var/www/openemr/library/patient.inc:    $given = "pid, id, lname, fname, mname, providerID, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS";
/var/www/openemr/library/patient.inc:function getPatientSSN($ss = "%", $given = "pid, id, lname, fname, mname, providerID", $orderby = "lname ASC, fname ASC", $limit="all", $start="0")
/var/www/openemr/library/patient.inc:function getPatientPhone($phone = "%", $given = "pid, id, lname, fname, mname, providerID", $orderby = "lname ASC, fname ASC", $limit="all", $start="0")
/var/www/openemr/library/patient.inc:                $providerID = "",
/var/www/openemr/library/patient.inc:        providerID = '$providerID',
/var/www/openemr/library/custom_template/custom_template.php:                                            if($row['providerID']){
/var/www/openemr/library/custom_template/custom_template.php:                                                $val=sqlQuery("SELECT CONCAT(lname,',',fname) AS name FROM users WHERE id='".$row['providerID']."'");
/var/www/openemr/library/classes/Patient.class.php:                     $res = sqlQuery("SELECT providerID,fname,lname,mname ".
/var/www/openemr/library/classes/Patient.class.php:                             $this->provider = new Provider($res['providerID']);
/var/www/openemr/library/Claim.class.php:      $this->patient_data['providerID'] : $provider_id;
/var/www/openemr/custom/export_labworks.php:  "p.pubpid, p.fname, p.mname, p.lname, p.DOB, p.providerID, " .
/var/www/openemr/custom/export_labworks.php: if ($row['providerID']) {
/var/www/openemr/custom/export_labworks.php:  $query .= " AND id = " . $row['providerID'];
/var/www/openemr/custom/import_xml.php:   $olddata['providerID'],
/var/www/openemr/custom/export_xml.php:  "p.pubpid, p.fname, p.mname, p.lname, p.DOB, p.providerID, " .
/var/www/openemr/custom/export_xml.php: if ($row['providerID']) {
/var/www/openemr/custom/export_xml.php:  $query .= " AND id = " . $row['providerID'];
/var/www/openemr/interface/new/new_patient_save.php:    "", // providerID
/var/www/openemr/interface/reports/collections_report.php:      "LEFT OUTER JOIN users AS u ON u.id = p.providerID " .
/var/www/openemr/interface/reports/collections_report.php:        "LEFT OUTER JOIN users AS u ON u.id = pd.providerID " .
/var/www/openemr/interface/patient_file/pos_checkout.php:  $patdata = getPatientData($patient_id, 'fname,mname,lname,pubpid,street,city,state,postal_code,providerID');
/var/www/openemr/interface/patient_file/pos_checkout.php:      } else if (isset($patdata['providerID'])){
/var/www/openemr/interface/patient_file/pos_checkout.php:        $encprovider = $patdata['providerID'];
/var/www/openemr/interface/patient_file/encounter/cash_receipt.php: $titleres = getPatientData($pid, "fname,lname,providerID");
/var/www/openemr/interface/patient_file/encounter/cash_receipt.php: //$provider = getProviderName($titleres['providerID']);
/var/www/openemr/interface/patient_file/report/print_custom_report.php: $titleres = getPatientData($pid, "fname,lname,providerID");
/var/www/openemr/interface/patient_file/report/print_custom_report.php: //$provider = getProviderName($titleres['providerID']);
/var/www/openemr/interface/patient_file/report/custom_report.php:  $titleres = getPatientData($pid, "fname,lname,providerID");
/var/www/openemr/interface/patient_file/report/custom_report.php:  $titleres = getPatientData($pid, "fname,lname,providerID,DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS");
/var/www/openemr/interface/main/calendar/find_patient.php:    $iterproviderid = $iter['providerID'];
/var/www/openemr/interface/main/calendar/modules/PostCalendar/pnuserapi.php:  if(!empty($providerID)) { $ruserid = $providerID; }
/var/www/openemr/interface/main/calendar/modules/PostCalendar/pnuserapi.php:        $a = array('start'=>$start_date,'end'=>$end_date,'s_keywords'=>$s_keywords,'s_category'=>$s_category,'s_topic'=>$s_topic,'viewtype'=>$viewtype, "sort" => "pc_startTime ASC, a.pc_duration ASC ",'providerID' => $providerID, 'provider_id' => $provider_id);
/var/www/openemr/interface/main/calendar/modules/PostCalendar/pnuser.php:                'end'=>$sdate, 'stime' => $stime, 'etime' => $etime,'providerID'=>$event_userid,
/var/www/openemr/interface/main/authorizations/authorizations.php:    $providerID = sqlFetchArray(sqlStatement(
/var/www/openemr/interface/main/authorizations/authorizations.php:      "select providerID from patient_data where pid=?", array($ppid) ));
/var/www/openemr/interface/main/authorizations/authorizations.php:    $userID=$providerID{"providerID"};
/var/www/openemr/interface/main/authorizations/authorizations.php:      "select lname from users where id = ?", array($name['providerID']) ));
It appears on first glance on above 'providerID' grep that this is being used in cases as the referring provider and as the assigned provider ID.


Proposal (these are just some quick thoughts to start discussion on implementing a solution):
  • Create a new 'referrer_providerID' sql column
  • Fix codebase for referral code to use this
  • On upgrade, simply copy over the providerID to this field (note, the same data will then be in both for the upgraders, which is the safest way to implement in upgrades)
Awaiting Developer to fully analyze and implement this.

Security

Security Vulnerability Assessment and Fixing

This project is active and has been moved to its own wiki tracking page at Codebase Security.
Awaiting Developers to continue implementing this project.


Specialties

Mental Health

Seems to be a very large demand for this.
Awaiting Developer to fully analyze and implement this.