1 | BPSOSU ;BHAM ISC/FCS/DRS/FLS - Common utilities ;06/01/2004
|
---|
2 | ;;1.0;E CLAIMS MGMT ENGINE;**1,2,5**;JUN 2004;Build 45
|
---|
3 | ;;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | Q
|
---|
5 | ; Common utilities called a lot.
|
---|
6 | ;
|
---|
7 | ; SETSTAT - set status field for ^BPST(IEN59,
|
---|
8 | ; Input:
|
---|
9 | ; IEN59 - BPS Transaction
|
---|
10 | ; STATUS - Value to set into BPS Transaction
|
---|
11 | SETSTAT(IEN59,STATUS) ; EP - from many places
|
---|
12 | ;
|
---|
13 | ; In case there is a timing problem, make sure the Status is not
|
---|
14 | ; already more than the requested status
|
---|
15 | I STATUS'=0,$P(^BPST(IEN59,0),U,2)>STATUS Q
|
---|
16 | ;
|
---|
17 | ; Lock the record - something is very wrong if you can't get the lock
|
---|
18 | F L +^BPST(IEN59):300 Q:$T Q:'$$IMPOSS^BPSOSUE("L","RTI","LOCK +^BPST",,"SETSTAT",$T(+0))
|
---|
19 | N DIE,DA,DR,X
|
---|
20 | S DIE=9002313.59,DA=IEN59,DR="1///"_STATUS_";7///NOW" ; Status and Last Update
|
---|
21 | I STATUS=0 S DR=DR_";15///NOW" ; If Status is 0, init START TIME
|
---|
22 | D ^DIE
|
---|
23 | ;
|
---|
24 | ; Verify that there no other statuses in the X-ref
|
---|
25 | S X=""
|
---|
26 | F S X=$O(^BPST("AD",X)) Q:X="" D
|
---|
27 | . I X'=STATUS K ^BPST("AD",X,IEN59)
|
---|
28 | I STATUS=99 D STATUS99(IEN59)
|
---|
29 | L -^BPST(IEN59)
|
---|
30 | Q
|
---|
31 | ;
|
---|
32 | ; STATUS99 - Special activity when a claim reaches status 99
|
---|
33 | ; Input:
|
---|
34 | ; IEN59 - BPS Transaction IEN
|
---|
35 | STATUS99(IEN59) ;
|
---|
36 | N CLMSTAT,BPS57
|
---|
37 | ;
|
---|
38 | ; Get status of the claim
|
---|
39 | S CLMSTAT=$$CATEG^BPSOSUC(IEN59)
|
---|
40 | ;
|
---|
41 | S BPS57=$$NEW57(IEN59)
|
---|
42 | D LOG^BPSOSL(IEN59,$T(+0)_"-Created BPS Log of Transaction record "_BPS57)
|
---|
43 | ;
|
---|
44 | ; If claims completed normally, log its completion.
|
---|
45 | ; Do not log error'ed or stranded claims as we don't want to show these in the
|
---|
46 | ; turn-around stats
|
---|
47 | ; Needed for Turn-Around Stats - Do NOT delete/alter!!
|
---|
48 | I CLMSTAT'["E OTHER",CLMSTAT'["E STRANDED",CLMSTAT'["E REVERSAL STRANDED" D LOG^BPSOSL(IEN59,$T(+0)_"-Claim Complete")
|
---|
49 | ;
|
---|
50 | ; If the Reverse Then Resubmit field is set to Resubmitting (2),
|
---|
51 | ; then set to 'Done' (0)
|
---|
52 | I $P(^BPST(IEN59,1),U,12)=2 S $P(^BPST(IEN59,1),U,12)=0
|
---|
53 | ;
|
---|
54 | ; If resubmit flag is set to 'Reverse, then Resubmit' (1), see about
|
---|
55 | ; doing a resubmit
|
---|
56 | I $P(^BPST(IEN59,1),U,12)=1 D
|
---|
57 | . ;
|
---|
58 | . ; Initialize variables
|
---|
59 | . N SKIP,SITE
|
---|
60 | . D LOG^BPSOSL(IEN59,$T(+0)_"-Reverse then Resubmit attempt")
|
---|
61 | . ;
|
---|
62 | . ; Initialize the skip flag
|
---|
63 | . S SKIP=0
|
---|
64 | . ;
|
---|
65 | . ; Get Site info and make sure it exists
|
---|
66 | . S SITE=$P(^BPST(IEN59,1),U,4)
|
---|
67 | . I '$G(SITE) D
|
---|
68 | .. D LOG^BPSOSL(IEN59,$T(+0)_" Cannot - No site information")
|
---|
69 | .. S SKIP=1
|
---|
70 | . ;
|
---|
71 | . ; Check the ECME switch for the site
|
---|
72 | . I $G(SITE),'$$ECMEON^BPSUTIL(SITE) D
|
---|
73 | .. D LOG^BPSOSL(IEN59,$T(+0)_" Cannot - ECME switch is off for the site")
|
---|
74 | .. S SKIP=1
|
---|
75 | . ;
|
---|
76 | . ; If reversal was not successful, log message and quit
|
---|
77 | . I CLMSTAT'="E REVERSAL ACCEPTED" D
|
---|
78 | .. D LOG^BPSOSL(IEN59,$T(+0)_" Cannot - Reversal failed - "_CLMSTAT)
|
---|
79 | .. S SKIP=1
|
---|
80 | . ;
|
---|
81 | . ; Check if the MOREDATA array is defined
|
---|
82 | . I '$D(^XTMP("BPSOSRB","MOREDATA",IEN59,"RESUB")) D
|
---|
83 | .. D LOG^BPSOSL(IEN59,$T(+0)_" Cannot - MOREDATA array undefined")
|
---|
84 | .. S SKIP=1
|
---|
85 | . ;
|
---|
86 | . ; If skip flag is set, clear the resubmit flag and kill the temp global
|
---|
87 | . ; Else resubmit the claim
|
---|
88 | . I SKIP D
|
---|
89 | .. S $P(^BPST(IEN59,1),U,12)=0
|
---|
90 | .. K ^XTMP("BPSOSRB","MOREDATA",IEN59)
|
---|
91 | . E D
|
---|
92 | .. K MOREDATA
|
---|
93 | .. M MOREDATA=^XTMP("BPSOSRB","MOREDATA",IEN59,"RESUB")
|
---|
94 | .. K ^XTMP("BPSOSRB","MOREDATA",IEN59)
|
---|
95 | .. ;
|
---|
96 | .. ; Needed for Turn-Around Stats - Do NOT delete/alter!!
|
---|
97 | .. D LOG^BPSOSL(IEN59,$T(+0)_"-Now resubmit")
|
---|
98 | .. D CLAIM^BPSOSRB(IEN59,.MOREDATA)
|
---|
99 | ;
|
---|
100 | ; If the ECME Nightly Background job and CMOP release message are running at the same
|
---|
101 | ; time, there are unreleased RXs that are auto-reversed but then are released by
|
---|
102 | ; CMOP at the same time. Unfortunately, if the auto-reversal is in progress, CMOP
|
---|
103 | ; can not resubmit the claim (due to the queuing issue) so we need to automatically
|
---|
104 | ; submit them here.
|
---|
105 | ; Criteria:
|
---|
106 | ; Status is Reversal Accepted
|
---|
107 | ; RX is released
|
---|
108 | ; Normal Auto-Reversal
|
---|
109 | I CLMSTAT="E REVERSAL ACCEPTED" D
|
---|
110 | . N RX,RXR
|
---|
111 | . S RX=$P(IEN59,"."),RXR=+$E($P(IEN59,".",2),1,4)
|
---|
112 | . I '$$RXRLDT^PSOBPSUT(RX,RXR) Q
|
---|
113 | . N CLAIMIEN,AUTOREV
|
---|
114 | . S CLAIMIEN=$$GET1^DIQ(9002313.59,IEN59,3,"I")
|
---|
115 | . I '$G(CLAIMIEN) Q
|
---|
116 | . S AUTOREV=$$GET1^DIQ(9002313.02,CLAIMIEN,.07,"I")
|
---|
117 | . I $G(AUTOREV)'=1 Q
|
---|
118 | . N BDOS,BRES,BMES,BMSG
|
---|
119 | . D LOG^BPSOSL(IEN59,$T(+0)_"-Submit released auto-reversal")
|
---|
120 | . S BDOS=$$DOSDATE^BPSSCRRS(RX,RXR)
|
---|
121 | . S BRES=$$EN^BPSNCPDP(RX,RXR,BDOS,"ARES")
|
---|
122 | . D LOG^BPSOSL(IEN59,$T(+0)_"-Response from BPSNCPDP: "_BRES)
|
---|
123 | . S BMSG=$P(BRES,U,2),BRES=+BRES
|
---|
124 | . S BMES="Submitted to ECME: Resubmit for released autoreversal"
|
---|
125 | . S BMES=BMES_$S(BRES=1:"-NO SUBMISSION VIA ECME",BRES=4:"-NOT PROCESSED",BRES=5:"-SOFTWARE ERROR",1:"")
|
---|
126 | . D ECMEACT^PSOBPSU1(RX,RXR,BMES,.5)
|
---|
127 | . I BRES=2 D ECMEACT^PSOBPSU1(RX,RXR,"Not ECME Billable: "_BMSG,.5)
|
---|
128 | Q
|
---|
129 | ;
|
---|
130 | ; NEW57 - Copy the BPS Transaction into BPS Log of Transaction
|
---|
131 | ; Input
|
---|
132 | ; IEN59 - BPS Transaction
|
---|
133 | ; Returns
|
---|
134 | ; BPS Log of Transaction IEN
|
---|
135 | NEW57(IEN59) ;
|
---|
136 | F L +^BPSTL:300 Q:$T Q:'$$IMPOSS^BPSOSUE("L","RTI","LOCK ^BPSTL",,"NEW57",$T(+0))
|
---|
137 | ;
|
---|
138 | ; Get next record number in BPS Log of Transactions
|
---|
139 | NEW57A N N,C
|
---|
140 | S N=$P(^BPSTL(0),U,3)+1
|
---|
141 | S C=$P(^BPSTL(0),U,4)+1
|
---|
142 | S $P(^BPSTL(0),U,3,4)=N_U_C
|
---|
143 | I $D(^BPSTL(N)) G NEW57A ; should never happen
|
---|
144 | L -^BPSTL
|
---|
145 | ;
|
---|
146 | ; Merge BPS Transaction into Log of Transactions
|
---|
147 | M ^BPSTL(N)=^BPST(IEN59)
|
---|
148 | ;
|
---|
149 | ; Indexing - First, fileman indexing
|
---|
150 | D
|
---|
151 | . N DIK,DA S DIK="^BPSTL(",DA=N N N D IX1^DIK
|
---|
152 | ;
|
---|
153 | ; Setup the NON-FILEMAN index on RX and Fill
|
---|
154 | N A,B
|
---|
155 | S A=$P(^BPSTL(N,1),U,11)
|
---|
156 | S B=$P(^BPSTL(N,1),U)
|
---|
157 | S ^BPSTL("NON-FILEMAN","RXIRXR",A,B,N)=""
|
---|
158 | ;
|
---|
159 | ; Quit with the new record number
|
---|
160 | Q N
|
---|
161 | ;
|
---|
162 | ; ISREVES - Is this a reversal claim
|
---|
163 | ; Input
|
---|
164 | ; CLAIMIEN - Pointer to BPS Claims
|
---|
165 | ;
|
---|
166 | ; Return Value
|
---|
167 | ; 1 - Reversal claim
|
---|
168 | ; 0 - Not a reversal claim
|
---|
169 | ISREVERS(CLAIM) ;
|
---|
170 | Q $P($G(^BPSC(CLAIM,100)),"^",3)="B2"
|
---|
171 | ;
|
---|
172 | ; SETCSTAT - Set the status for every transaction associated with
|
---|
173 | ; this claim
|
---|
174 | SETCSTAT(CLAIM,STATUS) ;
|
---|
175 | N IEN59,INDEX
|
---|
176 | ;
|
---|
177 | ; Determine correct index
|
---|
178 | I $$ISREVERS(CLAIM) S INDEX="AER"
|
---|
179 | E S INDEX="AE"
|
---|
180 | ;
|
---|
181 | ; Loop through the transactions and set the status
|
---|
182 | S IEN59=""
|
---|
183 | F S IEN59=$O(^BPST(INDEX,CLAIM,IEN59)) Q:IEN59="" D SETSTAT(IEN59,STATUS)
|
---|
184 | Q
|
---|
185 | ;
|
---|
186 | ; ERROR - Handle any errors
|
---|
187 | ; Log them into BPS Transactions
|
---|
188 | ; Change status to 99
|
---|
189 | ; Update the LOG
|
---|
190 | ; Increment the statistics
|
---|
191 | ; We should be okay for the resubmit flag since the STATUS
|
---|
192 | ; will be E OTHER instead of E REVERSAL ACCEPTED
|
---|
193 | ; Input
|
---|
194 | ; RTN - Routine reporting the error
|
---|
195 | ; IEN59 - BPS Transaction
|
---|
196 | ; ERROR - Error Number (goes in RESULT CODE)
|
---|
197 | ; ERRTEXT - Error Text (goes in RESULT TEXT)
|
---|
198 | ;
|
---|
199 | ; To prevent conflicts, set the error number to the first digit of
|
---|
200 | ; Status and a unique number for the status.
|
---|
201 | ERROR(RTN,IEN59,ERROR,ERRTEXT) ;
|
---|
202 | ;
|
---|
203 | ; Check parameters
|
---|
204 | I '$G(IEN59) Q
|
---|
205 | I '$G(ERROR) S ERROR=0
|
---|
206 | I $G(ERRTEXT)="" S ERRTEXT="ERROR - see LOG"
|
---|
207 | ;
|
---|
208 | ; Set Error and Error Text in BPS Transaction
|
---|
209 | D SETRESU(IEN59,ERROR,ERRTEXT)
|
---|
210 | ;
|
---|
211 | ; Log Message
|
---|
212 | D LOG^BPSOSL(IEN59,RTN_" returned error - "_ERRTEXT)
|
---|
213 | ;
|
---|
214 | ; Update unbillable count in stats
|
---|
215 | D INCSTAT^BPSOSUD("R",1)
|
---|
216 | ;
|
---|
217 | ; Update Status to complete
|
---|
218 | D SETSTAT(IEN59,99)
|
---|
219 | Q
|
---|
220 | ;
|
---|
221 | ; SETRESU - Set Result into ^BPST(IEN59,2)
|
---|
222 | ; Input
|
---|
223 | ; IEN59 - BPS Transaction IEN
|
---|
224 | ; RESULT - Result Code
|
---|
225 | ; TEXT - Result Text. Semi-colons (";") should not in the text data as
|
---|
226 | ; this is used as a separator between current and previous text
|
---|
227 | ; messages. If there is a semi-colon, it is converted to a dash.
|
---|
228 | SETRESU(IEN59,RESULT,TEXT) ;
|
---|
229 | ;
|
---|
230 | ; First, store the Result Code
|
---|
231 | S $P(^BPST(IEN59,2),U)=$G(RESULT)
|
---|
232 | ;
|
---|
233 | ; Second, store the Result Text
|
---|
234 | ; Considerations:
|
---|
235 | ; Convert any semi-colons to dashes
|
---|
236 | ; Add semi-colon delimiter if needed
|
---|
237 | ; Truncate data if needed
|
---|
238 | I $G(TEXT)]"" D
|
---|
239 | . N X
|
---|
240 | . S TEXT=$TR(TEXT,";","-")
|
---|
241 | . S X=$P(^BPST(IEN59,2),U,2,99)
|
---|
242 | . I X]"",$E(X)'=";" S X=";"_X
|
---|
243 | . S X=$E(TEXT_X,1,255-$L(RESULT)-1)
|
---|
244 | . S $P(^BPST(IEN59,2),U,2)=X
|
---|
245 | Q
|
---|
246 | ;
|
---|
247 | ; SETCRESU - set the result code for every transaction assoc'd with
|
---|
248 | ; this claim. Note that this will only work for billing requests (B1)
|
---|
249 | ; Input
|
---|
250 | ; CLAIMIEN - BPS Claim IEN
|
---|
251 | ; RESULT - Result Code
|
---|
252 | ; TEXT - Result Text
|
---|
253 | SETCRESU(CLAIM,RESULT,TEXT) ;
|
---|
254 | N IEN59
|
---|
255 | S IEN59=""
|
---|
256 | F S IEN59=$O(^BPST("AE",CLAIM,IEN59)) Q:IEN59="" D SETRESU(IEN59,RESULT,$G(TEXT))
|
---|
257 | Q
|
---|
258 | ;
|
---|
259 | ; STATI(X) gives a text version of what status code X means.
|
---|
260 | ; For effeciency, put more common ones at the top.
|
---|
261 | ; Also note that you should check the display on the stats screen if you
|
---|
262 | ; modify any of these.
|
---|
263 | STATI(X) ;
|
---|
264 | I X=99 Q "Done"
|
---|
265 | I X=60 Q "Transmitting"
|
---|
266 | I X=0 Q "Waiting to start"
|
---|
267 | I X=40 Q "Building the HL7 packet"
|
---|
268 | I X=70 Q "Parsing response"
|
---|
269 | I X=30 Q "Building the claim"
|
---|
270 | I X=10 Q "Building the transaction"
|
---|
271 | I X=90 Q "Processing response"
|
---|
272 | I X=98 Q "Resubmitting" ; Used only by STATUS^BPSOSRX (Not stored in BPS Transactions)
|
---|
273 | I X=50 Q "Preparing for transmit"
|
---|
274 | I X=31 Q "Wait for retry (insurer asleep)"
|
---|
275 | I X=80 Q "Waiting to process response"
|
---|
276 | Q "?"_X_"?"
|
---|