| [613] | 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 |  ;
 | 
|---|