| 1 | IBCEP2A ;ALB/TMP - EDI UTILITIES for provider ID ;25-APR-01 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**137,232,320,348,349**;21-MAR-94;Build 46 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ALT(IBPERF,IBSRC,IBALT,IBINS4,IBPTYP) ; set source level to next higher level | 
|---|
| 6 | ; or set the alternate type and source if performing provider id | 
|---|
| 7 | ; alternate type and source exist | 
|---|
| 8 | ; IBPERF = 1 if performing provider id is requested | 
|---|
| 9 | ; IBINS4 = '4' node of insurance co (file 36) | 
|---|
| 10 | ; Pass IBPTYP by reference to get alternate provider id type | 
|---|
| 11 | ; Pass IBALT by reference.  Set to 1 if alternate id is to be used next | 
|---|
| 12 | ; | 
|---|
| 13 | I '$G(IBPERF)!($P(IBINS4,U,3)=1) S IBSRC=IBSRC-1 G ALTQ | 
|---|
| 14 | S IBSRC="" | 
|---|
| 15 | I '$G(IBALT),$P(IBINS4,U,3)=2,$P(IBINS4,U,10),$P(IBINS4,U,11) S IBALT=1,IBSRC=$P(IBINS4,U,11),IBPTYP=$P(IBINS4,U,10) S:IBPTYP="" IBPTYP=$P(IBINS4,U) | 
|---|
| 16 | ; | 
|---|
| 17 | ALTQ Q IBSRC | 
|---|
| 18 | ; | 
|---|
| 19 | IDSET(IBPTYP,IBINS4,IBPERF,IBSPEC,IBSRC,IBUP) ; set variables for provider id type search | 
|---|
| 20 | N Z | 
|---|
| 21 | S IBSPEC=$G(^IBE(355.97,+IBPTYP,1)) | 
|---|
| 22 | S Z=$S($G(IBPERF):2,$P(IBSPEC,U,5):6,$P(IBSPEC,U,6):4,1:2) | 
|---|
| 23 | S IBSRC=$P(IBINS4,U,Z),IBUP=$P(IBINS4,U,$S(IBSRC:Z+1,1:0)) | 
|---|
| 24 | Q | 
|---|
| 25 | ; | 
|---|
| 26 | CAREST(IBIFN) ; Return state file ien of state where care was performed | 
|---|
| 27 | ; IBIFN = ien of bill in file 399 | 
|---|
| 28 | ; Get it from rendering facility or if none, the billing facility | 
|---|
| 29 | N Z,IBXDATA,STATE | 
|---|
| 30 | S STATE="" | 
|---|
| 31 | D F^IBCEF("N-RENDERING INSTITUTION",,,IBIFN) | 
|---|
| 32 | I IBXDATA D | 
|---|
| 33 | . I '$P(IBXDATA,U,2) S STATE=+$P($G(^DIC(4,+IBXDATA,0)),U,2) Q | 
|---|
| 34 | . S STATE=+$P($G(^IBA(355.93,+IBXDATA,0)),U,7) | 
|---|
| 35 | E  D | 
|---|
| 36 | . D F^IBCEF("N-AGENT CASHIER STATE",,,IBIFN) | 
|---|
| 37 | . S STATE=IBXDATA | 
|---|
| 38 | Q STATE | 
|---|
| 39 | ; | 
|---|
| 40 | RECALCA(IBIFN) ; Recalculate all performing provider id's on bill IBIFN | 
|---|
| 41 | ; IBIFN = ien of bill entry (file 399) | 
|---|
| 42 | N IBZ,IBZ0,IBX,IBP,IBSEQ,DA,DIE,DR,DIR,X,Y | 
|---|
| 43 | ; | 
|---|
| 44 | D EN^DDIOL("THIS FUNCTION HAS BEEN DISABLED",,"!") Q | 
|---|
| 45 | ; | 
|---|
| 46 | S DA(1)=IBIFN | 
|---|
| 47 | I '$D(^XUSEC("IB SUPERVISOR",DUZ)) D EN^DDIOL("YOU ARE NOT AUTHORIZED TO PERFORM THIS FUNCTION",,"!") | 
|---|
| 48 | S IBZ=0 F  S IBZ=$O(^DGCR(399,IBIFN,"PRV",IBZ)) Q:'IBZ  S IBP=$G(^(IBZ,0)) I $P(IBP,U,2)'="" D | 
|---|
| 49 | . S DA=IBZ | 
|---|
| 50 | . F IBZ0=5:1:7 Q:'$G(^DGCR(399,IBIFN,"I"_(IBZ0-4)))  D | 
|---|
| 51 | .. S IBSEQ=$$EXPAND^IBTRE(399.0222,.01,+IBP)_" "_$P("PRIMARY^SECONDARY^TERTIARY",U,IBZ0-4)_" PROVIDER ID " | 
|---|
| 52 | .. S IBX=$$RECALC(.DA,IBZ0-4,$P(IBP,U,IBZ0),1) | 
|---|
| 53 | .. I IBX'="",IBX=$P(IBP,U,IBZ0) D EN^DDIOL(IBSEQ_"NO CHANGE NEEDED",,"!") Q | 
|---|
| 54 | .. I IBX'="",IBX'=$P(IBP,U,IBZ0) D  Q | 
|---|
| 55 | ... S DR=(IBZ0/100)_"////"_IBX,DIE="^DGCR(399,"_DA(1)_",""PRV""," D ^DIE | 
|---|
| 56 | ... D EN^DDIOL(IBSEQ_"CHANGED TO "_IBX,,"!") | 
|---|
| 57 | .. D EN^DDIOL(IBSEQ_"NOT FOUND",,"!") | 
|---|
| 58 | Q | 
|---|
| 59 | ; | 
|---|
| 60 | RECALC(IBDA,IBSEQ,IBX,IBD) ; Recalculate id #, if possible - called | 
|---|
| 61 | ;   from input transforms in subfile 399.0222, fields .05-.07 | 
|---|
| 62 | ; IBDA = DA array of the provider entry (file 399.0222) | 
|---|
| 63 | ; IBSEQ = the numeric COB sequence of the provider id (1-3) | 
|---|
| 64 | ; IBX = the current value of the id in the subfile | 
|---|
| 65 | ; IBD = flag that if set to 1 will suppress the display text | 
|---|
| 66 | ; | 
|---|
| 67 | N IBPN,IBZ | 
|---|
| 68 | S IBPN=$P($G(^DGCR(399,IBDA(1),"PRV",IBDA,0)),U,2) | 
|---|
| 69 | I IBPN="" D:'$G(IBD) EN^DDIOL("   CAN'T CALCULATE WITHOUT A PROVIDER NAME","","?0") G RECALCQ | 
|---|
| 70 | S IBZ=$$GETID^IBCEP2(IBDA(1),2,IBPN,IBSEQ) | 
|---|
| 71 | I IBZ="" D:'$G(IBD) EN^DDIOL("   ID COULD NOT BE DETERMINED","","?0") G RECALCQ | 
|---|
| 72 | D:'$G(IBD) EN^DDIOL("  "_IBZ_$S(IBZ'=IBX:"",1:" (no change)"),"","?0") | 
|---|
| 73 | S IBX=IBZ | 
|---|
| 74 | ; | 
|---|
| 75 | RECALCQ Q IBX | 
|---|
| 76 | ; | 
|---|
| 77 | PERFPRV(IBIFN) ; Returns the variable pointer of the 'performing provider' | 
|---|
| 78 | ; (attending or rendering) for a bill IBIFN | 
|---|
| 79 | N IBP,IBPT,IBQ,Z | 
|---|
| 80 | S Z=$$FT^IBCEF(IBIFN),IBPT=$S(Z=2:3,Z=3:4,1:0) | 
|---|
| 81 | D GETPRV^IBCEU(IBIFN,IBPT,.IBP) | 
|---|
| 82 | Q $P($G(IBP(IBPT,1)),U,3) | 
|---|
| 83 | ; | 
|---|
| 84 | INSPAR(IBIFN,SEQ) ; | 
|---|
| 85 | N Z,Z4,Z0 | 
|---|
| 86 | Q:$G(X)'="??" | 
|---|
| 87 | S:'$G(SEQ) SEQ=$$COBN^IBCEF(IBIFN) | 
|---|
| 88 | S Z=+$G(^DGCR(399,IBIFN,"I"_SEQ)),Z4=$G(^DIC(36,Z,4)) | 
|---|
| 89 | I Z D | 
|---|
| 90 | . D EN^DDIOL(">"_$J("",20)_"-- PERFORMING PROVIDER ID PARAMETERS --",,"!") | 
|---|
| 91 | . S Z0=$P("  PRIMARY^SECONDARY^ TERTIARY",U,SEQ)_" INSURANCE: "_$P($G(^DIC(36,Z,0)),U) | 
|---|
| 92 | . D EN^DDIOL(">"_$J("",(80-$L(Z0))\2)_Z0,,"!") | 
|---|
| 93 | . D EN^DDIOL(">  Secondary Perf Prov ID Type (1500): "_$$EXPAND^IBTRE(36,4.01,+Z4),,"!") | 
|---|
| 94 | . D EN^DDIOL(">  Secondary Perf Prov ID Type (UB04): "_$$EXPAND^IBTRE(36,4.02,$P(Z4,U,2)),,"!") | 
|---|
| 95 | . D EN^DDIOL(">    Secondary Perf Prov IDs Required: "_$$EXPAND^IBTRE(36,4.03,$P(Z4,U,3)),,"!") | 
|---|
| 96 | . D EN^DDIOL(" ",,"!") | 
|---|
| 97 | Q | 
|---|
| 98 | ; | 
|---|
| 99 | GETTYP(IBXIEN,IBCOBN,IBFUNC) ; Function returns provider id type for insurance co | 
|---|
| 100 | ; with COB of IBCOBN on claim ien IBXIEN in first ^ pc and 1 in second | 
|---|
| 101 | ; ^ piece if the id is required | 
|---|
| 102 | ; | 
|---|
| 103 | ; IBFUNC=1:REFERRING;2:OPERATING;3:RENDERING;4:ATTENDING;5:SUPERVISING;9:OTHER | 
|---|
| 104 | ; | 
|---|
| 105 | N A,R,Z,Z0 | 
|---|
| 106 | S A="",R=0 | 
|---|
| 107 | S:'$G(IBCOBN)!(IBCOBN>3) IBCOBN=$$COBN^IBCEF(IBXIEN) | 
|---|
| 108 | S Z=+$G(^DGCR(399,IBXIEN,"I"_+IBCOBN)) | 
|---|
| 109 | I Z D | 
|---|
| 110 | . S Z0=$$FT^IBCEF(IBXIEN) | 
|---|
| 111 | . S A=+$P($G(^DIC(36,Z,4)),U,$S(Z0=2&($G(IBFUNC)=1):4,Z0=2:1,1:2)) | 
|---|
| 112 | . I A,$G(IBFUNC)'=1 S R=$P($G(^DIC(36,Z,4)),U,3),R=$S('R:0,R=3:1,R=1:Z0=2,R=2:Z0=3,1:0) | 
|---|
| 113 | . I A,$G(IBFUNC)=1 S R=+$P($G(^DIC(36,Z,4)),U,5),R=$S('R:0,Z0'=2:0,1:1) | 
|---|
| 114 | Q A_U_R | 
|---|
| 115 | ; | 
|---|
| 116 | UNIQ1(IBIFN,IBINS,IBPTYP,IBPROV,IBUNIT,IBCU,IBT) ; Match most-least specific | 
|---|
| 117 | ; *** SEE PARAMETER DEFINITIONS IN IBCEP3 *** | 
|---|
| 118 | ; | 
|---|
| 119 | ; Start in file 355.9 (Specific Provider) | 
|---|
| 120 | ;   IBPROV = (variable pointer syntax) provider on bill IBIFN | 
|---|
| 121 | ; | 
|---|
| 122 | N Q,Z0,Z1,Z2,IBID,IBX | 
|---|
| 123 | S IBID="" | 
|---|
| 124 | S IBX=$P($G(^IBA(355.9,+IBCU,0)),U,3) S:"0"[IBX IBX="*N/A*" | 
|---|
| 125 | S Z0=$$FT^IBCEF(IBIFN),Z0=$S(Z0=2:2,Z0=3:1,1:0),Z1=$$INPAT^IBCEF(IBIFN,1) S:'Z1 Z1=2 S Z2=$$ISRX^IBCEF1(IBIFN) | 
|---|
| 126 | ; | 
|---|
| 127 | ; Match all elements | 
|---|
| 128 | F Q=$S(Z2:3,1:Z1),$S(Z2:Z1,1:"") I Q'="",$D(^IBA(355.9,"AUNIQ",IBPROV,IBINS,IBX,Z0,Q,IBPTYP,IBCU)) S IBID=$P($G(^IBA(355.9,IBCU,0)),U,7),$P(IBT,U,2,3)=(IBCU_U_355.9) Q | 
|---|
| 129 | G:IBID'="" UNIQ1Q | 
|---|
| 130 | ; | 
|---|
| 131 | ; Match both form types,specific I/O element | 
|---|
| 132 | F Q=$S(Z2:3,1:Z1),$S(Z2:Z1,1:"") I Q'="",$D(^IBA(355.9,"AUNIQ",IBPROV,IBINS,IBX,0,Q,IBPTYP,IBCU)) S IBID=$P($G(^IBA(355.9,IBCU,0)),U,7),$P(IBT,U,2,3)=(IBCU_U_355.9) Q | 
|---|
| 133 | G:IBID'="" UNIQ1Q | 
|---|
| 134 | ; | 
|---|
| 135 | ; Match specific form type, both I/O element or Rx | 
|---|
| 136 | F Q=$S(Z2:3,1:0),$S(Z2:0,1:"") I Q'="",$D(^IBA(355.9,"AUNIQ",IBPROV,IBINS,IBX,Z0,Q,IBPTYP,IBCU)) S IBID=$P($G(^IBA(355.9,IBCU,0)),U,7),$P(IBT,U,2,3)=(IBCU_U_355.9) Q | 
|---|
| 137 | G:IBID'="" UNIQ1Q | 
|---|
| 138 | ; | 
|---|
| 139 | ; Match both form types, both I/O element or Rx | 
|---|
| 140 | F Q=$S(Z2:3,1:0),$S(Z2:0,1:"") I Q'="",$D(^IBA(355.9,"AUNIQ",IBPROV,IBINS,IBX,0,Q,IBPTYP,IBCU)) S IBID=$P($G(^IBA(355.9,IBCU,0)),U,7),$P(IBT,U,2,3)=(IBCU_U_355.9) Q | 
|---|
| 141 | ; | 
|---|
| 142 | UNIQ1Q Q IBID | 
|---|
| 143 | ; | 
|---|
| 144 | UNIQ2(IBIFN,IBINS,IBPTYP,IBUNIT,IBCU,IBT) ; Match on most-least specific | 
|---|
| 145 | ; *** SEE PARAMETER DEFINITIONS IN IBCEP3 *** | 
|---|
| 146 | ; | 
|---|
| 147 | ; Start in file 355.91 (Specific Insurance) | 
|---|
| 148 | ; | 
|---|
| 149 | N Q,Z0,Z1,Z2,IBID,IBX | 
|---|
| 150 | S IBID="" S:"0"[$G(IBUNIT) IBUNIT="*N/A*" | 
|---|
| 151 | S Z0=$$FT^IBCEF(IBIFN),Z0=$S(Z0=2:2,Z0=3:1,1:0),Z1=$$INPAT^IBCEF(IBIFN,1) S:'Z1 Z1=2 S Z2=$$ISRX^IBCEF1(IBIFN) | 
|---|
| 152 | ; | 
|---|
| 153 | ; Match all elements | 
|---|
| 154 | F Q=$S(Z2:3,1:Z1),$S(Z2:Z1,1:"") I Q'="",$D(^IBA(355.91,"AUNIQ",IBINS,IBUNIT,Z0,Q,IBPTYP,IBCU)) S IBID=$P($G(^IBA(355.91,IBCU,0)),U,7),$P(IBT,U,2,3)=(IBCU_U_355.91) Q | 
|---|
| 155 | G:IBID'="" UNIQ2Q | 
|---|
| 156 | ; | 
|---|
| 157 | ; Match both form types,specific I/O element | 
|---|
| 158 | F Q=$S(Z2:3,1:Z1),$S(Z2:Z1,1:"") I Q'="",$D(^IBA(355.91,"AUNIQ",IBINS,IBUNIT,0,Q,IBPTYP,IBCU)) S IBID=$P($G(^IBA(355.91,IBCU,0)),U,7),$P(IBT,U,2,3)=(IBCU_U_355.91) Q | 
|---|
| 159 | G:IBID'="" UNIQ2Q | 
|---|
| 160 | ; | 
|---|
| 161 | ; Match specific form type, both I/O element or Rx | 
|---|
| 162 | F Q=$S(Z2:3,1:0),$S(Z2:0,1:"") I Q'="",$D(^IBA(355.91,"AUNIQ",IBINS,IBUNIT,Z0,Q,IBPTYP,IBCU)) S IBID=$P($G(^IBA(355.91,IBCU,0)),U,7),$P(IBT,U,2,3)=(IBCU_U_355.91) Q | 
|---|
| 163 | G:IBID'="" UNIQ2Q | 
|---|
| 164 | ; | 
|---|
| 165 | ; Match both form types, both I/O elements or Rx | 
|---|
| 166 | F Q=$S(Z2:3,1:0),$S(Z2:0,1:"") I Q'="",$D(^IBA(355.91,"AUNIQ",IBINS,IBUNIT,0,Q,IBPTYP,IBCU)) S IBID=$P($G(^IBA(355.91,IBCU,0)),U,7),$P(IBT,U,2,3)=(IBCU_U_355.91) Q | 
|---|
| 167 | ; | 
|---|
| 168 | UNIQ2Q Q IBID | 
|---|
| 169 | ; | 
|---|