| 1 | RGADT1 ;HIRMFO/GJC-BUILD ADT MESSAGES (A01/A03) ;09/21/99
 | 
|---|
| 2 |  ;;1.0;CLINICAL INFO RESOURCE NETWORK;**4,14,17,27,28,31,34,45**;30 Apr 99;Build 9
 | 
|---|
| 3 |  Q  ; quit if called from the top
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | EN ; entry point to build/transmit ADT messages
 | 
|---|
| 6 |  ; Messages built by this software are fired off by server protocols:
 | 
|---|
| 7 |  ; RG ADT-A01 SERVER -or- RG ADT-A03 SERVER
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  ; This code is called from the RG ADT INPATIENT ENCOUNTER DRIVER &
 | 
|---|
| 10 |  ; RG ADT OUTPATIENT ENCOUNTER DRIVER protocols.
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  ; RG ADT OUTPATIENT ENCOUNTER DRIVER is an item protocol under the
 | 
|---|
| 13 |  ; SDAM APPOINTMENTS EVENTS protocol & RG ADT INPATIENT ENCOUNTER DRIVER
 | 
|---|
| 14 |  ; hangs off of the DGPM MOVEMENT EVENTS protocol.
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ; RG ADT OUTPATIENT ENCOUNTER DRIVER hangs off of SDAM APPOINTMENTS
 | 
|---|
| 17 |  ; EVENTS because of DBIA: 1320; RG ADT INPATIENT ENCOUNTER DRIVER
 | 
|---|
| 18 |  ; hangs off of DGPM MOVEMENT EVENTS because of DBIA: 1181.
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 |  ; Integration Agreements (IAs) utilized in this application:
 | 
|---|
| 21 |  ; #1181-subscribers for the DGPM MOVEMENT EVENTS event driver
 | 
|---|
| 22 |  ; #1320-subscribers for the SDAM APPOINTMENT EVENTS event driver
 | 
|---|
| 23 |  ; #2070-check for a national ICN 1st piece, "MPI" node (global read)
 | 
|---|
| 24 |  ; #2161-INIT^HLFNC2
 | 
|---|
| 25 |  ; #2164-GENERATE^HLMA
 | 
|---|
| 26 |  ; #2171-$$WHAT^XUAF4 (Name_"^"_Station Number, we're after Station #)
 | 
|---|
| 27 |  ; #2541-$$KSP^XUPARAM (facility ien, file 4)
 | 
|---|
| 28 |  ; #2624-$$SEND^VAFHUTL()
 | 
|---|
| 29 |  ; #3015-PID segment generation (CIRN PD)
 | 
|---|
| 30 |  ; #3016-EVN segment generation (CIRN PD)
 | 
|---|
| 31 |  ; #3017-PD1 segment generator (CIRN PD)
 | 
|---|
| 32 |  ; #3018-PV1 segment generator (CIRN PD)
 | 
|---|
| 33 |  ; #3072-assign a local ICN to a patient
 | 
|---|
| 34 |  ; #3630-BLDEVN^VAFCQRY, BLDPD1^VAFCQRY & BLDPID^VAFCQRY
 | 
|---|
| 35 |  ; #2988-FILE^VAFCTFU
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 |  ; I $D(RGDG101) then we know we've dropped into this software
 | 
|---|
| 38 |  ; from the DGPM MOVEMENT EVENTS protocol (RG ADT INPATIENT
 | 
|---|
| 39 |  ; ENCOUNTER DRIVER)
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  ; Note: DFN is a supported variable in the case of admissions and
 | 
|---|
| 42 |  ; discharges within the Registration package. (part of the discovery
 | 
|---|
| 43 |  ; in the development of RG*1.0*14)
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 |  ; first check if HL7 2.3 messaging has been disabled.  DBIA: 2624
 | 
|---|
| 46 |  I '$P($$SEND^VAFHUTL(),"^",2) Q
 | 
|---|
| 47 |  S RGOK=0,RGDATE=""
 | 
|---|
| 48 |  I $D(RGDG101) D
 | 
|---|
| 49 |  . I $G(DFN)'=+$G(DFN) Q  ; DFN must be valid
 | 
|---|
| 50 |  .; if an national ICN is missing, assign a local then quit
 | 
|---|
| 51 |  . I '$P($G(^DPT(DFN,"MPI")),"^") S RGLOCAL=$$ICNLC^MPIF001(DFN) Q
 | 
|---|
| 52 |  . Q:$$IFLOCAL^MPIF001(DFN)  ; IA 2701, patient has local icn, quit
 | 
|---|
| 53 |  . N %,VAERR,VAIP
 | 
|---|
| 54 |  . S VAIP("D")="LAST" D IN5^VADPT ; dfn should be defined at this point
 | 
|---|
| 55 |  . S RGTYPE=+$G(VAIP(2)) ; RGTYPE=movement type
 | 
|---|
| 56 |  . I RGTYPE'=1&(RGTYPE'=3) Q  ; admission or discharges only
 | 
|---|
| 57 |  . S RGENVR=$S(RGTYPE=1:"A1",1:"A2") ; A1=admission, A2=discharge
 | 
|---|
| 58 |  . S RGDATE=$P($G(VAIP(3)),"^"),RGMOV=$G(VAIP(1))
 | 
|---|
| 59 |  . ; RGDATE=movement date/time, RGMOV=ien #405
 | 
|---|
| 60 |  . S:RGDATE]"" RGOK=1
 | 
|---|
| 61 |  . Q
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ; I $D(RGSD101) then we know we've dropped into this software
 | 
|---|
| 64 |  ; from the SDAM APPOINTMENT EVENTS protocol (RG ADT OUTPATIENT
 | 
|---|
| 65 |  ; ENCOUNTER DRIVER)
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ; Check SDAMEVT for values between five and nine inclusive.  See if
 | 
|---|
| 68 |  ; this particular outpatient encounter has a status of CHECKED OUT.
 | 
|---|
| 69 |  ; gjc@Hines OI for patch 14
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 |  ; Note: DFN is not a supported variable in the case of clinic
 | 
|---|
| 72 |  ; appointments and workload crediting for count clinics within the
 | 
|---|
| 73 |  ; Scheduling package. (part of the discovery in the development of
 | 
|---|
| 74 |  ; RG*1.0*14)
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 |  ; check-out, stop code add/edit, disp add/edit?
 | 
|---|
| 77 |  N I
 | 
|---|
| 78 |  I $D(RGSD101),($D(SDAMEVT))#2 N DFN D
 | 
|---|
| 79 |  . ; Note: DFN is unstable; it's up to us to define it...
 | 
|---|
| 80 |  . ;chk-out, stop code add, stop code change, disp add & disp change
 | 
|---|
| 81 |  . I SDAMEVT<5!(SDAMEVT>9) Q
 | 
|---|
| 82 |  . S RGTYPE=SDAMEVT,RGENVR="A3"
 | 
|---|
| 83 |  . N RGSDOE,RGPARSE,RGPROC,RGTMP S RGPROC=0
 | 
|---|
| 84 |  . F  S RGPROC=$O(^TMP("SDEVT",$J,SDHDL,RGPROC)) Q:'RGPROC  D
 | 
|---|
| 85 |  .. S RGSDOE=0
 | 
|---|
| 86 |  .. F  S RGSDOE=$O(^TMP("SDEVT",$J,SDHDL,RGPROC,"SDOE",RGSDOE)) Q:'RGSDOE  D
 | 
|---|
| 87 |  ... S RGSDOE(0)=$G(^TMP("SDEVT",$J,SDHDL,RGPROC,"SDOE",RGSDOE,0,"AFTER"))
 | 
|---|
| 88 |  ... ; Note: RGSDOE(0)=zero node of 409.68, DFN is the second piece 
 | 
|---|
| 89 |  ... S DFN=$P(RGSDOE(0),"^",2) Q:'DFN  ; DFN must exist
 | 
|---|
| 90 |  ... ; ignore current inpatients
 | 
|---|
| 91 |  ... Q:$L($G(^DPT(DFN,.1)))  ; ward location check IA: 10035
 | 
|---|
| 92 |  ...; if an national ICN is missing, assign a local then quit
 | 
|---|
| 93 |  ... I '$P($G(^DPT(DFN,"MPI")),"^") S RGLOCAL=$$ICNLC^MPIF001(DFN) Q
 | 
|---|
| 94 |  ... Q:$$IFLOCAL^MPIF001(DFN)  ; IA 2701, patient has local icn, quit
 | 
|---|
| 95 |  ... K RGPARSE D PARSE^SDOE(.RGSDOE,"EXTERNAL","RGPARSE")
 | 
|---|
| 96 |  ... I $G(RGPARSE(.12))="CHECKED OUT" S RGTMP=$P(RGSDOE(0),U)
 | 
|---|
| 97 |  ... S:$G(RGTMP)>RGDATE RGDATE=RGTMP
 | 
|---|
| 98 |  ... Q
 | 
|---|
| 99 |  .. Q
 | 
|---|
| 100 |  . S:$G(RGDATE)]"" RGOK=1
 | 
|---|
| 101 |  . Q
 | 
|---|
| 102 |  ; S ^TMP("RGTRACE",$J)=1
 | 
|---|
| 103 |  I 'RGOK K RGLOCAL,RGTYPE,RGMOV,RGDATE,RGENVR,RGOK Q  ; quit if not A01 or A03
 | 
|---|
| 104 |  I '($G(DGQUIET)) S:$D(^TMP("RGTRACE",$J)) RGTRACE=1
 | 
|---|
| 105 |  N RGSITE S RGSITE=+$$SITE^VASITE
 | 
|---|
| 106 |  ;before updating and broadcasting check to see if the date and/or event changed
 | 
|---|
| 107 |  N LIST,X,OUT,RGCHNG,RGDLT,RGEVN D TFL^VAFCTFU1(.LIST,DFN) S (RGCHNG,OUT,X)=0 F  S X=$O(LIST(X)) Q:'X!(OUT=1)  D
 | 
|---|
| 108 |  . S RGDATE=$P(RGDATE,"."),RGDLT=$P(LIST(X),"^",3),RGDLT=$P(RGDLT,"."),RGEVN=$P(LIST(X),"^",4)
 | 
|---|
| 109 |  . I $P(LIST(X),"^")=$P($$SITE^VASITE,"^",3) S OUT=1 D
 | 
|---|
| 110 |  .. I RGDATE'=RGDLT D  Q
 | 
|---|
| 111 |  ... I RGDATE>RGDLT S RGCHNG=1
 | 
|---|
| 112 |  .. I RGDATE=RGDLT D
 | 
|---|
| 113 |  .. I $E(RGENVR,2)'=RGEVN D
 | 
|---|
| 114 |  ... I RGENVR="A3" S RGCHNG=0
 | 
|---|
| 115 |  ... I RGENVR="A1" S RGCHNG=1
 | 
|---|
| 116 |  ... I RGENVR="A2" S RGCHNG=1
 | 
|---|
| 117 |  ;if no change in DLT or Event Reason quit
 | 
|---|
| 118 |  Q:RGCHNG=0
 | 
|---|
| 119 |  D FILE^VAFCTFU(DFN,RGSITE_"^"_$G(RGDATE)_"^"_$G(RGENVR),1)
 | 
|---|
| 120 |  ;do FILE^VAFCTFU to update DLT and event reason
 | 
|---|
| 121 |  I $D(RGTRACE) D EVENT,EXIT Q
 | 
|---|
| 122 |  N ZTDESC,ZTRTN,ZTSAVE,ZTIO,ZTDTH
 | 
|---|
| 123 |  S ZTDESC="CIRN HL7 ADT-"_$S(RGTYPE=1:"A01",1:"A03")_" Messaging"
 | 
|---|
| 124 |  S ZTRTN="EVENT^RGADT1",ZTIO="",ZTDTH=$H
 | 
|---|
| 125 |  F I="DFN","RGDATE","RGTYPE","RGENVR" S ZTSAVE(I)=""
 | 
|---|
| 126 |  ; check for $D of RGDG101 & RGSD101 need to know protocol executed
 | 
|---|
| 127 |  S:$D(RGDG101) ZTSAVE("RGDG101")="" S:$D(RGSD101) ZTSAVE("RGSD101")=""
 | 
|---|
| 128 |  S:$D(RGMOV) ZTSAVE("RGMOV")="" ; defined for admissions & discharges
 | 
|---|
| 129 |  S:$D(SDOE) ZTSAVE("SDOE")="" ; file ien: 409.68, clinic check out
 | 
|---|
| 130 |  D ^%ZTLOAD,EXIT
 | 
|---|
| 131 |  K DGQUIET
 | 
|---|
| 132 |  Q
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 | EVENT ; build the HL7 message
 | 
|---|
| 135 |  S:$D(ZTQUEUED) ZTREQ="@"
 | 
|---|
| 136 |  S RGEVT=$S(RGTYPE=1:"A01",1:"A03") K HL
 | 
|---|
| 137 |  D INIT^HLFNC2("RG ADT-"_RGEVT_" 2.4 SERVER",.HL)
 | 
|---|
| 138 |  I $G(HL) Q  ; error
 | 
|---|
| 139 |  D BUILD
 | 
|---|
| 140 |  D GENERATE^HLMA("RG ADT-"_RGEVT_" 2.4 SERVER","LM",1,.RGRSLT,"",.HL)
 | 
|---|
| 141 |  D KILL^HLTRANS
 | 
|---|
| 142 |  K HLA("HLS"),RGDATE,RGDG101,RGENVR,RGEVT,RGSD101,RGTYPE
 | 
|---|
| 143 |  Q
 | 
|---|
| 144 | EXIT ; kill and quit
 | 
|---|
| 145 |  K ^TMP("RGTRACE",$J),RGDATE,RGENVR,RGEVT,RGOK,RGLOCAL,RGMOV,RGPAT
 | 
|---|
| 146 |  K RGRSLT,RGFSTR,RGTRACE,RGTYPE
 | 
|---|
| 147 |  Q
 | 
|---|
| 148 | BUILD ; build the ADT message
 | 
|---|
| 149 |  ; EVN segment
 | 
|---|
| 150 |  N CNT,ERR,EVN,RGCNT,SEQ
 | 
|---|
| 151 |  S RGCNT=1
 | 
|---|
| 152 |  D BLDEVN^VAFCQRY(DFN,"1,2,4,5,6,7",.EVN,.HL,$G(HL("ETN")))
 | 
|---|
| 153 |  S HLA("HLS",RGCNT)=$G(EVN(1)) S RGCNT=RGCNT+1
 | 
|---|
| 154 |  N PID S SEQ="ALL" D BLDPID^VAFCQRY(DFN,1,.SEQ,.PID,.HL,.ERR) S HLA("HLS",RGCNT)=PID(1) S X=1,CNT=1 F  S X=$O(PID(X)) Q:'X  I $D(PID(X)) S HLA("HLS",RGCNT,CNT)=PID(X),CNT=CNT+1
 | 
|---|
| 155 |  S RGCNT=RGCNT+1
 | 
|---|
| 156 |  ; PD1 segment
 | 
|---|
| 157 |  N PD1
 | 
|---|
| 158 |  S SEQ="3" D BLDPD1^VAFCQRY(DFN,.SEQ,.PD1,.HL,.ERR) S HLA("HLS",RGCNT)=PD1(1)
 | 
|---|
| 159 |  S RGCNT=RGCNT+1
 | 
|---|
| 160 |  ; PV1 segment
 | 
|---|
| 161 |  S RGFSTR="2,3,4,5,"_$$COMMANUM(7,45)
 | 
|---|
| 162 |  ;for admission/discharges (registration)
 | 
|---|
| 163 |  I RGTYPE=1!(RGTYPE=3) S HLA("HLS",4)=$$IN^VAFHLPV1(DFN,RGDATE,RGFSTR,RGMOV,"","")
 | 
|---|
| 164 |  ;for scheduling events: checkout
 | 
|---|
| 165 |  I RGTYPE'=1&(RGTYPE'=3) S HLA("HLS",4)=$$EN^VAFHLPV1("",,RGFSTR,,HL("Q"),HL("FS"))
 | 
|---|
| 166 |  S HLA("HLS",4)=$$FAC(HLA("HLS",4))
 | 
|---|
| 167 |  ; adding ZPD segment for POW Status - patch P
 | 
|---|
| 168 |  S HLA("HLS",5)=$$EN1^VAFHLZPD(DFN,"1,17,21,34") ;**45 changed to EN1 call and added PSEUDO SSN REASON TO ZPD SEGMENT
 | 
|---|
| 169 |  ;**45 added 21 and 1 to ZPD call also
 | 
|---|
| 170 |  Q
 | 
|---|
| 171 | COMMANUM(FROM,TO) ;Build comma seperated list of numbers
 | 
|---|
| 172 |  ;Input  : FROM - Starting number (default = 1)
 | 
|---|
| 173 |  ;                   TO - Ending number (default = FROM)
 | 
|---|
| 174 |  ;Output : Comma separated list of numbers between FROM and TO
 | 
|---|
| 175 |  ;             (Ex: 1,2,3)
 | 
|---|
| 176 |  ;Notes  : Call assumes FROM <= TO
 | 
|---|
| 177 |  ;             copied from COMMANUM^VAFCADT2
 | 
|---|
| 178 |  ;
 | 
|---|
| 179 |  S FROM=$G(FROM) S:(FROM="") FROM=1
 | 
|---|
| 180 |  S TO=$G(TO) S:(TO="") TO=FROM
 | 
|---|
| 181 |  N OUTPUT,X
 | 
|---|
| 182 |  S OUTPUT=FROM
 | 
|---|
| 183 |  F X=(FROM+1):1:TO S OUTPUT=(OUTPUT_","_X)
 | 
|---|
| 184 |  Q OUTPUT
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 | FAC(X) ; set facility information, in the form of the Station Number, into
 | 
|---|
| 187 |  ; PV1(3).
 | 
|---|
| 188 |  ; input: the entire PV1 segment
 | 
|---|
| 189 |  ; yield: updated PV1 segment; PV1(3) has facility information (Sta. #)
 | 
|---|
| 190 |  N Y0,Y1 S Y0=$E(HL("ECH"),$L(HL("ECH")))_$$WHAT^XUAF4(+$$KSP^XUPARAM("INST"),99)
 | 
|---|
| 191 |  S Y1=$P(X,HL("FS"),4),$P(Y1,$E(HL("ECH")),4)=Y0,$P(X,HL("FS"),4)=Y1
 | 
|---|
| 192 |  Q X
 | 
|---|