[623] | 1 | IBCNS1 ;ALB/AAS - INSURANCE MANAGEMENT SUPPORTED FUNCTIONS ;22-JULY-91
|
---|
| 2 | ;;2.0;INTEGRATED BILLING;**28,60,52,85,107,51,137,240**;21-MAR-94
|
---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
| 4 | ;
|
---|
| 5 | INSURED(DFN,IBINDT) ; -- Is patient insured
|
---|
| 6 | ; --Input DFN = patient
|
---|
| 7 | ; IBINDT = (optional) date insured (default = today)
|
---|
| 8 | ; -- Output = 0 - not insured
|
---|
| 9 | ; = 1 - insured
|
---|
| 10 | ;
|
---|
| 11 | N J,X,IBINS S IBINS=0,J=0
|
---|
| 12 | I '$G(DFN) G INSQ
|
---|
| 13 | I '$G(IBINDT) S IBINDT=DT
|
---|
| 14 | F S J=$O(^DPT(DFN,.312,J)) Q:'J S X=$G(^(J,0)) S IBINS=$$CHK(X,IBINDT) Q:IBINS
|
---|
| 15 | INSQ Q IBINS
|
---|
| 16 | ;
|
---|
| 17 | PRE(DFN,IBINDT) ; -- is pre-certification required for patient
|
---|
| 18 | N X,Y,J,IBPRE
|
---|
| 19 | S IBPRE=0,J=0
|
---|
| 20 | S:'$G(IBINDT) IBINDT=DT
|
---|
| 21 | F S J=$O(^DPT(DFN,.312,J)) Q:'J S X=$G(^(J,0)) I $$CHK(X,IBINDT),$P($G(^IBA(355.3,+$P(X,"^",18),0)),"^",6) S IBPRE=1 Q
|
---|
| 22 | PREQ Q IBPRE
|
---|
| 23 | ;
|
---|
| 24 | UR(DFN,IBINDT) ; -- is ur required for patient
|
---|
| 25 | N X,Y,J,IBPRE
|
---|
| 26 | S IBUR=0,J=0
|
---|
| 27 | S:'$G(IBINDT) IBINDT=DT
|
---|
| 28 | F S J=$O(^DPT(DFN,.312,J)) Q:'J S X=$G(^(J,0)) I $$CHK(X,IBINDT),$P($G(^IBA(355.3,+$P(X,"^",18),0)),"^",5) S IBUR=1 Q
|
---|
| 29 | URQ Q IBUR
|
---|
| 30 | ;
|
---|
| 31 | CHK(X,Z,Y) ; -- check one entry for active
|
---|
| 32 | ; -- Input X = Zeroth node of entry in insurance multiple (2.312)
|
---|
| 33 | ; Z = date to check
|
---|
| 34 | ; Y = 2 if want will not reimburse
|
---|
| 35 | ; = 3 if want will not reimburse AND indemnity plans
|
---|
| 36 | ; = 4 if want will not reimburse, but only if it's
|
---|
| 37 | ; MEDICARE
|
---|
| 38 | ; -- Output 1 = Insurance Active
|
---|
| 39 | ; 0 = Inactive
|
---|
| 40 | ;
|
---|
| 41 | N Z1,X1
|
---|
| 42 | S Z1=0,Y=$G(Y)
|
---|
| 43 | I Y'=3,$$INDEM(X) G CHKQ ; is an indemnity policy or company
|
---|
| 44 | S X1=$G(^DIC(36,+X,0)) G:X1="" CHKQ ;insurance company entry doesn't exist
|
---|
| 45 | I $P(X,"^",8) G:Z<$P(X,"^",8) CHKQ ;effective date later than care
|
---|
| 46 | I $P(X,"^",4) G:Z>$P(X,"^",4) CHKQ ;care after expiration date
|
---|
| 47 | I $P($G(^IBA(355.3,+$P(X,"^",18),0)),"^",11) G CHKQ ;plan is inactive
|
---|
| 48 | G:$P(X1,"^",5) CHKQ ;insurance company inactive
|
---|
| 49 | I Y<2 G:$P(X1,"^",2)="N" CHKQ ;insurance company will not reimburse
|
---|
| 50 | I Y=4,$P(X1,"^",2)="N",'$$MCRWNR^IBEFUNC(+X) G CHKQ ;only MEDICARE WNR
|
---|
| 51 | S Z1=1
|
---|
| 52 | CHKQ Q Z1
|
---|
| 53 | ;
|
---|
| 54 | ACTIVE(IBCIFN) ; -- is this company active for this patient for this date
|
---|
| 55 | ; -- called from input transform and x-refs for fields 101,102,103
|
---|
| 56 | ; -- input
|
---|
| 57 | N ACTIVE,DFN,IBINDT
|
---|
| 58 | S DFN=$P(^DGCR(399,DA,0),"^",2),IBINDT=$S(+$G(^DGCR(399,DA,"U")):+$G(^("U")),1:DT)
|
---|
| 59 | ;
|
---|
| 60 | ACTIVEQ Q ACTIVE
|
---|
| 61 | ;
|
---|
| 62 | DD ; - called from input transform and x-refs for field 101,102,103
|
---|
| 63 | ; - input requires da=internal entry number in 399
|
---|
| 64 | ; - outputs IBdd(ins co.) array
|
---|
| 65 | N DFN S DFN=$P(^DGCR(399,DA,0),"^",2),IBINDT=$S(+$G(^DGCR(399,DA,"U")):+$G(^("U")),1:DT)
|
---|
| 66 | D ALLACT
|
---|
| 67 | DDQ K IBINDT Q
|
---|
| 68 | ;
|
---|
| 69 | ;
|
---|
| 70 | ALLACT ; -- return active insurance zeroth nodes in ibdd(ins co,entry in mult)
|
---|
| 71 | N X,X1
|
---|
| 72 | S (X1,IBDD)=0
|
---|
| 73 | F S X1=$O(^DPT(DFN,.312,X1)) Q:'X1 S X=$G(^(X,0)) I $$CHK(X,IBINDT) S IBDD(+X,X1)=X
|
---|
| 74 | ;
|
---|
| 75 | ALLACTQ Q
|
---|
| 76 | ;
|
---|
| 77 | HDR W !?4,"Insurance Co.",?22,"Policy #",?40,"Group",?52,"Holder",?60,"Effective",?70,"Expires" S X="",$P(X,"=",IOM-4)="" W !?4,X
|
---|
| 78 | Q
|
---|
| 79 | ;
|
---|
| 80 | ;
|
---|
| 81 | D1 N X Q:'$D(IBINS)
|
---|
| 82 | W !?4,$S($D(^DIC(36,+IBINS,0)):$E($P(^(0),"^",1),1,16),1:"UNKNOWN")
|
---|
| 83 | W ?22,$E($P(IBINS,"^",2),1,16)
|
---|
| 84 | W ?40,$E($$GRP^IBCNS($P(IBINS,"^",18)),1,10)
|
---|
| 85 | S X=$P(IBINS,"^",6) W ?52,$S(X="v":"SELF",X="s":"SPOUSE",1:"OTHER")
|
---|
| 86 | W ?60,$$DAT1^IBOUTL($P(IBINS,"^",8)),?70,$$DAT1^IBOUTL($P(IBINS,"^",4))
|
---|
| 87 | Q
|
---|
| 88 | ;
|
---|
| 89 | ALL(DFN,VAR,ACT,ADT,SOP) ; -- find all insurance data on a patient
|
---|
| 90 | ;
|
---|
| 91 | ; -- input DFN = patient
|
---|
| 92 | ; VAR = variable to output in format of abc
|
---|
| 93 | ; or abc(dfn)
|
---|
| 94 | ; or ^tmp($j,"Insurance")
|
---|
| 95 | ; ACT = 1 if only active ins. desired
|
---|
| 96 | ; = 2 if active and will not reimburse desired
|
---|
| 97 | ; = 3 if active, will not reimburse, and indemnity are
|
---|
| 98 | ; all desired (for the $$INSTYP function below)
|
---|
| 99 | ; = 4 if only active and MEDICARE WNR only desired
|
---|
| 100 | ; ADT = if ACT=1 or 4, then ADT is the internal date to check
|
---|
| 101 | ; active for, default = dt
|
---|
| 102 | ; SOP = if SOP=1, then sort policies in COB order
|
---|
| 103 | ;
|
---|
| 104 | ; -- output var(0) =: number of entries insurance multiple
|
---|
| 105 | ; var(x,0) =: ^dpt(dfn,.312,x,0)
|
---|
| 106 | ; var(x,1) =: ^dpt(dfn,.312,x,1)
|
---|
| 107 | ; var(x,2) =: ^dpt(dfn,.312,x,2)
|
---|
| 108 | ; var(x,3) =: ^dpt(dfn,.312,x,3)
|
---|
| 109 | ; var(x,4) =: ^dpt(dfn,.312,x,4)
|
---|
| 110 | ; var(x,355.3) =: ^iba(355.3,$p(var(x,0),"^",18),0)
|
---|
| 111 | ; var("S",COB sequence,x) =: (null) as an xref for COB
|
---|
| 112 | ;
|
---|
| 113 | N X,IBMRA,IBSP
|
---|
| 114 | S X=0 I $G(ACT),$E($G(ADT),1,7)'?7N S ADT=DT
|
---|
| 115 | S (IBMRA,IBSP)=0 ;Flag to say if pt has medicare wnr, spouse has policy
|
---|
| 116 | F S X=$O(^DPT(DFN,.312,X)) Q:'X I $D(^(X,0)) D
|
---|
| 117 | .I $G(ACT),'$$CHK(^DPT(DFN,.312,X,0),ADT,$G(ACT)) Q
|
---|
| 118 | .S @VAR@(0)=$G(@VAR@(0))+1
|
---|
| 119 | .S @VAR@(X,0)=$$ZND(DFN,X)
|
---|
| 120 | .S @VAR@(X,1)=$G(^DPT(DFN,.312,X,1))
|
---|
| 121 | .S @VAR@(X,2)=$G(^DPT(DFN,.312,X,2))
|
---|
| 122 | .S @VAR@(X,3)=$G(^DPT(DFN,.312,X,3))
|
---|
| 123 | .S @VAR@(X,4)=$G(^DPT(DFN,.312,X,4))
|
---|
| 124 | .S @VAR@(X,355.3)=$G(^IBA(355.3,+$P($G(^DPT(DFN,.312,X,0)),"^",18),0))
|
---|
| 125 | .I $G(SOP) D
|
---|
| 126 | ..N COB,WHO
|
---|
| 127 | ..S COB=$P(@VAR@(X,0),U,20)
|
---|
| 128 | ..S WHO=$P(@VAR@(X,0),U,6) S:WHO="s" IBSP=1
|
---|
| 129 | ..I $$MCRWNR^IBEFUNC(+@VAR@(X,0)) D
|
---|
| 130 | ... S COB=.5,IBMRA=1
|
---|
| 131 | ...
|
---|
| 132 | ..S COB=$S(COB'="":COB,WHO="v":1,WHO="s":$S(IBMRA:1,1:2),1:3)
|
---|
| 133 | ..S @VAR@("S",COB,X)=""
|
---|
| 134 | ..Q
|
---|
| 135 | ; Ck for spouse's insurance, move it before any MEDICARE WNR if sorting
|
---|
| 136 | I $G(SOP),IBMRA,IBSP D
|
---|
| 137 | . ; Shuffle Medicare WNR, if necessary
|
---|
| 138 | . S X=0 F S X=$O(@VAR@("S",.5,X)) Q:'X S @VAR@("S",2,X)="" K @VAR@("S",.5,X)
|
---|
| 139 | . S X=0 F S X=$O(@VAR@("S",2,X)) Q:'X I $P(@VAR@(X,0),U,6)="s",'$P(@VAR@(X,0),U,20) S @VAR@("S",1,X)="" K @VAR@("S",2,X)
|
---|
| 140 | ALLQ Q
|
---|
| 141 | ;
|
---|
| 142 | ALLWNR(DFN,VAR,ADT) ; Returns 'all active and MEDICARE WNR'
|
---|
| 143 | D ALL(DFN,VAR,4,ADT)
|
---|
| 144 | Q
|
---|
| 145 | ;
|
---|
| 146 | ZND(DFN,NODE) ; -- set group number and group name back into zeroth node of ins. type
|
---|
| 147 | N X,Y S (X,Y)=""
|
---|
| 148 | I '$G(DFN)!('$G(NODE)) G ZNDQ
|
---|
| 149 | S X=$G(^DPT(+DFN,.312,+NODE,0))
|
---|
| 150 | S Y=$G(^IBA(355.3,+$P(X,"^",18),0)) I Y="" G ZNDQ
|
---|
| 151 | S $P(X,"^",3)=$P(Y,"^",4) ; move group number
|
---|
| 152 | S $P(X,"^",15)=$P(Y,"^",3) ; move group name
|
---|
| 153 | ;
|
---|
| 154 | ZNDQ Q X
|
---|
| 155 | ;
|
---|
| 156 | INDEM(X) ; -- is this an indemnity plan
|
---|
| 157 | ; -- input zeroth node if insurance type field
|
---|
| 158 | N IBINDEM,IBCTP
|
---|
| 159 | S IBINDEM=1
|
---|
| 160 | I $P($G(^DIC(36,+X,0)),"^",13)=15 G INDEMQ ; company is indemnity co.
|
---|
| 161 | S IBCTP=$P($G(^IBA(355.3,+$P(X,"^",18),0)),"^",9)
|
---|
| 162 | I IBCTP,$P($G(^IBE(355.1,+IBCTP,0)),"^",3)=9 G INDEMQ ; plan is an indemnity plan
|
---|
| 163 | S IBINDEM=0
|
---|
| 164 | INDEMQ Q IBINDEM
|
---|
| 165 | ;
|
---|
| 166 | ;
|
---|
| 167 | INSTYP(DFN,DATE) ; -- return type of insurance policy for patient
|
---|
| 168 | ;
|
---|
| 169 | ; -- input dfn := pointer to patient file (required)
|
---|
| 170 | ; date := date of insurance (optional, default = today)
|
---|
| 171 | ;
|
---|
| 172 | ; -- output Major Category of type of Plan (file 355.1, field .03)
|
---|
| 173 | ; for policy which would be billed first (cob)
|
---|
| 174 | ; null no insurance found
|
---|
| 175 | ; 1 MAJOR MEDICAL (default)
|
---|
| 176 | ; 2 DENTAL
|
---|
| 177 | ; 3 HMO
|
---|
| 178 | ; 4 PPO
|
---|
| 179 | ; 5 MEDICARE
|
---|
| 180 | ; 6 MEDICAID
|
---|
| 181 | ; 7 TRICARE
|
---|
| 182 | ; 8 WORKMANS COMP
|
---|
| 183 | ; 9 INDEMNITY
|
---|
| 184 | ; 10 PRESCRIPTION
|
---|
| 185 | ; 11 MEDICARE SUPPLEMENTAL
|
---|
| 186 | ; 12 ALL OTHER
|
---|
| 187 | ;
|
---|
| 188 | N TYPE,POL,IBCPOL
|
---|
| 189 | S TYPE=""
|
---|
| 190 | I '$G(DFN) G INSTYPQ
|
---|
| 191 | I '$G(DATE) S DATE=DT
|
---|
| 192 | D ALL(DFN,"POL",3,DATE)
|
---|
| 193 | I $G(POL(0))<1 G INSTYPQ
|
---|
| 194 | I $G(POL(0))=1 S IBCPOL=+$O(POL(0))
|
---|
| 195 | I $G(POL(0))>1 S IBCPOL=$$COB(.POL)
|
---|
| 196 | ;
|
---|
| 197 | I IBCPOL S TYPE=$P($G(^IBE(355.1,+$P($G(POL(IBCPOL,355.3)),"^",9),0)),"^",3)
|
---|
| 198 | I TYPE="" S TYPE=1 ;default is major medical
|
---|
| 199 | ;
|
---|
| 200 | INSTYPQ Q TYPE
|
---|
| 201 | ;
|
---|
| 202 | COB(POL) ; -- find policy with high coordination of benefits
|
---|
| 203 | N I,X,IBC,COB,WHO,IBCOB
|
---|
| 204 | ;
|
---|
| 205 | S IBC=""
|
---|
| 206 | S I=0 F S I=$O(POL(I)) Q:'I D
|
---|
| 207 | .S WHO=$P($G(POL(I,0)),"^",6),COB=$P($G(POL(I,0)),"^",20)
|
---|
| 208 | .S X=$S(COB'="":COB,WHO="v":1,WHO="s":2,1:3)
|
---|
| 209 | .I 'IBC S IBC=I,IBCOB=X Q
|
---|
| 210 | .I X<IBCOB S IBC=I,IBCOB=X
|
---|
| 211 | Q IBC
|
---|