IVMCM ;ALB/SEK,KCL,RTK,AEG,BRM,AEG,HM,KUM - PROCESS INCOME TEST (Z10) TRANSMISSIONS ;3/30/20 1:48pm
;;2.0;INCOME VERIFICATION MATCH;**12,17,28,41,44,53,34,49,59,55,63,77,74,123,115,183,190,162**;21-OCT-94;Build 44
;Per VHA Directive 2004-038, this routine should not be modified.
;
;Supported ICRs
; #3812 - $$FINDCUR^DGENA()
; #2056 - $$GET1^DIQ(}
; #2462 - Reference to file #27.11
;
ORF ; Handler for ORF type HL7 messages received from HEC
;
; Make sure POSTMASTER DUZ instead of DUZ of Person who
; started Incoming Logical Link.
S DUZ=.5
N CNT,IVMRTN,SEGCNT
S IVMRTN="IVMCMX" ;USE "IVMCMX" BECAUSE "IVMCM" ALREADY USED
K ^TMP($J,IVMRTN),DIC
S (DGMSGF,DGMTMSG)=1 ; HL7 rtn. Don't need DG interative messages.
S HLECH=HL("ECH"),HLQ=HL("Q"),HLMID=HL("MID")
K %,%H,%I D NOW^%DTC S HLDT=%
F SEGCNT=1:1 X HLNEXT Q:HLQUIT'>0 D
. S CNT=0
. S ^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE
. F S CNT=$O(HLNODE(CNT)) Q:'CNT D
. . S ^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE(CNT)
S HLDA=HLMTIEN
;
N SEG,EVENT,MSGID
S:'$D(HLEVN) HLEVN=0
D NXTSEG^DGENUPL(HLDA,0,.SEG)
Q:(SEG("TYPE")'="MSH") ;would not have reached here if this happened!
S EVENT=$P(SEG(9),$E(HLECH),2)
;
; INITIALIZE HL7 VARIABLES
S HLEID="VAMC "_$P($$SITE^VASITE,"^",3)_" ORF-"_EVENT_" SERVER"
S HLEID=$O(^ORD(101,"B",HLEID,0))
D INIT^HLFNC2(HLEID,.HL)
S HLEIDS=$O(^ORD(101,HLEID,775,"B",0))
;
; Handle means test signature ORF (Z06) event
I EVENT="Z06" D ORF^IVMPREC7
;
; Handle income test ORF (Z10) event
I EVENT="Z10" D Z10
;
; Handle enrollment/elig. ORF (Z11) event
I EVENT="Z11" D
.S MSGID=SEG(10)
.D ORFZ11^DGENUPL(HLDA,MSGID)
;
K ^TMP($J,IVMRTN)
Q
;
;
Z10 ; Entry point for receipt of ORF~Z10 transmission
; The Income Test (Z10) transmission has the following format:
;
; BHS ORF msgs do not include batch header or trailer.
; {MSH
; PID They will include the sequence: MSA
; ZIC QRD
; ZIR QRF
; {ZDP These segments will follow the MSH segment.
; ZIC
; ZIR
; }
; {NTE Updated for IVM*2.0*190
; }
; {ZMT
; }
; ZBT
; }
; BTS
;
S IVMORF=1 ; set ORF msg flag
S (HLEVN,IVMCT,IVMERROR,IVMCNTR)=0 ; init vars
;
ORU ; Entry point for receipt of ORU~Z10 trans (called by IVMPREC2)
S IVMTYPE=5,IVMZ10F=1
;
; - loop through the msg in (#772 file), and process (PROC) msgs
S IVMDA=0 F S IVMDA=$O(^TMP($J,IVMRTN,IVMDA)) Q:'IVMDA S IVMSEG=$G(^(IVMDA,0)) I $E(IVMSEG,1,3)="MSH" D PROC Q:'IVMDA
;
; - if ORF msg flag, update the Query Tran Log
I $G(IVMORF) D
.I $G(DFN),$D(IVMMCI) D
..N IVMCR
..S IVMCR=$P("1^2^3^7^5^6^4","^",IVMTYPE) ;map reason to test type
..D FIND^IVMCQ2(DFN,IVMMCI,HLDT,$S($D(HLERR):5,1:IVMCR),1)
;
; - if tests are uploaded, generate notification msg
I $D(^TMP($J,"IVMBULL")) D ^IVMCMB
;
ENQ ;
K IVMDA,IVMORF,IVMSEG,IVMFLGC,IVMTYPE,IVMMTIEN,IVMMTDT,IVMDGBT,IVMMCI
K ^TMP($J,"IVMCM"),^("IVMBULL"),DGMSGF,DGADDF,IVMCPAY,IVMBULL,DFN
K DGMTMSG,IVMZ10F
Q
;
PROC ; Process each HL7 message from (#772) file
;
N IVMFUTR,TMSTAMP,SOURCE,NODE,HSDATE,IVMZ10,DGMTP,DGMTACT,DGMTI,DGMTA,SRCTST,IVMREGO ;IVM*2.0*190
S DGMTACT="ADD"
D PRIOR^DGMTEVT
S IVMZ10="UPLOAD IN PROGRESS"
S IVMFUTR=0 ;this flag will indicate whether or not a test with a future date is being uploaded
S IVMMTIEN=0
;
S MSGID=$P(IVMSEG,HLFS,10) ; msg control id for ACK's
; - check if DCD messaging is enabled
I '$$DCDON^IVMUPAR1() D PROB^IVMCMC("Facility has DCD messaging disabled") Q
;
; - check HL7 msg structure for errors
K HLERR,^TMP($J,"IVMCM")
D ^IVMCMC I $D(HLERR) K:HLERR="" HLERR Q
;
; Determine type of test/transmission
S IVMTYPE=0
;
; - was a means test sent?
I $P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,2) S IVMTYPE=1 ; MT trans
;
; - if MT and CT transmitted, error - pt can't have both unless
; one is a deletion, but HEC not currently handling that situation
I IVMTYPE,$P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,2) D PROB^IVMCMC("Patient can not have both a Means Test and Copay Test") Q
I $P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,2) S IVMTYPE=2 ; CT trans
;
; IVM*2.0*162 - BEGIN
S IVMREGO=""
I (IVMTYPE=1)!(IVMTYPE=2) D
.;Find patient's current enrollment record
.N IVMENIEN,IVMENRC
.S IVMENIEN=""
.S IVMENRC=""
.; $$FINDCUR^DGENA(DFN) is supported by ICR #3812
.S IVMENIEN=$$FINDCUR^DGENA(DFN)
.I IVMENIEN S IVMENRC=$$GET1^DIQ(27.11,IVMENIEN_",",.04,"I")
.I $G(IVMENRC)=25 S IVMREGO="Y"
I IVMREGO="Y" D PROB^IVMCMC("Enrollment Status is Registration Only - not subject to Means Test or RX Copay Test") Q
; IVM*2.0*162 - END
; - if no MT or CT or LTC then Income Screening
I 'IVMTYPE,'$P($G(^TMP($J,"IVMCM","ZMT4")),HLFS,2) S IVMTYPE=3 ; IS trans
;
;send an eligibility query if no eligibility code
I '$$ELIG^IVMCUF1(DFN),'$$PENDING^DGENQRY(DFN) I $$SEND^DGENQRY1(DFN)
;
; obtain locks used to sychronize upload with local income test options
D GETLOCKS^IVMCUPL(DFN)
;
;
MT ; If transmission is a Means Test
N NODE0,RET,CODE,DATA,MTSIG,MTSIGDT,CATCA ;IVM*2.0*183 HM
S HLQ=$G(HL("Q"))
S:HLQ="" HLQ=""""""
I IVMTYPE=1 D I $D(HLERR) G PROCQ
.S IVMMTDT=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,2))
.S TMSTAMP=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,25))
.S HSDATE=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,24))
.S SOURCE=$P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,22)
.S SRCTST=$P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,18) ;IVM*2.0*190
.S MTSIG=$P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,27)
.S MTSIGDT=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,15))
.S IVMLAST=$$LST^DGMTU(DFN,$E(IVMMTDT,1,3)_1231,1)
.; Check that test is for same year
.I $P(IVMLAST,U,2),$E($P(IVMLAST,U,2),1,3)'=$E(IVMMTDT,1,3) S IVMLAST=""
.Q:$$UPDMTSIG^IVMCMF(+IVMLAST,TMSTAMP,MTSIG,MTSIGDT)
.I $$Z06MT^EASPTRN1(+IVMLAST) D PROB^IVMCMC("IVM Means Test already on file for this year") Q
.I '$$ELIG^IVMUFNC5(DFN) D PROB^IVMCMC("Means Test upload not appropriate for current patient") Q
.I $$AGE^IVMUFNC5(DT)>$$INCY^IVMUFNC5(IVMMTDT) D I $D(HLERR) Q ;IVM*2.0*183 HM
..N CATCZMT S CATCZMT=$G(^TMP($J,"IVMCM","ZMT1"))
..S CATC=$$CATC^IVMUFNC5(CATCZMT)
..I '+$G(CATC) D PROB^IVMCMC("Only Means Tests in current/previous income years are valid (not effective)") K CATC Q ;IVM*2.0*183 HM
..;IVM*2.0*183 HM Check if MT Copay Exempt or GMT Copay Required
..S CATCA=$$ACCMT^IVMUFNC5(CATCZMT) ;IVM*2.0*183 HM
..I '+$G(CATCA) D PROB^IVMCMC("Only Means Tests greater than or equal to one year prior to the VFA Start Date of 1/1/2013 are valid for MT COPAY EXEMPT or GMT COPAY REQUIRED") K CATCA Q ;IVM*2.0*183 HM
.;
.; - perform edit checks and file MT
.D CHKDT
.;deletion indicator sent?
.I $P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,3)=HLQ D Q
..D
...;if there is a future test for that income year, delete that
...N IEN,DATA,IVMPAT
...S IEN=$$FUTURE(DFN,($E(IVMMTDT,1,3)-1),1,.IVMPAT)
...I IEN S DATA(.06)="" I $$UPD^DGENDBS(301.5,IVMPAT,.DATA)
...I IEN,$D(^DGMT(408.31,IEN,0)) D
....S IVMMTIEN=IEN
....S IVMFUTR=1
...E D
....S IVMFUTR=0
..Q:('IVMMTIEN)
..S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
..I $$EN^IVMCMD(IVMMTIEN) D
...S RET=$$LST^DGMTU(DFN,DT,IVMTYPE)
...S CODE=$S(($E($P(RET,"^",2),1,3)=$E(DT,1,3)):$P(RET,"^",4),1:"")
...D ADD^IVMCMB(DFN,IVMTYPE,$S(IVMFUTR:"DELETE FUTR TEST",1:"DELETE PRMRY TEST"),+$G(NODE0),$$GETCODE^DGMTH($P(NODE0,"^",3)),CODE)
.;
.;check timestamp - if matches current primary test and hardship matches, then this is a duplicate and does not need to be uploaded
.I TMSTAMP D
..S NODE=""
..I IVMFUTR N IVMMTIEN S IVMMTIEN=$$FUTURE(DFN,($E(IVMMTDT,1,3)-1),1)
..Q:'IVMMTIEN
..S NODE=$G(^DGMT(408.31,IVMMTIEN,2))
.S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
.I TMSTAMP,TMSTAMP=$P(NODE,"^",2),IVMMTDT=$P(NODE0,"^"),SOURCE=$P(NODE,"^",5),(HSDATE=$P(NODE,"^")) Q
.;
.D DELTYPE^IVMCMD(DFN,IVMMTDT,2)
.D EN^IVMCM1
;
;
CT ; If transmission is a Copay Test
N NODE0,RET,CODE,DATA
I IVMTYPE=2 D I $D(HLERR) G PROCQ
.S IVMMTDT=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,2))
.S TMSTAMP=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,25))
.S SOURCE=$P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,22)
.S SRCTST=$P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,18) ;IVM*2.0*190
.S IVMLAST=$$LST^DGMTU(DFN,$E(IVMMTDT,1,3)_1231,2)
.S IVMCPAY=$$RXST^IBARXEU(DFN)
.I $$AGE^IVMUFNC5(DT)>$$INCY^IVMUFNC5(IVMMTDT) D PROB^IVMCMC("Only Copay Tests in the current/previous income years are valid. (Not effective)") Q
.; - perform edit checks and file CT
.D CHKDT
.;deletion indicator sent?
.I $P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,3)=HLQ D Q
..D
...;if there is a future test for that income year, delete that
...N IEN,DATA,IVMPAT
...S IEN=$$FUTURE(DFN,($E(IVMMTDT,1,3)-1),2,.IVMPAT)
...I IEN S DATA(.07)="" I $$UPD^DGENDBS(301.5,IVMPAT,.DATA)
...I IEN,$D(^DGMT(408.31,IEN,0)) D
....S IVMMTIEN=IEN
....S IVMFUTR=1
...E D
....S IVMFUTR=0
..Q:('IVMMTIEN)
..S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
..I $$EN^IVMCMD(IVMMTIEN) D
...S RET=$$LST^DGMTU(DFN,DT,IVMTYPE)
...S CODE=$S(($E($P(RET,"^",2),1,3)=$E(DT,1,3)):$P(RET,"^",4),1:"")
...D ADD^IVMCMB(DFN,IVMTYPE,$S(IVMFUTR:"DELETE FUTR TEST",1:"DELETE PRMRY TEST"),+$G(NODE0),$$GETCODE^DGMTH($P(NODE0,"^",3)),CODE)
.;
.;check timestamp - if matches current primary test, then this is a duplicate and does not need to be uploaded
.I TMSTAMP D
..S NODE=""
..I IVMFUTR N IVMMTIEN S IVMMTIEN=$$FUTURE(DFN,($E(IVMMTDT,1,3)-1),2)
..Q:'IVMMTIEN
..S NODE=$G(^DGMT(408.31,IVMMTIEN,2))
.S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
.I TMSTAMP,TMSTAMP=$P(NODE,"^",2),IVMMTDT=$P(NODE0,"^"),SOURCE=$P(NODE,"^",5) Q
.;
.D DELTYPE^IVMCMD(DFN,IVMMTDT,1)
.D EN^IVMCM1
;
IS ; - If transmission is income screening info only then do not process
; - outside of the scope of MTS
;I IVMTYPE=3 S IVMMTDT=0 D EN^IVMCM1 I $D(HLERR) G PROCQ
I IVMTYPE=3 S IVMMTDT=0
;
LTC ; If transmission contains a Long Term Care Test (TYPE 4 TEST)
I $P($G(^TMP($J,"IVMCM","ZMT4")),HLFS,2) D LTC^IVMCM1
;
PROCQ ;
; release locks used to sychronize upload with local income test options
D RELLOCKS^IVMCUPL(DFN)
Q
;
CHKDT ; check date of income test being uploaded
; Is it a future date? If so, set IVMFUTR=1
;
; IVMMTIEN is the IEN of current primary test for the year
;
I $E($P(IVMLAST,"^",2),1,3)=$E(IVMMTDT,1,3) S IVMMTIEN=+IVMLAST
I IVMMTDT>DT S IVMFUTR=1
Q
FUTURE(DFN,YEAR,TYPE,IVMPAT) ;
;Returns the ien of the future test, if there is one
;Inputs: DFN
; YEAR - income year
; TYPE - type of test
;Output:
; function value - ien of future means test, if there is one, "" otherwise
; IVMPAT - Pointer to the IVM Patient file for the income year if there is an entry (pass by reference)
;
N RET
S RET=""
S IVMPAT=$$FIND^IVMPLOG(DFN,YEAR)
I IVMPAT S RET=$P($G(^IVM(301.5,IVMPAT,0)),"^",$S(TYPE=1:6,1:7))
Q RET
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIVMCM 11211 printed Oct 16, 2024@18:01:55 Page 2
IVMCM ;ALB/SEK,KCL,RTK,AEG,BRM,AEG,HM,KUM - PROCESS INCOME TEST (Z10) TRANSMISSIONS ;3/30/20 1:48pm
+1 ;;2.0;INCOME VERIFICATION MATCH;**12,17,28,41,44,53,34,49,59,55,63,77,74,123,115,183,190,162**;21-OCT-94;Build 44
+2 ;Per VHA Directive 2004-038, this routine should not be modified.
+3 ;
+4 ;Supported ICRs
+5 ; #3812 - $$FINDCUR^DGENA()
+6 ; #2056 - $$GET1^DIQ(}
+7 ; #2462 - Reference to file #27.11
+8 ;
ORF ; Handler for ORF type HL7 messages received from HEC
+1 ;
+2 ; Make sure POSTMASTER DUZ instead of DUZ of Person who
+3 ; started Incoming Logical Link.
+4 SET DUZ=.5
+5 NEW CNT,IVMRTN,SEGCNT
+6 ;USE "IVMCMX" BECAUSE "IVMCM" ALREADY USED
SET IVMRTN="IVMCMX"
+7 KILL ^TMP($JOB,IVMRTN),DIC
+8 ; HL7 rtn. Don't need DG interative messages.
SET (DGMSGF,DGMTMSG)=1
+9 SET HLECH=HL("ECH")
SET HLQ=HL("Q")
SET HLMID=HL("MID")
+10 KILL %,%H,%I
DO NOW^%DTC
SET HLDT=%
+11 FOR SEGCNT=1:1
XECUTE HLNEXT
if HLQUIT'>0
QUIT
Begin DoDot:1
+12 SET CNT=0
+13 SET ^TMP($JOB,IVMRTN,SEGCNT,CNT)=HLNODE
+14 FOR
SET CNT=$ORDER(HLNODE(CNT))
if 'CNT
QUIT
Begin DoDot:2
+15 SET ^TMP($JOB,IVMRTN,SEGCNT,CNT)=HLNODE(CNT)
End DoDot:2
End DoDot:1
+16 SET HLDA=HLMTIEN
+17 ;
+18 NEW SEG,EVENT,MSGID
+19 if '$DATA(HLEVN)
SET HLEVN=0
+20 DO NXTSEG^DGENUPL(HLDA,0,.SEG)
+21 ;would not have reached here if this happened!
if (SEG("TYPE")'="MSH")
QUIT
+22 SET EVENT=$PIECE(SEG(9),$EXTRACT(HLECH),2)
+23 ;
+24 ; INITIALIZE HL7 VARIABLES
+25 SET HLEID="VAMC "_$PIECE($$SITE^VASITE,"^",3)_" ORF-"_EVENT_" SERVER"
+26 SET HLEID=$ORDER(^ORD(101,"B",HLEID,0))
+27 DO INIT^HLFNC2(HLEID,.HL)
+28 SET HLEIDS=$ORDER(^ORD(101,HLEID,775,"B",0))
+29 ;
+30 ; Handle means test signature ORF (Z06) event
+31 IF EVENT="Z06"
DO ORF^IVMPREC7
+32 ;
+33 ; Handle income test ORF (Z10) event
+34 IF EVENT="Z10"
DO Z10
+35 ;
+36 ; Handle enrollment/elig. ORF (Z11) event
+37 IF EVENT="Z11"
Begin DoDot:1
+38 SET MSGID=SEG(10)
+39 DO ORFZ11^DGENUPL(HLDA,MSGID)
End DoDot:1
+40 ;
+41 KILL ^TMP($JOB,IVMRTN)
+42 QUIT
+43 ;
+44 ;
Z10 ; Entry point for receipt of ORF~Z10 transmission
+1 ; The Income Test (Z10) transmission has the following format:
+2 ;
+3 ; BHS ORF msgs do not include batch header or trailer.
+4 ; {MSH
+5 ; PID They will include the sequence: MSA
+6 ; ZIC QRD
+7 ; ZIR QRF
+8 ; {ZDP These segments will follow the MSH segment.
+9 ; ZIC
+10 ; ZIR
+11 ; }
+12 ; {NTE Updated for IVM*2.0*190
+13 ; }
+14 ; {ZMT
+15 ; }
+16 ; ZBT
+17 ; }
+18 ; BTS
+19 ;
+20 ; set ORF msg flag
SET IVMORF=1
+21 ; init vars
SET (HLEVN,IVMCT,IVMERROR,IVMCNTR)=0
+22 ;
ORU ; Entry point for receipt of ORU~Z10 trans (called by IVMPREC2)
+1 SET IVMTYPE=5
SET IVMZ10F=1
+2 ;
+3 ; - loop through the msg in (#772 file), and process (PROC) msgs
+4 SET IVMDA=0
FOR
SET IVMDA=$ORDER(^TMP($JOB,IVMRTN,IVMDA))
if 'IVMDA
QUIT
SET IVMSEG=$GET(^(IVMDA,0))
IF $EXTRACT(IVMSEG,1,3)="MSH"
DO PROC
if 'IVMDA
QUIT
+5 ;
+6 ; - if ORF msg flag, update the Query Tran Log
+7 IF $GET(IVMORF)
Begin DoDot:1
+8 IF $GET(DFN)
IF $DATA(IVMMCI)
Begin DoDot:2
+9 NEW IVMCR
+10 ;map reason to test type
SET IVMCR=$PIECE("1^2^3^7^5^6^4","^",IVMTYPE)
+11 DO FIND^IVMCQ2(DFN,IVMMCI,HLDT,$SELECT($DATA(HLERR):5,1:IVMCR),1)
End DoDot:2
End DoDot:1
+12 ;
+13 ; - if tests are uploaded, generate notification msg
+14 IF $DATA(^TMP($JOB,"IVMBULL"))
DO ^IVMCMB
+15 ;
ENQ ;
+1 KILL IVMDA,IVMORF,IVMSEG,IVMFLGC,IVMTYPE,IVMMTIEN,IVMMTDT,IVMDGBT,IVMMCI
+2 KILL ^TMP($JOB,"IVMCM"),^("IVMBULL"),DGMSGF,DGADDF,IVMCPAY,IVMBULL,DFN
+3 KILL DGMTMSG,IVMZ10F
+4 QUIT
+5 ;
PROC ; Process each HL7 message from (#772) file
+1 ;
+2 ;IVM*2.0*190
NEW IVMFUTR,TMSTAMP,SOURCE,NODE,HSDATE,IVMZ10,DGMTP,DGMTACT,DGMTI,DGMTA,SRCTST,IVMREGO
+3 SET DGMTACT="ADD"
+4 DO PRIOR^DGMTEVT
+5 SET IVMZ10="UPLOAD IN PROGRESS"
+6 ;this flag will indicate whether or not a test with a future date is being uploaded
SET IVMFUTR=0
+7 SET IVMMTIEN=0
+8 ;
+9 ; msg control id for ACK's
SET MSGID=$PIECE(IVMSEG,HLFS,10)
+10 ; - check if DCD messaging is enabled
+11 IF '$$DCDON^IVMUPAR1()
DO PROB^IVMCMC("Facility has DCD messaging disabled")
QUIT
+12 ;
+13 ; - check HL7 msg structure for errors
+14 KILL HLERR,^TMP($JOB,"IVMCM")
+15 DO ^IVMCMC
IF $DATA(HLERR)
if HLERR=""
KILL HLERR
QUIT
+16 ;
+17 ; Determine type of test/transmission
+18 SET IVMTYPE=0
+19 ;
+20 ; - was a means test sent?
+21 ; MT trans
IF $PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,2)
SET IVMTYPE=1
+22 ;
+23 ; - if MT and CT transmitted, error - pt can't have both unless
+24 ; one is a deletion, but HEC not currently handling that situation
+25 IF IVMTYPE
IF $PIECE($GET(^TMP($JOB,"IVMCM","ZMT2")),HLFS,2)
DO PROB^IVMCMC("Patient can not have both a Means Test and Copay Test")
QUIT
+26 ; CT trans
IF $PIECE($GET(^TMP($JOB,"IVMCM","ZMT2")),HLFS,2)
SET IVMTYPE=2
+27 ;
+28 ; IVM*2.0*162 - BEGIN
+29 SET IVMREGO=""
+30 IF (IVMTYPE=1)!(IVMTYPE=2)
Begin DoDot:1
+31 ;Find patient's current enrollment record
+32 NEW IVMENIEN,IVMENRC
+33 SET IVMENIEN=""
+34 SET IVMENRC=""
+35 ; $$FINDCUR^DGENA(DFN) is supported by ICR #3812
+36 SET IVMENIEN=$$FINDCUR^DGENA(DFN)
+37 IF IVMENIEN
SET IVMENRC=$$GET1^DIQ(27.11,IVMENIEN_",",.04,"I")
+38 IF $GET(IVMENRC)=25
SET IVMREGO="Y"
End DoDot:1
+39 IF IVMREGO="Y"
DO PROB^IVMCMC("Enrollment Status is Registration Only - not subject to Means Test or RX Copay Test")
QUIT
+40 ; IVM*2.0*162 - END
+41 ; - if no MT or CT or LTC then Income Screening
+42 ; IS trans
IF 'IVMTYPE
IF '$PIECE($GET(^TMP($JOB,"IVMCM","ZMT4")),HLFS,2)
SET IVMTYPE=3
+43 ;
+44 ;send an eligibility query if no eligibility code
+45 IF '$$ELIG^IVMCUF1(DFN)
IF '$$PENDING^DGENQRY(DFN)
IF $$SEND^DGENQRY1(DFN)
+46 ;
+47 ; obtain locks used to sychronize upload with local income test options
+48 DO GETLOCKS^IVMCUPL(DFN)
+49 ;
+50 ;
MT ; If transmission is a Means Test
+1 ;IVM*2.0*183 HM
NEW NODE0,RET,CODE,DATA,MTSIG,MTSIGDT,CATCA
+2 SET HLQ=$GET(HL("Q"))
+3 if HLQ=""
SET HLQ=""""""
+4 IF IVMTYPE=1
Begin DoDot:1
+5 SET IVMMTDT=$$FMDATE^HLFNC($PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,2))
+6 SET TMSTAMP=$$FMDATE^HLFNC($PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,25))
+7 SET HSDATE=$$FMDATE^HLFNC($PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,24))
+8 SET SOURCE=$PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,22)
+9 ;IVM*2.0*190
SET SRCTST=$PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,18)
+10 SET MTSIG=$PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,27)
+11 SET MTSIGDT=$$FMDATE^HLFNC($PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,15))
+12 SET IVMLAST=$$LST^DGMTU(DFN,$EXTRACT(IVMMTDT,1,3)_1231,1)
+13 ; Check that test is for same year
+14 IF $PIECE(IVMLAST,U,2)
IF $EXTRACT($PIECE(IVMLAST,U,2),1,3)'=$EXTRACT(IVMMTDT,1,3)
SET IVMLAST=""
+15 if $$UPDMTSIG^IVMCMF(+IVMLAST,TMSTAMP,MTSIG,MTSIGDT)
QUIT
+16 IF $$Z06MT^EASPTRN1(+IVMLAST)
DO PROB^IVMCMC("IVM Means Test already on file for this year")
QUIT
+17 IF '$$ELIG^IVMUFNC5(DFN)
DO PROB^IVMCMC("Means Test upload not appropriate for current patient")
QUIT
+18 ;IVM*2.0*183 HM
IF $$AGE^IVMUFNC5(DT)>$$INCY^IVMUFNC5(IVMMTDT)
Begin DoDot:2
+19 NEW CATCZMT
SET CATCZMT=$GET(^TMP($JOB,"IVMCM","ZMT1"))
+20 SET CATC=$$CATC^IVMUFNC5(CATCZMT)
+21 ;IVM*2.0*183 HM
IF '+$GET(CATC)
DO PROB^IVMCMC("Only Means Tests in current/previous income years are valid (not effective)")
KILL CATC
QUIT
+22 ;IVM*2.0*183 HM Check if MT Copay Exempt or GMT Copay Required
+23 ;IVM*2.0*183 HM
SET CATCA=$$ACCMT^IVMUFNC5(CATCZMT)
+24 ;IVM*2.0*183 HM
IF '+$GET(CATCA)
DO PROB^IVMCMC("Only Means Tests greater than or equal to one year prior to the VFA Start Date of 1/1/2013 are valid for MT COPAY EXEMPT or GMT COPAY REQUIRED")
KILL CATCA
QUIT
End DoDot:2
IF $DATA(HLERR)
QUIT
+25 ;
+26 ; - perform edit checks and file MT
+27 DO CHKDT
+28 ;deletion indicator sent?
+29 IF $PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,3)=HLQ
Begin DoDot:2
+30 Begin DoDot:3
+31 ;if there is a future test for that income year, delete that
+32 NEW IEN,DATA,IVMPAT
+33 SET IEN=$$FUTURE(DFN,($EXTRACT(IVMMTDT,1,3)-1),1,.IVMPAT)
+34 IF IEN
SET DATA(.06)=""
IF $$UPD^DGENDBS(301.5,IVMPAT,.DATA)
+35 IF IEN
IF $DATA(^DGMT(408.31,IEN,0))
Begin DoDot:4
+36 SET IVMMTIEN=IEN
+37 SET IVMFUTR=1
End DoDot:4
+38 IF '$TEST
Begin DoDot:4
+39 SET IVMFUTR=0
End DoDot:4
End DoDot:3
+40 if ('IVMMTIEN)
QUIT
+41 SET NODE0=$GET(^DGMT(408.31,IVMMTIEN,0))
+42 IF $$EN^IVMCMD(IVMMTIEN)
Begin DoDot:3
+43 SET RET=$$LST^DGMTU(DFN,DT,IVMTYPE)
+44 SET CODE=$SELECT(($EXTRACT($PIECE(RET,"^",2),1,3)=$EXTRACT(DT,1,3)):$PIECE(RET,"^",4),1:"")
+45 DO ADD^IVMCMB(DFN,IVMTYPE,$SELECT(IVMFUTR:"DELETE FUTR TEST",1:"DELETE PRMRY TEST"),+$GET(NODE0),$$GETCODE^DGMTH($PIECE(NODE0,"^",3)),CODE)
End DoDot:3
End DoDot:2
QUIT
+46 ;
+47 ;check timestamp - if matches current primary test and hardship matches, then this is a duplicate and does not need to be uploaded
+48 IF TMSTAMP
Begin DoDot:2
+49 SET NODE=""
+50 IF IVMFUTR
NEW IVMMTIEN
SET IVMMTIEN=$$FUTURE(DFN,($EXTRACT(IVMMTDT,1,3)-1),1)
+51 if 'IVMMTIEN
QUIT
+52 SET NODE=$GET(^DGMT(408.31,IVMMTIEN,2))
End DoDot:2
+53 SET NODE0=$GET(^DGMT(408.31,IVMMTIEN,0))
+54 IF TMSTAMP
IF TMSTAMP=$PIECE(NODE,"^",2)
IF IVMMTDT=$PIECE(NODE0,"^")
IF SOURCE=$PIECE(NODE,"^",5)
IF (HSDATE=$PIECE(NODE,"^"))
QUIT
+55 ;
+56 DO DELTYPE^IVMCMD(DFN,IVMMTDT,2)
+57 DO EN^IVMCM1
End DoDot:1
IF $DATA(HLERR)
GOTO PROCQ
+58 ;
+59 ;
CT ; If transmission is a Copay Test
+1 NEW NODE0,RET,CODE,DATA
+2 IF IVMTYPE=2
Begin DoDot:1
+3 SET IVMMTDT=$$FMDATE^HLFNC($PIECE($GET(^TMP($JOB,"IVMCM","ZMT2")),HLFS,2))
+4 SET TMSTAMP=$$FMDATE^HLFNC($PIECE($GET(^TMP($JOB,"IVMCM","ZMT2")),HLFS,25))
+5 SET SOURCE=$PIECE($GET(^TMP($JOB,"IVMCM","ZMT2")),HLFS,22)
+6 ;IVM*2.0*190
SET SRCTST=$PIECE($GET(^TMP($JOB,"IVMCM","ZMT2")),HLFS,18)
+7 SET IVMLAST=$$LST^DGMTU(DFN,$EXTRACT(IVMMTDT,1,3)_1231,2)
+8 SET IVMCPAY=$$RXST^IBARXEU(DFN)
+9 IF $$AGE^IVMUFNC5(DT)>$$INCY^IVMUFNC5(IVMMTDT)
DO PROB^IVMCMC("Only Copay Tests in the current/previous income years are valid. (Not effective)")
QUIT
+10 ; - perform edit checks and file CT
+11 DO CHKDT
+12 ;deletion indicator sent?
+13 IF $PIECE($GET(^TMP($JOB,"IVMCM","ZMT2")),HLFS,3)=HLQ
Begin DoDot:2
+14 Begin DoDot:3
+15 ;if there is a future test for that income year, delete that
+16 NEW IEN,DATA,IVMPAT
+17 SET IEN=$$FUTURE(DFN,($EXTRACT(IVMMTDT,1,3)-1),2,.IVMPAT)
+18 IF IEN
SET DATA(.07)=""
IF $$UPD^DGENDBS(301.5,IVMPAT,.DATA)
+19 IF IEN
IF $DATA(^DGMT(408.31,IEN,0))
Begin DoDot:4
+20 SET IVMMTIEN=IEN
+21 SET IVMFUTR=1
End DoDot:4
+22 IF '$TEST
Begin DoDot:4
+23 SET IVMFUTR=0
End DoDot:4
End DoDot:3
+24 if ('IVMMTIEN)
QUIT
+25 SET NODE0=$GET(^DGMT(408.31,IVMMTIEN,0))
+26 IF $$EN^IVMCMD(IVMMTIEN)
Begin DoDot:3
+27 SET RET=$$LST^DGMTU(DFN,DT,IVMTYPE)
+28 SET CODE=$SELECT(($EXTRACT($PIECE(RET,"^",2),1,3)=$EXTRACT(DT,1,3)):$PIECE(RET,"^",4),1:"")
+29 DO ADD^IVMCMB(DFN,IVMTYPE,$SELECT(IVMFUTR:"DELETE FUTR TEST",1:"DELETE PRMRY TEST"),+$GET(NODE0),$$GETCODE^DGMTH($PIECE(NODE0,"^",3)),CODE)
End DoDot:3
End DoDot:2
QUIT
+30 ;
+31 ;check timestamp - if matches current primary test, then this is a duplicate and does not need to be uploaded
+32 IF TMSTAMP
Begin DoDot:2
+33 SET NODE=""
+34 IF IVMFUTR
NEW IVMMTIEN
SET IVMMTIEN=$$FUTURE(DFN,($EXTRACT(IVMMTDT,1,3)-1),2)
+35 if 'IVMMTIEN
QUIT
+36 SET NODE=$GET(^DGMT(408.31,IVMMTIEN,2))
End DoDot:2
+37 SET NODE0=$GET(^DGMT(408.31,IVMMTIEN,0))
+38 IF TMSTAMP
IF TMSTAMP=$PIECE(NODE,"^",2)
IF IVMMTDT=$PIECE(NODE0,"^")
IF SOURCE=$PIECE(NODE,"^",5)
QUIT
+39 ;
+40 DO DELTYPE^IVMCMD(DFN,IVMMTDT,1)
+41 DO EN^IVMCM1
End DoDot:1
IF $DATA(HLERR)
GOTO PROCQ
+42 ;
IS ; - If transmission is income screening info only then do not process
+1 ; - outside of the scope of MTS
+2 ;I IVMTYPE=3 S IVMMTDT=0 D EN^IVMCM1 I $D(HLERR) G PROCQ
+3 IF IVMTYPE=3
SET IVMMTDT=0
+4 ;
LTC ; If transmission contains a Long Term Care Test (TYPE 4 TEST)
+1 IF $PIECE($GET(^TMP($JOB,"IVMCM","ZMT4")),HLFS,2)
DO LTC^IVMCM1
+2 ;
PROCQ ;
+1 ; release locks used to sychronize upload with local income test options
+2 DO RELLOCKS^IVMCUPL(DFN)
+3 QUIT
+4 ;
CHKDT ; check date of income test being uploaded
+1 ; Is it a future date? If so, set IVMFUTR=1
+2 ;
+3 ; IVMMTIEN is the IEN of current primary test for the year
+4 ;
+5 IF $EXTRACT($PIECE(IVMLAST,"^",2),1,3)=$EXTRACT(IVMMTDT,1,3)
SET IVMMTIEN=+IVMLAST
+6 IF IVMMTDT>DT
SET IVMFUTR=1
+7 QUIT
FUTURE(DFN,YEAR,TYPE,IVMPAT) ;
+1 ;Returns the ien of the future test, if there is one
+2 ;Inputs: DFN
+3 ; YEAR - income year
+4 ; TYPE - type of test
+5 ;Output:
+6 ; function value - ien of future means test, if there is one, "" otherwise
+7 ; IVMPAT - Pointer to the IVM Patient file for the income year if there is an entry (pass by reference)
+8 ;
+9 NEW RET
+10 SET RET=""
+11 SET IVMPAT=$$FIND^IVMPLOG(DFN,YEAR)
+12 IF IVMPAT
SET RET=$PIECE($GET(^IVM(301.5,IVMPAT,0)),"^",$SELECT(TYPE=1:6,1:7))
+13 QUIT RET