| [613] | 1 | IBCEU0 ;ALB/TMP - EDI UTILITIES ;02-OCT-96 | 
|---|
|  | 2 | ;;2.0;INTEGRATED BILLING;**137,197,155,296,349**;21-MAR-94;Build 46 | 
|---|
|  | 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | NOTECHG(IBDA,IBNTEXT) ; Enter who/when review stat change was entered | 
|---|
|  | 6 | ; IBDA = ien of entry in file 361.1 | 
|---|
|  | 7 | ; IBNTEXT = array containing the lines of text to store if not using the | 
|---|
|  | 8 | ;           default text  IBNTEXT = # of lines  IBNTEXT(#)=line text | 
|---|
|  | 9 | N IBIEN,IBTEXT,DA,X,Y,DIC,DO,DLAYGO,DD | 
|---|
|  | 10 | S DA(1)=IBDA,DIC="^IBM(361.1,"_DA(1)_",2,",DIC(0)="L",DLAYGO=361.121 | 
|---|
|  | 11 | S X=$$NOW^XLFDT | 
|---|
|  | 12 | D FILE^DICN K DIC,DD,DO,DLAYGO | 
|---|
|  | 13 | Q:Y'>0 | 
|---|
|  | 14 | S DA(2)=DA(1),DA(1)=+Y,IBIEN=DA(1)_","_DA(2)_"," | 
|---|
|  | 15 | I $G(IBNTEXT) D | 
|---|
|  | 16 | . M IBTEXT=IBNTEXT | 
|---|
|  | 17 | E  D | 
|---|
|  | 18 | . S IBTEXT(1)="REVIEW STATUS CHANGED TO '"_$$EXTERNAL^DILFD(361.1,.2,,$P(^IBM(361.1,DA(2),0),U,20))_"'  BY: "_$$EXTERNAL^DILFD(361.121,.02,,+$G(DUZ)) | 
|---|
|  | 19 | D WP^DIE(361.121,IBIEN,.03,,"IBTEXT") K ^TMP("DIERR",$J) | 
|---|
|  | 20 | Q | 
|---|
|  | 21 | ; | 
|---|
|  | 22 | LOCK(IBFILE,IBREC) ; Lock record # IBREC in file #IBFILE (361 or 361.1) | 
|---|
|  | 23 | N OK | 
|---|
|  | 24 | S OK=0 | 
|---|
|  | 25 | L +^IBM(IBFILE,IBREC):3 I $T S OK=1 | 
|---|
|  | 26 | I 'OK D | 
|---|
|  | 27 | . W !,"Another user has locked this record - try again later" | 
|---|
|  | 28 | . D PAUSE^VALM1 | 
|---|
|  | 29 | Q OK | 
|---|
|  | 30 | ; | 
|---|
|  | 31 | UNLOCK(IBFILE,IBREC) ; Unlock record # IBREC in file #IBFILE | 
|---|
|  | 32 | I $G(IBREC) L -^IBM(IBFILE,IBREC) | 
|---|
|  | 33 | Q | 
|---|
|  | 34 | ; | 
|---|
|  | 35 | MSTAT ; Enter reviewed by selected range | 
|---|
|  | 36 | N IBDAX,IBA,IBCLOSE,IBLOOK,IBOK,IBSTOP,IBREBLD,IBCLOK,DA,DIR,X,Y,DIE,DR | 
|---|
|  | 37 | D FULL^VALM1 | 
|---|
|  | 38 | D SEL^IBCECSA4(.IBDAX) | 
|---|
|  | 39 | S IBREBLD=0 | 
|---|
|  | 40 | I $O(IBDAX(""))="" G MSTATQ | 
|---|
|  | 41 | S DIR("?,1")="ONLY SELECT TO CLOSE THE TRANSMIT RECORDS IF YOU KNOW THESE ARE THE FINAL",DIR("?",2)="  ELECTRONIC MESSAGES YOU WILL RECEIVE FOR ALL THE BILLS REFERENCED BY",DIR("?")="  THESE MESSAGES" | 
|---|
|  | 42 | S DIR(0)="YA",DIR("A",1)="DO YOU WANT TO AUTOMATICALLY CLOSE THE TRANSMIT RECORDS FOR ANY MESSAGES",DIR("A")=" THAT AREN'T REJECTS?: ",DIR("B")="NO" W ! D ^DIR K DIR W ! | 
|---|
|  | 43 | G:$D(DIRUT) MSTATQ | 
|---|
|  | 44 | S IBCLOSE=(Y=1) | 
|---|
|  | 45 | S DIR(0)="YA",DIR("A")="DO YOU WANT TO SEE EACH MESSAGE BEFORE MARKING IT REVIEWED?: ",DIR("B")="NO" | 
|---|
|  | 46 | S DIR("?",1)="IF YOU OPT TO SEE EACH MESSAGE, YOU CAN CONTROL WHETHER OR NOT THE MESSAGE",DIR("?",2)="  IS MARKED AS REVIEWED" | 
|---|
|  | 47 | I 'IBCLOSE S DIR("?")=DIR("?",2) K DIR("?",2) | 
|---|
|  | 48 | I IBCLOSE S DIR("?",2)=DIR("?",2)_" AND, FOR NON-REJECTS, WHETHER OR NOT TO CLOSE THE",DIR("?")="  TRANSMIT RECORD FOR THE BILL" | 
|---|
|  | 49 | W ! D ^DIR K DIR W ! | 
|---|
|  | 50 | G:$D(DIRUT) MSTATQ | 
|---|
|  | 51 | S IBLOOK=(Y=1) | 
|---|
|  | 52 | S IBDAX=0,IBSTOP=0 | 
|---|
|  | 53 | F  S IBDAX=+$O(IBDAX(IBDAX)) Q:'IBDAX  D  Q:IBSTOP | 
|---|
|  | 54 | . S IBA=$G(IBDAX(IBDAX)) | 
|---|
|  | 55 | . S DIE="^IBM(361,",DA=$P(IBA,U,2),DR="" | 
|---|
|  | 56 | . I DA D | 
|---|
|  | 57 | .. S IBOK=1 | 
|---|
|  | 58 | .. S IBCLOK=$S(IBCLOSE:1,1:0) | 
|---|
|  | 59 | .. I IBLOOK D  Q:'IBOK | 
|---|
|  | 60 | ... S DIC="^IBM(361," D EN^DIQ | 
|---|
|  | 61 | ... I '$$LOCK(361,DA) W ! S IBOK=0 Q | 
|---|
|  | 62 | ... S DIR(0)="YA",DIR("A")="OK TO MARK REVIEWED?: ",DIR("B")="YES",DIR("?",1)="IF YOU ENTER YES, THIS MESSAGE WILL BE MARKED REVIEWED" | 
|---|
|  | 63 | ... S DIR("?",2)="IF YOU ENTER NO, THIS MESSAGE WILL NOT BE ALTERED",DIR("?",3)="IF YOU ENTER AN ^, THIS MESSAGE WILL NOT BE ALTERED & NONE OF THE",DIR("?")="   REMAINING MESSAGES WILL BE PROCESSED" D ^DIR K DIR | 
|---|
|  | 64 | ... I Y'>0 S IBOK=0 S:$D(DIRUT) IBSTOP=1 Q | 
|---|
|  | 65 | ... I 'IBCLOSE D | 
|---|
|  | 66 | .... S DIR(0)="YA",DIR("A")="OK TO CLOSE THIS BILL'S TRANSMIT RECORD?: ",DIR("B")="NO" | 
|---|
|  | 67 | .... S DIR("?",1)="If you respond YES to this prompt, the transmit status of this bill will",DIR("?",2)="  be set to CLOSED.  No further electronic processing of this bill will be" | 
|---|
|  | 68 | .... S DIR("?",3)="  allowed.  If you respond NO to this prompt, this electronic message will",DIR("?",4)="  be filed as reviewed, but the bill's transmit status will not be changed." | 
|---|
|  | 69 | .... S DIR("?",5)="  You may wish to periodically print a list of bills with a non-final",DIR("?",6)="  (closed/cancelled/etc) status to ensure the electronic processing of all" | 
|---|
|  | 70 | .... S DIR("?",7)="  bills has been completed.  Closing the transmit bill record here will",DIR("?")="  eliminate the bill from this list." | 
|---|
|  | 71 | .... W ! D ^DIR K DIR W ! | 
|---|
|  | 72 | .... I Y'=1 S IBCLOK=0 | 
|---|
|  | 73 | .. I 'IBLOOK,$P($G(^IBM(361,DA,0)),U,3)="R" D  Q:'IBOK | 
|---|
|  | 74 | ... S DR="1",DIC="^IBM(361," D EN^DIQ W !,"Bill Number: ",$$EXPAND^IBTRE(361,.01,+^IBM(361,DA,0)) | 
|---|
|  | 75 | ... S DIR(0)="YA",DIR("A")="THIS IS A REJECTION ... ARE YOU SURE YOU WANT TO MARK IT REVIEWED?: ",DIR("B")="NO" | 
|---|
|  | 76 | ... S DIR("?",1)="IF YOU ENTER YES, THIS MESSAGE WILL BE MARKED REVIEWED" | 
|---|
|  | 77 | ... S DIR("?",2)="IF YOU ENTER NO, THIS MESSAGE WILL NOT BE ALTERED",DIR("?",3)="IF YOU ENTER AN ^, THIS MESSAGE WILL NOT BE ALTERED & NONE OF THE",DIR("?")="   MESSAGES FOLLOWING THIS ONE WILL BE PROCESSED" D ^DIR K DIR | 
|---|
|  | 78 | ... I Y'=1 S IBOK=0 S:$D(DIRUT) IBSTOP=1 | 
|---|
|  | 79 | .. S:'IBREBLD IBREBLD=1 | 
|---|
|  | 80 | .. S DR=".09////2;.1////F" D ^DIE | 
|---|
|  | 81 | .. N IBUPD | 
|---|
|  | 82 | .. S IBUPD=0 | 
|---|
|  | 83 | .. I $$PRINTUPD($G(^IBM(361,DA,1,1,0)),+$P(^IBM(361,DA,0),U,11)) S IBUPD=1 | 
|---|
|  | 84 | .. I $G(^IBM(361,DA,1,1,0))["CLAIM SENT TO PAYER" D UPDTX^IBCECSA2(+$P(^IBM(361,DA,0),U,11),$S(IBCLOK:"Z",1:"A2")) S IBUPD=1 | 
|---|
|  | 85 | .. I $G(^IBM(361,DA,1,1,0))["CLAIM REJECTED" D UPDTX^IBCECSA2(+$P(^IBM(361,DA,0),U,11),"E") S IBUPD=1 | 
|---|
|  | 86 | .. I IBCLOK,'IBUPD D UPDTX^IBCECSA2(+$P(^IBM(361,DA,0),U,11),"Z") | 
|---|
|  | 87 | .. I 'IBLOOK D | 
|---|
|  | 88 | ... W !,"Seq #: ",IBDAX,"  Bill number: ",$$EXPAND^IBTRE(361,.01,+^IBM(361,DA,0)),?45,"REVIEWED" | 
|---|
|  | 89 | .. D NOTECHG^IBCECSA2(DA,1) | 
|---|
|  | 90 | .. D UNLOCK(361,DA) | 
|---|
|  | 91 | W !!,"LAST SELECTION PROCESSED",! | 
|---|
|  | 92 | D PAUSE^VALM1 | 
|---|
|  | 93 | MSTATQ S VALMBCK="R" | 
|---|
|  | 94 | I IBREBLD D BLD^IBCECSA1 | 
|---|
|  | 95 | Q | 
|---|
|  | 96 | ; | 
|---|
|  | 97 | PRPAY(IBIFN,IBMCR) ; Returns total amount of prior payments applied to | 
|---|
|  | 98 | ; bill ien IBIFN | 
|---|
|  | 99 | ; IBMCR = flag passed in as 1 if MRA total should be included | 
|---|
|  | 100 | ; | 
|---|
|  | 101 | N IBTOT,IBZ,IBSEQ | 
|---|
|  | 102 | S IBSEQ=$$COBN^IBCEF(IBIFN) | 
|---|
|  | 103 | I IBSEQ'>1 S IBTOT=0 G PRPAYQ | 
|---|
|  | 104 | D F^IBCEF("N-PRIOR PAYMENTS","IBZ",,IBIFN) | 
|---|
|  | 105 | S IBTOT=IBZ | 
|---|
|  | 106 | I $G(IBMCR),$$MCRONBIL^IBEFUNC(IBIFN)=1 D  ; MCR on bill before curr ins | 
|---|
|  | 107 | . N Z,Z0,Z2,Q | 
|---|
|  | 108 | . F Z=1:1:IBSEQ-1 I $$WNRBILL^IBEFUNC(IBIFN,Z) D | 
|---|
|  | 109 | .. S IBTOT=+$$MCRPAY(IBIFN) | 
|---|
|  | 110 | PRPAYQ Q IBTOT | 
|---|
|  | 111 | ; | 
|---|
|  | 112 | PRINTUPD(IBTEXT,IBDA) ; If the status message indicates claim was printed | 
|---|
|  | 113 | ;    or the claim record in file 399 says it was, update the transmit | 
|---|
|  | 114 | ;    message status to closed | 
|---|
|  | 115 | ; IBTEXT = the first line text of the status message (optional) | 
|---|
|  | 116 | ; IBDA = the ien of the transmission record in file 364 | 
|---|
|  | 117 | ; | 
|---|
|  | 118 | ; FUNCTION returns 1 if message status changed | 
|---|
|  | 119 | ; | 
|---|
|  | 120 | N IBP,IBP1 | 
|---|
|  | 121 | S IBP=0,IBP1=$P($G(^DGCR(399,+$G(^IBA(364,+$G(IBDA),0)),"TX")),U,7) | 
|---|
|  | 122 | I $G(IBTEXT)["CLAIM RECEIVED, PRINTED AND MAILED BY PRINT CENTER"!IBP1 D | 
|---|
|  | 123 | . N Z | 
|---|
|  | 124 | . S Z=$E($P($G(^IBA(364,IBDA,0)),U,3),1) | 
|---|
|  | 125 | . I "AP"'[Z Q  ; Only change if status is pending or received/accepted | 
|---|
|  | 126 | . D UPDTX^IBCECSA2(IBDA,"Z") S IBP=1 | 
|---|
|  | 127 | Q IBP | 
|---|
|  | 128 | ; | 
|---|
|  | 129 | MCRPAY(IBIFN) ; Calculate MRA total for the bill IBIFN | 
|---|
|  | 130 | N IBPAY,Q,Z0 | 
|---|
|  | 131 | S IBPAY=0 | 
|---|
|  | 132 | S Q=0 F  S Q=$O(^IBM(361.1,"B",IBIFN,Q)) Q:'Q  S Z0=$G(^IBM(361.1,Q,0)) I $P(Z0,U,4)=1 S IBPAY=IBPAY+$G(^(1)) | 
|---|
|  | 133 | Q IBPAY | 
|---|
|  | 134 | ; | 
|---|
|  | 135 | PREOBTOT(IBIFN) ; Function - Calculates Patient Responsibility Amount | 
|---|
|  | 136 | ; Input:  IBIFN - ien of Bill Number (ien of file 399) | 
|---|
|  | 137 | ; Output Function returns: Patient Responsibility Amount for all EOB's for bill | 
|---|
|  | 138 | ; | 
|---|
|  | 139 | N FRMTYP,IBPTRES | 
|---|
|  | 140 | S IBPTRES=0 | 
|---|
|  | 141 | ; Form Type 2=CMS-1500; 3=UB-04 | 
|---|
|  | 142 | S FRMTYP=$$FT^IBCEF(IBIFN) | 
|---|
|  | 143 | ; | 
|---|
|  | 144 | ; For bills w/CMS-1500 Form Type, total up Pt Resp amount from top | 
|---|
|  | 145 | ; level of EOB (field 1.02) for All MRA type EOB's on file for that | 
|---|
|  | 146 | ; bill (IBIFN) | 
|---|
|  | 147 | ; | 
|---|
|  | 148 | I FRMTYP=2 D  Q IBPTRES | 
|---|
|  | 149 | . N IBEOB,EOBREC,EOBREC1,IBPRTOT | 
|---|
|  | 150 | . S (IBEOB,IBPRTOT,IBPTRES)=0 | 
|---|
|  | 151 | . F  S IBEOB=$O(^IBM(361.1,"B",IBIFN,IBEOB)) Q:'IBEOB  D  ; | 
|---|
|  | 152 | . . S EOBREC=$G(^IBM(361.1,IBEOB,0)),EOBREC1=$G(^(1)) | 
|---|
|  | 153 | . . I $P(EOBREC,U,4)'=1 Q  ;make sure it's an MRA | 
|---|
|  | 154 | . . ; Total up Pt Resp Amounts on all valid MRA's | 
|---|
|  | 155 | . . S IBPTRES=IBPTRES+$P(EOBREC1,U,2) | 
|---|
|  | 156 | ; | 
|---|
|  | 157 | ; For bills w/UB-04 Form Type, loop through all EOB's and sum up amounts | 
|---|
|  | 158 | ; on both Line level and on Claim level | 
|---|
|  | 159 | N EOBADJ,IBEOB,LNLVL | 
|---|
|  | 160 | S IBEOB=0 | 
|---|
|  | 161 | F  S IBEOB=$O(^IBM(361.1,"B",IBIFN,IBEOB)) Q:'IBEOB  D  ; | 
|---|
|  | 162 | . I $P($G(^IBM(361.1,IBEOB,0)),U,4)'=1 Q    ; must be an MRA | 
|---|
|  | 163 | . ; | 
|---|
|  | 164 | . ; get claim level adjustments | 
|---|
|  | 165 | . K EOBADJ M EOBADJ=^IBM(361.1,IBEOB,10) | 
|---|
|  | 166 | . S IBPTRES=IBPTRES+$$CALCPR(.EOBADJ) | 
|---|
|  | 167 | . ; | 
|---|
|  | 168 | . ; get line level adjustments | 
|---|
|  | 169 | . S LNLVL=0 | 
|---|
|  | 170 | . F  S LNLVL=$O(^IBM(361.1,IBEOB,15,LNLVL)) Q:'LNLVL  D  ; | 
|---|
|  | 171 | . . K EOBADJ M EOBADJ=^IBM(361.1,IBEOB,15,LNLVL,1) | 
|---|
|  | 172 | . . S IBPTRES=IBPTRES+$$CALCPR(.EOBADJ) | 
|---|
|  | 173 | Q IBPTRES | 
|---|
|  | 174 | ; | 
|---|
|  | 175 | CALCPR(EOBADJ) ; Function - Calculate Patient Responsibilty Amount | 
|---|
|  | 176 | ; For Group Code PR; Ignore the PR-AAA kludge | 
|---|
|  | 177 | ; Input - EOBADJ = Array of Group Codes & Reason Codes from either the Claim | 
|---|
|  | 178 | ;                 Level (10) or Service Line Level (15) of EOB file (#361.1) | 
|---|
|  | 179 | ; Output - Function returns Patient Responsibility Amount | 
|---|
|  | 180 | ; | 
|---|
|  | 181 | N GRPLVL,RSNCD,RSNAMT,PTRESP | 
|---|
|  | 182 | S (GRPLVL,PTRESP)=0 | 
|---|
|  | 183 | F  S GRPLVL=$O(EOBADJ(GRPLVL)) Q:'GRPLVL  D | 
|---|
|  | 184 | . I $P($G(EOBADJ(GRPLVL,0)),U)'="PR" Q  ;grp code must be PR | 
|---|
|  | 185 | . S RSNCD=0 | 
|---|
|  | 186 | . F  S RSNCD=$O(EOBADJ(GRPLVL,1,RSNCD)) Q:'RSNCD  D | 
|---|
|  | 187 | . . I $P($G(EOBADJ(GRPLVL,1,RSNCD,0)),U,1)="AAA" Q   ; ignore PR-AAA | 
|---|
|  | 188 | . . S RSNAMT=$P($G(EOBADJ(GRPLVL,1,RSNCD,0)),U,2) | 
|---|
|  | 189 | . . S PTRESP=PTRESP+RSNAMT | 
|---|
|  | 190 | Q PTRESP | 
|---|
|  | 191 | ; | 
|---|
|  | 192 | COBMOD(IBXSAVE,IBXDATA,SEQ) ; output the modifiers from the COB | 
|---|
|  | 193 | ; SEQ is which modifier we're extracting (1-4) | 
|---|
|  | 194 | ; Build IBXDATA(line#)=Modifier# SEQ | 
|---|
|  | 195 | NEW LN,N,Z,MOD,LNSEQ | 
|---|
|  | 196 | KILL IBXDATA | 
|---|
|  | 197 | I '$G(SEQ) Q | 
|---|
|  | 198 | S (LN,LNSEQ)=0 | 
|---|
|  | 199 | F  S LN=$O(IBXSAVE("LCOB",LN)) Q:'LN  D | 
|---|
|  | 200 | . S LNSEQ=LNSEQ+1 | 
|---|
|  | 201 | . S (N,Z)=0 | 
|---|
|  | 202 | . F  S Z=$O(IBXSAVE("LCOB",LN,"COBMOD",Z)) Q:'Z  D | 
|---|
|  | 203 | .. S N=N+1 | 
|---|
|  | 204 | .. S MOD(LNSEQ,N)=$P($G(IBXSAVE("LCOB",LN,"COBMOD",Z,0)),U,1) | 
|---|
|  | 205 | .. Q | 
|---|
|  | 206 | . S MOD=$G(MOD(LNSEQ,SEQ)) | 
|---|
|  | 207 | . I MOD'="" S IBXDATA(LNSEQ)=MOD | 
|---|
|  | 208 | . Q | 
|---|
|  | 209 | Q | 
|---|
|  | 210 | ; | 
|---|