| 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 |  ;
 | 
|---|