[613] | 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
|
---|