| 1 | IBCRU4 ;ALB/ARH - RATES: UTILITIES (RG/BILL/CI) ; 16-MAY-1996
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**52,106,245**;21-MAR-94
 | 
|---|
| 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 | RGEXT(RG) ; returns regions in external format (NAME ^ DIV1 ^ DIV 2 ^ ...)
 | 
|---|
| 8 |  N IBX,IBY,IBZ,IBI,IBC S IBY="",IBX=0,IBC=""
 | 
|---|
| 9 |  I +$G(RG) S IBZ=$P($G(^IBE(363.31,+RG,0)),U,1) I IBZ'="" S IBY=IBZ_U
 | 
|---|
| 10 |  I IBY'="" S IBX=$$RGDV(+RG)
 | 
|---|
| 11 |  I +IBX F IBI=1:1 S IBZ=$P(IBX,U,IBI) Q:'IBZ  S IBY=IBY_IBC_$P($G(^DG(40.8,+IBZ,0)),U,1),IBC=", "
 | 
|---|
| 12 |  Q IBY
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 | RGDV(RG,DV) ; returns a Billing Regions Divisions (363.31):  div1 ^ div2 ^ ...
 | 
|---|
| 15 |  ; if DV is passed in and covered by region it will be the first division in the set
 | 
|---|
| 16 |  N IBX,IBI S IBX=""
 | 
|---|
| 17 |  I +$G(RG),$G(^IBE(363.31,+RG,0))'="" D
 | 
|---|
| 18 |  . I +$G(DV),$D(^IBE(363.31,+RG,11,"B",DV)) S IBX=DV_U
 | 
|---|
| 19 |  . S IBI=0 F  S IBI=$O(^IBE(363.31,+RG,11,"B",IBI)) Q:'IBI  I $G(DV)'=IBI S IBX=IBX_IBI_U
 | 
|---|
| 20 |  Q IBX
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 | BILLCPT(IBIFN) ; returns true if any of the charges on the bill may be based on CPT
 | 
|---|
| 23 |  ; ie. one of the Billing Rates of one of the Charge Sets defined for the Rate Type of the bill
 | 
|---|
| 24 |  ; has a Billable Item of CPT
 | 
|---|
| 25 |  ;
 | 
|---|
| 26 |  N IBX,IB0,IBU,IBI,IBJ,IBBR,IBRSARR S IBX=0,IBRSARR=0
 | 
|---|
| 27 |  S IB0=$G(^DGCR(399,+$G(IBIFN),0)),IBU=$G(^DGCR(399,+$G(IBIFN),"U"))
 | 
|---|
| 28 |  I IB0'="",+IBU D RT^IBCRU3($P(IB0,U,7),$P(IB0,U,5),$P(IBU,U,1,2),.IBRSARR)
 | 
|---|
| 29 |  I +IBRSARR S IBI=0 F  S IBI=$O(IBRSARR(IBI)) Q:'IBI  D  Q:IBX
 | 
|---|
| 30 |  . S IBJ=0 F  S IBJ=$O(IBRSARR(IBI,IBJ)) Q:'IBJ  D  Q:IBX
 | 
|---|
| 31 |  .. S IBBR=$P($G(^IBE(363.1,IBJ,0)),U,2) I $P($G(^IBE(363.3,IBBR,0)),U,4)=2 S IBX=1
 | 
|---|
| 32 |  Q IBX
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 | BILLDV(IBIFN) ; returns true if one of the Billing Rates of the Charge Sets defined for the Rate Type of the bill
 | 
|---|
| 35 |  ; is modifiable by Region and therefore may need division,  ie. has a Region defined
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 |  N IBX,IB0,IBU,IBI,IBJ,IBCS0,IBRSARR S IBX=0,IBRSARR=0
 | 
|---|
| 38 |  S IB0=$G(^DGCR(399,+$G(IBIFN),0)),IBU=$G(^DGCR(399,+$G(IBIFN),"U"))
 | 
|---|
| 39 |  I IB0'="",+IBU D RT^IBCRU3($P(IB0,U,7),$P(IB0,U,5),$P(IBU,U,1,2),.IBRSARR)
 | 
|---|
| 40 |  I +IBRSARR S IBI=0 F  S IBI=$O(IBRSARR(IBI)) Q:'IBI  D  Q:IBX
 | 
|---|
| 41 |  . S IBJ=0 F  S IBJ=$O(IBRSARR(IBI,IBJ)) Q:'IBJ  D  Q:IBX
 | 
|---|
| 42 |  .. S IBCS0=$G(^IBE(363.1,IBJ,0)) I +$P(IBCS0,U,7) S IBX=1
 | 
|---|
| 43 |  Q IBX
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 | FINDCI(CS,ITEM,EFDT,MOD,RVCD,CHG,INAC,ARR,BASE) ; find charge item entries for a billable item (exact match on date)
 | 
|---|
| 47 |  ; Input:  CS, ITEM, EFDT required, if the others are defined they will be used in the match (ARR-pass by ref)
 | 
|---|
| 48 |  ; Output: returns string off all CI IFNs that match
 | 
|---|
| 49 |  ;         ARR = count of matchs found
 | 
|---|
| 50 |  ;         ARR(CI) = 0 node record of CI from 363.2
 | 
|---|
| 51 |  N IBX,IBXRF,IBEFDT,IBCI,IBLN K ARR S ARR=0,IBX="",EFDT=$G(EFDT)\1 I '$G(CS)!'$G(ITEM)!(EFDT'?7N) G FINDCIQ
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  S IBXRF="AIVDTS"_CS,IBEFDT=-EFDT
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  S IBCI=0 F  S IBCI=$O(^IBA(363.2,IBXRF,ITEM,IBEFDT,IBCI)) Q:'IBCI  D
 | 
|---|
| 56 |  . ;
 | 
|---|
| 57 |  . S IBLN=$G(^IBA(363.2,IBCI,0))
 | 
|---|
| 58 |  . I $D(INAC),INAC'=$P(IBLN,U,4) Q
 | 
|---|
| 59 |  . I $D(CHG),+CHG'=+$P(IBLN,U,5) Q
 | 
|---|
| 60 |  . I $D(RVCD),RVCD'=$P(IBLN,U,6) Q
 | 
|---|
| 61 |  . I $D(MOD),MOD'=$P(IBLN,U,7) Q
 | 
|---|
| 62 |  . I $D(BASE),+BASE'=+$P(IBLN,U,8) Q
 | 
|---|
| 63 |  . S IBX=IBX_IBCI_U,ARR=+$G(ARR)+1,ARR(IBCI)=IBLN
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 | FINDCIQ Q IBX
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 | FNDCI(CS,ITEM,EFDT,ARR,MOD) ; find charge item entries effective for a billable item on a given date
 | 
|---|
| 68 |  ; Input:  CS, ITEM, EFDT required, if MOD defined it will be used in the match (ARR-pass by ref)
 | 
|---|
| 69 |  ; Output: returns string of all CI IFNs that are effective for item on date
 | 
|---|
| 70 |  ;         ARR = count of effective charge items found
 | 
|---|
| 71 |  ;         ARR(CI) = 0 node record of CI from 363.2
 | 
|---|
| 72 |  N IBX,IBXRF,IBEFDT,IBCI,IBLN,IBITMFND K ARR S ARR=0,IBX="",EFDT=$G(EFDT)\1
 | 
|---|
| 73 |  I '$G(CS)!'$G(ITEM)!(EFDT'?7N) G FNDCIQ
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  S IBXRF="AIVDTS"_CS,IBITMFND=0
 | 
|---|
| 76 |  S IBEFDT=-(EFDT+.01) F  S IBEFDT=$O(^IBA(363.2,IBXRF,ITEM,IBEFDT)) Q:'IBEFDT  D  Q:IBITMFND
 | 
|---|
| 77 |  . S IBCI=0 F  S IBCI=$O(^IBA(363.2,IBXRF,ITEM,IBEFDT,IBCI)) Q:'IBCI  D
 | 
|---|
| 78 |  .. ;
 | 
|---|
| 79 |  .. S IBLN=$G(^IBA(363.2,IBCI,0))
 | 
|---|
| 80 |  .. I $D(MOD),MOD'=$P(IBLN,U,7) Q  ; charge item modifier does not match modifier passed in
 | 
|---|
| 81 |  .. S IBITMFND=1 ; item found
 | 
|---|
| 82 |  .. I +$P(IBLN,U,4),+$P(IBLN,U,4)<EFDT Q  ; charge is inactive on date
 | 
|---|
| 83 |  .. I +$P(IBLN,U,5) S IBX=IBX_IBCI_U,ARR=+$G(ARR)+1,ARR(IBCI)=IBLN
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 | FNDCIQ Q IBX
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 | INACTCI(CI) ; returns date Charge Item becomes inactive: either Inactive Date or replaced (ie last active date)
 | 
|---|
| 88 |  ; returns: -1: not found, 0: not inactive, Date: date inactive or last active date before replaced
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 |  N IBX,IBCI0,IBEFDT,IBITEM,IBXRF,IBNEXT,IBNCI,IBNCI0,IBINDT1,IBINDT2 S (IBINDT1,IBINDT2,IBX)=0
 | 
|---|
| 91 |  S IBCI0=$G(^IBA(363.2,+$G(CI),0)) I IBCI0="" S IBX=-1 G ACTCIQ
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 |  S IBINDT1=+$P(IBCI0,U,4) ; charge item inactive date
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  ; check previous entries for the item to see if it has been replaced
 | 
|---|
| 96 |  S IBEFDT=$P(IBCI0,U,3),IBITEM=+IBCI0,IBXRF="AIVDTS"_+$P(IBCI0,U,2)
 | 
|---|
| 97 |  S IBNEXT=-IBEFDT F  S IBNEXT=$O(^IBA(363.2,IBXRF,IBITEM,IBNEXT),-1) Q:'IBNEXT  D  Q:+IBINDT2
 | 
|---|
| 98 |  . S IBNCI=0 F  S IBNCI=$O(^IBA(363.2,IBXRF,IBITEM,IBNEXT,IBNCI)) Q:'IBNCI  D  Q:+IBINDT2
 | 
|---|
| 99 |  .. S IBNCI0=$G(^IBA(363.2,IBNCI,0)) I '$P(IBNCI0,U,3) Q
 | 
|---|
| 100 |  .. I $P(IBCI0,U,7)=$P(IBNCI0,U,7) S IBINDT2=$$FMADD^XLFDT(+$P(IBNCI0,U,3),-1)
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 |  S IBX=IBINDT1 I 'IBX S IBX=IBINDT2
 | 
|---|
| 103 |  I +IBINDT2,+IBINDT1,IBINDT2<IBINDT1 S IBX=IBINDT2
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 | ACTCIQ Q IBX
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 | ITMUNIT(ITM,UNIT,CT) ; return true if the Item has the requested type of units or Charge Method
 | 
|---|
| 108 |  ; Input: ITM  - pointer to Item Code
 | 
|---|
| 109 |  ;        UNIT - Number of type of unit, or Charge Method, 4 - Miles, etc
 | 
|---|
| 110 |  ;        CT   - Charge Type (optional) 1 for Inst, 2 for Prof (363.1,.04)
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 |  N IBFND,IBCS,IBCSN S IBFND=0 S ITM=+$G(ITM),UNIT=+$G(UNIT)
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 |  I +ITM,+UNIT S IBCS=0 F  S IBCS=$O(^IBE(363.1,IBCS)) Q:'IBCS  D  I +IBFND Q
 | 
|---|
| 115 |  . S IBCSN=$G(^IBE(363.1,IBCS,0))
 | 
|---|
| 116 |  . ;
 | 
|---|
| 117 |  . I +$G(CT),+$P(IBCSN,U,4),$P(IBCSN,U,4)'=CT Q
 | 
|---|
| 118 |  . I +$P($G(^IBE(363.3,+$P(IBCSN,U,2),0)),U,5)'=UNIT Q
 | 
|---|
| 119 |  . ;
 | 
|---|
| 120 |  . I $O(^IBA(363.2,"AIVDTS"_IBCS,+ITM,"")) S IBFND=1
 | 
|---|
| 121 |  ;
 | 
|---|
| 122 |  Q IBFND
 | 
|---|