| [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 | 
|---|