1 | LR7OF0 ;slc/dcm/JAH - Receive/Route MSG array from OE/RR ;8/10/04
|
---|
2 | ;;5.2;LAB SERVICE;**121,187,223,230,256,291**;Sep 27, 1994
|
---|
3 | ;
|
---|
4 | ;This routine invokes IA #2187
|
---|
5 | ;
|
---|
6 | EN(MSG,MSGTYPE) ;Route all messages from here
|
---|
7 | ;MSG=HL7 message array
|
---|
8 | ;MSGTYPE=LRCH for chem (default), LRAP for AP
|
---|
9 | N X,VISIT,LOC,LOCP,ROOM,DFN,LRPNM,LRXMSG,TEST,TESTN,TYPE,SAMP,SPEC,URG,ORIFN,STARTDT,LRDUZ,PROV,REASON,LRSX,LRLLOC,LROLLOC,LRPRAC,LROUTINE,LRSDT,LRXZ,LRODT,LRSAMP,LRSPEC,LRORDR,LRLB,LRNT,LRSX,LROT,LRCOM,LRI,LRIO,LRJ,LRORD,QUANT
|
---|
10 | N LOCA,LINE,LRHDR,LRORDER,LRORIFN,LRSN,LRSUM,LRSXN,LRTIME,LRTSTS,LRURG,LRSDT,LREND,LRXTYPE,LRXORC,LRDFN,LRDPF,LRPLACR,LRQUANT,LRVERZ,NOBR,NORC
|
---|
11 | S (NOBR,NORC)=1 ;flag to check for OBR, ORC segments
|
---|
12 | D END
|
---|
13 | S LRI=2,LRXORC="ORC"
|
---|
14 | F S LRI=$O(MSG(LRI)) Q:LRI<1 S X=MSG(LRI) I $P(MSG(LRI),"|")="ORC" S LRXORC=MSG(LRI),NORC=0 Q
|
---|
15 | S LRHDR=$$HDRCHK($G(MSG(1)))
|
---|
16 | Q:'$L(LRHDR)
|
---|
17 | I '$$PIDCHK($G(MSG(2))) Q
|
---|
18 | I LRHDR="BHS" K ^TMP("OR",$J,"LRES") Q ;Initialization to begin batch
|
---|
19 | I LRHDR="BTS" D Q ;Clean-up to end batch
|
---|
20 | . D LC
|
---|
21 | . K ^TMP("OR",$J,"LRES")
|
---|
22 | S LINE=2,LRSX=0,LREND=0 F S LINE=$O(MSG(LINE)) Q:LINE<1 S LRXMSG=MSG(LINE) D:$O(MSG(LINE,0)) SPLIT D I LREND Q
|
---|
23 | . I $P(LRXMSG,"|")="PV1" S VISIT=$P(LRXMSG,"|",19),LOC=$P($P(LRXMSG,"|",4),"^"),ROOM=$P($P(LRXMSG,"|",4),"^",2),LOCP=LOC,LOCA=$S(LOCP:$P(^SC(LOCP,0),"^",2),1:"") Q
|
---|
24 | . I $P(LRXMSG,"|")="ORC" S NORC=0,LRXTYPE=$P(LRXMSG,"|",2),LRXORC=LRXMSG I LRXTYPE="NW" D NEW^LR7OF2 Q ;New order, from OE/RR
|
---|
25 | . I $P(LRXMSG,"|")="ORC",LRXTYPE="CA" Q ; D CANC^LR7OF2 S LREND=1 Q ;Cancel order, from OE/RR
|
---|
26 | . I $P(LRXMSG,"|")="OBR" S NOBR=0 I LRXTYPE="CA" D CANC^LR7OF2 Q ;Cancel tests identified in OBR segment
|
---|
27 | . I $P(LRXMSG,"|")="ORC",LRXTYPE="Z@" D PURG1^LR7OF4 S LREND=1 Q ;Purge request-weird
|
---|
28 | . I $P(LRXMSG,"|")="OBR",LRXTYPE="Z@" D PURG^LR7OF4 S LREND=1 Q ;Purge request
|
---|
29 | . I $P(LRXMSG,"|")="ORC",LRXTYPE="XO" D XO^LR7OF2 Q ;Change order
|
---|
30 | . I $P(LRXMSG,"|")="ORC",LRXTYPE="NA" D NUM^LR7OF2 Q ;Backdoor new order, request order number
|
---|
31 | . I $P(LRXMSG,"|")="ORC" S X="Unrecognized order control: "_LRXTYPE D ACK("DE",LRXORC,X) Q
|
---|
32 | . I $P(LRXMSG,"|")="OBR",LRXTYPE="NA" D NA^LR7OF2 Q ;Backdoor assign ORIFN to test
|
---|
33 | . I $P(LRXMSG,"|")="OBR",LRXTYPE="NW" D OBR^LR7OF3 Q
|
---|
34 | . I $P(LRXMSG,"|")="OBR",LRXTYPE="XO" D OBR^LR7OF3 Q
|
---|
35 | . I $P(LRXMSG,"|")="DG1" D DG1^LRBEBA2(LRXMSG) Q ; CIDC
|
---|
36 | . I $P(LRXMSG,"|")="ZCL" D ZCL^LRBEBA2(LRXMSG) Q ; CIDC
|
---|
37 | . I $P(LRXMSG,"|")="NTE" D NTE^LR7OF2 Q ;Order comments
|
---|
38 | . D ACK("DE",LRXORC,"Unrecognized Message segment: "_$P(LRXMSG,"|")) Q
|
---|
39 | I LREND S LREND=0 D END Q
|
---|
40 | I NORC D ACK("OC",LRXORC,"Incomplete transaction...no ORC segment in message!") D END Q
|
---|
41 | I NOBR D ACK("OC",LRXORC,"Incomplete transaction...no OBR segment in message") D END Q
|
---|
42 | I LRXTYPE="NW" D ;Process new order request
|
---|
43 | . N REJECT
|
---|
44 | . S LROLLOC=LOCP,LRLLOC=$S($L($G(LOCA)):LOCA,1:"UNKNOWN"),LRPRAC=PROV,LROUTINE=$P(^LAB(69.9,1,3),"^",2)
|
---|
45 | . I $D(^TMP("OR",$J,"LROT")) S LRSDT=0 D
|
---|
46 | .. F S LRSDT=$O(^TMP("OR",$J,"LROT",LRSDT)) Q:LRSDT<1 S LRXZ="" F LRI=0:0 S LRXZ=$O(^TMP("OR",$J,"LROT",LRSDT,LRXZ)) Q:LRXZ="" S LRODT=$P(LRSDT,".") D
|
---|
47 | ... I $G(MSGTYPE)="LRAP" D EN^LR7OFA1 Q
|
---|
48 | ... D EN^LR7OF1
|
---|
49 | . D END,ACK("OK","ORC|OK|"_LRPLACR_"|"_LRORD_";"_LRODT_";"_LRSN_"^"_$S($G(MSG)="BBMSG":"LRBB",$G(MSG)="APMSG":"LRAP",1:"LRCH"),"")
|
---|
50 | Q
|
---|
51 | HDRCHK(HDR) ;Check & return message Header (BHS,MSH,BTS)
|
---|
52 | I '$L(HDR) D ACK("DE",LRXORC,"No Message Header Defined") Q ""
|
---|
53 | I $P(HDR,"|")="BTS" Q "BTS"
|
---|
54 | I $P(HDR,"|")'="BHS",$P(HDR,"|")'="MSH" D ACK("DE",LRXORC,"Invalid Message Header: "_$P(HDR,"|")) Q ""
|
---|
55 | I $P(HDR,"|",2)'="^~\&" D ACK("DE",LRXORC,"Invalid Encoding Characters: "_$P(HDR,"|",2)) Q ""
|
---|
56 | I $P(HDR,"|",3)'="ORDER ENTRY" D ACK("DE",LRXORC,"Unrecognized message source: "_$P(HDR,"|",3)) Q ""
|
---|
57 | I $P(HDR,"|",4)'=DUZ(2) D ACK("DE",LRXORC,"DUZ(2) doesn't match institution in message: "_DUZ(2)_"'="_$P(HDR,"|",4)) Q ""
|
---|
58 | I $P(HDR,"|")="MSH",$P(HDR,"|",9)'="ORM"&($P(HDR,"|",9)'="ORR") D ACK("DE",LRXORC,"Unrecognized Message type: "_$P(HDR,"|",9)) Q ""
|
---|
59 | Q $P(HDR,"|")
|
---|
60 | ;
|
---|
61 | PIDCHK(PID) ;Check PID & setup patient variables (DFN,LRDPF,LRDFN,LRPNM)
|
---|
62 | I '$L(PID) D ACK("DE",LRXORC,"No Patient ID in message") Q 0
|
---|
63 | I $P(PID,"|")'="PID" D ACK("DE",LRXORC,"Invalid (PID) message header: "_$P(X,"|")) Q 0
|
---|
64 | I '$L($P(PID,"|",6)) D ACK("DE",LRXORC,"No Patient Name") Q 0
|
---|
65 | S DFN=$S($P(PID,"|",4):$P(PID,"|",4),1:+$P(PID,"|",5)),LRDPF=$S($P(PID,"|",4):"2^DPT(",1:$P(@("^"_$P($P(PID,"|",5),";",2)_"0)"),"^",2)_"^"_$P($P(PID,"|",5),";",2)),LRPNM=$P(PID,"|",6),LRDFN=$$LRDFN^LR7OR1(+DFN,$P(LRDPF,"^",2))
|
---|
66 | I 'LRDFN D END^LRDPA I LRDFN<1 D ACK("DE",LRXORC,"Invalid LRDFN") Q 0
|
---|
67 | I '$D(@("^"_$P(LRDPF,"^",2)_+DFN_",0)")) D ACK("DE",LRXORC,"Patient identifier: "_LRDFN_" not found in "_LRDPF_" file") Q 0
|
---|
68 | Q 1
|
---|
69 | ;
|
---|
70 | LC ;Print to LC Lab device
|
---|
71 | N LRSDT,LRXZ,CTR,LRODT,LRSN,LRPTR
|
---|
72 | S LRSDT=0
|
---|
73 | F S LRSDT=$O(^TMP("OR",$J,"LRES",LRDFN,LRSDT)) Q:'LRSDT S LRXZ="" F S LRXZ=$O(^TMP("OR",$J,"LRES",LRDFN,LRSDT,LRXZ)) Q:LRXZ="" D
|
---|
74 | . S CTR=0 F S CTR=$O(^TMP("OR",$J,"LRES",LRDFN,LRSDT,LRXZ,CTR)) Q:'CTR S X=^(CTR) D
|
---|
75 | .. S LRPTR(LRXZ,$P(X,"^",2),$P(X,"^",3))=""
|
---|
76 | S LRODT=0 F S LRODT=$O(LRPTR("LC",LRODT)) Q:'LRODT S LRSN=0 F S LRSN=$O(LRPTR("LC",LRODT,LRSN)) Q:'LRSN D
|
---|
77 | . S ION=$P($G(^LAB(69.9,1,3.5,+DUZ(2),0)),U,2) S:ION="" ION=$P(^LAB(69.9,1,3),U,4) I ION]"" D ^LROW2P
|
---|
78 | S LRODT=0 F S LRODT=$O(LRPTR("I",LRODT)) Q:'LRODT S LRSN=0 F S LRSN=$O(LRPTR("I",LRODT,LRSN)) Q:'LRSN D
|
---|
79 | . S ION=$P($G(^LAB(69.9,1,7,DUZ(2),0)),U,3) I ION]"" D ^LROW2P
|
---|
80 | Q
|
---|
81 | ACK(TYPE,MSG3,COMMENT) ;Send back ok or nok to OE/RR
|
---|
82 | ;TYPE=Message control
|
---|
83 | ;COMMENT=Comment to be passed back
|
---|
84 | ;MSG3=contents of MSG(3) containing the ORC segment
|
---|
85 | N LRMSG,ARRAY,X8,VAR
|
---|
86 | I TYPE="DE" S VAR("XQY0")="" D EN^ORERR("BAD msg xchng OE/RR->LAB:"_$G(COMMENT),.MSG,.VAR) S:$P($G(MSG3),"|",2)="NW" TYPE="OC" ;Trap problem message and send back to OE/RR as an OC type
|
---|
87 | S LRMSG(1)=$$MSH^LR7OU0("ORR")
|
---|
88 | S LRMSG(2)=$G(MSG(2))
|
---|
89 | S LRMSG(3)=$G(MSG3),$P(LRMSG(3),"|",2)=TYPE
|
---|
90 | I $O(REJECT(0)),$O(^ORD(100.03,"C","LRDUP",0)) S X8=$$DC1^LROR6($O(^(0)),"Already ordered for this specimen, type and time"),$P(LRMSG(3),"|",2)="OC",$P(LRMSG(3),"|",4)="",$P(LRMSG(3),"|",17)=X8
|
---|
91 | I $D(COMMENT) N MSG S MSG="LRMSG",ARRAY(1)=COMMENT D NTE^LR7OU01(1,"L","ARRAY(",4)
|
---|
92 | S LRMSG="LRMSG"
|
---|
93 | D MSG^XQOR("LR7O CH EVSEND OR",.LRMSG) ;Lab accepts, returns Order #
|
---|
94 | Q
|
---|
95 | SPLIT ;Build array for long segment
|
---|
96 | N I
|
---|
97 | S I=0 F S I=$O(MSG(LINE,I)) Q:I<1 S LRXMSG(I)=MSG(LINE,I)
|
---|
98 | Q
|
---|
99 | END ;Clean-up and get out
|
---|
100 | K ^TMP("OR",$J,"LROT"),^("COM")
|
---|
101 | Q
|
---|