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