Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: IBCRCC

IBCRCC.m

Go to the documentation of this file.
  1. IBCRCC ;ALB/ARH - RATES: CALCULATION OF ITEM CHARGE ;22-MAY-1996
  1. ;;2.0;INTEGRATED BILLING;**52,80,106,138,245,223,309,347,370,383,427,455,447,482,634**;21-MAR-94;Build 57
  1. ;;Per VA Directive 6402, this routine should not be modified.
  1. ;
  1. ; ITMCHG and RATECHG are basic item/set/rate charge functions, IBCRCI contains more standard callable functions
  1. ;
  1. ITMCHG(CS,ITEM,EVDT,MOD,ARR) ; get the base unit charges for a specific item, given a charge set, item and date
  1. ; this is the primary function to get an item charge and works for all Charge Methods, given an Item
  1. ; returns ARR = count of items in array ^ total charge for item ^ total base charge
  1. ; ARR(x) = charge item IFN (if any) ^ rev code (if any) ^ $ charge ^ $ base charge
  1. ; checks Item effective and inactive dates, modifier match, and only sets array if the charge is non-zero
  1. ; each item will be passed back separately in the array, no combination of charges
  1. ;
  1. N IBCSBR,IBEVDT,IBEFDT,IBXREF,IBITEM,IBDA,IBLN,IBCHRG,IBITMFND K ARR S ARR=0
  1. S CS=+$G(CS),IBEVDT=$S(+$G(EVDT):+EVDT,1:DT),IBITEM=+$G(ITEM),MOD=$G(MOD) I 'CS!'IBITEM Q
  1. S IBCSBR=$$CSBR^IBCRU3(CS)
  1. ;
  1. ; va cost
  1. I $P(IBCSBR,U,5)=2 D Q ; va cost
  1. . I $P(IBCSBR,U,1)["PROSTHETICS" S IBCHRG=$$PICOST(IBITEM) I +IBCHRG D SETARR(0,0,+IBCHRG,.ARR) Q
  1. . I $P(IBCSBR,U,1)["PRESCRIPTION" S IBCHRG=$$RXIBCNR(.IBD,IBITEM) S:'+IBCHRG IBCHRG=$$RXCOST(IBITEM) I +IBCHRG D SETARR(0,0,+IBCHRG,.ARR) Q
  1. ;
  1. ; all others - have Charge Item entries
  1. ;
  1. ; find most recent Charge Item for the item, search until modifiers match (only BI=CPT should have mods defined)
  1. S IBXREF="AIVDTS"_CS,IBITMFND=0
  1. S IBEFDT=-(IBEVDT+.01) F S IBEFDT=$O(^IBA(363.2,IBXREF,IBITEM,IBEFDT)) Q:'IBEFDT D Q:IBITMFND
  1. . S IBDA=0 F S IBDA=$O(^IBA(363.2,IBXREF,IBITEM,IBEFDT,IBDA)) Q:'IBDA D
  1. .. S IBLN=$G(^IBA(363.2,IBDA,0))
  1. .. I +$P(IBLN,U,7)'=+MOD Q ; charge item modifier does not match modifier passed in
  1. .. S IBITMFND=1 ; item found
  1. .. I +$P(IBLN,U,4),+$P(IBLN,U,4)<IBEVDT Q ; charge is inactive on event date
  1. .. ; START IB*2.0*447 BI ZERO DOLLAR CHANGES
  1. .. ;I +$P(IBLN,U,5) D SETARR(IBDA,+$P(IBLN,U,6),+$P(IBLN,U,5),.ARR,$P(IBLN,U,8))
  1. .. D SETARR(IBDA,+$P(IBLN,U,6),+$P(IBLN,U,5),.ARR,$P(IBLN,U,8))
  1. .. ; END IB*2.0*447 BI ZERO DOLLAR CHANGES
  1. Q
  1. ;
  1. SETARR(CI,RVCD,CHRG,ARR,CHRGB) ; set charges into an array, does not allow zero charge, a new entry is created each time,
  1. ; no attempt to combine like items, the new item charge is added to any that may already be in the array
  1. ; returns ARR = count of items in array ^ total charge for item
  1. ; ARR(x) = charge item IFN (if any) ^ item rev code (if any) ^ $ charge
  1. ;
  1. N CNT,TCHRG,TCHRGB
  1. S CNT=+$G(ARR)+1,TCHRG=$P($G(ARR),U,2)+$G(CHRG) I +$G(CHRGB) S TCHRGB=+$P($G(ARR),U,3)+CHRGB
  1. ; START IB*2.0*447 BI ZERO DOLLAR CHANGES
  1. ;I +$G(CHRG) S ARR=CNT_U_+TCHRG_U_$G(TCHRGB),ARR(CNT)=$G(CI)_U_+$G(RVCD)_U_+CHRG_U_$G(TCHRGB)
  1. S ARR=CNT_U_+TCHRG_U_$G(TCHRGB),ARR(CNT)=$G(CI)_U_+$G(RVCD)_U_+CHRG_U_$G(TCHRGB)
  1. ; END IB*2.0*447 BI ZERO DOLLAR CHANGES
  1. Q
  1. ;
  1. PICOST(PI) ; returns (PI=ptr 362.5): total VA cost of an item (660,14) ^ quantity (660,5) from prosthetics ^ bill IFN
  1. ;
  1. N IBPIP,IBLN,IBX,IBIFN S (IBPIP,IBX)=0
  1. I +$G(PI) S IBLN=$G(^IBA(362.5,+PI,0)),IBPIP=$P(IBLN,U,4),IBIFN=$P(IBLN,U,2)
  1. I +IBPIP S IBLN=$G(^RMPR(660,+IBPIP,0)) I IBLN'="" S IBX=$P(IBLN,U,16)_U_$P(IBLN,U,7)_U_IBIFN
  1. Q IBX
  1. ;
  1. RATECHG(RS,CHG,EVDT,FEE) ; returns modifed item charge based on rate schedule: check effective dates, apply adjustment
  1. ; adjusted amount ^ comment (if there is an adjustment)
  1. ; if FEE passed by reference, returns disp fee^admin fee
  1. ;
  1. N IBX,IBRS0,IBRS10,IBEFDT,IBINADT,IBRTY,X S IBRTY=""
  1. S IBX=+$G(CHG),IBRS0=$G(^IBE(363,+$G(RS),0)),IBRS10=$G(^IBE(363,+$G(RS),10))
  1. S EVDT=$S(+$G(EVDT):EVDT,1:DT),IBEFDT=$P(IBRS0,U,5),IBINADT=$P(IBRS0,U,6)
  1. I +IBEFDT>EVDT!(+IBINADT&(IBINADT<EVDT)) S IBX=0
  1. I +IBX,IBRS10'="" S X=IBX X IBRS10 S IBX=X,IBRTY="^Rate Schedule Adjustment ("_$J(CHG,"",2)_")"
  1. S FEE=$P($G(^IBE(363,+$G(RS),1)),"^",1,2)
  1. Q IBX_IBRTY
  1. ;
  1. RXIBCNR(IBD,IBITEM) ; returns the unit cost for the drug
  1. ; input: IBD array, RX#
  1. ; output: unit cost (.304/366.141) ^ bill's IEN in (.02/362.4)
  1. ;
  1. N IBDA,IBDB,IBDAR,IBDRX,IBDRC,IBDCT,IBIFN
  1. S (IBDCT,IBIFN,IBDRX)=0
  1. I +$G(IBITEM) S IBDA=$G(^IBA(362.4,+IBITEM,0)),IBIFN=$P(IBDA,U,2),IBDRX=$P(IBDA,U,5)
  1. S:'IBDRX IBDRX=$G(IBD("PRESCRIPTION"))
  1. S:'IBDRX IBDRX=$G(IBD("CLAIMID")) Q:'IBDRX 0
  1. S IBDA=0 F S IBDA=$O(^IBCNR(366.14,"I",IBDRX,IBDA)) Q:'IBDA D
  1. . S IBDB=0 F S IBDB=$O(^IBCNR(366.14,"I",IBDRX,IBDA,IBDB)) Q:'IBDB D
  1. .. S IBDRC=$G(^IBCNR(366.14,IBDA,1,IBDB,2))
  1. .. ; event type 1 = billable status check
  1. .. Q:+$G(^IBCNR(366.14,IBDA,1,IBDB,0))'=1
  1. .. Q:$G(IBD("NDC"))'=$P(IBDRC,U,5)
  1. .. Q:$G(IBD("FILL NUMBER"))'=$P(IBDRC,U,3)
  1. .. Q:+$G(IBD("RXCOB"))'=+$G(^IBCNR(366.14,IBDA,1,IBDB,7))
  1. .. S IBDAR(IBDA,IBDB)=$P($G(^IBCNR(366.14,IBDA,1,IBDB,3)),U,4)
  1. ; latest one
  1. S IBDA=$O(IBDAR(""),-1)
  1. I IBDA'="" S IBDB=$O(IBDAR(IBDA,""),-1) S IBDCT=IBDAR(IBDA,IBDB)
  1. ;
  1. S IBDA=$S(IBDCT:IBDCT_U_IBIFN,1:0)
  1. Q IBDA
  1. ;
  1. RXCOST(RX) ; returns (RX=ptr 362.4): VA Cost of an Rx - Per Unit Cost ^ bill IFN
  1. ; w/ Per Unit Cost = Refill (Current Unit Price of Drug - 52.1,1.2) or RX (Unit Price of Drug - 52,17) or Drug (Price Per Dispense Unit - 50,16)
  1. ;
  1. N IBRXP,IBDGP,IBLN,IBX,IBIFN,IBDT,IBY
  1. S (IBRXP,IBX,IBDGP,IBDT,IBIFN)=0,IBY=""
  1. ; fill number (362.4,.1)
  1. I +$G(RX) S IBLN=$G(^IBA(362.4,+RX,0)),IBRXP=$P(IBLN,U,5),IBDGP=$P(IBLN,U,4),IBIFN=$P(IBLN,U,2),IBDT=$P(IBLN,U,3),IBY=$P(IBLN,U,10)
  1. I IBY="" S IBY=$$RFLNUM^IBRXUTL(IBRXP,IBDT)
  1. ;
  1. I IBRXP,IBY S IBX=$$SUBFILE^IBRXUTL(IBRXP,+IBY,52,1.2)_U_IBIFN
  1. I IBRXP,'IBX S IBX=$$FILE^IBRXUTL(IBRXP,17)_U_IBIFN
  1. I 'IBRXP,IBDGP D DATA^IBRXUTL(+IBDGP) S IBLN=$G(^TMP($J,"IBDRUG",0)) I IBLN'="" S IBX=$G(^TMP($J,"IBDRUG",+IBDGP,16))_U_IBIFN
  1. ;
  1. ; penny drug cost is 0
  1. I $P(IBX,U,1)=0 S IBX=$$DRGCT(IBDGP)_U_IBIFN
  1. K ^TMP($J,"IBDRUG")
  1. Q IBX
  1. ;
  1. ;
  1. DRGCT(IBDGP) ;Penny drug cost calculation
  1. ; Input - IEN
  1. ; Output - true value of unit price (50-13/15)
  1. N IBCUT,IBX,IBY S IBCUT=0
  1. G:'IBDGP DRGCTQ
  1. D:'$D(^TMP($J,"IBDRUG")) DATA^IBRXUTL(+IBDGP)
  1. S IBX=$G(^TMP($J,"IBDRUG",+IBDGP,13))
  1. S IBY=$G(^TMP($J,"IBDRUG",+IBDGP,15))
  1. I IBX,IBY S IBCUT=$J(IBX/IBY,1,4),IBCUT=$S(IBCUT>0:IBCUT,1:0.0001)
  1. DRGCTQ Q IBCUT
  1. ;
  1. PRVCHG(CS,CHG,PRV,EVDT,ITEM) ; return discounted amount, based on total charge for a the care, the provider and Charge Set (BR)
  1. ; if no discount record found for the Charge Set or the provider then returns original amount
  1. ; no provider discount for Lab charges (80000-89999)
  1. ; discounted amount ^ comment (if discounted) ^ percent discount
  1. ;
  1. N IBPC,IBSGFN,IBSG,IBPDFN,IBPD0,IBPDTY,IBI,IBX,IBY S IBX=+$G(CHG),(IBSGFN,IBPDTY)="" I '$G(EVDT) S EVDT=DT
  1. I +$G(ITEM),ITEM>79999,ITEM<90000 S (CS,PRV)=""
  1. I +$G(CS) S IBSGFN=+$$CSSG^IBCRU6(+CS,"",2,.IBSG)
  1. I +$G(PRV),+IBSGFN S IBPC=$$GET^XUA4A72(PRV,EVDT)
  1. ;
  1. S IBI=0 F S IBI=$O(IBSG(IBI)) Q:'IBI S IBSGFN=+IBSG(IBI) I +IBSGFN D
  1. . S IBPDFN=0 F S IBPDFN=$O(^IBE(363.34,"C",+IBSGFN,IBPDFN)) Q:'IBPDFN D Q:IBPDTY'=""
  1. .. I '$O(^IBE(363.34,+IBPDFN,11,"B",+IBPC,0)) Q
  1. .. S IBPD0=$G(^IBE(363.34,+IBPDFN,0)),IBY=$P(IBPD0,U,3) Q:IBY=""
  1. .. S IBY=+IBY/100,IBX=IBY*IBX
  1. .. S IBPDTY=U_$P($G(^VA(200,+PRV,0)),U,1)_" - "_$P(IBPD0,U,1)_" "_$P(IBPD0,U,3)_"% of "_$J(CHG,0,2)_U_+IBY
  1. Q IBX_IBPDTY
  1. ;
  1. MODCHG(CS,CHG,MODS) ; return adjusted amount due to RC modifier adjustment
  1. ; straight adjustment for RC Physician charges by modifier, if no modifier adjustment returns original amount
  1. ; Input: Charge Set, Procedure Charge, Modifiers - list with modifier IEN's separated by ','
  1. ; Output: discounted amount ^ comment (if discounted) ^ percent discount
  1. ;
  1. N IBCS0,IBBR0,IBMOD,IBMODS,IBMODE,IBDSCNT,IBPDTY,IBI,IBX,IBY
  1. S CHG=+$G(CHG),MODS=$G(MODS),(IBBR0,IBPDTY,IBMODS)="",IBDSCNT=1,IBX=+CHG
  1. I +$G(CS) S IBCS0=$G(^IBE(363.1,+CS,0)),IBBR0=$G(^IBE(363.3,+$P(IBCS0,U,2),0))
  1. I $P(IBBR0,U,1)'["RC PHYSICIAN" S MODS="" ; professional charge only
  1. I $P(IBBR0,U,4)'=2 S MODS="" ; CPT item only
  1. I 'CHG S MODS=""
  1. ;
  1. I +MODS F IBI=1:1 S IBMOD=$P(MODS,",",IBI) Q:'IBMOD S IBY=0 D
  1. . I IBMOD=3 S IBMODE=22,IBY=1.25,IBX=IBX*IBY ; modifier 22 at 125% adjustment
  1. . I IBMOD=10 S IBMODE=50,IBY=1.50,IBX=IBX*IBY ; modifier 50 at 150% adjustment
  1. . I +IBY S IBMODS=IBMODS_$S(IBMODS="":"",1:",")_IBMODE,IBDSCNT=IBDSCNT*IBY ; allow for multiple discounts
  1. I IBMODS'="" S IBPDTY=U_"Modifier "_IBMODS_" Adjustment "_(IBDSCNT*100)_"% of "_$J(CHG,0,2)_U_+IBDSCNT
  1. Q IBX_IBPDTY
  1. ;
  1. HRUNIT(HRS) ; returns Hour Units based on the Hours passed in
  1. ; Hour Units are the hours rounded to the nearest whole hour (less than 30 minutes is 0 units)
  1. N IBX S IBX=0 I +$G(HRS) S IBX=$J(HRS,0,0)
  1. Q IBX
  1. ;
  1. MLUNIT(MLS) ; returns Miles Units based on the Miles passed in
  1. ; Mile Units are the miles rounded to the nearest whole mile
  1. N IBX S IBX=0 I +$G(MLS) S IBX=$J(MLS,0,0) I 'IBX S IBX=1
  1. Q IBX
  1. ;
  1. MNUNIT(MNS) ; return Minute Units based on the Minutes passed in
  1. ; Minute Units are 15 minute intervals, rounded up after any minutes
  1. N IBX S IBX=0 I +$G(MNS) S IBX=(MNS\15) S:+(MNS#15) IBX=IBX+1 I 'IBX S IBX=1
  1. Q IBX