| 1 | IBCEMQC ;ALB/ESG - MRA EOB CRITERIA FOR AUTO-AUTHORIZE ; 11/1/06 10:34am | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**155,323,302,350,359**;21-MAR-94;Build 9 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | Q   ; must be called at proper entry point | 
|---|
| 6 | ; | 
|---|
| 7 | CRIT(IBEOB) ; Function to determine if EOB entry meets the criteria for | 
|---|
| 8 | ; auto-authorization and secondary claim submission | 
|---|
| 9 | ; | 
|---|
| 10 | ; Input:  IBEOB - internal entry number for an entry in 361.1 | 
|---|
| 11 | ; | 
|---|
| 12 | ; Output:  This function returns a pieced string | 
|---|
| 13 | ;          [1] 0 or 1, EOB meets criteria | 
|---|
| 14 | ;          [2] error message if the first piece is 0 | 
|---|
| 15 | ; | 
|---|
| 16 | NEW IBM,IBM3,IBM5,IBIFN,PCE,REMC,Z,OK,REASON,STOP,IBPTRESP | 
|---|
| 17 | ; | 
|---|
| 18 | S OK=0,REASON="Unknown",IBEOB=+$G(IBEOB) | 
|---|
| 19 | ; | 
|---|
| 20 | S IBM=$G(^IBM(361.1,IBEOB,0)) I IBM="" S REASON="No EOB Data Found" G CRITX | 
|---|
| 21 | I $D(^IBM(361.1,IBEOB,"ERR")) S REASON="Filing Errors" G CRITX | 
|---|
| 22 | I $P(IBM,U,13)'=1 S REASON="Claim Status is "_$$GET1^DIQ(361.1,IBEOB_",",.13)_".  It must be PROCESSED." G CRITX | 
|---|
| 23 | ; | 
|---|
| 24 | I $P(IBM,U,4)'=1 S REASON="The EOB Type is not Medicare MRA" G CRITX | 
|---|
| 25 | ; | 
|---|
| 26 | ; If any other MRA's on file for this bill failed the auto-generation | 
|---|
| 27 | ; check, then this MRA must also fail the check | 
|---|
| 28 | S IBIFN=+IBM,Z=0,STOP=0 | 
|---|
| 29 | F  S Z=$O(^IBM(361.1,"B",IBIFN,Z)) Q:'Z  D  Q:STOP | 
|---|
| 30 | . I Z=IBEOB Q             ; check different EOB records if they exist | 
|---|
| 31 | . I $P($G(^IBM(361.1,Z,0)),U,4)'=1 Q     ; must be an MRA | 
|---|
| 32 | . I $P($G(^IBM(361.1,Z,30)),U,1)="" Q    ; no problems recorded | 
|---|
| 33 | . S REASON="Another MRA for this bill (ien="_Z_") failed the auto-generation criteria check." | 
|---|
| 34 | . S STOP=1 | 
|---|
| 35 | . Q | 
|---|
| 36 | I STOP G CRITX | 
|---|
| 37 | ; | 
|---|
| 38 | ; If this EOB is a split EOB, then don't allow it | 
|---|
| 39 | I $$SPLIT^IBCEMU1(IBEOB) S REASON="Claim level remark code MA15 received.  Multiple MRA's" G CRITX | 
|---|
| 40 | ; | 
|---|
| 41 | ; Call the function that checks the claim level and/or line level | 
|---|
| 42 | ; adjustments for this EOB | 
|---|
| 43 | I '$$CAS(IBEOB,"B",.REASON) G CRITX      ; "B" for both | 
|---|
| 44 | ; | 
|---|
| 45 | ; Make sure the patient responsibility amount for this MRA is greater than $0 | 
|---|
| 46 | S IBPTRESP=$P($G(^IBM(361.1,IBEOB,1)),U,2)      ; Pt Resp Amt 1.02 field | 
|---|
| 47 | I $$FT^IBCEF(IBIFN)=3 S IBPTRESP=$$PTRESPI^IBCECOB1(IBEOB) | 
|---|
| 48 | I IBPTRESP'>0 S REASON="Patient responsibility dollar amount is less than or equal to $0" G CRITX | 
|---|
| 49 | ; | 
|---|
| 50 | ; Check the parameter values last of all | 
|---|
| 51 | I '$P($G(^IBE(350.9,1,8)),U,11) S REASON="Automatic MRA Processing parameter is turned off.  File 350.9, Field 8.11." G CRITX | 
|---|
| 52 | I '$P($G(^IBE(350.9,1,8)),U,12) S REASON="Allow MRA Processing parameter is turned off.  File 350.9, Field 8.12." G CRITX | 
|---|
| 53 | ; | 
|---|
| 54 | ; At this point, we're OK | 
|---|
| 55 | S OK=1,REASON="" | 
|---|
| 56 | ; | 
|---|
| 57 | CRITX ; | 
|---|
| 58 | Q OK_U_REASON | 
|---|
| 59 | ; | 
|---|
| 60 | ; | 
|---|
| 61 | CAS(IBEOB,ADJFLAG,REASON) ; This function determines if the EOB | 
|---|
| 62 | ; adjustment group codes and reason codes from file 361.1 (either | 
|---|
| 63 | ; claim level or line level or both) meet the criteria for auto- | 
|---|
| 64 | ; authorization and secondary claim submission. | 
|---|
| 65 | ; | 
|---|
| 66 | ; Input Parameters | 
|---|
| 67 | ;        IBEOB    - ien of entry in file 361.1 | 
|---|
| 68 | ;      ADJFLAG    - adjustment flag | 
|---|
| 69 | ;                   "C" - look at claim level adjustments only | 
|---|
| 70 | ;                   "L" - look at line level adjustments only | 
|---|
| 71 | ;                   "B" - look at both claim and line level adjustments | 
|---|
| 72 | ; Output Parameter | 
|---|
| 73 | ;       REASON    - error message describing why it failed | 
|---|
| 74 | ; | 
|---|
| 75 | ; Function Value is either 0 or 1, indicating if it passed the criteria | 
|---|
| 76 | ; | 
|---|
| 77 | NEW EOBADJ,OK,OKCOMBO,PATRESP,STOP,LNIEN | 
|---|
| 78 | ; | 
|---|
| 79 | S IBEOB=+$G(IBEOB) | 
|---|
| 80 | S ADJFLAG=$G(ADJFLAG,"B")     ; default is "B" if not passed in | 
|---|
| 81 | D BUILD           ; build the array of OK group/reason combinations | 
|---|
| 82 | S PATRESP=0       ; patient responsibility flag (default false) | 
|---|
| 83 | S STOP=0          ; Stop flag | 
|---|
| 84 | S OK=0            ; OK flag (function value) | 
|---|
| 85 | S REASON=""       ; error reason text | 
|---|
| 86 | ; | 
|---|
| 87 | ; claim level adjustments | 
|---|
| 88 | I $F(".C.B.","."_ADJFLAG_".") D | 
|---|
| 89 | . KILL EOBADJ | 
|---|
| 90 | . M EOBADJ=^IBM(361.1,IBEOB,10) | 
|---|
| 91 | . D ADJCHK | 
|---|
| 92 | . Q | 
|---|
| 93 | ; | 
|---|
| 94 | ; Get out if the claim level adjustments failed | 
|---|
| 95 | I STOP G CASX | 
|---|
| 96 | ; | 
|---|
| 97 | ; line level adjustments | 
|---|
| 98 | I $F(".L.B.","."_ADJFLAG_".") D | 
|---|
| 99 | . S LNIEN=0 | 
|---|
| 100 | . F  S LNIEN=$O(^IBM(361.1,IBEOB,15,LNIEN)) Q:'LNIEN  D  Q:STOP | 
|---|
| 101 | .. KILL EOBADJ | 
|---|
| 102 | .. M EOBADJ=^IBM(361.1,IBEOB,15,LNIEN,1) | 
|---|
| 103 | .. D ADJCHK | 
|---|
| 104 | .. Q | 
|---|
| 105 | . Q | 
|---|
| 106 | ; | 
|---|
| 107 | ; Get out if the line level adjustments failed | 
|---|
| 108 | I STOP G CASX | 
|---|
| 109 | ; | 
|---|
| 110 | ; Get out if there was no patient responsibility adjustments found | 
|---|
| 111 | I 'PATRESP S REASON="No Patient Responsibility Adjustments found" G CASX | 
|---|
| 112 | ; | 
|---|
| 113 | ; At this point, we're OK | 
|---|
| 114 | S OK=1,REASON="" | 
|---|
| 115 | CASX ; | 
|---|
| 116 | Q OK | 
|---|
| 117 | ; | 
|---|
| 118 | ; | 
|---|
| 119 | ADJCHK ; This procedure checks the adjustments for this EOB.  The group codes | 
|---|
| 120 | ; and reason codes are in the EOBADJ array structures from file 361.1. | 
|---|
| 121 | ; | 
|---|
| 122 | ;   Variables STOP and REASON will be returned on an error | 
|---|
| 123 | ;   Variable PATRESP will be returned if a valid PR adjustment found | 
|---|
| 124 | ; | 
|---|
| 125 | NEW ADJIEN,GROUP,RSNIEN,RSNCODE | 
|---|
| 126 | S ADJIEN=0 | 
|---|
| 127 | F  S ADJIEN=$O(EOBADJ(ADJIEN)) Q:'ADJIEN  D  Q:STOP | 
|---|
| 128 | . S GROUP=$P($G(EOBADJ(ADJIEN,0)),U,1) | 
|---|
| 129 | . I GROUP="LQ" Q      ; line level remark code kludge: 42 rec [3] | 
|---|
| 130 | . I GROUP="" S GROUP="<Undefined>" | 
|---|
| 131 | . I '$D(OKCOMBO(GROUP)) S STOP=1,REASON="Unacceptable Claim Adjustment Group Code: "_GROUP Q | 
|---|
| 132 | . S RSNIEN=0 | 
|---|
| 133 | . F  S RSNIEN=$O(EOBADJ(ADJIEN,1,RSNIEN)) Q:'RSNIEN  D  Q:STOP | 
|---|
| 134 | .. S RSNCODE=$P($G(EOBADJ(ADJIEN,1,RSNIEN,0)),U,1) | 
|---|
| 135 | .. ; | 
|---|
| 136 | .. ; Ignore some special adjustment data that is filed with the MRA | 
|---|
| 137 | .. I GROUP="PR",RSNCODE="AAA" Q    ; Allowed Amount: 41 rec [3] | 
|---|
| 138 | .. I GROUP="OA",RSNCODE="AB3" Q    ; Covered Amount: 15 rec [3] | 
|---|
| 139 | .. ; | 
|---|
| 140 | .. I RSNCODE="" S RSNCODE="<Undefined>" | 
|---|
| 141 | .. I '$D(OKCOMBO(GROUP,RSNCODE)) S STOP=1,REASON="Unacceptable Reason Code ("_RSNCODE_") for Claim Adjustment Group Code ("_GROUP_")" Q | 
|---|
| 142 | .. ; | 
|---|
| 143 | .. ; Set the flag if the group is PR | 
|---|
| 144 | .. I GROUP="PR" S PATRESP=1 | 
|---|
| 145 | .. Q | 
|---|
| 146 | . Q | 
|---|
| 147 | ADJCHKX ; | 
|---|
| 148 | Q | 
|---|
| 149 | ; | 
|---|
| 150 | ; | 
|---|
| 151 | BUILD ; This procedure builds the OKCOMBO array which identifies which | 
|---|
| 152 | ; combinations of group codes and reason codes are acceptable | 
|---|
| 153 | ; | 
|---|
| 154 | NEW LN,LINE,GROUP,RSNLST,R,RSN | 
|---|
| 155 | KILL OKCOMBO | 
|---|
| 156 | F LN=1:1 D  Q:$P(LINE,";",4)=""&$D(OKCOMBO) | 
|---|
| 157 | . S LINE=$T(OKCOMBO+LN) | 
|---|
| 158 | . S GROUP=$P(LINE,";",3) Q:GROUP="" | 
|---|
| 159 | . S RSNLST=$P(LINE,";",4) Q:RSNLST="" | 
|---|
| 160 | . F R=1:1:$L(RSNLST,",") D | 
|---|
| 161 | .. S RSN=$P(RSNLST,",",R) Q:RSN="" | 
|---|
| 162 | .. S OKCOMBO(GROUP,RSN)="" | 
|---|
| 163 | .. Q | 
|---|
| 164 | . Q | 
|---|
| 165 | BUILDX ; | 
|---|
| 166 | Q | 
|---|
| 167 | ; | 
|---|
| 168 | ; | 
|---|
| 169 | OKCOMBO ; This section lists OK combinations of adjustment category group codes | 
|---|
| 170 | ; and associated reason codes. | 
|---|
| 171 | ; The format is as follows - semi-colon delimiter | 
|---|
| 172 | ;     [3] Adjustment category (group code) | 
|---|
| 173 | ;     [4] List of acceptable reason codes - comma delimiter | 
|---|
| 174 | ; | 
|---|
| 175 | ; PR-AAA is created by VistA for the Allowed Amount | 
|---|
| 176 | ; OA-AB3 is created by VistA for the Covered Amount | 
|---|
| 177 | ; LQ-zzz is created by VistA for the Line Level remark | 
|---|
| 178 | ; | 
|---|
| 179 | ;;CO;A2,B6,42,45,172,94,194 | 
|---|
| 180 | ;;PR;1,2,66,122,AAA | 
|---|
| 181 | ;;OA;AB3 | 
|---|
| 182 | ; | 
|---|