1 | PSBSVHL7 ;BIRMINGHAM/TEJ-BCMA HL7 SERVER ;Mar 2004
|
---|
2 | ;;3.0;BAR CODE MED ADMIN;**3**;Mar 2004
|
---|
3 | ; Reference/IA
|
---|
4 | ; $$HLDATE^HLFNC/10106
|
---|
5 | ; $$HLNAME^HLFNC/10106
|
---|
6 | ; INIT^HLFNC2/2161
|
---|
7 | ; GENERATE^HLMA/2164
|
---|
8 | ; File 50.7/2880
|
---|
9 | ; File 52.6/436
|
---|
10 | ; File 52.7/437
|
---|
11 | ; File 200/10060
|
---|
12 | ; DEM^VADPT/10061
|
---|
13 | ;
|
---|
14 | ; Description:
|
---|
15 | ; This routine is to service BCMA HL7 messaging to other COTS and
|
---|
16 | ; VISTA application.
|
---|
17 | ; The entry point ("EN") is accessed via BCMA. This routine
|
---|
18 | ; basically consists of subroutines to generate HL7 messages
|
---|
19 | ; per trigger events coresponding to BCMA transactions.
|
---|
20 | ; These trigger events are captured within the routine PSBML.
|
---|
21 | ; PSBML passes the affected BCMA MEDICATION LOG File IEN and
|
---|
22 | ; a variable capturing the BCMA activity as the input.
|
---|
23 | ; Input - PSBIEN Affected BCMA record(s)
|
---|
24 | ; PSBHL7X BCMA trigger event/transaction
|
---|
25 | ; Output - HL7 broadcast to subscribing Applications
|
---|
26 | ;
|
---|
27 | EN(PSBIEN,PSBHL7X) ; This is the entry point for for all HL7 processing
|
---|
28 | 1 ; set up environment for message
|
---|
29 | N PSBHLFS,PSBHLCS
|
---|
30 | D INIT^HLFNC2("PSB BCMA RASO17 SRV",.HL)
|
---|
31 | I $G(HL) W:+HL'=16 !,"Error: "_$P(HL,2) Q ; error occurred
|
---|
32 | S PSBHLFS=$G(HL("FS")) I PSBHLFS="" S PSBHLFS="^"
|
---|
33 | S PSBHLCS=$E(HL("ECH"),1)
|
---|
34 | S PSBHLSCS=$E(HL("ECH"),4)
|
---|
35 | 2 ; Add appropriate message txt to HLA array
|
---|
36 | K HLA,HLEVN
|
---|
37 | N PSBDFN,PSBHL7MS
|
---|
38 | S PSBCNT=0
|
---|
39 | I (PSBHL7X["MEDPASS")!(PSBHL7X["UPDATE STATUS") D MEDSTAT Q
|
---|
40 | I (PSBHL7X["ADD COMMENT") D COMMENT Q
|
---|
41 | I (PSBHL7X["PRN EFFECTI") D PRNEFFE Q
|
---|
42 | Q
|
---|
43 | MEDSTAT ;MEDPASS and UPDATE trigger events
|
---|
44 | D PID,PV1,ORC,RXO
|
---|
45 | D:$D(^PSB(53.79,PSBIEN,.3,0)) NTE
|
---|
46 | D RXR,RXC,RXA,TRANS Q
|
---|
47 | COMMENT ;ADD COMNMENT trigger event
|
---|
48 | D PID,ORC,NTE,TRANS Q
|
---|
49 | PRNEFFE ;PRN EFFECTIVENESS trigger event
|
---|
50 | D PID,ORC,NTE,TRANS Q
|
---|
51 | PID ; PID segment -- use segment generator
|
---|
52 | S PSBDFN=$P(^PSB(53.79,PSBIEN,0),U,1),DFN=PSBDFN D DEM^VADPT
|
---|
53 | S PSBCNT=PSBCNT+1,$P(PSBHL7MS,PSBHLFS,3)=PSBDFN
|
---|
54 | S $P(VADM(4),PSBHLCS)=VADM(4),$P(VADM(4),PSBHLCS,5)="AGE",$P(PSBHL7MS,PSBHLFS,4)=VADM(4)
|
---|
55 | S $P(PSBHL7MS,PSBHLFS,5)=$$HLNAME^HLFNC(VADM(1),HL("ECH"))
|
---|
56 | S $P(PSBHL7MS,PSBHLFS,7)=$$HLDATE^HLFNC(+VADM(3),"DT")
|
---|
57 | S $P(PSBHL7MS,PSBHLFS,19)=$P(VADM(2),"^")
|
---|
58 | S $P(PSBHL7MS,PSBHLFS,8)=$P(VADM(5),"^")
|
---|
59 | S HLA("HLS",PSBCNT)="PID"_PSBHLFS_PSBHL7MS
|
---|
60 | Q
|
---|
61 | PV1 ; PV1 segment
|
---|
62 | K PSBHL7MS,PSBHL7FD
|
---|
63 | S PSBCNT=PSBCNT+1,HLA("HLS",PSBCNT)="PV1"_PSBHLFS
|
---|
64 | S $P(PSBHL7MS,PSBHLFS,2)="U"
|
---|
65 | ; Construct location field
|
---|
66 | S $P(PSBHL7FD,PSBHLCS,1)=$$ESC($P(^PSB(53.79,PSBIEN,0),U,2))
|
---|
67 | S $P(PSBHL7FD,PSBHLCS,4)=$$ESC($P(^PSB(53.79,PSBIEN,0),U,3))
|
---|
68 | S $P(PSBHL7MS,PSBHLFS,3)=PSBHL7FD K PSBHL7FD
|
---|
69 | ; Construct attending physician data
|
---|
70 | S $P(PSBHL7FD,PSBHLCS,1)=$P(^PSB(53.79,PSBIEN,0),U,5)
|
---|
71 | S $P(PSBHL7FD,PSBHLCS,2)=$$HLNAME^HLFNC($$GET1^DIQ(200,$P(PSBHL7FD,PSBHLCS,1)_",",.01),HL("ECH"))
|
---|
72 | S $P(PSBHL7MS,PSBHLFS,7)=PSBHL7FD K PSBHL7FD
|
---|
73 | S HLA("HLS",PSBCNT)=(HLA("HLS",PSBCNT))_PSBHL7MS
|
---|
74 | Q
|
---|
75 | ORC ; ORC segment
|
---|
76 | K PSBHL7MS,PSBHL7FD
|
---|
77 | S PSBCNT=PSBCNT+1,HLA("HLS",PSBCNT)="ORC"_PSBHLFS
|
---|
78 | S $P(PSBHL7MS,PSBHLFS,1)="XX"
|
---|
79 | S $P(PSBHL7MS,PSBHLFS,2)=PSBIEN_PSBHLCS_"PSB"_PSBHLCS_PSBIEN_PSBHLCS_"IEN"
|
---|
80 | S $P(PSBHL7MS,PSBHLFS,3)=$P(^PSB(53.79,PSBIEN,.1),U)
|
---|
81 | D PSJ1^PSBVT(PSBDFN,$P(PSBHL7MS,PSBHLFS,3))
|
---|
82 | ; Construct quantity/time
|
---|
83 | S $P(PSBHL7FD,PSBHLCS,1)=$P(^PSB(53.79,PSBIEN,.1),U,5)
|
---|
84 | S $P(PSBHL7FD,PSBHLCS,2)=$$ESC(PSBSCH)
|
---|
85 | S $P(PSBHL7FD,PSBHLCS,4)=$$HLDATE^HLFNC($P(^PSB(53.79,PSBIEN,.1),U,3),"TS")
|
---|
86 | S $P(PSBHL7FD,PSBHLCS,10)=$$ESC(PSBSCHT)
|
---|
87 | S $P(PSBHL7MS,PSBHLFS,7)=PSBHL7FD K PSBHL7FD
|
---|
88 | ; Construct previous (parent) order data
|
---|
89 | S:$D(PSBPONX) $P(PSBHL7FD,PSBHLCS,2)=PSBPONX
|
---|
90 | S $P(PSBHL7MS,PSBHLFS,8)=$G(PSBHL7FD) K PSBHL7FD
|
---|
91 | S $P(PSBHL7MS,PSBHLFS,9)=$$HLDATE^HLFNC($P(^PSB(53.79,PSBIEN,0),U,6),"TS")
|
---|
92 | ; Construct entered by data
|
---|
93 | S $P(PSBHL7FD,PSBHLCS,1)=$P(^PSB(53.79,PSBIEN,0),U,5)
|
---|
94 | S $P(PSBHL7FD,PSBHLCS,2)=$$HLNAME^HLFNC($$GET1^DIQ(200,$P(PSBHL7FD,PSBHLCS,1)_",",.01),HL("ECH"))
|
---|
95 | S $P(PSBHL7MS,PSBHLFS,10)=PSBHL7FD K PSBHL7FD
|
---|
96 | S $P(PSBHL7MS,PSBHLFS,15)=$$HLDATE^HLFNC($P(^PSB(53.79,PSBIEN,0),U,4),"TS")
|
---|
97 | ; Construct action by data
|
---|
98 | S $P(PSBHL7FD,PSBHLCS,1)=$P(^PSB(53.79,PSBIEN,0),U,7)
|
---|
99 | S $P(PSBHL7FD,PSBHLCS,2)=$$HLNAME^HLFNC($$GET1^DIQ(200,$P(PSBHL7FD,PSBHLCS,1)_",",.01),HL("ECH"))
|
---|
100 | S $P(PSBHL7MS,PSBHLFS,19)=PSBHL7FD K PSBHL7FD
|
---|
101 | S HLA("HLS",PSBCNT)=(HLA("HLS",PSBCNT))_PSBHL7MS
|
---|
102 | Q
|
---|
103 | RXO ; RXO segment
|
---|
104 | K PSBHL7MS,PSBHL7FD
|
---|
105 | S PSBCNT=PSBCNT+1,HLA("HLS",PSBCNT)="RXO"_PSBHLFS
|
---|
106 | ; Construct rq give code data
|
---|
107 | S $P(PSBHL7FD,PSBHLCS,1)=$P(^PSB(53.79,PSBIEN,0),U,8)
|
---|
108 | S $P(PSBHL7FD,PSBHLCS,2)=$$GET1^DIQ(50.7,$P(PSBHL7FD,PSBHLCS,1)_",",.01)
|
---|
109 | S $P(PSBHL7MS,PSBHLFS,1)=PSBHL7FD K PSBHL7FD
|
---|
110 | S $P(PSBHL7MS,PSBHLFS,2)=$$ESC($P(^PSB(53.79,PSBIEN,.1),U,5))
|
---|
111 | S $P(PSBHL7MS,PSBHLFS,10)=$$ESC($P(^PSB(53.79,PSBIEN,0),U,10))
|
---|
112 | S $P(PSBHL7FD,PSBHLCS,2)=$$ESC($P(^PSB(53.79,PSBIEN,0),U,11))
|
---|
113 | S $P(PSBHL7MS,PSBHLFS,21)=PSBHL7FD
|
---|
114 | S HLA("HLS",PSBCNT)=(HLA("HLS",PSBCNT))_PSBHL7MS
|
---|
115 | Q
|
---|
116 | NTE ; NTE segment(s) - notes and comments
|
---|
117 | K PSBHL7MS,PSBHL7FD
|
---|
118 | S PSBCNT=PSBCNT+1,HLA("HLS",PSBCNT)="NTE"_PSBHLFS
|
---|
119 | S $P(PSBHL7MS,PSBHLFS,2)="O"
|
---|
120 | ; Construct comment and comment type
|
---|
121 | D:($G(PSBSCHT)="P")&($D(^PSB(53.79,PSBIEN,.2)))&(PSBHL7X["PRN EFF")
|
---|
122 | .S $P(PSBHL7MS,PSBHLFS,3)=$$ESC($P(^PSB(53.79,PSBIEN,.2),U,2))
|
---|
123 | .S $P(PSBHL7FD,PSBHLCS,1)=$P(^PSB(53.79,PSBIEN,.2),U,3)
|
---|
124 | .S $P(PSBHL7FD,PSBHLCS,2)=$$HLNAME^HLFNC($$GET1^DIQ(200,$P(PSBHL7FD,PSBHLCS,1)_",",.01),HL("ECH"))
|
---|
125 | .S $P(PSBHL7FD,PSBHLCS,4)=$$HLDATE^HLFNC($P(^PSB(53.79,PSBIEN,.2),U,4),"TS")
|
---|
126 | .S $P(PSBHL7FD,PSBHLCS,5)="Date Entered"
|
---|
127 | .S $P(PSBHL7FD,PSBHLCS,7)=$P(^PSB(53.79,PSBIEN,.2),U,5)
|
---|
128 | .S $P(PSBHL7FD,PSBHLCS,8)="PRN Minutes"
|
---|
129 | .S $P(PSBHL7MS,PSBHLFS,4)=PSBHL7FD K PSBHL7FD
|
---|
130 | D:$D(^PSB(53.79,PSBIEN,.3,0))&(PSBHL7X'["PRN EFF")
|
---|
131 | .S PSBINDX="",PSBINDX=$O(^PSB(53.79,PSBIEN,.3,PSBINDX),-1)
|
---|
132 | .S $P(PSBHL7MS,PSBHLFS,3)=PSBINDX_PSBHLCS_$$ESC($P(^PSB(53.79,PSBIEN,.3,PSBINDX,0),U))
|
---|
133 | .S $P(PSBHL7FD,PSBHLCS,1)=$P(^PSB(53.79,PSBIEN,.3,PSBINDX,0),U,2)
|
---|
134 | .S $P(PSBHL7FD,PSBHLCS,2)=$$HLNAME^HLFNC($$GET1^DIQ(200,$P(PSBHL7FD,PSBHLCS,1)_",",.01),HL("ECH"))
|
---|
135 | .S $P(PSBHL7FD,PSBHLCS,4)=$$HLDATE^HLFNC($P(^PSB(53.79,PSBIEN,.3,PSBINDX,0),U,3),"TS")
|
---|
136 | .S $P(PSBHL7FD,PSBHLCS,5)="Date Entered"
|
---|
137 | .S $P(PSBHL7MS,PSBHLFS,4)=PSBHL7FD K PSBHL7FD
|
---|
138 | S HLA("HLS",PSBCNT)=(HLA("HLS",PSBCNT))_PSBHL7MS
|
---|
139 | Q
|
---|
140 | RXR ; RXR segment
|
---|
141 | K PSBHL7MS,PSBHL7FD
|
---|
142 | S PSBCNT=PSBCNT+1,HLA("HLS",PSBCNT)="RXR"_PSBHLFS
|
---|
143 | S:$D(PSBMRAB) $P(PSBHL7MS,PSBHLFS,1)=PSBMRAB
|
---|
144 | S $P(PSBHL7MS,PSBHLFS,2)=$P($G(^PSB(53.79,PSBIEN,.1)),U,6)
|
---|
145 | S HLA("HLS",PSBCNT)=(HLA("HLS",PSBCNT))_PSBHL7MS
|
---|
146 | S:""=$TR(PSBHL7MS,PSBHLFS,"") PSBCNT=PSBCNT-1
|
---|
147 | Q
|
---|
148 | RXC ; RXC segment
|
---|
149 | ; loop through .5,.6,and .7 send segments for each "component"
|
---|
150 | K PSBSUBFD F PSBSUBFD=".5",".6",".7" D:$D(^PSB(53.79,PSBIEN,PSBSUBFD,1))
|
---|
151 | .K PSBFILE S PSBFILE=$S(PSBSUBFD=".5":"^PSDRUG(",PSBSUBFD=".6":"^PS(52.6,",PSBSUBFD=".7":"^PS(52.7,")
|
---|
152 | .K PSBRXTYP S PSBRXTYP=$S(PSBSUBFD=".5":"B",PSBSUBFD=".6":"A",PSBSUBFD=".7":"B")
|
---|
153 | .S PSBSUBX=0 F S PSBSUBX=$O(^PSB(53.79,PSBIEN,PSBSUBFD,PSBSUBX)) Q:+PSBSUBX=0 D
|
---|
154 | ..K PSBHL7MS,PSBHL7FD S PSBCNT=PSBCNT+1,HLA("HLS",PSBCNT)="RXC"_PSBHLFS
|
---|
155 | ..S $P(PSBHL7MS,PSBHLFS,1)=PSBRXTYP
|
---|
156 | ..; Construct component code data
|
---|
157 | ..S $P(PSBHL7FD,PSBHLCS,1)=$P(^PSB(53.79,PSBIEN,PSBSUBFD,PSBSUBX,0),U)
|
---|
158 | ..S PSBFILE1=PSBFILE_$P(^PSB(53.79,PSBIEN,PSBSUBFD,PSBSUBX,0),U)_",0)"
|
---|
159 | ..I $P(^PSB(53.79,PSBIEN,PSBSUBFD,PSBSUBX,0),U)]"" S $P(PSBHL7FD,PSBHLCS,2)=$P($G(@PSBFILE1),U) K PSBFILE1
|
---|
160 | ..I $G(PSBHL7FD)]"" S $P(PSBHL7MS,PSBHLFS,2)=PSBHL7FD,PSBRXAX=PSBHL7FD,PSBRXA(PSBRXAX)="RXA ADMIN CODE" K PSBHL7FD
|
---|
161 | ..S $P(PSBHL7MS,PSBHLFS,3)=$P(^PSB(53.79,PSBIEN,PSBSUBFD,PSBSUBX,0),U,2)
|
---|
162 | ..S $P(PSBHL7MS,PSBHLFS,4)=$P(^PSB(53.79,PSBIEN,PSBSUBFD,PSBSUBX,0),U,4)
|
---|
163 | ..I $G(PSBRXAX)]"" S PSBRXA(PSBRXAX)=$P(^PSB(53.79,PSBIEN,PSBSUBFD,PSBSUBX,0),U,3)_U_$P(PSBHL7MS,PSBHLFS,4)
|
---|
164 | ..S HLA("HLS",PSBCNT)=(HLA("HLS",PSBCNT))_PSBHL7MS
|
---|
165 | Q
|
---|
166 | RXA ; RXA segment
|
---|
167 | K PSBHL7MS,PSBHL7FD S PSBRXAX=""
|
---|
168 | F PSBRX=1:1 S PSBRXAX=$O(PSBRXA(PSBRXAX)) Q:PSBRXAX="" D
|
---|
169 | .S PSBCNT=PSBCNT+1,HLA("HLS",PSBCNT)="RXA"_PSBHLFS
|
---|
170 | .S $P(PSBHL7MS,PSBHLFS,1)=0
|
---|
171 | .S $P(PSBHL7MS,PSBHLFS,2)=PSBRX
|
---|
172 | .S $P(PSBHL7MS,PSBHLFS,3)=$$HLDATE^HLFNC($P(^PSB(53.79,PSBIEN,0),U,6),"TS")
|
---|
173 | .S $P(PSBHL7MS,PSBHLFS,4)=" "
|
---|
174 | .; Construct administered code data
|
---|
175 | .S $P(PSBHL7MS,PSBHLFS,5)=PSBRXAX
|
---|
176 | .S $P(PSBHL7MS,PSBHLFS,6)=$P(PSBRXA(PSBRXAX),U)
|
---|
177 | .S $P(PSBHL7MS,PSBHLFS,7)=$P(PSBRXA(PSBRXAX),U,2)
|
---|
178 | .D:$D(^PSB(53.79,PSBIEN,.9,1))
|
---|
179 | ..S PSBINDX=$O(^PSB(53.79,PSBIEN,.9,"B"),-1)
|
---|
180 | ..S:$D(PSBINDX) $P(PSBHL7MS,PSBHLFS,9)=PSBINDX_PSBHLCS_$$HLDATE^HLFNC($P(^PSB(53.79,PSBIEN,.9,PSBINDX,0),U),"TS")
|
---|
181 | .; "PRN reason"
|
---|
182 | .S:($G(PSBSCHT)="P")&($D(^PSB(53.79,PSBIEN,.2))) $P(PSBHL7FD,PSBHLCS,2)=$P(^PSB(53.79,PSBIEN,.2),U,1)
|
---|
183 | .S $P(PSBHL7MS,PSBHLFS,18)=$G(PSBHL7FD) K PSBHL7FD
|
---|
184 | .; Construct indication - "variance"
|
---|
185 | .S $P(PSBHL7FD,PSBHLCS,2)=$P(^PSB(53.79,PSBIEN,.1),U,4)
|
---|
186 | .S $P(PSBHL7MS,PSBHLFS,19)=PSBHL7FD K PSBHL7FD
|
---|
187 | .S $P(PSBHL7MS,PSBHLFS,20)=$P(^PSB(53.79,PSBIEN,0),U,9)
|
---|
188 | .S HLA("HLS",PSBCNT)=(HLA("HLS",PSBCNT))_PSBHL7MS
|
---|
189 | K PSBRX,PSBRXA,PSBRXAX
|
---|
190 | Q
|
---|
191 | ESC(PSBINF) ; Escape message data
|
---|
192 | S PSBINFO=PSBINF K PSBESC,PSBINFO1 F PSBESCX=1:1:4 D
|
---|
193 | .S PSBCHR=$E(HL("ECH"),PSBESCX)
|
---|
194 | .I ($L(PSBINFO,PSBCHR)-1)>0 S PSBINFO1=PSBINFO F PSBESCXX=1:1:$L(PSBINFO,PSBCHR)-1 D
|
---|
195 | ..S PSBESC($F(PSBINFO1,PSBCHR)-1)=$E(HL("ECH"),3)_$E("SRET",PSBESCX)_$E(HL("ECH"),3)
|
---|
196 | ..S PSBINFO1=$E(PSBINFO1,1,$F(PSBINFO1,PSBCHR)-2)_U_$E(PSBINFO1,$F(PSBINFO1,PSBCHR),250)
|
---|
197 | S:$D(PSBINFO1) PSBINFO=PSBINFO1
|
---|
198 | S (PSBCNT1,PSBESCX,PSBESCXX)=0 F S PSBESCX=$O(PSBESC(PSBESCX)) Q:PSBESCX="" D
|
---|
199 | .S PSBESCXX=PSBESCX+PSBCNT1,PSBINFO=$E(PSBINFO,1,PSBESCXX-1)_$G(PSBESC(PSBESCX))_$E(PSBINFO,PSBESCXX+1,250),PSBCNT1=PSBCNT1+2
|
---|
200 | Q PSBINFO
|
---|
201 | ;
|
---|
202 | TRANS ; CALL HL7 TO Transmit Message
|
---|
203 | K PSBHL7MS,PSBHL7FD
|
---|
204 | D:$D(HLA("HLS")) GENERATE^HLMA("PSB BCMA RASO17 SRV","LM",1,.PSBHL7T,"",.PSBHL7OP)
|
---|
205 | I +$P(PSBHL7T,U,2) W !,"PSB(BCMA) HL7 MESSAGE HAS FAILED TRANSMISSION - could not generate"
|
---|
206 | Q
|
---|
207 | ;
|
---|