| [613] | 1 | IBCEF74 ;WOIFO/SS - FORMATTER/EXTRACT BILL FUNCTIONS ;31-JUL-03
 | 
|---|
 | 2 |  ;;2.0;INTEGRATED BILLING;**232,280,155,290,291,320,358,343,374**;21-MAR-94;Build 16
 | 
|---|
 | 3 |  ;; Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 | SORT(IBPRNUM,IBPRTYP,IB399,IBSRC,IBDST,IBN,IBEXC,IBSEQ,IBLIMIT) ;
 | 
|---|
 | 6 |  D SORT^IBCEF77($G(IBPRNUM),$G(IBPRTYP),$G(IB399),.IBSRC,.IBDST,$G(IBN),$G(IBEXC),$G(IBSEQ),$G(IBLIMIT))
 | 
|---|
 | 7 |  Q
 | 
|---|
 | 8 |  ;
 | 
|---|
 | 9 |  ;-- PROVINF --
 | 
|---|
 | 10 |  ;Create array with prov info
 | 
|---|
 | 11 |  ;Input:
 | 
|---|
 | 12 |  ; IB399 - ien #399
 | 
|---|
 | 13 |  ; IBPRNUM - 1=prim ins, 2= sec, 3 -tert
 | 
|---|
 | 14 |  ; IBRES - for results
 | 
|---|
 | 15 |  ; IBSORT - to sort OTHER INSURANCE data 
 | 
|---|
 | 16 |  ;  if PROVINF is called for "C" mode of PROVIDER subroutine then 
 | 
|---|
 | 17 |  ;    IBSORT can be any (say 1)
 | 
|---|
 | 18 |  ;  if PROVINF is called for "O" mode then can be more than set of data
 | 
|---|
 | 19 |  ;    - need to sort array to use it (like IBXDATA(1) and IBXDATA(2))
 | 
|---|
 | 20 |  ;    for mode "O" it should be 1 or 2 (see PROVIDER section)
 | 
|---|
 | 21 |  ;IBINSTP -  "C" -current ins, "O"-other
 | 
|---|
 | 22 |  ;Output:
 | 
|---|
 | 23 |  ; IBRES(PRNUM,PRTYPE,SEQ#)=PROV^INSUR^IDTYPE^ID^FORMTYP^CARETYP
 | 
|---|
 | 24 |  ; where:(see PROVIDER)
 | 
|---|
 | 25 | PROVINF(IB399,IBPRNUM,IBRES,IBSORT,IBINSTP) ;
 | 
|---|
 | 26 |  I $G(IB399)="" Q
 | 
|---|
 | 27 |  I +$G(IBSORT)=0 S IBSORT=$G(IBPRNUM)
 | 
|---|
 | 28 |  N IBPRTYP,IBINSCO,IBPROV,IBFRMTYP,IBCARE,IB35591,IBN,IBCURR,IBEXC,IBALLSSN,IBSSNIEN,IBLIMIT
 | 
|---|
 | 29 |  S IBN=0
 | 
|---|
 | 30 |  D F^IBCEF("N-ALL ATT/RENDERING PROV SSN","IBALLSSN",,IB399)
 | 
|---|
 | 31 |  S Q=0 F  S Q=$O(^IBE(355.97,Q)) Q:'Q  I $P($G(^(Q,0)),U,3)="SY" S IBSSNIEN=Q Q
 | 
|---|
 | 32 |  S IBINSCO=+$P($G(^DGCR(399,IB399,"M")),"^",IBPRNUM)
 | 
|---|
 | 33 |  S IBFRMTYP=$$FT^IBCEF(IB399),IBFRMTYP=$S(IBFRMTYP=2:2,IBFRMTYP=3:1,1:0)
 | 
|---|
 | 34 |  S IBCARE=$S($$ISRX^IBCEF1(IB399):3,1:0) ;if an Rx refill bill
 | 
|---|
 | 35 |  S:IBCARE=0 IBCARE=$$INPAT^IBCEF(IB399,1) S:'IBCARE IBCARE=2 ;1-inp,2-out
 | 
|---|
 | 36 |  S IBLIMIT=$S($G(IBINSTP)="C":5,1:3)  ; Limits on secondary IDs
 | 
|---|
 | 37 |  F IBPRTYP=1:1:9 D
 | 
|---|
 | 38 |  . N Z,IB355OV
 | 
|---|
 | 39 |  . S IBPROV=$$PROVPTR^IBCEF7(IB399,IBPRTYP)
 | 
|---|
 | 40 |  . Q:+IBPROV=0
 | 
|---|
 | 41 |  . ;don't create anything if form type not CMS-1500 or UB
 | 
|---|
 | 42 |  . Q:IBFRMTYP=0
 | 
|---|
 | 43 |  . N IBRETARR S IBRETARR=0
 | 
|---|
 | 44 |  . D PRACT^IBCEF71(IBINSCO,IBFRMTYP,IBCARE,IBPROV,.IBRETARR,IBPRTYP,$G(IBINSTP))
 | 
|---|
 | 45 |  . S IB355OV="",IBEXC=""
 | 
|---|
 | 46 |  . S Z=$O(^DGCR(399,IB399,"PRV","B",IBPRTYP,0))
 | 
|---|
 | 47 |  . I Z S Z=$G(^DGCR(399,IB399,"PRV",Z,0)) D
 | 
|---|
 | 48 |  .. I $P(Z,U,IBPRNUM+4)'="",$P(Z,U,IBPRNUM+11)'="" S IB355OV=$P(Z,U,IBPRNUM+4)_U_$P(Z,U,IBPRNUM+11)
 | 
|---|
 | 49 |  . S IBCURR=$$COB^IBCEF(IB399)
 | 
|---|
 | 50 |  . S IBN=0,IB35591=$$CH35591^IBCEF72(IBINSCO,IBFRMTYP,IBCARE)
 | 
|---|
 | 51 |  . I $G(IBINSTP)="C",$G(IBPRNUM)=1,"34"[$G(IBPRTYP),"P"[$G(IBCURR),$G(IBFRMTYP)=2,$$MCRONBIL^IBEFUNC(IB399) S IB355OV=$$MCR24K^IBCEU3(IB399)_"^12"
 | 
|---|
 | 52 |  . I $G(IBINSTP)="O","34"[$G(IBPRTYP),"ST"[$G(IBCURR),$G(IBFRMTYP)=2,$$MCRONBIL^IBEFUNC(IB399) S IB355OV=$$MCR24K^IBCEU3(IB399)_"^12" ;Calculate MEDICARE (WNR) specific provider qualifier and ID for CMS-1500 secondary claims
 | 
|---|
 | 53 |  . I $P(IB355OV,U,2) D
 | 
|---|
 | 54 |  .. I $$CHCKSEC^IBCEF73(IBFRMTYP,IBPRTYP,$G(IBINSTP),$P($G(^IBE(355.97,+$P(IB355OV,U,2),0)),U,3)) D
 | 
|---|
 | 55 |  ... S IBEXC=$P(IB355OV,U,2),IBN=IBN+1,IBRES(IBSORT,IBPRTYP,IBN)="OVERRIDE^"_IBINSCO_U_$P($G(^IBE(355.97,+IBEXC,0)),U,3)_U_$P(IB355OV,U)_"^^^^^"_+IBEXC
 | 
|---|
 | 56 |  . I IB35591'="",IBEXC'=$P(IB35591,U,3) S:$$CHCKSEC^IBCEF73(IBFRMTYP,IBPRTYP,$G(IBINSTP),$P(IB35591,"^")) IBN=IBN+1,IBRES(IBSORT,IBPRTYP,IBN)="DEFAULT^"_IBINSCO_"^"_IB35591_"^^",$P(IBRES(IBSORT,IBPRTYP,IBN),U,9)=$P(IB35591,U,3)
 | 
|---|
 | 57 |  . D SORT(IBSORT,IBPRTYP,IB399,.IBRETARR,.IBRES,IBN,IBEXC,IBPRNUM,IBLIMIT)
 | 
|---|
 | 58 |  . S IBRES(IBSORT,IBPRTYP)=IBPROV
 | 
|---|
 | 59 |  S IBRES(IBSORT)=$S(IBPRNUM=3:"T",IBPRNUM=2:"S",1:"P")
 | 
|---|
 | 60 |  Q
 | 
|---|
 | 61 |  ;
 | 
|---|
 | 62 | SECIDCK(IBIFN,IBSEQ,IBTYP,IBIFN1) ; Function returns 1 if ID type ptr in
 | 
|---|
 | 63 |  ;  IBTYP is valid X12 code for the claim/prov function (IBPROVF)
 | 
|---|
 | 64 |  ;  as a sec id
 | 
|---|
 | 65 |  ; IBSEQ = COB seq being checked
 | 
|---|
 | 66 |  ; IBIFN1 = entry # in PRV multiple being checked
 | 
|---|
 | 67 |  ;  Called from input transform of fields .12-.14, subfile 399.0222
 | 
|---|
 | 68 |  I $G(IBIFN)="" Q
 | 
|---|
 | 69 |  N IBOK,IBFRM,IBCOBN,IBX12,IBPROVF
 | 
|---|
 | 70 |  S IBPROVF=+$G(^DGCR(399,IBIFN,"PRV",IBIFN1,0))
 | 
|---|
 | 71 |  S IBFRM=$$FT^IBCEF(IBIFN),IBFRM=$S(IBFRM=3:1,1:2) ; Form type
 | 
|---|
 | 72 |  S IBCOBN=$$COBN^IBCEF(IBIFN) S:'IBCOBN IBCOBN=1 ; Current COB seq
 | 
|---|
 | 73 |  S IBX12=$P($G(^IBE(355.97,+IBTYP,0)),U,3) ; X12 code for prov id typ
 | 
|---|
 | 74 |  Q $$CHSEC^IBCEF73(IBFRM,IBPROVF,$S(IBSEQ=IBCOBN:"C",1:"O"),IBX12)
 | 
|---|
 | 75 |  ;
 | 
|---|
 | 76 | DEFID(IBIFN,IBPRV) ;
 | 
|---|
 | 77 |  ; IBIFN = ien of bill
 | 
|---|
 | 78 |  ; IBPRV = ien of entry subfile 399.0222
 | 
|---|
 | 79 |  ;  Function returns default ids: prim id def^sec id def^tert id def
 | 
|---|
 | 80 |  ;  SSN cannot be the default ID
 | 
|---|
 | 81 |  I $G(IBIFN)="" Q ""
 | 
|---|
 | 82 |  N Z,Z1,ID,IBZ,IBINS,IBINS4,IBUB
 | 
|---|
 | 83 |  S IBZ=""
 | 
|---|
 | 84 |  S IBUB=($$FT^IBCEF(IBIFN)=3)
 | 
|---|
 | 85 |  D F^IBCEF("N-ALL ATT/REND PROV SSN/EI","IBZ","",IBIFN)
 | 
|---|
 | 86 |  S Z=$G(^DGCR(399,IBIFN,"PRV",IBPRV,0)),ID=$P(Z,U,5,7)
 | 
|---|
 | 87 |  F Z1=1:1:3 I $P(ID,U,Z1)="" D
 | 
|---|
 | 88 |  . Q:'$G(^DGCR(399,IBIFN,"I"_Z1))  S IBINS=+^("I"_Z1)
 | 
|---|
 | 89 |  . S $P(ID,U,Z1)=$$GETID^IBCEP2(IBIFN,2,$P(Z,U,2),Z1)
 | 
|---|
 | 90 |  . ; Set default if null
 | 
|---|
 | 91 |  . I $P(ID,U,Z1)="" S $P(ID,U,Z1)="VAD000"
 | 
|---|
 | 92 |  Q ID
 | 
|---|
 | 93 |  ;
 | 
|---|
 | 94 | DISPID(IBXIEN) ; Display list of all prov and fac ids that will
 | 
|---|
 | 95 |  ; extract for this bill if transmitted electronically
 | 
|---|
 | 96 |  I $G(IBXIEN)="" Q
 | 
|---|
 | 97 |  N IBID,IBID1,IBZ,IBCT,IBFRM,IBCOBN,IBATT,IBQUIT,IBTYP,DIR,IBIFN,X,Y,Z,Z0,Z1
 | 
|---|
 | 98 |  N IBNPI,IBNONPI
 | 
|---|
 | 99 |  S IBIFN=IBXIEN
 | 
|---|
 | 100 |  S IBFRM=$$FT^IBCEF(IBIFN),IBCOBN=$$COBN^IBCEF(IBIFN),IBATT=$S(IBFRM=2:3,1:4)
 | 
|---|
 | 101 |  W @IOF
 | 
|---|
 | 102 |  W !,"If this bill is transmitted electronically, the following IDs will be sent:"
 | 
|---|
 | 103 |  ; Returns all prov sec ids to be transmitted in indicated segments
 | 
|---|
 | 104 |  S Z=+$G(^DGCR(399,IBIFN,"I1")) I Z W !,"  Primary Ins Co: ",$$EXTERNAL^DILFD(399,101,"",Z) I IBCOBN=1 W ?54,"<<<Current Ins"
 | 
|---|
 | 105 |  S Z=+$G(^DGCR(399,IBIFN,"I2")) I Z W !,"Secondary Ins Co: ",$$EXTERNAL^DILFD(399,101,"",Z) I IBCOBN=2 W ?54,"<<<Current Ins"
 | 
|---|
 | 106 |  S Z=+$G(^DGCR(399,IBIFN,"I3")) I Z W !," Tertiary Ins Co: ",$$EXTERNAL^DILFD(399,101,"",Z) I IBCOBN=3 W ?54,"<<<Current Ins"
 | 
|---|
 | 107 |  W !!,"Provider IDs: (VistA Records OP1,OP2,OP4,OP8,OP9,OPR2,OPR3,OPR4,OPR5,OPR8):"
 | 
|---|
 | 108 |  F Z=1:1:3 I $G(^DGCR(399,IBIFN,"I"_Z)) D PROVINF(IBIFN,Z,.IBID,"",$S(IBCOBN=Z:"C",1:"O"))
 | 
|---|
 | 109 |  S Z=0 F  S Z=$O(IBID(Z)) Q:'Z  S Z0=0 F  S Z0=$O(IBID(Z,Z0)) Q:'Z0  S IBID1(Z0,Z)="",Z1=0 F  S Z1=$O(IBID(Z,Z0,Z1)) Q:'Z1  I $P(IBID(Z,Z0,Z1),U,9) S IBID1(Z0,Z,Z1)=IBID(Z,Z0,Z1)
 | 
|---|
 | 110 |  ; PRXM/KJH - Add NPI to display for patch 343.
 | 
|---|
 | 111 |  S IBNPI=$$PROVNPI^IBCEF73A(IBIFN,.IBNONPI)
 | 
|---|
 | 112 |  S Z=+$O(^DGCR(399,IBIFN,"PRV","B",IBATT,0))
 | 
|---|
 | 113 |  I Z S Z=$P($G(^DGCR(399,IBIFN,"PRV",Z,0)),U,2)
 | 
|---|
 | 114 |  W !,?5,"ATTENDING/RENDERING: ",$$EXTERNAL^DILFD(399.0222,.02,"",Z)
 | 
|---|
 | 115 |  D F^IBCEF("N-ALL ATT/REND PROV SSN/EI","IBZ","",IBIFN)
 | 
|---|
 | 116 |  W !,?8,"NPI: ",?40,$S($P(IBNPI,U,IBATT)'="":$P(IBNPI,U,IBATT),1:"***MISSING***")
 | 
|---|
 | 117 |  W !,?8,"SSN: ",?40,$S($P(IBZ,U,IBATT)'="":$P(IBZ,U,IBATT),1:"***MISSING***")
 | 
|---|
 | 118 |  I $O(IBID1(IBATT,0)) W !,?8,"Secondary IDs"
 | 
|---|
 | 119 |  S IBQUIT=0
 | 
|---|
 | 120 |  ;
 | 
|---|
 | 121 |  ; Attending/Rendering (4/3) secondary IDs
 | 
|---|
 | 122 |  S Z0=0 F  S Z0=$O(IBID1(IBATT,Z0)) Q:'Z0!IBQUIT  K IBTYP S Z1=0 F  S Z1=$O(IBID1(IBATT,Z0,Z1)) Q:'Z1  D  Q:IBQUIT
 | 
|---|
 | 123 |  . Q:$D(IBTYP(+$P(IBID1(IBATT,Z0,Z1),U,9)))  ;1st of each type transmits
 | 
|---|
 | 124 |  . I ($Y+5)>IOSL S IBQUIT=$$NOMORE() Q:IBQUIT
 | 
|---|
 | 125 |  . S IBTYP(+$P(IBID1(IBATT,Z0,Z1),U,9))=""
 | 
|---|
 | 126 |  . W !,?8,"(",$E("PST",Z0),") ",$$EXTERNAL^DILFD(36,4.01,"",$P(IBID1(IBATT,Z0,Z1),U,9)),?40,$P(IBID1(IBATT,Z0,Z1),U,4)
 | 
|---|
 | 127 |  . Q
 | 
|---|
 | 128 |  I IBQUIT G DISPIDX
 | 
|---|
 | 129 |  ;
 | 
|---|
 | 130 |  ; Referring(1), Operating(2), Supervising(5), Other(9) secondary IDs
 | 
|---|
 | 131 |  ; PRXM/KJH - Patch 343. Modified first loop so it will always display provider and NPI and conditionally display other data.
 | 
|---|
 | 132 |  ; S Z=0 F  S Z=$O(IBID1(Z)) Q:'Z  I Z<3!(Z>4) D  Q:IBQUIT
 | 
|---|
 | 133 |  S Z=0 F  S Z=$O(^DGCR(399,IBIFN,"PRV","B",Z)) Q:'Z  I Z<3!(Z>4) D  Q:IBQUIT
 | 
|---|
 | 134 |  . N Q
 | 
|---|
 | 135 |  . S Q=+$O(^DGCR(399,IBIFN,"PRV","B",Z,0))
 | 
|---|
 | 136 |  . W !!,?5,$$EXTERNAL^DILFD(399.0222,.01,"",Z),": "_$$EXTERNAL^DILFD(399.0222,.02,"",$P($G(^DGCR(399,IBIFN,"PRV",Q,0)),U,2))
 | 
|---|
 | 137 |  . W !,?8,"NPI: ",?40,$S($P(IBNPI,U,Z)'="":$P(IBNPI,U,Z),1:"***MISSING***")
 | 
|---|
 | 138 |  . S Z0=0 F  S Z0=$O(IBID1(Z,Z0)) Q:'Z0!IBQUIT  K IBTYP S Z1=0 F  S Z1=$O(IBID1(Z,Z0,Z1)) Q:'Z1!IBQUIT  D
 | 
|---|
 | 139 |  .. Q:$D(IBTYP(+$P(IBID1(Z,Z0,Z1),U,9)))  ; 1st of each type transmits
 | 
|---|
 | 140 |  .. I ($Y+5)>IOSL S IBQUIT=$$NOMORE() Q:IBQUIT
 | 
|---|
 | 141 |  .. S IBTYP(+$P(IBID1(Z,Z0,Z1),U,9))=""
 | 
|---|
 | 142 |  .. W !,?8,"(",$E("PST",Z0),") ",$$EXTERNAL^DILFD(36,4.01,"",$P(IBID1(Z,Z0,Z1),U,9)),?40,$P(IBID1(Z,Z0,Z1),U,4)
 | 
|---|
 | 143 |  .. Q
 | 
|---|
 | 144 |  . Q
 | 
|---|
 | 145 |  I IBQUIT G DISPIDX
 | 
|---|
 | 146 |  ;
 | 
|---|
 | 147 |  ; IB*2*320 - display additional IDs for ?ID
 | 
|---|
 | 148 |  D EN^IBCEF74A(IBIFN,.IBQUIT)
 | 
|---|
 | 149 |  ;
 | 
|---|
 | 150 | DISPIDX ;
 | 
|---|
 | 151 |  I '$G(IBQUIT) S DIR(0)="EA",DIR("A")="Press RETURN to continue " W ! D ^DIR K DIR
 | 
|---|
 | 152 |  Q
 | 
|---|
 | 153 |  ;
 | 
|---|
 | 154 | NOMORE() ;
 | 
|---|
 | 155 |  S DIR(0)="EA",DIR("A")="Press RETURN for more IDs or '^' to exit: " W ! D ^DIR
 | 
|---|
 | 156 |  W @IOF
 | 
|---|
 | 157 |  Q (Y'=1)
 | 
|---|
 | 158 |  ;
 | 
|---|
 | 159 | DEFSEC(IBIFN,IBARR) ; Returns array in IBARR for default prov sec ids for ien IBIFN
 | 
|---|
 | 160 |  ; IBARR if passed by ref is returned   IBARR(prov function,COBN)=def id
 | 
|---|
 | 161 |  I $G(IBIFN)=""
 | 
|---|
 | 162 |  N IBCAR,IBCOBN,IBPC,IBINS,IBARRX,Q,Z,Z0,ZINS,X
 | 
|---|
 | 163 |  K IBARR
 | 
|---|
 | 164 |  S ZINS="",IBCOBN=$$COBN^IBCEF(IBIFN),IBPC=$S($$FT^IBCEF(IBIFN)=3:2,1:1)
 | 
|---|
 | 165 |  S IBCAR=$$INPAT^IBCEF(IBIFN,1),IBCAR=$S('IBCAR:2,1:1)
 | 
|---|
 | 166 |  F Z=1:1:3 S ZINS=ZINS_+$G(^DGCR(399,IBIFN,"I"_Z))_U
 | 
|---|
 | 167 |  F Z=1:1:3 I $P(ZINS,U,Z),'$P($G(^DIC(36,+$P(ZINS,U,Z),4)),U,IBPC) S $P(ZINS,U,Z)=""
 | 
|---|
 | 168 |  S Z=0 F  S Z=$O(^DGCR(399,IBIFN,"PRV",Z)) Q:'Z  S Z0=$G(^(Z,0)) D
 | 
|---|
 | 169 |  . F Q=1:1:3 D
 | 
|---|
 | 170 |  .. I $P(Z0,U,Q+4)'="" S IBARR(+Z0,Q)=$P(Z0,U,Q+4) Q  ; Override
 | 
|---|
 | 171 |  .. S IBINS=$P(ZINS,U,Q)
 | 
|---|
 | 172 |  .. Q:'IBINS
 | 
|---|
 | 173 |  .. S X=$$IDFIND^IBCEP2(IBIFN,"",$P(Z0,U,2),Q,1)
 | 
|---|
 | 174 |  .. I X'="" S IBARR(+Z0,Q)=X
 | 
|---|
 | 175 |  Q
 | 
|---|
 | 176 |  ;
 | 
|---|