| 1 | IVMPREC3 ;ALB/KCL - PROCESS INCOMING (Z04 EVENT TYPE) HL7 MESSAGES ; 3/6/01 4:33pm
 | 
|---|
| 2 |  ;;2.0;INCOME VERIFICATION MATCH;**3,17,34,111**;21-OCT-94
 | 
|---|
| 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ; This routine will process batch ORU insurance(event type Z04) HL7
 | 
|---|
| 6 |  ; messages received from the IVM center.  Format of batch:
 | 
|---|
| 7 |  ;       BHS
 | 
|---|
| 8 |  ;       {MSH
 | 
|---|
| 9 |  ;        PID
 | 
|---|
| 10 |  ;        IN1    could be a continuation of IN1
 | 
|---|
| 11 |  ;        ZIV
 | 
|---|
| 12 |  ;       }
 | 
|---|
| 13 |  ;       BTS
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 | EN ; - entry point to process insurance messages
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  F IVMDA=1:0 S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)) Q:'IVMDA  S IVMSEG=$G(^(IVMDA,0)) I $E(IVMSEG,1,3)="MSH" D
 | 
|---|
| 18 |  .K HLERR
 | 
|---|
| 19 |  .;
 | 
|---|
| 20 |  .; - message control id from MSH segment
 | 
|---|
| 21 |  .S MSGID=$P(IVMSEG,HLFS,10)
 | 
|---|
| 22 |  .;
 | 
|---|
| 23 |  .; - get message segments from (#772) file
 | 
|---|
| 24 |  .S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)),IVMSEG=$G(^(+IVMDA,0)) I $E(IVMSEG,1,3)'="PID" D  Q
 | 
|---|
| 25 |  ..S HLERR="Missing PID segment" D ACK^IVMPREC
 | 
|---|
| 26 |  .S DFN=$P($P(IVMSEG,HLFS,4),$E(HLECH),1)
 | 
|---|
| 27 |  .I ('DFN!(DFN'=+DFN)!('$D(^DPT(+DFN,0)))) D  Q
 | 
|---|
| 28 |  ..S HLERR="Invalid DFN" D ACK^IVMPREC
 | 
|---|
| 29 |  .I $P(IVMSEG,HLFS,20)'=$P(^DPT(DFN,0),"^",9) D  Q
 | 
|---|
| 30 |  ..S HLERR="Couldn't match IVM SSN with DHCP SSN" D ACK^IVMPREC
 | 
|---|
| 31 |  .S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)),IVMSEG=$G(^(+IVMDA,0)) I $E(IVMSEG,1,3)'="IN1" D  Q
 | 
|---|
| 32 |  ..S HLERR="Missing IN1 segment" D ACK^IVMPREC
 | 
|---|
| 33 |  .S IVMSEG1=$P(IVMSEG,HLFS,2,999)
 | 
|---|
| 34 |  .I $P(IVMSEG1,HLFS,4)']"" D  Q
 | 
|---|
| 35 |  ..S HLERR="Missing insurance company name" D ACK^IVMPREC
 | 
|---|
| 36 |  .I $P(IVMSEG1,HLFS,8)']"",($P(IVMSEG1,HLFS,9)']"") D  Q
 | 
|---|
| 37 |  ..S HLERR=$S($P(IVMSEG1,HLFS,7)']"":"Missing group number",1:"Missing group name") D ACK^IVMPREC
 | 
|---|
| 38 |  .I $P(IVMSEG1,HLFS,17)']"" D  Q
 | 
|---|
| 39 |  ..S HLERR="Missing insured's relation to patient" D ACK^IVMPREC
 | 
|---|
| 40 |  .I $P(IVMSEG1,HLFS,17)'="v",($P(IVMSEG1,HLFS,16)']"") D  Q
 | 
|---|
| 41 |  ..S HLERR="Missing name of insured" D ACK^IVMPREC
 | 
|---|
| 42 |  .S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)),IVMSEG=$G(^(+IVMDA,0)) I $E(IVMSEG,1,3)'="ZIV",$L(IVMSEG1)'=241 D  Q
 | 
|---|
| 43 |  ..S HLERR="Missing ZIV segment" D ACK^IVMPREC
 | 
|---|
| 44 |  .I $P(IVMSEG,HLFS,10)']"" D  Q
 | 
|---|
| 45 |  ..S HLERR="Missing IVM internal entry number" D ACK^IVMPREC
 | 
|---|
| 46 |  .I $L(IVMSEG1)=241 D  Q:$D(IVMERR)
 | 
|---|
| 47 |  ..K IVMERR
 | 
|---|
| 48 |  ..S IVMSEG3=IVMSEG
 | 
|---|
| 49 |  ..S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)),IVMSEG=$G(^(+IVMDA,0))
 | 
|---|
| 50 |  ..I $E(IVMSEG,1,3)'="ZIV" S HLERR="Missing ZIV segment",IVMERR="" D ACK^IVMPREC
 | 
|---|
| 51 |  .;S IVMSEG2=$P(IVMSEG,"^",10)
 | 
|---|
| 52 |  .;
 | 
|---|
| 53 |  .; - check for date of death from IVM
 | 
|---|
| 54 |  .I $P(IVMSEG,"^",13)]"" S $P(IVMSEG,"^",13)=$$FMDATE^HLFNC($P(IVMSEG,"^",13))
 | 
|---|
| 55 |  .;
 | 
|---|
| 56 |  .; - ivm ien/fm date of death
 | 
|---|
| 57 |  .S IVMSEG2=$S($P(IVMSEG,"^",13)']"":$P(IVMSEG,"^",10),1:$P(IVMSEG,"^",10)_"/"_$P(IVMSEG,"^",13))
 | 
|---|
| 58 |  .S IVMDOD=IVMSEG2
 | 
|---|
| 59 |  .;
 | 
|---|
| 60 |  .; - if no error encountered - store insurance fields in VistA
 | 
|---|
| 61 |  .I '$D(HLERR) D
 | 
|---|
| 62 |  ..N IVMRTN,IVMDA
 | 
|---|
| 63 |  ..D STORE
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 |  Q
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 | STORE ; - store IN1 segment fields in (#301.5) file and in buffer file
 | 
|---|
| 69 |  ;  (remove data from 301.5 'ASEG' xref on successful buffer file filing)
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 |  N IVMI,IVMJ,IVMIN1,IVMADD
 | 
|---|
| 72 |  S DA(1)=$O(^IVM(301.5,"B",DFN,0)),X=$$IEN^IVMUFNC4("IN1")
 | 
|---|
| 73 |  I DA(1)']"" S HLERR="patient missing from IVM PATIENT file" D ACK^IVMPREC Q
 | 
|---|
| 74 |  I X<0 S HLERR="IN1 segment not in HL7 SEGMENT NAME file" D ACK^IVMPREC Q
 | 
|---|
| 75 |  I $G(^IVM(301.5,DA(1),"IN",0))']"" S ^(0)="^301.501PA^^"
 | 
|---|
| 76 |  S DIC="^IVM(301.5,"_DA(1)_",""IN"",",DIC(0)="L"
 | 
|---|
| 77 |  S DIC("DR")=".03///NOW;.07////^S X=IVMSEG2;10////^S X=IVMSEG1",DLAYGO=301.501
 | 
|---|
| 78 |  S:$D(IVMSEG3) DIC("DR")=".03///NOW;.07////^S X=IVMSEG2;10////^S X=IVMSEG1;11////^S X=IVMSEG3"
 | 
|---|
| 79 |  K DD,DO D FILE^DICN K DIC,DLAYGO
 | 
|---|
| 80 |  Q:Y'>0
 | 
|---|
| 81 |  S IVMI=DA(1),IVMJ=+Y
 | 
|---|
| 82 |  ; Patch IVMB*2*111 automatically files the record into the buffer file
 | 
|---|
| 83 |  ; and removes the notification bulletin to IVM and the segment from
 | 
|---|
| 84 |  ; file 301.501
 | 
|---|
| 85 |  K DA,X,Y
 | 
|---|
| 86 |  S IVMIN1=$$GETIN1^IVMLINS1(IVMI,IVMJ),IVMADD=$P(IVMIN1,U,5)
 | 
|---|
| 87 |  D TRANSFER^IVMLINS3(1),IVMQ^IVMLINS1
 | 
|---|
| 88 |  Q
 | 
|---|
| 89 |  ;
 | 
|---|