| 1 | RORUTL05 ;HCIOFO/SG - MISCELLANEOUS UTILITIES ; 1/26/07 4:24pm
 | 
|---|
| 2 |  ;;1.5;CLINICAL CASE REGISTRIES;**1,2**;Feb 17, 2006;Build 6
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; This routine uses the following IAs:
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ; #4493         Read the .01 field of the file #771.7 (private)
 | 
|---|
| 7 |  ; #10040        Access to the HOSPITAL LOCATION file (supported)
 | 
|---|
| 8 |  ; #10061        DEM^VADPT (supported)
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  Q
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  ;***** CHECKS IF THE E-MAIL NOTIFICATION IS ENABLED
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  ; REGIEN        Registry IEN
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ; Return Values:
 | 
|---|
| 17 |  ;        0  Do not send e-mail notifications
 | 
|---|
| 18 |  ;        1  E-mail notifications are enabled
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 | CCRNTFY(REGIEN) ;
 | 
|---|
| 21 |  N DOMAIN,RC
 | 
|---|
| 22 |  ;--- Check if not a production account
 | 
|---|
| 23 |  I $T(PROD^XUPROD)'=""  Q:'$$PROD^XUPROD() 0
 | 
|---|
| 24 |  ;--- Check the domain name
 | 
|---|
| 25 |  S DOMAIN=$G(^XMB("NETNAME"))
 | 
|---|
| 26 |  Q:DOMAIN'?1.E1".VA.GOV" 0
 | 
|---|
| 27 |  Q:(DOMAIN?1"TEST.".E)!(DOMAIN?1"TST.".E) 0
 | 
|---|
| 28 |  ;--- Registry-specific checks
 | 
|---|
| 29 |  I $G(REGIEN)>0  S RC=1  D  Q:'RC 0
 | 
|---|
| 30 |  . N HL,HLECH,HLFS,HLQ,NAME,RORMSG
 | 
|---|
| 31 |  . ;--- Get the HL7 protocol name
 | 
|---|
| 32 |  . S NAME=$$GET1^DIQ(798.1,+REGIEN,13,,,"RORMSG")  Q:NAME=""
 | 
|---|
| 33 |  . ;--- Check the HL7 processing ID
 | 
|---|
| 34 |  . D INIT^HLFNC2(NAME,.HL)
 | 
|---|
| 35 |  . I $G(HL("PID"))'="",HL("PID")'="P"  S RC=0  Q
 | 
|---|
| 36 |  ;--- Notification is enabled (production account)
 | 
|---|
| 37 |  Q 1
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 |  ;***** CHECK IF THE PATIENT'S RECORD IN FILE #2 IS VALID
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  ; DFN           Patient IEN (in file #2)
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  ; Return Values:
 | 
|---|
| 44 |  ;       <0  Error code
 | 
|---|
| 45 |  ;        0  Ok
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 | CHKPTR(DFN,SILENT) ;
 | 
|---|
| 48 |  N RC,VA,VADM,VAERR
 | 
|---|
| 49 |  D VADEM(DFN)
 | 
|---|
| 50 |  I $G(VADM(1))=""  S RC=-102  D:'$G(SILENT)  Q RC
 | 
|---|
| 51 |  . D ERROR^RORERR(RC,,,,"PATIENT",DFN)
 | 
|---|
| 52 |  Q 0
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  ;***** DELETES ALL RECORDS FROM THE (SUB)FILE
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  ; FILE          File/Subfile number
 | 
|---|
| 57 |  ; [IENS]        IENS of the subfile
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 |  ; Return Values:
 | 
|---|
| 60 |  ;       <0  Error code
 | 
|---|
| 61 |  ;        0  Ok
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 | CLEAR(FILE,IENS) ;
 | 
|---|
| 64 |  Q:'$$VFILE^DILFD(FILE) 0
 | 
|---|
| 65 |  N DA,DIK,RC,ROOT,TMP
 | 
|---|
| 66 |  S IENS=$G(IENS)
 | 
|---|
| 67 |  ;--- Lock the (sub)file
 | 
|---|
| 68 |  S RC=$$LOCK^RORLOCK(FILE,IENS)
 | 
|---|
| 69 |  I RC  D  Q RC
 | 
|---|
| 70 |  . S TMP=$$GET1^DID(FILE,,,"NAME",,"RORMSG")
 | 
|---|
| 71 |  . S TMP=$S(TMP'="":"file",1:"subfile")_" #"_FILE
 | 
|---|
| 72 |  . S:IENS'="" TMP=TMP_"; IENS: '"_IENS_"'"
 | 
|---|
| 73 |  . S RC=$$ERROR^RORERR(-11,,"By "_$$TEXT^RORLOCK(RC),,TMP)
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ;--- Delete the records
 | 
|---|
| 76 |  S DIK=$$ROOT^DILFD(FILE,IENS)
 | 
|---|
| 77 |  S ROOT=$$CREF^DILF(DIK)
 | 
|---|
| 78 |  D DA^DILF(IENS,.DA)  S DA=0
 | 
|---|
| 79 |  F  S DA=$O(@ROOT@(DA))  Q:DA'>0  D ^DIK
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  ;--- Unlock the (sub)file
 | 
|---|
| 82 |  D UNLOCK^RORLOCK(FILE,IENS)
 | 
|---|
| 83 |  Q $S(RC<0:RC,1:0)
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 |  ;***** CLEARS THE FIELDS OF THE RECORDS FOUND BY NAME
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 |  ; FILE          File number
 | 
|---|
| 88 |  ; [IENS]        IENS of the subfile
 | 
|---|
| 89 |  ; NAME          Name of the record (value of the .01 field)
 | 
|---|
| 90 |  ; FIELDS        List of field numbers separated by semicolons
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ; Return Values:
 | 
|---|
| 93 |  ;       <0  Error code
 | 
|---|
| 94 |  ;        0  Ok
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 | CLRFLDS(FILE,IENS,NAME,FIELDS) ;
 | 
|---|
| 97 |  N FLD,I,IEN,IENS1,IS,RC,RORBUF,RORFDA,RORMSG
 | 
|---|
| 98 |  ;--- Find the record(s)
 | 
|---|
| 99 |  D FIND^DIC(FILE,$G(IENS),"@","X",NAME,,"B",,,"RORBUF","RORMSG")
 | 
|---|
| 100 |  S RC=$$DBS^RORERR("RORMSG",-9,,,FILE)  Q:RC<0 RC
 | 
|---|
| 101 |  S:$G(IENS)="" IENS=","  S FIELDS=$TR(FIELDS," ")
 | 
|---|
| 102 |  ;--- Update the record(s)
 | 
|---|
| 103 |  S IS="",RC=0
 | 
|---|
| 104 |  F  S IS=$O(RORBUF("DILIST",2,IS))  Q:IS=""  D  Q:RC<0
 | 
|---|
| 105 |  . S IEN=RORBUF("DILIST",2,IS)  Q:IEN'>0
 | 
|---|
| 106 |  . S IENS1=IEN_IENS
 | 
|---|
| 107 |  . F I=1:1  S FLD=$P(FIELDS,";",I)  Q:FLD'>0  D
 | 
|---|
| 108 |  . . S RORFDA(FILE,IENS1,+FLD)="@"
 | 
|---|
| 109 |  . D FILE^DIE(,"RORFDA","RORMSG")
 | 
|---|
| 110 |  . S RC=$$DBS^RORERR("RORMSG",-9,,,FILE,IENS1)
 | 
|---|
| 111 |  Q $S(RC<0:RC,1:0)
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 |  ;***** RETURNS THE END DATE FOR THE EVENT PURGE
 | 
|---|
| 114 | EPDATE() ;
 | 
|---|
| 115 |  N DATE,IR,RC,RORBUF,RORMSG,TMP
 | 
|---|
| 116 |  D LIST^DIC(798.1,,"@;1I;2I","U",,,,"B",,,"RORBUF","RORMSG")
 | 
|---|
| 117 |  Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.1)
 | 
|---|
| 118 |  ;--- Get the oldest date of registry updates
 | 
|---|
| 119 |  S IR="",DATE=$$DT^XLFDT
 | 
|---|
| 120 |  F  S IR=$O(RORBUF("DILIST","ID",IR))  Q:IR=""  D
 | 
|---|
| 121 |  . S TMP=$G(RORBUF("DILIST","ID",IR,1)) ; REGISTRY UPDATED UNTIL
 | 
|---|
| 122 |  . I TMP>0  S:TMP<DATE DATE=TMP
 | 
|---|
| 123 |  . ;S TMP=$G(RORBUF("DILIST","ID",IR,2)) ; DATA EXTRACTED UNTIL
 | 
|---|
| 124 |  . ;I TMP>0  S:TMP<DATE DATE=TMP
 | 
|---|
| 125 |  ;--- Subtract additional 14 days (just in case)
 | 
|---|
| 126 |  S DATE=$$FMADD^XLFDT(DATE\1,-14)
 | 
|---|
| 127 |  ;--- No more than 60 days in the past
 | 
|---|
| 128 |  S TMP=$$FMADD^XLFDT($$DT^XLFDT,-60)
 | 
|---|
| 129 |  Q $S(DATE>TMP:DATE,1:TMP)
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 |  ;***** RETURNS NAME OF THE HOSPITAL LOCATION
 | 
|---|
| 132 |  ;
 | 
|---|
| 133 |  ; HLIEN         IEN of the hospital location
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 | HLNAME(HLIEN) ;
 | 
|---|
| 136 |  N NAME
 | 
|---|
| 137 |  S NAME=$$GET1^DIQ(44,(+HLIEN)_",",.01,,,"RORMSG")
 | 
|---|
| 138 |  D:$G(DIERR) DBS^RORERR("RORMSG",-9,,,44,(+HLIEN)_",")
 | 
|---|
| 139 |  Q NAME
 | 
|---|
| 140 |  ;
 | 
|---|
| 141 |  ;***** FORMATS THE TEXT THAT DESCRIBES STATUS OF THE HL7 MESSAGE
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  ; MSGID         A valid ID of the HL7 message
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  ; .RORDST       Reference to a local array that the text
 | 
|---|
| 146 |  ;               is appended to
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 |  ; [TITLE]       Title of the output
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 |  ; [DLGNUM]      Number of an entry in the DIALOG file that
 | 
|---|
| 151 |  ;               contains the text template (by default,
 | 
|---|
| 152 |  ;               the 7980000.004 is used)
 | 
|---|
| 153 |  ;
 | 
|---|
| 154 |  ; [.PARAMS]     Reference to a local variable containing
 | 
|---|
| 155 |  ;               additional parameters that substitute the
 | 
|---|
| 156 |  ;               placeholders in the text template
 | 
|---|
| 157 |  ; PARAMS(
 | 
|---|
| 158 |  ;  "NOR")       Number of retries to resend the message
 | 
|---|
| 159 |  ;  "REGISTRY")  Name of the registry
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 |  ; [MSGSTAT]     Status of the message (result value of the
 | 
|---|
| 162 |  ;               $$MSGSTAT^HLUTIL function). If this parameter
 | 
|---|
| 163 |  ;               is undefined or equal to an empty string, the
 | 
|---|
| 164 |  ;               current status of the message is retrieved.
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 | MSG7STS(MSGID,RORDST,TITLE,DLGNUM,PARAMS,MSGSTAT) ;
 | 
|---|
| 167 |  N RORMSG,TMP
 | 
|---|
| 168 |  Q:$G(MSGID)?." "
 | 
|---|
| 169 |  S:$G(MSGSTAT)="" MSGSTAT=$$MSGSTAT^HLUTIL(MSGID)
 | 
|---|
| 170 |  ;--- Prepare the parameters
 | 
|---|
| 171 |  S PARAMS("ID")=MSGID
 | 
|---|
| 172 |  S PARAMS("STATUS")=$$MSGSTXT^RORHL7A(MSGSTAT)
 | 
|---|
| 173 |  S TMP=+$P(MSGSTAT,U,2)
 | 
|---|
| 174 |  S:TMP>0 PARAMS("UPDATED")=$$FMTE^XLFDT(TMP)
 | 
|---|
| 175 |  S PARAMS("ERRMSG")=$P(MSGSTAT,U,3)
 | 
|---|
| 176 |  S TMP=+$P(MSGSTAT,U,4)
 | 
|---|
| 177 |  S:TMP>0 PARAMS("ERRTYPE")=$$GET1^DIQ(771.7,TMP_",",.01,,,"RORMSG")
 | 
|---|
| 178 |  S PARAMS($S(+MSGSTAT=1:"QPOS",1:"RETRIES"))=$P(MSGSTAT,U,5)
 | 
|---|
| 179 |  S PARAMS("OPENFAIL")=$P(MSGSTAT,U,6)
 | 
|---|
| 180 |  S PARAMS("ACK")=$P(MSGSTAT,U,7)
 | 
|---|
| 181 |  ;--- Additional parameters
 | 
|---|
| 182 |  I $G(DLGNUM)>0  D
 | 
|---|
| 183 |  . S PARAMS("STATCODE")=+MSGSTAT
 | 
|---|
| 184 |  . S TMP=+$P(MSGSTAT,U,2)
 | 
|---|
| 185 |  . S:TMP>0 PARAMS("STATUPD")=$$FMTHL7^XLFDT(TMP)
 | 
|---|
| 186 |  . S TMP=$$SITE^RORUTL03()
 | 
|---|
| 187 |  . S PARAMS("STNAME")=$P(TMP,U,2)
 | 
|---|
| 188 |  . S PARAMS("STNUM")=$P(TMP,U)
 | 
|---|
| 189 |  . S:$G(PARAMS("NOR"))'>0 PARAMS("NOR")="several"
 | 
|---|
| 190 |  . S:$G(PARAMS("REGISTRY"))="" PARAMS("REGISTRY")="<unknown>"
 | 
|---|
| 191 |  E  S DLGNUM=7980000.004
 | 
|---|
| 192 |  ;--- Build the text
 | 
|---|
| 193 |  S:$G(TITLE)'="" RORDST(1)=TITLE,RORDST(2)=" "
 | 
|---|
| 194 |  D BLD^DIALOG(DLGNUM,.PARAMS,,"RORDST","S")
 | 
|---|
| 195 |  Q
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 |  ;***** CHECK IF THE ARGUMENT IS A NUMBER
 | 
|---|
| 198 |  ;
 | 
|---|
| 199 |  ; Return Values:
 | 
|---|
| 200 |  ;        1  Value starts from a number
 | 
|---|
| 201 |  ;        0  Otherwise
 | 
|---|
| 202 |  ;
 | 
|---|
| 203 | NUMERIC(VAL,NUMVAL) ;
 | 
|---|
| 204 |  S NUMVAL=$$TRIM^XLFSTR(VAL)
 | 
|---|
| 205 |  I NUMVAL?.1(1"+",1"-")1(1.N.1".".N,.N.1"."1.N).1(1"E".1(1"+",1"-")1.N)  S NUMVAL=+NUMVAL  Q 1
 | 
|---|
| 206 |  S NUMVAL=""
 | 
|---|
| 207 |  Q 0
 | 
|---|
| 208 |  ;
 | 
|---|
| 209 |  ;***** MARKS THE REGISTRY RECORDS FOR RESENDING THE LOCAL DATA
 | 
|---|
| 210 |  ;
 | 
|---|
| 211 |  ; .REGLST       Reference to a local array containing registry names 
 | 
|---|
| 212 |  ;               as subscripts and optional registry IENs as values
 | 
|---|
| 213 |  ;
 | 
|---|
| 214 |  ; WD            Number of days to wait before marking the records
 | 
|---|
| 215 |  ;               for resending the local registry data
 | 
|---|
| 216 |  ;
 | 
|---|
| 217 |  ; Return Values:
 | 
|---|
| 218 |  ;       <0  Error code
 | 
|---|
| 219 |  ;        0  Ok
 | 
|---|
| 220 |  ;
 | 
|---|
| 221 | REMARK(REGLST,WD) ;
 | 
|---|
| 222 |  N DATE,IEN,IENS,REGIEN,REGNAME,ROOT,RORFDA,RORMSG,TMP
 | 
|---|
| 223 |  S ROOT=$$ROOT^DILFD(798,,1),RC=0
 | 
|---|
| 224 |  S DATE=$$FMADD^XLFDT($$DT^XLFDT,-WD)
 | 
|---|
| 225 |  ;--- Process the registries from the list
 | 
|---|
| 226 |  S REGNAME=""
 | 
|---|
| 227 |  F  S REGNAME=$O(REGLST(REGNAME))  Q:REGNAME=""  D
 | 
|---|
| 228 |  . S REGIEN=+REGLST(REGNAME)
 | 
|---|
| 229 |  . I REGIEN'>0  S REGIEN=$$REGIEN^RORUTL02(REGNAME)  Q:REGIEN'>0
 | 
|---|
| 230 |  . S IENS=REGIEN_","
 | 
|---|
| 231 |  . ;--- Get the registry parameters
 | 
|---|
| 232 |  . D GETS^DIQ(798.1,IENS,"21.04;21.05","I","RORFDA","RORMSG")
 | 
|---|
| 233 |  . I $G(DIERR)  S TMP=$$DBS^RORERR("RORMSG",-9,,,798.1,IENS)  Q
 | 
|---|
| 234 |  . ;--- Local data has been resent already
 | 
|---|
| 235 |  . Q:$G(RORFDA(798.1,IENS,21.04,"I"))
 | 
|---|
| 236 |  . ;--- The registry has not been populated yet
 | 
|---|
| 237 |  . Q:'$G(RORFDA(798.1,IENS,21.05,"I"))
 | 
|---|
| 238 |  . ;--- It is too early for resending the local data
 | 
|---|
| 239 |  . Q:RORFDA(798.1,IENS,21.05,"I")>DATE
 | 
|---|
| 240 |  . K RORFDA,RORMSG
 | 
|---|
| 241 |  . ;--- Mark registry records as modified
 | 
|---|
| 242 |  . S IEN=0
 | 
|---|
| 243 |  . F  S IEN=$O(@ROOT@("AC",REGIEN,IEN))  Q:'IEN  D
 | 
|---|
| 244 |  . . S IENS=IEN_","
 | 
|---|
| 245 |  . . S RORFDA(798,IENS,4)=1  ; UPDATE DEMOGRAPHICS
 | 
|---|
| 246 |  . . S RORFDA(798,IENS,5)=1  ; UPDATE LOCAL REGISTRY DATA
 | 
|---|
| 247 |  . . D FILE^DIE(,"RORFDA","RORMSG")
 | 
|---|
| 248 |  . . D:$G(DIERR) DBS^RORERR("RORMSG",-9,,,798,IENS)
 | 
|---|
| 249 |  . ;--- Update registry parameters
 | 
|---|
| 250 |  . S IENS=REGIEN_","
 | 
|---|
| 251 |  . S RORFDA(798.1,IENS,21.04)=$$NOW^XLFDT
 | 
|---|
| 252 |  . D FILE^DIE("K","RORFDA","RORMSG")
 | 
|---|
| 253 |  . I $G(DIERR)  S TMP=$$DBS^RORERR("RORMSG",-9,,,798.1,IENS)  Q
 | 
|---|
| 254 |  . ;--- Record the message
 | 
|---|
| 255 |  . S TMP="Local registry and demographic data will be resent to AAC"
 | 
|---|
| 256 |  . D LOG^RORLOG(2,TMP,,"Registry Name: "_REGNAME)
 | 
|---|
| 257 |  Q 0
 | 
|---|
| 258 |  ;
 | 
|---|
| 259 |  ;***** CALLS THE DEM^VADPT
 | 
|---|
| 260 |  ;
 | 
|---|
| 261 |  ; DFN           Patient IEN (in file #2)
 | 
|---|
| 262 |  ; VALIDATE      Make sure that required fields are not empty
 | 
|---|
| 263 |  ; VAPTYP
 | 
|---|
| 264 |  ; VAHOW
 | 
|---|
| 265 |  ;
 | 
|---|
| 266 | VADEM(DFN,VALIDATE,VAPTYP,VAHOW) ;
 | 
|---|
| 267 |  N I,J,X,A,K,K1,NC,NF,NQ,T,VAROOT
 | 
|---|
| 268 |  D DEM^VADPT
 | 
|---|
| 269 |  S VA("BID")=$E($P($G(VADM(2)),U),6,10)  ; Always 'Last4'
 | 
|---|
| 270 |  Q:'$G(VALIDATE)
 | 
|---|
| 271 |  ;--- Make sure that required fields are not empty
 | 
|---|
| 272 |  S:$G(VADM(1))="" VADM(1)="Unknown ("_DFN_")"
 | 
|---|
| 273 |  S:$G(VA("BID"))="" VA("BID")="UNKN"
 | 
|---|
| 274 |  Q
 | 
|---|