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