| [613] | 1 | IBCEF7 ;WOIFO/SS - FORMATTER AND EXTRACTOR SPECIFIC BILL FUNCTIONS ;8/6/03 10:56am | 
|---|
|  | 2 | ;;2.0;INTEGRATED BILLING;**232,349**;21-MAR-94;Build 46 | 
|---|
|  | 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | ALLPROV ;called from #364.5 entry "N-ALL CUR/OTH PROVIDER INFO" | 
|---|
|  | 6 | I +$G(IBXSAVE("PROVINF",IBXIEN))=0 N IBZ D PROVIDER(IBXIEN,"C",.IBZ),PROVIDER(IBXIEN,"O",.IBZ) S IBXSAVE("PROVINF",IBXIEN)=IBXIEN M IBXSAVE("PROVINF",IBXIEN)=IBZ | 
|---|
|  | 7 | Q | 
|---|
|  | 8 | ;for PRV1 | 
|---|
|  | 9 | ;Input: | 
|---|
|  | 10 | ; IB399 ien of #399 | 
|---|
|  | 11 | PRV1(IB399) ; | 
|---|
|  | 12 | N IBN,IBZ,IBZ1,IBZN,IBZD,IBRES,IBIND,IBDEF,IBDEFTYP,IBQ,IBFRMTYP,IBZNAME | 
|---|
|  | 13 | S IBFRMTYP=+$$FT^IBCEF(IB399) | 
|---|
|  | 14 | S IBN=0,IBIND=0,IBRES="",IBQ=0 | 
|---|
|  | 15 | S IBDEF=$P($G(^DGCR(399,IB399,"M1")),U,$$COBN^IBCEF(IB399)+1),IBDEFTYP="" | 
|---|
|  | 16 | I IBDEF'="" S IBDEFTYP=$$SOP^IBCEP2B(IB399,"") | 
|---|
|  | 17 | I IBDEFTYP'="",$$CHCKPRV1^IBCEF73($S(IBFRMTYP=2:2,IBFRMTYP=3:1,1:0),IBDEFTYP)=0 S (IBDEF,IBDEFTYP)="" | 
|---|
|  | 18 | I IBDEF'="",IBDEFTYP'="" S IBIND=IBIND+2,$P(IBRES,U,IBIND)=(IBDEFTYP_U_IBDEF) | 
|---|
|  | 19 | F  S IBN=$O(^IBE(355.97,IBN)) Q:+IBN=0!(IBQ=1)  D | 
|---|
|  | 20 | . S IBZ=$G(^IBE(355.97,IBN,0)),IBZ1=$G(^(1)) | 
|---|
|  | 21 | . Q:$P(IBZ,"^",4)=""!$P(IBZ1,U,9)  ;if no FACILITY'S DEFAULT ID # | 
|---|
|  | 22 | . Q:$P(IBZ1,"^",4)!(IBDEFTYP=$P(IBZ,U,3)) | 
|---|
|  | 23 | . S IBZN=$P(IBZ,"^",3),IBZNAME=$P(IBZ,"^",1) | 
|---|
|  | 24 | . I IBFRMTYP=2 Q:IBZN="1A"!(IBZNAME="MEDICARE PART A")  ;1500 | 
|---|
|  | 25 | . I IBFRMTYP=3 Q:IBZN="1B"!(IBZNAME="MEDICARE PART B")  ;UB | 
|---|
|  | 26 | . Q:$$CHCKPRV1^IBCEF73($S(IBFRMTYP=2:2,IBFRMTYP=3:1,1:0),IBZN)=0 | 
|---|
|  | 27 | . I $P(IBZ,"^",2)=0!($P(IBZ,"^",2)=2) D | 
|---|
|  | 28 | . . S IBIND=IBIND+2 | 
|---|
|  | 29 | . . I IBIND>14 S IBQ=1 Q | 
|---|
|  | 30 | . . S $P(IBRES,"^",IBIND)=IBZN_"^"_$P(IBZ,"^",4) | 
|---|
|  | 31 | ;Remove any duplicate entries | 
|---|
|  | 32 | N I,Q,QUAL,QUALC,IBRESTMP,SEQ | 
|---|
|  | 33 | F I=2:2:($L(IBRES,"^")-1) D | 
|---|
|  | 34 | . S QUAL=$P(IBRES,"^",I) | 
|---|
|  | 35 | . I $G(IBRESTMP(QUAL))="" S IBRESTMP(QUAL)=$P(IBRES,"^",(I+1)) | 
|---|
|  | 36 | S Q=2 | 
|---|
|  | 37 | S I="",QUAL="" | 
|---|
|  | 38 | K IBRES | 
|---|
|  | 39 | S IBRES="" | 
|---|
|  | 40 | S SEQ=0 | 
|---|
|  | 41 | F  S QUAL=$O(IBRESTMP(QUAL)) Q:QUAL=""  D | 
|---|
|  | 42 | . S SEQ=SEQ+2 | 
|---|
|  | 43 | . S $P(IBRES,"^",SEQ)=QUAL,$P(IBRES,"^",(SEQ+1))=IBRESTMP(QUAL) | 
|---|
|  | 44 | Q IBRES | 
|---|
|  | 45 | ; | 
|---|
|  | 46 | ; creates array of SUBSCR IDs for all "other insurances" | 
|---|
|  | 47 | ;Input : | 
|---|
|  | 48 | ; IBXIEN - ien in #399 | 
|---|
|  | 49 | ;Output: | 
|---|
|  | 50 | ; IBZOUT(Z) - array with ien of #36 | 
|---|
|  | 51 | OTHSBID(IBXIEN,IBZOUT) ; | 
|---|
|  | 52 | N Z,Z0,Z1,IBZ,C | 
|---|
|  | 53 | D F^IBCEF("N-ALL INSURANCE CO 837 ID","IBZ") | 
|---|
|  | 54 | F Z=1,2,3 S IBZ(Z)=$$POLICY^IBCEF(IBXIEN,2,$E("PST",Z)) | 
|---|
|  | 55 | K IBXDATA | 
|---|
|  | 56 | S C=$$OTHINS1^IBCEF2(IBXIEN) | 
|---|
|  | 57 | F Z=1,2 I $G(IBZ(Z))'="",$E(C,Z) D | 
|---|
|  | 58 | . S IBZOUT(Z)=IBZ(+$E(C,Z)) | 
|---|
|  | 59 | Q | 
|---|
|  | 60 | ;Input : | 
|---|
|  | 61 | ; IBXIEN - ien in #399 | 
|---|
|  | 62 | ; IBP - # piece in address string : STR LINE1|STR LINE2|CITY|STATE|ZIP | 
|---|
|  | 63 | ;Output: | 
|---|
|  | 64 | ; IBARR - output array m by reference | 
|---|
|  | 65 | ELMADD2(IBXIEN,IBP,IBARR) ; | 
|---|
|  | 66 | N IBZZZ,A,CHECK,IB1 | 
|---|
|  | 67 | I '$D(IBXSAVE("OTH_INSURED_ADDR")) D OTHADD2(IBXIEN,.IBZZZ) M IBXSAVE("OTH_INSURED_ADDR")=IBZZZ | 
|---|
|  | 68 | S IB1=0 | 
|---|
|  | 69 | F  S IB1=$O(IBXSAVE("OTH_INSURED_ADDR",IB1)) Q:'IB1  D | 
|---|
|  | 70 | . ;IF ANY PORTION OF ADDRESS IS NULL SET CHECK VALUE, ERASE ENTRY | 
|---|
|  | 71 | . S CHECK=0 | 
|---|
|  | 72 | . F A=1,3,4,5 I $P(IBXSAVE("OTH_INSURED_ADDR",IB1),"|",A)="" S CHECK=1 K IBXSAVE("OTH_INSURED_ADDR",IB1) Q | 
|---|
|  | 73 | . I 'CHECK D | 
|---|
|  | 74 | . . I IBP=0 S IBARR(IB1)=$G(IBXSAVE("OTH_INSURED_ADDR",IB1)) Q | 
|---|
|  | 75 | . . S IBARR(IB1)=$P($G(IBXSAVE("OTH_INSURED_ADDR",IB1)),"|",IBP) | 
|---|
|  | 76 | Q | 
|---|
|  | 77 | ;creates an array with address info for all other insured persons | 
|---|
|  | 78 | ;Input : | 
|---|
|  | 79 | ; IBXIEN - ien in #399 | 
|---|
|  | 80 | ;Output: | 
|---|
|  | 81 | ; IBZOUT(Z) - array with STR LINE1|STR LINE2|CITY|STATE|ZIP | 
|---|
|  | 82 | OTHADD2(IBXIEN,IBZOUT) ; | 
|---|
|  | 83 | N C,Z,Z0,Z1,IBZ,IBZIP,IB1,IBDFN1 | 
|---|
|  | 84 | S IBZOUT="" | 
|---|
|  | 85 | D OTHP36^IBCEF72(IBXIEN,.IBZ) ;array with iens of file #36 | 
|---|
|  | 86 | K IBXDATA | 
|---|
|  | 87 | S C=$$OTHINS1^IBCEF2(IBXIEN) | 
|---|
|  | 88 | F Z=1,2 I $G(IBZ(Z))'="",$E(C,Z) D | 
|---|
|  | 89 | . S IBINS=+IBZ(+$E(C,Z)) | 
|---|
|  | 90 | . S IBDFN1=$P($G(^DGCR(399,IBXIEN,0)),"^",2) | 
|---|
|  | 91 | . S IBZOUT(Z)=$$FR2PAT(IBDFN1,IBINS) | 
|---|
|  | 92 | Q | 
|---|
|  | 93 | ;Input: | 
|---|
|  | 94 | ; IBDFN-patient ien | 
|---|
|  | 95 | ; IBINS - input array with insurance pointers to 36 | 
|---|
|  | 96 | ;Output | 
|---|
|  | 97 | ; STR LINE1|STR LINE2|CITY|STATE|ZIP | 
|---|
|  | 98 | FR2PAT(IBDFN,IBINS) ;information about "other insured" address | 
|---|
|  | 99 | N Z3,Z4,Z5,IBZIP | 
|---|
|  | 100 | S Z3=$O(^DPT(IBDFN,.312,"B",$G(IBINS),0)) | 
|---|
|  | 101 | Q:+Z3=0 "||||" | 
|---|
|  | 102 | S Z4=$G(^DPT(IBDFN,.312,Z3,3)) | 
|---|
|  | 103 | S IBZIP=$P($G(^DIC(5,+$P(Z4,"^",9),0)),"^",2) | 
|---|
|  | 104 | S Z5=$P(Z4,"^",6,8)_"^"_IBZIP_"^"_$P(Z4,"^",10) | 
|---|
|  | 105 | Q $TR(Z5,"^","|") | 
|---|
|  | 106 | ; | 
|---|
|  | 107 | ;Input : | 
|---|
|  | 108 | ; IBXIEN - ien in #399 | 
|---|
|  | 109 | ; IBP - # piece in address string : STR LINE1|STR LINE2|CITY|STATE|ZIP | 
|---|
|  | 110 | ; if IBP=0 then returns whole string | 
|---|
|  | 111 | ;Output: | 
|---|
|  | 112 | ; IBARR - output array m by reference | 
|---|
|  | 113 | ELMADDR(IBXIEN,IBP,IBARR) ; | 
|---|
|  | 114 | N IB1,A,CHECK | 
|---|
|  | 115 | D:'$D(IBXSAVE("OTH_PROV_ADDR")) OTHADDR(IBXIEN) | 
|---|
|  | 116 | S IB1=0 | 
|---|
|  | 117 | F  S IB1=$O(IBXSAVE("OTH_PROV_ADDR",IB1)) Q:'IB1  D | 
|---|
|  | 118 | . S CHECK=0 | 
|---|
|  | 119 | . ;EXCLUDE ADD LINE 2 SECOND PC SINCE IT'S OK FOR THAT TO BE EMPTY | 
|---|
|  | 120 | . F A=1,3,4,5 I $P(IBXSAVE("OTH_PROV_ADDR",IB1),"|",A)="" D  Q | 
|---|
|  | 121 | . . ;IF ANY PORTION OF ADDRESS IS NULL SET CHECK VALUE, ERASE ENTRY | 
|---|
|  | 122 | . . S CHECK=1 K IBXSAVE("OTH_PROV_ADDR",IB1) | 
|---|
|  | 123 | . I 'CHECK D | 
|---|
|  | 124 | . . I IBP=0 S IBARR(IB1)=$G(IBXSAVE("OTH_PROV_ADDR",IB1)) Q | 
|---|
|  | 125 | . . S IBARR(IB1)=$P($G(IBXSAVE("OTH_PROV_ADDR",IB1)),"|",IBP) | 
|---|
|  | 126 | Q | 
|---|
|  | 127 | ; | 
|---|
|  | 128 | ;creates an array with address info for all insurances | 
|---|
|  | 129 | ;Input : | 
|---|
|  | 130 | ; IBXIEN - ien in #399 | 
|---|
|  | 131 | ;Output: | 
|---|
|  | 132 | ; IBXSAVE("OTH_PROV_ADDR",Z) | 
|---|
|  | 133 | OTHADDR(IBXIEN) ; | 
|---|
|  | 134 | N C,Z,Z0,Z1,IBZ,IBZIP,IB1,IBINS | 
|---|
|  | 135 | D F^IBCEF("N-OTH INSURANCE CO IEN 36") ;array with iens of file #36 | 
|---|
|  | 136 | M IBZ=IBXDATA | 
|---|
|  | 137 | K IBXDATA | 
|---|
|  | 138 | S C=$$OTHINS1^IBCEF2(IBXIEN) | 
|---|
|  | 139 | F Z=1,2 I $G(IBZ(Z))'="",$E(C,Z) D | 
|---|
|  | 140 | . S IBINS=+IBZ(+$E(C,Z)) | 
|---|
|  | 141 | . S IBZIP=$P($G(^DIC(5,+$P($G(^DIC(36,IBINS,.11)),"^",5),0)),"^",2) | 
|---|
|  | 142 | . S IB1=$P($G(^DIC(36,IBINS,.11)),"^",1,2)_"^"_$P($G(^DIC(36,IBINS,.11)),"^",4)_"^"_IBZIP_"^"_$P($G(^DIC(36,IBINS,.11)),"^",6) | 
|---|
|  | 143 | . S IBXSAVE("OTH_PROV_ADDR",Z)=$TR(IB1,"^","|") | 
|---|
|  | 144 | Q | 
|---|
|  | 145 | ; | 
|---|
|  | 146 | ;Retrieves pointer to get info about the service provider | 
|---|
|  | 147 | ;IBIEN399 - ien in #399 | 
|---|
|  | 148 | ;IBFUNC -function (3-RENDERING,etc) | 
|---|
|  | 149 | ;Output: VARIABLE POINTER (PTR;file_root) | 
|---|
|  | 150 | PROVPTR(IBIEN399,IBFUNC) ; | 
|---|
|  | 151 | N IBN | 
|---|
|  | 152 | S IBN=$O(^DGCR(399,IBIEN399,"PRV","B",IBFUNC,0)) | 
|---|
|  | 153 | I +IBN=0 Q 0 | 
|---|
|  | 154 | Q $P($G(^DGCR(399,IBIEN399,"PRV",+IBN,0)),"^",2) | 
|---|
|  | 155 | ; | 
|---|
|  | 156 | ;Retrieves SSN from #200 | 
|---|
|  | 157 | ;IBPTR-  VARIABLE POINTER to #200 | 
|---|
|  | 158 | PROVSSN(IBIEN399) ; | 
|---|
|  | 159 | N IBRETVAL S IBRETVAL="" | 
|---|
|  | 160 | N IBPTR,IBFT | 
|---|
|  | 161 | F IBFT=1:1:9 D | 
|---|
|  | 162 | . S IBPTR=$$PROVPTR(IBIEN399,IBFT) | 
|---|
|  | 163 | . S $P(IBRETVAL,"^",IBFT)=$$GETSSN^IBCEF72(IBPTR) | 
|---|
|  | 164 | Q IBRETVAL | 
|---|
|  | 165 | ; | 
|---|
|  | 166 | ;Input: | 
|---|
|  | 167 | ; IBPTR- ptr to ^VA(200 or ^IBA(355.93 | 
|---|
|  | 168 | ;Output: | 
|---|
|  | 169 | ; SSN or null | 
|---|
|  | 170 | GETNMEL(IBFULL,IBEL) ;Get name element | 
|---|
|  | 171 | D NAMECOMP^XLFNAME(.IBFULL) | 
|---|
|  | 172 | Q $G(IBFULL(IBEL)) | 
|---|
|  | 173 | ;- | 
|---|
|  | 174 | ;PROVIDER | 
|---|
|  | 175 | ;Input: | 
|---|
|  | 176 | ; IB399 - ien of #399 | 
|---|
|  | 177 | ; IBPROV: | 
|---|
|  | 178 | ;   "C"- to get info for CURRENT provider | 
|---|
|  | 179 | ;   "O"- to get info for all others (in this case the array will contain info fot two providers | 
|---|
|  | 180 | ; IBRES - array for results (by reference) | 
|---|
|  | 181 | ; | 
|---|
|  | 182 | ;Output: | 
|---|
|  | 183 | ; IBRES - array to get back info (by reference) | 
|---|
|  | 184 | ; IBRES(IBPROV,PRNUM,PRTYPE,SEQ#)=PROV^INSUR^IDTYPE^ID^FORMTYP^CARETYP | 
|---|
|  | 185 | ; where: | 
|---|
|  | 186 | ; IBPROV - see input parameter | 
|---|
|  | 187 | ; PRNUM: 1=primary insurance provider, 2= secondary, 3 -tretiary | 
|---|
|  | 188 | ; PRTYPE: Provider type(FUNCTION) | 
|---|
|  | 189 | ; SEQ# : sequence number (1st is used for ID1, 2nd - for ID2, etc) | 
|---|
|  | 190 | ; PROV : provider/VARIABLEPTR | 
|---|
|  | 191 | ; INSUR: Insurance PTR #36 or NONE | 
|---|
|  | 192 | ; IDTYPE: ID type | 
|---|
|  | 193 | ; ID: ID | 
|---|
|  | 194 | ; FORMTYP: Form type 1=UB,2=1500 | 
|---|
|  | 195 | ; CARETYP: Care type 0=both inp/outp,1=inpatient, 2=outpatient | 
|---|
|  | 196 | PROVIDER(IB399,IBPROV,IBRES) ; | 
|---|
|  | 197 | N IBCURR,IBZ,IBRESARR | 
|---|
|  | 198 | S IBRESARR="" | 
|---|
|  | 199 | S IBCURR=$$COB^IBCEF(IB399) ;current bill payer sequence | 
|---|
|  | 200 | Q:IBPROV="A"  ;PATIENT's bill | 
|---|
|  | 201 | I IBPROV="C" D | 
|---|
|  | 202 | . D:$$ISINSUR^IBCEF71(IBCURR,IB399) PROVINF(IB399,$S(IBCURR="T":3,IBCURR="S":2,IBCURR="P":1,1:1),.IBRESARR,1,IBPROV) | 
|---|
|  | 203 | I IBPROV="O" D | 
|---|
|  | 204 | . I IBCURR="P" D:$$ISINSUR^IBCEF71("S",IB399) PROVINF(IB399,2,.IBRESARR,1,IBPROV) D:$$ISINSUR^IBCEF71("T",IB399) PROVINF(IB399,3,.IBRESARR,2,IBPROV) | 
|---|
|  | 205 | . I IBCURR="S" D:$$ISINSUR^IBCEF71("P",IB399) PROVINF(IB399,1,.IBRESARR,1,IBPROV) D:$$ISINSUR^IBCEF71("T",IB399) PROVINF(IB399,3,.IBRESARR,2,IBPROV) | 
|---|
|  | 206 | . I IBCURR="T" D:$$ISINSUR^IBCEF71("P",IB399) PROVINF(IB399,1,.IBRESARR,1,IBPROV) D:$$ISINSUR^IBCEF71("S",IB399) PROVINF(IB399,2,.IBRESARR,2,IBPROV) | 
|---|
|  | 207 | M IBRES(IBPROV)=IBRESARR | 
|---|
|  | 208 | Q | 
|---|
|  | 209 | ; | 
|---|
|  | 210 | PROVINF(IB399,IBPRNUM,IBRES,IBSORT,IBINSTP) ; | 
|---|
|  | 211 | D PROVINF^IBCEF74(IB399,IBPRNUM,.IBRES,IBSORT,IBINSTP) | 
|---|
|  | 212 | Q | 
|---|
|  | 213 | ; | 
|---|
|  | 214 | PSPRV(IBIFN) ; Returns information for bill ien IBIFN for purchased svc | 
|---|
|  | 215 | ; Returns 4 digit data in following format: | 
|---|
|  | 216 | ;  1st digit: 0 if not outside facility | 
|---|
|  | 217 | ;             1 if outside facility | 
|---|
|  | 218 | ;  2nd digit: 0 if not non-VA provider for rendering/attending | 
|---|
|  | 219 | ;             1 if non-VA provider for rendering/attending | 
|---|
|  | 220 | ;  3rd digit: 0 if not purchased svc | 
|---|
|  | 221 | ;             1 if purchased svc | 
|---|
|  | 222 | ;  4th digit: 0 if 1500 bill | 
|---|
|  | 223 | ;             1 if UB bill | 
|---|
|  | 224 | N IBSVC,Z,Z0,IBU2 | 
|---|
|  | 225 | S IBSVC="000"_+$$INSFT^IBCEU5(IBIFN),IBU2=$G(^DGCR(399,IBIFN,"U2")) | 
|---|
|  | 226 | I $P(IBU2,U,10) S $E(IBSVC,1)=1 ; NON-VA FACILITY | 
|---|
|  | 227 | S Z=($$FT^IBCEF(IBIFN)=3)+3,Z0=+$O(^DGCR(399,IBIFN,"PRV","B",Z,0)) | 
|---|
|  | 228 | I $P($G(^DGCR(399,IBIFN,"PRV",Z0,0)),U,2)["IBA(355.93" S $E(IBSVC,2)=1 | 
|---|
|  | 229 | I $P(IBU2,U,11)>0,$P(IBU2,U,11)'>2 S $E(IBSVC,3)=1 | 
|---|
|  | 230 | PSPRVQ Q IBSVC | 
|---|
|  | 231 | ; | 
|---|
|  | 232 | CHKADD ;CHECK ALL ADDRESS ELEMENTS PRESENT IF NOT KILL ALL ADDRESS ELEMENTS | 
|---|
|  | 233 | ;EXPECT IBXSAVE("CADR") AS SOURCE ARRAY | 
|---|
|  | 234 | N Z,CHECK | 
|---|
|  | 235 | S Z="",CHECK=0 | 
|---|
|  | 236 | F Z=1,4,5,6 D | 
|---|
|  | 237 | . I $P($G(IBXSAVE("CADR")),"^",Z)="" S CHECK=1 | 
|---|
|  | 238 | I CHECK=1 S IBXSAVE("CADR")="" | 
|---|
|  | 239 | Q | 
|---|
|  | 240 | ; | 
|---|