277 lines
8.7 KiB
Mathematica
277 lines
8.7 KiB
Mathematica
BPSOSU ;BHAM ISC/FCS/DRS/FLS - Common utilities ;06/01/2004
|
|
;;1.0;E CLAIMS MGMT ENGINE;**1,2,5**;JUN 2004;Build 45
|
|
;;Per VHA Directive 2004-038, this routine should not be modified.
|
|
Q
|
|
; Common utilities called a lot.
|
|
;
|
|
; SETSTAT - set status field for ^BPST(IEN59,
|
|
; Input:
|
|
; IEN59 - BPS Transaction
|
|
; STATUS - Value to set into BPS Transaction
|
|
SETSTAT(IEN59,STATUS) ; EP - from many places
|
|
;
|
|
; In case there is a timing problem, make sure the Status is not
|
|
; already more than the requested status
|
|
I STATUS'=0,$P(^BPST(IEN59,0),U,2)>STATUS Q
|
|
;
|
|
; Lock the record - something is very wrong if you can't get the lock
|
|
F L +^BPST(IEN59):300 Q:$T Q:'$$IMPOSS^BPSOSUE("L","RTI","LOCK +^BPST",,"SETSTAT",$T(+0))
|
|
N DIE,DA,DR,X
|
|
S DIE=9002313.59,DA=IEN59,DR="1///"_STATUS_";7///NOW" ; Status and Last Update
|
|
I STATUS=0 S DR=DR_";15///NOW" ; If Status is 0, init START TIME
|
|
D ^DIE
|
|
;
|
|
; Verify that there no other statuses in the X-ref
|
|
S X=""
|
|
F S X=$O(^BPST("AD",X)) Q:X="" D
|
|
. I X'=STATUS K ^BPST("AD",X,IEN59)
|
|
I STATUS=99 D STATUS99(IEN59)
|
|
L -^BPST(IEN59)
|
|
Q
|
|
;
|
|
; STATUS99 - Special activity when a claim reaches status 99
|
|
; Input:
|
|
; IEN59 - BPS Transaction IEN
|
|
STATUS99(IEN59) ;
|
|
N CLMSTAT,BPS57
|
|
;
|
|
; Get status of the claim
|
|
S CLMSTAT=$$CATEG^BPSOSUC(IEN59)
|
|
;
|
|
S BPS57=$$NEW57(IEN59)
|
|
D LOG^BPSOSL(IEN59,$T(+0)_"-Created BPS Log of Transaction record "_BPS57)
|
|
;
|
|
; If claims completed normally, log its completion.
|
|
; Do not log error'ed or stranded claims as we don't want to show these in the
|
|
; turn-around stats
|
|
; Needed for Turn-Around Stats - Do NOT delete/alter!!
|
|
I CLMSTAT'["E OTHER",CLMSTAT'["E STRANDED",CLMSTAT'["E REVERSAL STRANDED" D LOG^BPSOSL(IEN59,$T(+0)_"-Claim Complete")
|
|
;
|
|
; If the Reverse Then Resubmit field is set to Resubmitting (2),
|
|
; then set to 'Done' (0)
|
|
I $P(^BPST(IEN59,1),U,12)=2 S $P(^BPST(IEN59,1),U,12)=0
|
|
;
|
|
; If resubmit flag is set to 'Reverse, then Resubmit' (1), see about
|
|
; doing a resubmit
|
|
I $P(^BPST(IEN59,1),U,12)=1 D
|
|
. ;
|
|
. ; Initialize variables
|
|
. N SKIP,SITE
|
|
. D LOG^BPSOSL(IEN59,$T(+0)_"-Reverse then Resubmit attempt")
|
|
. ;
|
|
. ; Initialize the skip flag
|
|
. S SKIP=0
|
|
. ;
|
|
. ; Get Site info and make sure it exists
|
|
. S SITE=$P(^BPST(IEN59,1),U,4)
|
|
. I '$G(SITE) D
|
|
.. D LOG^BPSOSL(IEN59,$T(+0)_" Cannot - No site information")
|
|
.. S SKIP=1
|
|
. ;
|
|
. ; Check the ECME switch for the site
|
|
. I $G(SITE),'$$ECMEON^BPSUTIL(SITE) D
|
|
.. D LOG^BPSOSL(IEN59,$T(+0)_" Cannot - ECME switch is off for the site")
|
|
.. S SKIP=1
|
|
. ;
|
|
. ; If reversal was not successful, log message and quit
|
|
. I CLMSTAT'="E REVERSAL ACCEPTED" D
|
|
.. D LOG^BPSOSL(IEN59,$T(+0)_" Cannot - Reversal failed - "_CLMSTAT)
|
|
.. S SKIP=1
|
|
. ;
|
|
. ; Check if the MOREDATA array is defined
|
|
. I '$D(^XTMP("BPSOSRB","MOREDATA",IEN59,"RESUB")) D
|
|
.. D LOG^BPSOSL(IEN59,$T(+0)_" Cannot - MOREDATA array undefined")
|
|
.. S SKIP=1
|
|
. ;
|
|
. ; If skip flag is set, clear the resubmit flag and kill the temp global
|
|
. ; Else resubmit the claim
|
|
. I SKIP D
|
|
.. S $P(^BPST(IEN59,1),U,12)=0
|
|
.. K ^XTMP("BPSOSRB","MOREDATA",IEN59)
|
|
. E D
|
|
.. K MOREDATA
|
|
.. M MOREDATA=^XTMP("BPSOSRB","MOREDATA",IEN59,"RESUB")
|
|
.. K ^XTMP("BPSOSRB","MOREDATA",IEN59)
|
|
.. ;
|
|
.. ; Needed for Turn-Around Stats - Do NOT delete/alter!!
|
|
.. D LOG^BPSOSL(IEN59,$T(+0)_"-Now resubmit")
|
|
.. D CLAIM^BPSOSRB(IEN59,.MOREDATA)
|
|
;
|
|
; If the ECME Nightly Background job and CMOP release message are running at the same
|
|
; time, there are unreleased RXs that are auto-reversed but then are released by
|
|
; CMOP at the same time. Unfortunately, if the auto-reversal is in progress, CMOP
|
|
; can not resubmit the claim (due to the queuing issue) so we need to automatically
|
|
; submit them here.
|
|
; Criteria:
|
|
; Status is Reversal Accepted
|
|
; RX is released
|
|
; Normal Auto-Reversal
|
|
I CLMSTAT="E REVERSAL ACCEPTED" D
|
|
. N RX,RXR
|
|
. S RX=$P(IEN59,"."),RXR=+$E($P(IEN59,".",2),1,4)
|
|
. I '$$RXRLDT^PSOBPSUT(RX,RXR) Q
|
|
. N CLAIMIEN,AUTOREV
|
|
. S CLAIMIEN=$$GET1^DIQ(9002313.59,IEN59,3,"I")
|
|
. I '$G(CLAIMIEN) Q
|
|
. S AUTOREV=$$GET1^DIQ(9002313.02,CLAIMIEN,.07,"I")
|
|
. I $G(AUTOREV)'=1 Q
|
|
. N BDOS,BRES,BMES,BMSG
|
|
. D LOG^BPSOSL(IEN59,$T(+0)_"-Submit released auto-reversal")
|
|
. S BDOS=$$DOSDATE^BPSSCRRS(RX,RXR)
|
|
. S BRES=$$EN^BPSNCPDP(RX,RXR,BDOS,"ARES")
|
|
. D LOG^BPSOSL(IEN59,$T(+0)_"-Response from BPSNCPDP: "_BRES)
|
|
. S BMSG=$P(BRES,U,2),BRES=+BRES
|
|
. S BMES="Submitted to ECME: Resubmit for released autoreversal"
|
|
. S BMES=BMES_$S(BRES=1:"-NO SUBMISSION VIA ECME",BRES=4:"-NOT PROCESSED",BRES=5:"-SOFTWARE ERROR",1:"")
|
|
. D ECMEACT^PSOBPSU1(RX,RXR,BMES,.5)
|
|
. I BRES=2 D ECMEACT^PSOBPSU1(RX,RXR,"Not ECME Billable: "_BMSG,.5)
|
|
Q
|
|
;
|
|
; NEW57 - Copy the BPS Transaction into BPS Log of Transaction
|
|
; Input
|
|
; IEN59 - BPS Transaction
|
|
; Returns
|
|
; BPS Log of Transaction IEN
|
|
NEW57(IEN59) ;
|
|
F L +^BPSTL:300 Q:$T Q:'$$IMPOSS^BPSOSUE("L","RTI","LOCK ^BPSTL",,"NEW57",$T(+0))
|
|
;
|
|
; Get next record number in BPS Log of Transactions
|
|
NEW57A N N,C
|
|
S N=$P(^BPSTL(0),U,3)+1
|
|
S C=$P(^BPSTL(0),U,4)+1
|
|
S $P(^BPSTL(0),U,3,4)=N_U_C
|
|
I $D(^BPSTL(N)) G NEW57A ; should never happen
|
|
L -^BPSTL
|
|
;
|
|
; Merge BPS Transaction into Log of Transactions
|
|
M ^BPSTL(N)=^BPST(IEN59)
|
|
;
|
|
; Indexing - First, fileman indexing
|
|
D
|
|
. N DIK,DA S DIK="^BPSTL(",DA=N N N D IX1^DIK
|
|
;
|
|
; Setup the NON-FILEMAN index on RX and Fill
|
|
N A,B
|
|
S A=$P(^BPSTL(N,1),U,11)
|
|
S B=$P(^BPSTL(N,1),U)
|
|
S ^BPSTL("NON-FILEMAN","RXIRXR",A,B,N)=""
|
|
;
|
|
; Quit with the new record number
|
|
Q N
|
|
;
|
|
; ISREVES - Is this a reversal claim
|
|
; Input
|
|
; CLAIMIEN - Pointer to BPS Claims
|
|
;
|
|
; Return Value
|
|
; 1 - Reversal claim
|
|
; 0 - Not a reversal claim
|
|
ISREVERS(CLAIM) ;
|
|
Q $P($G(^BPSC(CLAIM,100)),"^",3)="B2"
|
|
;
|
|
; SETCSTAT - Set the status for every transaction associated with
|
|
; this claim
|
|
SETCSTAT(CLAIM,STATUS) ;
|
|
N IEN59,INDEX
|
|
;
|
|
; Determine correct index
|
|
I $$ISREVERS(CLAIM) S INDEX="AER"
|
|
E S INDEX="AE"
|
|
;
|
|
; Loop through the transactions and set the status
|
|
S IEN59=""
|
|
F S IEN59=$O(^BPST(INDEX,CLAIM,IEN59)) Q:IEN59="" D SETSTAT(IEN59,STATUS)
|
|
Q
|
|
;
|
|
; ERROR - Handle any errors
|
|
; Log them into BPS Transactions
|
|
; Change status to 99
|
|
; Update the LOG
|
|
; Increment the statistics
|
|
; We should be okay for the resubmit flag since the STATUS
|
|
; will be E OTHER instead of E REVERSAL ACCEPTED
|
|
; Input
|
|
; RTN - Routine reporting the error
|
|
; IEN59 - BPS Transaction
|
|
; ERROR - Error Number (goes in RESULT CODE)
|
|
; ERRTEXT - Error Text (goes in RESULT TEXT)
|
|
;
|
|
; To prevent conflicts, set the error number to the first digit of
|
|
; Status and a unique number for the status.
|
|
ERROR(RTN,IEN59,ERROR,ERRTEXT) ;
|
|
;
|
|
; Check parameters
|
|
I '$G(IEN59) Q
|
|
I '$G(ERROR) S ERROR=0
|
|
I $G(ERRTEXT)="" S ERRTEXT="ERROR - see LOG"
|
|
;
|
|
; Set Error and Error Text in BPS Transaction
|
|
D SETRESU(IEN59,ERROR,ERRTEXT)
|
|
;
|
|
; Log Message
|
|
D LOG^BPSOSL(IEN59,RTN_" returned error - "_ERRTEXT)
|
|
;
|
|
; Update unbillable count in stats
|
|
D INCSTAT^BPSOSUD("R",1)
|
|
;
|
|
; Update Status to complete
|
|
D SETSTAT(IEN59,99)
|
|
Q
|
|
;
|
|
; SETRESU - Set Result into ^BPST(IEN59,2)
|
|
; Input
|
|
; IEN59 - BPS Transaction IEN
|
|
; RESULT - Result Code
|
|
; TEXT - Result Text. Semi-colons (";") should not in the text data as
|
|
; this is used as a separator between current and previous text
|
|
; messages. If there is a semi-colon, it is converted to a dash.
|
|
SETRESU(IEN59,RESULT,TEXT) ;
|
|
;
|
|
; First, store the Result Code
|
|
S $P(^BPST(IEN59,2),U)=$G(RESULT)
|
|
;
|
|
; Second, store the Result Text
|
|
; Considerations:
|
|
; Convert any semi-colons to dashes
|
|
; Add semi-colon delimiter if needed
|
|
; Truncate data if needed
|
|
I $G(TEXT)]"" D
|
|
. N X
|
|
. S TEXT=$TR(TEXT,";","-")
|
|
. S X=$P(^BPST(IEN59,2),U,2,99)
|
|
. I X]"",$E(X)'=";" S X=";"_X
|
|
. S X=$E(TEXT_X,1,255-$L(RESULT)-1)
|
|
. S $P(^BPST(IEN59,2),U,2)=X
|
|
Q
|
|
;
|
|
; SETCRESU - set the result code for every transaction assoc'd with
|
|
; this claim. Note that this will only work for billing requests (B1)
|
|
; Input
|
|
; CLAIMIEN - BPS Claim IEN
|
|
; RESULT - Result Code
|
|
; TEXT - Result Text
|
|
SETCRESU(CLAIM,RESULT,TEXT) ;
|
|
N IEN59
|
|
S IEN59=""
|
|
F S IEN59=$O(^BPST("AE",CLAIM,IEN59)) Q:IEN59="" D SETRESU(IEN59,RESULT,$G(TEXT))
|
|
Q
|
|
;
|
|
; STATI(X) gives a text version of what status code X means.
|
|
; For effeciency, put more common ones at the top.
|
|
; Also note that you should check the display on the stats screen if you
|
|
; modify any of these.
|
|
STATI(X) ;
|
|
I X=99 Q "Done"
|
|
I X=60 Q "Transmitting"
|
|
I X=0 Q "Waiting to start"
|
|
I X=40 Q "Building the HL7 packet"
|
|
I X=70 Q "Parsing response"
|
|
I X=30 Q "Building the claim"
|
|
I X=10 Q "Building the transaction"
|
|
I X=90 Q "Processing response"
|
|
I X=98 Q "Resubmitting" ; Used only by STATUS^BPSOSRX (Not stored in BPS Transactions)
|
|
I X=50 Q "Preparing for transmit"
|
|
I X=31 Q "Wait for retry (insurer asleep)"
|
|
I X=80 Q "Waiting to process response"
|
|
Q "?"_X_"?"
|