| [613] | 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 | ; | 
|---|