| 1 | IBEMTSCU ;ALB/RFJ-print billable types for visit copay ;23 Nov 01
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**167,177,187**;21-MAR-94
 | 
|---|
| 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  Q
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | EFFDT() ;effect date Visit Copay 2
 | 
|---|
| 7 |  Q 3021001  ;OCT 1,2002
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 | ADD(IBSTOPCD,IBEFFDT,IBBILTYP,IBDESC,IBOVER) ;  add a stop code to file 352.5
 | 
|---|
| 10 |  ;  ibstopcd = 3 or 6 digit stop code to add
 | 
|---|
| 11 |  ;  ibeffdt  = effective date, internal fileman form (ex:3011206)
 | 
|---|
| 12 |  ;             if effective date is not passed, it uses today (dt)
 | 
|---|
| 13 |  ;  ibbiltyp = billable type (B=basic, S=specialty, N=non-billable)
 | 
|---|
| 14 |  ;             default is non-billable if a B or S is not passed
 | 
|---|
| 15 |  ;  ibdesc   = description of stop code
 | 
|---|
| 16 |  ;  ibover   = if the code belongs to Override table
 | 
|---|
| 17 |  ;  returns 1 if added, -#^error if not added
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 |  N D,D0,DA,DI,DIC,DIE,DLAYGO,DQ,DR,IBDA,X,Y,IBZ
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  ;  check length of stop code
 | 
|---|
| 22 |  I '(($L(IBSTOPCD)=3)!($L(IBSTOPCD)=6)) Q "-1^STOP CODE "_IBSTOPCD_" NOT 3 OR 6 CHARACTERS IN LENGTH."
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ;  change billable type code to match set of codes in file 352.5
 | 
|---|
| 25 |  S IBBILTYP=$S(IBBILTYP="B":1,IBBILTYP="S":2,1:0)
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  S (DIC,DIE)="^IBE(352.5,",DIC(0)="L",DLAYGO=352.5
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  ;  check to see if entry is in the file
 | 
|---|
| 30 |  S IBDA=$O(^IBE(352.5,"AEFFDT",IBSTOPCD,-IBEFFDT,0))
 | 
|---|
| 31 |  I IBDA S IBZ=$G(^IBE(352.5,IBDA,0)) D  Q 1
 | 
|---|
| 32 |  .   S DR=""
 | 
|---|
| 33 |  .   ;  check to see if the correct billable type is set correctly
 | 
|---|
| 34 |  .   I $P(IBZ,"^",3)'=IBBILTYP S DR=".03////"_IBBILTYP_";"
 | 
|---|
| 35 |  .   ;  check description
 | 
|---|
| 36 |  .   I $P(IBZ,"^",4)'=$E(IBDESC,1,30) S DR=DR_".04////"_$E(IBDESC,1,30)
 | 
|---|
| 37 |  .   ;  if not, change it
 | 
|---|
| 38 |  .   I $L(DR) S DA=IBDA D ^DIE
 | 
|---|
| 39 |  ;
 | 
|---|
| 40 |  ;  add entry to file 352.5
 | 
|---|
| 41 |  S X=IBSTOPCD
 | 
|---|
| 42 |  S DIC("DR")=".02////"_IBEFFDT_";.03////"_IBBILTYP_";.04////"_$E(IBDESC,1,30)_";"
 | 
|---|
| 43 |  S:$G(IBOVER)=1 DIC("DR")=DIC("DR")_".05////1;"
 | 
|---|
| 44 |  D FILE^DICN
 | 
|---|
| 45 |  Q 1
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 | DIQ407(DA,DR) ;  diq call to retrieve data for dr fields in file 40.7
 | 
|---|
| 49 |  N D0,DIC,DIQ,DIQ2,YY
 | 
|---|
| 50 |  K IBSCDATA(40.7,DA)
 | 
|---|
| 51 |  I $G(DR)="" S DR=".01:4;"
 | 
|---|
| 52 |  S DIQ(0)="IE",DIC="^DIC(40.7,",DIQ="IBSCDATA" D EN^DIQ1
 | 
|---|
| 53 |  Q
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  ;0 - active
 | 
|---|
| 56 | ISINACT(IBCODE) ;
 | 
|---|
| 57 |  Q:$L(IBCODE)=6 $$INACTIVE($E(IBCODE,1,3))+$$INACTIVE($E(IBCODE,4,6))
 | 
|---|
| 58 |  Q $$INACTIVE(IBCODE)
 | 
|---|
| 59 |  ;
 | 
|---|
| 60 | INACTIVE(IBSTCODE) ;  return 1 if inactive in file 40.7
 | 
|---|
| 61 |  ;  also, return ibscdata(da for stop code entries in 40.7)
 | 
|---|
| 62 |  N DA,IBSCDATA,RESULT
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 |  ;  default is inactive
 | 
|---|
| 65 |  S RESULT=1
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  S DA=0 F  S DA=$O(^DIC(40.7,"C",IBSTCODE,DA)) Q:'DA  D
 | 
|---|
| 68 |  . D DIQ407(DA,2)
 | 
|---|
| 69 |  . I 'IBSCDATA(40.7,DA,2,"I") S RESULT=0
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 |  Q RESULT
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | ASK() ; ask if the user wants to enter a stop code or select a clinic
 | 
|---|
| 75 |  ; return will be what entry point to use
 | 
|---|
| 76 |  N DIR,X,Y,DTOUT,DUOUT,DIRUT,DIROUT
 | 
|---|
| 77 |  S DIR(0)="S^C:Clinic;S:Stop Code" D ^DIR
 | 
|---|
| 78 |  Q $S(Y="C":"C",Y="S":"S",1:"")
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 | ASKSCODE(IBPROMPT) ;  ask and return selected stop code from file 352.5
 | 
|---|
| 81 |  ;  ibprompt = optional prompt to display
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 |  N DIC,DILN,I,X,Y,DTOUT,DUOUT,DIRUT,DIROUT
 | 
|---|
| 84 |  S DIC="^IBE(352.5,",DIC(0)="QEAM"
 | 
|---|
| 85 |  S DIC("A")="Select OUTPATIENT VISIT STOP CODE: "
 | 
|---|
| 86 |  I $G(IBPROMPT)'="" S DIC("A")=IBPROMPT
 | 
|---|
| 87 |  S DIC("S")="I $$STOPSCRN^IBEMTSCU(Y)"
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  W ! D ^DIC
 | 
|---|
| 90 |  I Y<1 Q -1
 | 
|---|
| 91 |  Q +Y
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 | STOPSCRN(IBX) ; screens out so only active and current ones are selectable
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 |  ; if we have no from date, all are selectable
 | 
|---|
| 97 |  I '$G(IBFR) Q 1
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 |  N IBZ,IBAX,IBS,IBEFFDT
 | 
|---|
| 100 |  S IBZ=$G(^IBE(352.5,IBX,0)),IBS=$P(IBZ,"^")
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 |  ; is the effective date for this entry in the future?
 | 
|---|
| 103 |  I $P(IBZ,"^",2)>IBFR Q 0
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 |  ;  get the effective date for stop code and visit date
 | 
|---|
| 106 |  S IBEFFDT=$O(^IBE(352.5,"AEFFDT",IBS,-(IBFR+.1)))
 | 
|---|
| 107 |  I 'IBEFFDT Q 0
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 |  ;  get the billable entry to compare
 | 
|---|
| 110 |  S IBAX=$O(^IBE(352.5,"AEFFDT",IBS,IBEFFDT,0))
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 |  Q $S(IBX=IBAX:1,1:0)
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 | ASKSC(IBVISTDT) ; ask for a clinic to look up the stop code
 | 
|---|
| 115 |  ; it will prompt for a clinic selection, and return the stop
 | 
|---|
| 116 |  ; code number in 352.5 associated with the clinic
 | 
|---|
| 117 |  N DIC,X,Y,IB407,IBEFDT,IBCLIN
 | 
|---|
| 118 |  S DIC="^SC(",DIC(0)="AEMQZ",DIC("A")="Select CLINIC: ",DIC("S")="I $P(^(0),U,3)=""C""" D ^DIC Q:Y<1 -1
 | 
|---|
| 119 |  S IBCLIN=+Y
 | 
|---|
| 120 |  ;primary
 | 
|---|
| 121 |  S IB407=$P(Y(0),"^",7)
 | 
|---|
| 122 |  S IBCODE1=$$GETCODE(IB407)
 | 
|---|
| 123 |  ; if < eff date
 | 
|---|
| 124 |  Q:IBVISTDT<$$EFFDT() $$GET3525(+IBCODE1,0,IBVISTDT)
 | 
|---|
| 125 |  ;secondary
 | 
|---|
| 126 |  ; get the secondary stop code value
 | 
|---|
| 127 |  S IBCODE2=$$GETCRED(IBCLIN)
 | 
|---|
| 128 |  ;return proper IEN of #352.5
 | 
|---|
| 129 |  Q +$$GET3525(IBCODE1,IBCODE2,IBVISTDT)
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 |  ;
 | 
|---|
| 132 | GETTYPE(IBSTOPCD,IBVISTDT) ;  lookup billable type
 | 
|---|
| 133 |  ;  input ibstopcd = stop code (.01 field entry in file 352.5)
 | 
|---|
| 134 |  ;        ibvistdt = visit date in fileman format
 | 
|---|
| 135 |  ;
 | 
|---|
| 136 |  ;  returns     -1 = stop code/effective date not found or defined
 | 
|---|
| 137 |  ;               0 = non-billable
 | 
|---|
| 138 |  ;               1 = basic rate
 | 
|---|
| 139 |  ;               2 = specialty rate
 | 
|---|
| 140 |  ;
 | 
|---|
| 141 |  N DA,IBEFFDT,RESULT
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  ;  get the effective date for stop code and visit date
 | 
|---|
| 144 |  S IBEFFDT=$O(^IBE(352.5,"AEFFDT",IBSTOPCD,-(IBVISTDT+.1)))
 | 
|---|
| 145 |  I 'IBEFFDT Q -1
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 |  ;  get the billable type
 | 
|---|
| 148 |  S DA=$O(^IBE(352.5,"AEFFDT",IBSTOPCD,IBEFFDT,0))
 | 
|---|
| 149 |  I 'DA Q -1
 | 
|---|
| 150 |  ;
 | 
|---|
| 151 |  ;  get the billable type
 | 
|---|
| 152 |  S RESULT=+$P($G(^IBE(352.5,DA,0)),"^",3)
 | 
|---|
| 153 |  Q RESULT
 | 
|---|
| 154 |  ;
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 | GETSC(IBSL,IBVISTDT) ;  return the ien of the entry in file 352.5.
 | 
|---|
| 157 |  ;  ibsl is the clinic stop code in 409.68.  find the matching
 | 
|---|
| 158 |  ;  entry in file 352.5.  the 352.5 entry is populated in the 350 field
 | 
|---|
| 159 |  ;  for reference using the ibstopda variable
 | 
|---|
| 160 |  ;    input ibsl = 409.68:ien
 | 
|---|
| 161 |  N IB407,IBCLIN,IBCODE1,IBCODE2
 | 
|---|
| 162 |  I $P(IBSL,":")'=409.68 Q ""
 | 
|---|
| 163 |  ;primary
 | 
|---|
| 164 |  ;this is the ien for file 40.7 (dbia402)
 | 
|---|
| 165 |  S IB407=+$P($G(^SCE(+$P(IBSL,":",2),0)),"^",3)
 | 
|---|
| 166 |  ;get the primary stop code value
 | 
|---|
| 167 |  S IBCODE1=+$$GETCODE(IB407)
 | 
|---|
| 168 |  ;if < eff date
 | 
|---|
| 169 |  Q:IBVISTDT<$$EFFDT() $$GET3525(+IBCODE1,0,IBVISTDT)
 | 
|---|
| 170 |  ;secondary
 | 
|---|
| 171 |  ;get clinic(#44) pointer from #409.68
 | 
|---|
| 172 |  S IBCLIN=+$P($G(^SCE(+$P(IBSL,":",2),0)),"^",4)
 | 
|---|
| 173 |  ;get the secondary stop code value
 | 
|---|
| 174 |  S IBCODE2=+$$GETCRED(IBCLIN)
 | 
|---|
| 175 |  ;return proper IEN of #352.5
 | 
|---|
| 176 |  Q $$GET3525(+IBCODE1,+IBCODE2,IBVISTDT)
 | 
|---|
| 177 |  ;
 | 
|---|
| 178 |  ;apply business rules, select appropr. code in #352.5 and return its IEN
 | 
|---|
| 179 |  ;if  not found then return ""
 | 
|---|
| 180 | GET3525(IBCODE1,IBCODE2,IBVISTDT) ;
 | 
|---|
| 181 |  Q:+IBCODE1=0 ""  ;must be defined as a required field in #44
 | 
|---|
| 182 |  Q:$L(+IBCODE1)'=3!(IBCODE1<0) ""
 | 
|---|
| 183 |  I $L(+IBCODE2)'=3!(IBCODE2<0) S IBCODE2=0
 | 
|---|
| 184 |  N IB6DIG
 | 
|---|
| 185 |  N IBEFDT1,IBIEN1,IBOVER1,IBTYPE1
 | 
|---|
| 186 |  N IBEFDT2,IBIEN2,IBOVER2,IBTYPE2
 | 
|---|
| 187 |  S (IBIEN1,IBIEN2,IBOVER1,IBOVER2)=0
 | 
|---|
| 188 |  ;------ find appropriate ien in file #352.5
 | 
|---|
| 189 |  S IB6DIG=$S(IBCODE2>0:IBCODE1_IBCODE2,1:IBCODE1)
 | 
|---|
| 190 |  ;in the #352.5 with appropriate eff date?
 | 
|---|
| 191 |  S IBEFDT1=+$O(^IBE(352.5,"AEFFDT",IB6DIG,-(IBVISTDT+.1)))
 | 
|---|
| 192 |  ;
 | 
|---|
| 193 |  ;A) if found and it is 6 or 3 digit code
 | 
|---|
| 194 |  I IBEFDT1 D  Q:IBIEN1>0 IBIEN1
 | 
|---|
| 195 |  . ;get the entry in 352.5 
 | 
|---|
| 196 |  . S IBIEN1=+$O(^IBE(352.5,"AEFFDT",IB6DIG,IBEFDT1,0))
 | 
|---|
| 197 |  ;
 | 
|---|
| 198 |  ;B) if not found and it is 3 digit - return nothing, BASIC applies
 | 
|---|
| 199 |  I +IBCODE2=0 Q ""
 | 
|---|
| 200 |  ;
 | 
|---|
| 201 |  ;C) if not found and it is 6 digit - try each separately
 | 
|---|
| 202 |  ;-- primary code
 | 
|---|
| 203 |  ;in the #352.5 "override" tables with appropriate eff date?
 | 
|---|
| 204 |  S IBEFDT1=+$O(^IBE(352.5,"AEFFDT",IBCODE1,-(IBVISTDT+.1)))
 | 
|---|
| 205 |  I IBEFDT1 D
 | 
|---|
| 206 |  . ;get the entry in 352.5 
 | 
|---|
| 207 |  . S IBIEN1=+$O(^IBE(352.5,"AEFFDT",IBCODE1,IBEFDT1,0))
 | 
|---|
| 208 |  . Q:IBIEN1=0
 | 
|---|
| 209 |  . S IBOVER1=+$P($G(^IBE(352.5,IBIEN1,0)),"^",5)
 | 
|---|
| 210 |  . S IBTYPE1=+$P($G(^IBE(352.5,IBIEN1,0)),"^",3)
 | 
|---|
| 211 |  ;-- secondary code
 | 
|---|
| 212 |  ;in the #352.5 "override" tables with appropriate eff date?
 | 
|---|
| 213 |  S IBEFDT2=+$O(^IBE(352.5,"AEFFDT",IBCODE2,-(IBVISTDT+.1)))
 | 
|---|
| 214 |  I IBEFDT2 D
 | 
|---|
| 215 |  . ;get the entry in 352.5 
 | 
|---|
| 216 |  . S IBIEN2=+$O(^IBE(352.5,"AEFFDT",IBCODE2,IBEFDT2,0))
 | 
|---|
| 217 |  . Q:IBIEN2=0
 | 
|---|
| 218 |  . S IBOVER2=+$P($G(^IBE(352.5,IBIEN2,0)),"^",5)
 | 
|---|
| 219 |  . S IBTYPE2=+$P($G(^IBE(352.5,IBIEN2,0)),"^",3)
 | 
|---|
| 220 |  ;
 | 
|---|
| 221 |  ; If not found in override tables 
 | 
|---|
| 222 |  ; - AND primary is not in #352.5 then return nothing, BASIC applies
 | 
|---|
| 223 |  ; - AND primary is in #352.5 then return IBIEN1
 | 
|---|
| 224 |  I IBOVER1=0,IBOVER2=0 Q $S(IBIEN1>0:IBIEN1,1:"")
 | 
|---|
| 225 |  ;
 | 
|---|
| 226 |  I IBOVER1=0,IBOVER2'=0 Q +IBIEN2
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  I IBOVER1'=0,IBOVER2=0 Q +IBIEN1
 | 
|---|
| 229 |  ;
 | 
|---|
| 230 |  ; If IBOVER1'=0,IBOVER2'=0
 | 
|---|
| 231 |  I IBTYPE1=0 Q +IBIEN1  ;NON
 | 
|---|
| 232 |  I IBTYPE2=0 Q +IBIEN2  ;NON
 | 
|---|
| 233 |  I IBTYPE1=2 Q +IBIEN1  ;SPEC
 | 
|---|
| 234 |  I IBTYPE2=2 Q +IBIEN2  ;SPEC
 | 
|---|
| 235 |  Q +IBIEN1  ;BASIC
 | 
|---|
| 236 |  ;
 | 
|---|
| 237 |  ;
 | 
|---|
| 238 | OPT ;  perform outpatient copay edits for visits after 11/29/01
 | 
|---|
| 239 |  ;  called from IBECEA3
 | 
|---|
| 240 |  ;
 | 
|---|
| 241 |  ;  return IBSTOPDA (if selected) to be stored in file 350
 | 
|---|
| 242 |  K IBSTOPDA,IBANS
 | 
|---|
| 243 |  ;
 | 
|---|
| 244 |  ;  ask selection by clinic or stop code
 | 
|---|
| 245 |  S IBANS=$$ASK I '$L(IBANS) W !!,"Charge NOT added." S IBY=-1 Q
 | 
|---|
| 246 |  ;
 | 
|---|
| 247 |  ;  ask clinic stop to calc charges
 | 
|---|
| 248 |  S IBSTOPDA=+$S(IBANS="S":$$ASKSCODE,1:$$ASKSC(IBFR))
 | 
|---|
| 249 |  I IBSTOPDA<0 S IBY=-1 W !!,"Charge NOT added." K IBSTOPDA Q
 | 
|---|
| 250 |  ;
 | 
|---|
| 251 |  ;  user selected a non-billable clinic stop
 | 
|---|
| 252 |  I IBSTOPDA>0,'$P($G(^IBE(352.5,IBSTOPDA,0)),"^",3) W !?5,"********** This is a NON-BILLABLE Clinic Stop **********",!?5,"Select an active billable clinic stop or press RETURN to exit." G OPT
 | 
|---|
| 253 |  ;  user selected an inactive stop code
 | 
|---|
| 254 |  I IBSTOPDA>0,$$ISINACT($P($G(^IBE(352.5,IBSTOPDA,0)),"^")) W !?5,"********** This is a INACTIVE Clinic Stop in file #40.7 **********",!?5,"Select an active billable clinic stop or press RETURN to exit." G OPT
 | 
|---|
| 255 |  ;
 | 
|---|
| 256 |  ;  *** get the charge ***
 | 
|---|
| 257 |  ;  return IBTO, IBUNIT, IBEVDA, IBCHG for processing in IBECEAU3
 | 
|---|
| 258 |  N IBDT,IBTYPE,IBX
 | 
|---|
| 259 |  S (IBDT,IBTO)=IBFR       ;visit date
 | 
|---|
| 260 |  S IBX="O" ;O for outpatient
 | 
|---|
| 261 |  S IBUNIT=1,IBEVDA="*"
 | 
|---|
| 262 |  S IBTYPE=1 ;BASIC by default
 | 
|---|
| 263 |  S:IBSTOPDA>0 IBTYPE=$P(^IBE(352.5,IBSTOPDA,0),"^",3)  ;type of charge, basic or specialty
 | 
|---|
| 264 |  D TYPE^IBAUTL2
 | 
|---|
| 265 |  I IBY<0 Q
 | 
|---|
| 266 |  ;
 | 
|---|
| 267 |  W !!,"Charge to be billed under the ",$$TYPE^IBEMTSCR($P($G(^IBE(352.5,IBSTOPDA,0)),"^",3))," Rate --> $",$J(IBCHG,0,2)
 | 
|---|
| 268 |  Q
 | 
|---|
| 269 |  ;
 | 
|---|
| 270 |  ;Get credit pair (secondary code) from #44
 | 
|---|
| 271 | GETCRED(IBCLIN) ;
 | 
|---|
| 272 |  N IB407
 | 
|---|
| 273 |  ; get credit pair (secondary stop code pointer) from #44
 | 
|---|
| 274 |  S IB407=+$P($G(^SC(IBCLIN,0)),"^",18)
 | 
|---|
| 275 |  ; if IB407 is defined, get the stop code in IBSCDATA(40.7,IB407,1,"E")
 | 
|---|
| 276 |  Q $$GETCODE(IB407)
 | 
|---|
| 277 |  ;
 | 
|---|
| 278 | GETCODE(IB407) ;
 | 
|---|
| 279 |  ; get the stop code in IBSCDATA(40.7,IB407,1,"E")
 | 
|---|
| 280 |  N IBCODE,IBSCDATA
 | 
|---|
| 281 |  S IBCODE=0
 | 
|---|
| 282 |  I IB407'=0 D DIQ407(IB407,1) D
 | 
|---|
| 283 |  . I $G(IBSCDATA(40.7,IB407,1,"E"))="" Q
 | 
|---|
| 284 |  . S IBCODE=+$G(IBSCDATA(40.7,IB407,1,"E"))
 | 
|---|
| 285 |  . S:$L(+IBCODE)'=3!(IBCODE<0) IBCODE=0
 | 
|---|
| 286 |  Q IBCODE
 | 
|---|
| 287 |  ;
 | 
|---|