| 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_"?"
 | 
|---|