MU2 certification support (smoking and clinical terms), final revision.
authorbradymiller <bradymiller@users.sourceforge.net>
Sat, 22 Dec 2012 21:57:32 +0000 (22 13:57 -0800)
committerbradymiller <bradymiller@users.sourceforge.net>
Fri, 28 Dec 2012 07:53:23 +0000 (27 23:53 -0800)
 -Support for MU2 requirements for smoking status
 -Support for broad SNOMED clinical terms
   -A new code type was added to support this
 -Support for Clinical Term Code(s) mapping in Administration->Lists
 -Added ability to import the SNOMED US extension pack
   -The size of the code columns in codes table was increased to
    support these longer SNOMED codes.

custom/code_types.inc.php
interface/code_systems/list_installed.php
interface/code_systems/list_staged.php
interface/code_systems/snomed_howto.php
interface/code_systems/standard_tables_manage.php
interface/patient_file/history/history_full.php
interface/super/edit_list.php
library/standard_tables_capture.inc
sql/4_1_1-to-4_1_2_upgrade.sql
sql/database.sql
version.php

index 17c98bc..5874458 100644 (file)
@@ -27,6 +27,8 @@
  *             4 for storing codes in external ICD9 Diagnosis tables
  *             5 for storing codes in external ICD9 Procedure/Service tables
  *             6 for storing codes in external ICD10 Procedure/Service tables
+ *             7 for storing codes in external SNOMED Clinical Term tables
+ *  term     - 1 if this code type is used as a clinical term
  *  </pre>
  *
  * Copyright (C) 2006-2010 Rod Roark <rod@sunsetsystems.com>
@@ -68,6 +70,7 @@ while ($ctrow = sqlFetchArray($ctres)) {
     'external'=> $ctrow['ct_external'],
     'claim' => $ctrow['ct_claim'],
     'proc' => $ctrow['ct_proc'],
+    'term' => $ctrow['ct_term']
   );
   if ($default_search_type === '') $default_search_type = $ctrow['ct_key'];
 }
@@ -85,6 +88,7 @@ $cd_external_options = array(
   '6' => xl('ICD10 Procedure/Service'),
   '2' => xl('SNOMED (RF1) Diagnosis'),
   '3' => xl('SNOMED (RF2) Diagnosis'),
+  '7' => xl('SNOMED Clinical Term')
 );
 
 /**
@@ -158,7 +162,7 @@ function convert_type_id_to_key($id) {
  * as 1) an array and as 2) a comma-separated lists that has been
  * process by urlencode() in order to place into URL  address safely.
  *
- * @param  string       $category       category of code types('diagnosis' or 'procedure')
+ * @param  string       $category       category of code types('diagnosis', 'procedure' or 'clinical_term')
  * @param  string       $return_format  format or returned code types ('array' or 'csv')
  * @return string/array
  */
@@ -180,6 +184,11 @@ function collect_codetypes($category,$return_format="array") {
     array_push($return,$ct_key);
    }
   }
+  else if ($category == "clinical_term") {
+   if ($ct_arr['term']) {
+    array_push($return,$ct_key);
+   }
+  }
   else {
    //return nothing since no supported category was chosen
   }
@@ -316,7 +325,16 @@ function code_set_search($form_code_type,$search_term="",$count=false,$active=tr
     $res = sqlStatement($query,$sql_bind_array);
    }
   }
-  else if ($code_types[$form_code_type]['external'] == 2 ) { // Search from SNOMED (RF1) diagnosis codeset tables
+  else if ($code_types[$form_code_type]['external'] == 2 || $code_types[$form_code_type]['external'] == 7) {
+   // Search from SNOMED (RF1) diagnosis codeset tables OR Search from SNOMED (RF1) clinical terms codeset tables
+   if ($code_types[$form_code_type]['external'] == 2) {
+     // Search from SNOMED (RF1) diagnosis codeset tables
+     $diagnosis_sql_specific = " ref.FullySpecifiedName LIKE '%(disorder)' ";
+   }
+   else {
+     // Search from SNOMED (RF1) clinical terms codeset tables
+     $diagnosis_sql_specific = " 1=1 ";
+   }
    if ($active) {
     // Only filter for active codes
     // If there is no entry in codes sql table, then default to active
@@ -336,11 +354,11 @@ function code_set_search($form_code_type,$search_term="",$count=false,$active=tr
              "ON ref.ConceptId = c.code AND c.code_type = ? ";
     array_push($sql_bind_array,$code_types[$form_code_type]['id']);
     if ($return_only_one) {
-     $query .= "WHERE (ref.ConceptId = ? AND ref.FullySpecifiedName LIKE '%(disorder)') $active_query $query_filter_elements ";
+     $query .= "WHERE (ref.ConceptId = ? AND $diagnosis_sql_specific) $active_query $query_filter_elements ";
      array_push($sql_bind_array,$search_term);
     }
     else {
-     $query .= "WHERE ((ref.FullySpecifiedName LIKE ? OR ref.ConceptId LIKE ?) AND ref.FullySpecifiedName LIKE '%(disorder)') $active_query $query_filter_elements ";
+     $query .= "WHERE ((ref.FullySpecifiedName LIKE ? OR ref.ConceptId LIKE ?) AND $diagnosis_sql_specific ) $active_query $query_filter_elements ";
      array_push($sql_bind_array,"%".$search_term."%","%".$search_term."%");
     }
     $query .= "AND ref.ConceptStatus = 0 " .
@@ -511,7 +529,8 @@ function lookup_code_descriptions($codes) {
           }
         }
       }
-      else if ($code_types[$codetype]['external'] == 2) { // Collect from SNOMED (RF1) Diagnosis codeset tables
+      else if ($code_types[$codetype]['external'] == 2 || $code_types[$codetype]['external'] == 7) {
+        // Collect from SNOMED (RF1) Diagnosis codeset tables OR Search from SNOMED (RF1) clinical terms codeset tables 
         // Ensure the sct_concepts sql table exists
         $check_table = sqlQuery("SHOW TABLES LIKE 'sct_concepts'");
         if ( !(empty($check_table)) ) {
index 476a2f1..11540e0 100644 (file)
@@ -45,17 +45,30 @@ if (!acl_check('admin', 'super')) {
 $db = isset($_GET['db']) ? $_GET['db'] : '0';
 
 // For now, only order by the revision_date. When have different formats of a code type (such as WHO vs CMS for ICD10 or different languages for SNOMED, then will incorporate this field)
-$sqlReturn = sqlQuery("SELECT DATE_FORMAT(`revision_date`,'%Y-%m-%d') as `revision_date`, `revision_version`, `name` FROM `standardized_tables_track` WHERE upper(`name`) = ? ORDER BY `revision_date` DESC", array($db) );
+$rez = sqlStatement("SELECT DATE_FORMAT(`revision_date`,'%Y-%m-%d') as `revision_date`, `revision_version`, `name` FROM `standardized_tables_track` WHERE upper(`name`) = ? ORDER BY `revision_date` DESC", array($db) );
+for($iter=0; $row=sqlFetchArray($rez); $iter++) {
+    $sqlReturn[$iter]=$row;
+}
+
 if (empty($sqlReturn)) {
 ?>
     <div class="stg"><?php echo xlt("Not installed"); ?></div>
 <?php
 } else {
-       $notInstalled = 0;
+    if ($sqlReturn[0]['name'] == 'SNOMED' && $sqlReturn[0]['revision_version'] == 'US Extension') {
+        // If using the SNOMED US Extension package, then show the preceding SNOMED International Package information first
+?>
+        <div class="atr"><?php echo xlt("Name") . ": " . text($sqlReturn[1]['name']); ?> </div>
+        <div class="atr"><?php echo xlt("Revision") . ": " . text($sqlReturn[1]['revision_version']); ?> </div>
+        <div class="atr"><?php echo xlt("Release Date") . ": " . text($sqlReturn[1]['revision_date']); ?> </div>
+        <br>
+<?php
+    }
+    // Always show the first item of query results
 ?>
-    <div class="atr"><?php echo xlt("Name") . ": " . text($sqlReturn['name']); ?> </div>
-    <div class="atr"><?php echo xlt("Revision") . ": " . text($sqlReturn['revision_version']); ?> </div>
-    <div class="atr"><?php echo xlt("Release Date") . ": " . text($sqlReturn['revision_date']); ?> </div>
+    <div class="atr"><?php echo xlt("Name") . ": " . text($sqlReturn[0]['name']); ?> </div>
+    <div class="atr"><?php echo xlt("Revision") . ": " . text($sqlReturn[0]['revision_version']); ?> </div>
+    <div class="atr"><?php echo xlt("Release Date") . ": " . text($sqlReturn[0]['revision_date']); ?> </div>
 <?php
 }
 ?>
index 3097eef..36ab2f0 100644 (file)
@@ -148,6 +148,18 @@ if (is_dir($mainPATH)) {
                     array_push($revisions,$temp_date);
                    $supported_file = 1;
                 }
+                else if (preg_match("/SnomedCT_Release_US[0-9]*_([0-9]{8}).zip/",$file,$matches)) {
+
+                    // This is the SNOMED US extension pack which can only be installed on top
+                    // of a International SNOMED version.
+                    // Hard code this version SNOMED feed to be US Extension
+                    //
+                    $version = "US Extension";
+                    $date_release = substr($matches[1],0,4)."-".substr($matches[1],4,-2)."-".substr($matches[1],6);
+                    $temp_date = array('date'=>$date_release, 'version'=>$version, 'path'=>$mainPATH."/".$matches[0]);
+                    array_push($revisions,$temp_date);
+                    $supported_file = 1;
+                }
                 else {
                     // nothing
                 }
@@ -206,6 +218,15 @@ if ($supported_file === 1) {
 
   $success_flag=1;
 
+  // Only allow 1 staged revision for the SNOMED and RXNORM imports
+  if ( ($db=="SNOMED" || $db=="RXNORM") && (count($revisions) > 1) ) {
+    ?>
+      <div class="error_msg"><?php echo xlt("The number of staged files is incorrect. Only place the file that you wish to install/upgrade to."); ?></div>
+      <div class="stg msg"><?php echo xlt("Follow these instructions for installing or upgrading the following database") . ": " . text($db); ?><span class="msg" id="<?php echo attr($db); ?>_instrmsg">?</span></div>
+    <?php
+    $success_flag=0;
+  }
+
   // Ensure all release dates and revisions are the same for multiple file imports
   // and collect the date and revision. Also collect a checksum and path.
   $file_revision_date = '';
@@ -219,7 +240,7 @@ if ($supported_file === 1) {
       $file_revision_date = $temp_file_revision_date;
     }
     else {
-      if ($file_revision_date != $temp_file_revision_date) {
+      if ( ($file_revision_date != $temp_file_revision_date) && ($success_flag === 1) ) {
         ?>
         <div class="error_msg"><?php echo xlt("The staged files release dates are not all from the same release."); ?></div>
         <div class="stg msg"><?php echo xlt("Follow these instructions for installing or upgrading the following database") . ": " . text($db); ?><span class="msg" id="<?php echo attr($db); ?>_instrmsg">?</span></div>
@@ -233,7 +254,7 @@ if ($supported_file === 1) {
       $file_revision = $temp_file_revision;
     }
     else {
-      if ($file_revision != $temp_file_revision) {
+      if ( ($file_revision != $temp_file_revision) && ($success_flag === 1) ) {
         ?>
         <div class="error_msg"><?php echo xlt("The staged files revisions are not all from the same release."); ?></div>
         <div class="stg msg"><?php echo xlt("Follow these instructions for installing or upgrading the following database") . ": " . text($db); ?><span class="msg" id="<?php echo attr($db); ?>_instrmsg">?</span></div>
@@ -279,6 +300,18 @@ if ($supported_file === 1) {
             <div class="error_msg"><?php echo xlt("The installed version is a more recent version than the staged files."); ?></div>
             <div class="stg msg"><?php echo xlt("Follow these instructions for installing or upgrading the following database") . ": " . text($db); ?><span class="msg" id="<?php echo attr($db); ?>_instrmsg">?</span></div>
             <?php
+         } else if ($current_name=="SNOMED" && $current_version=="US Extension" && $file_revision=="US Extension") {
+            // The Staged US Extension SNOMED package has already been installed
+            ?>
+            <div class="error_msg"><?php echo xlt("The compatible staged US Extension SNOMED package has already been installed."); ?></div>
+            <div class="stg msg"><?php echo xlt("Follow these instructions for installing or upgrading the following database") . ": " . text($db); ?><span class="msg" id="<?php echo attr($db); ?>_instrmsg">?</span></div>
+            <?php
+         } else if ( ($current_name=="SNOMED" && $file_revision=="US Extension") && (strtotime($current_revision." +4 month") < strtotime($file_revision_date)) ) {
+            // The Staged US Extension SNOMED file is not compatible with the current SNOMED International Package (ie. the International package is outdated)
+            ?>
+            <div class="error_msg"><?php echo xlt("The installed International SNOMED version is out of date and not compatible with the staged US Extension SNOMED file."); ?></div>
+            <div class="stg msg"><?php echo xlt("Follow these instructions for installing or upgrading the following database") . ": " . text($db); ?><span class="msg" id="<?php echo attr($db); ?>_instrmsg">?</span></div>
+            <?php
         } else {
            ?>
            <div class="stg"><?php echo text(basename($file_revision_path)); ?> <?php echo xlt("is a more recent version of the following database") . ": " . text($db); ?></div>
@@ -286,9 +319,19 @@ if ($supported_file === 1) {
            $action=xl("UPGRADE");
         }
     } else {
-        if (count($files_array) > 0) {
+        if ($db=="SNOMED" && $file_revision=="US Extension") {
+            // The Staged US Extension SNOMED package can not be installed by itself (it is done after the international package is installed)
+            ?>
+            <div class="error_msg"><?php echo xlt("The staged US Extension SNOMED package can not be installed until after the International SNOMED package has been installed."); ?></div>
+            <div class="stg msg"><?php echo xlt("Follow these instructions for installing or upgrading the following database") . ": " . text($db); ?><span class="msg" id="<?php echo attr($db); ?>_instrmsg">?</span></div>
+            <?php
+        }
+        else if (count($files_array) > 0) {
            $action=xl("INSTALL");
         }
+        else {
+            //do nothing
+        }
     }
     if (strlen($action) > 0) {
     ?>
index b63ec41..a633dee 100644 (file)
@@ -41,5 +41,6 @@ require_once("../../interface/globals.php");
 </li>
 </ol>
 <h5 class="error_msg"><?php echo xlt("NOTE: Only the Biannual International Snomed Release is currently supported"); ?></h5>
+<h5 class="error_msg"><?php echo "(" . xlt("Additionally, the corresponding US Snomed Extension Package can be imported separately after installing the International Snomed Release") . ")"; ?></h5>
 </p>
 </div>
index cdf0869..532adc1 100644 (file)
@@ -76,10 +76,19 @@ if ($db == 'RXNORM') {
         exit;
     }
 } else if ( $db == 'SNOMED') {
-    if (!snomed_import()) {
-        echo htmlspecialchars( xl('ERROR: Unable to load the file into the database.'), ENT_NOQUOTES)."<br>";
-        temp_dir_cleanup($db);
-        exit;
+    if ($version == "US Extension") {
+        if (!snomed_import(TRUE)) {
+            echo htmlspecialchars( xl('ERROR: Unable to load the file into the database.'), ENT_NOQUOTES)."<br>";
+            temp_dir_cleanup($db);
+            exit;
+         }
+    }
+    else { //$version is not "US Extension"
+        if (!snomed_import(FALSE)) {
+            echo htmlspecialchars( xl('ERROR: Unable to load the file into the database.'), ENT_NOQUOTES)."<br>";
+            temp_dir_cleanup($db);
+            exit;
+         }
     }
 }
 else { //$db == 'ICD'
index e074dd3..d05f365 100644 (file)
@@ -92,7 +92,7 @@ function submit_history() {
 //function for selecting the smoking status in radio button based on the selection of drop down list.
 function radioChange(rbutton)
 {
-     if (rbutton == 1 || rbutton == 2)
+     if (rbutton == 1 || rbutton == 2 || rbutton == 15 || rbutton == 16)
      {
      document.getElementById('radio_tobacco[current]').checked = true;
      }
index 3c1ba3d..dac3eae 100644 (file)
@@ -60,9 +60,10 @@ if ($_POST['formaction']=='save' && $list_id) {
         $ct_external = formTrim($iter['ct_external']) + 0;
         $ct_claim = empty($iter['ct_claim']) ? 0 : 1;
         $ct_proc = empty($iter['ct_proc']) ? 0 : 1;
+        $ct_term = empty($iter['ct_term']) ? 0 : 1;
         if (strlen($ct_key) > 0 && $ct_id > 0) {
           sqlInsert("INSERT INTO code_types ( " .
-            "ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_mask, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc " .
+            "ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_mask, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term " .
             ") VALUES ( "   .
             "'$ct_key' , " .
             "'$ct_id'  , " .
@@ -78,7 +79,8 @@ if ($_POST['formaction']=='save' && $list_id) {
             "'$ct_label', " .
             "'$ct_external', " .
             "'$ct_claim', " .
-            "'$ct_proc' " .
+            "'$ct_proc', " .
+            "'$ct_term' " .
             ")");
         }
       }
@@ -104,7 +106,7 @@ if ($_POST['formaction']=='save' && $list_id) {
               if ($list_id == 'lbfnames' && substr($id,0,3) != 'LBF')
                 $id = "LBF$id";
               sqlInsert("INSERT INTO list_options ( " .
-                "list_id, option_id, title, seq, is_default, option_value, mapping, notes " .
+                "list_id, option_id, title, seq, is_default, option_value, mapping, notes, codes " .
                 ") VALUES ( " .
                 "'$list_id', "                       .
                 "'" . $id                        . "', " .
@@ -113,7 +115,8 @@ if ($_POST['formaction']=='save' && $list_id) {
                 "'" . formTrim($iter['default']) . "', " .
                 "'" . $value                     . "', " .
                 "'" . formTrim($iter['mapping']) . "', " .
-                "'" . formTrim($iter['notes'])   . "' "  .
+                "'" . formTrim($iter['notes'])   . "', " .
+                "'" . formTrim($iter['codes'])   . "' " .
                 ")");
             }
         }
@@ -180,7 +183,7 @@ function getCodeDescriptions($codes) {
 
 // Write one option line to the form.
 //
-function writeOptionLine($option_id, $title, $seq, $default, $value, $mapping='', $notes='') {
+function writeOptionLine($option_id, $title, $seq, $default, $value, $mapping='', $notes='', $codes='') {
   global $opt_line_no, $list_id;
   ++$opt_line_no;
   $bgcolor = "#" . (($opt_line_no & 1) ? "ddddff" : "ffdddd");
@@ -290,6 +293,12 @@ function writeOptionLine($option_id, $title, $seq, $default, $value, $mapping=''
       htmlspecialchars($notes, ENT_QUOTES) . "' size='25' maxlength='255' class='optin' />";
   echo "</td>\n";
 
+  echo "  <td align='center' class='optcell'>";
+  echo "<input type='text' name='opt[$opt_line_no][codes]' title='" .
+      xla('Clinical Term Code(s)') ."' value='" .
+      htmlspecialchars($codes, ENT_QUOTES) . "' onclick='select_clin_term_code(this)' size='25' maxlength='255' class='optin' />";
+  echo "</td>\n";
+
   echo " </tr>\n";
 }
 
@@ -402,6 +411,8 @@ function writeCTLine($ct_array) {
     xl('Is this a procedure/service type?'));
   echo ctGenCBox($opt_line_no, $ct_array, 'ct_diag',
     xl('Is this a diagnosis type?'));
+  echo ctGenCBox($opt_line_no, $ct_array, 'ct_term',
+    xl('Is this a Clinical Term code type?'));
   // Show the external code types selector
   $value_ct_external = isset($ct_array['ct_external']) ? $ct_array['ct_external'] : '';
   echo "  <td title='" . xla('Is this using external sql tables? If it is, then choose the format.') . "' align='center' class='optcell'>";
@@ -513,9 +524,23 @@ function select_code(lino) {
  return false;
 }
 
+// This invokes the find-code popup.
+// For CVX/immunization code administration.
+function sel_cvxcode(e) {
+ current_sel_name = e.name;
+ dlgopen('../patient_file/encounter/find_code_popup.php?codetype=CVX', '_blank', 500, 400);
+}
+
+// This invokes the find-code popup.
+// For CVX/immunization code administration.
+function select_clin_term_code(e) {
+ current_sel_clin_term = e.name;
+ dlgopen('../patient_file/encounter/find_code_popup.php?codetype=<?php echo attr(collect_codetypes("clinical_term","csv")) ?>', '_blank', 500, 400);
+}
+
 // This is for callback by the find-code popup.
 function set_related(codetype, code, selector, codedesc) {
- if (typeof(current_sel_name) == 'undefined')
+ if (typeof(current_sel_name) == 'undefined' && typeof(current_sel_clin_term) == 'undefined')
  {
  // Coming from Fee Sheet edit
   var f = document.forms[0];
@@ -539,8 +564,20 @@ function set_related(codetype, code, selector, codedesc) {
   }
   displayCodes(current_lino);
  }
- else
- {
+ else if (typeof(current_sel_name) == 'undefined') {
+  // Coming from the Clinical Terms Code(s) edit
+     var f = document.forms[0][current_sel_clin_term];
+     var s = f.value;
+     if (code) {
+         if (s.length > 0) s += ';';
+         s += codetype + ':' + code;
+     }
+     else {
+         s = '';
+     }
+     f.value = s;
+ }
+ else {
   // Coming from Immunizations edit
      var f = document.forms[0][current_sel_name];
      var s = f.value;
@@ -585,12 +622,6 @@ function mysubmit() {
  f.submit();
 }
 
-// This invokes the find-code popup.
-function sel_cvxcode(e) {
- current_sel_name = e.name;
- dlgopen('../patient_file/encounter/find_code_popup.php?codetype=CVX', '_blank', 500, 400);
-}
-
 </script>
 
 </head>
@@ -661,6 +692,7 @@ while ($row = sqlFetchArray($res)) {
   <td><b><?php xl('Hide'        ,'e'); ?></b></td>
   <td><b><?php xl('Procedure'   ,'e'); ?></b></td>
   <td><b><?php xl('Diagnosis'   ,'e'); ?></b></td>
+  <td><b><?php xl('Clinical Term','e'); ?></b></td>
   <td><b><?php xl('External'    ,'e'); ?></b></td>
 <?php } else { ?>
   <td title=<?php xl('Click to edit','e','\'','\''); ?>><b><?php  xl('ID','e'); ?></b></td>
@@ -686,7 +718,8 @@ while ($row = sqlFetchArray($res)) {
 <?php } if ($GLOBALS['ippf_specific']) { ?>
   <td><b><?php xl('Global ID','e'); ?></b></td>
 <?php } ?>
-  <td><b><?php xl('Notes','e'); ?></b></td>    
+  <td><b><?php xl('Notes','e'); ?></b></td>
+  <td><b><?php xl('Code(s)','e'); ?></b></td>
 <?php } // end not fee sheet ?>
  </tr>
 
@@ -719,7 +752,7 @@ if ($list_id) {
     while ($row = sqlFetchArray($res)) {
       writeOptionLine($row['option_id'], $row['title'], $row['seq'],
         $row['is_default'], $row['option_value'], $row['mapping'],
-        $row['notes']);
+        $row['notes'],$row['codes']);
     }
     for ($i = 0; $i < 3; ++$i) {
       writeOptionLine('', '', '', '', 0);
index 7ec3daf..b38739f 100644 (file)
@@ -144,7 +144,7 @@ function rxnorm_import($is_windows_flag) {
 }
 
 // Function to import SNOMED tables
-function snomed_import() {
+function snomed_import($us_extension=FALSE) {
 
     // set up array
     $table_array_for_snomed=array(
@@ -189,9 +189,12 @@ function snomed_import() {
     $dir=str_replace('\\','/',$dir);
 
     // executing the create statement for tables, these are defined in snomed_capture.inc file
-    foreach($table_array_for_snomed as $val){
-        if(trim($val)!=''){
-            sqlStatement($val);
+    // this is skipped if the US extension is being added
+    if (!$us_extension) {
+        foreach($table_array_for_snomed as $val){
+            if(trim($val)!=''){
+                sqlStatement($val);
+            }
         }
     }
 
index 36f49d2..077f58b 100644 (file)
@@ -82,3 +82,41 @@ ALTER TABLE `documents_legal_detail` ADD COLUMN `dld_patient_comments` text COMM
 #IfMissingColumn documents_legal_master dlm_upload_type
 ALTER TABLE `documents_legal_master` ADD COLUMN `dlm_upload_type` tinyint(4) DEFAULT '0' COMMENT '0-Provider Uploaded,1-Patient Uploaded';
 #EndIf
+
+#IfMissingColumn list_options codes
+ALTER TABLE `list_options` ADD COLUMN `codes` varchar(255) NOT NULL DEFAULT '';
+UPDATE list_options SET `codes`='SNOMED-CT:449868002' WHERE list_id='smoking_status' AND option_id='1' AND title='Current every day smoker';
+UPDATE list_options SET `codes`='SNOMED-CT:428041000124106' WHERE list_id='smoking_status' AND option_id='2' AND title='Current some day smoker';
+UPDATE list_options SET `codes`='SNOMED-CT:8517006' WHERE list_id='smoking_status' AND option_id='3' AND title='Former smoker';
+UPDATE list_options SET `codes`='SNOMED-CT:266919005' WHERE list_id='smoking_status' AND option_id='4' AND title='Never smoker';
+UPDATE list_options SET `codes`='SNOMED-CT:77176002' WHERE list_id='smoking_status' AND option_id='5' AND title='Smoker, current status unknown';
+UPDATE list_options SET `codes`='SNOMED-CT:266927001' WHERE list_id='smoking_status' AND option_id='9' AND title='Unknown if ever smoked';
+#EndIf
+
+#IfNotRow2Dx2 list_options list_id smoking_status option_id 15 title Heavy tobacco smoker
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '15', 'Heavy tobacco smoker', 70, 0, "SNOMED-CT:428071000124103");
+#EndIf
+
+#IfNotRow2Dx2 list_options list_id smoking_status option_id 16 title Light tobacco smoker
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '16', 'Light tobacco smoker', 80, 0, "SNOMED-CT:428061000124105");
+#EndIf
+
+#IfMissingColumn code_types ct_term
+ALTER TABLE `code_types` ADD COLUMN ct_term tinyint(1) NOT NULL default 0 COMMENT '1 if this is a clinical term';
+#EndIf
+
+#IfNotRow code_types ct_key SNOMED-CT
+DROP TABLE IF EXISTS `temp_table_one`;
+CREATE TABLE `temp_table_one` (
+  `id` int(11) NOT NULL DEFAULT '0',
+  `seq` int(11) NOT NULL DEFAULT '0'
+) ENGINE=MyISAM ;
+INSERT INTO `temp_table_one` (`id`, `seq`) VALUES ( IF( ((SELECT MAX(`ct_id`) FROM `code_types`)>=100), ((SELECT MAX(`ct_id`) FROM `code_types`) + 1), 100 ) , IF( ((SELECT MAX(`ct_seq`) FROM `code_types`)>=100), ((SELECT MAX(`ct_seq`) FROM `code_types`) + 1), 100 )  );
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('SNOMED-CT' , (SELECT MAX(`id`) FROM `temp_table_one`), (SELECT MAX(`seq`) FROM `temp_table_one`), 0, '', 0, 0, 0, 0, 0, 'SNOMED Clinical Term', 7, 0, 0, 1);
+DROP TABLE `temp_table_one`;
+#EndIf
+
+#IfNotColumnType codes code varchar(25)
+ALTER TABLE `codes` CHANGE `code` `code` varchar(25) NOT NULL default '';
+#EndIf
+
index 73f7152..9e04b7e 100644 (file)
@@ -488,7 +488,7 @@ CREATE TABLE `codes` (
   `id` int(11) NOT NULL auto_increment,
   `code_text` varchar(255) NOT NULL default '',
   `code_text_short` varchar(24) NOT NULL default '',
-  `code` varchar(10) NOT NULL default '',
+  `code` varchar(25) NOT NULL default '',
   `code_type` smallint(6) default NULL,
   `modifier` varchar(12) NOT NULL default '',
   `units` tinyint(3) default NULL,
@@ -2542,6 +2542,7 @@ CREATE TABLE `list_options` (
   `option_value` float NOT NULL default '0',
   `mapping` varchar(31) NOT NULL DEFAULT '',
   `notes` varchar(255) NOT NULL DEFAULT '',
+  `codes` varchar(255) NOT NULL DEFAULT '',
   PRIMARY KEY  (`list_id`,`option_id`)
 ) ENGINE=MyISAM;
 
@@ -5423,19 +5424,21 @@ CREATE TABLE code_types (
   ct_external tinyint(1) NOT NULL default 0 COMMENT '0 if stored codes in codes tables, 1 or greater if codes stored in external tables',
   ct_claim tinyint(1) NOT NULL default 0 COMMENT '1 if this is used in claims',
   ct_proc tinyint(1) NOT NULL default 0 COMMENT '1 if this is a procedure type',
+  ct_term tinyint(1) NOT NULL default 0 COMMENT '1 if this is a clinical term',
   PRIMARY KEY (ct_key)
 ) ENGINE=MyISAM;
 
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('ICD9' , 2, 1, 0, ''    , 0, 0, 0, 1, 1, 'ICD9 Diagnosis', 4, 1, 0);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('CPT4' , 1, 2, 12, 'ICD9', 1, 0, 0, 0, 1, 'CPT4 Procedure/Service', 0, 1, 1);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('HCPCS', 3, 3, 12, 'ICD9', 1, 0, 0, 0, 1, 'HCPCS Procedure/Service', 0, 1, 1);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('CVX'  , 100, 100, 0, '', 0, 0, 1, 0, 1, 'CVX Immunization', 0, 0, 0);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('DSMIV' , 101, 101, 0, '', 0, 0, 0, 1, 0, 'DSMIV Diagnosis', 0, 1, 0);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('ICD10' , 102, 102, 0, '', 0, 0, 0, 1, 0, 'ICD10 Diagnosis', 1, 1, 0);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('SNOMED' , 103, 103, 0, '', 0, 0, 0, 1, 0, 'SNOMED Diagnosis', 2, 1, 0);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('CPTII' , 104, 104, 0, 'ICD9', 0, 0, 0, 0, 0, 'CPTII Performance Measures', 0, 1, 0);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('ICD9-SG' , 105, 105, 12, 'ICD9', 1, 0, 0, 0, 0, 'ICD9 Procedure/Service', 5, 1, 1);
-INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc ) VALUES ('ICD10-PCS' , 106, 106, 12, 'ICD10', 1, 0, 0, 0, 0, 'ICD10 Procedure/Service', 6, 1, 1);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('ICD9' , 2, 1, 0, ''    , 0, 0, 0, 1, 1, 'ICD9 Diagnosis', 4, 1, 0, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('CPT4' , 1, 2, 12, 'ICD9', 1, 0, 0, 0, 1, 'CPT4 Procedure/Service', 0, 1, 1, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('HCPCS', 3, 3, 12, 'ICD9', 1, 0, 0, 0, 1, 'HCPCS Procedure/Service', 0, 1, 1, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('CVX'  , 100, 100, 0, '', 0, 0, 1, 0, 1, 'CVX Immunization', 0, 0, 0, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('DSMIV' , 101, 101, 0, '', 0, 0, 0, 1, 0, 'DSMIV Diagnosis', 0, 1, 0, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('ICD10' , 102, 102, 0, '', 0, 0, 0, 1, 0, 'ICD10 Diagnosis', 1, 1, 0, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('SNOMED' , 103, 103, 0, '', 0, 0, 0, 1, 0, 'SNOMED Diagnosis', 2, 1, 0, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('CPTII' , 104, 104, 0, 'ICD9', 0, 0, 0, 0, 0, 'CPTII Performance Measures', 0, 1, 0, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('ICD9-SG' , 105, 105, 12, 'ICD9', 1, 0, 0, 0, 0, 'ICD9 Procedure/Service', 5, 1, 1, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('ICD10-PCS' , 106, 106, 12, 'ICD10', 1, 0, 0, 0, 0, 'ICD10 Procedure/Service', 6, 1, 1, 0);
+INSERT INTO code_types (ct_key, ct_id, ct_seq, ct_mod, ct_just, ct_fee, ct_rel, ct_nofs, ct_diag, ct_active, ct_label, ct_external, ct_claim, ct_proc, ct_term ) VALUES ('SNOMED-CT' , 107, 107, 0, '', 0, 0, 0, 0, 0, 'SNOMED Clinical Term', 7, 0, 0, 1);
 
 INSERT INTO list_options ( list_id, option_id, title, seq ) VALUES ('lists', 'code_types', 'Code Types', 1);
 
@@ -5445,12 +5448,14 @@ INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES (
 INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('disclosure_type', 'disclosure-healthcareoperations', 'Health Care Operations', 30, 0);
 
 INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('lists'   ,'smoking_status','Smoking Status', 1,0);
-INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('smoking_status', '1', 'Current every day smoker', 10, 0);
-INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('smoking_status', '2', 'Current some day smoker', 20, 0);
-INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('smoking_status', '3', 'Former smoker', 30, 0);
-INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('smoking_status', '4', 'Never smoker', 40, 0);
-INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('smoking_status', '5', 'Smoker, current status unknown', 50, 0);
-INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('smoking_status', '9', 'Unknown if ever smoked', 60, 0);
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '1', 'Current every day smoker', 10, 0, 'SNOMED-CT:449868002');
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '2', 'Current some day smoker', 20, 0, 'SNOMED-CT:428041000124106');
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '3', 'Former smoker', 30, 0, 'SNOMED-CT:8517006');
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '4', 'Never smoker', 40, 0, 'SNOMED-CT:266919005');
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '5', 'Smoker, current status unknown', 50, 0, 'SNOMED-CT:77176002');
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '9', 'Unknown if ever smoked', 60, 0, 'SNOMED-CT:266927001');
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '15', 'Heavy tobacco smoker', 70, 0, 'SNOMED-CT:428071000124103');
+INSERT INTO list_options ( list_id, option_id, title, seq, is_default, codes ) VALUES ('smoking_status', '16', 'Light tobacco smoker', 80, 0, 'SNOMED-CT:428061000124105');
 
 INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('lists'   ,'race','Race', 1,0);
 INSERT INTO list_options ( list_id, option_id, title, seq, is_default ) VALUES ('race', 'amer_ind_or_alaska_native', 'American Indian or Alaska Native', 10, 0);
index 695233f..fcd3456 100644 (file)
@@ -17,7 +17,7 @@ $v_realpatch = '0';
 // is a database change in the course of development.  It is used
 // internally to determine when a database upgrade is needed.
 //
-$v_database = 83;
+$v_database = 84;
 
 // Access control version identifier, this is to be incremented whenever there
 // is a access control change in the course of development.  It is used