VEPERI0 ;DAOU/WCJ - Incoming HL7 messages ;2-MAY-2005
 ;;1.0;VOEB;;Jun 12, 2005
 ;;;VISTA OFFICE/EHR;
 ;;Per VHA Directive 10-93-142, this routine should not be modified.
 ;
 ;**Program Description**
 ;  This program parses each incoming HL7 message.
 ;
 Q
 ;
 ; Starting points - put message into a TMP global and also HLI array
 ; The first is when called from protocol.
 ; The second is when called from the PENDING tag below 
 ;
EN N DFN,ADDPFLG,FE
EN2 N SEGCNT,CNT,DUZ,FE,HLI,EVENT,EVENTS,I,DEL,DELIM,SYS
 N SEGMT,PRTCL,HL,HLECH,HLFS,HLEID,HLEIDS,MSGEVNT,IEN
 N HLF,HLP
 ;
 S FE=0
 K ^TMP($J,"VEPERI0")
 F SEGCNT=1:1 X HLNEXT Q:HLQUIT'>0  D
 . S CNT=0
 . S (^TMP($J,"VEPERI0",SEGCNT,CNT),HLI(SEGCNT,CNT))=HLNODE
 . F  S CNT=$O(HLNODE(CNT)) Q:'CNT  D
 .. S (^TMP($J,"VEPERI0",SEGCNT,CNT),HLI(SEGCNT,CNT))=HLNODE(CNT)
 ;
TEP ; Test Entry Point will remove later
 ;
 ;  Get the user responsible for the interface 
 D GETUSER^VEPERI4(.DUZ,.FE,HLMTIEN)
 ;
 ;   Determine which protocol to use
 S SEGMT=$G(HLI(1,0))
 I $E(SEGMT,1,3)'="MSH" D  Q
 . S FE=$$FATALERR^VEPERI6(1,"HL7","MSH Segment is not the first segment found",HLMTIEN)
 S DEL(1)=$E(SEGMT,4)
 S DELIM=$P(SEGMT,DEL(1),2)
 F I=1:1:$L(DELIM) S DEL(I+1)=$E(DELIM,I)
 ;
 D INIT
 I FE D CLEANUP Q
 ;
 S EVENT=$P(SEGMT,DEL(1),9) S:EVENT="" EVENT=" "
 ;  The event type determines protocol
 I '$D(EVENTS(EVENT)) S FE=$$FATALERR^VEPERI6(1,"HL7","Unsupported Event = "_EVENT,HLMTIEN) Q
 S PRTCL=EVENTS(EVENT)
 S MSGEVNT=$P(EVENT,DEL(2),2)
 S HLEID=$O(^ORD(101,"B",PRTCL,0))
 ;
 ;  Initialize the HL7 variables
 D INIT^HLFNC2(HLEID,.HL)
 ;
 ; Get the subscriber
 S HLEIDS=$O(^ORD(101,HLEID,775,"B",0))
 ;
 D LOADTBL^VEPERI1A(SYS,.FE,.HLF)
 I FE D CLEANUP Q
 ;
 D PARSE^VEPERI1(.HLI,.HLP,.HLF,.DEL,.FE,MSGEVNT,HLMTIEN)
 I FE D CLEANUP Q
 ;
 D VALIDATE^VEPERI1(.HLP,.HLF,.FE,.DEL,HLMTIEN)
 I FE D CLEANUP Q
 ;
 ; Find the patient if it wasn't already identified from the pending file
 I '$G(DFN) D FINDPAT^VEPERI3(.HLP,.FE,.DFN,ADDPTFLG,HLMTIEN)
 I FE D CLEANUP Q
 ;
 ; If DFN was not returned, then we have no business continuing.
 I '$G(DFN) D CLEANUP Q 
 ;
 ; Returns IEN array of insurances
 D FILEINS^VEPERI2(.HLP,.HLF,DFN,.IEN,.FE,HLMTIEN)
 I FE D CLEANUP Q
 ;
 D FILEPAT^VEPERI5(.HLP,.HLF,DFN,.IEN,.FE,HLMTIEN)
 I FE D CLEANUP Q
 ; 
CLEANUP ;
 K ^TMP($J,"VEPERIO"),HL,HLNEXT,HLNODE,HLQUIT
 Q
 ;
 ; Returns 
 ; SYS
 ; EVENT ARRAY
 ; ADDPTLFG
INIT ;
 N SCREEN,TAR,MSG
 S SCREEN="I $P(^(0),U,2)=1"
 D LIST^DIC(19904,,".01;.03",,,,,,SCREEN,,"TAR","MSG")
 I $D(MSG) S FE=$$FATALERR^VEPERI6(1,"SETUP","NO ACTIVE SYSTEMS SET UP IN 19904") Q
 I TAR("DILIST",0)>1 S FE=$$FATALERR^VEPERI6(1,"SETUP","TOO MANY ACTIVE SYSTEMS SET UP IN 19904") Q
 S SYS=TAR("DILIST",1,1)
 S ADDPTFLG=+TAR("DILIST","ID",1,.03)
 S IEN=","_TAR("DILIST",2,1)_","
 ;
 D LIST^DIC(19904.01,IEN,".01;.02",,,,,,,,"TAR","MSG")
 I $D(MSG) S FE=$$FATALERR^VEPERI6(1,"SETUP","PROBLEM RETRIEVING PROTOCOLS FROM 19904") Q
 F I=1:1 Q:'$D(TAR("DILIST",1,I))  D
 .S EVENT=TAR("DILIST","ID",I,".02")
 .S EVENT=$TR(EVENT,"~","^")
 .S EVENT(EVENT)=TAR("DILIST","ID",I,".01")
 Q
 ;
 ; IENS is a string of internal entry numbers from file 772
 ; and DFN is an existing patient.  If DFN does not exist, it is a new
 ; patient.  We will need to pass that back to update the pending file 
 ; This is called from VEPERI7
 ; 
PENDING(IENS772,DFN) ;
 N HLQUIT,HLNODE,HLNEXT,HLMTIEN,IENSLOOP,ADDPTFLG,FE
 S FE=0
 I '$G(DFN) S ADDPTFLG=1   ; allow new patients to be added
 F IENSLOOP=1:1 S HLMTIEN=$P(IENS772,",",IENSLOOP) Q:'+HLMTIEN!(FE)  D
 . S HLQUIT=0,HLNODE="",HLNEXT="D HLNEXT^HLCSUTL"
 . D EN2
 Q
