| 1 | RORUPD04 ;HCIOFO/SG - PROCESSING OF THE LAB DATA  ; 12/8/05 8:20am | 
|---|
| 2 | ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006 | 
|---|
| 3 | ; | 
|---|
| 4 | Q | 
|---|
| 5 | ; | 
|---|
| 6 | ;***** CHECKS AN INDICATOR CONDITION | 
|---|
| 7 | ; | 
|---|
| 8 | ; LSI           Indicator (internal value) | 
|---|
| 9 | ; VAL           Indicated value | 
|---|
| 10 | ; .RESULT(      Result value | 
|---|
| 11 | ;   "RH")       Reference high | 
|---|
| 12 | ;   "RL")       Reference low | 
|---|
| 13 | ; | 
|---|
| 14 | ; Return Values: | 
|---|
| 15 | ;        0  False | 
|---|
| 16 | ;       >0  True | 
|---|
| 17 | ; | 
|---|
| 18 | CHKIND(LSI,VAL,RESULT) ; | 
|---|
| 19 | S RESULT=$$UP^XLFSTR(RESULT) | 
|---|
| 20 | ;--- Reference Range | 
|---|
| 21 | I LSI=1  D  Q LSI | 
|---|
| 22 | . I $G(RESULT("RL"))'=""  Q:RESULT<RESULT("RL") | 
|---|
| 23 | . I $G(RESULT("RH"))'=""  Q:RESULT>RESULT("RH") | 
|---|
| 24 | . S LSI=0 | 
|---|
| 25 | ;--- Positive Result | 
|---|
| 26 | I LSI=6  S VAL=0  D  Q VAL | 
|---|
| 27 | . I (RESULT="P")!(RESULT="R")  S VAL=1  Q | 
|---|
| 28 | . I RESULT'["POS",RESULT'["REA",RESULT'["DETEC"  Q | 
|---|
| 29 | . I RESULT'["NEG",RESULT'["NO",RESULT'["IND"  S VAL=1 | 
|---|
| 30 | ;--- Compare to the value | 
|---|
| 31 | Q:VAL="" 0 | 
|---|
| 32 | I LSI=3  Q (RESULT>VAL) | 
|---|
| 33 | I LSI=4  Q (RESULT<VAL) | 
|---|
| 34 | S VAL=$$UP^XLFSTR(VAL) | 
|---|
| 35 | I LSI=2  Q (RESULT[VAL) | 
|---|
| 36 | I LSI=5  Q (RESULT=VAL) | 
|---|
| 37 | Q 0 | 
|---|
| 38 | ; | 
|---|
| 39 | ;***** PROCESSING OF THE 'LAB DATA' FILE | 
|---|
| 40 | ; | 
|---|
| 41 | ; UPDSTART      Date of the earliest update (DO NOT pass by | 
|---|
| 42 | ;               reference) | 
|---|
| 43 | ; PATIEN        Patient IEN | 
|---|
| 44 | ; | 
|---|
| 45 | ; Return values: | 
|---|
| 46 | ;       <0  Error code | 
|---|
| 47 | ;        0  Continue processing of the current patient | 
|---|
| 48 | ;        1  Stop processing | 
|---|
| 49 | ; | 
|---|
| 50 | LAB(UPDSTART,PATIEN) ; | 
|---|
| 51 | N RORFILE       ; File number | 
|---|
| 52 | ; | 
|---|
| 53 | N DM,DSEND,LABIENS,RC,RORLAB,TMP | 
|---|
| 54 | S RORFILE=63,DSEND=RORUPD("DSEND") | 
|---|
| 55 | K RORVALS("LS") | 
|---|
| 56 | ;--- If the start date is more than 60 days in the past, results | 
|---|
| 57 | ;    should be loaded using collection dates. Otherwise, dates of | 
|---|
| 58 | ;--- the results are used). | 
|---|
| 59 | S DM=$S($$FMDIFF^XLFDT(DT,UPDSTART)>60:"^CD",1:"^RAD") | 
|---|
| 60 | ;--- Check the event references if the events are enabled | 
|---|
| 61 | I $G(RORUPD("FLAGS"))["E"  D  Q:RC'>0 RC | 
|---|
| 62 | . S RC=$$GET^RORUPP02(PATIEN,1,.UPDSTART,.DSEND) | 
|---|
| 63 | . ;--- If dates have been modified according to the event references, | 
|---|
| 64 | . ;--- they are the collection dates/times. | 
|---|
| 65 | . S:RC>1 UPDSTART=UPDSTART\1,DSEND=$$FMADD^XLFDT(DSEND\1,1),DM="^CD" | 
|---|
| 66 | ;--- | 
|---|
| 67 | S TMP=$$LABREF^RORUTL18(PATIEN)  Q:TMP'>0 TMP | 
|---|
| 68 | S LABIENS=TMP_",",RC=0 | 
|---|
| 69 | ; | 
|---|
| 70 | S RORLAB=$$ALLOC^RORTMP()  D  D FREE^RORTMP(RORLAB) | 
|---|
| 71 | . ;--- Load the Lab results | 
|---|
| 72 | . S RC=$$LABRSLTS^RORUTL02(PATIEN,UPDSTART_DM,DSEND_DM,RORLAB) | 
|---|
| 73 | . I RC<0  D INCEC^RORUPDUT(.RC)  Q | 
|---|
| 74 | . ;--- Process the results | 
|---|
| 75 | . Q:$$RESULTS(PATIEN,RORLAB)<0 | 
|---|
| 76 | . ;--- Load necessary data elements | 
|---|
| 77 | . I $D(RORUPD("SR",RORFILE,"F"))>1  D  I TMP<0  D INCEC^RORUPDUT()  Q | 
|---|
| 78 | . . S TMP=$$LOAD(LABIENS) | 
|---|
| 79 | . ;--- Apply "before" rules | 
|---|
| 80 | . S RC=$$APLRULES^RORUPDUT(RORFILE,LABIENS,"B") | 
|---|
| 81 | . I RC  D INCEC^RORUPDUT(.RC)  Q | 
|---|
| 82 | . ;--- Apply "after" rules | 
|---|
| 83 | . S RC=$$APLRULES^RORUPDUT(RORFILE,LABIENS,"A") | 
|---|
| 84 | . I RC  D INCEC^RORUPDUT(.RC)  Q | 
|---|
| 85 | ; | 
|---|
| 86 | D CLRDES^RORUPDUT(RORFILE) | 
|---|
| 87 | Q RC | 
|---|
| 88 | ; | 
|---|
| 89 | ;***** LOAD DATA ELEMENTS | 
|---|
| 90 | ; | 
|---|
| 91 | ; IENS          IENS of the current record | 
|---|
| 92 | ; | 
|---|
| 93 | ; Return values: | 
|---|
| 94 | ;       <0  Error code | 
|---|
| 95 | ;        0  Ok | 
|---|
| 96 | ; | 
|---|
| 97 | LOAD(IENS) ; | 
|---|
| 98 | N RC  S RC=0 | 
|---|
| 99 | ;--- API #1 | 
|---|
| 100 | I $D(RORUPD("SR",RORFILE,"F",1))  D  Q:RC<0 RC | 
|---|
| 101 | . S RC=$$LOADFLDS^RORUPDUT(RORFILE,IENS) | 
|---|
| 102 | ;--- API #2 | 
|---|
| 103 | Q 0 | 
|---|
| 104 | ; | 
|---|
| 105 | ;***** EXTRACTS PROPER RESULT CODE FROM THE OBSERVATION ID | 
|---|
| 106 | ; | 
|---|
| 107 | ; OID           Observation ID in HL7 format | 
|---|
| 108 | ; CS            HL7 component separator | 
|---|
| 109 | ; | 
|---|
| 110 | ; Return values: | 
|---|
| 111 | ;           Lab result code (see the LA7SC parameter of | 
|---|
| 112 | ;           the GCPR^LA7QRY entry point) | 
|---|
| 113 | ;             ^1: Result code | 
|---|
| 114 | ;             ^2: Coding system ("LN" or "NLT") | 
|---|
| 115 | ;           Or an empty string if coding system is unknown or there | 
|---|
| 116 | ;           are no active search indicators exist for this code. | 
|---|
| 117 | ; | 
|---|
| 118 | RESCODE(OID,CS) ; | 
|---|
| 119 | N CODE,I,RESCODE,TYPE | 
|---|
| 120 | S RESCODE="" | 
|---|
| 121 | F I=1,4  D  Q:RESCODE'="" | 
|---|
| 122 | . S CODE=$P(OID,CS,I),TYPE=$P(OID,CS,I+2)             Q:CODE="" | 
|---|
| 123 | . S TYPE=$S(TYPE="LN":"LN",TYPE="99VA64":"NLT",1:"")  Q:TYPE="" | 
|---|
| 124 | . ;--- Check if the search indicators exist for this code | 
|---|
| 125 | . S RESCODE=CODE_U_TYPE | 
|---|
| 126 | . S:$D(@RORUPDPI@("LS",RESCODE))<10 RESCODE="" | 
|---|
| 127 | Q RESCODE | 
|---|
| 128 | ; | 
|---|
| 129 | ;***** LOADS AND PROCESSES RESULTS OF THE TESTS | 
|---|
| 130 | ; | 
|---|
| 131 | ; PATIEN        Patient IEN | 
|---|
| 132 | ; ROR8LAB       Closed root of the HL7 message created by GCPR^LA7QRY | 
|---|
| 133 | ; | 
|---|
| 134 | ; Return values: | 
|---|
| 135 | ;       <0  Error code | 
|---|
| 136 | ;        0  Ok | 
|---|
| 137 | ; | 
|---|
| 138 | RESULTS(PATIEN,ROR8LAB) ; | 
|---|
| 139 | N CS,DATE,FS,I,ISEG,LOCATION,LSIEN,LSNODE,RC,RESCODE,RESVAL,RORHL,SEG,SEGTYPE,TMP | 
|---|
| 140 | S ISEG="",RC=0 | 
|---|
| 141 | F  S ISEG=$O(@ROR8LAB@(ISEG))  Q:ISEG=""  D  Q:RC<0 | 
|---|
| 142 | . S SEG=$G(@ROR8LAB@(ISEG)) | 
|---|
| 143 | . ;--- Extract separators from the MSH segment | 
|---|
| 144 | . I $E(SEG,1,3)="MSH"  D  Q | 
|---|
| 145 | . . S (RORHL("FS"),FS)=$E(SEG,4),TMP=$P(SEG,FS,2) | 
|---|
| 146 | . . S CS=$E(TMP,1) | 
|---|
| 147 | . ;--- Skip all segments except OBX | 
|---|
| 148 | . S SEGTYPE=$P(SEG,FS) | 
|---|
| 149 | . Q:SEGTYPE'="OBX" | 
|---|
| 150 | . ;--- Get lab result code | 
|---|
| 151 | . S RESCODE=$$RESCODE($P(SEG,FS,4),CS)  Q:RESCODE="" | 
|---|
| 152 | . ;--- Load the full segment | 
|---|
| 153 | . D LOADSEG^RORHL7A(.SEG,$NA(@ROR8LAB@(ISEG))) | 
|---|
| 154 | . ;--- Get the result data | 
|---|
| 155 | . S RESVAL=$G(SEG(5)),TMP=$G(SEG(7)) | 
|---|
| 156 | . S RESVAL("RL")=$P(TMP,"-",1) ; Reference Low | 
|---|
| 157 | . S RESVAL("RH")=$P(TMP,"-",2) ; Reference High | 
|---|
| 158 | . S DATE=$$HL7TFM^XLFDT($G(SEG(14)),"L")\1 | 
|---|
| 159 | . ;--- Analyze the result | 
|---|
| 160 | . K LOCATION | 
|---|
| 161 | . S LSNODE=$NA(@RORUPDPI@("LS",RESCODE)) | 
|---|
| 162 | . S LSIEN="" | 
|---|
| 163 | . F  S LSIEN=$O(@LSNODE@(LSIEN))  Q:LSIEN=""  D  Q:RC<0 | 
|---|
| 164 | . . S I="",RC=0 | 
|---|
| 165 | . . F  S I=$O(@LSNODE@(LSIEN,I))  Q:I=""  D  Q:RC | 
|---|
| 166 | . . . S TMP=$G(@LSNODE@(LSIEN,I)) | 
|---|
| 167 | . . . S RC=$$CHKIND(+TMP,$P(TMP,U,2),.RESVAL) | 
|---|
| 168 | . . Q:RC'>0 | 
|---|
| 169 | . . S TMP=+$G(RORVALS("LS",LSIEN)) | 
|---|
| 170 | . . I TMP  Q:(DATE'>0)!(DATE'<TMP) | 
|---|
| 171 | . . S:'$D(LOCATION) LOCATION=$$IEN^XUAF4($P($G(SEG(15)),CS)) | 
|---|
| 172 | . . S RORVALS("LS",LSIEN)=DATE_U_LOCATION | 
|---|
| 173 | ;--- | 
|---|
| 174 | Q $S(RC<0:RC,1:0) | 
|---|
| 175 | ; | 
|---|
| 176 | ;***** IMPLEMENTATION OF THE SELECTION RULE | 
|---|
| 177 | ; | 
|---|
| 178 | ; LSIEN         Lab Search IEN | 
|---|
| 179 | ; | 
|---|
| 180 | ; Return values: | 
|---|
| 181 | ;        0  Skip the patient | 
|---|
| 182 | ;        1  Add the patient | 
|---|
| 183 | ; | 
|---|
| 184 | RULE(LSIEN) ; | 
|---|
| 185 | Q:'$D(RORVALS("LS",LSIEN)) 0 | 
|---|
| 186 | N DATE,LOC,SRDT | 
|---|
| 187 | S DATE=+$G(RORVALS("LS",LSIEN)) | 
|---|
| 188 | D:DATE>0 | 
|---|
| 189 | . S LOC=$P($G(RORVALS("LS",LSIEN)),U,2) | 
|---|
| 190 | . S SRDT=$$GETVAL^RORUPDUT("ROR SRDT") | 
|---|
| 191 | . I (DATE<SRDT)!(SRDT'>0)  D  Q | 
|---|
| 192 | . . S RORVALS("SV","ROR SRDT")=DATE | 
|---|
| 193 | . . S RORVALS("SV","ROR SRLOC")=LOC | 
|---|
| 194 | . I DATE=SRDT  D:$$GETVAL^RORUPDUT("ROR SRLOC")=""  Q | 
|---|
| 195 | . . S RORVALS("SV","ROR SRLOC")=LOC | 
|---|
| 196 | Q 1 | 
|---|