| 1 | IBCE835 ;ALB/TMP - 835 EDI EXPLANATION OF BENEFITS MSG PROCESSING ;19-JAN-99 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**137,135,155,377**;21-MAR-94;Build 23 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | Q | 
|---|
| 6 | ; | 
|---|
| 7 | ; MESSAGE HEADER DATA STRING = | 
|---|
| 8 | ;   type of message^msg queue^msg #^bill #^^date/time | 
|---|
| 9 | ; | 
|---|
| 10 | HDR(IBCLNO,IBD) ;Process header data | 
|---|
| 11 | ; INPUT: | 
|---|
| 12 | ;   IBCLNO = claim # | 
|---|
| 13 | ; | 
|---|
| 14 | ;   ^TMP("IBMSGH",$J,0) = header message text | 
|---|
| 15 | ; | 
|---|
| 16 | ; OUTPUT: | 
|---|
| 17 | ;   IBD array returned with processed data | 
|---|
| 18 | ;      "LINE"  = The last line # populated in the message | 
|---|
| 19 | ;      "DATE"  = Date/Time of EOB (Fileman format) | 
|---|
| 20 | ;      "MRA"   = 1 if MRA, 0 if not | 
|---|
| 21 | ;      "X12"   = 1 if X12, 0 if not | 
|---|
| 22 | ; | 
|---|
| 23 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,0)=MESSAGE HEADER DATA STRING | 
|---|
| 24 | ;                                  ,"D",0,1)=header record raw data | 
|---|
| 25 | ;                                  ,"D1",1,0)=header record raw data | 
|---|
| 26 | ;                                  ,line #)=EOB message lines | 
|---|
| 27 | ; | 
|---|
| 28 | N CT,IB399,IBD0,IBBILL,LINE,L,X,Y,Z,%DT | 
|---|
| 29 | S IBD0=$G(^TMP("IBMSGH",$J,0)),IBD("LINE")=0 | 
|---|
| 30 | Q:IBD0="" | 
|---|
| 31 | S X=$P(IBD0,U,3),X=$E(X,5,8)_$E(X,1,4)_"@"_$P(IBD0,U,4) | 
|---|
| 32 | I X S %DT="XTS" D ^%DT | 
|---|
| 33 | S IBD("DATE")=$S(Y>0:Y,1:"") | 
|---|
| 34 | S IBD("MRA")=$P(IBD0,U,5) | 
|---|
| 35 | S IBD("X12")=($P(IBD0,U,2)="X") | 
|---|
| 36 | S CT=0 | 
|---|
| 37 | ; | 
|---|
| 38 | I $P(IBD0,U,6)'="" S CT=CT+1 S LINE(CT)=$G(LINE(CT))_"Payer Name: "_$P(IBD0,U,6) | 
|---|
| 39 | ; | 
|---|
| 40 | I CT D | 
|---|
| 41 | . S (L,Z)=0 | 
|---|
| 42 | . F  S Z=$O(LINE(Z)) Q:'Z  S L=L+1,^TMP("IBMSG",$J,"CLAIM",IBCLNO,L)=LINE(Z) | 
|---|
| 43 | . S IBD("LINE")=IBD("LINE")+CT | 
|---|
| 44 | ; | 
|---|
| 45 | S IB399=+$O(^DGCR(399,"B",$$GETCLM^IBCE277(IBCLNO),""),-1) | 
|---|
| 46 | ; | 
|---|
| 47 | S IBBILL=$$LAST364^IBCEF4(IB399) | 
|---|
| 48 | ; | 
|---|
| 49 | S ^TMP("IBMSG",$J,"CLAIM",IBCLNO,0)="835EOB"_U_$G(IBD("MSG#"))_U_$G(IBD("SUBJ"))_U_IBBILL_U_U_IBD("DATE") | 
|---|
| 50 | ; | 
|---|
| 51 | S ^TMP("IBMSG",$J,"CLAIM",IBCLNO,"D",0,1)="##RAW DATA: "_IBD0 | 
|---|
| 52 | S ^TMP("IBMSG",$J,"CLAIM",IBCLNO,"D1",1,0)="##RAW DATA: "_IBD0 | 
|---|
| 53 | Q | 
|---|
| 54 | ; | 
|---|
| 55 | 5(IBD) ; Process claim patient ID data | 
|---|
| 56 | ; INPUT: | 
|---|
| 57 | ;   IBD must be passed by reference = entire message line | 
|---|
| 58 | ; | 
|---|
| 59 | ; OUTPUT: | 
|---|
| 60 | ;   IBD array | 
|---|
| 61 | ;      "LINE" = the last line # populated in the message | 
|---|
| 62 | ; | 
|---|
| 63 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,line#)=claim pt id message lines | 
|---|
| 64 | ;                                  ,"D",5,msg seq #)= | 
|---|
| 65 | ;                                  ,"D1",msg seq #,5)= | 
|---|
| 66 | ;                                       claim pt id message raw data | 
|---|
| 67 | ; | 
|---|
| 68 | N IBBILL | 
|---|
| 69 | S IBBILL=$$GETCLM^IBCE277($P(IBD,U,2)) | 
|---|
| 70 | ; | 
|---|
| 71 | I '$D(^TMP("IBMSG",$J,"CLAIM",IBBILL)) D HDR(IBBILL,.IBD) ;Process header data if not already done for claim | 
|---|
| 72 | ; | 
|---|
| 73 | I $P(IBD,U,9) D  ;Statement dates | 
|---|
| 74 | . S IBD("LINE")=$G(IBD("LINE"))+1 | 
|---|
| 75 | . S ^TMP("IBMSG",$J,"CLAIM",IBBILL,IBD("LINE"))="Statement Dates: "_$$DATE^IBCE277($P(IBD,U,9))_" - "_$$DATE^IBCE277($P(IBD,U,10)) | 
|---|
| 76 | ; | 
|---|
| 77 | S ^TMP("IBMSG",$J,"CLAIM",IBBILL,"D",5,1)="##RAW DATA: "_IBD | 
|---|
| 78 | S ^TMP("IBMSG",$J,"CLAIM",IBBILL,"D1",1,5)="##RAW DATA: "_IBD | 
|---|
| 79 | Q | 
|---|
| 80 | ; | 
|---|
| 81 | 6(IBD) ; Process 06 record type for corrected name and/or ID# - IB*2*377 - 1/14/08 | 
|---|
| 82 | NEW IBCLM,Z | 
|---|
| 83 | S IBCLM=$$GETCLM^IBCE277($P(IBD,U,2)) | 
|---|
| 84 | Q:IBCLM="" | 
|---|
| 85 | I '$D(^TMP("IBMSG",$J,"CLAIM",IBCLM)) D HDR(IBCLM,.IBD)   ;Process header data if not already done for claim | 
|---|
| 86 | ; | 
|---|
| 87 | S Z=$G(IBD("LINE")) | 
|---|
| 88 | I $P(IBD,U,3)'="" S Z=Z+1,^TMP("IBMSG",$J,"CLAIM",IBCLM,Z)="Corrected Patient Last Name: "_$P(IBD,U,3) | 
|---|
| 89 | I $P(IBD,U,4)'="" S Z=Z+1,^TMP("IBMSG",$J,"CLAIM",IBCLM,Z)="Corrected Patient First Name: "_$P(IBD,U,4) | 
|---|
| 90 | I $P(IBD,U,5)'="" S Z=Z+1,^TMP("IBMSG",$J,"CLAIM",IBCLM,Z)="Corrected Patient Middle Name: "_$P(IBD,U,5) | 
|---|
| 91 | I $P(IBD,U,6)'="" S Z=Z+1,^TMP("IBMSG",$J,"CLAIM",IBCLM,Z)="Corrected Patient ID#: "_$P(IBD,U,6) | 
|---|
| 92 | S IBD("LINE")=Z | 
|---|
| 93 | ; | 
|---|
| 94 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",6,1)="##RAW DATA: "_IBD | 
|---|
| 95 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D1",1,6)="##RAW DATA: "_IBD | 
|---|
| 96 | Q | 
|---|
| 97 | ; | 
|---|
| 98 | 10(IBD) ; Process claim status data | 
|---|
| 99 | ; INPUT: | 
|---|
| 100 | ;   IBD must be passed by reference = entire message line | 
|---|
| 101 | ; | 
|---|
| 102 | ; OUTPUT: | 
|---|
| 103 | ;   IBD array returned with processed data | 
|---|
| 104 | ;      "CLAIM" = The claim # | 
|---|
| 105 | ;      "LINE" = The last line # populated in the message | 
|---|
| 106 | ; | 
|---|
| 107 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,line#)=claim status message lines | 
|---|
| 108 | ;                                  ,"D",10,msg seq #)= | 
|---|
| 109 | ;                                  ,"D1",msg seq #,10)= | 
|---|
| 110 | ;                                       claim status raw data | 
|---|
| 111 | ; | 
|---|
| 112 | N IBCLM,CT,LINE,L,Z,Z0,IBDATA,IBSTAT | 
|---|
| 113 | S IBCLM=$$GETCLM^IBCE277($P(IBD,U,2)) | 
|---|
| 114 | Q:IBCLM="" | 
|---|
| 115 | ; | 
|---|
| 116 | I '$D(^TMP("IBMSG",$J,"CLAIM",IBCLM)) D HDR(IBCLM,.IBD) ;Process header data if not already done for claim | 
|---|
| 117 | ; | 
|---|
| 118 | S CT=0 | 
|---|
| 119 | F Z=3:1:6 I $P(IBD,U,Z)="Y" D  Q  ;Claim status | 
|---|
| 120 | . S IBSTAT=(Z-2) | 
|---|
| 121 | . S CT=CT+1,LINE(CT)="CLAIM STATUS: "_$P("PROCESSED^DENIED^PENDED^REVERSAL",U,IBSTAT) | 
|---|
| 122 | I '$G(IBSTAT) D | 
|---|
| 123 | . S CT=CT+1,LINE(CT)="CLAIM STATUS: "_$P(IBD,U,7)_" (OTHER)" | 
|---|
| 124 | ; | 
|---|
| 125 | I $P(IBD,U,8)'="" D  ;Crossed over info | 
|---|
| 126 | . S LINE(CT)=LINE(CT)_"  Crossed over to: "_$P(IBD,U,9)_"  "_$P(IBD,U,8) | 
|---|
| 127 | ; | 
|---|
| 128 | I CT D | 
|---|
| 129 | . S L=$G(IBD("LINE")),Z=0 | 
|---|
| 130 | . F  S Z=$O(LINE(Z)) Q:'Z  S L=L+1,^TMP("IBMSG",$J,"CLAIM",IBCLM,L)=LINE(Z) | 
|---|
| 131 | . S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",10,1)="##RAW DATA: "_IBD | 
|---|
| 132 | . S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D1",1,10)="##RAW DATA: "_IBD | 
|---|
| 133 | . S IBD("LINE")=$G(IBD("LINE"))+CT | 
|---|
| 134 | Q | 
|---|
| 135 | ; | 
|---|
| 136 | 15(IBD) ; Process claim status data | 
|---|
| 137 | ; INPUT: | 
|---|
| 138 | ;   IBD must be passed by reference = entire message line | 
|---|
| 139 | ; | 
|---|
| 140 | ; OUTPUT: | 
|---|
| 141 | ;   IBD array | 
|---|
| 142 | ;      "LINE" = The last line # populated in the message | 
|---|
| 143 | ; | 
|---|
| 144 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,"D",15,msg seq #)= | 
|---|
| 145 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,"D1",msg seq #,15)= | 
|---|
| 146 | ;                                       claim status raw data | 
|---|
| 147 | ; | 
|---|
| 148 | N IBCLM,Z,Z0,IBDATA | 
|---|
| 149 | S IBCLM=$$GETCLM^IBCE277($P(IBD,U,2)) | 
|---|
| 150 | Q:IBCLM="" | 
|---|
| 151 | ; | 
|---|
| 152 | I '$D(^TMP("IBMSG",$J,"CLAIM",IBCLM)) D HDR(IBCLM,.IBD) ;Process header data if not already done for claim | 
|---|
| 153 | ; | 
|---|
| 154 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",15,1)="##RAW DATA: "_IBD | 
|---|
| 155 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D1",1,15)="##RAW DATA: "_IBD | 
|---|
| 156 | Q | 
|---|
| 157 | ; | 
|---|
| 158 | 20(IBD) ; Process claim level adjustment data | 
|---|
| 159 | ; Claim must have been referenced by a previous '05' level | 
|---|
| 160 | ; | 
|---|
| 161 | ; INPUT: | 
|---|
| 162 | ;   IBD must be passed by reference = entire message line | 
|---|
| 163 | ; | 
|---|
| 164 | ; OUTPUT: | 
|---|
| 165 | ;    IBD("LINE") = The last line # populated in the message | 
|---|
| 166 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,line #)=claim level adjustment | 
|---|
| 167 | ;                                  ,"D",20,seq#)= | 
|---|
| 168 | ;                                  ,"D1",seq#,20)= | 
|---|
| 169 | ;                                          claim level adjust. raw data | 
|---|
| 170 | ; | 
|---|
| 171 | N IBCLM | 
|---|
| 172 | S IBCLM=$$GETCLM^IBCE277($P(IBD,U,2)) | 
|---|
| 173 | Q:'$D(^TMP("IBMSG",$J,"CLAIM",IBCLM)) | 
|---|
| 174 | S IBD("LINE")=$G(IBD("LINE"))+1 | 
|---|
| 175 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,IBD("LINE"))="ADJUSTMENT GROUP: "_$P(IBD,U,3)_"  QTY: "_+$P(IBD,U,6)_", AMT: "_($P(IBD,U,5)/100) | 
|---|
| 176 | S IBD("LINE")=IBD("LINE")+1 | 
|---|
| 177 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,IBD("LINE"))="   REASON: ("_$P(IBD,U,4)_")  "_$P(IBD,U,7) | 
|---|
| 178 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",20,IBD("LINE"))="##RAW DATA: "_IBD | 
|---|
| 179 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D1",IBD("LINE"),20)="##RAW DATA: "_IBD | 
|---|
| 180 | Q | 
|---|
| 181 | ; | 
|---|
| 182 | 37(IBD) ; Process claim level adjustment data for Inpatient MEDICARE | 
|---|
| 183 | D 37^IBCE835A(.IBD) | 
|---|
| 184 | Q | 
|---|
| 185 | ; | 
|---|
| 186 | 40(IBD) ; Process service line data | 
|---|
| 187 | D 40^IBCE835A(.IBD) | 
|---|
| 188 | Q | 
|---|
| 189 | ; | 
|---|
| 190 | 45(IBD) ; Process service line adjustment data | 
|---|
| 191 | D 45^IBCE835A(.IBD) | 
|---|
| 192 | Q | 
|---|
| 193 | ; | 
|---|
| 194 | 17(IBD) ; Process claim contact data segment | 
|---|
| 195 | D XX(.IBD,17) | 
|---|
| 196 | Q | 
|---|
| 197 | ; | 
|---|
| 198 | 30(IBD) ; Process MEDICARE inpatient adjudication data (part 1) | 
|---|
| 199 | D XX(.IBD,30) | 
|---|
| 200 | Q | 
|---|
| 201 | ; | 
|---|
| 202 | 35(IBD) ; Process MEDICARE inpatient adjudication data (part 2) | 
|---|
| 203 | D XX(.IBD,35) | 
|---|
| 204 | Q | 
|---|
| 205 | ; | 
|---|
| 206 | 41(IBD) ; Process service line data (part 2) | 
|---|
| 207 | D XX(.IBD,41) | 
|---|
| 208 | Q | 
|---|
| 209 | ; | 
|---|
| 210 | 42(IBD) ; Process service line data (part 3) | 
|---|
| 211 | D XX(.IBD,42) | 
|---|
| 212 | Q | 
|---|
| 213 | ; | 
|---|
| 214 | 99(IBD) ; Process trailer record for non-MRA EOB | 
|---|
| 215 | D XX(.IBD,99) | 
|---|
| 216 | Q | 
|---|
| 217 | ; | 
|---|
| 218 | XX(IBD,IBID) ; Store non-displayed data nodes in TMP array | 
|---|
| 219 | ; | 
|---|
| 220 | ; INPUT: | 
|---|
| 221 | ;   IBD must be passed by reference = entire message line | 
|---|
| 222 | ;   IBID = record id for generic store | 
|---|
| 223 | ; | 
|---|
| 224 | ; OUTPUT: | 
|---|
| 225 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,"D",IBID,msg seq #)= | 
|---|
| 226 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,"D1",msg seq #,IBID)= | 
|---|
| 227 | ;                                       claim status raw data | 
|---|
| 228 | ;    IBD("LINE") = The last line # populated in the message | 
|---|
| 229 | ; | 
|---|
| 230 | N IBCLM | 
|---|
| 231 | S IBCLM=$$GETCLM^IBCE277($P(IBD,U,2)) | 
|---|
| 232 | ; | 
|---|
| 233 | S IBD("LINE")=$G(IBD("LINE"))+1 | 
|---|
| 234 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",IBID,IBD("LINE"))="##RAW DATA: "_IBD | 
|---|
| 235 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D1",IBD("LINE"),IBID)="##RAW DATA: "_IBD | 
|---|
| 236 | ; | 
|---|
| 237 | Q | 
|---|
| 238 | ; | 
|---|