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