| 1 | BPSOSRB ;BHAM ISC/FCS/DRS/FLS - Process claim on processing queue ;06/01/2004
 | 
|---|
| 2 |  ;;1.0;E CLAIMS MGMT ENGINE;**1,5**;JUN 2004;Build 45
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  Q
 | 
|---|
| 6 | BACKGR ;
 | 
|---|
| 7 |  I '$$LOCKNOW^BPSOSRX("BACKGROUND") Q
 | 
|---|
| 8 |  N TYPE,RXI,RXR,IEN59
 | 
|---|
| 9 |  I '$$LOCK^BPSOSRX("BACKGROUND",300) G FAIL
 | 
|---|
| 10 |  F TYPE="CLAIM","UNCLAIM" D
 | 
|---|
| 11 |  . S RXI="" F  S RXI=$O(^XTMP("BPS-PROC",TYPE,RXI)) Q:RXI=""  D
 | 
|---|
| 12 |  .. S RXR="" F  S RXR=$O(^XTMP("BPS-PROC",TYPE,RXI,RXR)) Q:RXR=""  D
 | 
|---|
| 13 |  ... N X S X=$$STATUS^BPSOSRX(RXI,RXR,0)
 | 
|---|
| 14 |  ... S IEN59=$$IEN59^BPSOSRX(RXI,RXR)
 | 
|---|
| 15 |  ... D LOG^BPSOSL(IEN59,$T(+0)_"-Dequeuing.  Type is "_TYPE)
 | 
|---|
| 16 |  ... I $P(X,U)="IN PROGRESS" D  Q
 | 
|---|
| 17 |  .... D LOG^BPSOSL(IEN59,$T(+0)_"-Status is 'IN PROGRESS'.  Will retry later.")
 | 
|---|
| 18 |  ... N TIME,MOREDATA
 | 
|---|
| 19 |  ... S TIME=^XTMP("BPS-PROC",TYPE,RXI,RXR) ; time requested
 | 
|---|
| 20 |  ... I '$$LOCK^BPSOSRX("SUBMIT",10) D  Q
 | 
|---|
| 21 |  .... D LOG^BPSOSL(IEN59,$T(+0)_"-Failed to $$LOCK^BPSOSRX(""SUBMIT"").  Will retry later.")
 | 
|---|
| 22 |  ... I $D(^XTMP("BPS-PROC",TYPE,RXI,RXR,"MOREDATA")) M MOREDATA=^("MOREDATA")
 | 
|---|
| 23 |  ... E  S MOREDATA=0
 | 
|---|
| 24 |  ... K ^XTMP("BPS-PROC",TYPE,RXI,RXR)
 | 
|---|
| 25 |  ... D BACKGR1(TYPE,RXI,RXR,TIME,.MOREDATA)
 | 
|---|
| 26 |  ... D UNLOCK^BPSOSRX("SUBMIT")
 | 
|---|
| 27 | FAIL D UNLOCK^BPSOSRX("BACKGROUND")
 | 
|---|
| 28 |  Q
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  ; BACKGR1 - Further processing of the claim
 | 
|---|
| 31 |  ; Besides the parameter below, IEN59 also needs to be defined
 | 
|---|
| 32 | BACKGR1(TYPE,RXI,RXR,TIME,MOREDATA) ;
 | 
|---|
| 33 |  ; Resolve multiple requests
 | 
|---|
| 34 |  N SKIP S SKIP=0 ; skip if you already got desired result
 | 
|---|
| 35 |  N SKIPREAS
 | 
|---|
| 36 |  N RESULT S RESULT=$$STATUS^BPSOSRX(RXI,RXR,0),RESULT=$P(RESULT,U)
 | 
|---|
| 37 |  N STARTTIM S STARTTIM=$$STARTTIM(RXI,RXR)
 | 
|---|
| 38 |  I TYPE="CLAIM" D
 | 
|---|
| 39 |  . I $$RXDEL^BPSOS(RXI,RXR) D  Q
 | 
|---|
| 40 |  .. S SKIP=1,SKIPREAS="Prescription is marked as DELETED or CANCELLED"
 | 
|---|
| 41 |  . ; If it's never been through ECME before, good.
 | 
|---|
| 42 |  . I RESULT="" Q
 | 
|---|
| 43 |  . ; There's already a complete transaction for this RXI,RXR
 | 
|---|
| 44 |  . ; (We screened out "IN PROGRESS" earlier)
 | 
|---|
| 45 |  . ; The program to poll indexes would have set DO NOT RESUBMIT.
 | 
|---|
| 46 |  . ; Calls from pharm pkg to ECME have '$D(MOREDATA("DO NOT RESUBMIT"))
 | 
|---|
| 47 |  . I $D(MOREDATA("DO NOT RESUBMIT")) D
 | 
|---|
| 48 |  .. S SKIP=1
 | 
|---|
| 49 |  .. S SKIPREAS="MOREDATA(""DO NOT RESUBMIT"") is set"
 | 
|---|
| 50 |  . E  I TIME<STARTTIM D  ; our request was made before trans. began
 | 
|---|
| 51 |  .. ; submit claim but only if the prev result was successful reversal
 | 
|---|
| 52 |  .. I RESULT="PAPER REVERSAL" Q
 | 
|---|
| 53 |  .. I RESULT="E REVERSAL ACCEPTED" Q
 | 
|---|
| 54 |  .. S SKIP=1
 | 
|---|
| 55 |  .. S SKIPREAS="Prev result "_RESULT_"; claim started "_STARTTIM_">"_TIME_" submitted"
 | 
|---|
| 56 |  . E  D  ; our request was made after it began
 | 
|---|
| 57 |  .. ; So we will make a reversal if necessary,
 | 
|---|
| 58 |  .. ; and then the claim will be resubmitted.
 | 
|---|
| 59 |  .. I RESULT="E PAYABLE"!(RESULT="E DUPLICATE"),$G(MOREDATA("REVERSE THEN RESUBMIT"))'=2 D
 | 
|---|
| 60 |  ... S MOREDATA("REVERSE THEN RESUBMIT")=1
 | 
|---|
| 61 |  E  I TYPE="UNCLAIM" D
 | 
|---|
| 62 |  . ; It must have gone through ECME with a payable result
 | 
|---|
| 63 |  . I RESULT="E PAYABLE" Q
 | 
|---|
| 64 |  . I RESULT="E DUPLICATE" Q
 | 
|---|
| 65 |  . N RXACTION S RXACTION=$G(MOREDATA("RX ACTION"))
 | 
|---|
| 66 |  . I RESULT="E REVERSAL REJECTED",(",DE,EREV,RS,"[(","_RXACTION_",")) Q
 | 
|---|
| 67 |  . I RESULT="E REVERSAL STRANDED",RXACTION="EREV" Q
 | 
|---|
| 68 |  . S SKIP=1
 | 
|---|
| 69 |  . S SKIPREAS="Cannot reverse - previous result was "_RESULT
 | 
|---|
| 70 |  E  D IMPOSS^BPSOSUE("P","TI","bad arg TYPE="_TYPE,,"BACKGR1",$T(+0))
 | 
|---|
| 71 |  I SKIP D  Q
 | 
|---|
| 72 |  . D LOG^BPSOSL(IEN59,$T(+0)_"-Skipping.  Reason: "_SKIPREAS)
 | 
|---|
| 73 |  S MOREDATA("SUBMIT TIME")=TIME
 | 
|---|
| 74 |  I TYPE="UNCLAIM"!$G(MOREDATA("REVERSE THEN RESUBMIT")) D REVERSE(IEN59,.MOREDATA)
 | 
|---|
| 75 |  I TYPE="CLAIM",'$G(MOREDATA("REVERSE THEN RESUBMIT")) D CLAIM(IEN59,.MOREDATA)
 | 
|---|
| 76 |  Q
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  ; STARTTIM - Get START TIME field from BPS Transactions
 | 
|---|
| 79 | STARTTIM(RXI,RXR) Q $P($G(^BPST($$IEN59^BPSOSRX(RXI,RXR),0)),U,11)
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  ; Process claim request
 | 
|---|
| 82 |  ; EP - Above and BPSOSU (for a resubmit after a reversal)
 | 
|---|
| 83 | CLAIM(IEN59,MOREDATA) ;
 | 
|---|
| 84 |  D LOG^BPSOSL(IEN59,$T(+0)_"-Initiating Claim")
 | 
|---|
| 85 |  D EN^BPSOSIZ(IEN59,.MOREDATA)
 | 
|---|
| 86 |  Q
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 |  ; Process the reversal
 | 
|---|
| 89 | REVERSE(IEN59,MOREDATA) ;
 | 
|---|
| 90 |  N MSG,RETVAL,REV
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ; Log Reversal or Reversal/Resubmit message.
 | 
|---|
| 93 |  ; Note that the reversal/resubmit message is needed
 | 
|---|
| 94 |  ;   for Turn-Around Stats - Do NOT delete/alter!!
 | 
|---|
| 95 |  S MSG=$T(+0)_"-Initiating Reversal"
 | 
|---|
| 96 |  I $G(MOREDATA("REVERSE THEN RESUBMIT"))=1 D
 | 
|---|
| 97 |  . S MSG=MSG_" and after that, claim will be resubmitted"
 | 
|---|
| 98 |  . N X,X1,X2
 | 
|---|
| 99 |  . S X1=DT,X2=30 D C^%DTC
 | 
|---|
| 100 |  . S ^XTMP("BPSOSRB",0)=X_U_DT_U_"PASS VARIABLES FOR RESUBMITS"
 | 
|---|
| 101 |  . K ^XTMP("BPSOSRB","MOREDATA",IEN59)
 | 
|---|
| 102 |  . M ^XTMP("BPSOSRB","MOREDATA",IEN59,"RESUB")=MOREDATA
 | 
|---|
| 103 |  D LOG^BPSOSL(IEN59,MSG)
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 |  ; Change status to 0% (Waiting to Start), which will reset START TIME,
 | 
|---|
| 106 |  ;   and then to 10% (Building transaction)
 | 
|---|
| 107 |  D SETSTAT^BPSOSU(IEN59,0)
 | 
|---|
| 108 |  D SETSTAT^BPSOSU(IEN59,10)
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  ; Update User (#13), RX Action (#1201), and Reversal Reason (#404)
 | 
|---|
| 111 |  ;   in BPS Transactions
 | 
|---|
| 112 |  N DIE,DR,DA
 | 
|---|
| 113 |  S DIE=9002313.59,DA=IEN59
 | 
|---|
| 114 |  S DR="6////"_$G(MOREDATA("SUBMIT TIME"))_";13////"_$G(MOREDATA("USER"))
 | 
|---|
| 115 |  S DR=DR_";404////"_$G(MOREDATA("REVERSAL REASON"))_";1201////"_$G(MOREDATA("RX ACTION"))
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 |  ; Also update RESUBMIT AFTER REVERSAL field (#1.12) if needed
 | 
|---|
| 118 |  I $G(MOREDATA("REVERSE THEN RESUBMIT"))=1 S DR=DR_";1.12////1"
 | 
|---|
| 119 |  D ^DIE
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 |  ; Log message for reverse without resubmit
 | 
|---|
| 122 |  I $G(MOREDATA("REVERSE THEN RESUBMIT"))=2 D LOG^BPSOSL(IEN59,$P($G(MOREDATA("BILL")),U,2)_"-Claim cannot be resubmitted")
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 |  ; Store contents of BPST in the Log
 | 
|---|
| 125 |  D LOG^BPSOSL(IEN59,$T(+0)_"-Contents of ^BPST("_IEN59_") :")
 | 
|---|
| 126 |  D LOG59^BPSOSQA(IEN59) ; Log contents of 9002313.59
 | 
|---|
| 127 |  ;
 | 
|---|
| 128 |  ; Add semi-colon to result text
 | 
|---|
| 129 |  D PREVISLY^BPSOSIZ(IEN59)
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 |  ; Contruct revesal claim
 | 
|---|
| 132 |  ;   If no reversal claim is returned, log error and quit.
 | 
|---|
| 133 |  S REV=$$REVERSE^BPSECA8(IEN59)
 | 
|---|
| 134 |  I REV=0 D  Q
 | 
|---|
| 135 |  . D LOG^BPSOSL(IEN59,$T(+0)_"-Reversal claim not created for "_IEN59)
 | 
|---|
| 136 |  . D ERROR^BPSOSU($T(+0),IEN59,100,"Reversal Claim not created")
 | 
|---|
| 137 |  ;
 | 
|---|
| 138 |  ; Update Reversal Field in the transaction
 | 
|---|
| 139 |  S DIE=9002313.59,DA=IEN59,DR="401////"_REV
 | 
|---|
| 140 |  D ^DIE
 | 
|---|
| 141 |  ;
 | 
|---|
| 142 |  ; Update Log
 | 
|---|
| 143 |  D LOG^BPSOSL(IEN59,$T(+0)_"-Reversal claim "_$P(^BPSC(REV,0),U)_" ("_REV_")")
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  ; Update status to 30% (Building the claim)
 | 
|---|
| 146 |  D SETSTAT^BPSOSU(IEN59,30)
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 |  ; Fire off task to get this on the HL7 queue
 | 
|---|
| 149 |  D TASK^BPSOSQA
 | 
|---|
| 150 |  Q
 | 
|---|