| 1 | IVMPRECZ ;ALB/SEK,RTK - ROUTINE TO PROCESS V1.5 ORF-Z06 INCOMING HL7 MESSAGES ; 01/02/03 10:01am | 
|---|
| 2 | ;;2.0;INCOME VERIFICATION MATCH;**34,64,71**;21-OCT-94 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ; | 
|---|
| 6 | GET ; get HL7 segment from ^HL | 
|---|
| 7 | S IVMDA=$O(^HL(772,HLDA,"IN",+IVMDA)),IVMSEG=$G(^(+IVMDA,0)) | 
|---|
| 8 | S IVMSEG1=$E(IVMSEG,1,3) | 
|---|
| 9 | Q | 
|---|
| 10 | ; | 
|---|
| 11 | ACK ; - prepare acknowledgment (ACK) message | 
|---|
| 12 | S IVMCT=$G(IVMCT)+1 | 
|---|
| 13 | S HLSDT="IVMQ",^TMP("HLS",$J,HLSDT,IVMCT)=HLSDATA(1),IVMCT=IVMCT+1 | 
|---|
| 14 | S ^TMP("HLS",$J,HLSDT,IVMCT)="MSA"_HLFS_$S($D(HLERR):"AE",1:"AA")_HLFS_HLMID_$S($D(HLERR):HLFS_HLERR_" - SSN "_$S($G(DFN):$P($$PT^IVMUFNC4(DFN),"^",2),1:"NOT FOUND"),1:"") | 
|---|
| 15 | I $D(HLERR) S HLEVN=HLEVN+1,IVMERROR=1 | 
|---|
| 16 | Q | 
|---|
| 17 | ; | 
|---|
| 18 | NXTSEG(MSGIEN,CURLINE,SEG) ; | 
|---|
| 19 | ;Description: Returns the next segment | 
|---|
| 20 | ; | 
|---|
| 21 | ;Input: | 
|---|
| 22 | ;  MSGIEN - IEN in HL7 MESSAGE TEXT file | 
|---|
| 23 | ;  CURLINE - subscript of the current segment | 
|---|
| 24 | ; | 
|---|
| 25 | ;Output: | 
|---|
| 26 | ;  SEG - an array with the fields of the segment (pass by reference) | 
|---|
| 27 | ;  CURLINE - upone exiting, will be the subscript of the next segment | 
|---|
| 28 | ; | 
|---|
| 29 | S CURLINE=CURLINE+1 | 
|---|
| 30 | S SEGMENT=$G(^HL(772,MSGIEN,"IN",CURLINE,0)) | 
|---|
| 31 | S SEG("TYPE")=$E(SEGMENT,1,3) | 
|---|
| 32 | ; | 
|---|
| 33 | ; MSH & BHS segs first piece is the field separator, which makes breaking the segment into fields a bit different | 
|---|
| 34 | I (SEG("TYPE")="MSH")!(SEG("TYPE")="BHS") D | 
|---|
| 35 | . S SEG(1)=$E(SEGMENT,4) | 
|---|
| 36 | . F I=2:1:30 S SEG(I)=$P(SEGMENT,HLFS,I) | 
|---|
| 37 | E  D | 
|---|
| 38 | . F I=2:1:31 S SEG(I-1)=$P(SEGMENT,HLFS,I) | 
|---|
| 39 | Q | 
|---|
| 40 | ; | 
|---|
| 41 | ERRBULL ; build mail message for transmission to IVM mail group notifying site | 
|---|
| 42 | ; of upload error. | 
|---|
| 43 | S IVMPAT=$$PT^IVMUFNC4(DFN) | 
|---|
| 44 | S XMSUB="MT SIGNATURE UPLOAD "_$E($P(IVMPAT,"^"),1)_$P(IVMPAT,"^",3) | 
|---|
| 45 | S IVMTEXT(1)="Unable to upload a MT Signature.  A Means Test was not found that" | 
|---|
| 46 | S IVMTEXT(2)="matches the Centralized Anniversary Date (CAD) on file at the HEC." | 
|---|
| 47 | S IVMTEXT(3)=" " | 
|---|
| 48 | S IVMTEXT(4)="    NAME:     "_$P(IVMPAT,"^") | 
|---|
| 49 | S IVMTEXT(5)="    ID:       "_$P(IVMPAT,"^",2) | 
|---|
| 50 | S IVMTEXT(6)="    ERROR:    "_IVMTEXT(6) | 
|---|
| 51 | Q | 
|---|
| 52 | ORF ;entry point for Means Test Signature Z06 msgs. | 
|---|
| 53 | N SEG,EVENT,MSGID | 
|---|
| 54 | S:'$D(HLEVN) HLEVN=0 | 
|---|
| 55 | D NXTSEG(HLDA,0,.SEG) | 
|---|
| 56 | Q:(SEG("TYPE")'="MSH")  ;wouldn't have reached here if this happened! | 
|---|
| 57 | S EVENT=$P(SEG(9),$E(HLECH),2) | 
|---|
| 58 | I EVENT'="Z06" G ORF^IVMCM | 
|---|
| 59 | I $G(HLFS)="" S HLFS="^" | 
|---|
| 60 | I $G(HLECH)="" S HLECH="~" | 
|---|
| 61 | F IVMDA=0:0 S IVMDA=$O(^HL(772,HLDA,"IN",IVMDA)) Q:'IVMDA  S IVMSEG=$G(^(IVMDA,0)) I $E(IVMSEG,1,3)="MSH" D  Q:'IVMDA | 
|---|
| 62 | .K HLERR | 
|---|
| 63 | .S HLMID=$P(IVMSEG,HLFS,10) ; message control id from MSH | 
|---|
| 64 | .S IVMFLGC=0 | 
|---|
| 65 | .D GET I IVMSEG1'="PID" D  Q | 
|---|
| 66 | ..S HLERR="Missing PID segment" D ACK | 
|---|
| 67 | .S DFN=$P($P(IVMSEG,HLFS,4),$E(HLECH)) | 
|---|
| 68 | .I ('DFN!(DFN'=+DFN)!('$D(^DPT(+DFN,0)))) D  Q | 
|---|
| 69 | ..S HLERR="Invalid DFN" D ACK | 
|---|
| 70 | .I $P(IVMSEG,HLFS,20)'=$P(^DPT(DFN,0),"^",9) S HLERR="Couldn't match IVMSSN with DHCP SSN" D ACK Q | 
|---|
| 71 | .S IVMDAP=IVMDA ; save IVMDA for veteran PID segment | 
|---|
| 72 | .D GET I IVMSEG1'="ZMT" D  Q | 
|---|
| 73 | ..S HLERR="Missing ZMT segment" D ACK | 
|---|
| 74 | .; IVMMTDT - means test date | 
|---|
| 75 | .; DGLY - income year | 
|---|
| 76 | .; if Means Test not in DHCP don't upload IVM Means Test | 
|---|
| 77 | .S IVMMTDT=$$FMDATE^HLFNC($P(IVMSEG,HLFS,3)) ; means test date from ZMT  segment | 
|---|
| 78 | .S DGLY=$$LYR^DGMTSCU1(IVMMTDT) | 
|---|
| 79 | .; get means test to be updated | 
|---|
| 80 | .N UPMTS | 
|---|
| 81 | .S MTDATE=-IVMMTDT,IVMMTIEN="",(UPMTS,MTFND)=0 | 
|---|
| 82 | .F  S IVMMTIEN=$O(^DGMT(408.31,"AID",1,DFN,MTDATE,IVMMTIEN),-1) Q:MTFND!(IVMMTIEN="")  D | 
|---|
| 83 | ..; match site completing in case multiple tests for same date | 
|---|
| 84 | ..I $P(IVMSEG,HLFS,23)=$P(^DGMT(408.31,IVMMTIEN,2),HLFS,5) S UPMTS=IVMMTIEN,MTFND=1 Q | 
|---|
| 85 | .S (IVMMT31,DGMTP)=$G(^DGMT(408.31,UPMTS,0)) ; DGMTP is event driver  variable | 
|---|
| 86 | .I $P(IVMMT31,"^")'=IVMMTDT D  Q | 
|---|
| 87 | ..S Y=IVMMTDT X ^DD("DD") | 
|---|
| 88 | ..S IVMTEXT(6)="Means Test of "_Y_" not found in VistA." | 
|---|
| 89 | ..D ERRBULL,MAIL^IVMUFNC() | 
|---|
| 90 | ..S HLERR="Means test not in VistA" D ACK | 
|---|
| 91 | ..Q | 
|---|
| 92 | .I $P(IVMMT31,"^",23)=2 S Y=IVMMTDT X ^DD("DD") S HLERR="2nd means test  sent for "_Y D ACK Q | 
|---|
| 93 | .; do not upload IVM means test if primary means test status is | 
|---|
| 94 | .; 3-no longer required | 
|---|
| 95 | .; or if hardship case | 
|---|
| 96 | .S IVMSTAT=$P(IVMMT31,"^",3) | 
|---|
| 97 | .I IVMSTAT=3 S HLERR="NOT UPLOADED no longer required" D ACK Q | 
|---|
| 98 | .I $P(IVMMT31,"^",20)=1 S HLERR="NOT UPLOADED hardship case" D ACK Q | 
|---|
| 99 | .;get MT signature and date/time edited info, update means test | 
|---|
| 100 | .N DATA | 
|---|
| 101 | .S DATA(.29)=$P(IVMSEG,HLFS,28),DATA(2.02)=$$FMDATE^HLFNC($P(IVMSEG,HLFS,26)) I $D(DATA(.29)) D | 
|---|
| 102 | ..I $$UPD^DGENDBS(408.31,UPMTS,.DATA) | 
|---|
| 103 | .I '$D(HLERR) D ACK | 
|---|
| 104 | .; | 
|---|
| 105 | .; cleanup | 
|---|
| 106 | .K DGLY,DGMTP,IVMDAP,IVMDAS,IVMDAZ,IVMDGLY,IVMFLG7,IVMFLGC,IVMMT31,IVMMTDT,IVMMTIEN,IVMSEG,IVMSEG1,IVMSTAT,IVMTEXT,XMSUB,FMDATE,MTDATE | 
|---|
| 107 | .Q | 
|---|
| 108 | Q | 
|---|