1 | IBCRBG ;ALB/ARH - RATES: BILL SOURCE EVENTS (INPT) ; 21 MAY 96
|
---|
2 | ;;2.0;INTEGRATED BILLING;**52,80,106,51,142,159,210,245,382,389**;21-MAR-94;Build 6
|
---|
3 | ;;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | INPTPTF(IBIFN,CS) ; search PTF record for billable bedsections, transfer DRGs, and length of stay
|
---|
6 | ; - screens out days for pass, leave and SC treatment
|
---|
7 | ; - adds charges for only one BS if the ins company does not allow multiple bedsections per bill (36,.06)
|
---|
8 | ; Output: ^TMP($J,"IBCRC-INDT", BILLABLE DATE) = MOVE DT/TM ^ BILL BS ^ SC FLAG ^ DRG ^ DIV ^ SPECIALTY ^ MOVE #
|
---|
9 | ;
|
---|
10 | N IB0,DFN,PTF,IBU,IBBDT,IBEDT,IBTF,IBADM,IBX,IBINSMBS
|
---|
11 | K ^TMP($J,"IBCRC-PTF"),^TMP($J,"IBCRC-DIV"),^TMP($J,"IBCRC-INDT")
|
---|
12 | ;
|
---|
13 | S IB0=$G(^DGCR(399,+$G(IBIFN),0)),DFN=$P(IB0,U,2) Q:'DFN
|
---|
14 | S IBTF=$P(IB0,U,6),PTF="" S:$P(IB0,U,5)<3 PTF=$P(IB0,U,8) Q:'PTF
|
---|
15 | S IBINSMBS=0,IBX=+$G(^DGCR(399,+IBIFN,"MP"))
|
---|
16 | I 'IBX,$$MCRWNR^IBEFUNC($$CURR^IBCEF2(IBIFN)) S IBX=$$CURR^IBCEF2(IBIFN)
|
---|
17 | I $P($G(^DIC(36,+IBX,0)),U,6)=0 S IBINSMBS=1 ; 1 bs per bill
|
---|
18 | ;
|
---|
19 | S IBU=$G(^DGCR(399,+IBIFN,"U")) Q:'IBU
|
---|
20 | S IBBDT=+IBU,IBEDT=$P(IBU,U,2) Q:'IBEDT
|
---|
21 | ;
|
---|
22 | S IBADM=$O(^DGPM("APTF",PTF,0)) ; find corresponding admission
|
---|
23 | ;
|
---|
24 | D PTF(PTF) ; get movements and bedsections
|
---|
25 | D PTFDV(PTF) ; reset movements and bedsections for ward/division
|
---|
26 | D PTFFY(PTF,IBBDT,IBEDT) ; reset movements for FY DRG change
|
---|
27 | ;
|
---|
28 | D BSLOS(IBBDT,IBEDT,IBTF,IBADM,IBINSMBS) ; calculate days in bedsections within timeframe of the bill
|
---|
29 | ;
|
---|
30 | K ^TMP($J,"IBCRC-PTF"),^TMP($J,"IBCRC-DIV")
|
---|
31 | ;
|
---|
32 | D INPTRSET^IBCRBG2(IBIFN,$G(CS))
|
---|
33 | Q
|
---|
34 | ;
|
---|
35 | PTF(PTF) ; find all movements in PTF for the admission by date and billing bedsection (501 movement)
|
---|
36 | ; the movement date is the date the patient left the bedsection
|
---|
37 | ; Output: ^TMP($J,"IBCRC-PTF", MOVE DT/TM)=MOVE DT/TM ^ BILL BED ^ SC FLAG ^ TRANSFER DRG ^ ^ SPECIALTY ^ MOVE #
|
---|
38 | ;
|
---|
39 | N IBMOVE,IBMVLN,IBBILLBS,IBENDDT,IBMSC,IBMDRG S PTF=+$G(PTF)
|
---|
40 | S IBMOVE=0 F S IBMOVE=$O(^DGPT(PTF,"M",IBMOVE)) Q:'IBMOVE D
|
---|
41 | . S IBMVLN=^DGPT(PTF,"M",IBMOVE,0)
|
---|
42 | . S IBBILLBS=+$$SPBB($P(IBMVLN,U,2)) ; billable bedsection
|
---|
43 | . S IBENDDT=+$P(IBMVLN,U,10) I 'IBENDDT S IBENDDT=DT ; movement date (last date in bedsection)
|
---|
44 | . S IBMSC="" I +$P(IBMVLN,U,18)=1 S IBMSC=1 ; sc movement
|
---|
45 | . S IBMDRG=$$MVDRG(PTF,IBMOVE) ; movement DRG
|
---|
46 | . S ^TMP($J,"IBCRC-PTF",IBENDDT)=IBENDDT_U_IBBILLBS_U_IBMSC_U_IBMDRG_U_U_+$P(IBMVLN,U,2)_U_IBMOVE
|
---|
47 | Q
|
---|
48 | ;
|
---|
49 | SPBB(SPCLTY) ; find the billable bedsection for a Specialty (42.4)
|
---|
50 | ; returns billable bedsection IFN ^ billable bedsection name
|
---|
51 | N IBX,IBY,IBZ S IBZ=0
|
---|
52 | S IBX=$P($G(^DIC(42.4,+$G(SPCLTY),0)),U,5)
|
---|
53 | I IBX'="" S IBY=$O(^DGCR(399.1,"B",IBX,0)) I +IBY S IBZ=IBY_U_IBX
|
---|
54 | Q IBZ
|
---|
55 | ;
|
---|
56 | BSLOS(IBBDT,IBEDT,IBTF,IBADM,IBINSMBS) ; from the array of PTF movments get all bedsections and their LOS covered by date range of the bill
|
---|
57 | ; adds all days for first cronological bs if ins comp wants only a single bs per bill, even if not sequential
|
---|
58 | ; the movement date is the date the patient left the bedsection, so admission date is not in PTF array
|
---|
59 | ;
|
---|
60 | ; Input: ^TMP($J,"IBCRC-PTF", MOVE DT/TM) = MOVE DT/TM ^ BILL BS ^ SC FLAG ^ DRG ^ DIV ^ SPECIALTY ^ MOVE #
|
---|
61 | ; Output: ^TMP($J,"IBCRC-INDT", BILLABLE DATE) = MOVE DT/TM ^ BILL BS ^ SC FLAG ^ DRG ^ DIV ^ SPECIALTY ^ MOVE #
|
---|
62 | ;
|
---|
63 | N IBSBDT,IBSEDT,IBS,IBLASTDT,IBX
|
---|
64 | S IBSBDT=IBBDT+.3 ; discount any movements ending on or before the begin date
|
---|
65 | S IBSEDT=IBEDT\1
|
---|
66 | ;
|
---|
67 | I ",2,3,"'[IBTF S IBSEDT=IBSEDT-.01 ; final bill, do not count last day
|
---|
68 | ;
|
---|
69 | I +$G(IBADM) S IBX=$$AD^IBCU64(IBADM) I +IBX,($P(IBX,U,1)\1)=($P(IBX,U,2)\1) S IBSBDT=IBBDT ; reset 1 day stays
|
---|
70 | ;
|
---|
71 | S IBS=IBSBDT-.01 F S IBS=$O(^TMP($J,"IBCRC-PTF",IBS)) Q:'IBS D SET S IBLASTDT=IBS Q:(IBLASTDT\1)>IBSEDT
|
---|
72 | ;
|
---|
73 | Q
|
---|
74 | ;
|
---|
75 | SET ; checks a specific movement to determine if it should be billed and what the length of stay is
|
---|
76 | ; setting of the movement date determines how many days are counted in the bedsection
|
---|
77 | N IBMVLN,IBMBDT,IBMEDT,IBMTF,IBMLOS,IBI,IBCHGDT
|
---|
78 | S IBMVLN=$G(^TMP($J,"IBCRC-PTF",IBS))
|
---|
79 | I '$P(IBMVLN,U,2) Q ; non-billable bedsection
|
---|
80 | I +$P(IBMVLN,U,3) Q ; sc movement
|
---|
81 | I +IBINSMBS,+$G(IBLASTDT) Q ; ins does not allow multiple bs
|
---|
82 | ;
|
---|
83 | S IBMBDT=$S(IBBDT>$G(IBLASTDT):IBBDT,1:IBLASTDT),IBMBDT=IBMBDT\1 ; start cnt on begin dt or last move dt
|
---|
84 | S IBMEDT=$S(IBS<IBEDT:IBS,1:IBEDT),IBMEDT=IBMEDT\1 ; end cnt on move dt or end dt
|
---|
85 | S IBMTF=$S(IBEDT<(IBS\1):IBTF,1:1) ; last movement gets timeframe
|
---|
86 | S IBMLOS=$$LOS^IBCU64(IBMBDT,IBMEDT,IBMTF,IBADM) Q:'IBMLOS ; calculate the LOS for the movement
|
---|
87 | ;
|
---|
88 | F IBI=1:1:IBMLOS S IBCHGDT=$$FMADD^XLFDT(IBMBDT,(IBI-1)),^TMP($J,"IBCRC-INDT",+IBCHGDT)=IBMVLN
|
---|
89 | Q
|
---|
90 | ;
|
---|
91 | BBS(X) ; returns true if pointer passed in is a billable bedsection ^ bedsection name
|
---|
92 | N IBX,IBY S IBY=0,IBX=$G(^DGCR(399.1,+$G(X),0)) I +$P(IBX,U,5) S IBY=1_U_$P(IBX,U,1)
|
---|
93 | Q IBY
|
---|
94 | ;
|
---|
95 | Q
|
---|
96 | ;
|
---|
97 | PTFDV(PTF) ; find all ward/location transfers in PTF for the patient to determine the site/division the patient was in
|
---|
98 | ; the division of the ward will be added to the PTF bedsection movements
|
---|
99 | ; Input: ^TMP($J,"IBCRC-PTF", move dt/tm) = move dt/tm ^ bill bs ^ sc flag ^ move drg ^ ^ specialty ^ move #
|
---|
100 | ; Output: ^TMP($J,"IBCRC-PTF", move dt/tm) = move dt/tm ^ bill bs ^ sc flag ^ move drg ^ WARD DIV ^ spec ^ move#
|
---|
101 | ; ^TMP($J,"IBCRC-DIV", TRANSFER DATE/TIME) = WARD DIVISION
|
---|
102 | N IBTRNSF,IBTRLN,IBENDDT,IBTRDV,IBMVDT,IBTRDT
|
---|
103 | ;
|
---|
104 | I '$O(^TMP($J,"IBCRC-PTF",0)) Q
|
---|
105 | ;
|
---|
106 | ; get all ward transfers
|
---|
107 | S IBTRNSF=0 F S IBTRNSF=$O(^DGPT(PTF,535,IBTRNSF)) Q:'IBTRNSF D
|
---|
108 | . S IBTRLN=$G(^DGPT(PTF,535,+IBTRNSF,0))
|
---|
109 | . S IBENDDT=$P(IBTRLN,U,10) I 'IBENDDT S IBENDDT=DT ; transfer date (last date in ward)
|
---|
110 | . S IBTRDV=$P($G(^DIC(42,+$P(IBTRLN,U,6),0)),U,11) Q:'IBTRDV ; losing ward division
|
---|
111 | . S ^TMP($J,"IBCRC-DIV",IBENDDT)=IBTRDV
|
---|
112 | ;
|
---|
113 | ; if the ward transfer does not coincide with a specialty transfer add bedsection move on the transfer date
|
---|
114 | S IBENDDT=0 F S IBENDDT=$O(^TMP($J,"IBCRC-DIV",IBENDDT)) Q:'IBENDDT D
|
---|
115 | . S IBMVDT=$O(^TMP($J,"IBCRC-PTF",(IBENDDT-.0000001)))
|
---|
116 | . I 'IBMVDT Q ; - transfer movement dates after the discharge date in the PTF file (inconsistent)
|
---|
117 | . I $P(IBENDDT,".")'=$P(IBMVDT,".") S ^TMP($J,"IBCRC-PTF",IBENDDT)=$G(^TMP($J,"IBCRC-PTF",IBMVDT))
|
---|
118 | ;
|
---|
119 | ; add the ward division to the bedsection/specialty
|
---|
120 | S IBENDDT=0 F S IBENDDT=$O(^TMP($J,"IBCRC-PTF",IBENDDT)) Q:'IBENDDT D
|
---|
121 | . S IBTRDT=$O(^TMP($J,"IBCRC-DIV",(IBENDDT-.0000001))) ; ward transfer covering this bedsection
|
---|
122 | . S IBTRDV=$G(^TMP($J,"IBCRC-DIV",+IBTRDT)) ; ward division
|
---|
123 | . I +IBTRDV S $P(^TMP($J,"IBCRC-PTF",IBENDDT),U,5)=IBTRDV
|
---|
124 | Q
|
---|
125 | ;
|
---|
126 | PTFFY(PTF,BEGDT,ENDDT) ; add movement for FY (10/1) if date range covers FY and DRG changes
|
---|
127 | ; the DRG may change on FY so check and if necessary add movement for pre-FY with old DRG
|
---|
128 | ; Input: ^TMP($J,"IBCRC-PTF", move dt/tm) = move dt/tm ^ bill bs ^ sc flag ^ move drg ^ ^ specialty ^ move #
|
---|
129 | ; Output: ^TMP($J,"IBCRC-PTF", move dt/tm) = move dt/tm ^ bill bs ^ sc flag ^ MOVE DRG ^ ward div ^ spec ^ move#
|
---|
130 | N IBBEGDT,IBENDDT,IBYRB,IBYRE,IBYR,IBFY,IBMVLN,IBMVDRG,IBMOVE,IBFYDRG Q:'$G(PTF)
|
---|
131 | Q:'$G(BEGDT) S IBFY=$E(BEGDT,1,3)_"1001"
|
---|
132 | ;
|
---|
133 | S IBBEGDT=BEGDT,IBENDDT=BEGDT\1 F S IBENDDT=$O(^TMP($J,"IBCRC-PTF",IBENDDT)) Q:'IBENDDT D S IBBEGDT=IBENDDT
|
---|
134 | . S IBYRB=$E(IBBEGDT,1,3),IBYRE=$E(IBENDDT,1,3) I (IBYRE-IBYRB)>10 Q
|
---|
135 | . F IBYR=IBYRB:1:IBYRE S IBFY=IBYR_"1001" I IBBEGDT<IBFY,IBENDDT>IBFY D
|
---|
136 | .. S IBMVLN=$G(^TMP($J,"IBCRC-PTF",IBENDDT)),IBMVDRG=$P(IBMVLN,U,4),IBMOVE=$P(IBMVLN,U,7)
|
---|
137 | .. S IBFYDRG=$$MVDRG(PTF,IBMOVE,IBYR_"0930")
|
---|
138 | .. I IBMVDRG'=IBFYDRG S $P(IBMVLN,U,4)=IBFYDRG S ^TMP($J,"IBCRC-PTF",IBFY)=IBMVLN
|
---|
139 | Q
|
---|
140 | ;
|
---|
141 | MVDRG(PTF,M,CDATE) ; Return the DRG for a specific PTF Movememt (M=move ifn)
|
---|
142 | ; CDATE is optional, used if need to calculate DRG for some day within the move, not at the end date
|
---|
143 | N DPT0,PTF0,PTFM0,PTF70,IBBEG,IBEND,IBDSST,IBDX,IBPRC0,IBPRC,IBDRG,IBI,IBJ,IBP
|
---|
144 | N SEX,AGE,ICDDX,ICDPRC,ICDEXP,ICDDMS,ICDTRS,ICDDRG,ICDMDC,ICDRTC,ICDDATE
|
---|
145 | S IBDRG=""
|
---|
146 | ;
|
---|
147 | S PTF0=$G(^DGPT(+$G(PTF),0)),DPT0=$G(^DPT(+$P(PTF0,U,1),0)) I DPT0="" G MVDRGQ
|
---|
148 | S PTFM0=$G(^DGPT(+PTF,"M",+$G(M),0)) I 'PTFM0 G MVDRGQ
|
---|
149 | S PTF70=$G(^DGPT(+PTF,70)),IBDSST=+$P(PTF70,U,3)
|
---|
150 | ;
|
---|
151 | S IBEND=+$P(PTFM0,U,10) I 'IBEND S IBEND=DT+.9
|
---|
152 | S IBBEG=$O(^DGPT(+PTF,"M","AM",IBEND),-1) I 'IBBEG S IBBEG=$P(PTF0,U,2)
|
---|
153 | ;
|
---|
154 | S SEX=$P(DPT0,U,2)
|
---|
155 | S AGE=$P(DPT0,U,3),AGE=$$FMDIFF^XLFDT(IBEND,AGE)\365.25
|
---|
156 | ;
|
---|
157 | S (ICDEXP,ICDDMS,ICDTRS)=0 I +PTF70,+PTF70=$P(PTFM0,U,10) D
|
---|
158 | . I IBDSST>5 S ICDEXP=1 ; patient expired
|
---|
159 | . I IBDSST=4 S ICDDMS=1 ; patient left against medical advice
|
---|
160 | . I IBDSST=5,+$P(PTF70,U,13) S ICDTRS=1 ; patient transfered to another facility
|
---|
161 | ;
|
---|
162 | S IBJ=0 F IBI=5:1:9 S IBDX=$P(PTFM0,U,IBI) I +IBDX,($$ICD9^IBACSV(+IBDX)'="") S IBJ=IBJ+1,ICDDX(IBJ)=IBDX
|
---|
163 | ;
|
---|
164 | I '$O(ICDDX(0)) G MVDRGQ
|
---|
165 | ;
|
---|
166 | S IBJ=0
|
---|
167 | S IBP=0 F S IBP=$O(^DGPT(+PTF,"S",IBP)) Q:'IBP D ; surguries
|
---|
168 | . S IBPRC0=$G(^DGPT(+PTF,"S",IBP,0)) Q:'IBPRC0
|
---|
169 | . I +IBPRC0'<IBBEG,+IBPRC0'>IBEND D
|
---|
170 | .. F IBI=8:1:12 S IBPRC=$P(IBPRC0,U,IBI) I +IBPRC,($$ICD0^IBACSV(+IBPRC)'="") S IBJ=IBJ+1,ICDPRC(IBJ)=+IBPRC
|
---|
171 | ;
|
---|
172 | S IBP=0 F S IBP=$O(^DGPT(+PTF,"P",IBP)) Q:'IBP D ; procedures
|
---|
173 | . S IBPRC0=$G(^DGPT(+PTF,"P",IBP,0)) Q:'IBPRC0
|
---|
174 | . I +IBPRC0'<IBBEG,+IBPRC0'>IBEND D
|
---|
175 | .. F IBI=5:1:9 S IBPRC=$P(IBPRC0,U,IBI) I +IBPRC,($$ICD0^IBACSV(+IBPRC)'="") S IBJ=IBJ+1,ICDPRC(IBJ)=+IBPRC
|
---|
176 | ;
|
---|
177 | S ICDDATE=$S(+$G(CDATE):CDATE,+$P(PTFM0,U,10):+$P(PTFM0,U,10),1:DT) ; date for the DRG Grouper versioning
|
---|
178 | D ^ICDDRG S IBDRG=$G(ICDDRG)
|
---|
179 | ;
|
---|
180 | MVDRGQ Q IBDRG
|
---|