| [613] | 1 | IVMPREC6 ;ALB/KCL/BRM - PROCESS INCOMING (Z05 EVENT TYPE) HL7 MESSAGES ; 12/29/2004
 | 
|---|
 | 2 |  ;;2.0; INCOME VERIFICATION MATCH ;**3,4,12,17,34,58,79,102**; 21-OCT-94
 | 
|---|
 | 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 |  ; This routine will process batch ORU demographic (event type Z05) HL7
 | 
|---|
 | 6 |  ; messages received from the IVM center.  Format of HL7 batch message:
 | 
|---|
 | 7 |  ;
 | 
|---|
 | 8 |  ;       BHS
 | 
|---|
 | 9 |  ;       {MSH
 | 
|---|
 | 10 |  ;        PID
 | 
|---|
 | 11 |  ;        ZPD
 | 
|---|
 | 12 |  ;        ZGD
 | 
|---|
 | 13 |  ;        RF1 (optional)
 | 
|---|
 | 14 |  ;       }
 | 
|---|
 | 15 |  ;       BTS
 | 
|---|
 | 16 |  ;
 | 
|---|
 | 17 |  ;
 | 
|---|
 | 18 | EN ; - entry point to process HL7 patient demographic message 
 | 
|---|
 | 19 |  ;
 | 
|---|
 | 20 |  N DGENUPLD,VAFCA08,DGRUGA08
 | 
|---|
 | 21 |  ;
 | 
|---|
 | 22 |  ; prevent a return Z07 when uploading a Z05 (Patient file triggers)
 | 
|---|
 | 23 |  S DGENUPLD="ENROLLMENT/ELIGIBILITY UPLOAD IN PROGRESS"
 | 
|---|
 | 24 |  ;
 | 
|---|
 | 25 |  ; prevent MPI A08 message when uploading Z05 (Patient file triggers)
 | 
|---|
 | 26 |  S VAFCA08=1  ;MPI/CIRN A08 suppression flag
 | 
|---|
 | 27 |  ;
 | 
|---|
 | 28 |  S IVMFLG=0
 | 
|---|
 | 29 |  ; - get incoming HL7 message from HL7 Transmission (#772) file
 | 
|---|
 | 30 |  F IVMDA=0:0 S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)) Q:'IVMDA  S IVMSEG=$G(^(IVMDA,0)) I $E(IVMSEG,1,3)="MSH" D
 | 
|---|
 | 31 |  .K HLERR
 | 
|---|
 | 32 |  .;
 | 
|---|
 | 33 |  .; - message control id from MSH segment
 | 
|---|
 | 34 |  .S MSGID=$P(IVMSEG,HLFS,10),HLMID=MSGID
 | 
|---|
 | 35 |  .;
 | 
|---|
 | 36 |  .; - perform demographics message consistency check
 | 
|---|
 | 37 |  .D EN^IVMPRECA Q:$D(HLERR)
 | 
|---|
 | 38 |  .;
 | 
|---|
 | 39 |  .; - get next msg segment
 | 
|---|
 | 40 |  .D NEXT I $E(IVMSEG,1,3)'="PID" D  Q
 | 
|---|
 | 41 |  ..S HLERR="Missing PID segment" D ACK^IVMPREC
 | 
|---|
 | 42 |  .;
 | 
|---|
 | 43 |  .; - patient IEN (DFN) from PID segment
 | 
|---|
 | 44 |  .S DFN=$P($P(IVMSEG,HLFS,4),$E(HLECH),1)
 | 
|---|
 | 45 |  .;
 | 
|---|
 | 46 |  .I ('DFN!(DFN'=+DFN)!('$D(^DPT(+DFN,0)))) D  Q
 | 
|---|
 | 47 |  ..S HLERR="Invalid DFN" D ACK^IVMPREC
 | 
|---|
 | 48 |  .I $P(IVMSEG,HLFS,20)'=$P(^DPT(DFN,0),"^",9) D  Q
 | 
|---|
 | 49 |  ..S HLERR="Couldn't match HEC SSN with DHCP SSN" D ACK^IVMPREC
 | 
|---|
 | 50 |  .;
 | 
|---|
 | 51 |  .; - check for entry in IVM PATIENT file, otherwise create stub entry
 | 
|---|
 | 52 |  .S IVM3015=$O(^IVM(301.5,"B",DFN,0))
 | 
|---|
 | 53 |  .I 'IVM3015 S IVM3015=$$LOG^IVMPLOG(DFN,DT)
 | 
|---|
 | 54 |  .I 'IVM3015 D  Q
 | 
|---|
 | 55 |  ..S HLERR="Failed to create entry in IVM PATIENT file"
 | 
|---|
 | 56 |  ..D ACK^IVMPREC
 | 
|---|
 | 57 |  .;
 | 
|---|
 | 58 |  .; - compare PID segment fields with DHCP fields
 | 
|---|
 | 59 |  .D COMPARE(IVMSEG) Q:$D(HLERR)
 | 
|---|
 | 60 |  .;
 | 
|---|
 | 61 |  .; - get next msg segment
 | 
|---|
 | 62 |  .D NEXT I $E(IVMSEG,1,3)'="ZPD" D  Q
 | 
|---|
 | 63 |  ..S HLERR="Missing ZPD segment" D ACK^IVMPREC
 | 
|---|
 | 64 |  .;
 | 
|---|
 | 65 |  .; - compare ZPD segment fields with DHCP fields
 | 
|---|
 | 66 |  .D COMPARE(IVMSEG)
 | 
|---|
 | 67 |  .;
 | 
|---|
 | 68 |  .; - get next msg segment
 | 
|---|
 | 69 |  .D NEXT I $E(IVMSEG,1,3)="ZEL" D  Q
 | 
|---|
 | 70 |  ..S HLERR="ZEL segment should not be sent in Z05 message" D ACK^IVMPREC
 | 
|---|
 | 71 |  .;
 | 
|---|
 | 72 |  .; - get next msg segment
 | 
|---|
 | 73 |  .I $E(IVMSEG,1,3)'="ZGD" D  Q
 | 
|---|
 | 74 |  ..S HLERR="Missing ZGD segment" D ACK^IVMPREC
 | 
|---|
 | 75 |  .;
 | 
|---|
 | 76 |  .; - compare ZGD segment fields with DHCP fields
 | 
|---|
 | 77 |  .D COMPARE(IVMSEG)
 | 
|---|
 | 78 |  .;S IVMFLG=0
 | 
|---|
 | 79 |  .;
 | 
|---|
 | 80 |  .; - check for RF1 segment and get segment if it exists
 | 
|---|
 | 81 |  .;     This process will automatically update patient address data
 | 
|---|
 | 82 |  .;     in the Patient (#2) file if the incoming address is more
 | 
|---|
 | 83 |  .;     recent than the existing one.
 | 
|---|
 | 84 |  .I $$RF1CHK(IVMRTN,IVMDA) D NEXT,COMPARE(IVMSEG) S IVMFLG=0
 | 
|---|
 | 85 |  ;
 | 
|---|
 | 86 |  ; - send mail message if necessary
 | 
|---|
 | 87 |  I IVMCNTR D MAIL^IVMUFNC()
 | 
|---|
 | 88 |  ; Cleanup variables if no msg necessary
 | 
|---|
 | 89 |  I 'IVMCNTR K IVMTEXT,XMSUB
 | 
|---|
 | 90 |  ;
 | 
|---|
 | 91 | ENQ ; - cleanup variables
 | 
|---|
 | 92 |  K DA,DFN,IVMADDR,IVMADFLG,IVMDA,IVMDHCP,IVMFLAG,IVMFLD,IVMPIECE,IVMSEG,IVMSTART,IVMXREF,DGENUPLD
 | 
|---|
 | 93 |  Q
 | 
|---|
 | 94 |  ;
 | 
|---|
 | 95 |  ;
 | 
|---|
 | 96 | NEXT ; - get the next HL7 segment in the message from HL7 Transmission (#772) file
 | 
|---|
 | 97 |  ;
 | 
|---|
 | 98 |  S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)),IVMSEG=$G(^(+IVMDA,0))
 | 
|---|
 | 99 |  Q
 | 
|---|
 | 100 |  ;
 | 
|---|
 | 101 |  ;
 | 
|---|
 | 102 | COMPARE(IVMSEG) ; - compare incoming HL7 segment/fields with DHCP fields
 | 
|---|
 | 103 |  ;
 | 
|---|
 | 104 |  ;  Input:  IVMSEG  --  as the text of the incoming HL7 message
 | 
|---|
 | 105 |  ;
 | 
|---|
 | 106 |  ; Output:  None
 | 
|---|
 | 107 |  ;
 | 
|---|
 | 108 |  ; - get 3 letter HL7 segment name
 | 
|---|
 | 109 |  S IVMXREF=$P(IVMSEG,HLFS,1),IVMSTART=IVMXREF
 | 
|---|
 | 110 |  ;
 | 
|---|
 | 111 |  ; - strip off HL7 segment name
 | 
|---|
 | 112 |  S IVMSEG=$P(IVMSEG,HLFS,2,99)
 | 
|---|
 | 113 |  ;
 | 
|---|
 | 114 |  ; - roll through "C" x-ref in IVM Demographic Upload Fields (#301.92) file
 | 
|---|
 | 115 |  F  S IVMXREF=$O(^IVM(301.92,"C",IVMXREF)) Q:IVMXREF']""  D
 | 
|---|
 | 116 |  .S IVMDEMDA=$O(^IVM(301.92,"C",IVMXREF,"")) Q:IVMDEMDA']""
 | 
|---|
 | 117 |  .I $$INACTIVE(IVMDEMDA) Q
 | 
|---|
 | 118 |  .;
 | 
|---|
 | 119 |  .; - compare incoming HL7 segment fields with DHCP fields
 | 
|---|
 | 120 |  .I IVMXREF["PID",(IVMSTART["PID") D PID^IVMPREC8
 | 
|---|
 | 121 |  .I IVMXREF["ZPD",(IVMSTART["ZPD") D ZPD^IVMPREC8
 | 
|---|
 | 122 |  .I IVMXREF["ZGD",(IVMSTART["ZGD") D ZGD^IVMPREC8
 | 
|---|
 | 123 |  .I IVMXREF["RF1",(IVMSTART["RF1") D RF1^IVMPREC8
 | 
|---|
 | 124 |  Q
 | 
|---|
 | 125 |  ;
 | 
|---|
 | 126 |  ;
 | 
|---|
 | 127 | DEMBULL ; -  build mail message for transmission to IVM mail group notifying
 | 
|---|
 | 128 |  ;    them that patients with updated demographic data has been received
 | 
|---|
 | 129 |  ;    from the IVM Center and may now be uploaded into DHCP.
 | 
|---|
 | 130 |  ;
 | 
|---|
 | 131 |  ; If record is auto uploaded, don't add veteran to bulletin
 | 
|---|
 | 132 |  I $$CKAUTO Q
 | 
|---|
 | 133 |  ;
 | 
|---|
 | 134 |  S IVMPTID=$$PT^IVMUFNC4(DFN)
 | 
|---|
 | 135 |  S XMSUB="IVM - DEMOGRAPHIC UPLOAD for "_$P($P(IVMPTID,"^"),",")_" ("_$P(IVMPTID,"^",3)_")"
 | 
|---|
 | 136 |  S IVMTEXT(1)="Updated demographic information has been received from the"
 | 
|---|
 | 137 |  S IVMTEXT(2)="Health Eligibilty Center.  Please select the 'Demographic Upload'"
 | 
|---|
 | 138 |  S IVMTEXT(3)="option from the IVM Upload Menu in order to take action on this"
 | 
|---|
 | 139 |  S IVMTEXT(4)="demographic information.  If you have any questions concerning the"
 | 
|---|
 | 140 |  S IVMTEXT(5)="information received, please contact the Health Eligibility Center."
 | 
|---|
 | 141 |  S IVMTEXT(7)=""
 | 
|---|
 | 142 |  S IVMTEXT(8)="The Health Eligibilty Center has identified the following"
 | 
|---|
 | 143 |  S IVMTEXT(9)="patients as having updated demographic information:"
 | 
|---|
 | 144 |  S IVMTEXT(10)=""
 | 
|---|
 | 145 |  S IVMCNTR=IVMCNTR+1
 | 
|---|
 | 146 |  S IVMTEXT(IVMCNTR+10)=$J(IVMCNTR_")",5)_"  "_$P(IVMPTID,"^")_" ("_$P(IVMPTID,"^",3)_")"
 | 
|---|
 | 147 |  Q
 | 
|---|
 | 148 |  ;
 | 
|---|
 | 149 | INACTIVE(IVMDEMDA) ;Check if field is inactive in Demographic Upload
 | 
|---|
 | 150 |  ; Input  -- IVMDEMDA IVM Demographic Upload Fields IEN
 | 
|---|
 | 151 |  ; Output -- 1=Yes and 0=No
 | 
|---|
 | 152 |  Q +$P($G(^IVM(301.92,IVMDEMDA,0)),U,9)
 | 
|---|
 | 153 |  ;
 | 
|---|
 | 154 | RF1CHK(IVMRTN,IVMDA) ;does an RF1 segment exist in this message?
 | 
|---|
 | 155 |  N RF1
 | 
|---|
 | 156 |  S RF1=$O(^TMP($J,IVMRTN,IVMDA))
 | 
|---|
 | 157 |  I $E($G(^(+RF1,0)),1,3)'="RF1" Q 0
 | 
|---|
 | 158 |  Q 1
 | 
|---|
 | 159 |  ;
 | 
|---|
 | 160 | CKAUTO() ;
 | 
|---|
 | 161 |  ; Chect if message qualifies for an auto upload.
 | 
|---|
 | 162 |  N AUTO,IVMI,DOD
 | 
|---|
 | 163 |  S AUTO=0,IVMI=$O(^IVM(301.92,"C","ZPD09",""))
 | 
|---|
 | 164 |  I IVMI=IVMDEMDA  D
 | 
|---|
 | 165 |  .I +IVMFLD'>0 S AUTO=1 Q
 | 
|---|
 | 166 |  .S DOD=$P($G(^DPT(DFN,.35)),U)
 | 
|---|
 | 167 |  .I DOD=IVMFLD S AUTO=1 Q
 | 
|---|
 | 168 |  ;
 | 
|---|
 | 169 |  Q AUTO
 | 
|---|