| 1 | IBEFUNC ;ALB/RLW - EXTRINSIC FUNCTIONS ;12-JUN-92
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**55,91,106,139,51,153,232,155,249,327**;21-MAR-94
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | ETXT(X) ; -- output error text from 350.8
 | 
|---|
| 5 |  ; -- input error code
 | 
|---|
| 6 |  N Y S Y=X
 | 
|---|
| 7 |  I X="" G ETXTQ
 | 
|---|
| 8 |  S Y=$P($G(^IBE(350.8,+$O(^IBE(350.8,"AC",X,0)),0)),U,2)
 | 
|---|
| 9 | ETXTQ Q Y
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 | IGN(X,Y) ; ignore means test? for appt type on dates
 | 
|---|
| 12 |  ; -- input x = mas appt type
 | 
|---|
| 13 |  ;          y = appt date
 | 
|---|
| 14 |  ;    output  = true if this appt type should not be billed for
 | 
|---|
| 15 |  ;              Means Test billing (352.1,.04) for given date
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  I '$G(X)!('$G(Y)) Q 1
 | 
|---|
| 18 |  Q +$P($G(^IBE(352.1,+$O(^(+$O(^IBE(352.1,"AIVDT",+X,-(Y+.1))),0)),0)),U,4)
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 | DSP(X,Y) ; display on input screen?
 | 
|---|
| 21 |  ; --    input X = mas appt type (P409.1)
 | 
|---|
| 22 |  ;             Y = date
 | 
|---|
| 23 |  ;       output  = true if appt type X (352.1,.02) should be displayed as
 | 
|---|
| 24 |  ;          a potential billable visit (352.1,.06) on given date Y (352.1,.03)
 | 
|---|
| 25 |  ;
 | 
|---|
| 26 |  I '$G(X)!('$G(Y)) Q 0
 | 
|---|
| 27 |  Q +$P($G(^IBE(352.1,+$O(^(+$O(^IBE(352.1,"AIVDT",+X,-(Y+.1))),0)),0)),U,6)
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 | RPT(X,Y) ; print on report?
 | 
|---|
| 30 |  ; -- input X = mas appt type (P409.1)
 | 
|---|
| 31 |  ;          Y = date
 | 
|---|
| 32 |  ;    output  = true if appt type X (352.1,.02) should be printed on 'Vets w/ Ins and Opt
 | 
|---|
| 33 |  ;               Visits' report (352.1,.05) on given date Y (352.1,.06)
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 |  I '$G(X)!('$G(Y)) Q 0
 | 
|---|
| 36 |  Q +$P($G(^IBE(352.1,+$O(^(+$O(^IBE(352.1,"AIVDT",+X,-(Y+.1))),0)),0)),U,5)
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 | NBDIS(X,Y) ; Is disposition non-billable?
 | 
|---|
| 39 |  ; -- input X = disposition (P37)
 | 
|---|
| 40 |  ;          Y = date of appt
 | 
|---|
| 41 |  ;    output  = true (1) if disposition should be ignored for
 | 
|---|
| 42 |  ;              Means test billing (352.2,.03) for given date
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 |  I '$G(X)!('$G(Y)) Q 0
 | 
|---|
| 45 |  Q +$P($G(^IBE(352.2,+$O(^(+$O(^IBE(352.2,"AIVDT",+X,-(Y+.1))),0)),0)),U,3)
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 | NBCSC(X,Y) ; Is clinic stop code non-billable?
 | 
|---|
| 48 |  ; -- input X = clinic stop code (P40.7)
 | 
|---|
| 49 |  ;          Y = date of appt
 | 
|---|
| 50 |  ;    output  = true (1) if clinic stop code should be ignored for
 | 
|---|
| 51 |  ;              Means test billing (352.3,.03) for given date
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  I '$G(X)!('$G(Y)) Q 0
 | 
|---|
| 54 |  Q +$P($G(^IBE(352.3,+$O(^(+$O(^IBE(352.3,"AIVDT",+X,-(Y+.1))),0)),0)),U,3)
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 | NBCL(X,Y) ; Is clinic non-billable?
 | 
|---|
| 57 |  ; -- input X = clinic (P44)
 | 
|---|
| 58 |  ;          Y = date of appt
 | 
|---|
| 59 |  ;    output  = true (1) if clinic should be ignored for
 | 
|---|
| 60 |  ;              Means test billing (352.4,.03) for given date
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  I '$G(X)!('$G(Y)) Q 0
 | 
|---|
| 63 |  Q +$P($G(^IBE(352.4,+$O(^(+$O(^IBE(352.4,"AIVDT",+X,-(Y+.1))),0)),0)),U,3)
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 | NBST(X,Y) ; Is clinic stop code non-billable for Third Party?
 | 
|---|
| 66 |  ; -- input X = clinic stop code (P40.7), Y = appt date
 | 
|---|
| 67 |  ;    output  = true (1) if stop non-billable for Third Party (352.3,.05) for given dt
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  I '$G(X)!('$G(Y)) Q 0
 | 
|---|
| 70 |  Q +$P($G(^IBE(352.3,+$O(^(+$O(^IBE(352.3,"AIVDTT2",+X,-(Y+.1))),0)),0)),U,5)
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 | NBCT(X,Y) ; Is clinic non-billable for Third Party?
 | 
|---|
| 73 |  ; -- input X = clinic (P44), Y = appt dt
 | 
|---|
| 74 |  ;    output  = true (1) if clinic non-billable for Third Party (352.4,.05) for given date
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 |  I '$G(X)!('$G(Y)) Q 0
 | 
|---|
| 77 |  Q +$P($G(^IBE(352.4,+$O(^(+$O(^IBE(352.4,"AIVDTT2",+X,-(Y+.1))),0)),0)),U,5)
 | 
|---|
| 78 |  ;
 | 
|---|
| 79 | NABST(X,Y) ; Returns true (1) if stop code flagged to be ignored by Third Party auto biller (use DT)
 | 
|---|
| 80 |  S:'$G(Y) Y=DT I '$G(X) Q 0
 | 
|---|
| 81 |  Q +$P($G(^IBE(352.3,+$O(^(+$O(^IBE(352.3,"AIVDTT2",+X,-(Y+.1))),0)),0)),U,6)
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 | NABCT(X,Y) ; Returns true (1) if clinic is flagged to be ignored by Third Party auto biller (use DT)
 | 
|---|
| 84 |  S:'$G(Y) Y=DT I '$G(X) Q 0
 | 
|---|
| 85 |  Q +$P($G(^IBE(352.4,+$O(^(+$O(^IBE(352.4,"AIVDTT2",+X,-(Y+.1))),0)),0)),U,6)
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 | PT(DFN) ;returns (patient name^long pat id^short pat id) or null if not found
 | 
|---|
| 88 |  N X,IBX S X="" I $D(DFN) S X=$G(^DPT(+DFN,0)) I X'="" S X=$P(X,U,1)_U_$P($G(^DPT(DFN,.36)),U,3,4) D
 | 
|---|
| 89 |  . S IBX=$P(^DPT(+DFN,0),U,9)
 | 
|---|
| 90 |  . I $P(X,U,2)="" S $P(X,U,2)=$E(IBX,1,3)_"-"_$E(IBX,4,5)_"-"_$E(IBX,6,10)
 | 
|---|
| 91 |  . I $P(X,U,3)="" S $P(X,U,3)=$E(IBX,6,10)
 | 
|---|
| 92 |  Q X
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 | EXSET(X,D0,D1) ;returns external value of a set in file D0, field D1
 | 
|---|
| 95 |  Q $$EXPAND^IBTRE($G(D0),$G(D1),$G(X))
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 | BABCSC(DFN,IBDT) ; -- any billable Third Party visits in encounter file for patient
 | 
|---|
| 98 |  ;  -- Input  dfn = patient,  ibdt = date
 | 
|---|
| 99 |  ;     output     = 1 if any billable stop on date OR 0 if none
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 |  N IBX,IBVAL,IBCBK,IBFILTER
 | 
|---|
| 102 |  S IBX=0
 | 
|---|
| 103 |  I '$G(DFN)!('$G(IBDT)) G BABQ
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 |  S IBVAL("DFN")=DFN,IBVAL("BDT")=IBDT\1,IBVAL("EDT")=IBDT\1+.24
 | 
|---|
| 106 |  ;Ignore if not chkd out, no stop, non-billable stop, non-billable clinic
 | 
|---|
| 107 |  S IBFILTER=""
 | 
|---|
| 108 |  S IBCBK="I $P(Y0,U,12)=2,$P(Y0,U,3),'$$NBST^IBEFUNC($P(Y0,U,3),+Y0),'$$NBCT^IBEFUNC(+$P(Y0,U,4),+Y0) S (IBX,SDSTOP)=1"
 | 
|---|
| 109 |  D SCAN^IBSDU("PATIENT/DATE",.IBVAL,"",IBCBK,1) K ^TMP("DIERR",$J)
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 | BABQ Q IBX
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 | APPTCT(IBOE0) ; Determine if appt encounter/appt has valid status for billing
 | 
|---|
| 114 |  ; Returns 1 if valid, 0 if not
 | 
|---|
| 115 |  ; IBOE0 = the encounter's 0-node (input)
 | 
|---|
| 116 |  N STAT
 | 
|---|
| 117 |  S STAT=$P(IBOE0,U,12) ;Encounter stat
 | 
|---|
| 118 |  I STAT=14 S STAT=2
 | 
|---|
| 119 |  ; Assume 1,2 (and 14 sometimes) are valid, 8 = INPATIENT
 | 
|---|
| 120 |  Q STAT<3
 | 
|---|
| 121 |  ;
 | 
|---|
| 122 | NCTCL(IBOE0) ; Determine if a clinic for an outpt encounter is non-count
 | 
|---|
| 123 |  ; IBOE0 = the 0-node of the encounter
 | 
|---|
| 124 |  Q ($P($G(^SC(+$P(IBOE0,U,4),0)),U,17)="Y")
 | 
|---|
| 125 |  ;
 | 
|---|
| 126 | DISCT(IBOE,IBOE0) ; Determine if disposition has valid status for billing
 | 
|---|
| 127 |  ; Returns 1 if valid, 0 if not valid
 | 
|---|
| 128 |  ; IBOE = encounter ien
 | 
|---|
| 129 |  ; IBOE0 = 0-node of encounter (optional)
 | 
|---|
| 130 |  N IBX
 | 
|---|
| 131 |  S IBX=$$DISND^IBSDU(IBOE,$G(IBOE0),2)
 | 
|---|
| 132 |  Q (IBX<2)
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 | NEEDMRA(IBIFN) ; Returns MRA NEEDED STATUS for bill
 | 
|---|
| 135 |  Q $P($G(^DGCR(399,+IBIFN,"TX")),U,5)
 | 
|---|
| 136 |  ;
 | 
|---|
| 137 | REQMRA(IBIFN) ; Determine from site parameter, ins assigned to bill and txmn
 | 
|---|
| 138 |  ;   rules if request for MRA is needed (MCRWNR must be current ins co)
 | 
|---|
| 139 |  ; "R" = not needed due to next carrier not requiring it (txmn rules),
 | 
|---|
| 140 |  ; "R1" = not needed due to MRA turned off at site
 | 
|---|
| 141 |  ;  0 = not needed,  1 = needed
 | 
|---|
| 142 |  N IB0,COBINS,COBSEQ,IBOK,Z1,Z0,IBDA,IB00,IB0
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 |  I $$COB^IBCEF(IBIFN)="A" S IBOK=0 G REQMRAQ    ; payer sequence = patient not allowed for MRA
 | 
|---|
| 145 |  S COBSEQ=$$COBN^IBCEF(IBIFN)
 | 
|---|
| 146 |  S COBINS=$P($G(^DGCR(399,IBIFN,"M")),U,COBSEQ)
 | 
|---|
| 147 |  ;Curr ins must = MEDICARE WNR
 | 
|---|
| 148 |  S IBOK=+$$MCRWNR(COBINS)
 | 
|---|
| 149 |  I 'IBOK G REQMRAQ
 | 
|---|
| 150 |  ;
 | 
|---|
| 151 |  I '$$EDIACTV^IBCEF4(2) S IBOK="R1" G REQMRAQ ; Site param=NO
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 |  ; Check next ins for MRA needed
 | 
|---|
| 154 |  I COBSEQ'<3 S IBOK=0 G REQMRAQ
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 |  S IB0=$G(^DGCR(399,IBIFN,0))
 | 
|---|
| 157 |  S COBINS=+$P($G(^DGCR(399,IBIFN,"M")),U,COBSEQ+1)
 | 
|---|
| 158 |  I 'COBINS S IBOK=0 G REQMRAQ ;No next ins
 | 
|---|
| 159 |  I $$COB^IBCEF(IBIFN)="S" D  I IBOK="R2" G REQMRAQ
 | 
|---|
| 160 |  . S COBINS=$P($G(^DGCR(399,IBIFN,"M")),U,COBSEQ)
 | 
|---|
| 161 |  . I +$$MCRWNR(COBINS)=1 S IBOK="R2"
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  ; Check only rules with rule type = 2 (MRA REQUEST RESTRICTIONS)
 | 
|---|
| 164 |  S IBDA=0 F  S IBDA=$O(^IBE(364.4,"AC",2,IBDA)) Q:'IBDA  S IB00=$G(^IBE(364.4,IBDA,0)) D  Q:'IBOK
 | 
|---|
| 165 |  . I $P(IB00,U,2)>DT Q  ; Inactive
 | 
|---|
| 166 |  . I $P(IB00,U,6),$P(IB00,U,6)'>DT Q  ; Expired
 | 
|---|
| 167 |  . S Z0=$$INPAT^IBCEF(IBIFN,1),Z0=$S(Z0=1:2,1:1)
 | 
|---|
| 168 |  . S Z1=$$FT^IBCEF(IBIFN),Z1=$S(Z1=3:1,1:2)
 | 
|---|
| 169 |  . I $S($P(IB00,U,4)=3:1,1:$P(IB00,U,4)=Z0),$S($P(IB00,U,5)=3:1,1:$P(IB00,U,5)=Z1) S Z0=$D(^IBE(364.4,IBDA,3,"B",COBINS)) I Z0>0 S IBOK="R"
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 | REQMRAQ Q IBOK
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 | MCRWNR(IBINS) ;Returns whether the ins co IBINS is MEDICARE WNR (Will
 | 
|---|
| 174 |  ;           NOT Reimburse) 0=NO, 1=YES
 | 
|---|
| 175 |  N Z,Z0
 | 
|---|
| 176 |  S Z=0,Z0=$G(^DIC(36,+IBINS,0))
 | 
|---|
| 177 |  I $P(Z0,U,2)="N",$P($G(^IBE(355.2,+$P(Z0,U,13),0)),U)="MEDICARE" S Z=1
 | 
|---|
| 178 |  Q Z
 | 
|---|
| 179 |  ;
 | 
|---|
| 180 | WNRBILL(IBIFN,IBCOB) ; Returns whether the ins for COB seq IBCOB
 | 
|---|
| 181 |  ;  is MEDICARE will not reimburse
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  I $G(IBCOB)="" S IBCOB=$$COBN^IBCEF(IBIFN)
 | 
|---|
| 184 |  S IBCOB=$TR(IBCOB,"PST","123")
 | 
|---|
| 185 |  Q $$MCRWNR(+$G(^DGCR(399,IBIFN,"I"_IBCOB)))
 | 
|---|
| 186 |  ;
 | 
|---|
| 187 | MCR(IBINS) ;Returns whether the ins co IBINS is MCR Will Reimburse
 | 
|---|
| 188 |  ;          0=NO , 1=YES
 | 
|---|
| 189 |  N Z,Z0
 | 
|---|
| 190 |  S Z=0,Z0=$G(^DIC(36,+IBINS,0))
 | 
|---|
| 191 |  I $P(Z0,U,2)'="N",$P($G(^IBE(355.2,+$P(Z0,U,13),0)),U)="MEDICARE" S Z=1
 | 
|---|
| 192 |  Q Z
 | 
|---|
| 193 |  ;
 | 
|---|
| 194 | MRATYPE(IBIEN,IBVAR) ; Returns: A = MEDICARE A   B = MEDICARE B
 | 
|---|
| 195 |  ;  C = MEDICARE OTHER    null = NOT MEDICARE
 | 
|---|
| 196 |  ; for the plan associated with bill ien IBIEN OR grp plan IBIEN
 | 
|---|
| 197 |  ; If IBVAR = "" or 'C', the data is from bill ien in IBIEN
 | 
|---|
| 198 |  ;          = 'P', the data is from grp policy ien in IBIEN
 | 
|---|
| 199 |  ; 
 | 
|---|
| 200 |  N IBPLAN
 | 
|---|
| 201 |  S IBPLAN=$S($G(IBVAR)'="P":+$$POLICY^IBCEF(IBIEN,18),1:IBIEN)
 | 
|---|
| 202 |  Q $P($G(^IBA(355.3,+IBPLAN,0)),U,14)
 | 
|---|
| 203 |  ;
 | 
|---|
| 204 | MCRONBIL(IBIFN,IBFLG) ; Returns 0 if MCR WNR not on bill IBIFN
 | 
|---|
| 205 |  ;  1 if on bill, is on or before current ins
 | 
|---|
| 206 |  ;  2 if on bill, but after current ins
 | 
|---|
| 207 |  ; IBFLG = a COB number if second "^" piece of return data should be
 | 
|---|
| 208 |  ;         1 if MCRWNR is the insurance at that COB sequence (optional)
 | 
|---|
| 209 |  N Z,IBON,Q
 | 
|---|
| 210 |  S IBON=0,Q=$$COBN^IBCEF(IBIFN)
 | 
|---|
| 211 |  F Z=1:1:3 I $$WNRBILL(IBIFN,Z) S IBON=$S(Q'<Z:1,1:2)_$S('$G(IBFLG):"",Z'=IBFLG:"",1:"^1") Q
 | 
|---|
| 212 |  Q IBON
 | 
|---|
| 213 |  ;
 | 
|---|
| 214 | PROFEE(IBIFN) ; Returns whether any rev codes for prof fees
 | 
|---|
| 215 |  ;  included on bill IBIFN  0 = not included,  1 = included,
 | 
|---|
| 216 |  ;  2 = both inst and prof are included
 | 
|---|
| 217 |  ;
 | 
|---|
| 218 |  N IBPRO,Z
 | 
|---|
| 219 |  S IBPRO=0,Z=$O(^DGCR(399,IBIFN,"RC","B",959)) ; Rev cds 960-989 are prof
 | 
|---|
| 220 |  I Z,Z<990 D
 | 
|---|
| 221 |  . S IBPRO=1
 | 
|---|
| 222 |  . S Z=$O(^DGCR(399,IBIFN,"RC","B",0))
 | 
|---|
| 223 |  . I $S(Z:Z<960,1:0)!($O(^DGCR(399,IBIFN,"RC","B",1000),-1)'<990) S IBPRO=2
 | 
|---|
| 224 |  Q IBPRO
 | 
|---|
| 225 |  ;
 | 
|---|
| 226 | GETMOD(IBIFN,IBCPT,EXT) ; Returns 'list' of modifiers for file 399
 | 
|---|
| 227 |  ;   procedure for bill IBIFN and proc ien IBCPT
 | 
|---|
| 228 |  ;   in modifier seq order, separated by ','
 | 
|---|
| 229 |  ;  If EXT = 1, return the actual modifier, not the ptr
 | 
|---|
| 230 |  N IBMOD,IBZ,IBZ0,IB0,Z
 | 
|---|
| 231 |  S IBZ=0,IBMOD=""
 | 
|---|
| 232 |  F  S IBZ=$O(^DGCR(399,IBIFN,"CP",IBCPT,"MOD","B",IBZ)) Q:'IBZ  S IBZ0=0 F  S IBZ0=$O(^DGCR(399,IBIFN,"CP",IBCPT,"MOD","B",IBZ,IBZ0)) Q:'IBZ0  I $D(^DGCR(399,IBIFN,"CP",IBCPT,"MOD",IBZ0,0)) S IB0=$G(^(0)) D
 | 
|---|
| 233 |  . I '$G(EXT) S Z=$P(IB0,U,2)
 | 
|---|
| 234 |  . I $G(EXT) S Z=$$MOD^ICPTMOD($P(IB0,U,2),"I"),Z=$S($P(Z,U)=-1:"",1:$P(Z,U,2))
 | 
|---|
| 235 |  . Q:Z=""
 | 
|---|
| 236 |  . S IBMOD=IBMOD_$S(IBMOD="":"",1:",")_Z
 | 
|---|
| 237 |  Q IBMOD
 | 
|---|
| 238 |  ;
 | 
|---|
| 239 | MODLST(MODS,DESC,IBMOD) ; Returns string of actual mods
 | 
|---|
| 240 |  ; MOVED
 | 
|---|
| 241 |  Q $$MODLST^IBEFUNC2(MODS,$G(DESC),.IBMOD)
 | 
|---|
| 242 |  ;
 | 
|---|
| 243 | GETSPEC(FILE,FIELD) ; Get fld specifier for FIELD # in FILE
 | 
|---|
| 244 |  ; Use to set DIC("P") for FILE^DICN
 | 
|---|
| 245 |  N IBZ
 | 
|---|
| 246 |  D FIELD^DID(FILE,FIELD,"","SPECIFIER","IBZ")
 | 
|---|
| 247 |  Q $G(IBZ("SPECIFIER"))
 | 
|---|
| 248 |  ;
 | 
|---|