| 1 | IBCNEHL4 ;DAOU/ALA - HL7 Process Incoming RPI Msgs (cont.) ;26-JUN-2002  ; Compiled December 16, 2004 15:35:46 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**300**;21-MAR-94 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ;**Program Description** | 
|---|
| 6 | ;  This pgm will process the non-repeating segments of the | 
|---|
| 7 | ;  incoming IIV response msgs. | 
|---|
| 8 | ;  It was separated out from IBCNEHL2 to conserve space. | 
|---|
| 9 | ; | 
|---|
| 10 | ;  This routine is based on IBCNEHLP which was introduced with patch 184, and subsequently | 
|---|
| 11 | ;  patched with patches 252 and 271.  IBCNEHLP is obsolete and deleted with patch 300. | 
|---|
| 12 | ; | 
|---|
| 13 | ; * Each of these tags are called by IBCNEHL2. | 
|---|
| 14 | ; | 
|---|
| 15 | ;  Variables | 
|---|
| 16 | ;    SEG = HL7 Seg Name | 
|---|
| 17 | ;    MSGID = Original Msg Control ID | 
|---|
| 18 | ;    ACK =  Acknowledgment (AA=Accepted, AE=Error) | 
|---|
| 19 | ;    ERTXT = Error Msg Text | 
|---|
| 20 | ;    ERFLG = Error quit flag | 
|---|
| 21 | ;    ERACT = Error Action | 
|---|
| 22 | ;    ERCON = Error Condition | 
|---|
| 23 | ;    RIEN = Response Record IEN | 
|---|
| 24 | ;    IBSEG = Array of the segment | 
|---|
| 25 | ; | 
|---|
| 26 | Q  ; No direct calls | 
|---|
| 27 | ; | 
|---|
| 28 | MSA ;  Process the MSA seg | 
|---|
| 29 | ; | 
|---|
| 30 | ;  Input: | 
|---|
| 31 | ;  IBSEG,MGRP | 
|---|
| 32 | ; | 
|---|
| 33 | ;  Output: | 
|---|
| 34 | ;  ERACT,ERCON,ERROR,ERTXT,RIEN,TRACE,ACK | 
|---|
| 35 | ; | 
|---|
| 36 | N MSGID,RSUPDT,VRFDT | 
|---|
| 37 | S ACK=$G(IBSEG(2)),MSGID=$G(IBSEG(3)),TRACE=$G(IBSEG(4)) | 
|---|
| 38 | S ERTXT=$$DECHL7^IBCNEHL2($P($G(IBSEG(7)),$E(HLECH),2)),ERACT=$G(IBSEG(6)),ERCON=$P($G(IBSEG(7)),$E(HLECH),1) | 
|---|
| 39 | ; | 
|---|
| 40 | ; If no Control Id, send Mailman error msg | 
|---|
| 41 | I MSGID="" D ERRMSA(TRACE,MGRP) S ERFLG=1 G MSAX | 
|---|
| 42 | ; | 
|---|
| 43 | ; Check for msg id/payer combination and get response IEN | 
|---|
| 44 | D PCK^IBCNEHL3 | 
|---|
| 45 | ; | 
|---|
| 46 | ; If no record IEN, quit | 
|---|
| 47 | I $G(RIEN)="" G MSAX | 
|---|
| 48 | ; | 
|---|
| 49 | ; Update record w/info | 
|---|
| 50 | S RSUPDT(365,RIEN_",",.09)=TRACE,RSUPDT(365,RIEN_",",.06)=3 | 
|---|
| 51 | S RSUPDT(365,RIEN_",",4.01)=ERTXT | 
|---|
| 52 | S VRFDT=$$NOW^XLFDT(),RSUPDT(365,RIEN_",",.07)=VRFDT | 
|---|
| 53 | ; | 
|---|
| 54 | ; Update w/internal values | 
|---|
| 55 | D FILE^DIE("I","RSUPDT","ERROR") | 
|---|
| 56 | ; | 
|---|
| 57 | S RSUPDT(365,RIEN_",",1.14)=ERCON,RSUPDT(365,RIEN_",",1.15)=ERACT | 
|---|
| 58 | ; | 
|---|
| 59 | ; Update w/external values | 
|---|
| 60 | D FILE^DIE("E","RSUPDT","ERROR") | 
|---|
| 61 | MSAX ; | 
|---|
| 62 | Q | 
|---|
| 63 | ; | 
|---|
| 64 | ERRMSA(TRACE,MGRP) ; Msg Control Id is blank -  Send Mailman error msg | 
|---|
| 65 | ; | 
|---|
| 66 | N HCT,ICN,MSG,MSGCT,NAME,XMSUB | 
|---|
| 67 | ; | 
|---|
| 68 | ;1st find the PID seg to extract ICN and patient name | 
|---|
| 69 | D GTICNM^IBCNEHLU(.ICN,.NAME) | 
|---|
| 70 | ; | 
|---|
| 71 | ;Send the Mailman error msg | 
|---|
| 72 | S XMSUB="Message Control Id Field is Blank",MSGCT=$S(TRACE="":4,1:3) | 
|---|
| 73 | S MSG(1)="A response was received w/a blank Message Control Id" | 
|---|
| 74 | I TRACE="" S MSG(1)=MSG(1)_" and Trace #" | 
|---|
| 75 | S MSG(2)="for "_$S(TRACE'="":"Trace #: "_TRACE_", ",1:"")_"ICN #: "_ICN_", Patient: "_NAME_"." | 
|---|
| 76 | I TRACE="" D | 
|---|
| 77 | . S MSG(3)="It is likely that there are communication issues with the EC." | 
|---|
| 78 | S MSG(MSGCT)="This response cannot be processed.  Please log a NOIS." | 
|---|
| 79 | D MSG^IBCNEUT5(MGRP,XMSUB,"MSG(") | 
|---|
| 80 | Q | 
|---|
| 81 | ; | 
|---|
| 82 | PID ;  Process the PID seg | 
|---|
| 83 | N DFN,DOB,DOD,ICN,LFAC,LUPDT,NAME,RSUPDT,SEX,SSN,XDFN,IDLIST | 
|---|
| 84 | N SUBCNT,SUBC,SUBCID,SUBCDATA,IERN | 
|---|
| 85 | ; | 
|---|
| 86 | S ERFLG=0 | 
|---|
| 87 | S DOB=$G(IBSEG(8)),SEX=$G(IBSEG(9)) | 
|---|
| 88 | S NAME=$G(IBSEG(6)) | 
|---|
| 89 | S DOD=$G(IBSEG(30)),LUPDT=$G(IBSEG(34)),LFAC=$G(IBSEG(35)) | 
|---|
| 90 | ; | 
|---|
| 91 | ; Parse Repeating ID field to fill in other identifiers | 
|---|
| 92 | S (ICN,SSN,DFN)="" | 
|---|
| 93 | S IDLIST=$G(IBSEG(4)) | 
|---|
| 94 | F SUBCNT=1:1:$L(IDLIST,$E(HLECH,2,2)) D | 
|---|
| 95 | . S SUBC=$P(IDLIST,$E(HLECH,2,2),SUBCNT) | 
|---|
| 96 | . S SUBCID=$P(SUBC,$E(HLECH),5)    ; Identifier Type Code | 
|---|
| 97 | . S SUBCDATA=$P(SUBC,$E(HLECH),1) ; Data Value | 
|---|
| 98 | . I SUBCID="PI" S DFN=SUBCDATA | 
|---|
| 99 | . I SUBCID="SS" S SSN=SUBCDATA | 
|---|
| 100 | . I SUBCID="NI" S ICN=SUBCDATA | 
|---|
| 101 | ; | 
|---|
| 102 | ;  Convert data from HL7 format to VistA format | 
|---|
| 103 | S NAME=$$DECHL7^IBCNEHL2($$FMNAME^HLFNC(NAME,HLECH)) | 
|---|
| 104 | S DOD=$$FMDATE^HLFNC(DOD),DOB=$$FMDATE^HLFNC(DOB),LUPDT=$$FMDATE^HLFNC(LUPDT) | 
|---|
| 105 | ; | 
|---|
| 106 | ; Use ICN to find the patients DFN at this site | 
|---|
| 107 | I ICN'="" S XDFN=$$GETDFN^MPIF001(ICN) | 
|---|
| 108 | I +$G(XDFN)'>0,+$G(ICN)>0 D  Q | 
|---|
| 109 | . S ERFLG=1,IERN=$$ERRN^IBCNEUT7("ERROR(""DIERR"")") | 
|---|
| 110 | . S ERROR("DIERR",IERN,"TEXT",1)="Unable to determine the patient's DFN value for this site." | 
|---|
| 111 | . S ERROR("DIERR",IERN,"TEXT",2)=" The ICN for the patient in this response is ICN: "_ICN | 
|---|
| 112 | . S ERROR("DIERR",IERN,"TEXT",3)=" eIIV was unable to file the response information." | 
|---|
| 113 | ; | 
|---|
| 114 | I +ICN>0 S DFN=XDFN | 
|---|
| 115 | ; | 
|---|
| 116 | ;  Perform date of death check | 
|---|
| 117 | I DOD'="" D DODCK^IBCNEHLU(DFN,DOD,MGRP,NAME,RIEN,SSN) | 
|---|
| 118 | ; | 
|---|
| 119 | I $P(^IBCN(365,RIEN,0),U,2)="" S RSUPDT(365,RIEN_",",.02)=DFN | 
|---|
| 120 | S RSUPDT(365,RIEN_",",1.02)=DOB,RSUPDT(365,RIEN_",",1.04)=SEX | 
|---|
| 121 | S RSUPDT(365,RIEN_",",1.03)=SSN,RSUPDT(365,RIEN_",",1.16)=DOD | 
|---|
| 122 | S RSUPDT(365,RIEN_",",1.01)=NAME,RSUPDT(365,RIEN_",",1.08)="v" | 
|---|
| 123 | S RSUPDT(365,RIEN_",",1.09)="01" | 
|---|
| 124 | D FILE^DIE("I","RSUPDT","ERROR") | 
|---|
| 125 | PIDX ; | 
|---|
| 126 | Q | 
|---|
| 127 | ; | 
|---|
| 128 | GT1 ;  Process the GT1 Guarantor seg | 
|---|
| 129 | ; | 
|---|
| 130 | ; Input: | 
|---|
| 131 | ; IBSEG,RIEN | 
|---|
| 132 | ; | 
|---|
| 133 | ; Output: | 
|---|
| 134 | ; ERROR,SUBID | 
|---|
| 135 | ; | 
|---|
| 136 | N DOB,NAME,RSUPDT,SEX,SSN,SUBIDC | 
|---|
| 137 | S NAME=$G(IBSEG(4)),DOB=$G(IBSEG(9)),SEX=$G(IBSEG(10)) | 
|---|
| 138 | S SSN=$G(IBSEG(13)) | 
|---|
| 139 | ; | 
|---|
| 140 | S SUBIDC=$G(IBSEG(3))  ; Raw field with sub-comp. | 
|---|
| 141 | S SUBID=$P(SUBIDC,$E(HLECH),1) | 
|---|
| 142 | S SUBID=$$DECHL7^IBCNEHL2(SUBID) | 
|---|
| 143 | ; | 
|---|
| 144 | S DOB=$$FMDATE^HLFNC(DOB),NAME=$$DECHL7^IBCNEHL2($$FMNAME^HLFNC(NAME,HLECH)) | 
|---|
| 145 | ; | 
|---|
| 146 | S RSUPDT(365,RIEN_",",1.01)=NAME,RSUPDT(365,RIEN_",",1.08)="" | 
|---|
| 147 | S RSUPDT(365,RIEN_",",1.02)=DOB,RSUPDT(365,RIEN_",",1.04)=SEX | 
|---|
| 148 | S RSUPDT(365,RIEN_",",1.03)=SSN | 
|---|
| 149 | S RSUPDT(365,RIEN_",",1.18)=SUBID | 
|---|
| 150 | D FILE^DIE("I","RSUPDT","ERROR") | 
|---|
| 151 | GT1X ; | 
|---|
| 152 | Q | 
|---|