| [623] | 1 | IBCEF ;ALB/TMP - FORMATTER SPECIFIC BILL FUNCTIONS ;22-JAN-96 | 
|---|
|  | 2 | ;;2.0;INTEGRATED BILLING;**52,80,51,137,288,296,361**;21-MAR-94;Build 9 | 
|---|
|  | 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | ;IBIFN = bill ien throughout this routine | 
|---|
|  | 6 | COB(IBIFN) ; Bill seq | 
|---|
|  | 7 | N A | 
|---|
|  | 8 | S A=$P($G(^DGCR(399,IBIFN,0)),U,21) S:A="" A="P" | 
|---|
|  | 9 | Q A | 
|---|
|  | 10 | ; | 
|---|
|  | 11 | COBN(IBIFN,A) ; Return seq # of selected payer | 
|---|
|  | 12 | ; A = 'PST' or null to get current bill payer seq # | 
|---|
|  | 13 | I $G(A)="" S A=$$COB(IBIFN) S:"PST"'[A A="P" | 
|---|
|  | 14 | I 'A S A=$F("PST",A)-1 S:A<1 A=1 | 
|---|
|  | 15 | Q A | 
|---|
|  | 16 | ; | 
|---|
|  | 17 | POLICY(IBIFN,IBPC,IBCOBN) ; Return raw data from policy info on bill | 
|---|
|  | 18 | ; IBPC  = pc # of data element in policy (optional) | 
|---|
|  | 19 | ;          if null, 0-node is returned | 
|---|
|  | 20 | ; IBCOBN = bill designation 1-3 or 'PST' (optional) | 
|---|
|  | 21 | ;          if null, default to current | 
|---|
|  | 22 | N IBI | 
|---|
|  | 23 | I "PST"[$G(IBCOBN) S IBCOBN=$$COBN(IBIFN,$G(IBCOBN)) | 
|---|
|  | 24 | S IBI=$G(^DGCR(399,IBIFN,"I"_IBCOBN)) | 
|---|
|  | 25 | I $G(IBPC) S IBI=$P(IBI,U,IBPC) | 
|---|
|  | 26 | POLICYQ Q IBI | 
|---|
|  | 27 | ; | 
|---|
|  | 28 | INSADDR(IBIFN,IBCOB) ; Return insured's address in 7 pieces: | 
|---|
|  | 29 | ; ALL STREET ADDRESSES^CITY^STATE ABBREVIATION^ZIP^STREET ADDRESS 1^ | 
|---|
|  | 30 | ;  STREET ADDRESS 2^STREET ADDRESS 3 | 
|---|
|  | 31 | ; IBIFN = bill ien | 
|---|
|  | 32 | ; IBCOB = bill designation (P)rimary, (S)econdary, (T)ertiary | 
|---|
|  | 33 | ;          or 1-2-3. If not defined or null, return current | 
|---|
|  | 34 | ; If insured is patient or spouse, take from patient file top level | 
|---|
|  | 35 | ;   fields, then if top-level street addresses are blank and policy | 
|---|
|  | 36 | ;   level fields are not, use policy level | 
|---|
|  | 37 | ; If insured is other than patient/spouse, use policy level fields only | 
|---|
|  | 38 | N A,B,IBADDR,IBI,DFN,VAPA,VATEST | 
|---|
|  | 39 | S:$G(IBCOB)="" IBCOB="" | 
|---|
|  | 40 | I 'IBCOB S IBCOB=$$COBN(IBIFN,$G(IBCOB)) | 
|---|
|  | 41 | S IBI=+$$POLICY(IBIFN,16,IBCOB) | 
|---|
|  | 42 | S DFN=+$P($G(^DGCR(399,IBIFN,0)),U,2) | 
|---|
|  | 43 | I $S('IBI:1,1:"12"'[IBI) S IBADDR="" G INSADDQ | 
|---|
|  | 44 | ; insured's address (patient/spouse) same as patient's | 
|---|
|  | 45 | S VATEST("ADD",9)=+$G(^DGCR(399,IBIFN,"U")),VATEST("ADD",10)=+$P($G(^("U")),U,2) | 
|---|
|  | 46 | D ADD^VADPT | 
|---|
|  | 47 | S IBADDR=VAPA(1)_" "_VAPA(2)_" "_VAPA(3)_U_VAPA(4)_U_$P($G(^DIC(5,+VAPA(5),0)),U,2)_U_VAPA(6)_U_VAPA(1)_U_VAPA(2)_U_VAPA(3) | 
|---|
|  | 48 | INSADDQ S A=$P($G(^DGCR(399,IBIFN,"M")),U,(11+IBCOB)) | 
|---|
|  | 49 | S A=$G(^DPT(DFN,.312,+A,3)) | 
|---|
|  | 50 | I $TR($P(IBADDR,U)," ")="" D | 
|---|
|  | 51 | .S $P(IBADDR,U)=$P(A,U,6)_" "_$P(A,U,7),$P(IBADDR,U,5,6)=$P(A,U,6,7) | 
|---|
|  | 52 | .F B=2,4 S $P(IBADDR,U,B)=$P(A,U,B+6) | 
|---|
|  | 53 | .S $P(IBADDR,U,3)=$P($G(^DIC(5,+$P(A,U,9),0)),U,2) | 
|---|
|  | 54 | Q IBADDR | 
|---|
|  | 55 | ; | 
|---|
|  | 56 | PTADDR(IBIFN,ELE) ;Return part of patient's permanent address | 
|---|
|  | 57 | ;IBIFN = bill ien | 
|---|
|  | 58 | ;ELE = subscript in ^UTILITY("VAPA", array for element needed | 
|---|
|  | 59 | ; | 
|---|
|  | 60 | I '$D(^UTILITY("VAPA",$J)) D  ; once per pt | 
|---|
|  | 61 | .N VAHOW,DFN,VAPA | 
|---|
|  | 62 | .S VAHOW=2,DFN=+$P($G(^DGCR(399,IBIFN,0)),U,2),VAPA("P")="" | 
|---|
|  | 63 | .D ADD^VADPT | 
|---|
|  | 64 | Q $P($G(^UTILITY("VAPA",$J,ELE)),U) | 
|---|
|  | 65 | ; | 
|---|
|  | 66 | PTDEM(IBIFN,ELE,PC) ;Return part of patient's demographics | 
|---|
|  | 67 | ;IBIFN = bill ien | 
|---|
|  | 68 | ;ELE = subscript in ^UTILITY("VADM" array for demographic element needed | 
|---|
|  | 69 | ;PC = pc of string at subscript ELE to be returned | 
|---|
|  | 70 | ; | 
|---|
|  | 71 | I '$G(PC) S PC=1 | 
|---|
|  | 72 | I '$D(^UTILITY("VADM",$J)) D  ; once per pt | 
|---|
|  | 73 | .N VAHOW,DFN,VADM | 
|---|
|  | 74 | .S VAHOW=2,DFN=+$P($G(^DGCR(399,IBIFN,0)),U,2) | 
|---|
|  | 75 | .D DEM^VADPT | 
|---|
|  | 76 | Q $P($G(^UTILITY("VADM",$J,ELE)),U,PC) | 
|---|
|  | 77 | ; | 
|---|
|  | 78 | PTEMPL(IBIFN,ELE,WHOSE,VAOA) ;Return part of pt's or spouse's employer info | 
|---|
|  | 79 | ;ELE = subscript in VAOA array for employer element needed | 
|---|
|  | 80 | ;WHOSE = 6 if spouse's info needed  5 if pt info needed (DEFAULT) | 
|---|
|  | 81 | ; | 
|---|
|  | 82 | N DFN | 
|---|
|  | 83 | S DFN=+$P($G(^DGCR(399,IBIFN,0)),U,2),VAOA("A")=$S($G(WHOSE):WHOSE,1:5) | 
|---|
|  | 84 | D OAD^VADPT | 
|---|
|  | 85 | Q $P($G(VAOA(ELE)),U) | 
|---|
|  | 86 | ; | 
|---|
|  | 87 | INSDEM(IBIFN,IBCOB) ; Return insured's demographics in 6 pieces: | 
|---|
|  | 88 | ; DATE OF BIRTH^SEX^PHONE^BRANCH pointer^RANK^SSN(no dashes) | 
|---|
|  | 89 | ; IBIFN = bill ien | 
|---|
|  | 90 | ; IBCOB = bill designation (P)rimary (default), (S)econdary, (T)ertiary | 
|---|
|  | 91 | ;          or 1,2,3 ... if not defined or null, return current | 
|---|
|  | 92 | ; If insured is patient/spouse, take from patient file top level | 
|---|
|  | 93 | ;   fields, then if top-level are blank and policy level aren't, | 
|---|
|  | 94 | ;   use policy level | 
|---|
|  | 95 | ; If insured other than patient/spouse, use policy level fields only | 
|---|
|  | 96 | N A,B,IBDEM,IBI,DFN,VADM | 
|---|
|  | 97 | S:$G(IBCOB)="" IBCOB="" | 
|---|
|  | 98 | S:'IBCOB IBCOB=$$COBN(IBIFN,IBCOB) | 
|---|
|  | 99 | S IBI=$$WHOSINS(IBIFN,IBCOB) | 
|---|
|  | 100 | S DFN=+$P($G(^DGCR(399,IBIFN,0)),U,2) | 
|---|
|  | 101 | I $S('IBI:1,1:"12"'[IBI) S IBDEM="" G INSDEM1 | 
|---|
|  | 102 | ; If it gets here, assume insured is patient/spouse | 
|---|
|  | 103 | S A=$$PTDEM(IBIFN,0),A=$$PTADDR(IBIFN,0) | 
|---|
|  | 104 | F A=2,3,5 S VADM(A)=$P($G(^UTILITY("VADM",$J,A)),U) | 
|---|
|  | 105 | S VAPA(8)=$P($G(^UTILITY("VAPA",$J,8)),U) | 
|---|
|  | 106 | I VADM(5)="",'VADM(3),VAPA(8)="" S IBDEM="" G INSDEM1 | 
|---|
|  | 107 | S $P(IBDEM,U,3)=VAPA(8),$P(IBDEM,U,6)=VADM(2) | 
|---|
|  | 108 | I IBI=1,VADM(3) S $P(IBDEM,U)=VADM(3) ;Patient's own policy only | 
|---|
|  | 109 | INSDEM1 S A=$P($G(^DGCR(399,IBIFN,"M")),U,(11+IBCOB)) | 
|---|
|  | 110 | S A=$G(^DPT(DFN,.312,+A,3)) | 
|---|
|  | 111 | S:"MF"'[$G(VADM(5)) VADM(5)="" | 
|---|
|  | 112 | S $P(IBDEM,U,2)=$S(IBI=1:VADM(5),1:$P(A,U,12)) | 
|---|
|  | 113 | S $P(IBDEM,U,4,5)=$P(A,U,2)_U_$P(A,U,3) | 
|---|
|  | 114 | S:'$P(IBDEM,U) $P(IBDEM,U)=$P(A,U) | 
|---|
|  | 115 | S:$P(IBDEM,U,3)="" $P(IBDEM,U,3)=$P(A,U,11) | 
|---|
|  | 116 | S:$P(IBDEM,U,6)="" $P(IBDEM,U,6)=$P(A,U,5) | 
|---|
|  | 117 | Q IBDEM | 
|---|
|  | 118 | ; | 
|---|
|  | 119 | INSEMPL(IBIFN,IBCOB) ; Return insured's employer data in 5 pieces: | 
|---|
|  | 120 | ; EMPLOYER NAME^EMPLOYER CITY^EMPLOYER STATE ABBREVIATION^STATE IEN^STREET 1 | 
|---|
|  | 121 | ; IBCOB = bill designation (P)rimary-default, (S)econdary, (T)ertiary | 
|---|
|  | 122 | ;            or 123 - if not defined or null, return current | 
|---|
|  | 123 | N A,IBEMPL,IBI,DFN,VAOA | 
|---|
|  | 124 | S IBI=$$WHOSINS(IBIFN,$G(IBCOB)) | 
|---|
|  | 125 | I $S('IBI:1,1:"12"'[IBI) S IBEMPL="^^" G INSEMPQ | 
|---|
|  | 126 | ; insured = pt/spouse | 
|---|
|  | 127 | S DFN=+$P($G(^DGCR(399,IBIFN,0)),U,2) | 
|---|
|  | 128 | S A=$$PTEMPL(IBIFN,0,IBI+4,.VAOA) | 
|---|
|  | 129 | S IBEMPL=VAOA(9)_U_VAOA(4)_U_$P($G(^DIC(5,+VAOA(5),0)),U,2)_U_+VAOA(5)_U_VAOA(1) | 
|---|
|  | 130 | INSEMPQ Q IBEMPL | 
|---|
|  | 131 | ; | 
|---|
|  | 132 | WHOSINS(IBIFN,IBCOB) ; Determine who is insured for bill IBIFN and | 
|---|
|  | 133 | ; seq of coverage COB (123 or PST) or if not defined or null, current | 
|---|
|  | 134 | N Z,Z0,VAEL,DFN | 
|---|
|  | 135 | S Z=+$$POLICY(IBIFN,16,$G(IBCOB)) | 
|---|
|  | 136 | I 'Z D | 
|---|
|  | 137 | .S Z0=$$POLICY(IBIFN,6,$G(IBCOB)),DFN=$P($G(^DGCR(399,IBIFN,0)),U,2) | 
|---|
|  | 138 | .I Z0="v" D ELIG^VADPT I VAEL(4) S Z=1 Q  ;vet is pt | 
|---|
|  | 139 | .I Z0="s" D ELIG^VADPT I VAEL(4) S Z=2 Q  ;vet is pt, so vets spouse is pt's spouse | 
|---|
|  | 140 | .S Z=9 ; relationship of insured to pt unknown | 
|---|
|  | 141 | Q Z | 
|---|
|  | 142 | ; | 
|---|
|  | 143 | EMPSTAT(IBIFN,WHOSE) ;Return employment status | 
|---|
|  | 144 | ; IBIFN = bill ien | 
|---|
|  | 145 | ; WHOSE = v for vet, s for spouse status | 
|---|
|  | 146 | N STAT,DFN,VAPD | 
|---|
|  | 147 | S STAT="",DFN=+$P($G(^DGCR(399,IBIFN,0)),U,2) | 
|---|
|  | 148 | I WHOSE="v" D OPD^VADPT S STAT=$P(VAPD(7),U) | 
|---|
|  | 149 | I WHOSE="s" S STAT=$P($G(^DPT(DFN,.25)),U,15) | 
|---|
|  | 150 | I STAT="" S STAT=9 | 
|---|
|  | 151 | Q STAT | 
|---|
|  | 152 | ; | 
|---|
|  | 153 | INPAT(IBIFN,OUT) ; Determine if bill is inpatient | 
|---|
|  | 154 | ; OUT = optional - if 1, return output value based on | 
|---|
|  | 155 | ;  inpatient/outpatient from UB-04 type of bill field | 
|---|
|  | 156 | ; Return 1 if inpatient, 0 if not inpatient or can't be determined | 
|---|
|  | 157 | N INPT,CODE,CODE0,IB0 | 
|---|
|  | 158 | S IB0=$G(^DGCR(399,IBIFN,0)) | 
|---|
|  | 159 | S OUT=+$G(OUT),CODE=+$P(IB0,U,5) | 
|---|
|  | 160 | I 'OUT S INPT=CODE | 
|---|
|  | 161 | I OUT D | 
|---|
|  | 162 | . S CODE0=$P($G(^DGCR(399.1,+$P(IB0,U,25),0)),U,2) | 
|---|
|  | 163 | . I CODE0=8,$P(IB0,U,24)=1 S INPT=$P(IB0,U,5) Q  ; 18X | 
|---|
|  | 164 | . I CODE0=9,$P(IB0,U,24)=8 S INPT=$P(IB0,U,5) Q  ; 89X | 
|---|
|  | 165 | . I CODE0=1,$P(IB0,U,24)=8 S INPT=0 Q  ; 81X | 
|---|
|  | 166 | . I CODE0=1,$P(IB0,U,24)=7 S INPT=0 Q  ; 71X | 
|---|
|  | 167 | . I CODE0=2,$P(IB0,U,24)=7 S INPT=0 Q  ; 72X | 
|---|
|  | 168 | . S INPT=CODE0 | 
|---|
|  | 169 | Q $S(INPT:INPT'>2,1:0) | 
|---|
|  | 170 | ; | 
|---|
|  | 171 | INSPRF(IBIFN) ; Function to determine if bill is prof or inst | 
|---|
|  | 172 | ; Return 1 if institutional (UB-04) claim, 0 if professional (CMS-1500) claim | 
|---|
|  | 173 | N A | 
|---|
|  | 174 | S A=$G(^DGCR(399,IBIFN,0)) | 
|---|
|  | 175 | I $P(A,U,27)="" S $P(A,U,27)=$S($P(A,U,19)=3:1,1:0) | 
|---|
|  | 176 | Q $S($P(A,U,27)=1:1,1:0) | 
|---|
|  | 177 | ; | 
|---|
|  | 178 | F(FLD,IBXRET,IBXERR1,IBIEN) ;Execute extract for data element FLD and bill IBIEN | 
|---|
|  | 179 | ; If IBXDATA array to be returned as data value(s) of fld | 
|---|
|  | 180 | ;   D F^IBCEF("FLD NAME","IBXDATA","IBXERR") or D F^IBCEF("FLD NAME") | 
|---|
|  | 181 | ; Variable ref-ed by IBXERR1 will contain error message if an error | 
|---|
|  | 182 | ; @IBXRET always defined on return.  It will be null if error | 
|---|
|  | 183 | I $G(IBIEN) N IBXIEN S IBXIEN=IBIEN | 
|---|
|  | 184 | I $G(IBXERR1)="" S IBXERR1="IBXERR" | 
|---|
|  | 185 | N IBXHOLD | 
|---|
|  | 186 | S IBXHOLD="" | 
|---|
|  | 187 | I $G(IBXRET)=""!($G(IBXRET)="IBXDATA") S IBXHOLD="IBXDATA",IBXRET="IBXRET" | 
|---|
|  | 188 | S @IBXERR1="" | 
|---|
|  | 189 | ; | 
|---|
|  | 190 | N FLDN,OFLD,STOP,Z,IBXERR2,IBXRETX | 
|---|
|  | 191 | ; | 
|---|
|  | 192 | I '$G(IBXIEN) S @IBXERR1="Invalid entry #" G FQ | 
|---|
|  | 193 | I '$D(^IBA(364.5,"B",FLD)) S OFLD=FLD,STOP=0 D  I FLD="" S @IBXERR1=OFLD_" Field not found!!" G FQ | 
|---|
|  | 194 | .F  S FLD=$O(^IBA(364.5,"B",FLD))  D  Q:STOP | 
|---|
|  | 195 | ..I $E(FLD,1,$L(OFLD))'=OFLD S FLD="" | 
|---|
|  | 196 | ..S STOP=1 | 
|---|
|  | 197 | ; | 
|---|
|  | 198 | S Z=0 | 
|---|
|  | 199 | F  S Z=$O(^IBA(364.5,"B",FLD,Z)) Q:'Z  I $P($G(^IBA(364.5,Z,0)),U,5)=399 Q | 
|---|
|  | 200 | I 'Z S @IBXERR1=FLD_" Field not found!!" G FQ | 
|---|
|  | 201 | ; | 
|---|
|  | 202 | S FLDN(1)=Z D EXTONE^IBCEFG0(IBXIEN,.FLDN,""_IBXRET_"",.IBXERR2) | 
|---|
|  | 203 | ; | 
|---|
|  | 204 | I $G(IBXERR2)'="" S @IBXERR1=IBXERR2 | 
|---|
|  | 205 | FQ S IBXARRY=$S(IBXHOLD="IBXDATA":"IBXDATA",1:""_IBXRET_"") | 
|---|
|  | 206 | I @IBXERR1'="" K @IBXARRY S @IBXARRY="" Q | 
|---|
|  | 207 | ; | 
|---|
|  | 208 | I IBXHOLD="IBXDATA" S IBXRET="IBXRET" | 
|---|
|  | 209 | M IBXRETX=@IBXRET K @IBXARRY M @IBXARRY=IBXRETX(1) | 
|---|
|  | 210 | S:'($D(@IBXARRY)#2) @IBXARRY="" | 
|---|
|  | 211 | Q | 
|---|
|  | 212 | ; | 
|---|
|  | 213 | SERVDT(IBIFN,LENGTH,FORMAT) ; Return default service date for | 
|---|
|  | 214 | ; outpatient/UB-04 lines or X12-837 institutional lines | 
|---|
|  | 215 | ; LENGTH = null/8 for 8 digit date, 6 for 6 digit date | 
|---|
|  | 216 | ; FORMAT = 1 = X12 format (YYYYMMDD), 2 = FM internal (NNNNNNN), | 
|---|
|  | 217 | ;          0 = external (MMDDYY or MMDDYYYY) | 
|---|
|  | 218 | N IBZ | 
|---|
|  | 219 | G:$$INPAT^IBCEF(IBIFN,1)!($$FT^IBCEF(IBIFN)'=3) SERVDTQ ;Inpatient claim or billed on a CMS-1500 | 
|---|
|  | 220 | S LENGTH=$G(LENGTH),FORMAT=$G(FORMAT) | 
|---|
|  | 221 | D F("N-STATEMENT COVERS FROM DATE","IBZ",,IBIFN) | 
|---|
|  | 222 | I '$G(IBZ)!(FORMAT=2) G SERVDTQ | 
|---|
|  | 223 | ; | 
|---|
|  | 224 | I FORMAT=1 S IBZ=$$DT^IBCEFG1(IBZ,"",$S(LENGTH'=6:"D8",1:"D6")) G SERVDTQ | 
|---|
|  | 225 | S IBZ=$$DATE^IBCF2(IBZ,$S(LENGTH=6:0,1:1),1) | 
|---|
|  | 226 | ; | 
|---|
|  | 227 | SERVDTQ Q $G(IBZ) | 
|---|
|  | 228 | ; | 
|---|
|  | 229 | NOPUNCT(X,SPACE,EXC) ; Strip punctuation from data in X | 
|---|
|  | 230 | ; SPACE = flag if 1 strip SPACES | 
|---|
|  | 231 | ; EXC = list of punctuation not to strip | 
|---|
|  | 232 | ; | 
|---|
|  | 233 | N PUNCT,Z | 
|---|
|  | 234 | S PUNCT=".,-+(){}[]\/><:;?|=_*&%$#@!~`^'""" | 
|---|
|  | 235 | I $G(SPACE) S PUNCT=PUNCT_" " | 
|---|
|  | 236 | I $G(EXC)'="" F Z=1:1:$L(EXC) S PUNCT=$TR(PUNCT,$E(EXC,Z)) | 
|---|
|  | 237 | S X=$TR(X,PUNCT) | 
|---|
|  | 238 | Q X | 
|---|
|  | 239 | ; | 
|---|
|  | 240 | FT(IBIFN) ; Internal code for bill form type | 
|---|
|  | 241 | Q +$P($G(^DGCR(399,IBIFN,0)),U,19) | 
|---|
|  | 242 | ; | 
|---|
|  | 243 | COBCT(IBIFN) ; # of payers on claim | 
|---|
|  | 244 | N CT,Z | 
|---|
|  | 245 | S CT=0 F Z="I1","I2","I3" Q:'$D(^DGCR(399,IBIFN,Z))  S CT=CT+1 | 
|---|
|  | 246 | Q CT | 
|---|
|  | 247 | ; | 
|---|