| [623] | 1 | IBCE277 ;ALB/TMP - 277 EDI CLAIM STATUS MESSAGE PROCESSING ;15-JUL-98 | 
|---|
|  | 2 | ;;2.0;INTEGRATED BILLING;**137,155**;21-MAR-94 | 
|---|
|  | 3 | Q | 
|---|
|  | 4 | ; MESSAGE HEADER DATA STRING = | 
|---|
|  | 5 | ;   type of message^msg queue^msg #^bill #^REF NUM/Batch #^date/time | 
|---|
|  | 6 | ; | 
|---|
|  | 7 | HDR(ENTITY,ENTVAL,IBTYPE,IBD) ;Process header data | 
|---|
|  | 8 | ; INPUT: | 
|---|
|  | 9 | ;   ENTITY = "BATCH" if batch level message | 
|---|
|  | 10 | ;            "CLAIM" if claim level message | 
|---|
|  | 11 | ;   ENTVAL = batch # or claim # | 
|---|
|  | 12 | ;   IBTYPE = the type of status msg this piece of the message represents | 
|---|
|  | 13 | ;             (837REC1, 837REJ1) | 
|---|
|  | 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 status (Fileman format) | 
|---|
|  | 20 | ;      "MRA" =  1 if MRA, 0 if not         "X12" = 1 if X12, 0 if not | 
|---|
|  | 21 | ;      "BATCH" = Batch ien for batch level calls | 
|---|
|  | 22 | ;      "SOURCE" = Source of message code^source name, if known | 
|---|
|  | 23 | ; | 
|---|
|  | 24 | ;   ^TMP("IBMSG",$J,"BATCH",batch #,0)=MESSAGE HEADER DATA STRING | 
|---|
|  | 25 | ;                                      if called from batch level | 
|---|
|  | 26 | ;                                  ,"D",0,1)=header record raw data | 
|---|
|  | 27 | ;                                  ,line #)=batch status message lines | 
|---|
|  | 28 | ; | 
|---|
|  | 29 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,0)=MESSAGE HEADER DATA STRING | 
|---|
|  | 30 | ;                                      if called from claim level | 
|---|
|  | 31 | ;                                  ,"D",0,1)=header record raw data | 
|---|
|  | 32 | ;                                  ,line #)=claim status message lines | 
|---|
|  | 33 | ; | 
|---|
|  | 34 | N CT,CT1,IBBILL,IBD0,L,LINE,PC,Z,X,Y | 
|---|
|  | 35 | S IBD0=$G(^TMP("IBMSGH",$J,0)),IBD("LINE")=0 | 
|---|
|  | 36 | Q:IBD0="" | 
|---|
|  | 37 | S Y=0,X=$$DATE($P(IBD0,U,3))_"@"_$E($P(IBD0,U,4)_"0000",1,4) | 
|---|
|  | 38 | I X S %DT="XTS" D ^%DT | 
|---|
|  | 39 | S IBD("DATE")=$S(Y>0:Y,1:"") | 
|---|
|  | 40 | S IBD("MRA")=$P(IBD0,U,5),IBD("X12")=($P(IBD0,U,2)="X") | 
|---|
|  | 41 | S IBD("SOURCE")=$P(IBD0,U,12,13) | 
|---|
|  | 42 | S CT=0 | 
|---|
|  | 43 | ; | 
|---|
|  | 44 | I ENTITY="BATCH",ENTVAL'="" D  ;Only pertinent for batch level extract | 
|---|
|  | 45 | . S IBD("BATCH")=$O(^IBA(364.1,"B",ENTVAL,0)) | 
|---|
|  | 46 | . F PC=6:1:9 D | 
|---|
|  | 47 | .. I $P(IBD0,U,PC)'="" S DATA=$P("# Claims Submitted^# Claims Rejected^Total Charges Submitted^Total Charges Rejected",U,PC-5)_": "_$S(PC<8:+$P(IBD0,U,PC),1:$FNUMBER($P(IBD0,U,PC)/100,"",2))_"  " | 
|---|
|  | 48 | .. I CT,$L($G(LINE(CT)))+$L(DATA)>80 S CT=CT+1 | 
|---|
|  | 49 | .. S:'CT CT=1 S LINE(CT)=$G(LINE(CT))_DATA | 
|---|
|  | 50 | ; | 
|---|
|  | 51 | I ENTVAL'="",$TR($P(IBD0,U,10,13),U)'="" S CT1=CT,CT=CT+1 F PC=10,11,12 D  ;Both batch, claim levels extract | 
|---|
|  | 52 | . Q:$P(IBD0,U,PC)="" | 
|---|
|  | 53 | . I PC<12 S LINE(CT)=$G(LINE(CT))_$P("Payer Name^Payer ID",U,PC-9)_": "_$P(IBD0,U,PC)_"  ",CT1=CT Q | 
|---|
|  | 54 | . I $P(IBD0,U,12)'=""!($P(IBD0,U,13)'="") S:$P(IBD0,U,10)'=""!($P(IBD0,U,11)'="") CT=CT+1 S LINE(CT)="Source: "_$S($P(IBD0,U,12)="Y":"Sent by payer",$P(IBD0,U,13)'="":"Sent by non-payer ("_$P(IBD0,U,13)_")",1:"UNKNOWN")_"  " | 
|---|
|  | 55 | ; | 
|---|
|  | 56 | I CT D | 
|---|
|  | 57 | . S (L,Z)=0 | 
|---|
|  | 58 | . F  S Z=$O(LINE(Z)) Q:'Z  S L=L+1,^TMP("IBMSG-H",$J,ENTITY,ENTVAL,L)=LINE(Z) | 
|---|
|  | 59 | . ;S IBD("LINE")=$G(IBD("LINE"))+CT | 
|---|
|  | 60 | ; | 
|---|
|  | 61 | I ENTITY="CLAIM" D | 
|---|
|  | 62 | . N Z0 | 
|---|
|  | 63 | . S Z0=+$O(^DGCR(399,"B",ENTVAL,0)) | 
|---|
|  | 64 | . I $G(IBD("BATCH")) S IBBILL=$O(^IBA(364,"ABABI",+$G(IBD("BATCH")),Z0,""),-1) Q | 
|---|
|  | 65 | . S IBBILL=$$LAST364^IBCEF4(Z0) | 
|---|
|  | 66 | S ^TMP("IBMSG",$J,ENTITY,ENTVAL,0)=IBTYPE_U_$G(IBD("MSG#"))_U_$G(IBD("SUBJ"))_U_$S(ENTITY="CLAIM":IBBILL,1:"")_U_$S(ENTITY="BATCH":ENTVAL,1:"")_U_IBD("DATE")_U_IBD("SOURCE") | 
|---|
|  | 67 | ; | 
|---|
|  | 68 | S ^TMP("IBMSG",$J,ENTITY,ENTVAL,"D",0,1)="##RAW DATA: "_IBD0 | 
|---|
|  | 69 | Q | 
|---|
|  | 70 | ; | 
|---|
|  | 71 | 5(IBD) ; Process batch status data | 
|---|
|  | 72 | ; INPUT: | 
|---|
|  | 73 | ;   IBD must be passed by reference = entire message line | 
|---|
|  | 74 | ; OUTPUT: | 
|---|
|  | 75 | ;   IBD array returned with processed data | 
|---|
|  | 76 | ;      "LINE" = The last line # populated in the message | 
|---|
|  | 77 | ; | 
|---|
|  | 78 | ;   ^TMP("IBMSG",$J,"BATCH",batch #,line#)=batch status message lines | 
|---|
|  | 79 | ;                                  ,"D",5,msg seq #)= | 
|---|
|  | 80 | ;                                       batch status message raw data | 
|---|
|  | 81 | ; | 
|---|
|  | 82 | N CT,DATA,IBBTCH,IBTYPE,L,LINE,Z | 
|---|
|  | 83 | K ^TMP("IBCONF",$J) | 
|---|
|  | 84 | S IBBTCH=+$P(IBD,U,2) | 
|---|
|  | 85 | S IBTYPE=$S($P(IBD,U,3)="R":"837REJ1",1:"837REC1") | 
|---|
|  | 86 | I '$D(^TMP("IBMSG",$J,"BATCH",IBBTCH)) D HDR("BATCH",IBBTCH,IBTYPE,.IBD) ;Process header data if not already done for batch | 
|---|
|  | 87 | S CT=0,LINE(1)="" | 
|---|
|  | 88 | S DATA=$P(IBD,U,4) | 
|---|
|  | 89 | I DATA'="",$TR($P(IBD,U,5,7),U)'="" D | 
|---|
|  | 90 | . Q:$G(^TMP("IBMSG",$J,"BATCH",IBBTCH))=DATA | 
|---|
|  | 91 | . S:'CT CT=CT+1 S LINE(CT)=$G(LINE(CT))_$S(DATA="W":"Warning",DATA="E":"Error",1:"Informational")_"  " | 
|---|
|  | 92 | S ^TMP("IBMSG",$J,"BATCH",IBBTCH)=DATA | 
|---|
|  | 93 | I $P(IBD,U,5)'="" S:'CT CT=CT+1 S LINE(CT)=$G(LINE(CT))_"Code: "_$P(IBD,U,5) | 
|---|
|  | 94 | I $P(IBD,U,6)'="" S:'CT CT=CT+1 S LINE(CT)=$G(LINE(CT))_"  "_$P(IBD,U,6),CT=CT+1 | 
|---|
|  | 95 | I $P(IBD,U,7)'="" S:'CT CT=CT+1 S LINE(CT)=$G(LINE(CT))_"  "_$P(IBD,U,7) | 
|---|
|  | 96 | I CT D | 
|---|
|  | 97 | . S L=$G(IBD("LINE")),Z=0 | 
|---|
|  | 98 | . F  S Z=$O(LINE(Z)) Q:'Z  S L=L+1,^TMP("IBMSG",$J,"BATCH",IBBTCH,L)=LINE(Z) | 
|---|
|  | 99 | . S ^TMP("IBMSG",$J,"BATCH",IBBTCH,"D",5,$O(^TMP("IBMSG",$J,"BATCH",IBBTCH,"D",5,""),-1)+1)="##RAW DATA: "_IBD | 
|---|
|  | 100 | . S IBD("LINE")=$G(IBD("LINE"))+CT | 
|---|
|  | 101 | Q | 
|---|
|  | 102 | ; | 
|---|
|  | 103 | 10(IBD) ; Process claim status data | 
|---|
|  | 104 | ; INPUT: | 
|---|
|  | 105 | ;   IBD must be passed by reference = entire message line | 
|---|
|  | 106 | ; OUTPUT: | 
|---|
|  | 107 | ;   IBD array returned with processed data | 
|---|
|  | 108 | ;      "CLAIM" = The claim # | 
|---|
|  | 109 | ;      "LINE" = The last line # populated in the message | 
|---|
|  | 110 | ; | 
|---|
|  | 111 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #,line#)=claim status message lines | 
|---|
|  | 112 | ;                                  ,"D",10,msg seq #)= | 
|---|
|  | 113 | ;                                       claim status raw data | 
|---|
|  | 114 | ;   ^TMP("IBCONF",$J,claim #")="" for invalid claims within the batch | 
|---|
|  | 115 | ; | 
|---|
|  | 116 | N CT,DATA,IBCLM,IBTYPE,L,LINE,Z | 
|---|
|  | 117 | S IBCLM=$$GETCLM($P(IBD,U,2)) | 
|---|
|  | 118 | Q:IBCLM="" | 
|---|
|  | 119 | S:$P(IBD,U,3)="R" ^TMP("IBCONF",$J,+$O(^DGCR(399,"B",IBCLM,0)))="" | 
|---|
|  | 120 | S IBTYPE=$S($P(IBD,U,3)="R":"837REJ1",1:"837REC1") | 
|---|
|  | 121 | I '$D(^TMP("IBMSG",$J,"CLAIM",IBCLM)) D HDR("CLAIM",IBCLM,IBTYPE,.IBD) ;Process header data if not already done for claim | 
|---|
|  | 122 | I IBTYPE="837REJ1",$P($G(^TMP("IBMSG",$J,"CLAIM",IBCLM,0)),U,1)'="837REJ1" D HDR("CLAIM",IBCLM,IBTYPE,.IBD) | 
|---|
|  | 123 | S CT=0,DATA=$P(IBD,U,4) | 
|---|
|  | 124 | I DATA'="",$TR($P(IBD,U,5,7),U)'="" D | 
|---|
|  | 125 | . Q:$G(^TMP("IBMSG",$J,"CLAIM",IBCLM))=DATA | 
|---|
|  | 126 | . S ^TMP("IBMSG",$J,"CLAIM",IBCLM)=DATA | 
|---|
|  | 127 | . S CT=CT+1,LINE(CT)=$G(LINE(CT))_$S(DATA="W":"Warning",DATA="E":"Error",1:"Informational")_"  " | 
|---|
|  | 128 | I $P(IBD,U,5)'="" S CT=$S('CT:1,1:CT),LINE(CT)=$G(LINE(CT))_"Code: "_$P(IBD,U,5) | 
|---|
|  | 129 | I $P(IBD,U,6)'="" S CT=$S('CT:1,1:CT),LINE(CT)=$G(LINE(CT))_"  "_$P(IBD,U,6) | 
|---|
|  | 130 | I $P(IBD,U,7)'="" S CT=CT+1,LINE(CT)="  "_$P(IBD,U,7) | 
|---|
|  | 131 | I CT D | 
|---|
|  | 132 | . S L=$G(IBD("LINE")),Z=0 | 
|---|
|  | 133 | . F  S Z=$O(LINE(Z)) Q:'Z  S L=L+1,^TMP("IBMSG",$J,"CLAIM",IBCLM,L)=LINE(Z) | 
|---|
|  | 134 | . S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",10,$O(^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",10,""),-1)+1)="##RAW DATA: "_IBD | 
|---|
|  | 135 | . S IBD("LINE")=$G(IBD("LINE"))+CT | 
|---|
|  | 136 | Q | 
|---|
|  | 137 | ; | 
|---|
|  | 138 | 15(IBD) ; Process subscriber/patient data | 
|---|
|  | 139 | ; Claim must have been referenced by a previous '10' level | 
|---|
|  | 140 | ; INPUT: | 
|---|
|  | 141 | ;   IBD must be passed by reference = entire message line | 
|---|
|  | 142 | ; | 
|---|
|  | 143 | ; OUTPUT: | 
|---|
|  | 144 | ;      IBD("LINE") = The last line # populated in the message | 
|---|
|  | 145 | ; | 
|---|
|  | 146 | ;     ^TMP("IBMSG",$J,"CLAIM",claim #,line#)=formatted service dates | 
|---|
|  | 147 | ;                                    ,"D",15,msg seq #)= | 
|---|
|  | 148 | ;                                         subscr/patient raw data | 
|---|
|  | 149 | ; | 
|---|
|  | 150 | N CT,Z,L,LINE,DATA,IBCLM,IBNM,IBNUM,IBDFN | 
|---|
|  | 151 | S IBCLM=$$GETCLM($P(IBD,U,2)),CT=0,L=$G(IBD("LINE")) | 
|---|
|  | 152 | Q:$S(IBCLM="":1,1:'$D(^TMP("IBMSG",$J,"CLAIM",IBCLM))) | 
|---|
|  | 153 | S IBDFN=+$G(^DGCR(+$O(^DGCR(399,"B",IBCLM,0)),0)) | 
|---|
|  | 154 | S IBNM=$S($P(IBD,U,3)'="":$P(IBD,U,3)_","_$P(IBD,U,4)_$S($P(IBD,U,5)'="":" "_$P(IBD,U,5),1:""),1:$P($G(^DPT(IBDFN,0)),U)) | 
|---|
|  | 155 | S IBNUM=$S($P(IBD,U,6)'="":$P(IBD,U,6),1:$P($G(^DPT(IBDFN,0)),U,9)) | 
|---|
|  | 156 | S CT=CT+1,LINE(CT)="Patient: "_IBNM_"   "_IBNUM | 
|---|
|  | 157 | I $P(IBD,U,11) D | 
|---|
|  | 158 | . S DATA=$$DATE($P(IBD,U,11)),CT=CT+1 | 
|---|
|  | 159 | . S LINE(CT)="Service Dates: "_DATA_" - "_$S($P(IBD,U,12):$$DATE($P(IBD,U,12)),1:DATA)_"  " | 
|---|
|  | 160 | . ; Add additional lines of display data here for record 15 | 
|---|
|  | 161 | S Z=0 F  S Z=$O(LINE(Z)) Q:'Z  S L=L+1,^TMP("IBMSG",$J,"CLAIM",IBCLM,L)=LINE(Z) | 
|---|
|  | 162 | S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",15,$O(^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",15,""),-1)+1)="##RAW DATA: "_IBD | 
|---|
|  | 163 | S IBD("LINE")=$G(IBD("LINE"))+CT | 
|---|
|  | 164 | Q | 
|---|
|  | 165 | ; | 
|---|
|  | 166 | 20(IBD) ; Process service line status data | 
|---|
|  | 167 | ; Claim must have been referenced by a previous '10' level | 
|---|
|  | 168 | ; INPUT: | 
|---|
|  | 169 | ;   IBD must be passed by reference = entire message line | 
|---|
|  | 170 | ; OUTPUT: | 
|---|
|  | 171 | ;   IBD array returned with processed data | 
|---|
|  | 172 | ;      "LINE" = The last line # populated in the message | 
|---|
|  | 173 | ;      "TYPE" = The msg type of status record (Confirmation/rejection) | 
|---|
|  | 174 | ;             Note: returned if not already set at batch or claim level | 
|---|
|  | 175 | ; | 
|---|
|  | 176 | ;   ^TMP("IBMSG",$J,"CLAIM",claim #)="" | 
|---|
|  | 177 | ;                                  ,line#)=service line status msg lines | 
|---|
|  | 178 | ;                                  ,"D",20,msg seq #)= | 
|---|
|  | 179 | ;                                       service line status raw data | 
|---|
|  | 180 | ; | 
|---|
|  | 181 | N CT,DATA,L,LINE,Z,IBCLM,IBLNUM | 
|---|
|  | 182 | S IBCLM=$$GETCLM($P(IBD,U,2)),IBLNUM=$P(IBD,U,8) | 
|---|
|  | 183 | Q:'$D(^TMP("IBMSG",$J,"CLAIM",IBCLM)) | 
|---|
|  | 184 | S CT=0 | 
|---|
|  | 185 | I IBLNUM'="" S CT=CT+1,LINE(CT)="Claim Line: "_IBLNUM,^TMP("IBMSG",$J,"LINE",IBCLM,IBLNUM)="" | 
|---|
|  | 186 | S DATA=$P(IBD,U,4) | 
|---|
|  | 187 | I DATA'="",$TR($P(IBD,U,5,7),U)'="" S:'CT CT=CT+1 S LINE(CT)=$S(DATA="W":"Warning",DATA="E":"Error",1:"Informational")_"  "_$G(LINE(CT)) | 
|---|
|  | 188 | S:$G(IBD("TYPE"))="" IBD("TYPE")=$S(DATA="E":"837REJ1",1:"837REC1") | 
|---|
|  | 189 | I $P(IBD,U,5)'="" S:'CT CT=CT+1 S LINE(CT)=LINE(CT)_$P(IBD,U,5) | 
|---|
|  | 190 | I $P(IBD,U,6)'="" S CT=CT+1,LINE(CT)="  "_$P(IBD,U,6) | 
|---|
|  | 191 | I $P(IBD,U,7)'="" S CT=CT+1,LINE(CT)="  "_$P(IBD,U,7) | 
|---|
|  | 192 | I CT D | 
|---|
|  | 193 | . S L=$G(IBD("LINE")),Z=0 | 
|---|
|  | 194 | . F  S Z=$O(LINE(Z)) Q:'Z  S L=L+1,^TMP("IBMSG",$J,"CLAIM",IBCLM,L)=LINE(Z) | 
|---|
|  | 195 | . S ^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",20,$O(^TMP("IBMSG",$J,"CLAIM",IBCLM,"D",20,""),-1)+1)="##RAW DATA: "_IBD | 
|---|
|  | 196 | . S IBD("LINE")=$G(IBD("LINE"))+CT | 
|---|
|  | 197 | Q | 
|---|
|  | 198 | ; | 
|---|
|  | 199 | 21(IBD) ; Process service line ID data | 
|---|
|  | 200 | ; Moved for size too big | 
|---|
|  | 201 | D 21^IBCE277A(IBD) | 
|---|
|  | 202 | Q | 
|---|
|  | 203 | ; | 
|---|
|  | 204 | DATE(DT) ; Convert YYMMDD Date into MM/DD/YY or YYYYMMDD into MM/DD/YYYY | 
|---|
|  | 205 | N D,Y | 
|---|
|  | 206 | S D=DT,Y="" | 
|---|
|  | 207 | I $L(DT)=8 S D=$E(DT,3,8),Y=$E(DT,1,2) | 
|---|
|  | 208 | Q ($E(D,3,4)_"/"_$E(D,5,6)_"/"_Y_$E(D,1,2)) | 
|---|
|  | 209 | ; | 
|---|
|  | 210 | GETCLM(X) ; Extract the claim # without site id from the data in X | 
|---|
|  | 211 | N IBCLM | 
|---|
|  | 212 | S IBCLM=$P(X,"-",2) | 
|---|
|  | 213 | I IBCLM="",X'="" S IBCLM=$E(X,$S($L(X)>7:4,1:1),$L(X)) | 
|---|
|  | 214 | ;S IBCLM=$E(X,$L(IBCLM)-6,$L(IBCLM)) ; Only take last 7 char | 
|---|
|  | 215 | Q IBCLM | 
|---|
|  | 216 | ; | 
|---|