1 | RCDPESR4 ;ALB/TMK - Server interface 835ERA processing ;06/03/02
|
---|
2 | ;;4.5;Accounts Receivable;**173,216,208,230**;Mar 20, 1995
|
---|
3 | ;;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | ERAEOBIN(RCTXN,RCD,RCGBL,RCEFLG) ; Store/process 835ERA or 835XFR
|
---|
6 | ; transaction coming into the site
|
---|
7 | ; RCTXN = data on the hdr record of the msg text
|
---|
8 | ; RCD = array with formatted hdr data
|
---|
9 | ; RCGBL = name of the array or global where the msg is stored
|
---|
10 | ; RCEFLG = error flag returned if passed by REF
|
---|
11 | ;
|
---|
12 | N RCLAST,RCBILL,RCTDA,RCMSG,RCERR
|
---|
13 | S (RCTDA,RCEFLG)=0
|
---|
14 | ;
|
---|
15 | L +^RCY(344.5,"AMSEQ",+$P(RCTXN,U,13))
|
---|
16 | S RCMSG=$$EXTERA(RCTXN,.RCLAST,.RCBILL) ; Extract from mail msg
|
---|
17 | ;
|
---|
18 | ; If full msg received (99^$ record exists), file it
|
---|
19 | I 'RCLAST,'$G(RCERR) D ;No $ as last character of msg
|
---|
20 | . S RCERR=2
|
---|
21 | ;
|
---|
22 | I RCLAST S RCTDA=+$$ADD(RCGBL,RCD("MSG#"),RCMSG,.RCBILL,.RCERR,.RCD)
|
---|
23 | ;
|
---|
24 | I $G(RCERR)>0 D
|
---|
25 | . D ERRUPD^RCDPESR1(RCGBL,.RCD,$P(RCTXN,U),.RCERR)
|
---|
26 | . I RCTDA D ; Store exception msgs in file 344.5
|
---|
27 | .. N A,C,Z
|
---|
28 | .. S C=1,A(1)="Date: "_$$FMTE^XLFDT($$NOW^XLFDT(),2)
|
---|
29 | .. I $G(^TMP("RCERR",$J,"TEXT"))'="" S C=C+1,A(C)=^TMP("RCERR",$J,"TEXT"),C=C+1,A(C)=" "
|
---|
30 | .. S Z=0 F S Z=$O(^TMP("RCERR",$J,"MSG",Z)) Q:'Z S C=C+1,A(C)=^(Z)
|
---|
31 | .. I $O(A(0)) D WP^DIE(344.5,RCTDA_",",5,"A","A")
|
---|
32 | . S RCEFLG=1
|
---|
33 | ;
|
---|
34 | L -^RCY(344.5,"AMSEQ",+$P(RCTXN,U,13))
|
---|
35 | I $P(RCTXN,U)'["XFR",$P(RCTXN,U,12)'="" D TAXERR^RCDPESR1("ERA",$P(RCTXN,U,6)_" Payer ID: "_$P(RCTXN,U,7),$P(RCTXN,U,11),$P(RCTXN,U,12)) ; Send bad tax id bulletin
|
---|
36 | ;
|
---|
37 | Q
|
---|
38 | ;
|
---|
39 | EXTERA(RCTXN,RCLAST,RCBILL) ;Extract 835ERA or 835XFR transaction
|
---|
40 | ;INPUT:
|
---|
41 | ; RCTXN = data on 835ERA/835XFR hdr record
|
---|
42 | ; RCLAST = passed by REF and returned=1 if entire record exists
|
---|
43 | ;
|
---|
44 | ;OUTPUT:
|
---|
45 | ; ^TMP("RCMSG",$J,1,"D",line #)=formatted hdr data
|
---|
46 | ; ^TMP("RCMSG",$J,2,"D",line #)=raw msg data
|
---|
47 | ; if passed by ref, RCLAST = 1 if '99' record found
|
---|
48 | ; if passed by ref, RCBILL(AR bill number) is returned
|
---|
49 | ; with a 'list' of bills included in the ERA. If an
|
---|
50 | ; entry = 1, 3rd party bill was found in file 430.
|
---|
51 | ; If the entry = 2, the 3rd party bill found was not active
|
---|
52 | ; Function returns existing ien in file 344.5 for multi part ERAs
|
---|
53 | ;
|
---|
54 | N CT,CT1,LINE,HCT,RCH,RCMSG,RCREFORM,RCINS,RCSTAT,B,RCSD,C5
|
---|
55 | S (HCT,RCH)=0
|
---|
56 | ;
|
---|
57 | ; Check if sequence control # already exists or if a new record needed
|
---|
58 | S RCMSG=+$O(^RCY(344.5,"AMSEQ",+$P(RCTXN,U,13),0))
|
---|
59 | S CT=0
|
---|
60 | I 'RCMSG D ; Build display data for the first sequence only
|
---|
61 | . S HCT=HCT+1 S LINE(HCT)="Payer Name: "_$P(RCTXN,U,6)_" Payer ID: "_$P(RCTXN,U,7)
|
---|
62 | . S HCT=HCT+1,LINE(HCT)="Trace #: "_$P(RCTXN,U,8)
|
---|
63 | . S HCT=HCT+1,LINE(HCT)="Date Paid: "_$$FDT^RCDPESR9($P(RCTXN,U,9))_" Total Amt Paid: "_$J($P(RCTXN,U,10)/100,0,2)
|
---|
64 | . I $P(RCTXN,U)["XFR",$P(RCTXN,U,16)'="" S HCT=HCT+1,LINE(HCT)="Contact Info: "_$P(RCTXN,U,16)
|
---|
65 | . M ^TMP("RCMSG",$J,1,"D")=LINE
|
---|
66 | . S CT=CT+1,^TMP("RCMSG",$J,2,"D",CT)=RCTXN
|
---|
67 | ;
|
---|
68 | S CT1=CT
|
---|
69 | S ^TMP("RCMSG",$J,0)=RCTXN
|
---|
70 | ;
|
---|
71 | S RCSD=$NA(^TMP($J,"RCSRVDT")) K @RCSD ;service dates
|
---|
72 | S C5=0
|
---|
73 | S RCLAST=0
|
---|
74 | F X XMREC Q:XMER<0 D Q:RCLAST
|
---|
75 | . Q:XMRG=""
|
---|
76 | . I +XMRG=99,$P(XMRG,U,2)="$" S RCLAST=1 Q
|
---|
77 | . S CT=CT+1
|
---|
78 | . I +XMRG=5,$P(XMRG,U,2)'="" S C5=CT
|
---|
79 | . I +XMRG=40,$P(XMRG,U,2)?1.7N,C5,$P(XMRG,U,19),'$D(@RCSD@(C5)) S ^(C5)=+$P(XMRG,U,19)
|
---|
80 | . S ^TMP("RCMSG",$J,2,"D",CT)=XMRG
|
---|
81 | ;
|
---|
82 | ; reformat bill# if needed
|
---|
83 | S RCREFORM=""
|
---|
84 | S CT=CT1
|
---|
85 | F S CT=$O(^TMP("RCMSG",$J,2,"D",CT)) Q:'CT S XMRG=$G(^(CT)) D
|
---|
86 | . Q:XMRG=""
|
---|
87 | . I +XMRG=5,$P(XMRG,U,2)'="" D
|
---|
88 | .. S RCREFORM="",RCSTAT=1
|
---|
89 | .. ; Check if bill is in AR & is a 3rd party bill
|
---|
90 | .. S RCBILL=$$BILL^RCDPESR1($P(XMRG,U,2),$G(@RCSD@(CT)),.RCINS)
|
---|
91 | .. I '$G(RCINS)!(RCBILL<0) S (RCBILL,RCSTAT)=0
|
---|
92 | .. I RCBILL S B=$P($G(^PRCA(430,RCBILL,0)),U) I B'=$P(XMRG,U,2) S $P(XMRG,U,2)=B,RCREFORM=B
|
---|
93 | .. I RCBILL,$P(^PRCA(430.3,+$P($G(^PRCA(430,+RCBILL,0)),U,8),0),U,3)'=102 S RCSTAT=2
|
---|
94 | .. S RCBILL($P(XMRG,U,2))=RCSTAT
|
---|
95 | . I RCREFORM'="",+XMRG>5 S $P(XMRG,U,2)=RCREFORM,^TMP("RCMSG",$J,2,"D",CT)=XMRG
|
---|
96 | ;
|
---|
97 | K @RCSD
|
---|
98 | Q RCMSG
|
---|
99 | ;
|
---|
100 | ADD(RCGBL,RCDMSG,RCMSG,RCBILL,RCERR,RCD) ; Add msg(s) in @RCGBL to
|
---|
101 | ; file 344.5
|
---|
102 | ; RCGBL = name of the global used to store the msg data
|
---|
103 | ; RCDMSG = Mailman msg number the ERA arrived in.
|
---|
104 | ; RCMSG = ien of the existing entry in file 344.5 for multipart ERAs
|
---|
105 | ; RCBILL(AR bill number) = list of bills included, pass by REF
|
---|
106 | ; RCD = array with formatted hdr data
|
---|
107 | ;
|
---|
108 | ; Errors returned in RCERR and RCERR(n)
|
---|
109 | ; Function returns entry # of msg added or "" if none added
|
---|
110 | ;
|
---|
111 | N RCHDR,RCTYP,RCIEN
|
---|
112 | S RCHDR=$G(^TMP("RCMSGH",$J,0))
|
---|
113 | S RCTYP=$P(RCHDR,U)
|
---|
114 | S RCIEN=$S($G(RCMSG):RCMSG,1:$$ADDTXN(RCHDR,RCDMSG)) ;File msg hdr
|
---|
115 | I RCIEN'>0 S RCERR=3 ;msg hdr can't be filed
|
---|
116 | I '$G(RCERR) D LOADDET(RCIEN,RCGBL,RCHDR,.RCBILL,.RCD,.RCERR)
|
---|
117 | I '$G(RCERR),'$O(RCERR(0)),RCTYP["835ERA",'$P($G(^RCY(344.5,RCIEN,0)),U,8) D TASKERA^RCDPESR2(RCIEN) ;Task to upd VistA for complete 835ERA only
|
---|
118 | ;
|
---|
119 | Q $S($G(RCIEN)>0&'$G(RCERR):RCIEN,1:"")
|
---|
120 | ;
|
---|
121 | ADDTXN(RCDATA,RCDMSG) ; Add a trxn for msg in RCDATA to file 344.5
|
---|
122 | ; RCDATA = data on the msg hdr record
|
---|
123 | ; RCDMSG = Mailman msg number the ERA arrived in
|
---|
124 | ;Function returns ien of the new entry in file 344.5 or "" if an error
|
---|
125 | ;
|
---|
126 | N A,RCY,DLAYGO,DIC,DD,DO,DA,X,Y,Z
|
---|
127 | ;
|
---|
128 | S (X,A)=RCDMSG ;Use msg ID as basis for the .01 field
|
---|
129 | F Z=1:1 Q:'$D(^RCY(344.5,"B",A)) S A=X_"."_Z
|
---|
130 | S X=A
|
---|
131 | S DIC(0)="L",DIC="^RCY(344.5,",DLAYGO=344.5
|
---|
132 | S DIC("DR")=".02////"_$E($P(RCDATA,U),1,6)_";.03///^S X=""NOW"";.04////0;.06////"_$S($P(RCDATA,U)'["XFR":1,1:0)_$S($P(RCDATA,U,13)'="":";.09////"_+$P(RCDATA,U,13)_";.08////1",1:"")_";.1////2;.11////"_RCDMSG
|
---|
133 | I $P(RCDATA,U,6)'="" S DIC("DR")=DIC("DR")_";3.01////"_$P(RCDATA,U,6)
|
---|
134 | D FILE^DICN K DO,DD,DLAYGO,DA,DIC
|
---|
135 | S RCY=+Y
|
---|
136 | Q $S(RCY>0:+RCY,1:"")
|
---|
137 | ;
|
---|
138 | LOADDET(RCTDA,RCGBL,RCHDR,RCBILL,RCD,RCERR) ; Load the rest of the text
|
---|
139 | ; into the msg
|
---|
140 | ; RCTDA = ien in file 344.5
|
---|
141 | ; RCGBL = name of the array holding the detail msg text to be loaded
|
---|
142 | ; RCHDR = data on ERA hdr record
|
---|
143 | ; RCBILL(AR bill number) = list of bills included, pass by REF
|
---|
144 | ; RCD = array with formatted hdr data
|
---|
145 | ;
|
---|
146 | ; OUTPUT: RCERR if any errors found, pass by REF
|
---|
147 | ;
|
---|
148 | N RCE,RCDATA,RCMSG,RCFROM,Z,Z0
|
---|
149 | K ^TMP("RCTEXT",$J),^TMP("RCRAW",$J)
|
---|
150 | M ^TMP("RCTEXT",$J)=@RCGBL@(1,"D")
|
---|
151 | M ^TMP("RCRAW",$J)=@RCGBL@(2,"D")
|
---|
152 | ;
|
---|
153 | S RCDATA=$G(^RCY(344.5,RCTDA,0)),RCMSG=$G(RCD("MSG#")),RCFROM=$G(RCD("FROM"))
|
---|
154 | ;
|
---|
155 | ; For multi-part ERA, don't update if sequence already filed
|
---|
156 | ; Add seq # if not already there
|
---|
157 | I $P(RCHDR,U)'["XFR",$P(RCHDR,U,13) Q:$D(^RCY(344.5,RCTDA,"S","B",+$P(RCHDR,U,14)))
|
---|
158 | ;
|
---|
159 | D STOREM(+$G(RCTDA),"^TMP(""RCTEXT"",$J)","^TMP(""RCRAW"",$J)",.RCE)
|
---|
160 | ;
|
---|
161 | I $D(RCE("DIERR")) D ; Extract error
|
---|
162 | . N DIE,DA,DR,X,Y
|
---|
163 | . D EXTERR^RCDPESR1(.RCERR,.RCE)
|
---|
164 | . S:$L($G(RCE)) RCERR(+$O(RCERR(""),-1)+1)=RCE
|
---|
165 | . I $D(^RCY(344.5,RCTDA,0)) S DIE="^RCY(344.5,",DR=".1////4",DA=RCTDA D ^DIE
|
---|
166 | E D ; No error - store rest of data
|
---|
167 | . N Z,RCT,RCCT,RCX,RCB ; Add bills included in ERA
|
---|
168 | . S RCT=0,RCCT=0,RCX=$J("",4)
|
---|
169 | . S Z="" F S Z=$O(RCBILL(Z)) Q:Z="" D
|
---|
170 | .. N DO,DD,DIC,DLAYGO,X,Y
|
---|
171 | .. S:RCT=4 RCCT=RCCT+1,RCB(RCCT)=RCX,RCT=0,RCX=$J("",4) S RCX=RCX_$E($S(+RCBILL(Z):"",1:"*")_Z_$J("",15),1,15),RCT=RCT+1
|
---|
172 | .. S DIC(0)="L",DIC("DR")=".02////"_$S($G(RCBILL(Z)):1,1:0),X=Z,DA(1)=RCTDA,DIC="^RCY(344.5,"_DA(1)_",""B"",",DLAYGO=344.54 D FILE^DICN K DO,DD,DLAYGO,DIC
|
---|
173 | .. ;
|
---|
174 | . I $L(RCX)>4 S RCCT=RCCT+1,RCB(RCCT)=RCX
|
---|
175 | . ; Add list of bills to display data
|
---|
176 | . I $O(RCB(0)) D WP^DIE(344.5,RCTDA_",",1,"A","RCB")
|
---|
177 | . ; Add seq #
|
---|
178 | . S DA(1)=RCTDA,DIC="^RCY(344.5,"_DA(1)_",""S"",",DIC(0)="L",X=$P(RCHDR,U,14),DIC("DR")=".02////"_$S($P(RCHDR,U,15)="Y":1,1:0)_";.03///^S X=""NOW"";.04////"_RCMSG,X=+$P(RCHDR,U,14),DLAYGO=344.53
|
---|
179 | . D FILE^DICN K DO,DD,DLAYGO,DIC
|
---|
180 | . ;
|
---|
181 | . I $P(RCHDR,U)["835XFR" D XFR^RCDPESR5(RCTDA,RCFROM,RCMSG,.RCD) Q
|
---|
182 | . ;
|
---|
183 | . ; Proceed only if not a transfer record
|
---|
184 | . I $P(RCDATA,U,9)'="" D ; Determine if all sequences received yet
|
---|
185 | .. N RCOK,RCLAST
|
---|
186 | .. S RCOK=1,RCLAST=0
|
---|
187 | .. F Z=1:1 Q:'RCOK!RCLAST D
|
---|
188 | ... I 'RCLAST,'$D(^RCY(344.5,RCTDA,"S","B",Z)) S RCOK=0 Q
|
---|
189 | ... S Z0=+$O(^RCY(344.5,RCTDA,"S","B",Z,0)),Z0=$G(^RCY(344.5,RCTDA,"S",Z0,0))
|
---|
190 | ... I Z0="" S RCOK=0 Q
|
---|
191 | ... I $P(Z0,U,2) S RCLAST=1 ; Last sequence received and all before it
|
---|
192 | .. ;
|
---|
193 | .. I RCOK D
|
---|
194 | ... N DA,DIE,DR,X,Y
|
---|
195 | ... S DA=RCTDA,DR=".08////0;.1///@",DIE="^RCY(344.5," D ^DIE
|
---|
196 | ... I '$O(^RCY(344.5,RCTDA,"B","AV",1,0)) D ; No valid bills found
|
---|
197 | .... N RCE
|
---|
198 | .... S RCE(1)="No valid bills for this site were found in this ERA"
|
---|
199 | .... S RCE(2)="Review/correct the bill #'s on this ERA in your transmission exceptions"
|
---|
200 | .... S RCE(3)="Please contact the Implementation Manager group to report this situation",RCE(4)=" "
|
---|
201 | .... D BULLERA^RCDPESR0("D"_$S($O(^RCY(344.5,RCTDA,2,0)):"F",1:""),RCTDA,$G(RCD("MSG#")),"EDI LBOX - NO VALID BILLS ON ERA "_$E($G(RCD("PAYFROM")),1,20),.RCE,0)
|
---|
202 | .... S DA=RCTDA,DR=".08////1;.1////6",DIE="^RCY(344.5," D ^DIE
|
---|
203 | ;
|
---|
204 | K ^TMP("RCTEXT",$J),^TMP("RCRAW",$J)
|
---|
205 | Q
|
---|
206 | ;
|
---|
207 | STOREM(RCTDA,RCDISP,RCTEXT,RCE) ;Store msg text in file 344.5
|
---|
208 | ;INPUT:
|
---|
209 | ; RCTDA = ien of the entry in file 344.5
|
---|
210 | ; RCDISP = name of the array where display msg text is retrieved from
|
---|
211 | ; or "@" to delete the text from the display text field
|
---|
212 | ; RCTEXT = name of the array where raw msg text is retrieved from
|
---|
213 | ; or "@" to delete the text from the raw msg field
|
---|
214 | ;OUTPUT:
|
---|
215 | ; RCE = array of errors (RCE("DIERR")) returned, pass by REF
|
---|
216 | ;
|
---|
217 | N RCZ,X,Y,DIE
|
---|
218 | K RCE("DIERR")
|
---|
219 | ;
|
---|
220 | I $S($G(RCDISP)="@":1,1:$D(@RCDISP)'<10) D
|
---|
221 | . F RCZ=1:1:20 D WP^DIE(344.5,RCTDA_",",1,"AK",""_RCDISP_"","RCE") Q:$S('$D(RCE("DIERR")):1,+RCE("DIERR")=1:$G(RCE("DIERR",1))'=110,1:1) K:RCZ<20 RCE("DIERR") ; On lock error, retry up to 20 times
|
---|
222 | ;
|
---|
223 | I '$O(RCE("DIERR",0)),$S($G(RCTEXT)="@":1,1:$D(@RCTEXT)'<10) D
|
---|
224 | . F RCZ=1:1:20 D WP^DIE(344.5,RCTDA_",",2,"AK",""_RCTEXT_"","RCE") Q:$S('$D(RCE("DIERR")):1,+RCE("DIERR")=1:$G(RCE("DIERR",1))'=110,1:1) K:RCZ<20 RCE("DIERR") ; On lock error, retry up to 20 times
|
---|
225 | Q
|
---|