| [613] | 1 | IVMPREC ;ALB/MLI/ESD,BAJ - PROCESS INCOMING HL7 (QRY) MESSAGES ; 8/17/06 2:37pm
 | 
|---|
 | 2 |  ;;2.0;INCOME VERIFICATION MATCH;**1,9,11,15,18,24,34,105**;JUL 8,1996;Build 2
 | 
|---|
 | 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 |  ; This routine will process (QRY) HL7 messages received from HEC
 | 
|---|
 | 6 |  ; At present, the (QRY) message queries for updated information
 | 
|---|
 | 7 |  ; for a single patient.
 | 
|---|
 | 8 |  ;
 | 
|---|
 | 9 |  ;
 | 
|---|
 | 10 | QRY ; - Receive Query Message requesting further information
 | 
|---|
 | 11 |  ;
 | 
|---|
 | 12 |  S (HLEVN,IVMCT,IVMERROR,IVMFLAG)=0
 | 
|---|
 | 13 |  ;
 | 
|---|
 | 14 |  K IVMQUERY("LTD"),IVMQUERY("OVIS") ;Variables needed to open/close last visit date and outpt visit QUERIES
 | 
|---|
 | 15 |  S IVMRTN="IVMPREC"
 | 
|---|
 | 16 |  K ^TMP($J,IVMRTN),^TMP("HLS",$J),^TMP("HLA",$J)
 | 
|---|
 | 17 |  F SEGCNT=1:1 X HLNEXT Q:HLQUIT'>0  D
 | 
|---|
 | 18 |  .S CNT=0
 | 
|---|
 | 19 |  .S ^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE
 | 
|---|
 | 20 |  .F  S CNT=$O(HLNODE(CNT)) Q:'CNT  D
 | 
|---|
 | 21 |  ..S ^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE(CNT)
 | 
|---|
 | 22 |  ;
 | 
|---|
 | 23 |  ; INITIALIZE HL7 VARIABLES
 | 
|---|
 | 24 |  S HLEID="VAMC "_$P($$SITE^VASITE,"^",3)_" ORF-Z07 SERVER"
 | 
|---|
 | 25 |  S HLEID=$O(^ORD(101,"B",HLEID,0))
 | 
|---|
 | 26 |  D INIT^HLFNC2(HLEID,.HL)
 | 
|---|
 | 27 |  S HLEIDS=$O(^ORD(101,HLEID,775,"B",0))
 | 
|---|
 | 28 |  ;
 | 
|---|
 | 29 |  ; IVM*2.0*105 BAJ 11/02/2005 Temp global for Consistency Checks
 | 
|---|
 | 30 |  K ^TMP($J,"CC")
 | 
|---|
 | 31 |  ;
 | 
|---|
 | 32 |  F IVMDA=0:0 S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)) Q:'IVMDA  S IVMSEG=$G(^(IVMDA,0)) I $E(IVMSEG,1,3)="QRD"!($E(IVMSEG,1,3)="MSH") D
 | 
|---|
 | 33 |  .I $E(IVMSEG,1,3)="MSH" S IVMMSHID=$P(IVMSEG,HLFS,10),MSGID=$P(IVMSEG,HLFS,10),HLMID=MSGID Q
 | 
|---|
 | 34 |  .K HLERR S IVMFLAG=1
 | 
|---|
 | 35 |  .S IVMSEG=$P(IVMSEG,HLFS,2,999) ; strip off segment name
 | 
|---|
 | 36 |  .S IVMQLR=$P(IVMSEG,HLFS,7),DFN=$P(IVMSEG,HLFS,8),IVMIY=$P(IVMSEG,HLFS,10)
 | 
|---|
 | 37 |  .D ERRCK
 | 
|---|
 | 38 |  .I $D(HLERR) D ACK
 | 
|---|
 | 39 |  .I '$D(HLERR) D
 | 
|---|
 | 40 |  ..N EVENTS
 | 
|---|
 | 41 |  ..; - if master query - create entry in (#301.9) file
 | 
|---|
 | 42 |  ..I IVMQLR>1,'DFN D  Q
 | 
|---|
 | 43 |  ...S IVMSEG1="QRD"_HLFS_IVMSEG
 | 
|---|
 | 44 |  ...S:'$D(^IVM(301.9,1,10,0)) ^(0)="^301.9001DA^"
 | 
|---|
 | 45 |  ...S DA(1)=1,DIC="^IVM(301.9,1,10,",DIC(0)=""
 | 
|---|
 | 46 |  ...S X=IVMIY
 | 
|---|
 | 47 |  ...K DO,DD D FILE^DICN
 | 
|---|
 | 48 |  ...S DA=+Y,DA(1)=1,DIE="^IVM(301.9,1,10,"
 | 
|---|
 | 49 |  ...S DR=".02///NOW;.04////^S X=IVMMSHID;10////^S X=IVMSEG1" D ^DIE
 | 
|---|
 | 50 |  ..;
 | 
|---|
 | 51 |  ..; Send AE if veteran has a Pseudo SSN and eligibility is not verified
 | 
|---|
 | 52 |  ..; Removed with IVM*2*105
 | 
|---|
 | 53 |  ..; I '$$SNDPSSN^IVMPTRN7(DFN) S HLERR="Pseudo SSN must be verified" D ACK Q
 | 
|---|
 | 54 |  ..;
 | 
|---|
 | 55 |  ..; - prepare (ACK) message
 | 
|---|
 | 56 |  ..D:'$D(HLERR) MSGHDR   ;header (MSH)
 | 
|---|
 | 57 |  ..D ACK     ;message (MSA)
 | 
|---|
 | 58 |  ..;
 | 
|---|
 | 59 |  ..; - set up local HL7 event type code in MSH
 | 
|---|
 | 60 |  ..S IVMCT=IVMCT+1,^TMP("HLS",$J,IVMCT)="QRD"_HLFS_IVMSEG ; copy of incoming QRD
 | 
|---|
 | 61 |  ..;
 | 
|---|
 | 62 |  ..; - build 'FULL' transmission (note: without MSH segment)
 | 
|---|
 | 63 |  ..S IVMMTDT=$E(IVMIY,1,3)+1_"1231.9999"
 | 
|---|
 | 64 |  ..D FULL^IVMPTRN7(DFN,IVMMTDT,.EVENTS,.IVMCT,.IVMGTOT,,1,,.IVMQUERY)
 | 
|---|
 | 65 |  ;
 | 
|---|
 | 66 |  ; IVM*2.0*105 BAJ 11/02/2005
 | 
|---|
 | 67 |  ; send AE if inconsistencies found.
 | 
|---|
 | 68 |  I ^TMP($J,"CC",0) S HLERR="Message not sent.  Inconsistencies in Record" D ACK
 | 
|---|
 | 69 |  K ^TMP($J,"CC")
 | 
|---|
 | 70 |  ;
 | 
|---|
 | 71 |  F Z="LTD","OVIS" I $G(IVMQUERY(Z)) D CLOSE^SDQ(IVMQUERY(Z)) K IVMQUERY(Z)
 | 
|---|
 | 72 |  I 'IVMFLAG S HLERR="Invalid Message Format" D ACK
 | 
|---|
 | 73 |  S HLMTN="ORF"
 | 
|---|
 | 74 |  S HLMTIENA=HLMTIEN
 | 
|---|
 | 75 |  K ^TMP("HLA",$J) M ^TMP("HLA",$J)=^TMP("HLS",$J) K ^TMP("HLS",$J)
 | 
|---|
 | 76 |  D GENACK^HLMA1(HLEID,HLMTIENS,HLEIDS,"GB",1,.HLRESLTA,HLMTIENA,.HLP)
 | 
|---|
 | 77 |  ;
 | 
|---|
 | 78 | QRYQ K DFN,DR,HLEVN,IVMCT,IVMDA,IVMERROR,IVMFLAG,IVMIY,IVMMTDT,IVMSEG,IVMSEG1,IVMQLR,IVMMSHID,MSGID,MSHID
 | 
|---|
 | 79 |  K ^TMP("HLA",$J),^TMP("HLS",$J),^TMP($J,IVMRTN)
 | 
|---|
 | 80 |  Q
 | 
|---|
 | 81 |  ;
 | 
|---|
 | 82 |  ;
 | 
|---|
 | 83 | ERRCK ; Perform error checks on HL7 (QRD) segment
 | 
|---|
 | 84 |  I ('DFN!(DFN'=+DFN)) S:IVMQLR'>1 HLERR="Invalid DFN"
 | 
|---|
 | 85 |  I '$D(HLERR) S IVMIY=$$FMDATE^HLFNC(IVMIY) I $E(IVMIY,4,7)'="0000"!($E(IVMIY,1,3)<292) S HLERR="Invalid Income Year"
 | 
|---|
 | 86 |  I '$D(HLERR),$P(IVMSEG,HLFS,2)'="R" S HLERR="Invalid Query Format Code"
 | 
|---|
 | 87 |  I '$D(HLERR),$P(IVMSEG,HLFS,3)'="I",($P(IVMSEG,HLFS,3)'="D") S HLERR="Invalid Query Priority"
 | 
|---|
 | 88 |  I '$D(HLERR),$P(IVMSEG,HLFS,9)'="DEM" S HLERR="Invalid Query Subject Filter"
 | 
|---|
 | 89 |  I '$D(HLERR),$P(IVMSEG,HLFS,12)'="T" S HLERR="Invalid Query Results Level"
 | 
|---|
 | 90 |  ;
 | 
|---|
 | 91 |  Q
 | 
|---|
 | 92 |  ;
 | 
|---|
 | 93 | MSGHDR ; prepare header MSH segment in batch of 100 message events
 | 
|---|
 | 94 |  ; input variables:
 | 
|---|
 | 95 |  ;          IVMCT record counter
 | 
|---|
 | 96 |  ;          HLEVN event number
 | 
|---|
 | 97 |  ;          MSHID outgoing message id
 | 
|---|
 | 98 |  ;             HL array for protocol
 | 
|---|
 | 99 |  ;                 
 | 
|---|
 | 100 |  N MID,HLRES
 | 
|---|
 | 101 |  S HLEVN=$G(HLEVN)+1
 | 
|---|
 | 102 |  D:(HLEVN#100)=1
 | 
|---|
 | 103 |  .K MSHID,HLDT,HLDT1,HLMTIEN
 | 
|---|
 | 104 |  .D INIT^HLFNC2(HLEID,.HL)
 | 
|---|
 | 105 |  .D CREATE^HLTF(.MSHID,.HLMTIEN,.HLDT,.HLDT1)
 | 
|---|
 | 106 |  S MID=MSHID_"-"_HLEVN
 | 
|---|
 | 107 |  D MSH^HLFNC2(.HL,MID,.HLRES)
 | 
|---|
 | 108 |  S IVMCT=$G(IVMCT)+1
 | 
|---|
 | 109 |  S ^TMP("HLS",$J,IVMCT)=HLRES
 | 
|---|
 | 110 |  Q
 | 
|---|
 | 111 |  ;
 | 
|---|
 | 112 | ACK ; prepare positive and negative acknowledgement (ACK) message
 | 
|---|
 | 113 |  ; (positive acknowledgement: MSA segment with no MSH segment)
 | 
|---|
 | 114 |  ; (negative acknowledgement: MSA segment with MSH segment)
 | 
|---|
 | 115 |  N MID,HLRES
 | 
|---|
 | 116 |  S IVMCT=$G(IVMCT)+1
 | 
|---|
 | 117 |  D:$D(HLERR)
 | 
|---|
 | 118 |  .S IVMERROR=1
 | 
|---|
 | 119 |  .S HLEVN=HLEVN+1
 | 
|---|
 | 120 |  .D:(HLEVN#100)=1
 | 
|---|
 | 121 |  ..K HLMID,HLMTIEN,HLDT,HLDT1 ; set up batch
 | 
|---|
 | 122 |  ..D INIT^HLFNC2(HLEID,.HL)
 | 
|---|
 | 123 |  ..D CREATE^HLTF(.HLMID,.HLMTIEN,.HLDT,.HLDT1)
 | 
|---|
 | 124 |  .S MID=HLMID_"-"_HLEVN
 | 
|---|
 | 125 |  .D MSH^HLFNC2(.HL,MID,.HLRES)
 | 
|---|
 | 126 |  .S ^TMP("HLS",$J,IVMCT)=HLRES
 | 
|---|
 | 127 |  .S IVMCT=IVMCT+1
 | 
|---|
 | 128 |  .S ^TMP("HLS",$J,IVMCT)="MSA"_HLFS_"AE"_HLFS_MSGID_HLFS_HLERR_"- SSN "_$S($G(DFN):$P($$PT^IVMUFNC4(DFN),"^",2),1:"NOT FOUND")
 | 
|---|
 | 129 |  I '$D(HLERR) S ^TMP("HLS",$J,IVMCT)="MSA"_HLFS_"AA"_HLFS_HLMID
 | 
|---|
 | 130 |  ;
 | 
|---|
 | 131 |  Q
 | 
|---|
 | 132 |  ;
 | 
|---|