1 | VEPERI0 ;DAOU/WCJ - Incoming HL7 messages ;2-MAY-2005
|
---|
2 | ;;1.0;VOEB;;Jun 12, 2005
|
---|
3 | ;;;VISTA OFFICE/EHR;
|
---|
4 | ;;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
5 | ;
|
---|
6 | ;**Program Description**
|
---|
7 | ; This program parses each incoming HL7 message.
|
---|
8 | ;
|
---|
9 | Q
|
---|
10 | ;
|
---|
11 | ; Starting points - put message into a TMP global and also HLI array
|
---|
12 | ; The first is when called from protocol.
|
---|
13 | ; The second is when called from the PENDING tag below
|
---|
14 | ;
|
---|
15 | EN N DFN,ADDPFLG,FE
|
---|
16 | EN2 N SEGCNT,CNT,DUZ,FE,HLI,EVENT,EVENTS,I,DEL,DELIM,SYS
|
---|
17 | N SEGMT,PRTCL,HL,HLECH,HLFS,HLEID,HLEIDS,MSGEVNT,IEN
|
---|
18 | N HLF,HLP
|
---|
19 | ;
|
---|
20 | S FE=0
|
---|
21 | K ^TMP($J,"VEPERI0")
|
---|
22 | F SEGCNT=1:1 X HLNEXT Q:HLQUIT'>0 D
|
---|
23 | . S CNT=0
|
---|
24 | . S (^TMP($J,"VEPERI0",SEGCNT,CNT),HLI(SEGCNT,CNT))=HLNODE
|
---|
25 | . F S CNT=$O(HLNODE(CNT)) Q:'CNT D
|
---|
26 | .. S (^TMP($J,"VEPERI0",SEGCNT,CNT),HLI(SEGCNT,CNT))=HLNODE(CNT)
|
---|
27 | ;
|
---|
28 | TEP ; Test Entry Point will remove later
|
---|
29 | ;
|
---|
30 | ; Get the user responsible for the interface
|
---|
31 | D GETUSER^VEPERI4(.DUZ,.FE,HLMTIEN)
|
---|
32 | ;
|
---|
33 | ; Determine which protocol to use
|
---|
34 | S SEGMT=$G(HLI(1,0))
|
---|
35 | I $E(SEGMT,1,3)'="MSH" D Q
|
---|
36 | . S FE=$$FATALERR^VEPERI6(1,"HL7","MSH Segment is not the first segment found",HLMTIEN)
|
---|
37 | S DEL(1)=$E(SEGMT,4)
|
---|
38 | S DELIM=$P(SEGMT,DEL(1),2)
|
---|
39 | F I=1:1:$L(DELIM) S DEL(I+1)=$E(DELIM,I)
|
---|
40 | ;
|
---|
41 | D INIT
|
---|
42 | I FE D CLEANUP Q
|
---|
43 | ;
|
---|
44 | S EVENT=$P(SEGMT,DEL(1),9) S:EVENT="" EVENT=" "
|
---|
45 | ; The event type determines protocol
|
---|
46 | I '$D(EVENTS(EVENT)) S FE=$$FATALERR^VEPERI6(1,"HL7","Unsupported Event = "_EVENT,HLMTIEN) Q
|
---|
47 | S PRTCL=EVENTS(EVENT)
|
---|
48 | S MSGEVNT=$P(EVENT,DEL(2),2)
|
---|
49 | S HLEID=$O(^ORD(101,"B",PRTCL,0))
|
---|
50 | ;
|
---|
51 | ; Initialize the HL7 variables
|
---|
52 | D INIT^HLFNC2(HLEID,.HL)
|
---|
53 | ;
|
---|
54 | ; Get the subscriber
|
---|
55 | S HLEIDS=$O(^ORD(101,HLEID,775,"B",0))
|
---|
56 | ;
|
---|
57 | D LOADTBL^VEPERI1A(SYS,.FE,.HLF)
|
---|
58 | I FE D CLEANUP Q
|
---|
59 | ;
|
---|
60 | D PARSE^VEPERI1(.HLI,.HLP,.HLF,.DEL,.FE,MSGEVNT,HLMTIEN)
|
---|
61 | I FE D CLEANUP Q
|
---|
62 | ;
|
---|
63 | D VALIDATE^VEPERI1(.HLP,.HLF,.FE,.DEL,HLMTIEN)
|
---|
64 | I FE D CLEANUP Q
|
---|
65 | ;
|
---|
66 | ; Find the patient if it wasn't already identified from the pending file
|
---|
67 | I '$G(DFN) D FINDPAT^VEPERI3(.HLP,.FE,.DFN,ADDPTFLG,HLMTIEN)
|
---|
68 | I FE D CLEANUP Q
|
---|
69 | ;
|
---|
70 | ; If DFN was not returned, then we have no business continuing.
|
---|
71 | I '$G(DFN) D CLEANUP Q
|
---|
72 | ;
|
---|
73 | ; Returns IEN array of insurances
|
---|
74 | D FILEINS^VEPERI2(.HLP,.HLF,DFN,.IEN,.FE,HLMTIEN)
|
---|
75 | I FE D CLEANUP Q
|
---|
76 | ;
|
---|
77 | D FILEPAT^VEPERI5(.HLP,.HLF,DFN,.IEN,.FE,HLMTIEN)
|
---|
78 | I FE D CLEANUP Q
|
---|
79 | ;
|
---|
80 | CLEANUP ;
|
---|
81 | K ^TMP($J,"VEPERIO"),HL,HLNEXT,HLNODE,HLQUIT
|
---|
82 | Q
|
---|
83 | ;
|
---|
84 | ; Returns
|
---|
85 | ; SYS
|
---|
86 | ; EVENT ARRAY
|
---|
87 | ; ADDPTLFG
|
---|
88 | INIT ;
|
---|
89 | N SCREEN,TAR,MSG
|
---|
90 | S SCREEN="I $P(^(0),U,2)=1"
|
---|
91 | D LIST^DIC(19904,,".01;.03",,,,,,SCREEN,,"TAR","MSG")
|
---|
92 | I $D(MSG) S FE=$$FATALERR^VEPERI6(1,"SETUP","NO ACTIVE SYSTEMS SET UP IN 19904") Q
|
---|
93 | I TAR("DILIST",0)>1 S FE=$$FATALERR^VEPERI6(1,"SETUP","TOO MANY ACTIVE SYSTEMS SET UP IN 19904") Q
|
---|
94 | S SYS=TAR("DILIST",1,1)
|
---|
95 | S ADDPTFLG=+TAR("DILIST","ID",1,.03)
|
---|
96 | S IEN=","_TAR("DILIST",2,1)_","
|
---|
97 | ;
|
---|
98 | D LIST^DIC(19904.01,IEN,".01;.02",,,,,,,,"TAR","MSG")
|
---|
99 | I $D(MSG) S FE=$$FATALERR^VEPERI6(1,"SETUP","PROBLEM RETRIEVING PROTOCOLS FROM 19904") Q
|
---|
100 | F I=1:1 Q:'$D(TAR("DILIST",1,I)) D
|
---|
101 | .S EVENT=TAR("DILIST","ID",I,".02")
|
---|
102 | .S EVENT=$TR(EVENT,"~","^")
|
---|
103 | .S EVENT(EVENT)=TAR("DILIST","ID",I,".01")
|
---|
104 | Q
|
---|
105 | ;
|
---|
106 | ; IENS is a string of internal entry numbers from file 772
|
---|
107 | ; and DFN is an existing patient. If DFN does not exist, it is a new
|
---|
108 | ; patient. We will need to pass that back to update the pending file
|
---|
109 | ; This is called from VEPERI7
|
---|
110 | ;
|
---|
111 | PENDING(IENS772,DFN) ;
|
---|
112 | N HLQUIT,HLNODE,HLNEXT,HLMTIEN,IENSLOOP,ADDPTFLG,FE
|
---|
113 | S FE=0
|
---|
114 | I '$G(DFN) S ADDPTFLG=1 ; allow new patients to be added
|
---|
115 | F IENSLOOP=1:1 S HLMTIEN=$P(IENS772,",",IENSLOOP) Q:'+HLMTIEN!(FE) D
|
---|
116 | . S HLQUIT=0,HLNODE="",HLNEXT="D HLNEXT^HLCSUTL"
|
---|
117 | . D EN2
|
---|
118 | Q
|
---|