| [623] | 1 | RORHL09 ;HOIFO/BH - HL7 OUTPATIENT DATA: PV1,OBR,OBX ; 3/13/06 9:24am
 | 
|---|
 | 2 |  ;;1.5;CLINICAL CASE REGISTRIES;**1**;Feb 17, 2006;Build 24
 | 
|---|
 | 3 |  ;
 | 
|---|
 | 4 |  ; This routine uses the following IAs:
 | 
|---|
 | 5 |  ;
 | 
|---|
 | 6 |  ; #93       Get stop code from the file #44 (controlled)
 | 
|---|
 | 7 |  ; #1889     Use of the ENCEVENT^PXKENC API
 | 
|---|
 | 8 |  ; #1995     $$CODEC^ICPTCOD (supported)
 | 
|---|
 | 9 |  ; #2309     Read access to the 'AA' x-ref in VISIT file (#9000010)
 | 
|---|
 | 10 |  ; #3990     $$CODEC^ICDCODE (supported)
 | 
|---|
 | 11 |  ; #10060    Read access to the file #200 (supported)
 | 
|---|
 | 12 |  ; #2438     Access to the file #40.8 (field #1) (controlled)
 | 
|---|
 | 13 |  ;
 | 
|---|
 | 14 |  Q
 | 
|---|
 | 15 |  ;
 | 
|---|
 | 16 |  ;***** PROCESSES DIAGNOSIS CODES
 | 
|---|
 | 17 | DIAGS() ;
 | 
|---|
 | 18 |  N DIAG,IEN,K5,OID,REC,TMP
 | 
|---|
 | 19 |  S OID="OICD9"_RORCS_"Diagnosis"_RORCS_"VA080"
 | 
|---|
 | 20 |  S K5=""
 | 
|---|
 | 21 |  F  S K5=$O(^TMP("PXKENC",$J,RORIEN,"POV",K5))  Q:K5=""  D
 | 
|---|
 | 22 |  . S REC=^TMP("PXKENC",$J,RORIEN,"POV",K5,0)
 | 
|---|
 | 23 |  . S IEN=+$P(REC,U)  Q:IEN'>0
 | 
|---|
 | 24 |  . ;---
 | 
|---|
 | 25 |  . S DIAG=$$CODEC^ICDCODE(IEN)
 | 
|---|
 | 26 |  . D:DIAG'<0 SETOBX(OID,DIAG)
 | 
|---|
 | 27 |  Q 0
 | 
|---|
 | 28 |  ;
 | 
|---|
 | 29 |  ;***** OUTPATIENT DATA SEGMENT BUILDER
 | 
|---|
 | 30 |  ;
 | 
|---|
 | 31 |  ; RORDFN        DFN of Patient Record in File #2
 | 
|---|
 | 32 |  ;
 | 
|---|
 | 33 |  ; .DXDTS        Reference to a local variable where the
 | 
|---|
 | 34 |  ;               data extraction time frames are stored.
 | 
|---|
 | 35 |  ;
 | 
|---|
 | 36 |  ; RORTY         Set to either "PV1" or "OBR"
 | 
|---|
 | 37 |  ;
 | 
|---|
 | 38 |  ; The ^TMP("PXKENC",$J) and ^TMP("RORHL08",$J) global nodes are
 | 
|---|
 | 39 |  ; used by this function.
 | 
|---|
 | 40 |  ;
 | 
|---|
 | 41 |  ; Return Values:
 | 
|---|
 | 42 |  ;       <0  Error Code
 | 
|---|
 | 43 |  ;        0  Ok
 | 
|---|
 | 44 |  ;       >0  Non-fatal error(s)
 | 
|---|
 | 45 |  ;
 | 
|---|
 | 46 | EN1(RORDFN,DXDTS,RORTY) ;
 | 
|---|
 | 47 |  N ERRCNT,PIEN,PV1CNT,RC
 | 
|---|
 | 48 |  S (ERRCNT,RC)=0
 | 
|---|
 | 49 |  ;
 | 
|---|
 | 50 |  ;--- PV1 Segments
 | 
|---|
 | 51 |  I RORTY="PV1"  K ^TMP("PXKENC",$J),^TMP("RORHL09",$J)  D
 | 
|---|
 | 52 |  . N IDX,INVDT,ROREND
 | 
|---|
 | 53 |  . S (IDX,PV1CNT)=0
 | 
|---|
 | 54 |  . F  S IDX=$O(DXDTS(2,IDX))  Q:IDX'>0  D  Q:RC<0
 | 
|---|
 | 55 |  . . S INVDT=9999999-$$FMADD^XLFDT($P(DXDTS(2,IDX),U)\1,-1)
 | 
|---|
 | 56 |  . . S ROREND=9999999-$P(DXDTS(2,IDX),U,2)
 | 
|---|
 | 57 |  . . F  S INVDT=$O(^AUPNVSIT("AA",RORDFN,INVDT),-1)  Q:'INVDT!(INVDT'>ROREND)  D
 | 
|---|
 | 58 |  . . . S PIEN=""
 | 
|---|
 | 59 |  . . . F  S PIEN=$O(^AUPNVSIT("AA",RORDFN,INVDT,PIEN),-1)  Q:'PIEN  D
 | 
|---|
 | 60 |  . . . . S TMP=$$PV1(PIEN,RORDFN)
 | 
|---|
 | 61 |  . . . . I TMP  Q:TMP<0  S ERRCNT=ERRCNT+TMP
 | 
|---|
 | 62 |  . . . . ;--- Reference for the corresponding OBR segment
 | 
|---|
 | 63 |  . . . . S:TMP'="S" PV1CNT=PV1CNT+1,^TMP("RORHL09",$J,PV1CNT)=PIEN
 | 
|---|
 | 64 |  ;
 | 
|---|
 | 65 |  ;--- OBR and OBX Segments
 | 
|---|
 | 66 |  I RORTY="OBR"  D  K ^TMP("PXKENC",$J),^TMP("RORHL09",$J)
 | 
|---|
 | 67 |  . S PV1CNT=0
 | 
|---|
 | 68 |  . F  S PV1CNT=$O(^TMP("RORHL09",$J,PV1CNT))  Q:PV1CNT'>0  D
 | 
|---|
 | 69 |  . . S PIEN=+$G(^TMP("RORHL09",$J,PV1CNT))  Q:PIEN'>0
 | 
|---|
 | 70 |  . . ;---
 | 
|---|
 | 71 |  . . S TMP=$$OBR(PIEN,RORDFN)
 | 
|---|
 | 72 |  . . I TMP  Q:TMP<0  S ERRCNT=ERRCNT+TMP
 | 
|---|
 | 73 |  . . ;---
 | 
|---|
 | 74 |  . . S TMP=$$OBX(PIEN,RORDFN)
 | 
|---|
 | 75 |  . . I TMP  Q:TMP<0  S ERRCNT=ERRCNT+TMP
 | 
|---|
 | 76 |  ;
 | 
|---|
 | 77 |  ;--- Check for errors
 | 
|---|
 | 78 |  Q $S(RC<0:RC,1:ERRCNT)
 | 
|---|
 | 79 |  ;
 | 
|---|
 | 80 |  ;***** OBR SEGMENT BUILDER (OUTPATIENT)
 | 
|---|
 | 81 |  ;
 | 
|---|
 | 82 |  ; RORIEN        IEN of file #9000010
 | 
|---|
 | 83 |  ; RORDFN        DFN of Patient Record in File #2
 | 
|---|
 | 84 |  ;
 | 
|---|
 | 85 |  ; Return Values:
 | 
|---|
 | 86 |  ;       <0  Error Code
 | 
|---|
 | 87 |  ;        0  Ok
 | 
|---|
 | 88 |  ;       >0  Non-fatal error(s)
 | 
|---|
 | 89 |  ;
 | 
|---|
 | 90 | OBR(RORIEN,RORDFN) ;
 | 
|---|
 | 91 |  N CS,ERRCNT,RC,RORSEG,STN,TMP,VST0
 | 
|---|
 | 92 |  S (ERRCNT,RC)=0
 | 
|---|
 | 93 |  D ECH^RORHL7(.CS)
 | 
|---|
 | 94 |  ;
 | 
|---|
 | 95 |  S VST0=$G(^TMP("PXKENC",$J,RORIEN,"VST",RORIEN,0))
 | 
|---|
 | 96 |  ;
 | 
|---|
 | 97 |  ;--- Initialize the segment
 | 
|---|
 | 98 |  S RORSEG(0)="OBR"
 | 
|---|
 | 99 |  ;
 | 
|---|
 | 100 |  ;--- OBR-3 - Order Number (IEN in the VISIT file #9000010) 
 | 
|---|
 | 101 |  S RORSEG(3)=RORIEN
 | 
|---|
 | 102 |  ;
 | 
|---|
 | 103 |  ;--- OBR-4 - Universal Service ID
 | 
|---|
 | 104 |  S RORSEG(4)="OP"_CS_"Outpatient"_CS_"C4"
 | 
|---|
 | 105 |  ;
 | 
|---|
 | 106 |  ;--- OBR-7 - Observation Date/Time (Visit Date/Time) *KEY*
 | 
|---|
 | 107 |  S TMP=$$FMTHL7^XLFDT($P(VST0,U))
 | 
|---|
 | 108 |  Q:TMP'>0 $$ERROR^RORERR(-100,,,,"No visit date","ENCEVENT^PXKENC")
 | 
|---|
 | 109 |  S RORSEG(7)=TMP
 | 
|---|
 | 110 |  ;
 | 
|---|
 | 111 |  ;--- OBR-24 - Diagnostic Service ID
 | 
|---|
 | 112 |  S RORSEG(24)="PHY"
 | 
|---|
 | 113 |  ;
 | 
|---|
 | 114 |  ;--- OBR-44 - Division
 | 
|---|
 | 115 |  S RORSEG(44)=$$SITE^RORUTL03(CS)
 | 
|---|
 | 116 |  S TMP=+$P(VST0,U,6)  ; LOC. OF ENCOUNTER (.06)
 | 
|---|
 | 117 |  I TMP>0  D
 | 
|---|
 | 118 |  . S TMP=$$NS^XUAF4(TMP),STN=$P(TMP,U,2)
 | 
|---|
 | 119 |  . S:STN'="" RORSEG(44)=STN_CS_$P(TMP,U)_CS_"99VA4"
 | 
|---|
 | 120 |  ;
 | 
|---|
 | 121 |  ;--- Store the segment
 | 
|---|
 | 122 |  D ADDSEG^RORHL7(.RORSEG)
 | 
|---|
 | 123 |  Q ERRCNT
 | 
|---|
 | 124 |  ;
 | 
|---|
 | 125 |  ;***** OBX SEGMENT BUILDER (OUTPATIENT)
 | 
|---|
 | 126 |  ;
 | 
|---|
 | 127 |  ; RORIEN        IEN of file #9000010
 | 
|---|
 | 128 |  ; RORDFN        DFN of Patient Record in File #2
 | 
|---|
 | 129 |  ;
 | 
|---|
 | 130 |  ; Return Values:
 | 
|---|
 | 131 |  ;       <0  Error Code
 | 
|---|
 | 132 |  ;        0  Ok
 | 
|---|
 | 133 |  ;       >0  Non-fatal error(s)
 | 
|---|
 | 134 |  ;
 | 
|---|
 | 135 | OBX(RORIEN,RORDFN) ;
 | 
|---|
 | 136 |  N ERRCNT,RC,RORCS,RORLST,RORMSG,RORSEG,TMP
 | 
|---|
 | 137 |  S (ERRCNT,RC)=0
 | 
|---|
 | 138 |  D ECH^RORHL7(.RORCS)
 | 
|---|
 | 139 |  ;
 | 
|---|
 | 140 |  ;--- Procedures
 | 
|---|
 | 141 |  I $D(^TMP("PXKENC",$J,RORIEN,"CPT"))>1  D  Q:RC<0 RC
 | 
|---|
 | 142 |  . S RC=$$PROCS()  S:RC ERRCNT=ERRCNT+1
 | 
|---|
 | 143 |  ;--- Diagnosis codes
 | 
|---|
 | 144 |  I $D(^TMP("PXKENC",$J,RORIEN,"POV"))>1  D  Q:RC<0 RC
 | 
|---|
 | 145 |  . S RC=$$DIAGS()  S:RC ERRCNT=ERRCNT+1
 | 
|---|
 | 146 |  ;
 | 
|---|
 | 147 |  Q ERRCNT
 | 
|---|
 | 148 |  ; 
 | 
|---|
 | 149 |  ;***** PROCESSES PROCEDURES
 | 
|---|
 | 150 | PROCS() ;
 | 
|---|
 | 151 |  N CLASS,ERRCNT,IEN,K5,OID,PROC,PRV,REC,RORMSG,TMP
 | 
|---|
 | 152 |  S ERRCNT=0
 | 
|---|
 | 153 |  S OID="OCPT"_RORCS_"Procedures"_RORCS_"VA080"
 | 
|---|
 | 154 |  S K5=""
 | 
|---|
 | 155 |  F  S K5=$O(^TMP("PXKENC",$J,RORIEN,"CPT",K5))  Q:K5=""  D
 | 
|---|
 | 156 |  . S REC=$G(^TMP("PXKENC",$J,RORIEN,"CPT",K5,0))
 | 
|---|
 | 157 |  . S IEN=+$P(REC,U)  Q:IEN'>0
 | 
|---|
 | 158 |  . ;---
 | 
|---|
 | 159 |  . S PROC=$$CODEC^ICPTCOD(IEN)
 | 
|---|
 | 160 |  . Q:PROC<0
 | 
|---|
 | 161 |  . ;---
 | 
|---|
 | 162 |  . S PRV=+$P($G(^TMP("PXKENC",$J,RORIEN,"CPT",K5,12)),U,4)
 | 
|---|
 | 163 |  . Q:PRV'>0
 | 
|---|
 | 164 |  . ;---
 | 
|---|
 | 165 |  . S $P(PRV,RORCS,13)=$$GET1^DIQ(200,PRV_",",53.5,"E",,"RORMSG")
 | 
|---|
 | 166 |  . I $G(DIERR)  D  S ERRCNT=ERRCNT+1
 | 
|---|
 | 167 |  . . D DBS^RORERR("RORMSG",-99,,RORDFN,200,+PRV_",")
 | 
|---|
 | 168 |  . ;---
 | 
|---|
 | 169 |  . D SETOBX(OID,PROC,PRV)
 | 
|---|
 | 170 |  Q ERRCNT
 | 
|---|
 | 171 |  ;
 | 
|---|
 | 172 |  ;***** PV1 SEGMENT BUILDER (OUTPATIENT)
 | 
|---|
 | 173 |  ;
 | 
|---|
 | 174 |  ; RORIEN        IEN in the file #9000010
 | 
|---|
 | 175 |  ; RORDFN        DFN of Patient Record in File #2
 | 
|---|
 | 176 |  ;
 | 
|---|
 | 177 |  ; Return Values:
 | 
|---|
 | 178 |  ;       <0  Error Code
 | 
|---|
 | 179 |  ;        0  Ok
 | 
|---|
 | 180 |  ;      "S"  No visit data
 | 
|---|
 | 181 |  ;       >0  Non-fatal error(s)
 | 
|---|
 | 182 |  ;
 | 
|---|
 | 183 | PV1(RORIEN,RORDFN) ;
 | 
|---|
 | 184 |  N BUF,CLASS,CS,ERRCNT,IENS,KK4,RC,REC,REP,RORCLIN,RORMSG,PRV,TMP,TMP1,VST0
 | 
|---|
 | 185 |  S (ERRCNT,RC)=0
 | 
|---|
 | 186 |  D ECH^RORHL7(.CS,,.REP)
 | 
|---|
 | 187 |  ;
 | 
|---|
 | 188 |  ;--- Get Visit Data
 | 
|---|
 | 189 |  D ENCEVENT^PXKENC(RORIEN,1)
 | 
|---|
 | 190 |  Q:$D(^TMP("PXKENC",$J,RORIEN))<10 "S"
 | 
|---|
 | 191 |  S VST0=$G(^TMP("PXKENC",$J,RORIEN,"VST",RORIEN,0))
 | 
|---|
 | 192 |  ;
 | 
|---|
 | 193 |  ;--- Do not send visits with the following service categories: Daily
 | 
|---|
 | 194 |  ;--- Hospitalization (D), Ancillary (X), Chart (C), Not Found (N),
 | 
|---|
 | 195 |  ;                    (E), Event Historical, Hospitalization (H).
 | 
|---|
 | 196 |  Q:"HEDXNC"[$P(VST0,U,7) "S"
 | 
|---|
 | 197 |  ;
 | 
|---|
 | 198 |  ;--- Initialize the segment
 | 
|---|
 | 199 |  S RORSEG(0)="PV1"
 | 
|---|
 | 200 |  ;
 | 
|---|
 | 201 |  ;--- PV1-2 - Patient Class
 | 
|---|
 | 202 |  S RORSEG(2)="O"  ; O - Outpatient
 | 
|---|
 | 203 |  ;
 | 
|---|
 | 204 |  ;--- PV1-3 - Assigned Patient Location (Station Number and Stop Code)
 | 
|---|
 | 205 |  S RORCLIN=+$P(VST0,U,22),BUF=""
 | 
|---|
 | 206 |  I RORCLIN>0  D
 | 
|---|
 | 207 |  . S IENS=RORCLIN_","
 | 
|---|
 | 208 |  . S TMP=$$GET1^DIQ(44,IENS,3.5,"I")  Q:TMP'>0
 | 
|---|
 | 209 |  . S BUF=$$GET1^DIQ(40.8,TMP,1)       Q:BUF=""  ; Station Number
 | 
|---|
 | 210 |  . S TMP=$$STOPCODE^RORUTL18(+RORCLIN)
 | 
|---|
 | 211 |  . S $P(BUF,CS,6)=$S(TMP>0:TMP,1:"")            ; Stop Code
 | 
|---|
 | 212 |  Q:$P(BUF,CS,6)="" "S"  ; Stop Code is required
 | 
|---|
 | 213 |  S RORSEG(3)=BUF
 | 
|---|
 | 214 |  ;
 | 
|---|
 | 215 |  ; PV1-4  - Admission Type
 | 
|---|
 | 216 |  S TMP=$P($G(^TMP("PXKENC",$J,RORIEN,"VST",RORIEN,150)),U,3)
 | 
|---|
 | 217 |  S RORSEG(4)=TMP
 | 
|---|
 | 218 |  ;
 | 
|---|
 | 219 |  ;--- PV1-7 - Attending Physician (User IEN and Provider Class Name)
 | 
|---|
 | 220 |  S (KK4,BUF)=""
 | 
|---|
 | 221 |  F  S KK4=$O(^TMP("PXKENC",$J,RORIEN,"PRV",KK4))  Q:KK4=""  D
 | 
|---|
 | 222 |  . S REC=$G(^TMP("PXKENC",$J,RORIEN,"PRV",KK4,0))
 | 
|---|
 | 223 |  . S PRV=+$P(REC,U)  Q:(PRV'>0)!($P(REC,U,4)'="P")
 | 
|---|
 | 224 |  . S $P(PRV,CS,13)=$$GET1^DIQ(200,PRV_",",53.5,"E",,"RORMSG")
 | 
|---|
 | 225 |  . I $G(DIERR)  D  S ERRCNT=ERRCNT+1
 | 
|---|
 | 226 |  . . D DBS^RORERR("RORMSG",-99,,RORDFN,200,PRV_",")
 | 
|---|
 | 227 |  . S BUF=BUF_REP_PRV
 | 
|---|
 | 228 |  S RORSEG(7)=$P(BUF,REP,2,999)
 | 
|---|
 | 229 |  ;
 | 
|---|
 | 230 |  ;--- PV1-19 - Visit Number (IEN in the VISIT file #9000010) *KEY*
 | 
|---|
 | 231 |  S RORSEG(19)=RORIEN
 | 
|---|
 | 232 |  ;
 | 
|---|
 | 233 |  ;--- PV1-44 - Admit Date/Time (Visit Date/Time) *KEY*
 | 
|---|
 | 234 |  S TMP=$$FMTHL7^XLFDT($P(VST0,U))
 | 
|---|
 | 235 |  I TMP'>0  D  Q RC
 | 
|---|
 | 236 |  . S RC=$$ERROR^RORERR(-100,,,,"No admission date","ENCEVENT^PXKENC")
 | 
|---|
 | 237 |  S RORSEG(44)=TMP
 | 
|---|
 | 238 |  ;
 | 
|---|
 | 239 |  ;--- PV1-51 - Visit Indicator (Deleted Visit Indicator)
 | 
|---|
 | 240 |  S TMP=$P(VST0,U,11)
 | 
|---|
 | 241 |  S RORSEG(51)=$S(TMP'="":TMP,1:0)
 | 
|---|
 | 242 |  ;
 | 
|---|
 | 243 |  ;--- Store the segment
 | 
|---|
 | 244 |  D ADDSEG^RORHL7(.RORSEG)
 | 
|---|
 | 245 |  Q ERRCNT
 | 
|---|
 | 246 |  ;
 | 
|---|
 | 247 |  ;***** LOW-LEVEL SEGMENT BUILDER
 | 
|---|
 | 248 |  ;
 | 
|---|
 | 249 |  ; OBX3          Observation Identifier
 | 
|---|
 | 250 |  ;
 | 
|---|
 | 251 |  ; OBX5          Observation Value
 | 
|---|
 | 252 |  ;
 | 
|---|
 | 253 |  ; [OBX16]       Procedure Provider and Provider Class Name
 | 
|---|
 | 254 |  ;
 | 
|---|
 | 255 | SETOBX(OBX3,OBX5,OBX16) ;
 | 
|---|
 | 256 |  N RORSEG
 | 
|---|
 | 257 |  S RORSEG(0)="OBX"
 | 
|---|
 | 258 |  ;--- OBX-2 Value Type
 | 
|---|
 | 259 |  S RORSEG(2)="FT"
 | 
|---|
 | 260 |  ;--- OBX-3 Observation Identifier
 | 
|---|
 | 261 |  S RORSEG(3)=OBX3
 | 
|---|
 | 262 |  ;--- OBX-5 Observation Value
 | 
|---|
 | 263 |  S RORSEG(5)=OBX5
 | 
|---|
 | 264 |  ;--- OBX-11 Observation Result Status
 | 
|---|
 | 265 |  S RORSEG(11)="F"
 | 
|---|
 | 266 |  ;--- OBX-16 Responsible Observer (Procedure Provider)
 | 
|---|
 | 267 |  S:$G(OBX16)'="" RORSEG(16)=OBX16
 | 
|---|
 | 268 |  ;--- Store the segment
 | 
|---|
 | 269 |  D ADDSEG^RORHL7(.RORSEG)
 | 
|---|
 | 270 |  Q
 | 
|---|