| [613] | 1 | IBCEF71 ;WOIFO/SS - FORMATTER AND EXTRACTOR SPECIFIC BILL FUNCTIONS ;31-JUL-03
 | 
|---|
 | 2 |  ;;2.0;INTEGRATED BILLING;**232,155,288,320,349**;21-MAR-94;Build 46
 | 
|---|
 | 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 |  ;---------
 | 
|---|
 | 6 |  ;OTHPAYC - from FORMAT code for OP1,OP2 ...
 | 
|---|
 | 7 |  ;Input:
 | 
|---|
 | 8 |  ;IBXIEN - ien #399
 | 
|---|
 | 9 |  ;IBSAVE - "in" array (i.e. IBXSAVE)
 | 
|---|
 | 10 |  ;IBDATA - "out" array (i.e. IBXDATA)
 | 
|---|
 | 11 |  ;IBFUNC - FUNCTION from #399 (1-refering,2-operating,etc)
 | 
|---|
 | 12 |  ;IBVAL - output value
 | 
|---|
 | 13 |  ;Output:
 | 
|---|
 | 14 |  ; IBDATA with formatted output
 | 
|---|
 | 15 | OTHPAYC(IBXIEN,IBSAVE,IBDATA,IBFUNC,IBVAL) ;
 | 
|---|
 | 16 |  N IB1,IB2,IBINS,IBFL
 | 
|---|
 | 17 |  S IBFL=$S(IBFUNC=3!(IBFUNC=4):1,1:0)
 | 
|---|
 | 18 |  F IB1=1,2 D
 | 
|---|
 | 19 |  . Q:'$$ISINSUR($G(IBSAVE("PROVINF",IBXIEN,"O",IB1)),IBXIEN)  ;don't create anything if no such insurance
 | 
|---|
 | 20 |  . I IBFL S IBFUNC=$S($O(IBSAVE("PROVINF",IBXIEN,"O",IB1,3,0)):3,1:4)
 | 
|---|
 | 21 |  . S:$O(IBSAVE("PROVINF",IBXIEN,"O",IB1,IBFUNC,0)) IBDATA(IB1)=IBVAL
 | 
|---|
 | 22 |  Q
 | 
|---|
 | 23 |  ;----
 | 
|---|
 | 24 |  ;OTHPAYV - called from FORMAT code for OP1,OP2 ...
 | 
|---|
 | 25 |  ;Input:
 | 
|---|
 | 26 |  ;IBXIEN - ien #399
 | 
|---|
 | 27 |  ;IBSAVE - "in" array (i.e. IBXSAVE)
 | 
|---|
 | 28 |  ;IBDATA - "out" array (i.e. IBXDATA)
 | 
|---|
 | 29 |  ;IBFUNC - FUNCTION from #399 (1-refering, 2-operating, etc)
 | 
|---|
 | 30 |  ;IBSEQN - seq # of ID/QUAL
 | 
|---|
 | 31 |  ;IBFLDTYP
 | 
|---|
 | 32 |  ; "I" - ID  "Q" - ID QUAL
 | 
|---|
 | 33 |  ;Output:
 | 
|---|
 | 34 |  ; IBDATA with formatted output
 | 
|---|
 | 35 | OTHPAYV(IBXIEN,IBSAVE,IBDATA,IBFUNC,IBFLDTYP,IBSEQN) ;
 | 
|---|
 | 36 |  N IB1,IB2,IBPIECE,IBINS,IBFL
 | 
|---|
 | 37 |  S IBFL=$S(IBFUNC=3!(IBFUNC=4):1,1:0)
 | 
|---|
 | 38 |  S IBPIECE=$S(IBFLDTYP="I":4,IBFLDTYP="Q":3,1:3)
 | 
|---|
 | 39 |  F IB1=1,2 D
 | 
|---|
 | 40 |  . Q:'$$ISINSUR($G(IBSAVE("PROVINF",IBXIEN,"O",IB1)),IBXIEN)  ;don't create anything if there is no such insurance
 | 
|---|
 | 41 |  . I IBFL S IBFUNC=$S($O(IBSAVE("PROVINF",IBXIEN,"O",IB1,3,0)):3,1:4),IBFL=0
 | 
|---|
 | 42 |  . S IBDATA(IB1)=$P($G(IBSAVE("PROVINF",IBXIEN,"O",IB1,IBFUNC,IBSEQN)),"^",IBPIECE)
 | 
|---|
 | 43 |  Q
 | 
|---|
 | 44 |  ;
 | 
|---|
 | 45 |  ;chk for ins
 | 
|---|
 | 46 |  ;Input:
 | 
|---|
 | 47 |  ; IBINS = "P","S","T"
 | 
|---|
 | 48 |  ; IBXIEN - ien file #399
 | 
|---|
 | 49 |  ;Output:
 | 
|---|
 | 50 |  ; returns 1-exists , 0-doesn't
 | 
|---|
 | 51 | ISINSUR(IBINS,IBXIEN) ;
 | 
|---|
 | 52 |  N IBINSNOD
 | 
|---|
 | 53 |  S IBINSNOD=$S(IBINS="P":"I1",IBINS="S":"I2",IBINS="T":"I3",1:"")
 | 
|---|
 | 54 |  I IBINSNOD="" Q 0
 | 
|---|
 | 55 |  Q $D(^DGCR(399,IBXIEN,IBINSNOD))
 | 
|---|
 | 56 |  ;
 | 
|---|
 | 57 |  ;---PRACT----
 | 
|---|
 | 58 |  ;Get list of all 355.9 or 355.93 records for prov
 | 
|---|
 | 59 |  ;Input: 
 | 
|---|
 | 60 |  ;IB399INS - ins co for bill to match PRACTIONER from 355.9
 | 
|---|
 | 61 |  ;IB399FRM - form type (0=unknwn/both,1=UB,2=1500) to 
 | 
|---|
 | 62 |  ;   match PRACTIONER from 355.9
 | 
|---|
 | 63 |  ;IB399CAR - BILL CARE (0=unknwn or both inp/outp,1=inpatient,
 | 
|---|
 | 64 |  ;   2=outpatient/3=Rx) to match PROV from 355.9
 | 
|---|
 | 65 |  ;    OR   - DIVISION PTR to file 40.8 for entries in file 355.92
 | 
|---|
 | 66 |  ;IBPROV - VARIABLE PTR VA prov
 | 
|---|
 | 67 |  ;IBARR - array by reference for result
 | 
|---|
 | 68 |  ;IBPROVTP- function (2-operating, 3-RENDERING,etc 0-facility)
 | 
|---|
 | 69 |  ;IBINSTP - "C" -current ins , "O"-other
 | 
|---|
 | 70 |  ;IBFILE - 355.92 for facility ids or 355.9 (default) for provider ids
 | 
|---|
 | 71 |  ;IBINS - 1 if to include ids for the ins co for all provs
 | 
|---|
 | 72 |  ;Ouput:
 | 
|---|
 | 73 |  ;IBARR - array by ref for result
 | 
|---|
 | 74 |  ; prov var ptr^ins ptr^X12 id cd^ID^form typ^care typ or division ptr^st ptr^id rec ptr^id type ptr
 | 
|---|
 | 75 | PRACT(IB399INS,IB399FRM,IB399CAR,IBPROV,IBARR,IBPROVTP,IBINSTP,IBFILE,IBINS) ;
 | 
|---|
 | 76 |  N IB1,IB2,IBDAT,IBF,IBFX,IB3559,IBINSCO,IBFRMTYP,IBIDTYP,IBID,IBIDT,IBDIV,IBQ,IBS1,IBS2,IBARRX,Z,Z1,Z2,IBCARE
 | 
|---|
 | 77 |  I $G(IBFILE)="" S IBFILE=355.9
 | 
|---|
 | 78 |  S IBINS=$G(IBINS)
 | 
|---|
 | 79 |  S (IBARR,IB3559,IB1)=0
 | 
|---|
 | 80 |  F IBF="",1 Q:IBF=1&$S(IBFILE'=355.9:1,1:'IBINS)  S IBFX=IBFILE_IBF F IB2=1:1 S IB3559=$O(^IBA(IBFX,"B",$S(IBFILE=355.9&(IBF=""):IBPROV,1:IB399INS),IB3559)) Q:IB3559=""  D
 | 
|---|
 | 81 |  . S IBINSCO=$P($G(^IBA(IBFX,IB3559,0)),"^",$S(IBFILE=355.9&(IBF=""):2,1:1)) ;ins co. ptr
 | 
|---|
 | 82 |  . I IBINSCO'="" I IBINSCO'=IB399INS Q  ;exclude if different ins
 | 
|---|
 | 83 |  . S:IBINSCO="" IBINSCO="NONE" ;NONE will be included in the array
 | 
|---|
 | 84 |  . S IBFRMTYP=+$P($G(^IBA(IBFX,IB3559,0)),"^",4) ;form type (0=both,1=UB,2=1500)
 | 
|---|
 | 85 |  . I '(IBFRMTYP=0!(IB399FRM=0)) Q:IBFRMTYP'=IB399FRM  ;exclude if not "both" and different
 | 
|---|
 | 86 |  . S IBCARE=+$P($G(^IBA(IBFX,IB3559,0)),"^",5) ;0=both(inp and outp),1=inp,2=outp,3=prescr  -- OR -- division ptr
 | 
|---|
 | 87 |  . I $S(IBFILE=355.92:0,1:IBCARE=3) I IB399CAR'=3 Q  ; Id is only for Rx
 | 
|---|
 | 88 |  . I $S(IBFILE=355.92:0,1:IBCARE=1!(IBCARE=2)) I IB399CAR=1!(IB399CAR=2) Q:IBCARE'=IB399CAR  ;both is OK
 | 
|---|
 | 89 |  . I IBFILE=355.92,IBCARE Q:IB399CAR'=IBCARE  ; Division doesn't match
 | 
|---|
 | 90 |  . S IBIDTYP=+$P($G(^IBA(IBFX,IB3559,0)),"^",6) ;prov ID type
 | 
|---|
 | 91 |  . I IBFILE=355.9,IBIDTYP=$$TAXID^IBCEP8(),$S(IBPROV["VA(200":1,1:$P($G(^IBA(355.93,+IBPROV,0)),U,2)=2) Q  ; Don't extract tax id # id for indiv prov
 | 
|---|
 | 92 |  . S IBIDT=IBIDTYP
 | 
|---|
 | 93 |  . S IBIDTYP=$P($G(^IBE(355.97,IBIDTYP,0)),"^",3)
 | 
|---|
 | 94 |  . Q:$P($G(^IBE(355.97,+IBIDT,1)),U,9)
 | 
|---|
 | 95 |  . Q:IBFILE=355.9&(IBIDTYP="X4")  ;exclude CLIA #
 | 
|---|
 | 96 |  . S IBID=$P($G(^IBA(IBFX,IB3559,0)),"^",7) ;prov ID value
 | 
|---|
 | 97 |  . I $G(IBPROVTP)'="",$G(IBINSTP)'="",IBPROVTP'=0 I '$$CHCKSEC^IBCEF73(IB399FRM,IBPROVTP,IBINSTP,IBIDTYP) Q  ; No qualifier chk for fac
 | 
|---|
 | 98 |  . I IBID'="" S IBDAT=IBPROV_"^"_IBINSCO_"^"_IBIDTYP_"^"_IBID_"^"_IBFRMTYP_"^"_IBCARE_"^"_"^"_IB3559_U_IBIDT,IBS2=$S(IBFX'=355.91:"",1:"INS DEF^")_IB3559
 | 
|---|
 | 99 |  . I IBFILE'=355.92,IBID'="",IB399CAR=3 S IBQ=0 D  Q:IBQ
 | 
|---|
 | 100 |  .. I $G(IBARRX(IBIDT))!(IBCARE=1) S IBQ=1 Q
 | 
|---|
 | 101 |  .. I IBCARE=3&(IB399CAR=3) S IBARRX(IBIDT)=1 Q  ; Rx match
 | 
|---|
 | 102 |  .. I IBCARE=0!(IBCARE=2) S IBARRX(IBIDT,IBINSCO,IBS2)=IBDAT,IBQ=1 Q
 | 
|---|
 | 103 |  . I IBID'="" S IBARR(IBINSCO,IBS2)=IBDAT
 | 
|---|
 | 104 |  ;
 | 
|---|
 | 105 |  I IB399CAR=3 S Z=0 F  S Z=$O(IBARRX(Z)) Q:'Z  I '$G(IBARRX(Z)) D
 | 
|---|
 | 106 |  . S Z1="" F  S Z1=$O(IBARRX(Z,Z1)) Q:Z1=""  S Z2="" F  S Z2=$O(IBARRX(Z,Z1,Z2)) Q:Z2=""  S IBARR(Z1,Z2)=IBARRX(Z,Z1,Z2)
 | 
|---|
 | 107 |  ;
 | 
|---|
 | 108 |  I IBPROV["VA(200," D  ; Get lic #s from file 2 for VA providers
 | 
|---|
 | 109 |  . N Z,IBLIC
 | 
|---|
 | 110 |  . S IBLIC=+IBPROV,IBLIC=$$GETLIC^IBCEP5D(.IBLIC)
 | 
|---|
 | 111 |  . S IBIDTYP=$P($G(^IBE(355.97,+$$STLIC^IBCEP8(),0)),U,3)
 | 
|---|
 | 112 |  . S Z=0 F  S Z=$O(IBLIC(Z)) Q:'Z  S:$$CHCKSEC^IBCEF73(IB399FRM,IBPROVTP,IBINSTP,IBIDTYP) IBARR("NONE","LIC"_Z_"^"_IBPROV)=IBPROV_U_"NONE"_U_IBIDTYP_U_IBLIC(Z)_U_"0"_U_"0"_U_Z_U_U_+$$STLIC^IBCEP8()
 | 
|---|
 | 113 |  I IBPROV["IBA(355.93" D
 | 
|---|
 | 114 |  . Q:$P($G(^IBA(355.93,+IBPROV,0)),U,12)=""
 | 
|---|
 | 115 |  . S IBIDTYP=$P($G(^IBE(355.97,+$$STLIC^IBCEP8(),0)),U,3)
 | 
|---|
 | 116 |  . I $$CHCKSEC^IBCEF73(IB399FRM,IBPROVTP,IBINSTP,IBIDTYP) D
 | 
|---|
 | 117 |  . . S IBARR("NONE","LIC"_$P($G(^DIC(5,+$P(^IBA(355.93,+IBPROV,0),U,7),0)),U,2)_"^"_IBPROV)=IBPROV_U_"NONE"_U_IBIDTYP_U_$P(^IBA(355.93,+IBPROV,0),U,12)_U_"0"_U_"0"_U_$P(^IBA(355.93,+IBPROV,0),U,7)_U_U_+IBPROV
 | 
|---|
 | 118 |  Q
 | 
|---|
 | 119 |  ;
 | 
|---|
 | 120 | ALLPRFAC(IBXIEN,IBXSAVE) ; Return all non-VA/outside facility prov ids
 | 
|---|
 | 121 |  ; and all VA alternate prov ids
 | 
|---|
 | 122 |  ; IBXIEN = ien file 399
 | 
|---|
 | 123 |  ; IBXSAVE = subscripted array returned
 | 
|---|
 | 124 |  N IBPROV,IBFRMTYP,IBCARE,IBRETARR,IBRET1,IBCOBN,Z,Z0,Z1,ZZ
 | 
|---|
 | 125 |  K IBXSAVE("PROVINF_FAC",IBXIEN) ; Always rebuild this
 | 
|---|
 | 126 |  S IBCOBN=+$$COBN^IBCEF(IBXIEN)
 | 
|---|
 | 127 |  S IBFRMTYP=$$FT^IBCEF(IBXIEN),IBFRMTYP=$S(IBFRMTYP=2:2,IBFRMTYP=3:1,1:0)
 | 
|---|
 | 128 |  S IBPROV=$P($G(^DGCR(399,IBXIEN,"U2")),U,10)
 | 
|---|
 | 129 |  ; IB patch 320 - Build IBPROV variable better when a non-VA facility exists
 | 
|---|
 | 130 |  I IBPROV S IBPROV=IBPROV_";IBA(355.93,"
 | 
|---|
 | 131 |  I 'IBPROV S IBCARE=$P($G(^DGCR(399,IBXIEN,0)),U,22)
 | 
|---|
 | 132 |  I IBPROV D
 | 
|---|
 | 133 |  . S IBCARE=$S($$ISRX^IBCEF1(IBXIEN):3,1:0) ;if Rx refill bill
 | 
|---|
 | 134 |  . S:IBCARE=0 IBCARE=$$INPAT^IBCEF(IBXIEN,1) S:'IBCARE IBCARE=2 ;1-inp, 2-out
 | 
|---|
 | 135 |  F Z=1:1:3 K IBRETARR I $G(^DGCR(399,IBXIEN,"I"_Z)) D
 | 
|---|
 | 136 |  . D PRACT(+^DGCR(399,IBXIEN,"I"_Z),IBFRMTYP,IBCARE,IBPROV,.IBRETARR,0,$S(Z=IBCOBN:"C",1:"O"),$S('IBPROV:355.92,1:355.9))
 | 
|---|
 | 137 |  . K IBRET1
 | 
|---|
 | 138 |  . S Z0="" F  S Z0=$O(IBRETARR(Z0)) Q:Z0=""  S Z1="" F  S Z1=$O(IBRETARR(Z0,Z1)) Q:Z1=""  D
 | 
|---|
 | 139 |  .. ; Sort by div/id type
 | 
|---|
 | 140 |  .. S IBRET1($S(IBPROV:0,1:+$P(IBRETARR(Z0,Z1),U,6)),+$P(IBRETARR(Z0,Z1),U,9))=IBRETARR(Z0,Z1)
 | 
|---|
 | 141 |  .. Q
 | 
|---|
 | 142 |  . ;
 | 
|---|
 | 143 |  . S Z0=$O(IBRET1(""),-1) Q:Z0=""  D
 | 
|---|
 | 144 |  .. ; IB patch 320 - loop thru all ID's
 | 
|---|
 | 145 |  .. S Z1="" F  S Z1=$O(IBRET1(Z0,Z1)) Q:Z1=""  D
 | 
|---|
 | 146 |  ... I Z=IBCOBN S IBXSAVE("PROVINF_FAC",IBXIEN,"C",1,0,$O(IBXSAVE("PROVINF_FAC",IBXIEN,"C",1,0," "),-1)+1)=IBRET1(Z0,Z1) Q
 | 
|---|
 | 147 |  ... S ZZ=$S(Z=1:1,Z=2:(IBCOBN=3)+1,1:2)
 | 
|---|
 | 148 |  ... S IBXSAVE("PROVINF_FAC",IBXIEN,"O",ZZ,0,$O(IBXSAVE("PROVINF_FAC",IBXIEN,"O",ZZ,0," "),-1)+1)=IBRET1(Z0,Z1),IBXSAVE("PROVINF_FAC",IBXIEN,"O",ZZ)=$E("PST",Z)
 | 
|---|
 | 149 |  ... Q
 | 
|---|
 | 150 |  .. Q
 | 
|---|
 | 151 |  . Q
 | 
|---|
 | 152 |  ;
 | 
|---|
 | 153 |  S IBXSAVE("PROVINF_FAC",IBXIEN)=IBXIEN,IBXSAVE("PROVINF_FAC",IBXIEN,"C",1)=$E("PST",IBCOBN)
 | 
|---|
 | 154 |  Q
 | 
|---|
 | 155 |  ;
 | 
|---|
 | 156 | OTHID(IBXSAVE,IBXDATA,IBXIEN,PRIDSEQ,PRTYP,IBQ,IBFAC) ; From data in IBXSAVE,
 | 
|---|
 | 157 |  ;  determine id or qualifier to output in the 837 records OP*
 | 
|---|
 | 158 |  ; Returns IBXDATA array IBXDATA(n)=data
 | 
|---|
 | 159 |  ; IBXIEN = ien of the bill-file 399
 | 
|---|
 | 160 |  ; PRIDSEQ = sequence of the payer id needed
 | 
|---|
 | 161 |  ; PRTYP = provider type to check for data
 | 
|---|
 | 162 |  ; IBQ = 1 if qualifier needed, 0/null if id needed
 | 
|---|
 | 163 |  ; IBFAC = 1 if facility id, 0 for individual provider id
 | 
|---|
 | 164 |  ; 
 | 
|---|
 | 165 |  N Z,Z0,Z1
 | 
|---|
 | 166 |  S Z0="PROVINF"_$S('$G(IBFAC):"",1:"_FAC"),Z1=$S($G(IBQ):3,1:4)
 | 
|---|
 | 167 |  S Z=0 F  S Z=$O(IBXSAVE("OSQ",Z)) Q:'Z  D
 | 
|---|
 | 168 |  . I $P($G(IBXSAVE(Z0,IBXIEN,"O",Z,+$G(PRTYP),+$G(PRIDSEQ))),U,4)'="" S IBXDATA(IBXSAVE("OSQ",Z))=$P(IBXSAVE(Z0,IBXIEN,"O",Z,+$G(PRTYP),+$G(PRIDSEQ)),U,Z1)
 | 
|---|
 | 169 |  Q
 | 
|---|
 | 170 |  ;
 | 
|---|
 | 171 | SETSEQ(IBXIEN,IBXSAVE,IBXDATA,PRTYP,IBFAC,IBOP) ; Sets up IBXSAVE("OSQ")
 | 
|---|
 | 172 |  ;  array for other id seq in 837 records OP*
 | 
|---|
 | 173 |  ; Returns IBXDATA(n)=cob seq indicator for ids
 | 
|---|
 | 174 |  ; IBXIEN = ien of bill-399
 | 
|---|
 | 175 |  ; PRTYP = the provider type to check for data for indiv provider
 | 
|---|
 | 176 |  ; IBFAC = 1 if facility id, 0 for individual provider id
 | 
|---|
 | 177 |  ; IBOP = segement # in OP being output
 | 
|---|
 | 178 |  N C,Z,Z0,Z1,OK
 | 
|---|
 | 179 |  S C=0,Z0="PROVINF"_$S('$G(IBFAC):"",1:"_FAC")
 | 
|---|
 | 180 |  S:$G(IBFAC) PRTYP=0
 | 
|---|
 | 181 |  S Z=0 F  S Z=$O(IBXSAVE(Z0,IBXIEN,"O",Z)) Q:'Z  S OK=0 D
 | 
|---|
 | 182 |  . N Z1 F Z1=1:1 Q:'$D(IBXSAVE(Z0,IBXIEN,"O",Z,+$G(PRTYP),Z1))  I $P(IBXSAVE(Z0,IBXIEN,"O",Z,+$G(PRTYP),Z1),U,4)'="""" S OK=1 Q
 | 
|---|
 | 183 |  . I OK S C=C+1,IBXSAVE("OSQ",Z)=C
 | 
|---|
 | 184 |  S Z=0 F  S Z=$O(IBXSAVE("OSQ",Z)) Q:'Z  S IBXDATA(IBXSAVE("OSQ",Z))=$G(IBXSAVE(Z0,IBXIEN,"O",Z)) D:IBXSAVE("OSQ",Z)>1 ID^IBCEF2(IBXSAVE("OSQ",Z),"OP"_$G(IBOP)_" ")
 | 
|---|
 | 185 |  Q
 | 
|---|
 | 186 |  ;
 | 
|---|
 | 187 | PSPRV(IBIFN) ;
 | 
|---|
 | 188 |  Q $$PSPRV^IBCEF7(IBIFN) ; Moved
 | 
|---|
 | 189 |  ;
 | 
|---|