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