1 | IBCESRV ;ALB/TMP - Server interface to IB from Austin ;8/6/03 10:04am
|
---|
2 | ;;2.0;INTEGRATED BILLING;**137,181,196,232,296,320**;21-MAR-94
|
---|
3 | ;
|
---|
4 | SERVER ; Entry point for server option to process EDI msgs received from Austin
|
---|
5 | ;
|
---|
6 | N IBEFLG,IBERR,IBTDA,XMER,IBXMZ,IBHOLDCT
|
---|
7 | K ^TMP("IBERR",$J),^TMP("IBMSG",$J),^TMP("IBMSGH",$J),^TMP("IB-HOLD",$J),^TMP("IBMSG-H",$J)
|
---|
8 | S IBXMZ=$G(XMZ)
|
---|
9 | S IBEFLG=$$MSG(.XMER,.IBTDA,IBXMZ)
|
---|
10 | D:$G(IBEFLG) PERROR^IBCESRV1(.IBERR,.IBTDA,"G.IB EDI",IBXMZ)
|
---|
11 | N ZTREQ
|
---|
12 | D DKILL^IBCESRV1(IBXMZ) S ZTREQ="@"
|
---|
13 | K ^TMP("IBERR",$J),^TMP("IBMSG",$J),^TMP("IBMSGH",$J),^TMP("IB-HOLD",$J),^TMP("IBMSG-H",$J)
|
---|
14 | Q
|
---|
15 | ;
|
---|
16 | MSG(XMER,IBTDA,IBXMZ) ; Read/Store message lines
|
---|
17 | ; Return message formats:
|
---|
18 | ; Ref: Your <queue name> message #<msg#> with Austin ID #<id #>,
|
---|
19 | ; is assigned confirmation number <confirmation #>.
|
---|
20 | ; Generates an 837REC0 message
|
---|
21 | ; 277STAT - claim status messages - Generates one or more 837REC1
|
---|
22 | ; 837REC2 or 837REJ1 messages
|
---|
23 | ; 837DEL - bill entry # from File 364
|
---|
24 | ; 835EOB - Explanation of Benefits messages
|
---|
25 | ; REPORT - Free text Envoy report file - may contain one or more
|
---|
26 | ; reports that are turned into bulletins
|
---|
27 | ;
|
---|
28 | ; OUTPUT:
|
---|
29 | ; Function returns flag ... 0 = no errors 1 = errors
|
---|
30 | ; IBTDA - array subscripted by ien of message file entries created
|
---|
31 | ; If array entry = 1, the message was only partially stored
|
---|
32 | ;
|
---|
33 | N IBLAST,IBTYP,IBTYP1,IB0,IBBTCH,IBDATE,IBHD,IBMG,IBRTN,IBTXN,IBTXND,XMDUZ,IBGBL,IBD,IBEFLG,IBHOLDCT,IBWANT,X,Y,Z
|
---|
34 | K ^TMP("IBERR",$J),^TMP("IBMSG",$J),^TMP("IBMSGH",$J),^TMP("IB-HOLD",$J)
|
---|
35 | ;
|
---|
36 | S (IBEFLG,IBERR,IBTXN)="",IBGBL="IBTXN",IBLAST=0
|
---|
37 | S IBD("MSG#")=IBXMZ
|
---|
38 | S IBHD=$$NET^XMRENT(IBXMZ)
|
---|
39 | S IBD("SUBJ")=$P(IBHD,U,6)
|
---|
40 | S (X,IBDATE)=$P(IBHD,U)
|
---|
41 | I X'="" D ;Reformat date, if needed
|
---|
42 | . I X'["@" S X=$P(X," ",1,3)_"@"_$P(X," ",4)
|
---|
43 | . N %DT
|
---|
44 | . S %DT="XTS" D ^%DT S:Y>0 IBDATE=Y\.0001*.0001
|
---|
45 | ;
|
---|
46 | K ^TMP("IB-HOLD",$J) N IBHOLDCT S IBHOLDCT=0
|
---|
47 | S IBD("Q")=$E(IBD("SUBJ"),1,3)
|
---|
48 | I $G(IBD("SUBJ"))?.E1(1" MCR",1" MCT",1" MCH")1" Confirmation" D G MSGQ:$G(IBERR),MSG1
|
---|
49 | . S IBD("Q")="MC"_$E($P(IBD("SUBJ")," MC",2))
|
---|
50 | . ;Austin confirmation
|
---|
51 | . X XMREC ; Line 1 of message
|
---|
52 | . S:XMER'<0 IBHOLDCT=IBHOLDCT+1,^TMP("IB-HOLD",$J,IBHOLDCT)=XMRG
|
---|
53 | . I XMER<0 D Q
|
---|
54 | .. S IBERR=3
|
---|
55 | .. S ^TMP("IBERR",$J,"MSG",1)=IBHD
|
---|
56 | .. S ^TMP("IBERR",$J,"MSG",2)=$G(XMRG)
|
---|
57 | . S IBTXN=XMRG
|
---|
58 | . S IBBTCH=+$O(^IBA(364.1,"MSG",+$P(IBTXN,"#",2)\1,""))
|
---|
59 | . I 'IBBTCH S IBERR=6 D REST(.IBTXN,IBGBL) Q ;No msgs match conf recpt
|
---|
60 | . S IBTXN("BATCH",IBBTCH,0)="837REC0^"_IBD("MSG#")_U_+$E($P(IBD("SUBJ")," "),4,14)_"^^"_IBBTCH_U_IBDATE
|
---|
61 | . ;
|
---|
62 | . X XMREC ;Get second line of the message
|
---|
63 | . I XMER<0 S IBERR=2 Q
|
---|
64 | . S IBTXN("BATCH",IBBTCH,1)=IBTXN_" "_XMRG_"$",IBTXN=IBTXN("BATCH",IBBTCH,0)
|
---|
65 | . S IBHOLDCT=IBHOLDCT+1,^TMP("IB-HOLD",$J,IBHOLDCT)=XMRG
|
---|
66 | . S IBLAST=1
|
---|
67 | ;
|
---|
68 | ; Read header line of non-confirmation message (line 1)
|
---|
69 | F X XMREC Q:$S(XMER<0:1,1:$E(XMRG,1,13)'="RACUBOTH RUCH")
|
---|
70 | S:XMER'<0 IBHOLDCT=IBHOLDCT+1,^TMP("IB-HOLD",$J,IBHOLDCT)=XMRG
|
---|
71 | I XMER<0 D G MSGQ
|
---|
72 | . S IBERR=3
|
---|
73 | . S ^TMP("IBERR",$J,"MSG",1)=IBHD
|
---|
74 | . S ^TMP("IBERR",$J,"MSG",2)=$G(XMRG)
|
---|
75 | ;
|
---|
76 | S IBTXN=XMRG
|
---|
77 | MSG1 I $E(IBTXN,$L(IBTXN)-3,$L(IBTXN))?3A1"."!(IBTXN="NNNN"),IBHOLDCT>1 S XMER=-1,IBLAST=1 G MSGQ
|
---|
78 | ;
|
---|
79 | S IBTYP1=$S($P(IBTXN,U)="277STAT":"837REC1",1:$P(IBTXN,U))
|
---|
80 | S IBTYP=$S(IBTYP1="":"",1:$O(^IBE(364.3,"B",IBTYP1,"")))
|
---|
81 | I IBTYP="" S IBERR=1 D REST(.IBTXN,IBGBL) G MSGQ ;Bad msg type
|
---|
82 | ;
|
---|
83 | S IB0=$G(^IBE(364.3,IBTYP,0)),IBRTN=$P(IB0,U,3,4),IBMG=$P(IB0,U,2)
|
---|
84 | I $TR(IBRTN,U)="" S IBERR=5 D REST(.IBTXN,IBGBL) G MSGQ ;No routine defined
|
---|
85 | ;
|
---|
86 | S IBWANT=1
|
---|
87 | I 'IBLAST,XMER'<0 D G:IBLAST&(XMER<0) MSGQ ;Message is other than Austin confirmation
|
---|
88 | . S IBGBL="^TMP(""IBMSG"","_$J_")"
|
---|
89 | . S @IBGBL=$P(IBTXN,U),^TMP("IBMSGH",$J,0)=IBTXN
|
---|
90 | . ;
|
---|
91 | . I $P(IBTXN,U)="277STAT" D Q ;Claim status message
|
---|
92 | .. F X XMREC Q:XMER<0 D Q:IBLAST ;Extract rest of message
|
---|
93 | ... S IBHOLDCT=IBHOLDCT+1,^TMP("IB-HOLD",$J,IBHOLDCT)=XMRG
|
---|
94 | ... I +XMRG=99,$P(XMRG,U,2)="$" S IBLAST=1 Q
|
---|
95 | ... S IBD=XMRG,Z=+XMRG_"^IBCE277(.IBD)"
|
---|
96 | ... S IBTXN=XMRG
|
---|
97 | ... I '$$CKLABEL(Z,.IBTXN,IBGBL) S IBLAST=1,IBWANT=0,XMER=-1,IBERR=7 Q
|
---|
98 | ... D @Z
|
---|
99 | . ;
|
---|
100 | . I $P(IBTXN,U)="835EOB" D Q ;Explanation of Benefits message
|
---|
101 | .. F X XMREC Q:XMER<0 D Q:IBLAST ;Extract rest of message
|
---|
102 | ... S IBHOLDCT=IBHOLDCT+1,^TMP("IB-HOLD",$J,IBHOLDCT)=XMRG
|
---|
103 | ... I +XMRG=99,$P(XMRG,U,2)="$" S IBLAST=1 Q
|
---|
104 | ... S IBD=XMRG,Z=+XMRG_"^IBCE835(.IBD)"
|
---|
105 | ... S IBTXN=XMRG
|
---|
106 | ... I '$$CKLABEL(Z,.IBTXN,IBGBL) S IBLAST=1,IBWANT=0,XMER=-1,IBERR=7 Q
|
---|
107 | ... D @Z
|
---|
108 | . ;
|
---|
109 | . I $P(IBTXN,U)="REPORT" D Q ; Report file
|
---|
110 | .. D REPORT^IBCERPT(IBHD,IBDATE,.IBD,IBTXN)
|
---|
111 | .. I '$O(^TMP("IBMSG",$J,"REPORT",0,"D",0,0)) S IBWANT=0
|
---|
112 | . ;
|
---|
113 | . ; ****** Insert code for additional message types here and in ^IBCEM
|
---|
114 | ;
|
---|
115 | I IBLAST,IBWANT D ADD(IBGBL,.IBTDA,.IBERR)
|
---|
116 | ;
|
---|
117 | I 'IBLAST,'$G(IBERR) K @IBGBL S IBERR=2 ;No $ as last character of message
|
---|
118 | MSGQ I $G(IBERR) D ERRUPD^IBCESRV1(IBGBL,.IBERR) S IBEFLG=1
|
---|
119 | Q IBEFLG
|
---|
120 | ;
|
---|
121 | REST(IBTXN,IBGBL) ;Extract raw message data if not id-ed or can't process
|
---|
122 | N CT,Z
|
---|
123 | S CT=0
|
---|
124 | S Z=0 F S Z=$O(^TMP("IB-HOLD",$J,Z)) Q:'Z S CT=CT+1,@IBGBL@("BATCH",0,"D",0,CT)="##RAW DATA: "_$G(^TMP("IB-HOLD",$J,Z))
|
---|
125 | F X XMREC Q:XMER<0 S:XMRG'="" CT=CT+1,@IBGBL@("BATCH",0,"D",0,CT)="##RAW DATA: "_XMRG
|
---|
126 | Q
|
---|
127 | ;
|
---|
128 | ADD(IBGBL,IBTDA,IBERR) ; Add message(s) in @IBGBL to file #364.2
|
---|
129 | ; Errors returned in IBERR
|
---|
130 | ; Message entry #'s are returned in IBTDA(ien)=""
|
---|
131 | ;
|
---|
132 | N IB,IBA,IBB,IBC,IBDATA,IBHDR,IBLINE,IBTYP,IBRTN
|
---|
133 | S IBA="" F S IBA=$O(@IBGBL@(IBA)) Q:IBA=""!(IBERR=3) S IBB="" F S IBB=$O(@IBGBL@(IBA,IBB)) Q:IBB=""!(IBERR=3) D
|
---|
134 | . S IBHDR=$G(@IBGBL@(IBA,IBB,0))
|
---|
135 | . Q:IBHDR=""
|
---|
136 | . S IBTYP=$S($P(IBHDR,U)="":"",1:$O(^IBE(364.3,"B",$P(IBHDR,U),""))),IBRTN=$P($G(^IBE(364.3,IBTYP,0)),U,3,4)
|
---|
137 | . S IBTDA=$$ADDTXN(IBHDR) ;File message hdr data
|
---|
138 | . I IBTDA'>0 S IBERR=3 Q ;msg hdr can't be filed
|
---|
139 | . S IBTDA(IBTDA)=""
|
---|
140 | . D LOADDET(IBA,IBB,.IBTDA,IBGBL,.IBERR,$P(IBHDR,U,1))
|
---|
141 | . Q:$G(IBERR) ;Message not completely filed
|
---|
142 | . D TRTN^IBCESRV1(IBTDA):$TR(IBRTN,U)'="" ;Task update to run
|
---|
143 | Q
|
---|
144 | ;
|
---|
145 | ADDTXN(IBDATA,REPORT) ; Add a trxn for msg in IBDATA to file 364.2
|
---|
146 | ; REPORT = 1 if storing a report format message
|
---|
147 | ;Function returns ien of the new entry in file 364.2 or "" if an error
|
---|
148 | ;
|
---|
149 | N A,IBDA,IBBTCH,IBBILL,IBDT,IBTEST,DLAYGO,DIC,DD,DO,X,Y,Z,IBIFN
|
---|
150 | ;
|
---|
151 | S IBDA="",IBBTCH=$P(IBDATA,U,5),IBBILL=$P(IBDATA,U,4),IBIFN=0
|
---|
152 | I IBBILL S IBIFN=+$G(^IBA(364,IBBILL,0))
|
---|
153 | S IBDT=$P(IBDATA,U,6)
|
---|
154 | S IBTEST=0
|
---|
155 | I $E($G(IBD("Q")),1,3)="MCT" D
|
---|
156 | . I IBBILL,'$P($G(^IBA(364,IBBILL,0)),U,7),$D(^IBM(361.4,IBIFN,0)) S IBTEST=1 Q ; Resubmit live claim for test (make sure 361.4 exists)
|
---|
157 | . I IBBTCH,$O(^IBM(361.4,"C",IBBTCH,0)) S IBTEST=1 Q ; Resubmit live claim as test batch
|
---|
158 | ;
|
---|
159 | S (X,A)=$G(IBD("MSG#")) ; Use msg ID for .01 field
|
---|
160 | F Z=1:1 Q:'$D(^IBA(364.2,"B",A)) S A=X_"."_Z
|
---|
161 | S X=A
|
---|
162 | S DIC(0)="L",DIC="^IBA(364.2,",DLAYGO=364.2
|
---|
163 | S DIC("DR")=".02///"_$P(IBDATA,U)_";.03///^S X=""NOW"";.08////"_($P(IBDATA,U,7)="Y")_";.13////"_$P(IBDATA,U,8)_$S(IBBILL="":"",1:";.05////"_IBBILL)_";.06////P;.1////"_IBDT_$S(IBBTCH="":"",1:";.04////"_IBBTCH)_";.14////"_IBTEST
|
---|
164 | D FILE^DICN
|
---|
165 | S:Y>0 IBDA=+Y
|
---|
166 | ;
|
---|
167 | Q IBDA
|
---|
168 | ;
|
---|
169 | LOADDET(IB1,IB2,IBTDA,IBGBL,IBERR,IBTNM) ; Load the rest of the message text into the message
|
---|
170 | ; IB1 = "BATCH" or "CLAIM" or "REPORT"
|
---|
171 | ; IB2 = batch # or claim # or 0
|
---|
172 | ; IBTDA = ien in file 364.2 being updated
|
---|
173 | ; IBGBL = name of the array holding the detail message text to be loaded
|
---|
174 | ; IBTNM = message name (i.e. "835EOB","837REC0","REPORT",etc.)
|
---|
175 | ;
|
---|
176 | ; OUTPUT: IBERR if any errors found, pass by reference
|
---|
177 | ; IBTDA(IBTDA)=1 if errors - pass by reference
|
---|
178 | ;
|
---|
179 | S IBTDA=+$G(IBTDA)
|
---|
180 | N CT,IB3,IBE,IBZ,Q
|
---|
181 | ;
|
---|
182 | K ^TMP("IBTEXT",$J)
|
---|
183 | ;
|
---|
184 | S (CT,IB3)=0 ;Put formatted data into msg
|
---|
185 | F S IB3=$O(@IBGBL@(IB1,IB2,IB3)) Q:'IB3 S CT=CT+1,^TMP("IBTEXT",$J,CT)=@IBGBL@(IB1,IB2,IB3)
|
---|
186 | ; Add identifying data from hdr record
|
---|
187 | S IB3=0 F S IB3=$O(^TMP("IBMSG-H",$J,IB1,IB2,IB3)) Q:'IB3 S CT=CT+1,^TMP("IBTEXT",$J,CT)=^TMP("IBMSG-H",$J,IB1,IB2,IB3)
|
---|
188 | ;
|
---|
189 | ; Put raw data into msg
|
---|
190 | I $G(IBTNM)'="835EOB" D
|
---|
191 | . S IBZ="" F S IBZ=$O(@IBGBL@(IB1,IB2,"D",IBZ)) Q:IBZ="" S IB3=0 F S IB3=$O(@IBGBL@(IB1,IB2,"D",IBZ,IB3)) Q:'IB3 S CT=CT+1,^TMP("IBTEXT",$J,CT)=@IBGBL@(IB1,IB2,"D",IBZ,IB3)
|
---|
192 | I $G(IBTNM)="835EOB" D
|
---|
193 | . S IB3=0 F S IB3=$O(@IBGBL@(IB1,IB2,"D1",IB3)) Q:'IB3 S IBZ="" F S IBZ=$O(@IBGBL@(IB1,IB2,"D1",IB3,IBZ)) Q:IBZ="" S CT=CT+1,^TMP("IBTEXT",$J,CT)=@IBGBL@(IB1,IB2,"D1",IB3,IBZ)
|
---|
194 | ;
|
---|
195 | D STOREM^IBCESRV2(IBTDA,"^TMP(""IBTEXT"",$J)",.IBE)
|
---|
196 | ;
|
---|
197 | I $D(IBE("DIERR")) D S:$L($G(IBE)) IBERR(IBTDA,IB1,IB2)=IBE ; Extract error
|
---|
198 | . D EXTERR^IBCESRV1(.IBERR,.IBTDA,.IBE)
|
---|
199 | K ^TMP("IBTEXT",$J)
|
---|
200 | Q
|
---|
201 | ;
|
---|
202 | CKLABEL(Z,IBTXN,IBGBL) ; Checks to be sure label in Z exists.
|
---|
203 | ; If it doesn't exist, files an error and returns 0
|
---|
204 | ; OR returns 1 if it does exist
|
---|
205 | N X,LAB
|
---|
206 | S X=1,LAB=$P(Z,"(")
|
---|
207 | I $S('LAB!($L($P(LAB,U))>8):1,1:$T(@LAB)="") S X=0 D REST(.IBTXN,IBGBL)
|
---|
208 | Q X
|
---|
209 | ;
|
---|
210 | ERROR ; Error condition messages
|
---|
211 | ;;Message code does not exist in IB MESSAGE ROUTER file (364.3).
|
---|
212 | ;;This message has no ending $.
|
---|
213 | ;;Message file problem - no message stored.
|
---|
214 | ;;Message file problem - message partially stored.
|
---|
215 | ;;Routine to process this message type does not exist.
|
---|
216 | ;;Batch does not exist for this confirmation message.
|
---|
217 | ;;Bad message format found - cannot store message.
|
---|
218 | ;
|
---|