| [613] | 1 | RORUTL02 ;HCIOFO/SG - UTILITIES  ; 8/25/05 10:20am | 
|---|
|  | 2 | ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006 | 
|---|
|  | 3 | ; | 
|---|
|  | 4 | ; This routine uses the following IAs: | 
|---|
|  | 5 | ; | 
|---|
|  | 6 | ; #2701         $$GETICN^MPIF001 Gets ICN (supported) | 
|---|
|  | 7 | ; #3556         $$GCPR^LA7QRY | 
|---|
|  | 8 | ; #3557         Access to the field .01 and x-ref "B" | 
|---|
|  | 9 | ;               of the file 95.3 | 
|---|
|  | 10 | ; #3646         $$EMPL^DGSEC4 | 
|---|
|  | 11 | ; #10035        Access to the field #.09 of the file #2 | 
|---|
|  | 12 | ; | 
|---|
|  | 13 | Q | 
|---|
|  | 14 | ; | 
|---|
|  | 15 | ;***** REMOVES THE INACTIVE REGISTRIES FROM THE LIST | 
|---|
|  | 16 | ; | 
|---|
|  | 17 | ; .REGLST(      A list of registry names (as subscripts) | 
|---|
|  | 18 | ;   RegName)    Registry IEN (output) | 
|---|
|  | 19 | ; | 
|---|
|  | 20 | ; Return values: | 
|---|
|  | 21 | ;       <0  Error code | 
|---|
|  | 22 | ;        0  Ok | 
|---|
|  | 23 | ; | 
|---|
|  | 24 | ; This function removes names of those registries that are | 
|---|
|  | 25 | ; inactive or cannot be updated for any other reasons from | 
|---|
|  | 26 | ; the list. It also associates registry IENs with the names | 
|---|
|  | 27 | ; of registries remaining on the list. | 
|---|
|  | 28 | ; | 
|---|
|  | 29 | ; Moreover, it records corresponding messages about skipped | 
|---|
|  | 30 | ; registries to the current open log. | 
|---|
|  | 31 | ; | 
|---|
|  | 32 | ARLST(REGLST) ; | 
|---|
|  | 33 | N INFO,RC,REGIEN,REGNAME,RORBUF,TMP  K DSTLST | 
|---|
|  | 34 | S REGNAME="",RC=0 | 
|---|
|  | 35 | F  S REGNAME=$O(REGLST(REGNAME))  Q:REGNAME=""  D  Q:RC<0 | 
|---|
|  | 36 | . S REGIEN=$$REGIEN(REGNAME,"@;11I;21.05I",.RORBUF) | 
|---|
|  | 37 | . ;--- Cannot find (or load) the registry parameters | 
|---|
|  | 38 | . I REGIEN'>0  D  Q | 
|---|
|  | 39 | . . D ERROR^RORERR(REGIEN,,REGNAME) | 
|---|
|  | 40 | . . K REGLST(REGNAME) | 
|---|
|  | 41 | . ;--- Check if the registry is marked as 'inactive' | 
|---|
|  | 42 | . I $G(RORBUF("DILIST","ID",1,11))  D  Q | 
|---|
|  | 43 | . . D ERROR^RORERR(-48,,,,REGNAME) | 
|---|
|  | 44 | . . K REGLST(REGNAME) | 
|---|
|  | 45 | . ;--- Check if the registry has not been populated | 
|---|
|  | 46 | . I '$G(RORBUF("DILIST","ID",1,21.05)),'$G(RORPARM("SETUP"))  D  Q | 
|---|
|  | 47 | . . D TEXT^RORTXT(7980000.02,.INFO) | 
|---|
|  | 48 | . . D ERROR^RORERR(-103,,.INFO,,REGNAME) | 
|---|
|  | 49 | . . K INFO,REGLST(REGNAME) | 
|---|
|  | 50 | . ;--- Store the registry IEN | 
|---|
|  | 51 | . S REGLST(REGNAME)=REGIEN | 
|---|
|  | 52 | Q RC | 
|---|
|  | 53 | ; | 
|---|
|  | 54 | ;***** RETURNS A FULL ICN OF THE PATIENT | 
|---|
|  | 55 | ; | 
|---|
|  | 56 | ; PTIEN         Patient IEN | 
|---|
|  | 57 | ; | 
|---|
|  | 58 | ; Return Values: | 
|---|
|  | 59 | ;       <0  Error code | 
|---|
|  | 60 | ;       ""  ICN has not been assigned | 
|---|
|  | 61 | ;       >0  Patient ICN | 
|---|
|  | 62 | ; | 
|---|
|  | 63 | ICN(PTIEN) ; | 
|---|
|  | 64 | N ICN,L,TMP | 
|---|
|  | 65 | S ICN=$$GETICN^MPIF001(PTIEN) | 
|---|
|  | 66 | I ICN'>0  D  Q "" | 
|---|
|  | 67 | . S TMP=$$ERROR^RORERR(-57,,$P(ICN,U,2),PTIEN,+ICN,"$$GETICN^MPIF001") | 
|---|
|  | 68 | ;--- Validate the checksum (just in case ;-) | 
|---|
|  | 69 | S L=$L($P(ICN,"V",2)) | 
|---|
|  | 70 | Q $S(L<6:$P(ICN,"V")_"V"_$E("000000",1,6-L)_$P(ICN,"V",2),1:ICN) | 
|---|
|  | 71 | ; | 
|---|
|  | 72 | ;***** LOADS THE LAB RESULTS | 
|---|
|  | 73 | ; | 
|---|
|  | 74 | ; PTIEN         Patient IEN | 
|---|
|  | 75 | ; | 
|---|
|  | 76 | ; SDT           Start date of the results | 
|---|
|  | 77 | ; EDT           End date of the results | 
|---|
|  | 78 | ; | 
|---|
|  | 79 | ; [ROR8DST]     Closed root of the destination array | 
|---|
|  | 80 | ;               (the ^TMP("RORTMP",$J) node, by default) | 
|---|
|  | 81 | ; | 
|---|
|  | 82 | ; Return values: | 
|---|
|  | 83 | ;       <0  Error code | 
|---|
|  | 84 | ;        0  Ok | 
|---|
|  | 85 | ; | 
|---|
|  | 86 | LABRSLTS(PTIEN,SDT,EDT,ROR8DST) ; | 
|---|
|  | 87 | N H7CH,RC,RORMSG,TMP | 
|---|
|  | 88 | S:$G(ROR8DST)="" ROR8DST=$NA(^TMP("RORTMP",$J)) | 
|---|
|  | 89 | K @ROR8DST | 
|---|
|  | 90 | I $D(RORLRC)<10  Q:$G(RORLRC)="" 0 | 
|---|
|  | 91 | ;--- Get the Patient ID (ICN or SSN) | 
|---|
|  | 92 | S PTID=$$PTID(PTIEN)  Q:PTID<0 PTID | 
|---|
|  | 93 | ;--- Get the Lab data | 
|---|
|  | 94 | S H7CH=$G(RORHL("FS"))_$G(RORHL("ECH")) | 
|---|
|  | 95 | S RC=$$GCPR^LA7QRY(PTID,SDT,EDT,.RORLRC,"*",.RORMSG,ROR8DST,H7CH) | 
|---|
|  | 96 | I RC="",$D(RORMSG)>1  D | 
|---|
|  | 97 | . N ERR,I,LST | 
|---|
|  | 98 | . S (ERR,LST)="" | 
|---|
|  | 99 | . F I=1:1  S ERR=$O(RORMSG(ERR))  Q:ERR=""  D | 
|---|
|  | 100 | . . S LST=LST_","_ERR,TMP=RORMSG(ERR) | 
|---|
|  | 101 | . . K RORMSG(ERR)  S RORMSG(I)=TMP | 
|---|
|  | 102 | . S LST=$P(LST,",",2,999)  Q:(LST=3)!(LST=99) | 
|---|
|  | 103 | . S RC=$$ERROR^RORERR(-27,,.RORMSG,PTIEN) | 
|---|
|  | 104 | Q $S(RC<0:RC,1:0) | 
|---|
|  | 105 | ; | 
|---|
|  | 106 | ;***** RETURNS THE LOINC CODE WITH THE CONTROL DIGIT | 
|---|
|  | 107 | ; | 
|---|
|  | 108 | ; LNCODE        LOINC code | 
|---|
|  | 109 | ; | 
|---|
|  | 110 | ; Besides adding a control digit to the LOINC code, the function | 
|---|
|  | 111 | ; checks the code against the LAB LOINC file (#95.3). | 
|---|
|  | 112 | ; | 
|---|
|  | 113 | ; Return values: | 
|---|
|  | 114 | ;       <0  Error code | 
|---|
|  | 115 | ;       >0  LOINC code with the control digit | 
|---|
|  | 116 | ; | 
|---|
|  | 117 | LNCODE(LNCODE) ; | 
|---|
|  | 118 | N RC,RORBUF,RORMSG | 
|---|
|  | 119 | D FIND^DIC(95.3,,"@;.01E","X",$P(LNCODE,"-"),2,"B",,,"RORBUF","RORMSG") | 
|---|
|  | 120 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,95.3) | 
|---|
|  | 121 | I $G(RORBUF("DILIST",0))<1  D  Q RC ; Non-existent code | 
|---|
|  | 122 | . S RC=$$ERROR^RORERR(-29,,,,LNCODE) | 
|---|
|  | 123 | I $G(RORBUF("DILIST",0))>1  D  Q RC ; Duplicate records | 
|---|
|  | 124 | . S RC=$$ERROR^RORERR(-30,,,,LNCODE) | 
|---|
|  | 125 | Q RORBUF("DILIST","ID",1,.01) | 
|---|
|  | 126 | ; | 
|---|
|  | 127 | ;***** LOCK/UNLOCK REGISTRIES BEING PROCESSED | 
|---|
|  | 128 | ; | 
|---|
|  | 129 | ; .REGLST       Reference to a local array containing registry names | 
|---|
|  | 130 | ;               as subscripts and optional registry IENs as values | 
|---|
|  | 131 | ; [MODE]        0 - Unlock (default), 1 - Lock | 
|---|
|  | 132 | ; [TO]          LOCK timeout (3 sec by defualt) | 
|---|
|  | 133 | ; [NAME]        Name of the process/task | 
|---|
|  | 134 | ; | 
|---|
|  | 135 | ; Return Values: | 
|---|
|  | 136 | ;       <0  Error code | 
|---|
|  | 137 | ;        0  Some of the registries has been locked by another job | 
|---|
|  | 138 | ;        1  Ok | 
|---|
|  | 139 | ; | 
|---|
|  | 140 | LOCKREG(REGLST,MODE,TO,NAME) ; | 
|---|
|  | 141 | Q:$D(REGLST)<10 1 | 
|---|
|  | 142 | N LOCKLST,RC,REGIEN,REGNAME | 
|---|
|  | 143 | S REGNAME="" | 
|---|
|  | 144 | F  S REGNAME=$O(REGLST(REGNAME))  Q:REGNAME=""  D  Q:REGIEN<0 | 
|---|
|  | 145 | . S REGIEN=+$G(REGLST(REGNAME)) | 
|---|
|  | 146 | . I REGIEN'>0  S REGIEN=$$REGIEN^RORUTL02(REGNAME)  Q:REGIEN'>0 | 
|---|
|  | 147 | . S LOCKLST(798.1,REGIEN_",")="" | 
|---|
|  | 148 | Q:$G(REGIEN)<0 REGIEN | 
|---|
|  | 149 | Q:$D(LOCKLST)<10 1 | 
|---|
|  | 150 | I $G(MODE)  D | 
|---|
|  | 151 | . S RC=$$LOCK^RORLOCK(.LOCKLST,,,+$G(TO,3),$G(NAME)) | 
|---|
|  | 152 | E  S RC=$$UNLOCK^RORLOCK(.LOCKLST) | 
|---|
|  | 153 | Q $S('RC:1,RC<0:RC,1:0) | 
|---|
|  | 154 | ; | 
|---|
|  | 155 | ;***** RETURNS A PATIENT ID (ICN OR SSN) | 
|---|
|  | 156 | ; | 
|---|
|  | 157 | ; PTIEN         Patient IEN | 
|---|
|  | 158 | ; | 
|---|
|  | 159 | ; Return Values: | 
|---|
|  | 160 | ;       <0  Error code | 
|---|
|  | 161 | ;       ""  Neither ICN nor SSN has been assigned | 
|---|
|  | 162 | ;       >0  Patient ICN (or SSN if ICN is not available) | 
|---|
|  | 163 | ; | 
|---|
|  | 164 | PTID(PTIEN) ; | 
|---|
|  | 165 | N L,PTID,RC,RORMSG | 
|---|
|  | 166 | S PTID=$$GETICN^MPIF001(PTIEN) | 
|---|
|  | 167 | I PTID>0  D  Q PTID | 
|---|
|  | 168 | . ;--- Validate the checksum (just in case ;-) | 
|---|
|  | 169 | . S L=$L($P(PTID,"V",2))  Q:L'<6 | 
|---|
|  | 170 | . ;S RC=$$ERROR^RORERR(-59,,,PTIEN) | 
|---|
|  | 171 | . S $P(PTID,"V",2)=$E("000000",1,6-L)_$P(PTID,"V",2) | 
|---|
|  | 172 | ;--- Get SSN if ICN is not available | 
|---|
|  | 173 | S PTID=$$GET1^DIQ(2,PTIEN_",",.09,,,"RORMSG") | 
|---|
|  | 174 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,PTIEN,2) | 
|---|
|  | 175 | Q PTID | 
|---|
|  | 176 | ; | 
|---|
|  | 177 | ;***** RETURNS IEN OF THE REGISTRY PARAMETERS | 
|---|
|  | 178 | ; | 
|---|
|  | 179 | ; REGNAME       Name of the registry | 
|---|
|  | 180 | ; [FIELDS]      List of fields (separated by semicolons) to load | 
|---|
|  | 181 | ; [.RORTRGT]    Reference to a local variable where field values will | 
|---|
|  | 182 | ;               be stored by the FIND^DIC call | 
|---|
|  | 183 | ; | 
|---|
|  | 184 | ; Return Values: | 
|---|
|  | 185 | ;       <0  Error code | 
|---|
|  | 186 | ;       >0  Registry parameters IEN | 
|---|
|  | 187 | ; | 
|---|
|  | 188 | REGIEN(REGNAME,FIELDS,RORTRGT) ; | 
|---|
|  | 189 | N RC,REGIEN,RORMSG  K RORTRGT | 
|---|
|  | 190 | D FIND^DIC(798.1,,"@;"_$G(FIELDS),"UX",REGNAME,2,"B",,,"RORTRGT","RORMSG") | 
|---|
|  | 191 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.1) | 
|---|
|  | 192 | S RC=+$G(RORTRGT("DILIST",0)) | 
|---|
|  | 193 | Q $S(RC<1:-1,RC>1:-2,1:+RORTRGT("DILIST",2,1)) | 
|---|
|  | 194 | ; | 
|---|
|  | 195 | ;***** RETURNS NUMBER OF RECORDS IN THE REGISTRY | 
|---|
|  | 196 | ; | 
|---|
|  | 197 | ; REGIEN        Registry IEN | 
|---|
|  | 198 | ; [.LOWIEN]     The smallest IEN will be returned via this parameter | 
|---|
|  | 199 | ; [.HIGHIEN]    The biggest IEN will be returned via this parameter | 
|---|
|  | 200 | ; | 
|---|
|  | 201 | ; Return Values: | 
|---|
|  | 202 | ;       <0  Error code | 
|---|
|  | 203 | ;        0  The registry is empty | 
|---|
|  | 204 | ;       >0  Number of records in the registry | 
|---|
|  | 205 | ; | 
|---|
|  | 206 | REGSIZE(REGIEN,LOWIEN,HIGHIEN) ; | 
|---|
|  | 207 | N I,NODE,NRE,RC,RORFDA,RORMSG | 
|---|
|  | 208 | S NODE=$NA(^RORDATA(798,"AC",REGIEN)) | 
|---|
|  | 209 | S LOWIEN=$O(@NODE@("")) | 
|---|
|  | 210 | S HIGHIEN=$O(@NODE@(""),-1) | 
|---|
|  | 211 | ;--- Get number of records from the parameters | 
|---|
|  | 212 | S NRE=$$GET1^DIQ(798.1,REGIEN_",",19.1,,,"RORMSG") | 
|---|
|  | 213 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.1,REGIEN) | 
|---|
|  | 214 | Q:NRE>0 NRE | 
|---|
|  | 215 | ;--- Count the records of the registry | 
|---|
|  | 216 | S I="",NRE=0 | 
|---|
|  | 217 | F  S I=$O(@NODE@(I))  Q:I=""  S NRE=NRE+1 | 
|---|
|  | 218 | ;--- Store the value in the parameters | 
|---|
|  | 219 | S RORFDA(798.1,REGIEN_",",19.1)=NRE | 
|---|
|  | 220 | D FILE^DIE("K","RORFDA","RORMSG") | 
|---|
|  | 221 | Q NRE | 
|---|
|  | 222 | ; | 
|---|
|  | 223 | ;***** CHECKS IF AN EMPLOYEE SHOULD BE SKIPPED | 
|---|
|  | 224 | ; | 
|---|
|  | 225 | ; PTIEN         Patient IEN | 
|---|
|  | 226 | ; | 
|---|
|  | 227 | ; [.]REGIEN     Registry IEN | 
|---|
|  | 228 | ; | 
|---|
|  | 229 | ;               If you are going to call this function for several | 
|---|
|  | 230 | ;               patients in a row (in a cycle), you can pass the | 
|---|
|  | 231 | ;               second parameter by reference. This will eliminate | 
|---|
|  | 232 | ;               repetitive access to the registry parameters (the | 
|---|
|  | 233 | ;               REGIEN("SE") node will be used as a "cache" for the | 
|---|
|  | 234 | ;               value of the EXCLUDE EMPLOYEES field). | 
|---|
|  | 235 | ; | 
|---|
|  | 236 | ; Return Values: | 
|---|
|  | 237 | ;        0  Patient can be added to the registry | 
|---|
|  | 238 | ;        1  Patient should be skipped | 
|---|
|  | 239 | ; | 
|---|
|  | 240 | ; The function checks if the patient is an employee and if he/she | 
|---|
|  | 241 | ; can be added to the registry (according to the value of the | 
|---|
|  | 242 | ; EXCLUDE EMPLOYEES field of the ROR REGISTRY PARAMETERS file). | 
|---|
|  | 243 | ; | 
|---|
|  | 244 | SKIPEMPL(PTIEN,REGIEN) ; | 
|---|
|  | 245 | Q:'$$EMPL^DGSEC4(PTIEN,"P") 0 | 
|---|
|  | 246 | S:'$D(REGIEN("SE")) REGIEN("SE")=+$P($G(^ROR(798.1,+REGIEN,0)),U,10) | 
|---|
|  | 247 | Q +REGIEN("SE") | 
|---|
|  | 248 | ; | 
|---|
|  | 249 | ;***** RETURNS IEN OF THE SELECTION RULE | 
|---|
|  | 250 | ; | 
|---|
|  | 251 | ; RULENAME      Name of the selection rule | 
|---|
|  | 252 | ; [FIELDS]      List of fields (separated by semicolons) to load | 
|---|
|  | 253 | ; [.RORTRGT]    Reference to a local variable where field values will | 
|---|
|  | 254 | ;               be stored by the FIND^DIC call. | 
|---|
|  | 255 | ; | 
|---|
|  | 256 | ; Return Values: | 
|---|
|  | 257 | ;       <0  Error code | 
|---|
|  | 258 | ;       >0  Selection rule IEN | 
|---|
|  | 259 | ; | 
|---|
|  | 260 | SRLIEN(RULENAME,FIELDS,RORTRGT) ; | 
|---|
|  | 261 | N RC,RULEIEN,RORMSG  K RORTRGT | 
|---|
|  | 262 | D FIND^DIC(798.2,,"@;"_$G(FIELDS),"X",RULENAME,2,"B",,,"RORTRGT","RORMSG") | 
|---|
|  | 263 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.2) | 
|---|
|  | 264 | S RC=+$G(RORTRGT("DILIST",0)) | 
|---|
|  | 265 | Q $S(RC<1:-3,RC>1:-4,1:+RORTRGT("DILIST",2,1)) | 
|---|