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