| 1 | BPSOSQL ;BHAM ISC/FCS/DRS/FLS - Process responses ;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 | ; | 
|---|
| 7 | ;  ONE(CLAIMIEN,RESPIEN) | 
|---|
| 8 | ;     Process the Response for the claim.  Loop through the | 
|---|
| 9 | ;     transaction associated with the claim and call RESP1 | 
|---|
| 10 | ;  RESP1 | 
|---|
| 11 | ;     The real work of response handling for one IEN59 is in here | 
|---|
| 12 | ;  RESPBAD | 
|---|
| 13 | ;     Branch from RESP1 if there is no response value in the | 
|---|
| 14 | ;     prescription | 
|---|
| 15 | ; | 
|---|
| 16 | ; ONE - Both the claim and response record are correct and complete | 
|---|
| 17 | ;   Now update all of the prescription records affected by them. | 
|---|
| 18 | ONE(CLAIMIEN,RESPIEN) ; | 
|---|
| 19 | N ISREVERS,INDEX,IEN59 | 
|---|
| 20 | S ISREVERS=$$ISREVERS^BPSOSU(CLAIMIEN) | 
|---|
| 21 | S INDEX=$S(ISREVERS:"AER",1:"AE") | 
|---|
| 22 | S IEN59=0 | 
|---|
| 23 | F  S IEN59=$O(^BPST(INDEX,CLAIMIEN,IEN59)) Q:IEN59=""  D | 
|---|
| 24 | . D RESP1(IEN59,ISREVERS,CLAIMIEN,RESPIEN) | 
|---|
| 25 | Q | 
|---|
| 26 | ; | 
|---|
| 27 | ; RESP1 - Process each transaction associated with the claim | 
|---|
| 28 | RESP1(IEN59,REVERSAL,CLAIMIEN,RESPIEN) ; called from ONE | 
|---|
| 29 | N ERROR,ERRTXT,X,MSG | 
|---|
| 30 | ; | 
|---|
| 31 | ; Store pointer to response | 
|---|
| 32 | N DIE,DA,DR | 
|---|
| 33 | S DIE=9002313.59,DA=IEN59 | 
|---|
| 34 | S DR=$S(REVERSAL:402,1:4)_"////"_RESPIEN | 
|---|
| 35 | D ^DIE | 
|---|
| 36 | ; | 
|---|
| 37 | ; Update the status | 
|---|
| 38 | D SETSTAT^BPSOSU(IEN59,90) ; "Processing response" | 
|---|
| 39 | ; | 
|---|
| 40 | ; Get Position and log it | 
|---|
| 41 | N POSITION S POSITION=$P(^BPST(IEN59,0),U,9) | 
|---|
| 42 | I REVERSAL S POSITION=1 ; but reversals have only 1 transaction | 
|---|
| 43 | ; | 
|---|
| 44 | ; | 
|---|
| 45 | S MSG=$T(+0)_"-Processing " | 
|---|
| 46 | I REVERSAL S MSG=MSG_"Reversal " | 
|---|
| 47 | S MSG=MSG_"Response #"_RESPIEN_" for Claim #"_CLAIMIEN_" and position "_POSITION | 
|---|
| 48 | D LOG^BPSOSL(IEN59,MSG) | 
|---|
| 49 | ; | 
|---|
| 50 | ; If the Response Status is missing for the prescription, quit with error | 
|---|
| 51 | I '$D(^BPSR(RESPIEN,1000,POSITION,500)) D  G RESPBAD | 
|---|
| 52 | . S ERROR=901,ERRTXT="Corrupted response `"_RESPIEN | 
|---|
| 53 | ; | 
|---|
| 54 | ; Get the Respose Status for the prescription and update the statistics | 
|---|
| 55 | N RESP S RESP=$P(^BPSR(RESPIEN,1000,POSITION,500),U) | 
|---|
| 56 | D INCSTAT^BPSOSUD("R",$S(RESP="R"&REVERSAL:7,RESP="R":2,RESP="P":3,RESP="D":4,RESP="C":5,RESP="A":6,1:19)) | 
|---|
| 57 | ; | 
|---|
| 58 | ; Log Response and if Payable, Amount Paid | 
|---|
| 59 | S MSG=$T(+0)_"-Response = "_RESP | 
|---|
| 60 | I RESP="P" S MSG=MSG_"-$"_$$INSPAID1^BPSOS03(RESPIEN,POSITION) | 
|---|
| 61 | D LOG^BPSOSL(IEN59,MSG) | 
|---|
| 62 | ; | 
|---|
| 63 | ; If the claims was rejected, log the reject reason | 
|---|
| 64 | I RESP="R" D  ; rejected, give rejection reasons | 
|---|
| 65 | . N J S J=0 F  S J=$O(^BPSR(RESPIEN,1000,POSITION,511,J)) Q:'J  D | 
|---|
| 66 | .. N R S R=$P($G(^BPSR(RESPIEN,1000,POSITION,511,J,0)),U) | 
|---|
| 67 | .. N X | 
|---|
| 68 | .. I R]"" D | 
|---|
| 69 | ... S X=$O(^BPSF(9002313.93,"B",R,0)) | 
|---|
| 70 | ... I X]"" S X=$P($G(^BPSF(9002313.93,X,0)),U,2) | 
|---|
| 71 | .. E  S X="" | 
|---|
| 72 | .. D LOG^BPSOSL(IEN59,"Reject Code: "_R_" - "_X) | 
|---|
| 73 | . ; | 
|---|
| 74 | . ; If there are reject codes and the claim is not a reversal, synch reject codes | 
|---|
| 75 | . ;   with Outpatient Pharmacy | 
|---|
| 76 | . I 'REVERSAL D DURSYNC^BPSECMP2(IEN59) | 
|---|
| 77 | ; | 
|---|
| 78 | ; Get response messages and log them. | 
|---|
| 79 | S X=$G(^BPSR(RESPIEN,504)) | 
|---|
| 80 | I X]"" D LOG^BPSOSL(IEN59,"Response Message: "_X) | 
|---|
| 81 | S X=$G(^BPSR(RESPIEN,1000,POSITION,504)) | 
|---|
| 82 | I X]"" D LOG^BPSOSL(IEN59,"Response Message: "_X) | 
|---|
| 83 | S X=$G(^BPSR(RESPIEN,1000,POSITION,526)) | 
|---|
| 84 | I X]"" D LOG^BPSOSL(IEN59,"Response Message: "_X) | 
|---|
| 85 | ; | 
|---|
| 86 | ; Get Payer Sheet and Payer Sheet name | 
|---|
| 87 | N PAYSH,PAYSHNM | 
|---|
| 88 | S PAYSH=$$PAYERSH^BPSOSQF(IEN59),PAYSHNM=$$GET1^DIQ(9002313.92,PAYSH_",",.01,"E") | 
|---|
| 89 | ; | 
|---|
| 90 | ; Check if the payer should go to sleep based on the reject codes | 
|---|
| 91 | I $$REJSLEEP^BPSOSQ4(RESPIEN,POSITION) D  ; ins. asleep: want to retry | 
|---|
| 92 | . D SETSTAT^BPSOSU(IEN59,31) | 
|---|
| 93 | . N RETRY | 
|---|
| 94 | . S RETRY=$$INCSLEEP^BPSOSQ4(IEN59,PAYSH) | 
|---|
| 95 | . D LOG^BPSOSL(IEN59,$T(+0)_"-Insurer asleep; retry scheduled for "_RETRY_" for "_$G(PAYSHNM)) | 
|---|
| 96 | E  D  ; else: a normal kind of response, so we are done | 
|---|
| 97 | . D CLRSLEEP^BPSOSQ4(IEN59,PAYSH) | 
|---|
| 98 | . N RESULT | 
|---|
| 99 | . I REVERSAL S RESULT="Reversal " | 
|---|
| 100 | . S RESULT=$G(RESULT)_$S(RESP="R":"Rejected",RESP="P":"Payable",RESP="D":"Duplicate",RESP="C":"Captured",RESP="A":"Accepted",1:"Completed") | 
|---|
| 101 | . D SETRESU^BPSOSU(IEN59,0,RESULT) | 
|---|
| 102 | . D SETSTAT^BPSOSU(IEN59,99) ; "Done" | 
|---|
| 103 | Q | 
|---|
| 104 | ; | 
|---|
| 105 | RESPBAD ; corrupted response escape from RESP1 - reached by a GOTO from RESP | 
|---|
| 106 | ; Log the error | 
|---|
| 107 | D ERROR^BPSOSU($T(+0),IEN59,$G(ERROR),$G(ERRTXT)) | 
|---|
| 108 | Q | 
|---|