| 1 | EASCM   ;ALB/PJH - PROCESS INCOME TEST (Z10) TRANSMISSIONS ; 9/4/07 4:46pm
 | 
|---|
| 2 |         ;;1.0;ENROLLMENT APPLICATION SYSTEM;**71**; 15-MAR-01;Build 18
 | 
|---|
| 3 |         ;
 | 
|---|
| 4 |         ;CLONED FROM IVMCM (ESR EVENT DRIVER)
 | 
|---|
| 5 |         ;
 | 
|---|
| 6 | ORF     ; Handler for ORF type HL7 messages received from HEC
 | 
|---|
| 7 |         ;
 | 
|---|
| 8 |         ; Make sure POSTMASTER DUZ instead of DUZ of Person who
 | 
|---|
| 9 |         ; started Incoming Logical Link.
 | 
|---|
| 10 |         S DUZ=.5
 | 
|---|
| 11 |         N CNT,IVMRTN,SEGCNT
 | 
|---|
| 12 |         S IVMRTN="IVMCMX"  ;USE "IVMCMX" BECAUSE "IVMCM" ALREADY USED
 | 
|---|
| 13 |         K ^TMP($J,IVMRTN),DIC
 | 
|---|
| 14 |         S (DGMSGF,DGMTMSG)=1  ; HL7 rtn. Don't need DG interative messages.
 | 
|---|
| 15 |         S HLECH=HL("ECH"),HLQ=HL("Q"),HLMID=HL("MID")
 | 
|---|
| 16 |         K %,%H,%I D NOW^%DTC S HLDT=%
 | 
|---|
| 17 |         F SEGCNT=1:1 X HLNEXT Q:HLQUIT'>0  D
 | 
|---|
| 18 |         . S CNT=0
 | 
|---|
| 19 |         . S ^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE
 | 
|---|
| 20 |         . F  S CNT=$O(HLNODE(CNT)) Q:'CNT  D
 | 
|---|
| 21 |         . . S ^TMP($J,IVMRTN,SEGCNT,CNT)=HLNODE(CNT)
 | 
|---|
| 22 |         S HLDA=HLMTIEN
 | 
|---|
| 23 |         ;
 | 
|---|
| 24 |         N SEG,EVENT,MSGID
 | 
|---|
| 25 |         S:'$D(HLEVN) HLEVN=0
 | 
|---|
| 26 |         D NXTSEG^DGENUPL(HLDA,0,.SEG)
 | 
|---|
| 27 |         Q:(SEG("TYPE")'="MSH")  ;would not have reached here if this happened!
 | 
|---|
| 28 |         S EVENT=$P(SEG(9),$E(HLECH),2)
 | 
|---|
| 29 |         ;
 | 
|---|
| 30 |         ; INITIALIZE HL7 VARIABLES
 | 
|---|
| 31 |         S HLEID="EAS ESR "_$P($$SITE^VASITE,"^",3)_" ORF-"_EVENT_" SERVER"
 | 
|---|
| 32 |         S HLEID=$O(^ORD(101,"B",HLEID,0))
 | 
|---|
| 33 |         D INIT^HLFNC2(HLEID,.HL)
 | 
|---|
| 34 |         S HLEIDS=$O(^ORD(101,HLEID,775,"B",0))
 | 
|---|
| 35 |         ;
 | 
|---|
| 36 |         ; Handle means test signature ORF (Z06) event
 | 
|---|
| 37 |         I EVENT="Z06" D ORF^IVMPREC7
 | 
|---|
| 38 |         ;
 | 
|---|
| 39 |         ; Handle income test ORF (Z10) event
 | 
|---|
| 40 |         I EVENT="Z10" D Z10
 | 
|---|
| 41 |         ;
 | 
|---|
| 42 |         ; Handle enrollment/elig. ORF (Z11) event
 | 
|---|
| 43 |         I EVENT="Z11" D
 | 
|---|
| 44 |         .S MSGID=SEG(10)
 | 
|---|
| 45 |         .D ORFZ11^DGENUPL(HLDA,MSGID)
 | 
|---|
| 46 |         ;
 | 
|---|
| 47 |         K ^TMP($J,IVMRTN)
 | 
|---|
| 48 |         Q
 | 
|---|
| 49 |         ;
 | 
|---|
| 50 |         ;
 | 
|---|
| 51 | Z10     ; Entry point for receipt of ORF~Z10 transmission
 | 
|---|
| 52 |         ; The Income Test (Z10) transmission has the following format:
 | 
|---|
| 53 |         ;
 | 
|---|
| 54 |         ;       BHS           ORF msgs do not include batch header or trailer.
 | 
|---|
| 55 |         ;       {MSH
 | 
|---|
| 56 |         ;        PID          They will include the sequence:  MSA 
 | 
|---|
| 57 |         ;        ZIC                                           QRD
 | 
|---|
| 58 |         ;        ZIR                                           QRF
 | 
|---|
| 59 |         ;        {ZDP         These segments will follow the MSH segment.
 | 
|---|
| 60 |         ;         ZIC
 | 
|---|
| 61 |         ;         ZIR
 | 
|---|
| 62 |         ;        }
 | 
|---|
| 63 |         ;        {ZDP}        Inactive Dependent Spouse Entries
 | 
|---|
| 64 |         ;        {ZDP}        Inactive Dependent Child Entries
 | 
|---|
| 65 |         ;        {ZMT
 | 
|---|
| 66 |         ;        }
 | 
|---|
| 67 |         ;        ZBT
 | 
|---|
| 68 |         ;       }
 | 
|---|
| 69 |         ;       BTS
 | 
|---|
| 70 |         ;
 | 
|---|
| 71 |         S IVMORF=1 ; set ORF msg flag
 | 
|---|
| 72 |         S (HLEVN,IVMCT,IVMERROR,IVMCNTR)=0 ; init vars
 | 
|---|
| 73 |         ;
 | 
|---|
| 74 | ORU     ; Entry point for receipt of ORU~Z10 trans (called by IVMPREC2)
 | 
|---|
| 75 |         S IVMTYPE=5,IVMZ10F=1
 | 
|---|
| 76 |         ;
 | 
|---|
| 77 |         ; - loop through the msg in (#772 file), and process (PROC) msgs
 | 
|---|
| 78 |         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
 | 
|---|
| 79 |         ;
 | 
|---|
| 80 |         ; - if ORF msg flag, update the Query Tran Log and send ACK
 | 
|---|
| 81 |         I $G(IVMORF) D
 | 
|---|
| 82 |         .I $G(DFN),$D(IVMMCI) D
 | 
|---|
| 83 |         ..N IVMCR
 | 
|---|
| 84 |         ..S IVMCR=$P("1^2^3^7^5^6^4","^",IVMTYPE)  ;map reason to test type
 | 
|---|
| 85 |         ..D FIND^IVMCQ2(DFN,IVMMCI,HLDT,$S($D(HLERR):5,1:IVMCR),1)
 | 
|---|
| 86 |         .;D ACK^IVMPREC:'$D(HLERR)
 | 
|---|
| 87 |         .;N HLRESLTA,HLP
 | 
|---|
| 88 |         .;D GENACK^HLMA1(HLEID,HLMTIEN,HLEIDS,"LM",1,.HLRESLTA,"",.HLP)
 | 
|---|
| 89 |         ;
 | 
|---|
| 90 |         ; - if tests are uploaded, generate notification msg
 | 
|---|
| 91 |         I $D(^TMP($J,"IVMBULL")) D ^IVMCMB
 | 
|---|
| 92 |         ;
 | 
|---|
| 93 | ENQ     ;
 | 
|---|
| 94 |         K IVMDA,IVMORF,IVMSEG,IVMFLGC,IVMTYPE,IVMMTIEN,IVMMTDT,IVMDGBT,IVMMCI
 | 
|---|
| 95 |         K ^TMP($J,"IVMCM"),^("IVMBULL"),DGMSGF,DGADDF,IVMCPAY,IVMBULL,DFN
 | 
|---|
| 96 |         K DGMTMSG,IVMZ10F
 | 
|---|
| 97 |         Q
 | 
|---|
| 98 |         ;
 | 
|---|
| 99 | PROC    ; Process each HL7 message from (#772) file
 | 
|---|
| 100 |         ;
 | 
|---|
| 101 |         N IVMFUTR,TMSTAMP,SOURCE,NODE,HSDATE,IVMZ10,DGMTP,DGMTACT,DGMTI,DGMTA
 | 
|---|
| 102 |         S DGMTACT="ADD"
 | 
|---|
| 103 |         D PRIOR^DGMTEVT
 | 
|---|
| 104 |         S IVMZ10="UPLOAD IN PROGRESS"
 | 
|---|
| 105 |         S IVMFUTR=0 ;this flag will indicate whether or not a test with a future date is being uploaded
 | 
|---|
| 106 |         S IVMMTIEN=0
 | 
|---|
| 107 |         ;
 | 
|---|
| 108 |         S MSGID=$P(IVMSEG,HLFS,10) ; msg control id for ACK's
 | 
|---|
| 109 |         ; - check if DCD messaging is enabled
 | 
|---|
| 110 |         I '$$DCDON^IVMUPAR1() D PROB^IVMCMC("Facility has DCD messaging disabled") Q
 | 
|---|
| 111 |         ;
 | 
|---|
| 112 |         ; - check HL7 msg structure for errors
 | 
|---|
| 113 |         K HLERR,^TMP($J,"IVMCM")
 | 
|---|
| 114 |         D ^IVMCMC I $D(HLERR) K:HLERR="" HLERR Q
 | 
|---|
| 115 |         ;
 | 
|---|
| 116 |         ; Determine type of test/transmission
 | 
|---|
| 117 |         S IVMTYPE=0
 | 
|---|
| 118 |         ;
 | 
|---|
| 119 |         ; - was a means test sent?
 | 
|---|
| 120 |         I $P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,2) S IVMTYPE=1 ; MT trans
 | 
|---|
| 121 |         ;
 | 
|---|
| 122 |         ; - if MT and CT transmitted, error - pt can't have both unless
 | 
|---|
| 123 |         ;   one is a deletion, but HEC not currently handling that situation
 | 
|---|
| 124 |         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
 | 
|---|
| 125 |         I $P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,2) S IVMTYPE=2 ; CT trans
 | 
|---|
| 126 |         ;
 | 
|---|
| 127 |         ; - if no MT or CT or LTC then Income Screening
 | 
|---|
| 128 |         I 'IVMTYPE,'$P($G(^TMP($J,"IVMCM","ZMT4")),HLFS,2) S IVMTYPE=3 ; IS trans
 | 
|---|
| 129 |         ;
 | 
|---|
| 130 |         ;send an eligibility query if no eligibility code
 | 
|---|
| 131 |         I '$$ELIG^IVMCUF1(DFN),'$$PENDING^DGENQRY(DFN) I $$SEND^DGENQRY1(DFN)
 | 
|---|
| 132 |         ;
 | 
|---|
| 133 |         ; obtain locks used to sychronize upload with local income test options
 | 
|---|
| 134 |         D GETLOCKS^IVMCUPL(DFN)
 | 
|---|
| 135 |         ;
 | 
|---|
| 136 |         ;
 | 
|---|
| 137 | MT      ; If transmission is a Means Test
 | 
|---|
| 138 |         N NODE0,RET,CODE,DATA,MTSIG,MTSIGDT
 | 
|---|
| 139 |         S HLQ=$G(HL("Q"))
 | 
|---|
| 140 |         S:HLQ="" HLQ=""""""
 | 
|---|
| 141 |         I IVMTYPE=1 D  I $D(HLERR) G PROCQ
 | 
|---|
| 142 |         .S IVMMTDT=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,2))
 | 
|---|
| 143 |         .S TMSTAMP=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,25))
 | 
|---|
| 144 |         .S HSDATE=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,24))
 | 
|---|
| 145 |         .S SOURCE=$P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,22)
 | 
|---|
| 146 |         .S MTSIG=$P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,27)
 | 
|---|
| 147 |         .S MTSIGDT=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,15))
 | 
|---|
| 148 |         .S IVMLAST=$$LST^DGMTU(DFN,$E(IVMMTDT,1,3)_1231,1)
 | 
|---|
| 149 |         .Q:$$UPDMTSIG^IVMCMF(+IVMLAST,TMSTAMP,MTSIG,MTSIGDT)
 | 
|---|
| 150 |         .I $$Z06MT^EASPTRN1(+IVMLAST) Q
 | 
|---|
| 151 |         .I '$$ELIG^IVMUFNC5(DFN) S ERRMSG="Means Test upload not appropriate for current patient"
 | 
|---|
| 152 |         .I $$AGE^IVMUFNC5(DT)>$$INCY^IVMUFNC5(IVMMTDT) D
 | 
|---|
| 153 |         ..N CATCZMT S CATCZMT=$G(^TMP($J,"IVMCM","ZMT1"))
 | 
|---|
| 154 |         ..S CATC=$$CATC^IVMUFNC5(CATCZMT)
 | 
|---|
| 155 |         ..I '+$G(CATC) S ERRMSG="Only Means Tests in current/previous income years are valid (not effective)"
 | 
|---|
| 156 |         .I $G(ERRMSG)'="" D PROB^IVMCMC(ERRMSG) K ERRMSG,CATC Q
 | 
|---|
| 157 |         .;
 | 
|---|
| 158 |         .; - perform edit checks and file MT
 | 
|---|
| 159 |         .D CHKDT
 | 
|---|
| 160 |         .;deletion indicator sent?
 | 
|---|
| 161 |         .I $P($G(^TMP($J,"IVMCM","ZMT1")),HLFS,3)=HLQ D  Q
 | 
|---|
| 162 |         ..D
 | 
|---|
| 163 |         ...;if there is a future test for that income year, delete that
 | 
|---|
| 164 |         ...N IEN,DATA,IVMPAT
 | 
|---|
| 165 |         ...S IEN=$$FUTURE(DFN,($E(IVMMTDT,1,3)-1),1,.IVMPAT)
 | 
|---|
| 166 |         ...I IEN S DATA(.06)="" I $$UPD^DGENDBS(301.5,IVMPAT,.DATA)
 | 
|---|
| 167 |         ...I IEN,$D(^DGMT(408.31,IEN,0)) D
 | 
|---|
| 168 |         ....S IVMMTIEN=IEN
 | 
|---|
| 169 |         ....S IVMFUTR=1
 | 
|---|
| 170 |         ...E  D
 | 
|---|
| 171 |         ....S IVMFUTR=0
 | 
|---|
| 172 |         ..Q:('IVMMTIEN)
 | 
|---|
| 173 |         ..S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
 | 
|---|
| 174 |         ..I $$EN^IVMCMD(IVMMTIEN) D
 | 
|---|
| 175 |         ...S RET=$$LST^DGMTU(DFN,DT,IVMTYPE)
 | 
|---|
| 176 |         ...S CODE=$S(($E($P(RET,"^",2),1,3)=$E(DT,1,3)):$P(RET,"^",4),1:"")
 | 
|---|
| 177 |         ...D ADD^IVMCMB(DFN,IVMTYPE,$S(IVMFUTR:"DELETE FUTR TEST",1:"DELETE PRMRY TEST"),+$G(NODE0),$$GETCODE^DGMTH($P(NODE0,"^",3)),CODE)
 | 
|---|
| 178 |         .;
 | 
|---|
| 179 |         .;check timestamp - if matches current primary test and hardship matches, then this is a duplicate and does not need to be uploaded
 | 
|---|
| 180 |         .I TMSTAMP D
 | 
|---|
| 181 |         ..S NODE=""
 | 
|---|
| 182 |         ..I IVMFUTR N IVMMTIEN S IVMMTIEN=$$FUTURE(DFN,($E(IVMMTDT,1,3)-1),1)
 | 
|---|
| 183 |         ..Q:'IVMMTIEN
 | 
|---|
| 184 |         ..S NODE=$G(^DGMT(408.31,IVMMTIEN,2))
 | 
|---|
| 185 |         .S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
 | 
|---|
| 186 |         .I TMSTAMP,TMSTAMP=$P(NODE,"^",2),IVMMTDT=$P(NODE0,"^"),SOURCE=$P(NODE,"^",5),(HSDATE=$P(NODE,"^")) Q
 | 
|---|
| 187 |         .;
 | 
|---|
| 188 |         .D DELTYPE^IVMCMD(DFN,IVMMTDT,2)
 | 
|---|
| 189 |         .D EN^IVMCM1
 | 
|---|
| 190 |         ;
 | 
|---|
| 191 |         ;
 | 
|---|
| 192 | CT      ; If transmission is a Copay Test
 | 
|---|
| 193 |         N NODE0,RET,CODE,DATA
 | 
|---|
| 194 |         I IVMTYPE=2 D  I $D(HLERR) G PROCQ
 | 
|---|
| 195 |         .S IVMMTDT=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,2))
 | 
|---|
| 196 |         .S TMSTAMP=$$FMDATE^HLFNC($P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,25))
 | 
|---|
| 197 |         .S SOURCE=$P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,22)
 | 
|---|
| 198 |         .S IVMLAST=$$LST^DGMTU(DFN,$E(IVMMTDT,1,3)_1231,2)
 | 
|---|
| 199 |         .S IVMCPAY=$$RXST^IBARXEU(DFN)
 | 
|---|
| 200 |         .I $$AGE^IVMUFNC5(DT)>$$INCY^IVMUFNC5(IVMMTDT) D PROB^IVMCMC("Only Copay Tests in the current/previous income years are valid. (Not effective)") Q
 | 
|---|
| 201 |         .; - perform edit checks and file CT
 | 
|---|
| 202 |         .D CHKDT
 | 
|---|
| 203 |         .;deletion indicator sent?
 | 
|---|
| 204 |         .I $P($G(^TMP($J,"IVMCM","ZMT2")),HLFS,3)=HLQ D  Q
 | 
|---|
| 205 |         ..D
 | 
|---|
| 206 |         ...;if there is a future test for that income year, delete that
 | 
|---|
| 207 |         ...N IEN,DATA,IVMPAT
 | 
|---|
| 208 |         ...S IEN=$$FUTURE(DFN,($E(IVMMTDT,1,3)-1),2,.IVMPAT)
 | 
|---|
| 209 |         ...I IEN S DATA(.07)="" I $$UPD^DGENDBS(301.5,IVMPAT,.DATA)
 | 
|---|
| 210 |         ...I IEN,$D(^DGMT(408.31,IEN,0)) D
 | 
|---|
| 211 |         ....S IVMMTIEN=IEN
 | 
|---|
| 212 |         ....S IVMFUTR=1
 | 
|---|
| 213 |         ...E  D
 | 
|---|
| 214 |         ....S IVMFUTR=0
 | 
|---|
| 215 |         ..Q:('IVMMTIEN)
 | 
|---|
| 216 |         ..S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
 | 
|---|
| 217 |         ..I $$EN^IVMCMD(IVMMTIEN) D
 | 
|---|
| 218 |         ...S RET=$$LST^DGMTU(DFN,DT,IVMTYPE)
 | 
|---|
| 219 |         ...S CODE=$S(($E($P(RET,"^",2),1,3)=$E(DT,1,3)):$P(RET,"^",4),1:"")
 | 
|---|
| 220 |         ...D ADD^IVMCMB(DFN,IVMTYPE,$S(IVMFUTR:"DELETE FUTR TEST",1:"DELETE PRMRY TEST"),+$G(NODE0),$$GETCODE^DGMTH($P(NODE0,"^",3)),CODE)
 | 
|---|
| 221 |         .;
 | 
|---|
| 222 |         .;check timestamp - if matches current primary test, then this is a duplicate and does not need to be uploaded
 | 
|---|
| 223 |         .I TMSTAMP D
 | 
|---|
| 224 |         ..S NODE=""
 | 
|---|
| 225 |         ..I IVMFUTR N IVMMTIEN S IVMMTIEN=$$FUTURE(DFN,($E(IVMMTDT,1,3)-1),2)
 | 
|---|
| 226 |         ..Q:'IVMMTIEN
 | 
|---|
| 227 |         ..S NODE=$G(^DGMT(408.31,IVMMTIEN,2))
 | 
|---|
| 228 |         .S NODE0=$G(^DGMT(408.31,IVMMTIEN,0))
 | 
|---|
| 229 |         .I TMSTAMP,TMSTAMP=$P(NODE,"^",2),IVMMTDT=$P(NODE0,"^"),SOURCE=$P(NODE,"^",5) Q
 | 
|---|
| 230 |         .;
 | 
|---|
| 231 |         .D DELTYPE^IVMCMD(DFN,IVMMTDT,1)
 | 
|---|
| 232 |         .D EN^IVMCM1
 | 
|---|
| 233 |         ;
 | 
|---|
| 234 | IS      ; - If transmission is income screening info only then do not process
 | 
|---|
| 235 |         ; - outside of the scope of MTS
 | 
|---|
| 236 |         I IVMTYPE=3 S IVMMTDT=0
 | 
|---|
| 237 |         ;
 | 
|---|
| 238 | LTC     ; If transmission contains a Long Term Care Test (TYPE 4 TEST)
 | 
|---|
| 239 |         I $P($G(^TMP($J,"IVMCM","ZMT4")),HLFS,2) D LTC^IVMCM1
 | 
|---|
| 240 |         ;
 | 
|---|
| 241 | PROCQ   ;
 | 
|---|
| 242 |         ; release locks used to sychronize upload with local income test options
 | 
|---|
| 243 |         D RELLOCKS^IVMCUPL(DFN)
 | 
|---|
| 244 |         Q
 | 
|---|
| 245 |         ;
 | 
|---|
| 246 | CHKDT   ; check date of income test being uploaded
 | 
|---|
| 247 |         ; Is it a future date?  If so, set IVMFUTR=1
 | 
|---|
| 248 |         ;
 | 
|---|
| 249 |         ; IVMMTIEN is the IEN of current primary test for the year
 | 
|---|
| 250 |         ;
 | 
|---|
| 251 |         I $E($P(IVMLAST,"^",2),1,3)=$E(IVMMTDT,1,3) S IVMMTIEN=+IVMLAST
 | 
|---|
| 252 |         I IVMMTDT>DT S IVMFUTR=1
 | 
|---|
| 253 |         Q
 | 
|---|
| 254 | FUTURE(DFN,YEAR,TYPE,IVMPAT)    ;
 | 
|---|
| 255 |         ;Returns the ien of the future test, if there is one
 | 
|---|
| 256 |         ;Inputs:  DFN
 | 
|---|
| 257 |         ;         YEAR  - income year
 | 
|---|
| 258 |         ;         TYPE - type of test
 | 
|---|
| 259 |         ;Output:
 | 
|---|
| 260 |         ;  function value - ien of future means test, if there is one, "" otherwise
 | 
|---|
| 261 |         ;  IVMPAT - Pointer to the IVM Patient file for the income year if there is an entry (pass by reference)
 | 
|---|
| 262 |         ;
 | 
|---|
| 263 |         N RET
 | 
|---|
| 264 |         S RET=""
 | 
|---|
| 265 |         S IVMPAT=$$FIND^IVMPLOG(DFN,YEAR)
 | 
|---|
| 266 |         I IVMPAT S RET=$P($G(^IVM(301.5,IVMPAT,0)),"^",$S(TYPE=1:6,1:7))
 | 
|---|
| 267 |         Q RET
 | 
|---|