[613] | 1 | IVMPREC1 ;ALB/SEK/BRM - PROCESS INCOMING HL7 (ACK) MESSAGES ; 07/28/2003
|
---|
| 2 | ;;2.0;INCOME VERIFICATION MATCH;**9,17,26,52,34,72,82**; 21-OCT-94
|
---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
| 4 | ;
|
---|
| 5 | ; This routine will process ACK HL7 messages received from the
|
---|
| 6 | ; IVM center.
|
---|
| 7 | ;
|
---|
| 8 | ACK ; - Receive ACK Message from IVM Center stored in ^TMP("HLR".
|
---|
| 9 | ; If 1st segment is BHS then set(s) of MSH, MSA(AE) will follow
|
---|
| 10 | ; indicating error(s) in transmission received by IVM Center
|
---|
| 11 | ; If 1st segment is MSH than MSA (AA) indicating batch or individual
|
---|
| 12 | ; query was received ok. MSA (AE) indicates error in transmission of
|
---|
| 13 | ; individual query.
|
---|
| 14 | ;
|
---|
| 15 | ; - When acknowledgment code = "AA" (application accept)
|
---|
| 16 | ; Stuff 1 into STATUS field (.03) of ^IVM(301.6 indicating IVM Center
|
---|
| 17 | ; has received transmission.
|
---|
| 18 | ;
|
---|
| 19 | K HLNODE,IVMRTN,SEGCNT,CNT
|
---|
| 20 | S IVMRTN="IVMPREC1"
|
---|
| 21 | S HLFS=HL("FS"),HLQ=HL("Q"),HLECH=HL("ECH")
|
---|
| 22 | K ^TMP($J,IVMRTN)
|
---|
| 23 | F SEGCNT=1:1 X HLNEXT Q:HLQUIT'>0 D
|
---|
| 24 | . S CNT=0,^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE
|
---|
| 25 | . F S CNT=$O(HLNODE(CNT)) Q:'CNT D
|
---|
| 26 | . . S ^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE(CNT)
|
---|
| 27 | S HLDA=HLMTIEN
|
---|
| 28 | K HLNODE,SEGCNT,CNT
|
---|
| 29 | ;
|
---|
| 30 | S IVMSEG=$G(^TMP($J,IVMRTN,1,0))
|
---|
| 31 | I IVMSEG="" G ACKQ
|
---|
| 32 | I $P(IVMSEG,HLFS)'="BHS",$P(IVMSEG,HLFS)'="MSH" G ACKQ
|
---|
| 33 | ;
|
---|
| 34 | ; - process batches of acknowledges
|
---|
| 35 | I $P(IVMSEG,HLFS)="BHS" D AE G ACKQ
|
---|
| 36 | ;
|
---|
| 37 | ; - process MSH MSA message
|
---|
| 38 | S IVMSEG=$G(^TMP($J,IVMRTN,2,0))
|
---|
| 39 | I $P(IVMSEG,HLFS)'="MSA" G ACKQ
|
---|
| 40 | S IVMADDT=$P(IVMSEG,HLFS,3)
|
---|
| 41 | I $P(IVMSEG,HLFS,2)="AA" D G ACKQ
|
---|
| 42 | .F IVMDA=0:0 S IVMDA=$O(^IVM(301.6,"AE",IVMADDT,IVMDA)) Q:'IVMDA I $$SETSTAT^IVMTLOG(IVMDA,1)
|
---|
| 43 | ;
|
---|
| 44 | I $P(IVMSEG,HLFS,2)="AE" D G ACKQ
|
---|
| 45 | .S IVMMCI=$P(IVMSEG,HLFS,3)
|
---|
| 46 | .S IVMEM=$P(IVMSEG,HLFS,4)
|
---|
| 47 | .S IVMDA=$O(^IVM(301.6,"AE",IVMADDT,"")) I 'IVMDA D OTH Q
|
---|
| 48 | .I $$SETSTAT^IVMTLOG(IVMDA,3,IVMEM)
|
---|
| 49 | ;
|
---|
| 50 | ACKQ ;
|
---|
| 51 | K ^TMP($J,IVMRTN)
|
---|
| 52 | K DA,DIE,DR,IVMADDT,IVMI,IVMCT,IVMDA,IVMMCI,IVMEM,IVMNAME,IVMPAT,IVMRTN,IVMSEG,IVMSSN,IVMTEXT,XMSUB
|
---|
| 53 | ;
|
---|
| 54 | Q
|
---|
| 55 | ;
|
---|
| 56 | AE ; - When acknowledgment code = "AE" (application error)
|
---|
| 57 | ; Stuff 3 into STATUS field(.03), error message into ERROR MESSAGE
|
---|
| 58 | ; field(.04), and 1 (NEW) into the ERROR PROCESSING STATUS field.
|
---|
| 59 | ; Stuff 1 into STATUS field(.03) for transmissions (no 'AE' code
|
---|
| 60 | ; received) received by IVM Center.
|
---|
| 61 | ;
|
---|
| 62 | N Z07FLG,Z07RET
|
---|
| 63 | S IVMI=0 F S IVMI=$O(^TMP($J,IVMRTN,IVMI)) Q:'IVMI S IVMSEG=$G(^(IVMI,0)) D
|
---|
| 64 | .D:$E(IVMSEG,1,3)="MSH"
|
---|
| 65 | ..S Z07RET=0
|
---|
| 66 | ..I $P(IVMSEG,HLFS,9)["ORU~Z07" S Z07FLG=1 Q
|
---|
| 67 | ..K Z07FLG
|
---|
| 68 | .Q:IVMSEG']""!($E(IVMSEG,1,3)'="MSA")!($P(IVMSEG,HLFS,2)'="AE")
|
---|
| 69 | .S IVMMCI=$P(IVMSEG,HLFS,3)
|
---|
| 70 | .S IVMEM=$P(IVMSEG,HLFS,4)
|
---|
| 71 | .S IVMDA=$O(^IVM(301.6,"ADS",IVMMCI,"")) I 'IVMDA D Q:'Z07RET
|
---|
| 72 | ..I $D(Z07FLG) D Q
|
---|
| 73 | ...S Z07RET=$$Z07CHK(IVMI,IVMMCI,IVMEM)
|
---|
| 74 | ...S:Z07RET IVMDA=$O(^IVM(301.6,"ADS",IVMMCI,""))
|
---|
| 75 | ..D OTH
|
---|
| 76 | .I $$SETSTAT^IVMTLOG(IVMDA,3,IVMEM)
|
---|
| 77 | ;
|
---|
| 78 | ; - update messages in batch with no error
|
---|
| 79 | F IVMDA=0:0 S IVMDA=$O(^IVM(301.6,"AE",+$G(IVMMCI),IVMDA)) Q:'IVMDA I $$SETSTAT^IVMTLOG(IVMDA,1)
|
---|
| 80 | Q
|
---|
| 81 | ;
|
---|
| 82 | OTH ; Generate message for errors other than Full/Initial Transmissions.
|
---|
| 83 | N IVMRMM,IVMNAM,IVMPID,IVMTMP,HLDA,HLDAT,HLSEG,DIC,DR,DA,DIQ
|
---|
| 84 | S (IVMNAM,IVMPID,HLDA,IVMTMP)=""
|
---|
| 85 | S HLDA=$O(^HL(772,"C",$P($G(IVMMCI),"-"),0))
|
---|
| 86 | Q:+$G(HLDA)'>0
|
---|
| 87 | Q:'$D(^HL(772,+HLDA,0))
|
---|
| 88 | S DIC="^HL(772,",DR=200,DA=HLDA,DR(200.02)=.01,DA(200.02)=17,DIQ="HLDAT"
|
---|
| 89 | D EN^DIQ1
|
---|
| 90 | F S IVMTMP=$O(HLDAT(772,HLDA,200,IVMTMP)) Q:((IVMTMP="")!($G(HLSEG)="PID")) D
|
---|
| 91 | .S HLSEG=$P($G(HLDAT(772,HLDA,200,IVMTMP)),"^")
|
---|
| 92 | .D:HLSEG="PID"
|
---|
| 93 | ..S IVMNAM=$P($G(HLDAT(772,HLDA,200,IVMTMP)),"^",6) ;PATIENT NAME
|
---|
| 94 | ..S IVMNAM=$P(IVMNAM,"~")_", "_$P(IVMNAM,"~",2)
|
---|
| 95 | ..S IVMPID=$P($G(HLDAT(772,HLDA,200,IVMTMP)),"^",20) ;SSN
|
---|
| 96 | ..;S IVMPID=$P(IVMPID,"~")
|
---|
| 97 | ..S IVMPID=$E(IVMPID,1,3)_"-"_$E(IVMPID,4,5)_"-"_$E(IVMPID,6,9)
|
---|
| 98 | ..S XMSUB="ERROR MESSAGE FROM THE HEC"
|
---|
| 99 | ..S IVMTEXT(1)="An Insurance Confirmation message or a Billing/Collections Transmission"
|
---|
| 100 | ..S IVMTEXT(2)="was rejected by the Health Eligibility Center with the following error:"
|
---|
| 101 | ..S IVMTEXT(3)=" ",IVMTEXT(4)=IVMEM,IVMTEXT(5)=" "
|
---|
| 102 | ..S IVMTEXT(6)="NAME: "_IVMNAM
|
---|
| 103 | ..S IVMTEXT(7)="PID : "_IVMPID,IVMTEXT(8)=" "
|
---|
| 104 | ..S IVMRMM=$$MMN^IVMPTRN4($P(IVMMCI,"-"))
|
---|
| 105 | ..S IVMTEXT(9)="Mailman Message # of Acknowledged Transmission: "_$S(IVMRMM:IVMRMM,1:"<unknown>")
|
---|
| 106 | ..S IVMTEXT(10)=" "
|
---|
| 107 | ..S IVMTEXT(11)="If you are unable to find the source of this problem,"
|
---|
| 108 | ..S IVMTEXT(12)="please contact your ISC Support Group or the HEC."
|
---|
| 109 | ..D MAIL^IVMUFNC()
|
---|
| 110 | Q
|
---|
| 111 | ;
|
---|
| 112 | Z07CHK(CURSEQ,CURMCI,CUREM) ; Function ;
|
---|
| 113 | ; INPUT
|
---|
| 114 | ; CURSEQ : Current Sequence # reviewing in batch
|
---|
| 115 | ; CURMCI : Current Message Control ID reviewing in batch
|
---|
| 116 | ; CUREM : Current Error Message reviewing in batch
|
---|
| 117 | ;
|
---|
| 118 | ; Check for duplicate ACK sequence on the same batch
|
---|
| 119 | N SEQ,CHKSEG,CHKSEGN,DUP
|
---|
| 120 | S (SEQ,DUP)=0
|
---|
| 121 | F S SEQ=$O(^TMP($J,IVMRTN,SEQ)) Q:SEQ="" D
|
---|
| 122 | . S CHKSEG=^TMP($J,IVMRTN,SEQ,0),CHKSEGN=$E(CHKSEG,1,3)
|
---|
| 123 | . Q:CHKSEGN'="MSA"
|
---|
| 124 | . Q:SEQ=CURSEQ
|
---|
| 125 | . S:$P(CHKSEG,"^",3)=CURMCI DUP=1
|
---|
| 126 | I DUP Q "0^DUPLICATE SEQUENCE ON ACK BATCH"
|
---|
| 127 | ;
|
---|
| 128 | ; Check to see if ADS x-ref missing in last 1000 entries
|
---|
| 129 | N END,IEN,MCI,FND,LOG,RET,TMPCTR
|
---|
| 130 | S FND=0,RET="",IEN=" "
|
---|
| 131 | F TMPCTR=1:1:1000 S IEN=$O(^IVM(301.6,IEN),-1) Q:+IEN=0 D Q:FND
|
---|
| 132 | . S MCI=$P(^IVM(301.6,IEN,0),"^",5)
|
---|
| 133 | . I MCI=CURMCI S FND=1 D Q
|
---|
| 134 | . . S LOG=^IVM(301.6,IEN,0)
|
---|
| 135 | . . I $P(LOG,"^",3)=3&($P(LOG,"^",4)=CUREM) S RET="0^ACK TO THIS SEQUENCE HAS ALREADY BEEN PROCESSED" Q
|
---|
| 136 | . . S ^IVM(301.6,"ADS",CURMCI,IEN)="" S RET="1^ADS X-REF MISSING. X-REF HAS BEEN RESET."
|
---|
| 137 | Q RET
|
---|