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