| 1 | RORUTL01 ;HCIOFO/SG - UTILITIES  ; 5/12/05 3:29pm
 | 
|---|
| 2 |  ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; This routine uses the following IAs:
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ; #3301         Access to the .6 field of the file #2
 | 
|---|
| 7 |  ; #3744         $$TESTPAT^VADPT
 | 
|---|
| 8 |  ; #10035        Access to the .01 and .09 fields of the file #2
 | 
|---|
| 9 |  ; #10038        Access to the HOLIDAY file (supported)
 | 
|---|
| 10 |  Q
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  ;***** SENDS ALERT TO REGISTRY COORDINATORS
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  ; [.]REGLST     Either name of the registry or reference to a local
 | 
|---|
| 15 |  ;               array containing registry names as subscripts and
 | 
|---|
| 16 |  ;               optional registry IENs as values
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  ; MSG           Text of the message or negative error code. The '^'
 | 
|---|
| 19 |  ;               characters are replaced with spaces in the text.
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  ; [XQAROU]      Indicates a ROUTINE or TAG^ROUTINE to run when
 | 
|---|
| 22 |  ;               the alert is processed
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ; [XQADATA]     Use this to store a package-specific data string,
 | 
|---|
| 25 |  ;               in any format
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  ; [PATIEN]      Patient IEN
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  ; [ARG2-ARG5]   Optional parameters as for the $$ERROR^RORERR
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 | ALERT(REGLST,MSG,XQAROU,XQADATA,PATIEN,ARG2,ARG3,ARG4,ARG5) ;
 | 
|---|
| 32 |  N IR,RC,REGIEN,REGNAME,RORBUF,RORMSG,TMP,XQA,XQAFLG,XQAMSG
 | 
|---|
| 33 |  ;--- Prepare the notification list
 | 
|---|
| 34 |  I $D(REGLST)=1  Q:REGLST=""  S REGLST(REGLST)=""
 | 
|---|
| 35 |  S REGNAME="",RC=0
 | 
|---|
| 36 |  F  S REGNAME=$O(REGLST(REGNAME))  Q:REGNAME=""  D
 | 
|---|
| 37 |  . S REGIEN=+$G(REGLST(REGNAME))
 | 
|---|
| 38 |  . I REGIEN'>0  D  Q:REGIEN'>0
 | 
|---|
| 39 |  . . S REGIEN=$$REGIEN^RORUTL02(REGNAME)
 | 
|---|
| 40 |  . ;--- Load the notification list from the registry parameters
 | 
|---|
| 41 |  . K RORBUF  S TMP=","_REGIEN_","
 | 
|---|
| 42 |  . D LIST^DIC(798.114,TMP,"@;.01I","U",,,,"B",,,"RORBUF","RORMSG")
 | 
|---|
| 43 |  . S RC=$$DBS^RORERR("RORMSG",-9)  Q:RC<0
 | 
|---|
| 44 |  . S IR=""
 | 
|---|
| 45 |  . F  S IR=$O(RORBUF("DILIST","ID",IR))  Q:IR=""  D
 | 
|---|
| 46 |  . . S TMP=+$G(RORBUF("DILIST","ID",IR,.01))  S:TMP>0 XQA(TMP)=""
 | 
|---|
| 47 |  Q:$D(XQA)<10
 | 
|---|
| 48 |  ;--- Get text of the error message (if necessary)
 | 
|---|
| 49 |  I +MSG=MSG  Q:MSG'<0  D
 | 
|---|
| 50 |  . S MSG=$$MSG^RORERR20(+MSG,,.PATIEN,.ARG2,.ARG3,.ARG4,.ARG5)
 | 
|---|
| 51 |  S MSG=$TR(MSG,"^"," "),XQAMSG="ROR: ",TMP=70-$L(XQAMSG)-3
 | 
|---|
| 52 |  S XQAMSG=XQAMSG_$S($L(MSG)>TMP:$E(MSG,1,TMP)_"...",1:MSG)
 | 
|---|
| 53 |  ;--- Setup default alert processing routine
 | 
|---|
| 54 |  I $G(XQAROU)="",$G(XQADATA)=""  D
 | 
|---|
| 55 |  . S XQADATA=$E(MSG,1,78)_U_$G(PATIEN)
 | 
|---|
| 56 |  . S REGNAME=""
 | 
|---|
| 57 |  . F  S REGNAME=$O(REGLST(REGNAME))  Q:REGNAME=""  D
 | 
|---|
| 58 |  . . S XQADATA=XQADATA_U_REGNAME
 | 
|---|
| 59 |  . S XQAROU="ALERTRTN^RORUTL01"
 | 
|---|
| 60 |  ;--- Send the alert
 | 
|---|
| 61 |  S XQAFLG="D"  D SETUP^XQALERT
 | 
|---|
| 62 |  Q
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 |  ;***** DEFAULT ALERT PROCESSING ROUTINE
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 |  ; XQADATA       Alert data
 | 
|---|
| 67 |  ;                 ^1: Message
 | 
|---|
| 68 |  ;                 ^2: Patient DFN
 | 
|---|
| 69 |  ;                 ^3: Registry name
 | 
|---|
| 70 |  ;                     ...
 | 
|---|
| 71 |  ;                 ^N: Registry name
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 | ALERTRTN ;
 | 
|---|
| 74 |  Q:$G(XQADATA)=""
 | 
|---|
| 75 |  N I,REGNAME
 | 
|---|
| 76 |  W !!,$P(XQADATA,"^"),!
 | 
|---|
| 77 |  W:$P(XQADATA,"^",2) "Patient DFN: ",$P(XQADATA,"^",2),!
 | 
|---|
| 78 |  W "Processed Registries",!
 | 
|---|
| 79 |  F I=3:1  S REGNAME=$P(XQADATA,"^",I)  Q:REGNAME=""  W ?3,REGNAME,!
 | 
|---|
| 80 |  Q
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 |  ;***** INITIALIZES THE VARIABLES
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  ; NAMESP        Namespace to kill in the ^TMP global
 | 
|---|
| 85 |  ;               (must start with "ROR")
 | 
|---|
| 86 |  ; [XPURGE]      Purge namespaced nodes in the ^XTMP global.
 | 
|---|
| 87 |  ;               The ^XTMP(NAMESP_$J) node is always killed.
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 | INIT(NAMESP,XPURGE) ;
 | 
|---|
| 90 |  N I,L,NOW  K ^TMP($J)
 | 
|---|
| 91 |  S:$G(U)="" U="^"  S:'$G(DT) DT=$$DT^XLFDT
 | 
|---|
| 92 |  Q:$E($G(NAMESP),1,3)'="ROR"
 | 
|---|
| 93 |  ;--- Kill namespaced nodes in the ^TMP global
 | 
|---|
| 94 |  S I=NAMESP,L=$L(NAMESP)
 | 
|---|
| 95 |  F  K ^TMP(I,$J)  S I=$O(^TMP(I))  Q:$E(I,1,L)'=NAMESP
 | 
|---|
| 96 |  ;--- Purge old namespaced nodes in the ^XTMP global
 | 
|---|
| 97 |  K ^XTMP(NAMESP_$J)
 | 
|---|
| 98 |  D:$G(XPURGE)
 | 
|---|
| 99 |  . S NOW=$$NOW^XLFDT,I=NAMESP,L=$L(NAMESP)
 | 
|---|
| 100 |  . F  D  S I=$O(^XTMP(I))  Q:$E(I,1,L)'=NAMESP
 | 
|---|
| 101 |  . . K:$G(^XTMP(I,0))<NOW ^XTMP(I)
 | 
|---|
| 102 |  Q
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 |  ;***** INVERTS THE DATE
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 |  ; DATE          Date in FileMan format
 | 
|---|
| 107 |  ; [MODE]        Mode of inversion
 | 
|---|
| 108 |  ;                 1  Strip the time BEFORE inversion
 | 
|---|
| 109 |  ;                 2  Strip the time AFTER inversion
 | 
|---|
| 110 |  ;                 3  Do not invert the time
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 | INVDATE(DATE,MODE) ;
 | 
|---|
| 113 |  Q:$G(MODE)=1 9999999-$P(DATE,".")
 | 
|---|
| 114 |  Q:$G(MODE)=2 $P(9999999-DATE,".")
 | 
|---|
| 115 |  I $G(MODE)=3  Q:$P(DATE,".",2) (9999999-$P(DATE,"."))_"."_+$P(DATE,".",2)
 | 
|---|
| 116 |  Q 9999999-DATE
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  ;***** RETURNS THE PATIENT IEN (DFN) FROM THE REGISTRY RECORD
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  ; IEN           IEN of the registry record
 | 
|---|
| 121 |  ;
 | 
|---|
| 122 | PTIEN(IEN) ;
 | 
|---|
| 123 |  Q +$P($G(^RORDATA(798,+IEN,0)),U)
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  ;***** RETURNS IEN OF THE PATIENT'S RECORD IN THE REGISTRY
 | 
|---|
| 126 |  ;
 | 
|---|
| 127 |  ; PATIEN        Patient IEN
 | 
|---|
| 128 |  ; REGIEN        Registry IEN
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  ; Return Values:
 | 
|---|
| 131 |  ;       ""  The registry record has not been found
 | 
|---|
| 132 |  ;       >0  IEN of the patient's registry record
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 | PRRIEN(PATIEN,REGIEN) ;
 | 
|---|
| 135 |  Q:(PATIEN'>0)!(REGIEN'>0) 0
 | 
|---|
| 136 |  Q $O(^RORDATA(798,"KEY",+PATIEN,+REGIEN,0))
 | 
|---|
| 137 |  ;
 | 
|---|
| 138 |  ;***** RETURNS NAME AND SHORT DESCRIPTION OF THE REGISTRY
 | 
|---|
| 139 |  ;
 | 
|---|
| 140 |  ; REGIEN        Registry IEN
 | 
|---|
| 141 |  ;
 | 
|---|
| 142 |  ; Return Values:
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 |  ; An empty string is returned in case of an error or if there
 | 
|---|
| 145 |  ; is no registry with such IEN. Otherwise, the name and short
 | 
|---|
| 146 |  ; description of the registry separated by "^" are returned.
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 | REGNAME(REGIEN) ;
 | 
|---|
| 149 |  N IENS,NAME,RORBUF,RORMSG
 | 
|---|
| 150 |  Q:'$D(^ROR(798.1,+REGIEN)) ""
 | 
|---|
| 151 |  S IENS=+REGIEN_","
 | 
|---|
| 152 |  D GETS^DIQ(798.1,IENS,".01;4",,"RORBUF","RORMSG")
 | 
|---|
| 153 |  I $G(DIERR)  D  Q ""
 | 
|---|
| 154 |  . D DBS^RORERR("RORMSG",-9,,,798.1,IENS)
 | 
|---|
| 155 |  Q RORBUF(798.1,IENS,.01)_U_$G(RORBUF(798.1,IENS,4))
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  ;***** CHECKS IF THE PATIENT IS A TEST ONE
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 |  ; PATIEN        Patient IEN
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 |  ; Return Values:
 | 
|---|
| 162 |  ;        0  The patient is NOT a test patient
 | 
|---|
| 163 |  ;        1  The patient IS a test patient
 | 
|---|
| 164 |  ;
 | 
|---|
| 165 | TESTPAT(PATIEN) ;
 | 
|---|
| 166 |  Q:$$TESTPAT^VADPT(PATIEN) 1
 | 
|---|
| 167 |  Q:$E($G(^DPT(PATIEN,0)),1,2)="ZZ" 1  ; NAME starts with "ZZ"
 | 
|---|
| 168 |  Q 0
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 |  ;***** VERIFY THE ENTRY POINT
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  ; ENTRY         Entry point of the external MUMPS function
 | 
|---|
| 173 |  ; [RECERR]      Record the errors (do not record by default)
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 |  ; Return Values:
 | 
|---|
| 176 |  ;       -18  Routine does not exist
 | 
|---|
| 177 |  ;       -17  Invalid entry point
 | 
|---|
| 178 |  ;         0  Ok
 | 
|---|
| 179 |  ;
 | 
|---|
| 180 | VERIFYEP(ENTRY,RECERR) ;
 | 
|---|
| 181 |  N X
 | 
|---|
| 182 |  S X="S Y="_ENTRY  D ^DIM
 | 
|---|
| 183 |  Q:'$D(X) $S($G(RECERR):$$ERROR^RORERR(-17,,,,ENTRY),1:-17)
 | 
|---|
| 184 |  S X=$P(ENTRY,U,2)
 | 
|---|
| 185 |  X ^%ZOSF("TEST")  E  Q $S($G(RECERR):$$ERROR^RORERR(-18,,,,X),1:-18)
 | 
|---|
| 186 |  Q 0
 | 
|---|
| 187 |  ;
 | 
|---|
| 188 |  ;***** CHECKS IF THE DATE IS A WORKING DAY
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 |  ; DATE          The date to be checked
 | 
|---|
| 191 |  ;
 | 
|---|
| 192 |  ; Return Values:
 | 
|---|
| 193 |  ;        0  Weekend or Holiday
 | 
|---|
| 194 |  ;        1  Working day
 | 
|---|
| 195 |  ;
 | 
|---|
| 196 | WDCHK(DATE) ;
 | 
|---|
| 197 |  N DOW,RORMSG
 | 
|---|
| 198 |  ;--- Return zero if Saturday (6) or Sunday (0)
 | 
|---|
| 199 |  S DOW=$$DOW^XLFDT(DATE,1)  Q:'DOW!(DOW>5) 0
 | 
|---|
| 200 |  ;--- Return 1 if cannot be found in the HOLIDAY file
 | 
|---|
| 201 |  Q $$FIND1^DIC(40.5,,"QX",DATE\1,"B",,"RORMSG")'>0
 | 
|---|
| 202 |  ;
 | 
|---|
| 203 |  ;***** RETURNS THE NEXT WORKING DAY DATE
 | 
|---|
| 204 |  ;
 | 
|---|
| 205 |  ; DATE          The source date
 | 
|---|
| 206 |  ;
 | 
|---|
| 207 |  ; The function returns a date of the next working day.
 | 
|---|
| 208 |  ;
 | 
|---|
| 209 | WDNEXT(DATE) ;
 | 
|---|
| 210 |  N DOW,RORMSG
 | 
|---|
| 211 |  F  D  Q:$$FIND1^DIC(40.5,,"QX",DATE,"B",,"RORMSG")'>0
 | 
|---|
| 212 |  . S DOW=$$DOW^XLFDT(DATE,1)  S:'DOW DOW=7
 | 
|---|
| 213 |  . ;--- Get the next day and skip a weekend if necessary
 | 
|---|
| 214 |  . S DATE=$$FMADD^XLFDT(DATE,$S(DOW<5:1,1:8-DOW))
 | 
|---|
| 215 |  Q DATE
 | 
|---|
| 216 |  ;
 | 
|---|
| 217 |  ;***** CREATES A HEADER OF THE NODE IN THE ^XTMP GLOBAL
 | 
|---|
| 218 |  ;
 | 
|---|
| 219 |  ; SUBSCR        Subscript of the node in the ^XTMP global
 | 
|---|
| 220 |  ; [DKEEP]       Number of days to keep the node (1 by default)
 | 
|---|
| 221 |  ; [DESCR]       Description of the node
 | 
|---|
| 222 |  ;
 | 
|---|
| 223 | XTMPHDR(SUBSCR,DKEEP,DESCR) ;
 | 
|---|
| 224 |  N DATE  S DATE=$$DT^XLFDT  S:$G(DKEEP)'>0 DKEEP=1
 | 
|---|
| 225 |  S ^XTMP(SUBSCR,0)=$$FMADD^XLFDT(DATE,DKEEP)_U_DATE_U_$G(DESCR)
 | 
|---|
| 226 |  Q
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  ;***** EMULATES AND EXTENDS THE ZWRITE COMMAND :-)
 | 
|---|
| 229 |  ;
 | 
|---|
| 230 |  ; ROR8NODE      Closed root of the sub-tree to display
 | 
|---|
| 231 |  ;               (either local array or global variable)
 | 
|---|
| 232 |  ; [TITLE]       Title of the output
 | 
|---|
| 233 |  ;
 | 
|---|
| 234 | ZW(ROR8NODE,TITLE) ;
 | 
|---|
| 235 |  Q:ROR8NODE=""  Q:'$D(@ROR8NODE)
 | 
|---|
| 236 |  N FLT,L,PI  W !
 | 
|---|
| 237 |  W:$G(TITLE)'="" TITLE,!!
 | 
|---|
| 238 |  W:$D(@ROR8NODE)#10 ROR8NODE_"="_@ROR8NODE,!
 | 
|---|
| 239 |  S L=$L(ROR8NODE)  S:$E(ROR8NODE,L)=")" L=L-1
 | 
|---|
| 240 |  S FLT=$E(ROR8NODE,1,L),PI=ROR8NODE
 | 
|---|
| 241 |  F  S PI=$Q(@PI)  Q:$E(PI,1,L)'=FLT  W PI_"="_@PI,!
 | 
|---|
| 242 |  Q
 | 
|---|