| [623] | 1 | IBCNSU ;ALB/AAS - INSURANCE UTILITY ROUTINE ; 19-MAY-93 | 
|---|
|  | 2 | ;;2.0;INTEGRATED BILLING;**28,103**; 21-MAR-94 | 
|---|
|  | 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | AB(IBCPOL,IBYR,IBASK) ; -- Return entry in Annual Benefits file | 
|---|
|  | 6 | ;  Input:  IBCPOL  = pointer to health insurance policy file | 
|---|
|  | 7 | ;          IBYR    = fileman internal date, Default = dt | 
|---|
|  | 8 | ;          IBASK   = 1 if want to ask okay to add new entry | 
|---|
|  | 9 | ; | 
|---|
|  | 10 | ; Output:  IBCAB   = pointer to Annual Benefits file if added, else null | 
|---|
|  | 11 | ; | 
|---|
|  | 12 | N DIR,IBCAB | 
|---|
|  | 13 | S IBCAB="" | 
|---|
|  | 14 | I $G(IBCPOL)="" G ABQ | 
|---|
|  | 15 | I $G(IBYR)="" S IBYR=DT | 
|---|
|  | 16 | ;S IBYR=$E(IBYR,1,3)_"0000" | 
|---|
|  | 17 | ; | 
|---|
|  | 18 | ; -- try to find entry for policy for year | 
|---|
|  | 19 | S IBCAB=$O(^IBA(355.4,"APY",IBCPOL,-IBYR,0)) | 
|---|
|  | 20 | ; | 
|---|
|  | 21 | ; -- if no match add new entry | 
|---|
|  | 22 | I 'IBCAB D | 
|---|
|  | 23 | .I $G(IBASK) S DIR(0)="Y",DIR("A")="Are you adding a new Annual Benefits YEAR",DIR("B")="YES" D ^DIR I $D(DIRUT)!(Y<1) S VALMQUIT="" Q | 
|---|
|  | 24 | .S IBCAB=$$ADDB(IBCPOL,IBYR) | 
|---|
|  | 25 | .Q | 
|---|
|  | 26 | ABQ Q IBCAB | 
|---|
|  | 27 | ; | 
|---|
|  | 28 | ADDB(IBCPOL,IBYR) ; -- add entries to Annual Benefits file | 
|---|
|  | 29 | ;  Input:  IBCPOL  = pointer to health insurance policy file | 
|---|
|  | 30 | ;          IBYR    = fileman internal date, Default = dt | 
|---|
|  | 31 | ; | 
|---|
|  | 32 | ; Output:  IBCAB   = pointer to Annual Benefits file if added, else null | 
|---|
|  | 33 | ; | 
|---|
|  | 34 | N %DT,IBN1,IBCAB,DIC,DIE,DR,DA,DLAYGO,DO,DD | 
|---|
|  | 35 | S IBCAB="" | 
|---|
|  | 36 | I $G(IBCPOL)="" G ADDBQ | 
|---|
|  | 37 | I $G(IBYR)="" S IBYR=DT | 
|---|
|  | 38 | K DD,DO,DIC,DR S DIC="^IBA(355.4,",DIC(0)="L",DLAYGO=355.4 | 
|---|
|  | 39 | ; | 
|---|
|  | 40 | ;S X=$E(IBYR,1,3)_"0000" | 
|---|
|  | 41 | S X=IBYR D FILE^DICN I +Y<0 G ADDBQ | 
|---|
|  | 42 | S (IBCAB,DA)=+Y,DIE="^IBA(355.4,",DR=".02////"_IBCPOL | 
|---|
|  | 43 | D ^DIE K DIC,DIE,DA,DR | 
|---|
|  | 44 | ADDBQ Q IBCAB | 
|---|
|  | 45 | ; | 
|---|
|  | 46 | CHIP(IBCDFND) ; -- convert node with no hip pointer to one with hip pointer | 
|---|
|  | 47 | ;   Input:  IBCDFND  = zeroth node of insurance type multiple | 
|---|
|  | 48 | ;                    = ^dpt(dfn,.312,ibcdfn,0) | 
|---|
|  | 49 | ; | 
|---|
|  | 50 | ;  Output:  IBCPOL   = pointer to policy file | 
|---|
|  | 51 | ; | 
|---|
|  | 52 | N IBCNS,IBGRP,IBGRNA,IBGRNU | 
|---|
|  | 53 | S IBCNS=+IBCDFND,IBGRNA=$P(IBCDFND,"^",15),IBGRNU=$P(IBCDFND,"^",3),IBGRP=0 | 
|---|
|  | 54 | I IBGRNA'=""!(IBGRNU'="") S IBGRP=1 | 
|---|
|  | 55 | S IBCPOL=$$HIP(IBCNS,IBGRP,IBGRNA,IBGRNU) | 
|---|
|  | 56 | CHIPQ Q IBCPOL | 
|---|
|  | 57 | ; | 
|---|
|  | 58 | HIP(IBCNS,IBGRP,IBGRNA,IBGRNU) ; -- find internal entry number in policy file | 
|---|
|  | 59 | ;  Input:  IBCNS  = pointer to ins co file | 
|---|
|  | 60 | ;          IBGRP  = 1 if group policy, 0 if not | 
|---|
|  | 61 | ;          IBGRNA = group name | 
|---|
|  | 62 | ;          IBGRNU = group number | 
|---|
|  | 63 | ; | 
|---|
|  | 64 | ; Output:  IBCPOL = pointer to policy file | 
|---|
|  | 65 | ; | 
|---|
|  | 66 | N %DT | 
|---|
|  | 67 | S IBCPOL="" | 
|---|
|  | 68 | I $G(^DIC(36,+$G(IBCNS),0))="" G HIPQ | 
|---|
|  | 69 | S IBGRP=+$G(IBGRP) ; if undefine, is not a group policy | 
|---|
|  | 70 | I 'IBGRP S IBCPOL=$$ADDH(IBCNS,IBGRP) G HIPQ | 
|---|
|  | 71 | ; | 
|---|
|  | 72 | S:$G(IBGRNU)="" IBGRNU="IB ZZZZZ" | 
|---|
|  | 73 | I IBGRNU'="IB ZZZZZ" S IBCPOL=$O(^IBA(355.3,"AGNU",IBCNS,IBGRNU,0)) | 
|---|
|  | 74 | I IBCPOL,$P($G(^IBA(355.3,+IBCPOL,0)),"^",3)=IBGRNA G HIPQ ; match both | 
|---|
|  | 75 | ; | 
|---|
|  | 76 | S:$G(IBGRNA)="" IBGRNA="IB ZZZZZ" | 
|---|
|  | 77 | S IBCPOL=$O(^IBA(355.3,"AGNA",IBCNS,IBGRNA,0)) | 
|---|
|  | 78 | I IBCPOL,$P($G(^IBA(355.3,+IBCPOL,0)),"^",4)=IBGRNU G HIPQ ; match both | 
|---|
|  | 79 | ; | 
|---|
|  | 80 | I 'IBCPOL S IBCPOL=$$ADDH(IBCNS,IBGRP) D | 
|---|
|  | 81 | .I IBGRNA="",IBGRNU="" Q | 
|---|
|  | 82 | .S:IBGRNA="IB ZZZZZ" IBGRNA="" S:IBGRNU="IB ZZZZZ" IBGRNU="" | 
|---|
|  | 83 | .S DA=IBCPOL,DIE="^IBA(355.3,",DR=".03////"_$$STRIP(IBGRNA,";")_";.04////"_$$STRIP(IBGRNU,";") | 
|---|
|  | 84 | .D ^DIE K DA,DR,DIC,DIE | 
|---|
|  | 85 | HIPQ Q IBCPOL | 
|---|
|  | 86 | ; | 
|---|
|  | 87 | ADDH(IBCNS,IBGRP,IBGNA,IBGNU) ; -- add entries to health insurance policy file (355.3) | 
|---|
|  | 88 | ;     Input:  IBCNS  = pointer to ins co file | 
|---|
|  | 89 | ;             IBGRP  = 1 if group policy, 0 if no | 
|---|
|  | 90 | ; | 
|---|
|  | 91 | ;    Output:  IBCPOL = pointer to policy file, if added else null | 
|---|
|  | 92 | ; | 
|---|
|  | 93 | N %DT,IBN1,IBCAB,DIC,DIE,DR,DA,DLAYGO,DO,DD | 
|---|
|  | 94 | S IBCPOL="" | 
|---|
|  | 95 | I $G(IBCNS)="" G ADDHQ | 
|---|
|  | 96 | K DD,DO,DIC,DR S DIC="^IBA(355.3,",DIC(0)="L",DLAYGO=355.3 | 
|---|
|  | 97 | ; | 
|---|
|  | 98 | S X=IBCNS D FILE^DICN I +Y<0 G ADDHQ | 
|---|
|  | 99 | S (DA,IBCPOL)=+Y,DIE="^IBA(355.3,",DR=".02////"_+$G(IBGRP) | 
|---|
|  | 100 | I IBGRP=0,$G(DFN) S DR=DR_";.1////"_DFN | 
|---|
|  | 101 | I $D(IBGNU) S DR=DR_";.04///^S X=IBGNU" | 
|---|
|  | 102 | I $D(IBGNA) S DR=DR_";.03///^S X=IBGNA" | 
|---|
|  | 103 | D ^DIE K DA,DR,DIE,DIC | 
|---|
|  | 104 | I $G(IBCNTP)'="" S IBCNTP=IBCNTP+1 | 
|---|
|  | 105 | ADDHQ Q IBCPOL | 
|---|
|  | 106 | ; | 
|---|
|  | 107 | ODELP(DFN,INS) ; -- can an insurance policy be deleted | 
|---|
|  | 108 | ; -- called by ^dd(2.312,0,"del",.01) and by ibcnsm | 
|---|
|  | 109 | ; -- input  dfn: ien of patient in file 2. | 
|---|
|  | 110 | ;           ins: ien of ins. co in file 36 | 
|---|
|  | 111 | ; | 
|---|
|  | 112 | ; -- output      1 if no deletion allowed | 
|---|
|  | 113 | ;                 0 if deletion allowed | 
|---|
|  | 114 | N I,X,Y S X=0 | 
|---|
|  | 115 | ; | 
|---|
|  | 116 | ; -- do not delete if any uncancelled bills | 
|---|
|  | 117 | S J=0 F  S J=$O(^DGCR(399,"AE",DFN,INS,J)) Q:'J  I $P(^DGCR(399,J,"S"),"^",17)="" S X=1 Q | 
|---|
|  | 118 | ODELPQ Q X | 
|---|
|  | 119 | ; | 
|---|
|  | 120 | STRIP(X,X1) ; -- strip characters from string | 
|---|
|  | 121 | ;    input:  x  = string | 
|---|
|  | 122 | ;            x1 = character to strip (default is ";" | 
|---|
|  | 123 | N I,X2 | 
|---|
|  | 124 | S X2="" S:$G(X1)="" X1=";" | 
|---|
|  | 125 | S X1=$E(X1) | 
|---|
|  | 126 | F I=1:1 S X2=X2_$P(X,X1,I) Q:($P(X,X1,I+1,999)'[X1) | 
|---|
|  | 127 | Q X2 | 
|---|
|  | 128 | ; | 
|---|
|  | 129 | ; | 
|---|
|  | 130 | DELP(DFN,INS,IBC) ; -- can an insurance policy be deleted | 
|---|
|  | 131 | ; -- called by ^dd(2.312,0,"del",.01) and by ibcnsm | 
|---|
|  | 132 | ; -- input  dfn: ien of patient in file 2. | 
|---|
|  | 133 | ;           ins: ien of ins. co in file 36 | 
|---|
|  | 134 | ;           ibc: ien of policy in file 2.312 to do a match | 
|---|
|  | 135 | ; | 
|---|
|  | 136 | ; -- output      1 if no deletion allowed | 
|---|
|  | 137 | ;                0 if deletion allowed | 
|---|
|  | 138 | ; | 
|---|
|  | 139 | N ARR,J,ONEPOL,X | 
|---|
|  | 140 | ; | 
|---|
|  | 141 | ; - check input | 
|---|
|  | 142 | I '$G(DFN)!'$G(INS) S X=1 G DELPQ | 
|---|
|  | 143 | ; | 
|---|
|  | 144 | ; - see if vet has more than one policy with carrier; set flag | 
|---|
|  | 145 | ; - also, if no policy is passed, assume the patient has one policy | 
|---|
|  | 146 | I $G(IBC) D | 
|---|
|  | 147 | .S J=0  F  S J=$O(^DPT("AB",IBC,DFN,J)) Q:'J  S ARR(J)=$G(^DPT(DFN,.312,J,0)) | 
|---|
|  | 148 | .S (J,ONEPOL)=0 S J=$O(ARR(J)) I J,'$O(ARR(J)) S ONEPOL=1 | 
|---|
|  | 149 | E  S ONEPOL=1 | 
|---|
|  | 150 | ; | 
|---|
|  | 151 | ; | 
|---|
|  | 152 | ; -- do not delete if any uncancelled bills | 
|---|
|  | 153 | S (J,X)=0 F  S J=$O(^DGCR(399,"AE",DFN,INS,J)) Q:'J  D  Q:X | 
|---|
|  | 154 | .; | 
|---|
|  | 155 | .N ARRP,POL,K,L,M,MP,S,Z | 
|---|
|  | 156 | .S Z=$G(^DGCR(399,J,0)),M=$G(^("M")),MP=$G(^("MP")),S=$G(^("S")) | 
|---|
|  | 157 | .; | 
|---|
|  | 158 | .; - skip cancelled bills | 
|---|
|  | 159 | .I $P(S,"^",17)'="" Q | 
|---|
|  | 160 | .; | 
|---|
|  | 161 | .; - set flag if the patient has just one policy with the company | 
|---|
|  | 162 | .I ONEPOL S X=1 Q | 
|---|
|  | 163 | .; | 
|---|
|  | 164 | .; - if there are no policy pointers in the claim, | 
|---|
|  | 165 | .I '$P(M,"^",12),'$P(M,"^",13),'$P(M,"^",14),'$P(MP,"^",2) D  Q | 
|---|
|  | 166 | ..; | 
|---|
|  | 167 | ..; - find all policies effective on the event date | 
|---|
|  | 168 | ..S K=0 F  S K=$O(ARR(K)) Q:'K  S POL=ARR(K) D | 
|---|
|  | 169 | ...I $P(POL,"^",8) Q:$P(Z,"^",3)<$P(POL,"^",8) | 
|---|
|  | 170 | ...I $P(POL,"^",4) Q:$P(Z,"^",3)>$P(POL,"^",4) | 
|---|
|  | 171 | ...S ARRP(K)="" | 
|---|
|  | 172 | ..; | 
|---|
|  | 173 | ..; - if there are two such policies, trust user judgement and assume | 
|---|
|  | 174 | ..; - policy is not related to this claim. | 
|---|
|  | 175 | ..S L=$O(ARRP(0)) I L,$O(ARR(L)) Q | 
|---|
|  | 176 | ..; | 
|---|
|  | 177 | ..; - if there is just one policy, and it is the same as the one | 
|---|
|  | 178 | ..; - passed in, do not allow deletion. | 
|---|
|  | 179 | ..I L=IBC S X=1 | 
|---|
|  | 180 | .; | 
|---|
|  | 181 | .; - if one of the claim policy pointers is the same as the policy | 
|---|
|  | 182 | .; - passed in, do not allow deletion. | 
|---|
|  | 183 | .I $P(MP,"^",2)=IBC S X=1 Q | 
|---|
|  | 184 | .I $P(M,"^",12)=IBC!($P(M,"^",13)=IBC)!($P(M,"^",14)=IBC) S X=1 | 
|---|
|  | 185 | ; | 
|---|
|  | 186 | ; | 
|---|
|  | 187 | DELPQ Q X | 
|---|