IVMCM6 ;ALB/SEK,JAN,RTK,CKN,TDM,GN,HM - COMPLETE DCD INCOME TEST ;4/10/20 11:41am
 ;;2.0;INCOME VERIFICATION MATCH;**17,25,39,44,50,53,49,58,62,67,84,115,136,190,193**;21-OCT-94;Build 37
 ;;Per VHA Directive 10-93-142, this routine should not be modified.
 ;
 ;IVM*2*84 - insure DGMTP is defined by LTC test prior to calling
 ;           audit
 ;
EN ; This routine will update annual means test file (#408.31):
 ;      
 ; Note: There is no entry in 408.31 for income screening.
 ;
 ;
 ;Input:
 ;  DGMTI - ien of new Annual Means Test which requires completion
 ;  IVMMTIEN - ien of replaced test (may not exist)
 ;
 ; - open case record in (#301.5) file
 N DGREF,DATA,CODE,FIELD,RET,NODE0,NODE2,OK2SND
 D CHKTST,OPEN
 ;
 ; - if income screening goto MTBULL
 I IVMTYPE=3 G MTBULL
 ;
 ; - setup variables for (#408.31) file
 ;get the ZMT segment, translate HLQ's to NULLS
 S IVMSEG=$G(^TMP($J,"IVMCM","ZMT"_IVMTYPE)) ; get mt/copay ZMT segment
 F FIELD=4:1:32 I FIELD'=24,$P(IVMSEG,HLFS,FIELD)=HLQ S $P(IVMSEG,HLFS,FIELD)="" ;IVM*2.0*193
 ;
 S IVM1=$$FMDATE^HLFNC($P(IVMSEG,"^",10)) ; dt/time completed
 S IVM2=$P(IVMSEG,"^",7) ; agree to pay deductible
 S IVM3=$$FMDATE^HLFNC($P(IVMSEG,"^",15)) ; dt vet signed test
 S IVM4=$P(IVMSEG,"^",16) ; declines to give income info field
 S:IVM4 DGREF=""
 S IVM5=$$FMDATE^HLFNC($P(IVMSEG,"^",6)) ; dt/time of adjudication
 S IVM6=$P(IVMSEG,"^",3) ;status
 S IVM7=$P(IVMSEG,"^",13) ; hardship
 S:$G(IVMHADJ) IVMCAT=$P(IVMSEG,"^",3) ; test status 
 S IVM8=$P(IVMSEG,"^",22) ; site conducting test
 S IVM9=$P(IVMSEG,"^",23) ; site granting hardship
 S IVM10=$P(IVMSEG,"^",11) ; prev years threshold
 S IVM11=$P(IVMSEG,"^",18) ; source of test
 S IVM12=$$FMDATE^HLFNC($P(IVMSEG,"^",24)) ; hardship effective date
 S IVM13=$$FMDATE^HLFNC($P(IVMSEG,"^",25)) ; date/time last edited
 S IVM14=$P(IVMSEG,"^",26) ; test determined status
 S IVM15=$P(IVMSEG,"^",4) ; income 
 S IVM16=$P(IVMSEG,"^",5) ; net worth
 S IVM17=$P(IVMSEG,"^",8) ; threshold A
 S IVM18=$P(IVMSEG,"^",9) ; deductible expenses
 S IVM19=$P(IVMSEG,"^",12) ; total dependents
 S IVM20=$P(IVMSEG,"^",27) ; signature valid?
 S IVM21=$$FMDATE^HLFNC($P(IVMSEG,"^",14)) ; hardship review date
 S IVM22=$P(IVMSEG,"^",28) ; GMT threshold
 S IVM23=$P(IVMSEG,"^",29) ; hardship reason
 S IVM24=+$P(IVMSEG,"^",30) ; Means Test Version
 S IVM25=$$FMDATE^HLFNC($P(IVMSEG,"^",2)) ;Means Test Date ;IVM*2.0*190
 S IVM26=$$FMDATE^HLFNC($P(IVMSEG,"^",32)) ;Hardship Expiration Date ;IVM*2.0*193
 S DATA(2.13)=IVM26  ; IVM*2.0*193
 ;IVM*2.0*193;HM; when Hardship Expiration Date is after effective date and not a future date
 ;  - set Hardship to "NO" and Hardship Expired to "YES"
 I IVM26'="",(IVM12<=IVM26)&(IVM26<=DT) D
 .S IVM7=0,DATA(.2)=IVM7
 .S DATA(2.12)=1
 ;
 ;old tests may not have the field Test-Determined Status
 I IVM14="" D
 . I IVMTYPE=1,IVM7,"AG"[IVM6 D  Q
 . . I IVM6="A",(IVM15'>IVM22) S IVM14="G" Q   ;Income <= GMT Threshold
 . . S IVM14="C"
 . S IVM14=IVM6
 ;
 ; - fields for means test, copay test and Long Term Care Test
 S DATA(.14)=IVM4,DATA(.18)=IVM19,DATA(.23)=IVM11,DATA(2.05)=IVM8,DATA(.06)=DUZ,DATA(.07)=IVM1,DATA(2.02)=IVM13,DATA(2.03)=$$GETSTAT^DGMTH(IVM14,IVMTYPE),DATA(2.11)=IVM24
 ;
 I IVM7 S DATA(.08)=.5,DATA(.09)=$$NOW^XLFDT
 ;
 I 'IVM4 S DATA(.04)=IVM15,DATA(.15)=IVM18
 ;
 ; - means test fields
 I IVMTYPE=1 D
 . S DATA(.11)=IVM2,DATA(.12)=IVM17,DATA(.2)=IVM7,DATA(.24)=IVM3,DATA(.29)=IVM20,DATA(2.04)=IVM9,DATA(.1)=IVM5,DATA(2.01)=IVM12
 . I 'IVM4 S DATA(.05)=IVM16
 . S DATA(.16)=IVM10,DATA(.21)=IVM21,DATA(.27)=IVM22,DATA(2.09)=IVM23
 ;
 ; - Long Term Care fields
 I IVMTYPE=4 D
 . N DATE,TYPE
 . ;set pointer to associated means test or RX copay test if there is one
 . I $P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,2) S DATE=$P(^TMP($J,"IVMCM","ZMT1"),HLFS,2),TYPE=1
 . E  I $P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,2) S DATE=$P(^TMP($J,"IVMCM","ZMT2"),HLFS,2),TYPE=2
 . I $G(DATE) S DATA(2.08)=$P($$LST^DGMTU(DFN,DATE,TYPE),"^")
 . S DATA(.11)=IVM2
 . I 'IVM4 S DATA(.05)=IVM16
 . K DATA(2.03)  ;test determined status is not used in LTC test
 ;
 I $G(IVMMTIEN) D
 . ; Get record data to compare with HL7 Message data
 . S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
 . S NODE2=$G(^DGMT(408.31,IVMMTIEN,2))
 . ;
 . ; If Site Conducting Test is the same, get Completed By from record.t
 . I $P(NODE2,"^",5)=IVM8 S DATA(.06)=$P(NODE0,"^",6)
 . ;
 . ; If there are Comments, copy them into new record
 . I $O(^DGMT(408.31,IVMMTIEN,"C",0)) S DATA(50)="^DGMT(408.31,"_IVMMTIEN_",""C"")"
 . ;
 . I IVMTYPE=1 D
 . . ; Hardship is YES in msg and record, and the Site Granting Hardship
 . . ; is the same as the site receiving the msg, keep the record data
 . . I IVM7,$P(NODE0,"^",20),IVM9=$P($$SITE^VASITE,"^",3) S DATA(.21)=$P(NODE0,"^",21),DATA(.22)=$P(NODE0,"^",22),DATA(.08)=$P(NODE0,"^",8),DATA(.09)=$P(NODE0,"^",9)
 . . ;
 . . ;hardship effective date should always be what is coming in in the ZMT segment
 . . S DATA(2.01)=IVM12 ; IVM*2.0*193
 . . ;
 . . ; Hardship is YES in msg and record, and the Site Granting Hardship
 . . ; is NOT the same in both the msg and record, keep the message data
 . . I IVM7,$P(NODE0,"^",20),$P(NODE2,"^",4)'=IVM9 S DATA(.22)=DATA(.06)
 . . ;
 . . ; Hardship is YES in msg and NO in record, keep the message data
 . . I IVM7,'$P(NODE0,"^",20) S DATA(.22)=DATA(.06)
 . . ;
 . . ; Hardship is set to delete in msg, delete the Hardship
 . . I IVM12=HLQ!('IVM7&($P(NODE0,"^",20))) D
 . . . ; DG*5.3*997;HM;  If hardship expr date (IVM26) not null, and if hardship eff date (IVM12) <= hardship expr date (IVM26) 
 . . . ;  and hardship expr date (IVM26) is less than or equal to now (DT) then it is an expiration record, quit (do not clear data values)
 . . . I IVM26'="",(IVM12<=IVM26)&(IVM26<=DT) Q
 . . . S (DATA(.08),DATA(.09),DATA(.2),DATA(.21),DATA(.22),DATA(2.01),DATA(2.04),DATA(2.09))=""
 . . . I $P(NODE0,"^",20) D BULL2^IVMCMB(DFN,$P(NODE2,"^"),$P(NODE2,"^",4))
 . . ;
 . . ; Hardship is NO in msg and in record, keep the message data
 . . I 'IVM7,'$P(NODE0,"^",20) S DATA(.22)=""
 . . ;
 . . ; Notify site of hardship?
 . . I IVM12'=HLQ,IVM7,((IVM12'=$P(NODE2,"^"))!('$P(NODE0,"^",20))) D BULL1^IVMCMB(DFN,IVM12,IVM9)
 . . ;
 . . ; Notify site to discontinue net-worth development?
 . . I IVM11=3,$P(NODE0,"^",23)=1,$$GETCODE^DGMTH($P(NODE0,"^",3))="P" D BULL3^IVMCMB(DFN)
 . . ;
 . . ; Put message in comments field IVM*2.0*190
 . . I IVM12'="",IVM12<IVM25 D
 . . . K ^TMP($J,"IVMCM6","COMMENT")
 . . . S ^TMP($J,"IVMCM6","COMMENT",1)="Received/Uploaded Test on "_$$FTIME^VALM1(IVM1)_" with data inconsistencies. "
 . . . S ^TMP($J,"IVMCM6","COMMENT",2)=": Hardship Effective Date earlier than Means Test Date"
 . . . D WP^DIE(408.31,""_DGMTI_",",50,"K","^TMP($J,""IVMCM6"",""COMMENT"")")
 . . . K DATA(50),^TMP($J,"IVMCM6","COMMENT") ;remove anything hanging around for comment field 50 so nothing gets overwritten
 . . I IVM12'="",IVM12>=IVM25 D
 . . . I $$CHKCMT(IVMMTIEN) S DATA(50)="" D RMVECMT(IVMMTIEN)
 . . . I $D(^TMP($J,"IVMCM","NTE")) D
 . . . . K ^TMP($J,"IVMCM6","COMMENT")
 . . . . N IVMNTECT,IVMNTED
 . . . . S IVMNTED=0
 . . . . F IVMNTECT=1:1 D  Q:IVMNTED
 . . . . . I '$D(^TMP($J,"IVMCM","NTE",IVMNTECT)) S IVMNTED=1 Q
 . . . . . S ^TMP($J,"IVMCM6","COMMENT",IVMNTECT)=$P(^TMP($J,"IVMCM","NTE",IVMNTECT),"^")
 . . . . D WP^DIE(408.31,""_DGMTI_",",50,"K","^TMP($J,""IVMCM6"",""COMMENT"")")
 . . . . K DATA(50),^TMP($J,"IVMCM6","COMMENT")
 . . I IVM12="",$$CHKCMT(IVMMTIEN) D RMVECMT(IVMMTIEN)
 ;
 ;
 ;determine status based on test-determined status and hardship
 S CODE=IVM14
 I IVMTYPE=1,DATA(.2) S CODE=IVM6
 S DATA(.03)=$$GETSTAT^DGMTH(CODE,IVMTYPE)
 ;
 I $$UPD^DGENDBS(408.31,DGMTI,.DATA) D
 . ; can't call MT Events protocol for Long Term Care Copay Exemption
 . ; Tests as it triggers an IB and Enrollment update
 . ; so manually call needed protocols to trigger audit, date stamp
 . ; and transmission (if necessary)
 . I IVMTYPE=4 D  Q
 . . S:$G(DGMTACT)="" DGMTACT="ADD"
 . . S DGMTP=$G(DGMTP)                                       ;IVM*2*84
 . . S DGMTINF=1  ;Means Test Interactive/Non-interactive flag
 . . D AFTER^DGMTEVT
 . . D EN^DGMTAUD                   ;means test audit event
 . . D ^IVMPMTE                     ;IVM means test event
 . . D DATETIME^DGMTU4($G(DGMTI))   ;date stamp
 . ;
 . ; - call means test event driver if not future test
 . I 'IVMFUTR D
 . . D:(IVMTYPE=1) MTPRIME^DGMTU4(DGMTI)
 . . D:(IVMTYPE=2) RXPRIME^DGMTU4(DGMTI)
 . . S CODE=$$GETCODE^DGMTH($P($G(^DGMT(408.31,DGMTI,0)),"^",3))
 . E  D
 . . ;enter to list of future tests kept in the IVM Patient file
 . . D ADDFUTR^IVMPLOG2(DGMTI)
 . . ;also, if HEC changed the test to a future date, there could be
 . . ;a test on file for the same income year marked as primary
 . . I $G(IVMMTIEN),$P(NODE2,"^",5)=IVM8 D
 . . . N DATA,ERROR,DGMTI,DGMTACT,DGMTYPT,DGMTA
 . . . S DATA(2)=0
 . . . I $$UPD^DGENDBS(408.31,IVMMTIEN,.DATA,.ERROR)
 . . . ; if the test being replaced by the uploaded future test
 . . . ; becomes non-primary and the site conducted both tests
 . . . ; then call Means Test event driver (non interactively)
 . . . S DGMTACT="EDT",DGMTI=IVMMTIEN,DGMTYPT=IVMTYPE,DGMTINF=1
 . . . D AFTER^DGMTEVT
 . . . D EN^DGMTEVT
 . . . D
 . . . . N DGMSGF,DGADDF
 . . . . S DGMSGF=1,DGADDF=0
 . . . . D EN^DGMTR
 . D:OK2SND TRNSMT
 ;
 ;
MTBULL ; Build results array
 D ADD^IVMCMB(DFN,IVMTYPE,$S(IVMFUTR:"Future Test",1:"New Test"),$G(IVMMTDT),$S($G(IVMMTIEN):$$GETCODE^DGMTH($P($G(^DGMT(408.31,IVMMTIEN,0)),"^",3)),1:""),CODE)
 ;
CLEANUP ; cleanup
 K DGCAT,DGCOMF,DGMTACT,DGMTI,DGMTINF,DGMTPAR,DGTHB,IVMBU45,IVMOP,IVMOP1
 K IVM1,IVM2,IVM3,IVM4,IVM5,IVM6,IVM7,IVM8,IVM9,IVM10,IVM11,IVM12,IVM13,IVM14,IVMCAT,IVMCEA,IVMCEB,IVMMTA,IVM15,IVM16,IVM17,IVM18,IVM19,IVM20,IVM21
 K IVM22,IVM23,IVM24,IVM25,IVM26 ;IVM*2.0*190 IVM*2.0*193
 Q
 ;
CHKCMT(MTIEN) ; CHECK FOR HARDSHIP COMMENT IVM*2.0*190
 ; DBIA 968     NAME: DBIA968               FILE: 408.31                 ROOT: DGMT(408.31,
 N CNT,RET,COMMENT,DIC,DR,DA
 S DIC=408.31,DR="50",DA=MTIEN
 S DR(408.311)=".01",DA(408.311)=1
 D EN^DIQ1
 S CNT=0,RET=0
 F  S CNT=$O(^UTILITY("DIQ1",$J,408.31,MTIEN,50,CNT)) Q:CNT=""  D  Q:RET
  .S COMMENT=^UTILITY("DIQ1",$J,408.31,MTIEN,50,CNT)
  .I COMMENT["Hardship Effective Date earlier than Means Test Date" S RET=1
 Q RET
 ;
RMVECMT(MTIEN) ; REMOVE COMMENTS NOT NEEDED IVM*2.0*190 
 ; DBIA 968     NAME:DBIA968                FILE: 408.31                 ROOT: DGMT(408.31,
 N CNT,RET,COMMENT,DIC,DR,DA,IVMFNDC1,IVMFNDC2,IVMLNCT
 S DIC=408.31,DR="50",DA=MTIEN,IVMFNDC1=0,IVMFNDC2=0,IVMLNCT=0
 S DR(408.311)=".01",DA(408.311)=1
 D EN^DIQ1
 S CNT=0,RET=0
 F  S CNT=$O(^UTILITY("DIQ1",$J,408.31,MTIEN,50,CNT)) Q:CNT=""  D  Q:RET
 .S COMMENT=^UTILITY("DIQ1",$J,408.31,MTIEN,50,CNT),(IVMFNDC1,IVMFNDC2)=0
 .I COMMENT["Received/Uploaded Test on"&(COMMENT["with data inconsistencies") S IVMFNDC1=1
 .I COMMENT["Hardship Effective Date earlier than Means Test Date" S IVMFNDC2=1
 .I 'IVMFNDC1,'IVMFNDC2 S IVMLNCT=IVMLNCT+1,^TMP($J,"IVMCM6","COMMENT",IVMLNCT)=COMMENT
 I IVMLNCT>0 D WP^DIE(408.31,""_MTIEN_",",50,"K","^TMP($J,""IVMCM6"",""COMMENT"")") K ^TMP($J,"IVMCM6","COMMENT")
 Q
 ;
OPEN ; open case record for uploaded test
 S IVMOP="",IVMOP=$O(^IVM(301.5,"AYR",DGLY,DFN,IVMOP)) I 'IVMOP D OPEN1 Q
 S IVMOP1=$G(^IVM(301.5,IVMOP,0)) I 'IVMOP1 D OPEN1 Q
 I $P(IVMOP1,"^",4)=1 S DA=+IVMOP D  Q
 . S DIE="^IVM(301.5,",DR=".03////1;.04////0"
 . D OPEN2
 Q
OPEN1 K DD,DO
 S DIC="^IVM(301.5,",DIC(0)="LMNZ",X=DFN,DLAYGO=301.5
 D FILE^DICN Q:Y'>0  S DA=+Y
 S DIE="^IVM(301.5,",DR=".02////^S X=DGLY;.03////1;.04////0"
OPEN2 D ^DIE K DD,DO,DIC,DLAYGO,X,Y,DIE,DR
 Q
 ;
MTDRIVER ; call means test event driver
 ; dgmtact
 ; adj  adjudicated mt
 ; cat  hardship mt
 ; add  new mt or copay
 ; edit corrected mt or copay
 ;         
 N IVMDA,IVMDT,IVMFLG,IVMMTDT,IVMNEW
 S DGMTACT=$S($G(IVMHADJ)=1:"ADJ",$G(IVMHADJ)=2:"CAT",'$G(DGMTP):"ADD",1:"EDT")
 D AFTER^DGMTEVT
 S DGMTINF=1 ; non-interactive flag
 D EN^DGMTEVT
 Q
 ;
CHKTST ; Verify if the incoming Income Test requires a Z07 transmission.
 ;
 N MTREC,REC01,ZMTSEG
 S OK2SND=0
 S MTREC=$G(^DGMT(408.31,DGMTI,0))
 Q:'$D(^DGMT(408.31,DGMTI,0))
 ; Check if the Source of the Test is DCD
 S ZMTSEG=$G(^TMP($J,"IVMCM","ZMT"_IVMTYPE))
 Q:$P($G(^DG(408.34,+$P(ZMTSEG,U,18),0)),U)'="DCD"
 ;Check if the DCD software has been installed
 Q:'$$VERSION^XPDUTL("IVMC")
 ;
 ; If the source of the test is DCD, and the site receiving the test
 ; is a DCD site, set the record to transmit.
 S OK2SND=1
 Q
 ;
TRNSMT ; Set the record to transmit due to DCD Criteria
 N REC01,DCDDATA,DCDIEN,EVENTS,ERROR
 S REC01=$O(^IVM(301.5,"AYR",DGLY,DFN,""))
 S DCDDATA(.04)=0,DCDIEN=REC01
 I $$UPD^DGENDBS(301.5,DCDIEN,.DCDDATA,.ERROR)
 S EVENTS("DCD")=1
 I $$SETSTAT^IVMPLOG(REC01,.EVENTS)
 ;
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIVMCM6   13049     printed  Sep 23, 2025@19:36:39                                                                                                                                                                                                     Page 2
IVMCM6    ;ALB/SEK,JAN,RTK,CKN,TDM,GN,HM - COMPLETE DCD INCOME TEST ;4/10/20 11:41am
 +1       ;;2.0;INCOME VERIFICATION MATCH;**17,25,39,44,50,53,49,58,62,67,84,115,136,190,193**;21-OCT-94;Build 37
 +2       ;;Per VHA Directive 10-93-142, this routine should not be modified.
 +3       ;
 +4       ;IVM*2*84 - insure DGMTP is defined by LTC test prior to calling
 +5       ;           audit
 +6       ;
EN        ; This routine will update annual means test file (#408.31):
 +1       ;      
 +2       ; Note: There is no entry in 408.31 for income screening.
 +3       ;
 +4       ;
 +5       ;Input:
 +6       ;  DGMTI - ien of new Annual Means Test which requires completion
 +7       ;  IVMMTIEN - ien of replaced test (may not exist)
 +8       ;
 +9       ; - open case record in (#301.5) file
 +10       NEW DGREF,DATA,CODE,FIELD,RET,NODE0,NODE2,OK2SND
 +11       DO CHKTST
           DO OPEN
 +12      ;
 +13      ; - if income screening goto MTBULL
 +14       IF IVMTYPE=3
               GOTO MTBULL
 +15      ;
 +16      ; - setup variables for (#408.31) file
 +17      ;get the ZMT segment, translate HLQ's to NULLS
 +18      ; get mt/copay ZMT segment
           SET IVMSEG=$GET(^TMP($JOB,"IVMCM","ZMT"_IVMTYPE))
 +19      ;IVM*2.0*193
           FOR FIELD=4:1:32
               IF FIELD'=24
                   IF $PIECE(IVMSEG,HLFS,FIELD)=HLQ
                       SET $PIECE(IVMSEG,HLFS,FIELD)=""
 +20      ;
 +21      ; dt/time completed
           SET IVM1=$$FMDATE^HLFNC($PIECE(IVMSEG,"^",10))
 +22      ; agree to pay deductible
           SET IVM2=$PIECE(IVMSEG,"^",7)
 +23      ; dt vet signed test
           SET IVM3=$$FMDATE^HLFNC($PIECE(IVMSEG,"^",15))
 +24      ; declines to give income info field
           SET IVM4=$PIECE(IVMSEG,"^",16)
 +25       if IVM4
               SET DGREF=""
 +26      ; dt/time of adjudication
           SET IVM5=$$FMDATE^HLFNC($PIECE(IVMSEG,"^",6))
 +27      ;status
           SET IVM6=$PIECE(IVMSEG,"^",3)
 +28      ; hardship
           SET IVM7=$PIECE(IVMSEG,"^",13)
 +29      ; test status 
           if $GET(IVMHADJ)
               SET IVMCAT=$PIECE(IVMSEG,"^",3)
 +30      ; site conducting test
           SET IVM8=$PIECE(IVMSEG,"^",22)
 +31      ; site granting hardship
           SET IVM9=$PIECE(IVMSEG,"^",23)
 +32      ; prev years threshold
           SET IVM10=$PIECE(IVMSEG,"^",11)
 +33      ; source of test
           SET IVM11=$PIECE(IVMSEG,"^",18)
 +34      ; hardship effective date
           SET IVM12=$$FMDATE^HLFNC($PIECE(IVMSEG,"^",24))
 +35      ; date/time last edited
           SET IVM13=$$FMDATE^HLFNC($PIECE(IVMSEG,"^",25))
 +36      ; test determined status
           SET IVM14=$PIECE(IVMSEG,"^",26)
 +37      ; income 
           SET IVM15=$PIECE(IVMSEG,"^",4)
 +38      ; net worth
           SET IVM16=$PIECE(IVMSEG,"^",5)
 +39      ; threshold A
           SET IVM17=$PIECE(IVMSEG,"^",8)
 +40      ; deductible expenses
           SET IVM18=$PIECE(IVMSEG,"^",9)
 +41      ; total dependents
           SET IVM19=$PIECE(IVMSEG,"^",12)
 +42      ; signature valid?
           SET IVM20=$PIECE(IVMSEG,"^",27)
 +43      ; hardship review date
           SET IVM21=$$FMDATE^HLFNC($PIECE(IVMSEG,"^",14))
 +44      ; GMT threshold
           SET IVM22=$PIECE(IVMSEG,"^",28)
 +45      ; hardship reason
           SET IVM23=$PIECE(IVMSEG,"^",29)
 +46      ; Means Test Version
           SET IVM24=+$PIECE(IVMSEG,"^",30)
 +47      ;Means Test Date ;IVM*2.0*190
           SET IVM25=$$FMDATE^HLFNC($PIECE(IVMSEG,"^",2))
 +48      ;Hardship Expiration Date ;IVM*2.0*193
           SET IVM26=$$FMDATE^HLFNC($PIECE(IVMSEG,"^",32))
 +49      ; IVM*2.0*193
           SET DATA(2.13)=IVM26
 +50      ;IVM*2.0*193;HM; when Hardship Expiration Date is after effective date and not a future date
 +51      ;  - set Hardship to "NO" and Hardship Expired to "YES"
 +52       IF IVM26'=""
               IF (IVM12<=IVM26)&(IVM26<=DT)
                   Begin DoDot:1
 +53                   SET IVM7=0
                       SET DATA(.2)=IVM7
 +54                   SET DATA(2.12)=1
                   End DoDot:1
 +55      ;
 +56      ;old tests may not have the field Test-Determined Status
 +57       IF IVM14=""
               Begin DoDot:1
 +58               IF IVMTYPE=1
                       IF IVM7
                           IF "AG"[IVM6
                               Begin DoDot:2
 +59      ;Income <= GMT Threshold
                                   IF IVM6="A"
                                       IF (IVM15'>IVM22)
                                           SET IVM14="G"
                                           QUIT 
 +60                               SET IVM14="C"
                               End DoDot:2
                               QUIT 
 +61               SET IVM14=IVM6
               End DoDot:1
 +62      ;
 +63      ; - fields for means test, copay test and Long Term Care Test
 +64       SET DATA(.14)=IVM4
           SET DATA(.18)=IVM19
           SET DATA(.23)=IVM11
           SET DATA(2.05)=IVM8
           SET DATA(.06)=DUZ
           SET DATA(.07)=IVM1
           SET DATA(2.02)=IVM13
           SET DATA(2.03)=$$GETSTAT^DGMTH(IVM14,IVMTYPE)
           SET DATA(2.11)=IVM24
 +65      ;
 +66       IF IVM7
               SET DATA(.08)=.5
               SET DATA(.09)=$$NOW^XLFDT
 +67      ;
 +68       IF 'IVM4
               SET DATA(.04)=IVM15
               SET DATA(.15)=IVM18
 +69      ;
 +70      ; - means test fields
 +71       IF IVMTYPE=1
               Begin DoDot:1
 +72               SET DATA(.11)=IVM2
                   SET DATA(.12)=IVM17
                   SET DATA(.2)=IVM7
                   SET DATA(.24)=IVM3
                   SET DATA(.29)=IVM20
                   SET DATA(2.04)=IVM9
                   SET DATA(.1)=IVM5
                   SET DATA(2.01)=IVM12
 +73               IF 'IVM4
                       SET DATA(.05)=IVM16
 +74               SET DATA(.16)=IVM10
                   SET DATA(.21)=IVM21
                   SET DATA(.27)=IVM22
                   SET DATA(2.09)=IVM23
               End DoDot:1
 +75      ;
 +76      ; - Long Term Care fields
 +77       IF IVMTYPE=4
               Begin DoDot:1
 +78               NEW DATE,TYPE
 +79      ;set pointer to associated means test or RX copay test if there is one
 +80               IF $PIECE($GET(^TMP($JOB,"IVMCM","ZMT1")),HLFS,2)
                       SET DATE=$PIECE(^TMP($JOB,"IVMCM","ZMT1"),HLFS,2)
                       SET TYPE=1
 +81              IF '$TEST
                       IF $PIECE($GET(^TMP($JOB,"IVMCM","ZMT2")),HLFS,2)
                           SET DATE=$PIECE(^TMP($JOB,"IVMCM","ZMT2"),HLFS,2)
                           SET TYPE=2
 +82               IF $GET(DATE)
                       SET DATA(2.08)=$PIECE($$LST^DGMTU(DFN,DATE,TYPE),"^")
 +83               SET DATA(.11)=IVM2
 +84               IF 'IVM4
                       SET DATA(.05)=IVM16
 +85      ;test determined status is not used in LTC test
                   KILL DATA(2.03)
               End DoDot:1
 +86      ;
 +87       IF $GET(IVMMTIEN)
               Begin DoDot:1
 +88      ; Get record data to compare with HL7 Message data
 +89               SET NODE0=$GET(^DGMT(408.31,IVMMTIEN,0))
 +90               SET NODE2=$GET(^DGMT(408.31,IVMMTIEN,2))
 +91      ;
 +92      ; If Site Conducting Test is the same, get Completed By from record.t
 +93               IF $PIECE(NODE2,"^",5)=IVM8
                       SET DATA(.06)=$PIECE(NODE0,"^",6)
 +94      ;
 +95      ; If there are Comments, copy them into new record
 +96               IF $ORDER(^DGMT(408.31,IVMMTIEN,"C",0))
                       SET DATA(50)="^DGMT(408.31,"_IVMMTIEN_",""C"")"
 +97      ;
 +98               IF IVMTYPE=1
                       Begin DoDot:2
 +99      ; Hardship is YES in msg and record, and the Site Granting Hardship
 +100     ; is the same as the site receiving the msg, keep the record data
 +101                      IF IVM7
                               IF $PIECE(NODE0,"^",20)
                                   IF IVM9=$PIECE($$SITE^VASITE,"^",3)
                                       SET DATA(.21)=$PIECE(NODE0,"^",21)
                                       SET DATA(.22)=$PIECE(NODE0,"^",22)
                                       SET DATA(.08)=$PIECE(NODE0,"^",8)
                                       SET DATA(.09)=$PIECE(NODE0,"^",9)
 +102     ;
 +103     ;hardship effective date should always be what is coming in in the ZMT segment
 +104     ; IVM*2.0*193
                           SET DATA(2.01)=IVM12
 +105     ;
 +106     ; Hardship is YES in msg and record, and the Site Granting Hardship
 +107     ; is NOT the same in both the msg and record, keep the message data
 +108                      IF IVM7
                               IF $PIECE(NODE0,"^",20)
                                   IF $PIECE(NODE2,"^",4)'=IVM9
                                       SET DATA(.22)=DATA(.06)
 +109     ;
 +110     ; Hardship is YES in msg and NO in record, keep the message data
 +111                      IF IVM7
                               IF '$PIECE(NODE0,"^",20)
                                   SET DATA(.22)=DATA(.06)
 +112     ;
 +113     ; Hardship is set to delete in msg, delete the Hardship
 +114                      IF IVM12=HLQ!('IVM7&($PIECE(NODE0,"^",20)))
                               Begin DoDot:3
 +115     ; DG*5.3*997;HM;  If hardship expr date (IVM26) not null, and if hardship eff date (IVM12) <= hardship expr date (IVM26) 
 +116     ;  and hardship expr date (IVM26) is less than or equal to now (DT) then it is an expiration record, quit (do not clear data values)
 +117                              IF IVM26'=""
                                       IF (IVM12<=IVM26)&(IVM26<=DT)
                                           QUIT 
 +118                              SET (DATA(.08),DATA(.09),DATA(.2),DATA(.21),DATA(.22),DATA(2.01),DATA(2.04),DATA(2.09))=""
 +119                              IF $PIECE(NODE0,"^",20)
                                       DO BULL2^IVMCMB(DFN,$PIECE(NODE2,"^"),$PIECE(NODE2,"^",4))
                               End DoDot:3
 +120     ;
 +121     ; Hardship is NO in msg and in record, keep the message data
 +122                      IF 'IVM7
                               IF '$PIECE(NODE0,"^",20)
                                   SET DATA(.22)=""
 +123     ;
 +124     ; Notify site of hardship?
 +125                      IF IVM12'=HLQ
                               IF IVM7
                                   IF ((IVM12'=$PIECE(NODE2,"^"))!('$PIECE(NODE0,"^",20)))
                                       DO BULL1^IVMCMB(DFN,IVM12,IVM9)
 +126     ;
 +127     ; Notify site to discontinue net-worth development?
 +128                      IF IVM11=3
                               IF $PIECE(NODE0,"^",23)=1
                                   IF $$GETCODE^DGMTH($PIECE(NODE0,"^",3))="P"
                                       DO BULL3^IVMCMB(DFN)
 +129     ;
 +130     ; Put message in comments field IVM*2.0*190
 +131                      IF IVM12'=""
                               IF IVM12<IVM25
                                   Begin DoDot:3
 +132                                  KILL ^TMP($JOB,"IVMCM6","COMMENT")
 +133                                  SET ^TMP($JOB,"IVMCM6","COMMENT",1)="Received/Uploaded Test on "_$$FTIME^VALM1(IVM1)_" with data inconsistencies. "
 +134                                  SET ^TMP($JOB,"IVMCM6","COMMENT",2)=": Hardship Effective Date earlier than Means Test Date"
 +135                                  DO WP^DIE(408.31,""_DGMTI_",",50,"K","^TMP($J,""IVMCM6"",""COMMENT"")")
 +136     ;remove anything hanging around for comment field 50 so nothing gets overwritten
                                       KILL DATA(50),^TMP($JOB,"IVMCM6","COMMENT")
                                   End DoDot:3
 +137                      IF IVM12'=""
                               IF IVM12>=IVM25
                                   Begin DoDot:3
 +138                                  IF $$CHKCMT(IVMMTIEN)
                                           SET DATA(50)=""
                                           DO RMVECMT(IVMMTIEN)
 +139                                  IF $DATA(^TMP($JOB,"IVMCM","NTE"))
                                           Begin DoDot:4
 +140                                          KILL ^TMP($JOB,"IVMCM6","COMMENT")
 +141                                          NEW IVMNTECT,IVMNTED
 +142                                          SET IVMNTED=0
 +143                                          FOR IVMNTECT=1:1
                                                   Begin DoDot:5
 +144                                                  IF '$DATA(^TMP($JOB,"IVMCM","NTE",IVMNTECT))
                                                           SET IVMNTED=1
                                                           QUIT 
 +145                                                  SET ^TMP($JOB,"IVMCM6","COMMENT",IVMNTECT)=$PIECE(^TMP($JOB,"IVMCM","NTE",IVMNTECT),"^")
                                                   End DoDot:5
                                                   if IVMNTED
                                                       QUIT 
 +146                                          DO WP^DIE(408.31,""_DGMTI_",",50,"K","^TMP($J,""IVMCM6"",""COMMENT"")")
 +147                                          KILL DATA(50),^TMP($JOB,"IVMCM6","COMMENT")
                                           End DoDot:4
                                   End DoDot:3
 +148                      IF IVM12=""
                               IF $$CHKCMT(IVMMTIEN)
                                   DO RMVECMT(IVMMTIEN)
                       End DoDot:2
               End DoDot:1
 +149     ;
 +150     ;
 +151     ;determine status based on test-determined status and hardship
 +152      SET CODE=IVM14
 +153      IF IVMTYPE=1
               IF DATA(.2)
                   SET CODE=IVM6
 +154      SET DATA(.03)=$$GETSTAT^DGMTH(CODE,IVMTYPE)
 +155     ;
 +156      IF $$UPD^DGENDBS(408.31,DGMTI,.DATA)
               Begin DoDot:1
 +157     ; can't call MT Events protocol for Long Term Care Copay Exemption
 +158     ; Tests as it triggers an IB and Enrollment update
 +159     ; so manually call needed protocols to trigger audit, date stamp
 +160     ; and transmission (if necessary)
 +161              IF IVMTYPE=4
                       Begin DoDot:2
 +162                      if $GET(DGMTACT)=""
                               SET DGMTACT="ADD"
 +163     ;IVM*2*84
                           SET DGMTP=$GET(DGMTP)
 +164     ;Means Test Interactive/Non-interactive flag
                           SET DGMTINF=1
 +165                      DO AFTER^DGMTEVT
 +166     ;means test audit event
                           DO EN^DGMTAUD
 +167     ;IVM means test event
                           DO ^IVMPMTE
 +168     ;date stamp
                           DO DATETIME^DGMTU4($GET(DGMTI))
                       End DoDot:2
                       QUIT 
 +169     ;
 +170     ; - call means test event driver if not future test
 +171              IF 'IVMFUTR
                       Begin DoDot:2
 +172                      if (IVMTYPE=1)
                               DO MTPRIME^DGMTU4(DGMTI)
 +173                      if (IVMTYPE=2)
                               DO RXPRIME^DGMTU4(DGMTI)
 +174                      SET CODE=$$GETCODE^DGMTH($PIECE($GET(^DGMT(408.31,DGMTI,0)),"^",3))
                       End DoDot:2
 +175             IF '$TEST
                       Begin DoDot:2
 +176     ;enter to list of future tests kept in the IVM Patient file
 +177                      DO ADDFUTR^IVMPLOG2(DGMTI)
 +178     ;also, if HEC changed the test to a future date, there could be
 +179     ;a test on file for the same income year marked as primary
 +180                      IF $GET(IVMMTIEN)
                               IF $PIECE(NODE2,"^",5)=IVM8
                                   Begin DoDot:3
 +181                                  NEW DATA,ERROR,DGMTI,DGMTACT,DGMTYPT,DGMTA
 +182                                  SET DATA(2)=0
 +183                                  IF $$UPD^DGENDBS(408.31,IVMMTIEN,.DATA,.ERROR)
 +184     ; if the test being replaced by the uploaded future test
 +185     ; becomes non-primary and the site conducted both tests
 +186     ; then call Means Test event driver (non interactively)
 +187                                  SET DGMTACT="EDT"
                                       SET DGMTI=IVMMTIEN
                                       SET DGMTYPT=IVMTYPE
                                       SET DGMTINF=1
 +188                                  DO AFTER^DGMTEVT
 +189                                  DO EN^DGMTEVT
 +190                                  Begin DoDot:4
 +191                                      NEW DGMSGF,DGADDF
 +192                                      SET DGMSGF=1
                                           SET DGADDF=0
 +193                                      DO EN^DGMTR
                                       End DoDot:4
                                   End DoDot:3
                       End DoDot:2
 +194              if OK2SND
                       DO TRNSMT
               End DoDot:1
 +195     ;
 +196     ;
MTBULL    ; Build results array
 +1        DO ADD^IVMCMB(DFN,IVMTYPE,$SELECT(IVMFUTR:"Future Test",1:"New Test"),$GET(IVMMTDT),$SELECT($GET(IVMMTIEN):$$GETCODE^DGMTH($PIECE($GET(^DGMT(408.31,IVMMTIEN,0)),"^",3)),1:""),CODE)
 +2       ;
CLEANUP   ; cleanup
 +1        KILL DGCAT,DGCOMF,DGMTACT,DGMTI,DGMTINF,DGMTPAR,DGTHB,IVMBU45,IVMOP,IVMOP1
 +2        KILL IVM1,IVM2,IVM3,IVM4,IVM5,IVM6,IVM7,IVM8,IVM9,IVM10,IVM11,IVM12,IVM13,IVM14,IVMCAT,IVMCEA,IVMCEB,IVMMTA,IVM15,IVM16,IVM17,IVM18,IVM19,IVM20,IVM21
 +3       ;IVM*2.0*190 IVM*2.0*193
           KILL IVM22,IVM23,IVM24,IVM25,IVM26
 +4        QUIT 
 +5       ;
CHKCMT(MTIEN) ; CHECK FOR HARDSHIP COMMENT IVM*2.0*190
 +1       ; DBIA 968     NAME: DBIA968               FILE: 408.31                 ROOT: DGMT(408.31,
 +2        NEW CNT,RET,COMMENT,DIC,DR,DA
 +3        SET DIC=408.31
           SET DR="50"
           SET DA=MTIEN
 +4        SET DR(408.311)=".01"
           SET DA(408.311)=1
 +5        DO EN^DIQ1
 +6        SET CNT=0
           SET RET=0
 +7        FOR 
               SET CNT=$ORDER(^UTILITY("DIQ1",$JOB,408.31,MTIEN,50,CNT))
               if CNT=""
                   QUIT 
               Begin DoDot:1
 +8                SET COMMENT=^UTILITY("DIQ1",$JOB,408.31,MTIEN,50,CNT)
 +9                IF COMMENT["Hardship Effective Date earlier than Means Test Date"
                       SET RET=1
               End DoDot:1
               if RET
                   QUIT 
 +10       QUIT RET
 +11      ;
RMVECMT(MTIEN) ; REMOVE COMMENTS NOT NEEDED IVM*2.0*190 
 +1       ; DBIA 968     NAME:DBIA968                FILE: 408.31                 ROOT: DGMT(408.31,
 +2        NEW CNT,RET,COMMENT,DIC,DR,DA,IVMFNDC1,IVMFNDC2,IVMLNCT
 +3        SET DIC=408.31
           SET DR="50"
           SET DA=MTIEN
           SET IVMFNDC1=0
           SET IVMFNDC2=0
           SET IVMLNCT=0
 +4        SET DR(408.311)=".01"
           SET DA(408.311)=1
 +5        DO EN^DIQ1
 +6        SET CNT=0
           SET RET=0
 +7        FOR 
               SET CNT=$ORDER(^UTILITY("DIQ1",$JOB,408.31,MTIEN,50,CNT))
               if CNT=""
                   QUIT 
               Begin DoDot:1
 +8                SET COMMENT=^UTILITY("DIQ1",$JOB,408.31,MTIEN,50,CNT)
                   SET (IVMFNDC1,IVMFNDC2)=0
 +9                IF COMMENT["Received/Uploaded Test on"&(COMMENT["with data inconsistencies")
                       SET IVMFNDC1=1
 +10               IF COMMENT["Hardship Effective Date earlier than Means Test Date"
                       SET IVMFNDC2=1
 +11               IF 'IVMFNDC1
                       IF 'IVMFNDC2
                           SET IVMLNCT=IVMLNCT+1
                           SET ^TMP($JOB,"IVMCM6","COMMENT",IVMLNCT)=COMMENT
               End DoDot:1
               if RET
                   QUIT 
 +12       IF IVMLNCT>0
               DO WP^DIE(408.31,""_MTIEN_",",50,"K","^TMP($J,""IVMCM6"",""COMMENT"")")
               KILL ^TMP($JOB,"IVMCM6","COMMENT")
 +13       QUIT 
 +14      ;
OPEN      ; open case record for uploaded test
 +1        SET IVMOP=""
           SET IVMOP=$ORDER(^IVM(301.5,"AYR",DGLY,DFN,IVMOP))
           IF 'IVMOP
               DO OPEN1
               QUIT 
 +2        SET IVMOP1=$GET(^IVM(301.5,IVMOP,0))
           IF 'IVMOP1
               DO OPEN1
               QUIT 
 +3        IF $PIECE(IVMOP1,"^",4)=1
               SET DA=+IVMOP
               Begin DoDot:1
 +4                SET DIE="^IVM(301.5,"
                   SET DR=".03////1;.04////0"
 +5                DO OPEN2
               End DoDot:1
               QUIT 
 +6        QUIT 
OPEN1      KILL DD,DO
 +1        SET DIC="^IVM(301.5,"
           SET DIC(0)="LMNZ"
           SET X=DFN
           SET DLAYGO=301.5
 +2        DO FILE^DICN
           if Y'>0
               QUIT 
           SET DA=+Y
 +3        SET DIE="^IVM(301.5,"
           SET DR=".02////^S X=DGLY;.03////1;.04////0"
OPEN2      DO ^DIE
           KILL DD,DO,DIC,DLAYGO,X,Y,DIE,DR
 +1        QUIT 
 +2       ;
MTDRIVER  ; call means test event driver
 +1       ; dgmtact
 +2       ; adj  adjudicated mt
 +3       ; cat  hardship mt
 +4       ; add  new mt or copay
 +5       ; edit corrected mt or copay
 +6       ;         
 +7        NEW IVMDA,IVMDT,IVMFLG,IVMMTDT,IVMNEW
 +8        SET DGMTACT=$SELECT($GET(IVMHADJ)=1:"ADJ",$GET(IVMHADJ)=2:"CAT",'$GET(DGMTP):"ADD",1:"EDT")
 +9        DO AFTER^DGMTEVT
 +10      ; non-interactive flag
           SET DGMTINF=1
 +11       DO EN^DGMTEVT
 +12       QUIT 
 +13      ;
CHKTST    ; Verify if the incoming Income Test requires a Z07 transmission.
 +1       ;
 +2        NEW MTREC,REC01,ZMTSEG
 +3        SET OK2SND=0
 +4        SET MTREC=$GET(^DGMT(408.31,DGMTI,0))
 +5        if '$DATA(^DGMT(408.31,DGMTI,0))
               QUIT 
 +6       ; Check if the Source of the Test is DCD
 +7        SET ZMTSEG=$GET(^TMP($JOB,"IVMCM","ZMT"_IVMTYPE))
 +8        if $PIECE($GET(^DG(408.34,+$PIECE(ZMTSEG,U,18),0)),U)'="DCD"
               QUIT 
 +9       ;Check if the DCD software has been installed
 +10       if '$$VERSION^XPDUTL("IVMC")
               QUIT 
 +11      ;
 +12      ; If the source of the test is DCD, and the site receiving the test
 +13      ; is a DCD site, set the record to transmit.
 +14       SET OK2SND=1
 +15       QUIT 
 +16      ;
TRNSMT    ; Set the record to transmit due to DCD Criteria
 +1        NEW REC01,DCDDATA,DCDIEN,EVENTS,ERROR
 +2        SET REC01=$ORDER(^IVM(301.5,"AYR",DGLY,DFN,""))
 +3        SET DCDDATA(.04)=0
           SET DCDIEN=REC01
 +4        IF $$UPD^DGENDBS(301.5,DCDIEN,.DCDDATA,.ERROR)
 +5        SET EVENTS("DCD")=1
 +6        IF $$SETSTAT^IVMPLOG(REC01,.EVENTS)
 +7       ;
 +8        QUIT