| 1 | IBAECM2 ;WOIFO/SS-LTC PHASE 2 MONTHLY JOB ; 20-FEB-02 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**176,198,188**;21-MAR-94 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ; | 
|---|
| 6 | ;Copay calculation for the patient | 
|---|
| 7 | ;Input: | 
|---|
| 8 | ;IBMDS - days array | 
|---|
| 9 | ; IBMDS(0)-first day of the month | 
|---|
| 10 | ; IBMDS(1)-last day of the month | 
|---|
| 11 | ; IBMDS(2)-yyymm (like 30201 - for Jan 2002) | 
|---|
| 12 | ;IBDFN - dfn | 
|---|
| 13 | ;IBSTART - date to start calclation from, | 
|---|
| 14 | ; normally it is the first day of the month, | 
|---|
| 15 | ; but for very first time it will be the effective date | 
|---|
| 16 | ;IBCLKIEN - 351.81 ien | 
|---|
| 17 | ;returns 0 if no charges for any reason | 
|---|
| 18 | ;otherwise returns 1 | 
|---|
| 19 | PROCPAT(IBMDS,IBDFN,IBSTART,IBCLKIEN) ; | 
|---|
| 20 | ;IBCHRG - charge array, is used for SEND2AR, contains all charges for | 
|---|
| 21 | ;the patient for this month | 
|---|
| 22 | ;one day may contain only one rate (charge), that prevents duplications | 
|---|
| 23 | ;   "A",IBDAY,"R"=rate^ien_of_#350.1(i.e.IB action type) | 
|---|
| 24 | ;   "A",IBDAY,"T"=type or care^source^date | 
|---|
| 25 | ;where | 
|---|
| 26 | ; outpatient: | 
|---|
| 27 | ;   type or care -  1 | 
|---|
| 28 | ;   source - ien of #409.68 | 
|---|
| 29 | ;   date -  date of service | 
|---|
| 30 | ; inpatient: | 
|---|
| 31 | ;   type or care -  2 | 
|---|
| 32 | ;   source -  ien of #405 | 
|---|
| 33 | ;   date - date of admission | 
|---|
| 34 | N IBCHRG | 
|---|
| 35 | N IBDAY,IBDATE,IBINPAT,IBOUTPAT,IBRET,IBCMCA | 
|---|
| 36 | N IBINPINF,IBADM1,IBVISIT,IBCOMPEN,IBV1,IBV2 | 
|---|
| 37 | N IBLDINP,IB40968,IBFDAY | 
|---|
| 38 | S IBCHRG=0,IBLDINP="^" | 
|---|
| 39 | D CLEAN^IBAECM1(IBDFN) | 
|---|
| 40 | ; determine first day (IBFDAY) of FOR cycle: | 
|---|
| 41 | S IBFDAY=1 ;default | 
|---|
| 42 | S IBSTART=+$G(IBSTART) | 
|---|
| 43 | ;if effective date is greater than the last day of this month, then do nothing | 
|---|
| 44 | Q:IBSTART>IBMDS(1) IBCHRG | 
|---|
| 45 | ;if effective date is in current month, then cycle starts from | 
|---|
| 46 | ;this day of the month | 
|---|
| 47 | S IBFDAY=+$E(IBSTART,6,7) | 
|---|
| 48 | ;if effective date is less than this month, then starts from | 
|---|
| 49 | ;the first day of the month | 
|---|
| 50 | S:IBSTART<IBMDS(0) IBFDAY=1 | 
|---|
| 51 | ;---- | 
|---|
| 52 | ; use LOS=1 to get patient status | 
|---|
| 53 | S IBRET=+$$LTCST^IBAECU(IBDFN,IBMDS(1),1) | 
|---|
| 54 | ;** EXEMPTION from co-pay ** | 
|---|
| 55 | I IBRET=1 Q IBCHRG  ;>>QUIT | 
|---|
| 56 | ; | 
|---|
| 57 | ;get all data about all inpatient episodes | 
|---|
| 58 | ;IBINPAT'=0 - there are inpatient episodes | 
|---|
| 59 | S IBINPAT=$$INPINFO^IBAECU2(IBMDS(0),IBMDS(1),IBDFN,"IBMJINP",1) | 
|---|
| 60 | ;get all data about all outpatient episodes | 
|---|
| 61 | ;IBOUTPAT'=0 - there are outpatient episodes | 
|---|
| 62 | S IBOUTPAT=$$OUTPINFO^IBAECU3(IBMDS(0),IBMDS(1),IBDFN,"IBMJOUT") | 
|---|
| 63 | ;no 1010EC - send e-mail and quit | 
|---|
| 64 | I IBRET=0 D  Q IBCHRG  ;>>QUIT | 
|---|
| 65 | . S IBV1=$O(^TMP($J,"IBMJINP",IBDFN,0)) | 
|---|
| 66 | . I +IBV1>0 S IBV1=+$G(^TMP($J,"IBMJINP",IBDFN,IBV1)) | 
|---|
| 67 | . I +IBV1=0 S IBV1=$O(^TMP($J,"IBMJOUT",IBDFN,IBV1)) | 
|---|
| 68 | . I +IBV1=0 S IBV1=IBMDS(0) | 
|---|
| 69 | . ; changed in 188 to eliminate some messages when nothing there | 
|---|
| 70 | . I IBINPAT'=0!(IBOUTPAT'=0) D MESS10EC^IBAECU5(IBDFN,IBV1) | 
|---|
| 71 | . D CLEAN^IBAECM1(IBDFN) | 
|---|
| 72 | . ; update or clean out current events date | 
|---|
| 73 | . S DR=".07///"_$S($D(^DPT(IBDFN,.1)):$E(DT,1,5)_"01",1:"@") | 
|---|
| 74 | . S DIE="^IBA(351.81,",DA=IBCLKIEN D ^DIE | 
|---|
| 75 | ; | 
|---|
| 76 | ; if no inpatient, no outpatient episodes and still 21 free days | 
|---|
| 77 | ; remain - someone cancelled episodes and we cancel the clock | 
|---|
| 78 | I IBINPAT=0,IBOUTPAT=0,$P($G(^IBA(351.81,IBCLKIEN,0)),"^",6)=21  D  Q IBCHRG  ;>>QUIT | 
|---|
| 79 | . D CLCKADJ^IBAECU4("C",IBCLKIEN,IBDFN,"^",IBMDS(1)) | 
|---|
| 80 | . S IBCHRG("A")=0 ; no charges | 
|---|
| 81 | . D CLEAN^IBAECM1(IBDFN) | 
|---|
| 82 | ; | 
|---|
| 83 | ; check correctness of 21 days clock if error then fix it and notify the users | 
|---|
| 84 | S IBV2=$$CHKDSERR^IBAECU4(IBCLKIEN,IBDFN) | 
|---|
| 85 | I IBV2<0 D FIX21CLK^IBAECU4(IBCLKIEN) | 
|---|
| 86 | ; ==============Go thru each day ============================= | 
|---|
| 87 | F IBDAY=IBFDAY:1:IBMDS Q:IBCLKIEN=0  S IBDATE=$$MKDATE^IBAECU4(IBMDS(2),IBDAY) D | 
|---|
| 88 | . ;***** Gathering all necessary info ****** | 
|---|
| 89 | . ; C&P status | 
|---|
| 90 | . S IBCOMPEN=$$ISCOMPEN^IBAECU5(IBDFN,IBDATE) | 
|---|
| 91 | . ; INPATIENT episodes | 
|---|
| 92 | . S IBADM1=0 ;adm ien | 
|---|
| 93 | . S IBINPINF="" K IBINPINF("M"),IBINPINF("L") | 
|---|
| 94 | . ; is any inpatient LTC this day? | 
|---|
| 95 | . S IBINPINF=$$ISINPAT^IBAECU2(IBDFN,IBDATE,"IBMJINP",.IBINPINF) | 
|---|
| 96 | . ; | 
|---|
| 97 | . ; if the patient has inpatient service in the last day of the | 
|---|
| 98 | . ; processed month, then "CURRENT EVENTS DATE" in LTC clock (#351.81) | 
|---|
| 99 | . ; must be set to the 1st day of the following month to indicate that | 
|---|
| 100 | . ; the patient must be checked for LTC copay by MJ next month. | 
|---|
| 101 | . ; Thus if so we set IBLDINP to IBINPINF (calcualted for the last day | 
|---|
| 102 | . ; of the processed month)(see CLCKADJ) | 
|---|
| 103 | . I IBMDS(1)=IBDATE S IBLDINP=IBINPINF | 
|---|
| 104 | . ; OUTPATIENT episodes | 
|---|
| 105 | . S IB40968=0 | 
|---|
| 106 | . S IBVISIT="" K IBVISIT("M"),IBVISIT("L") | 
|---|
| 107 | . ;is there any outp episode with this day? | 
|---|
| 108 | . S IBVISIT=$$ISOUTP^IBAECU3(IBDFN,IBDATE,"IBMJOUT",.IBVISIT) | 
|---|
| 109 | . ; If there is LTC event this day (IBDATE) and if current | 
|---|
| 110 | . ; CLOCK BEGIN DATE > IBDATE then change it to IBDATE | 
|---|
| 111 | . ; (& reset its expiration date) | 
|---|
| 112 | . I +IBVISIT!(+IBINPINF) I $P($G(^IBA(351.81,IBCLKIEN,0)),"^",3)>IBDATE D RESET21^IBAECU4(IBCLKIEN,IBDATE,IBDFN) | 
|---|
| 113 | . ;***************************************** | 
|---|
| 114 | . ; check 21 days clock file | 
|---|
| 115 | . ; check expiration date,etc of 21 clock | 
|---|
| 116 | . S IBCLKIEN=$$CH21BFR^IBAECM1(IBCLKIEN,IBDATE,IBDFN) ; | 
|---|
| 117 | . I IBCLKIEN=0 Q  ;ERROR - new entry in #351.81 was not created - quit ! | 
|---|
| 118 | . ; | 
|---|
| 119 | . ; 1. LTC inpatient in bed - ALWAYS charge him | 
|---|
| 120 | . S IBADM1=+$O(IBINPINF("L","SD",0)) | 
|---|
| 121 | . I IBADM1>0 D  Q  ;>>>>QUIT - GO to NEXT DAY | 
|---|
| 122 | . . ;look for and cancel Means Test Outpatient charges for this date | 
|---|
| 123 | . . D CHKMTOUT^IBAECU3(IBDFN,IBDATE,"IBMJOUT") | 
|---|
| 124 | . . ; check expiration date,etc of 21 clock | 
|---|
| 125 | . . ; $$EXEMPT21 checks if vet is eligible for 21 clock exemption | 
|---|
| 126 | . . ; 1 - if exempted, don't charge the patient | 
|---|
| 127 | . . I $$EXEMPT21^IBAECU4(IBCLKIEN)=1 D  Q | 
|---|
| 128 | . . . ;add new exempt day to LTC clock | 
|---|
| 129 | . . . D ADD21DAY^IBAECM1(IBCLKIEN,IBDATE,IBDFN) | 
|---|
| 130 | . . ; otherwise no 21 clock exemption - cretae a charge | 
|---|
| 131 | . . ;get rate for this treating specialty | 
|---|
| 132 | . . S IBCHRG("A",IBDAY,"R")=$$GETRATE^IBAECU3(2,+$G(IBINPINF("L","SD",IBADM1)),IBDATE)_"^"_$P($G(IBINPINF("L","SD",IBADM1)),"^",2) | 
|---|
| 133 | . . S IBCHRG("A",IBDAY,"T")="2^"_IBADM1_"^"_$P($G(IBINPINF("L","SD",IBADM1)),"^",3) ;inpatient | 
|---|
| 134 | . . S IBCHRG=IBCHRG+1 | 
|---|
| 135 | . ; | 
|---|
| 136 | . ; 2. MeansTest inpatient in bed or in AA,UA or ASIH | 
|---|
| 137 | . ; do not charge vet for LTC outpatient visit | 
|---|
| 138 | . ; - MT inpatient care has precedence on LTC outpatient visit if vet is in bed. | 
|---|
| 139 | . ; - if MT inpatient in AA,UA,ASIH, the current MT rule don't allow to charge him | 
|---|
| 140 | . ; for MT outpatien visits in AA,UA&ASIH. It was decided to applied the same rules | 
|---|
| 141 | . ; to LTC outpatient visits | 
|---|
| 142 | . S IBADM1=+$O(IBINPINF("M",0)) | 
|---|
| 143 | . Q:IBADM1>0  ;............................>>>>QUIT - GO to NEXT DAY | 
|---|
| 144 | . ; | 
|---|
| 145 | . ; 3. LTC inpatient in AA,UA or ASIH | 
|---|
| 146 | . ; do not charge for any (MT or LTC) outpatient visits (see explanation for 2.) | 
|---|
| 147 | . S IBADM1=+$O(IBINPINF("L","LD",0)) | 
|---|
| 148 | . I IBADM1>0 D  Q  ;>>>>QUIT - GO to NEXT DAY | 
|---|
| 149 | . . ;look for and cancel Means Test Outpatient charges for this date | 
|---|
| 150 | . . ;(at this point can be only outpatient MT charges, | 
|---|
| 151 | . . ;because inpatient MT has gone earlier in 2.) | 
|---|
| 152 | . . D CHKMTOUT^IBAECU3(IBDFN,IBDATE,"IBMJOUT") | 
|---|
| 153 | . ; | 
|---|
| 154 | . ; 4. C&P exam | 
|---|
| 155 | . ; if C&P exam then any outpatient visits are exempted,no charge,goto NEXT DAY | 
|---|
| 156 | . Q:IBCOMPEN=1  ;............................>>>>QUIT - GO to NEXT DAY | 
|---|
| 157 | . ; | 
|---|
| 158 | . ; 5. LTC outpatient visit | 
|---|
| 159 | . ;check if vet has a LTC outpatient visit | 
|---|
| 160 | . S IB40968=+$O(IBVISIT("L",0)) | 
|---|
| 161 | . I IB40968>0 D | 
|---|
| 162 | . . ;look for and cancel Means Test Outpatient charges for this date | 
|---|
| 163 | . . D CHKMTOUT^IBAECU3(IBDFN,IBDATE,"IBMJOUT") | 
|---|
| 164 | . . ; $$EXEMPT21 checks if vet is eligible for 21 clock exemption | 
|---|
| 165 | . . ; 1 - if exempted, don't charge the patient | 
|---|
| 166 | . . I $$EXEMPT21^IBAECU4(IBCLKIEN)=1 D  Q | 
|---|
| 167 | . . . ;add new exempt day to LTC clock | 
|---|
| 168 | . . . D ADD21DAY^IBAECM1(IBCLKIEN,IBDATE,IBDFN) | 
|---|
| 169 | . . ; otherwise no 21 clock exemption - cretae a charge | 
|---|
| 170 | . . ;get rate for LTC visit on this date | 
|---|
| 171 | . . S IBCHRG("A",IBDAY,"R")=$$GETRATE^IBAECU3(1,+$G(IBVISIT("L",IB40968)),IBDATE)_"^"_$P($G(IBVISIT("L",IB40968)),"^",2) | 
|---|
| 172 | . . S IBCHRG("A",IBDAY,"T")="1^"_IB40968_"^"_$$MKDATE^IBAECU4(IBMDS(2),IBDAY) ;outpatient | 
|---|
| 173 | . . S IBCHRG=IBCHRG+1 | 
|---|
| 174 | . Q | 
|---|
| 175 | ;============================================================= | 
|---|
| 176 | I IBCLKIEN=0 Q -1  ;error | 
|---|
| 177 | ;return month copay | 
|---|
| 178 | S IBCMCA=$$CLCK180(IBDFN,$S(IBSTART>IBMDS(0):IBSTART,1:IBMDS(0)),IBMDS(1),"IBMJINP") | 
|---|
| 179 | ; create charges for | 
|---|
| 180 | ; check expiration date,etc of 21 clock | 
|---|
| 181 | I IBCHRG>0 D SEND2AR^IBAECU5(IBDFN,.IBCHRG,.IBMDS,+IBCMCA) | 
|---|
| 182 | ;clock adjustment | 
|---|
| 183 | D CLCKADJ^IBAECU4("P",IBCLKIEN,IBDFN,IBLDINP,IBMDS(1)) | 
|---|
| 184 | D CLEAN^IBAECM1(IBDFN) | 
|---|
| 185 | Q IBCHRG | 
|---|
| 186 | ; | 
|---|
| 187 | ;returns "max_monthly_calculated_copay"^"is_181+_case" | 
|---|
| 188 | ;determine 181+ case (takes care about 30 days "gap" between | 
|---|
| 189 | ;prior 181+ and current admission) | 
|---|
| 190 | CLCK180(IBDFN,IBBEGDT,IBENDDT,IBLBL) ; | 
|---|
| 191 | ;array for adm info | 
|---|
| 192 | N IBLNGADM,IBADMINF,IBRET1,IBCMC,IS180CLK,IBFL5,IB30BACK | 
|---|
| 193 | S IBADMINF="^" | 
|---|
| 194 | ; if we have active admission that started before IBMDS(0) then | 
|---|
| 195 | ; What is the length of this admission? | 
|---|
| 196 | ; we need IBLNGADM to call $$COPAY^EASECCAL; If there is | 
|---|
| 197 | ; no admission started before IBMDS(0) then sets IBLNGADM=1 | 
|---|
| 198 | S IBLNGADM=$$DAYS180^IBAECM1(IBBEGDT,IBENDDT,IBDFN,IBLBL,.IBADMINF) | 
|---|
| 199 | ; if none then check if another admission 30 days before (see SDD) | 
|---|
| 200 | I IBLNGADM=1 D | 
|---|
| 201 | . S IBFL5=$$ISLTC^IBAECU5(IBDFN,IBLBL) | 
|---|
| 202 | . Q:IBFL5=0 | 
|---|
| 203 | . K ^TMP($J,"180DAYS") | 
|---|
| 204 | . S IB30BACK=$$CHNGDATE^IBAECU4(IBFL5,-30) | 
|---|
| 205 | . I $$INPINFO^IBAECU2(IB30BACK,IBFL5,IBDFN,"180DAYS",1)=0 Q | 
|---|
| 206 | . K IBADMINF S IBADMINF="^" | 
|---|
| 207 | . S IBLNGADM=$$DAYS180^IBAECM1(IB30BACK,IBFL5,IBDFN,"180DAYS",.IBADMINF) | 
|---|
| 208 | ; get patient status | 
|---|
| 209 | S IBRET1=$$LTCST^IBAECU(IBDFN,IBENDDT,IBLNGADM) | 
|---|
| 210 | ;calculate a proper LTC Monthly Copay Amount and put it in IBCMC | 
|---|
| 211 | ;(max amount patient should pay monthly) | 
|---|
| 212 | ;IS180CLK =1 if patient has >180 days of continious LTC | 
|---|
| 213 | S IS180CLK=$$MONTHMAX^IBAECM1(IBDFN,.IBADMINF,IBRET1,IBLNGADM,.IBCMC) | 
|---|
| 214 | K ^TMP($J,"180DAYS") | 
|---|
| 215 | Q +IBCMC_"^"_IS180CLK | 
|---|
| 216 | ; | 
|---|