| 1 | RORUTL18 ;HCIOFO/SG - MISCELLANEOUS UTILITIES ; 4/4/07 1:19pm | 
|---|
| 2 | ;;1.5;CLINICAL CASE REGISTRIES;**2**;Feb 17, 2006;Build 6 | 
|---|
| 3 | ; | 
|---|
| 4 | ; This routine uses the following IA's: | 
|---|
| 5 | ; | 
|---|
| 6 | ; #10035        Access to the field #63 of the file #2 | 
|---|
| 7 | ; | 
|---|
| 8 | Q | 
|---|
| 9 | ; | 
|---|
| 10 | ;***** STRIPS NON-NUMERIC CHARACTERS FROM THE LAB RESULT VALUE | 
|---|
| 11 | ; | 
|---|
| 12 | ; VAL           Source value | 
|---|
| 13 | ; | 
|---|
| 14 | CLRNMVAL(VAL) ; | 
|---|
| 15 | Q $TR(VAL," <>,") | 
|---|
| 16 | ; | 
|---|
| 17 | ;***** CHECKS FOR 'CONFIRMED' STATUS | 
|---|
| 18 | ; | 
|---|
| 19 | ; IEN           IEN of the registry record (in file #798) | 
|---|
| 20 | ; | 
|---|
| 21 | ; Return Values: | 
|---|
| 22 | ;        0  Not confirmed | 
|---|
| 23 | ;       >0  Confirmation date/time | 
|---|
| 24 | ; | 
|---|
| 25 | CONFDT(IEN) ; | 
|---|
| 26 | N CONF  S CONF=$P($G(^RORDATA(798,+IEN,0)),U,4,5) | 
|---|
| 27 | Q $S('$P(CONF,U,2):$P(CONF,U),1:0) | 
|---|
| 28 | ; | 
|---|
| 29 | ;***** DATE RANGE COMPARISON FUNCTIONS | 
|---|
| 30 | DTMAX(DT1,DT2) ; | 
|---|
| 31 | I DT1>0  Q $S(DT2>DT1:DT2,1:DT1) | 
|---|
| 32 | Q $S(DT2>0:DT2,1:0) | 
|---|
| 33 | ; | 
|---|
| 34 | DTMIN(DT1,DT2) ; | 
|---|
| 35 | I DT1>0  Q $S(DT2'>0:DT1,DT2<DT1:DT2,1:DT1) | 
|---|
| 36 | Q $S(DT2>0:DT2,1:0) | 
|---|
| 37 | ; | 
|---|
| 38 | ;***** RETURNS THE INSTITUTION IEN FOR THE HOSPITAL LOCATION | 
|---|
| 39 | ; | 
|---|
| 40 | ; IEN44         IEN in the HOSPITAL LOCATION file (#44) | 
|---|
| 41 | ; | 
|---|
| 42 | ; Return Values: | 
|---|
| 43 | ;       <0  Error | 
|---|
| 44 | ;       ""  Location has no corresponding institution | 
|---|
| 45 | ;       >0  Institution IEN | 
|---|
| 46 | ; | 
|---|
| 47 | IEN4(IEN44) ; | 
|---|
| 48 | N IEN4,RC,RORMSG | 
|---|
| 49 | Q:$G(IEN44)'>0 "" | 
|---|
| 50 | S IEN4=+$$GET1^DIQ(44,IEN44_",",3,"I",,"RORMSG") | 
|---|
| 51 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,44,IEN44_",") | 
|---|
| 52 | Q $S(IEN4>0:IEN4,1:"") | 
|---|
| 53 | ; | 
|---|
| 54 | ;***** RETURNS A LAB REFERENCE (IEN IN 'LAB DATA') FOR THE PATIENT | 
|---|
| 55 | ; | 
|---|
| 56 | ; PTIEN         Patient IEN | 
|---|
| 57 | ; | 
|---|
| 58 | ; Return values: | 
|---|
| 59 | ;       <0  Error code | 
|---|
| 60 | ;        0  No lab data | 
|---|
| 61 | ;       >0  IEN of the record in LAB DATA file | 
|---|
| 62 | ; | 
|---|
| 63 | LABREF(PTIEN) ; | 
|---|
| 64 | N LABREF,RORMSG | 
|---|
| 65 | Q:$G(PTIEN)'>0 0 | 
|---|
| 66 | Q:$$MERGED(PTIEN) 0 | 
|---|
| 67 | S LABREF=+$$GET1^DIQ(2,PTIEN_",",63,"I",,"RORMSG") | 
|---|
| 68 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,PTIEN,2,PTIEN_",") | 
|---|
| 69 | Q LABREF | 
|---|
| 70 | ; | 
|---|
| 71 | ;***** RETURNS THE NEW DFN OF A MERGED PATIENT RECORD | 
|---|
| 72 | ; | 
|---|
| 73 | ; DFN           Patient IEN | 
|---|
| 74 | ; | 
|---|
| 75 | ; Return values: | 
|---|
| 76 | ;        0  The patient has not been merged | 
|---|
| 77 | ;       >0  New DFN | 
|---|
| 78 | ; | 
|---|
| 79 | MERGED(DFN) ; | 
|---|
| 80 | N NEWDFN | 
|---|
| 81 | F  S DFN=+$G(^DPT(+DFN,-9))  Q:DFN'>0  S NEWDFN=DFN | 
|---|
| 82 | Q +$G(NEWDFN) | 
|---|
| 83 | ; | 
|---|
| 84 | ;***** SENDS THE CPRS-COMPATIBLE INFORMATIONAL ALERT | 
|---|
| 85 | ; | 
|---|
| 86 | ; MSG           Text of the alert message.  The text is truncated | 
|---|
| 87 | ;               to 50 characters and '^' are replaced with '~'. | 
|---|
| 88 | ; | 
|---|
| 89 | ; [DFN]         Patient IEN | 
|---|
| 90 | ; | 
|---|
| 91 | ; [.XQA]        List of addressees.  By default, the | 
|---|
| 92 | ;               alert is sent to the current user. | 
|---|
| 93 | ; | 
|---|
| 94 | ORALERT(MSG,DFN,XQA) ; | 
|---|
| 95 | N LAST4,NAME,VA,VADM,VAHOW,VAROOT,XQADATA,XQAID,XQAMSG,XQAROU | 
|---|
| 96 | S XQAMSG="",XQAID="ROR,," | 
|---|
| 97 | I $G(DFN)>0  D | 
|---|
| 98 | . D DEM^VADPT | 
|---|
| 99 | . S NAME=$E($G(VADM(1)),1,9)         ; Patient name | 
|---|
| 100 | . S LAST4=$E($P($G(VADM(2)),U),6,9)  ; Last 4 of SSN | 
|---|
| 101 | . S XQAMSG=$$LJ^XLFSTR(NAME_" ("_$E(NAME,1)_LAST4_"):",19) | 
|---|
| 102 | . S $P(XQAID,",",2)=+DFN | 
|---|
| 103 | S XQAMSG=XQAMSG_$TR(MSG,"^","~") | 
|---|
| 104 | S:$L(XQAMSG)>70 $E(XQAMSG,68,999)="..." | 
|---|
| 105 | I $D(XQA)<10  Q:$G(DUZ)'>0  S XQA(+DUZ)="" | 
|---|
| 106 | D SETUP^XQALERT | 
|---|
| 107 | Q | 
|---|
| 108 | ; | 
|---|
| 109 | ;***** CHECKS FOR 'PENDING' STATUS | 
|---|
| 110 | ; | 
|---|
| 111 | ; IEN           IEN of the registry record (in file #798) | 
|---|
| 112 | ; | 
|---|
| 113 | ; Return Values: | 
|---|
| 114 | ;        0  Non-pending | 
|---|
| 115 | ;        1  Pending patient | 
|---|
| 116 | ; | 
|---|
| 117 | PENDING(IEN) ; | 
|---|
| 118 | Q ($P($G(^RORDATA(798,+IEN,0)),U,5)=4) | 
|---|
| 119 | ; | 
|---|
| 120 | ;***** EMULATES $QUERY WITH 'DIRECTION' PARAMETER | 
|---|
| 121 | ; | 
|---|
| 122 | ; NODE          Closed root of a node | 
|---|
| 123 | ; | 
|---|
| 124 | ; [DIR]          Direction: | 
|---|
| 125 | ;                  $G(DIR)'<0  forward | 
|---|
| 126 | ;                  DIR<0       backward | 
|---|
| 127 | ; | 
|---|
| 128 | Q(NODE,DIR) ; | 
|---|
| 129 | Q:$G(DIR)'<0 $Q(@NODE) | 
|---|
| 130 | N I,DN,PI,TMP | 
|---|
| 131 | S TMP=$QL(NODE)  Q:TMP'>0 "" | 
|---|
| 132 | S I=$QS(NODE,TMP),NODE=$NA(@NODE,TMP-1) | 
|---|
| 133 | S PI="" | 
|---|
| 134 | F  S I=$O(@NODE@(I),-1)  Q:I=""  D  Q:PI'="" | 
|---|
| 135 | . S DN=$D(@NODE@(I)) | 
|---|
| 136 | . I DN#10  S PI=$NA(@NODE@(I))  Q | 
|---|
| 137 | . S:DN>1 PI=$$Q($NA(@NODE@(I,"")),-1) | 
|---|
| 138 | Q PI | 
|---|
| 139 | ; | 
|---|
| 140 | ;***** COUNTS THE REGISTRY PATIENTS | 
|---|
| 141 | ; | 
|---|
| 142 | ; .REGLST       Reference to a local array containing registry | 
|---|
| 143 | ;               names as the subscripts and optional registry IENs | 
|---|
| 144 | ;               as the values. | 
|---|
| 145 | ; | 
|---|
| 146 | ; [FLAGS]       Flags (can be combined) | 
|---|
| 147 | ;                 A  Skip non-active patients | 
|---|
| 148 | ;                 S  Skip patients marked as "Do not Send" | 
|---|
| 149 | ; | 
|---|
| 150 | ; [ROR8DST]     Closed root of the global node that will contain a | 
|---|
| 151 | ;               list of patients. By default ($G(ROR8DST)=""), the | 
|---|
| 152 | ;               ^TMP("RORUTL18",$J) global node is used internally | 
|---|
| 153 | ;               (it is deleted before exiting the function). | 
|---|
| 154 | ; @ROR8DST@( | 
|---|
| 155 | ;  PatIEN, | 
|---|
| 156 | ;    RegIEN)    Registry Record IEN | 
|---|
| 157 | ; | 
|---|
| 158 | ; Return Values: | 
|---|
| 159 | ;       <0  Error code | 
|---|
| 160 | ;        0  All provided registries are empty | 
|---|
| 161 | ;       >0  Number of unique patients | 
|---|
| 162 | ; | 
|---|
| 163 | REGPTCNT(REGLST,FLAGS,ROR8DST) ; | 
|---|
| 164 | N CNT,IEN,NODE,PLKILL,PTIEN,REGIEN,REGNAME | 
|---|
| 165 | S:$G(ROR8DST)="" ROR8DST=$NA(^TMP("RORUTL18",$J)),PLKILL=1 | 
|---|
| 166 | S FLAGS=$G(FLAGS),NODE=$$ROOT^DILFD(798,"",1),CNT=0 | 
|---|
| 167 | K @ROR8DST | 
|---|
| 168 | ;--- Build a list of unique patients and count them | 
|---|
| 169 | S REGNAME="" | 
|---|
| 170 | F  S REGNAME=$O(REGLST(REGNAME))  Q:REGNAME=""  D | 
|---|
| 171 | . ;--- Get the registry IEN | 
|---|
| 172 | . S REGIEN=+$G(REGLST(REGNAME)) | 
|---|
| 173 | . I REGIEN'>0  D  Q:REGIEN'>0 | 
|---|
| 174 | . . S REGIEN=$$REGIEN^RORUTL02(REGNAME) | 
|---|
| 175 | . ;--- Count the registry patients | 
|---|
| 176 | . S IEN=0 | 
|---|
| 177 | . F  S IEN=$O(@NODE@("AC",REGIEN,IEN))  Q:IEN'>0  D | 
|---|
| 178 | . . I FLAGS["A"  Q:'$$ACTIVE^RORDD(IEN) | 
|---|
| 179 | . . I FLAGS["S"  Q:$P($G(^RORDATA(798,IEN,2)),U,4) | 
|---|
| 180 | . . S PTIEN=$$PTIEN^RORUTL01(IEN)  Q:PTIEN'>0 | 
|---|
| 181 | . . I '$D(@ROR8DST@(PTIEN))  D  S CNT=CNT+1 | 
|---|
| 182 | . . . S @ROR8DST@(PTIEN,REGIEN)=IEN | 
|---|
| 183 | ;--- Cleanup | 
|---|
| 184 | K:$G(PLKILL) @ROR8DST | 
|---|
| 185 | Q CNT | 
|---|
| 186 | ; | 
|---|
| 187 | ;***** SELECTS A REGISTRY DESCRIPTOR IN THE FILE #798.1 | 
|---|
| 188 | ; | 
|---|
| 189 | ; [.REGNAME]    Registry name is returned via this parameter | 
|---|
| 190 | ; | 
|---|
| 191 | ; Return Values: | 
|---|
| 192 | ;       <0  Error code | 
|---|
| 193 | ;       ""  Timeout, "^" entered, or an error in ^DIC | 
|---|
| 194 | ;        0  There are no records in the file #798.1 | 
|---|
| 195 | ;       >0  IEN of the selected registry | 
|---|
| 196 | ; | 
|---|
| 197 | SELREG(REGNAME) ; | 
|---|
| 198 | N DA,DIC,DLAYGO,DTOUT,DUOUT,RC,RORBUF,RORMSG,X,Y | 
|---|
| 199 | S REGNAME="" | 
|---|
| 200 | ;--- If there are less than two records, do not ask a user | 
|---|
| 201 | D LIST^DIC(798.1,,"@;.01E",,2,,,"B",,,"RORBUF","RORMSG") | 
|---|
| 202 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.1) | 
|---|
| 203 | I $G(RORBUF("DILIST",0))<2  D  Q +$G(RORBUF("DILIST",2,1)) | 
|---|
| 204 | . S REGNAME=$G(RORBUF("DILIST","ID",1,.01)) | 
|---|
| 205 | ;--- Select a registry | 
|---|
| 206 | S DIC=798.1,DIC(0)="AENQZ" | 
|---|
| 207 | S DIC("A")="Select a Registry: " | 
|---|
| 208 | D ^DIC | 
|---|
| 209 | S:Y>0 REGNAME=Y(0,0) | 
|---|
| 210 | Q $S($D(DTOUT)!$D(DUOUT):"",Y<0:"",1:+Y) | 
|---|
| 211 | ; | 
|---|
| 212 | ;***** RETURNS THE CLINIC'S STOP CODE | 
|---|
| 213 | ; | 
|---|
| 214 | ; CLIEN         Clinic IEN | 
|---|
| 215 | ; | 
|---|
| 216 | ; Return Values: | 
|---|
| 217 | ;       <0  Error code | 
|---|
| 218 | ;       ""  No stop code | 
|---|
| 219 | ;       >0  Stop code | 
|---|
| 220 | ; | 
|---|
| 221 | STOPCODE(CLIEN) ; | 
|---|
| 222 | N RORMSG,STOP | 
|---|
| 223 | I CLIEN>0  D | 
|---|
| 224 | . S STOP=$$GET1^DIQ(44,CLIEN_",","#8:#1","I",,"RORMSG") | 
|---|
| 225 | . S:$G(DIERR) STOP=$$DBS^RORERR("RORMSG",-99,,,44,CLIEN_",") | 
|---|
| 226 | E  S STOP="" | 
|---|
| 227 | Q STOP | 
|---|