Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: IVMPREC1

IVMPREC1.m

Go to the documentation of this file.
  1. IVMPREC1 ;ALB/SEK/BRM - PROCESS INCOMING HL7 (ACK) MESSAGES ; 07/28/2003
  1. ;;2.0;INCOME VERIFICATION MATCH;**9,17,26,52,34,72,82,129**; 21-OCT-94;Build 4
  1. ;;Per VHA Directive 10-93-142, this routine should not be modified.
  1. ;
  1. ; This routine will process ACK HL7 messages received from the
  1. ; IVM center.
  1. ;
  1. ACK ; - Receive ACK Message from IVM Center stored in ^TMP("HLR".
  1. ; If 1st segment is BHS then set(s) of MSH, MSA(AE) will follow
  1. ; indicating error(s) in transmission received by IVM Center
  1. ; If 1st segment is MSH than MSA (AA) indicating batch or individual
  1. ; query was received ok. MSA (AE) indicates error in transmission of
  1. ; individual query.
  1. ;
  1. ; - When acknowledgment code = "AA" (application accept)
  1. ; Stuff 1 into STATUS field (.03) of ^IVM(301.6 indicating IVM Center
  1. ; has received transmission.
  1. ;
  1. K HLNODE,IVMRTN,SEGCNT,CNT
  1. S IVMRTN="IVMPREC1"
  1. S HLFS=HL("FS"),HLQ=HL("Q"),HLECH=HL("ECH")
  1. K ^TMP($J,IVMRTN)
  1. F SEGCNT=1:1 X HLNEXT Q:HLQUIT'>0 D
  1. . S CNT=0,^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE
  1. . F S CNT=$O(HLNODE(CNT)) Q:'CNT D
  1. . . S ^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE(CNT)
  1. S HLDA=HLMTIEN
  1. K HLNODE,SEGCNT,CNT
  1. ;
  1. S IVMSEG=$G(^TMP($J,IVMRTN,1,0))
  1. I IVMSEG="" G ACKQ
  1. I $P(IVMSEG,HLFS)'="BHS",$P(IVMSEG,HLFS)'="MSH" G ACKQ
  1. ;
  1. ; - process batches of acknowledges
  1. I $P(IVMSEG,HLFS)="BHS" D AE G ACKQ
  1. ;
  1. ; - process MSH MSA message
  1. S IVMSEG=$G(^TMP($J,IVMRTN,2,0))
  1. I $P(IVMSEG,HLFS)'="MSA" G ACKQ
  1. S IVMADDT=$P(IVMSEG,HLFS,3)
  1. I $P(IVMSEG,HLFS,2)="AA" D G ACKQ
  1. .F IVMDA=0:0 S IVMDA=$O(^IVM(301.6,"AE",IVMADDT,IVMDA)) Q:'IVMDA I $$SETSTAT^IVMTLOG(IVMDA,1)
  1. ;
  1. I $P(IVMSEG,HLFS,2)="AE" D G ACKQ
  1. .S IVMMCI=$P(IVMSEG,HLFS,3)
  1. .S IVMEM=$P(IVMSEG,HLFS,4)
  1. .S IVMDA=$O(^IVM(301.6,"AE",IVMADDT,"")) I 'IVMDA D OTH Q
  1. .I $$SETSTAT^IVMTLOG(IVMDA,3,IVMEM)
  1. ;
  1. ACKQ ;
  1. K ^TMP($J,IVMRTN)
  1. K DA,DIE,DR,IVMADDT,IVMI,IVMCT,IVMDA,IVMMCI,IVMEM,IVMNAME,IVMPAT,IVMRTN,IVMSEG,IVMSSN,IVMTEXT,XMSUB
  1. ;
  1. Q
  1. ;
  1. AE ; - When acknowledgment code = "AE" (application error)
  1. ; Stuff 3 into STATUS field(.03), error message into ERROR MESSAGE
  1. ; field(.04), and 1 (NEW) into the ERROR PROCESSING STATUS field.
  1. ; Stuff 1 into STATUS field(.03) for transmissions (no 'AE' code
  1. ; received) received by IVM Center.
  1. ;
  1. N Z07FLG,Z07RET
  1. S IVMI=0 F S IVMI=$O(^TMP($J,IVMRTN,IVMI)) Q:'IVMI S IVMSEG=$G(^(IVMI,0)) D
  1. .D:$E(IVMSEG,1,3)="MSH"
  1. ..S Z07RET=0
  1. ..I $P(IVMSEG,HLFS,9)["ORU~Z07" S Z07FLG=1 Q
  1. ..K Z07FLG
  1. .Q:IVMSEG']""!($E(IVMSEG,1,3)'="MSA")!($P(IVMSEG,HLFS,2)'="AE")
  1. .S IVMMCI=$P(IVMSEG,HLFS,3)
  1. .S IVMEM=$P(IVMSEG,HLFS,4)
  1. .S IVMDA=$O(^IVM(301.6,"ADS",IVMMCI,"")) I 'IVMDA D Q:'Z07RET
  1. ..I $D(Z07FLG) D Q
  1. ...S Z07RET=$$Z07CHK(IVMI,IVMMCI,IVMEM)
  1. ...S:Z07RET IVMDA=$O(^IVM(301.6,"ADS",IVMMCI,""))
  1. ..D OTH
  1. .I $$SETSTAT^IVMTLOG(IVMDA,3,IVMEM)
  1. ;
  1. ; - update messages in batch with no error
  1. F IVMDA=0:0 S IVMDA=$O(^IVM(301.6,"AE",+$G(IVMMCI),IVMDA)) Q:'IVMDA I $$SETSTAT^IVMTLOG(IVMDA,1)
  1. Q
  1. ;
  1. OTH ; Generate message for errors other than Full/Initial Transmissions.
  1. N IVMRMM,IVMNAM,IVMPID,IVMMCID,IVMTMP,HLDA,HLDAT,HLSEG,DIC,DR,DA,DIQ
  1. S (IVMNAM,IVMPID,HLDA,IVMTMP)=""
  1. S HLDA=$O(^HL(772,"C",$P($G(IVMMCI),"-"),0))
  1. Q:+$G(HLDA)'>0
  1. Q:'$D(^HL(772,+HLDA,0))
  1. S DIC="^HL(772,",DR=200,DA=HLDA,DR(200.02)=.01,DA(200.02)=17,DIQ="HLDAT"
  1. D EN^DIQ1
  1. F S IVMTMP=$O(HLDAT(772,HLDA,200,IVMTMP)) Q:((IVMTMP="")!($G(HLSEG)="PID")) D
  1. .S HLSEG=$P($G(HLDAT(772,HLDA,200,IVMTMP)),"^")
  1. .I HLSEG="MSH" S IVMMCID=$P($G(HLDAT(772,HLDA,200,IVMTMP)),"^",10)
  1. .D:HLSEG="PID"
  1. ..;Find PID segment for the same message control ID only
  1. ..I IVMMCID'=IVMMCI S HLSEG="NOT CORRECT PID" Q
  1. ..; If PID segment was split, reconnect records
  1. ..I $L($G(HLDAT(772,HLDA,200,IVMTMP)))=245,$L($G(HLDAT(772,HLDA,200,IVMTMP)),U)<20 S HLDAT(772,HLDA,200,IVMTMP)=$$REBLDPID("HLDAT(772,"_HLDA_",200)",IVMTMP)
  1. ..S IVMNAM=$P($G(HLDAT(772,HLDA,200,IVMTMP)),"^",6) ;PATIENT NAME
  1. ..S IVMNAM=$P(IVMNAM,"~")_", "_$P(IVMNAM,"~",2)
  1. ..S IVMPID=$P($G(HLDAT(772,HLDA,200,IVMTMP)),"^",20) ;SSN
  1. ..;S IVMPID=$P(IVMPID,"~")
  1. ..S IVMPID=$E(IVMPID,1,3)_"-"_$E(IVMPID,4,5)_"-"_$E(IVMPID,6,9)
  1. ..S XMSUB="ERROR MESSAGE FROM THE HEC"
  1. ..S IVMTEXT(1)="An Insurance Confirmation message or a Billing/Collections Transmission"
  1. ..S IVMTEXT(2)="was rejected by the Health Eligibility Center with the following error:"
  1. ..S IVMTEXT(3)=" ",IVMTEXT(4)=IVMEM,IVMTEXT(5)=" "
  1. ..S IVMTEXT(6)="NAME: "_IVMNAM
  1. ..S IVMTEXT(7)="PID : "_IVMPID,IVMTEXT(8)=" "
  1. ..S IVMRMM=$$MMN^IVMPTRN4($P(IVMMCI,"-"))
  1. ..S IVMTEXT(9)="Mailman Message # of Acknowledged Transmission: "_$S(IVMRMM:IVMRMM,1:"<unknown>")
  1. ..S IVMTEXT(10)=" "
  1. ..S IVMTEXT(11)="If you are unable to find the source of this problem,"
  1. ..S IVMTEXT(12)="please contact your ISC Support Group or the HEC."
  1. ..D MAIL^IVMUFNC()
  1. Q
  1. ;
  1. Z07CHK(CURSEQ,CURMCI,CUREM) ; Function ;
  1. ; INPUT
  1. ; CURSEQ : Current Sequence # reviewing in batch
  1. ; CURMCI : Current Message Control ID reviewing in batch
  1. ; CUREM : Current Error Message reviewing in batch
  1. ;
  1. ; Check for duplicate ACK sequence on the same batch
  1. N SEQ,CHKSEG,CHKSEGN,DUP
  1. S (SEQ,DUP)=0
  1. F S SEQ=$O(^TMP($J,IVMRTN,SEQ)) Q:SEQ="" D
  1. . S CHKSEG=^TMP($J,IVMRTN,SEQ,0),CHKSEGN=$E(CHKSEG,1,3)
  1. . Q:CHKSEGN'="MSA"
  1. . Q:SEQ=CURSEQ
  1. . S:$P(CHKSEG,"^",3)=CURMCI DUP=1
  1. I DUP Q "0^DUPLICATE SEQUENCE ON ACK BATCH"
  1. ;
  1. ; Check to see if ADS x-ref missing in last 1000 entries
  1. N END,IEN,MCI,FND,LOG,RET,TMPCTR
  1. S FND=0,RET="",IEN=" "
  1. F TMPCTR=1:1:1000 S IEN=$O(^IVM(301.6,IEN),-1) Q:+IEN=0 D Q:FND
  1. . S MCI=$P(^IVM(301.6,IEN,0),"^",5)
  1. . I MCI=CURMCI S FND=1 D Q
  1. . . S LOG=^IVM(301.6,IEN,0)
  1. . . I $P(LOG,"^",3)=3&($P(LOG,"^",4)=CUREM) S RET="0^ACK TO THIS SEQUENCE HAS ALREADY BEEN PROCESSED" Q
  1. . . S ^IVM(301.6,"ADS",CURMCI,IEN)="" S RET="1^ADS X-REF MISSING. X-REF HAS BEEN RESET."
  1. Q RET
  1. ;
  1. REBLDPID(ARRAY,SEQ) ; Reconnect the pieces of the PID segment
  1. ; ARRAY contains the HL7 message reference to be accessed indirectly
  1. ; It should look similar in structure to the HL7 message text in
  1. ; file 772
  1. ; @ARRAY@(SEQ) should = the first 'PID' segment record text and should
  1. ; be 245 characters long
  1. N PID,SEQX
  1. S PID=$G(@ARRAY@(SEQ)),SEQX=SEQ
  1. G:$L(PID)'=245 PIDQ
  1. F S SEQX=$O(@ARRAY@(SEQX)) Q:SEQX="" I $G(@ARRAY@(SEQX))'="" S PID=PID_$G(@ARRAY@(SEQX)) Q
  1. PIDQ Q PID
  1. ;