| 1 | RORHL08 ;HOIFO/BH - HL7 INPATIENT DATA: PV1,OBR ; 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 |  ; #92           Read access to the PTF file (controlled)
 | 
|---|
| 7 |  ; #994          Read access to the PTF CLOSE OUT file (controlled)
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  Q
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ;***** INPATIENT DATA SEGMENT BUILDER
 | 
|---|
| 12 |  ;
 | 
|---|
| 13 |  ; RORDFN        DFN of Patient Record in File #2
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 |  ; .DXDTS        Reference to a local variable where the
 | 
|---|
| 16 |  ;               data extraction time frames are stored.
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  ; RORTY         Set to either "PV1" or "OBR"
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 |  ; The ^TMP("RORHL08",$J) global node is used by this function.
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 |  ; Return Values:
 | 
|---|
| 23 |  ;       <0  Error Code
 | 
|---|
| 24 |  ;        0  Ok
 | 
|---|
| 25 |  ;       >0  Non-fatal error(s)
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 | EN1(RORDFN,DXDTS,RORTY) ;
 | 
|---|
| 28 |  N ERRCNT,IENS,INIEN,PV1CNT,RC,RORMSG,TMP
 | 
|---|
| 29 |  S (ERRCNT,RC)=0
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  ;--- PV1 Segments
 | 
|---|
| 32 |  I RORTY="PV1"  K ^TMP("RORHL08",$J)  D
 | 
|---|
| 33 |  . N DATE,ENDT,IDX,STDT,TYPE,XREF
 | 
|---|
| 34 |  . S XREF=$NA(^TMP("RORPTF",$J,"PDI",RORDFN))
 | 
|---|
| 35 |  . S (IDX,PV1CNT)=0
 | 
|---|
| 36 |  . F  S IDX=$O(DXDTS(3,IDX))  Q:IDX'>0  D  Q:RC<0
 | 
|---|
| 37 |  . . S STDT=$P(DXDTS(3,IDX),U),ENDT=$P(DXDTS(3,IDX),U,2)
 | 
|---|
| 38 |  . . ;---
 | 
|---|
| 39 |  . . S TMP=$$UPDNDX(STDT,ENDT)
 | 
|---|
| 40 |  . . I TMP  Q:TMP<0  S ERRCNT=ERRCNT+TMP
 | 
|---|
| 41 |  . . ;---
 | 
|---|
| 42 |  . . S DATE=$O(@XREF@(STDT),-1)
 | 
|---|
| 43 |  . . F  S DATE=$O(@XREF@(DATE))  Q:'DATE!(DATE'<ENDT)  D
 | 
|---|
| 44 |  . . . S INIEN=""
 | 
|---|
| 45 |  . . . F  S INIEN=$O(@XREF@(DATE,INIEN))  Q:'INIEN  D
 | 
|---|
| 46 |  . . . . S IENS=INIEN_","
 | 
|---|
| 47 |  . . . . ;--- Skip non-PTF records
 | 
|---|
| 48 |  . . . . S TYPE=$$GET1^DIQ(45,IENS,11,"I",,"RORMSG")
 | 
|---|
| 49 |  . . . . I $G(DIERR)  D  S ERRCNT=ERRCNT+1  Q
 | 
|---|
| 50 |  . . . . . D DBS^RORERR("RORMSG",-9,,RORDFN,45,IENS)
 | 
|---|
| 51 |  . . . . Q:TYPE'="1"
 | 
|---|
| 52 |  . . . . ;--- Generate the PV1 segment
 | 
|---|
| 53 |  . . . . S TMP=$$PV1(INIEN,RORDFN)
 | 
|---|
| 54 |  . . . . I TMP  Q:TMP<0  S ERRCNT=ERRCNT+TMP
 | 
|---|
| 55 |  . . . . ;--- Reference for the corresponding OBR and OBX segments
 | 
|---|
| 56 |  . . . . S:TMP'="S" PV1CNT=PV1CNT+1,^TMP("RORHL08",$J,PV1CNT)=INIEN
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  ;--- OBR and OBX Segments
 | 
|---|
| 59 |  I RORTY="OBR"  D  K ^TMP("RORHL08",$J)
 | 
|---|
| 60 |  . S PV1CNT=0
 | 
|---|
| 61 |  . F  S PV1CNT=$O(^TMP("RORHL08",$J,PV1CNT))  Q:PV1CNT'>0  D
 | 
|---|
| 62 |  . . S INIEN=+$G(^TMP("RORHL08",$J,PV1CNT))  Q:INIEN'>0
 | 
|---|
| 63 |  . . ;---
 | 
|---|
| 64 |  . . S TMP=$$OBR(INIEN,RORDFN)
 | 
|---|
| 65 |  . . I TMP  Q:TMP<0  S ERRCNT=ERRCNT+TMP
 | 
|---|
| 66 |  . . ;---
 | 
|---|
| 67 |  . . S TMP=$$OBX^RORHL081(INIEN,RORDFN)
 | 
|---|
| 68 |  . . I TMP  Q:TMP<0  S ERRCNT=ERRCNT+TMP
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  ;--- Check for errors
 | 
|---|
| 71 |  Q $S(RC<0:RC,1:ERRCNT)
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  ;***** MERGES THE TIME FRAME INTO THE LIST
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ; .DXDTS        Reference to a local array where the time frames
 | 
|---|
| 76 |  ;               are returned: DXDTS(StartDT)=StartDT^EndDT.
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  ; STDT          Start date
 | 
|---|
| 79 |  ; ENDT          End date
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  ; This procedure merges the provided time frame [STDT,ENDT[ into
 | 
|---|
| 82 |  ; the list stored in the ^TMP("RORPTF",$J,"DTF") global node and
 | 
|---|
| 83 |  ; returns a list of time frames that should be updated into a
 | 
|---|
| 84 |  ; local array defined by the DXDTS parameter.
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  ; Variants of positional relationship of the existing time frames
 | 
|---|
| 87 |  ; and the one that is being added to the list:
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  ; (1)  +--------TMP                      +----------+
 | 
|---|
| 90 |  ;                     STDT--------ENDT
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ; (2)           +--------TMP
 | 
|---|
| 93 |  ;      STDT--------ENDT
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  ; (3)  TMP--------+
 | 
|---|
| 96 |  ;           STDT--------ENDT
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 |  ; (4)         +--------+
 | 
|---|
| 99 |  ;      STDT------------------ENDT
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 | MERGEDTF(DXDTS,STDT,ENDT) ;
 | 
|---|
| 102 |  N DATE,DXE,DXS,ENDT0,EXIT,STDT0,TMP  K DXDTS
 | 
|---|
| 103 |  Q:STDT>ENDT
 | 
|---|
| 104 |  S STDT0=STDT,(DXE,ENDT0)=ENDT
 | 
|---|
| 105 |  ;--- Merge time frames if possible
 | 
|---|
| 106 |  S DATE=$O(^TMP("RORPTF",$J,"DTF",ENDT)),EXIT=0
 | 
|---|
| 107 |  F  S DATE=$O(^TMP("RORPTF",$J,"DTF",DATE),-1)  Q:DATE=""  D  Q:EXIT
 | 
|---|
| 108 |  . S DXS=$P(^TMP("RORPTF",$J,"DTF",DATE),U,2)
 | 
|---|
| 109 |  . I DXS<STDT  S EXIT=1  Q         ; (1)
 | 
|---|
| 110 |  . S:DXS>ENDT ENDT=DXS,DFLT=0      ; (2)
 | 
|---|
| 111 |  . S:DXS<DXE DXDTS(DXS)=DXS_U_DXE
 | 
|---|
| 112 |  . S DXE=$P(^TMP("RORPTF",$J,"DTF",DATE),U)
 | 
|---|
| 113 |  . S:DXE<STDT STDT=DXE,DFLT=0      ; (3)
 | 
|---|
| 114 |  . K ^TMP("RORPTF",$J,"DTF",DATE)
 | 
|---|
| 115 |  S:DXE>STDT0 DXDTS(STDT0)=STDT0_U_DXE
 | 
|---|
| 116 |  ;--- Store the new time frame
 | 
|---|
| 117 |  S ^TMP("RORPTF",$J,"DTF",STDT)=STDT_U_ENDT
 | 
|---|
| 118 |  Q
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  ;***** OBR SEGMENT BUILDER (INPATIENT)
 | 
|---|
| 121 |  ;
 | 
|---|
| 122 |  ; RORIEN        IEN of file #45
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 |  ; RORDFN        DFN of Patient Record in File #2
 | 
|---|
| 125 |  ;
 | 
|---|
| 126 |  ; Return Values:
 | 
|---|
| 127 |  ;       <0  Error Code
 | 
|---|
| 128 |  ;        0  Ok
 | 
|---|
| 129 |  ;       >0  Non-fatal error(s)
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 | OBR(RORIEN,RORDFN) ;
 | 
|---|
| 132 |  N CS,ERRCNT,IENS,OBDT,RC,RORMSG,RORSEG,TMP
 | 
|---|
| 133 |  S (ERRCNT,RC)=0
 | 
|---|
| 134 |  D ECH^RORHL7(.CS)
 | 
|---|
| 135 |  ;
 | 
|---|
| 136 |  ;--- Initialize the segment
 | 
|---|
| 137 |  S RORSEG(0)="OBR"
 | 
|---|
| 138 |  ;
 | 
|---|
| 139 |  ;--- OBR-3 - Order Number (IEN in the PTF file #45)
 | 
|---|
| 140 |  S RORSEG(3)=RORIEN
 | 
|---|
| 141 |  ;
 | 
|---|
| 142 |  ;--- OBR-4 - Universal Service ID
 | 
|---|
| 143 |  S RORSEG(4)="IP"_CS_"Inpatient"_CS_"C4"
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  ;--- OBR-7 -Observation Date/Time (Admission Date/Time) *KEY*
 | 
|---|
| 146 |  S IENS=RORIEN_","
 | 
|---|
| 147 |  S OBDT=$$GET1^DIQ(45,IENS,2,"I",,"RORMSG")
 | 
|---|
| 148 |  Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,RORDFN,45,IENS)
 | 
|---|
| 149 |  ;---
 | 
|---|
| 150 |  S OBDT=$$FMTHL7^XLFDT(OBDT)
 | 
|---|
| 151 |  Q:OBDT'>0 $$ERROR^RORERR(-95,,,RORDFN,45,IENS,2)
 | 
|---|
| 152 |  S RORSEG(7)=OBDT
 | 
|---|
| 153 |  ;
 | 
|---|
| 154 |  ;--- OBR-24 - Diagnostic Service ID
 | 
|---|
| 155 |  S RORSEG(24)="PHY"
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  ;--- OBR-44 - Division
 | 
|---|
| 158 |  S RORSEG(44)=$$SITE^RORUTL03(CS)
 | 
|---|
| 159 |  ;
 | 
|---|
| 160 |  ;--- Store the segment
 | 
|---|
| 161 |  D ADDSEG^RORHL7(.RORSEG)
 | 
|---|
| 162 |  Q ERRCNT
 | 
|---|
| 163 |  ;
 | 
|---|
| 164 |  ;***** PV1 SEGMENT BUILDER (INPATIENT)
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  ; RORIEN        IEN of file #45
 | 
|---|
| 167 |  ;
 | 
|---|
| 168 |  ; RORDFN        DFN of Patient Record in File #2
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 |  ; Return Values:
 | 
|---|
| 171 |  ;       <0  Error Code
 | 
|---|
| 172 |  ;        0  Ok
 | 
|---|
| 173 |  ;      "S"  No inpatient data
 | 
|---|
| 174 |  ;       >0  Non-fatal error(s)
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 | PV1(RORIEN,RORDFN) ;
 | 
|---|
| 177 |  N BUF,CS,ERRCNT,IENS,RC,RORBUF,RORMSG,RORSEG,TMP
 | 
|---|
| 178 |  S (ERRCNT,RC)=0
 | 
|---|
| 179 |  D ECH^RORHL7(.CS)
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 |  ;--- Load the data
 | 
|---|
| 182 |  S IENS=RORIEN_","
 | 
|---|
| 183 |  D GETS^DIQ(45,IENS,"2;70;71;72","I","RORBUF","RORMSG")
 | 
|---|
| 184 |  I $G(DIERR)  D  S ERRCNT=ERRCNT+1
 | 
|---|
| 185 |  . D DBS^RORERR("RORMSG",-9,,RORDFN,45,IENS)
 | 
|---|
| 186 |  ;
 | 
|---|
| 187 |  ;--- Initialize the segment
 | 
|---|
| 188 |  S RORSEG(0)="PV1"
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 |  ;--- PV1-2 - Patient Class
 | 
|---|
| 191 |  S RORSEG(2)="I"  ; I - Inpatient
 | 
|---|
| 192 |  ;
 | 
|---|
| 193 |  ;--- PV1-3 - Assigned Patient Location (Station Number)
 | 
|---|
| 194 |  S TMP=$E($P($$SITE^VASITE,U,3),1,3)  ; Strip the suffix
 | 
|---|
| 195 |  Q:TMP'>0 $$ERROR^RORERR(-100,,,,"No station number","$$SITE^VASITE")
 | 
|---|
| 196 |  S RORSEG(3)=TMP
 | 
|---|
| 197 |  ;
 | 
|---|
| 198 |  ;--- PV1-6 - Prior Patient Location (Bed Section at Discharge)
 | 
|---|
| 199 |  I $G(RORBUF(45,IENS,71,"I"))>0  D
 | 
|---|
| 200 |  . S BUF=""
 | 
|---|
| 201 |  . S $P(BUF,CS,3)=RORBUF(45,IENS,71,"I")  ; Bed Section IEN
 | 
|---|
| 202 |  . S TMP=$$EXTERNAL^DILFD(45,71,,$P(BUF,CS,3),"RORMSG")
 | 
|---|
| 203 |  . I $G(DIERR)  D  S ERRCNT=ERRCNT+1  Q
 | 
|---|
| 204 |  . . D DBS^RORERR("RORMSG",-99,,RORDFN,45,IENS)
 | 
|---|
| 205 |  . S $P(BUF,CS,9)=$$ESCAPE^RORHL7(TMP)    ; Bed Section Name
 | 
|---|
| 206 |  . S RORSEG(6)=BUF
 | 
|---|
| 207 |  ;
 | 
|---|
| 208 |  ;--- PV1-19 - Visit Number (IEN in the PTF file #45) *KEY*
 | 
|---|
| 209 |  S RORSEG(19)=RORIEN
 | 
|---|
| 210 |  ;
 | 
|---|
| 211 |  ;--- PV1-36 - Discharge Disposition
 | 
|---|
| 212 |  S RORSEG(36)=$G(RORBUF(45,IENS,72,"I"))
 | 
|---|
| 213 |  ;
 | 
|---|
| 214 |  ;--- PV1-44 - Admit Date/Time *KEY*
 | 
|---|
| 215 |  S TMP=$$FMTHL7^XLFDT($G(RORBUF(45,IENS,2,"I")))
 | 
|---|
| 216 |  Q:TMP'>0 $$ERROR^RORERR(-95,,,RORDFN,45,IENS,2)
 | 
|---|
| 217 |  S RORSEG(44)=TMP
 | 
|---|
| 218 |  ;
 | 
|---|
| 219 |  ;--- PV1-45 - Discharge Date/Time
 | 
|---|
| 220 |  S RORSEG(45)=$$FM2HL^RORHL7($G(RORBUF(45,IENS,70,"I")))
 | 
|---|
| 221 |  ;
 | 
|---|
| 222 |  ;--- Store the segment
 | 
|---|
| 223 |  D ADDSEG^RORHL7(.RORSEG)
 | 
|---|
| 224 |  Q ERRCNT
 | 
|---|
| 225 |  ;
 | 
|---|
| 226 |  ;***** UPDATES TEMPORARY PTF INDEX
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  ; STDT          Start date
 | 
|---|
| 229 |  ; ENDT          End date
 | 
|---|
| 230 |  ;
 | 
|---|
| 231 |  ; This function updates the temporary PTF index with records
 | 
|---|
| 232 |  ; closed in the provided time frame.
 | 
|---|
| 233 |  ;
 | 
|---|
| 234 |  ; Return Values:
 | 
|---|
| 235 |  ;       <0  Error Code
 | 
|---|
| 236 |  ;        0  Ok
 | 
|---|
| 237 |  ;
 | 
|---|
| 238 | UPDNDX(STDT,ENDT) ;
 | 
|---|
| 239 |  N DATE,DXDTS,IDX,IEN,PATIEN,RC,RORMSG,TMP
 | 
|---|
| 240 |  ;--- Get time frames that should be processed
 | 
|---|
| 241 |  D MERGEDTF(.DXDTS,STDT,ENDT)  Q:$D(DXDTS)<10 0
 | 
|---|
| 242 |  ;--- Update the index
 | 
|---|
| 243 |  S IDX=0
 | 
|---|
| 244 |  F  S IDX=$O(DXDTS(IDX))  Q:IDX'>0  D
 | 
|---|
| 245 |  . S STDT=$P(DXDTS(IDX),U),ENDT=$P(DXDTS(IDX),U,2)
 | 
|---|
| 246 |  . S DATE=$O(^DGP(45.84,"AC",STDT),-1)
 | 
|---|
| 247 |  . F  S DATE=$O(^DGP(45.84,"AC",DATE))  Q:'DATE!(DATE'<ENDT)  D
 | 
|---|
| 248 |  . . S IEN=0
 | 
|---|
| 249 |  . . F  S IEN=$O(^DGP(45.84,"AC",DATE,IEN))  Q:IEN'>0  D
 | 
|---|
| 250 |  . . . ;--- Patient IEN (entries of file #45.84 are DINUM'ed)
 | 
|---|
| 251 |  . . . S PATIEN=$$GET1^DIQ(45,IEN,.01,"I",,"RORMSG")
 | 
|---|
| 252 |  . . . I $G(DIERR)  D DBS^RORERR("RORMSG",-99,,,45,IEN)  Q
 | 
|---|
| 253 |  . . . ;--- Create index entry
 | 
|---|
| 254 |  . . . S:PATIEN>0 ^TMP("RORPTF",$J,"PDI",PATIEN,DATE,IEN)=""
 | 
|---|
| 255 |  ;---
 | 
|---|
| 256 |  Q 0
 | 
|---|