| 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))
 | 
|---|