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