| 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 |  ;
 | 
|---|