| 1 | IBCNSP1 ;ALB/AAS - INSURANCE MANAGEMENT - policy actions ;22-OCT-92 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**6,28,40,43,52,85,103,361,371,377**;21-MAR-94;Build 23 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ;;ICR#5002 for read of ^DIE input template data | 
|---|
| 5 | ; | 
|---|
| 6 | % G EN^IBCNSP | 
|---|
| 7 | ; | 
|---|
| 8 | EA ; -- Edit all | 
|---|
| 9 | N IBCDFN,IBTRC,IBTRN | 
|---|
| 10 | D FULL^VALM1 W !! | 
|---|
| 11 | S IBCDFN=$P($G(IBPPOL),"^",4) I 'IBCDFN W !!,"Can't identify the policy!" G EAQ | 
|---|
| 12 | S IBCNSEH=1 D PAT^IBCNSEH | 
|---|
| 13 | ; | 
|---|
| 14 | D BEFORE^IBCNSEVT | 
|---|
| 15 | D PATPOL^IBCNSM32(IBCDFN) | 
|---|
| 16 | D AFTER^IBCNSEVT,^IBCNSEVT | 
|---|
| 17 | ; | 
|---|
| 18 | ; -- edit policy data | 
|---|
| 19 | D POL^IBCNSEH | 
|---|
| 20 | D EDPOL^IBCNSM3(IBCDFN) | 
|---|
| 21 | ; | 
|---|
| 22 | W !! D AI | 
|---|
| 23 | ; | 
|---|
| 24 | EAQ D:$G(IBTRC) AIP^IBCNSP02(IBTRC) | 
|---|
| 25 | D BLD^IBCNSP | 
|---|
| 26 | S VALMBCK="R" | 
|---|
| 27 | Q | 
|---|
| 28 | ; | 
|---|
| 29 | AB ; -- Annual Benefits | 
|---|
| 30 | S X=+$P($G(IBPPOL),"^",4),IBCNS=+$G(^DPT(DFN,.312,X,0)),IBCPOL=+$P($G(^(0)),"^",18) | 
|---|
| 31 | I 'IBCPOL W !!,"Can't identify the plan!" S VALMBCK="" G ABQ | 
|---|
| 32 | D FULL^VALM1 W !! | 
|---|
| 33 | D EN^VALM("IBCNS ANNUAL BENEFITS") | 
|---|
| 34 | S VALMBCK="R" | 
|---|
| 35 | ABQ Q | 
|---|
| 36 | ; | 
|---|
| 37 | BU ; -- Benefits Used | 
|---|
| 38 | S IBCDFN=+$P($G(IBPPOL),"^",4),IBCNS=+$G(^DPT(DFN,.312,IBCDFN,0)),IBCPOL=+$P($G(^(0)),"^",18) | 
|---|
| 39 | I 'IBCPOL W !!,"Can't identify the plan!" S VALMBCK="" G BUQ | 
|---|
| 40 | D FULL^VALM1 W !! | 
|---|
| 41 | D EN^VALM("IBCNS BENEFITS USED BY DATE") | 
|---|
| 42 | S VALMBCK="R" | 
|---|
| 43 | BUQ Q | 
|---|
| 44 | ; | 
|---|
| 45 | IT ; -- edit insurance type info from patient policy and plan edit | 
|---|
| 46 | D FULL^VALM1 W !! | 
|---|
| 47 | N IBCDFN | 
|---|
| 48 | S IBCDFN=+$P($G(IBPPOL),"^",4),IBCPOL=+$P($G(^DPT(DFN,.312,IBCDFN,0)),"^",18) | 
|---|
| 49 | I 'IBCPOL W !!,"Can't identify the plan!" S VALMBCK="" G ITQ | 
|---|
| 50 | D ITEDIT(IBCPOL,IBCDFN) | 
|---|
| 51 | ITQ S VALMBCK="R" Q | 
|---|
| 52 | ; | 
|---|
| 53 | IT1 ; -- edit insurance type info from patient policy | 
|---|
| 54 | D ITEDIT(IBCPOL) | 
|---|
| 55 | S VALMBCK="R" | 
|---|
| 56 | Q | 
|---|
| 57 | ; | 
|---|
| 58 | ITEDIT(IBCPOL,IBCDFN) ;Edit insurance type info once you have plan (IBCPOL) | 
|---|
| 59 | ; IBCDFN = the ifn of the policy multiple for pt in ^DPT, node .312 | 
|---|
| 60 | ;          only defined for editing via patient policy | 
|---|
| 61 | G:'$G(IBCPOL) ITEDITQ | 
|---|
| 62 | D SAVE^IBCNSP3(IBCPOL) | 
|---|
| 63 | L +^IBA(355.3,+IBCPOL):5 I '$T D LOCKED^IBTRCD1 G ITEDITQ | 
|---|
| 64 | I $G(IBCDFN) S IBCNSEH=+$G(^IBE(350.9,1,4)) D POL^IBCNSEH | 
|---|
| 65 | I $P($G(^IBA(355.3,IBCPOL,0)),"^",11) W !?2,*7,"Please note that this plan is inactive!",! | 
|---|
| 66 | S DA=IBCPOL,DIE="^IBA(355.3,",DR=".05;.12;.06;.07;.08" | 
|---|
| 67 | D ^DIE K DIC,DIE,DA,DR | 
|---|
| 68 | D COMP^IBCNSP3(IBCPOL) | 
|---|
| 69 | I IBDIF D UPDATE^IBCNSP3(IBCPOL) D:$G(IBCDFN) UPDATPT^IBCNSP3(DFN,IBCDFN),BLD^IBCNSP D:'$G(IBCDFN) INIT^IBCNSC4 | 
|---|
| 70 | L -^IBA(355.3,+IBCPOL) | 
|---|
| 71 | ITEDITQ Q | 
|---|
| 72 | ; | 
|---|
| 73 | ED ; -- Edit effective dates | 
|---|
| 74 | D FULL^VALM1 W !! | 
|---|
| 75 | N IBDIF,DA,DR,DIE,DIC | 
|---|
| 76 | D BEFORE^IBCNSEVT | 
|---|
| 77 | D SAVEPT^IBCNSP3(DFN,IBCDFN) | 
|---|
| 78 | L +^DPT(DFN,.312,+$P($G(IBPPOL),"^",4)):5 I '$T D LOCKED^IBTRCD1 G EDQ | 
|---|
| 79 | D VARS^IBCNSP3 | 
|---|
| 80 | S DR="8;3;1.09//;3.04" | 
|---|
| 81 | D ^DIE K DIC,DIE,DA,DR | 
|---|
| 82 | D COMPPT^IBCNSP3(DFN,IBCDFN) I IBDIF D UPDATPT^IBCNSP3(DFN,IBCDFN),UPDCLM(DFN,IBCDFN),AFTER^IBCNSEVT,^IBCNSEVT,BLD^IBCNSP | 
|---|
| 83 | L -^DPT(DFN,.312,+$P($G(IBPPOL),"^",4)) | 
|---|
| 84 | EDQ S VALMBCK="R" Q | 
|---|
| 85 | ; | 
|---|
| 86 | VC ; -- Verify Coverage | 
|---|
| 87 | D FULL^VALM1 W !! | 
|---|
| 88 | D VFY^IBCNSM2 | 
|---|
| 89 | D BLD^IBCNSP | 
|---|
| 90 | S VALMBCK="R" Q | 
|---|
| 91 | ; | 
|---|
| 92 | SU ; -- Subscriber Update | 
|---|
| 93 | D FULL^VALM1 W !! | 
|---|
| 94 | ;Patch 40 | 
|---|
| 95 | N IBDIF,DA,DR,DIC,DIE,DGSENFLG | 
|---|
| 96 | S DGSENFLG=1 | 
|---|
| 97 | D SAVEPT^IBCNSP3(DFN,IBCDFN) | 
|---|
| 98 | D VARS^IBCNSP3 | 
|---|
| 99 | L +^DPT(DFN,.312,+$P($G(IBPPOL),"^",4)):5 I '$T D LOCKED^IBTRCD1 G SUQ | 
|---|
| 100 | ; | 
|---|
| 101 | D EDIT(DFN,IBCDFN)   ; IB*371 - edit pat ins 2.312 subfile fields | 
|---|
| 102 | ; | 
|---|
| 103 | D COMPPT^IBCNSP3(DFN,IBCDFN) | 
|---|
| 104 | I IBDIF D UPDATPT^IBCNSP3(DFN,IBCDFN),BLD^IBCNSP | 
|---|
| 105 | L -^DPT(DFN,.312,+$P($G(IBPPOL),"^",4)) | 
|---|
| 106 | SUQ S VALMBCK="R" Q | 
|---|
| 107 | ; | 
|---|
| 108 | IC ; -- Insurance Contact Information | 
|---|
| 109 | D FULL^VALM1 W !! | 
|---|
| 110 | N IBDIF,DA,DR,DIC,DIE,IBTRC,DIR,DUOUT,DTOUT,DIRUT,IBTRN | 
|---|
| 111 | D AI | 
|---|
| 112 | D:$G(IBTRC) AIP^IBCNSP02(IBTRC),BLD^IBCNSP | 
|---|
| 113 | S VALMBCK="R" Q | 
|---|
| 114 | Q | 
|---|
| 115 | AI ; -- Add ins. verification entry | 
|---|
| 116 | N X,Y,I,J,DA,DR,DIC,DIE,DR,DD,DO,VA,VAIN,VAERR,IBQUIT,IBXIFN,IBTRN,DUOUT,IBX,IBQUIT,DTOUT | 
|---|
| 117 | Q:'$G(DFN) | 
|---|
| 118 | Q:'$G(IBCDFN)  S IBQUIT=0 | 
|---|
| 119 | D AI^IBCNSP02 | 
|---|
| 120 | Q | 
|---|
| 121 | ; | 
|---|
| 122 | PIDEF(IBREL,FLD,IBDFN,SPDEF) ; Function to return patient file defaults | 
|---|
| 123 | ; Called from input template IBCN PATIENT INSURANCE | 
|---|
| 124 | ; IBREL = value from 2.312,4.03 field (PT. RELATIONSHIP - HIPAA) | 
|---|
| 125 | ;   FLD = field# in file 2.312 | 
|---|
| 126 | ; IBDFN = patient ien to file 2 | 
|---|
| 127 | ; SPDEF = spouse default flag =1 if this field should be defaulted | 
|---|
| 128 | ;         when the spouse is the policy holder | 
|---|
| 129 | ; | 
|---|
| 130 | ; The purpose is to provide a default value for the field when the | 
|---|
| 131 | ; patient and the ins. subscriber are the same. | 
|---|
| 132 | ; | 
|---|
| 133 | NEW VAL | 
|---|
| 134 | S VAL="" | 
|---|
| 135 | I +$G(IBREL)'=1,+$G(IBREL)'=18 G PIDEFX     ; patient not the insured or spouse, get out | 
|---|
| 136 | I +$G(IBREL)=1,'$G(SPDEF) G PIDEFX          ; not a field for spouse default | 
|---|
| 137 | I '$G(FLD) G PIDEFX                         ; no field# passed in | 
|---|
| 138 | I '$G(IBDFN) G PIDEFX                       ; no patient passed in | 
|---|
| 139 | ; | 
|---|
| 140 | ; Build the patient demographics area | 
|---|
| 141 | I '$D(^UTILITY("VADM",$J)) D | 
|---|
| 142 | . N VAHOW,DFN,VADM | 
|---|
| 143 | . S VAHOW=2,DFN=IBDFN D DEM^VADPT | 
|---|
| 144 | . Q | 
|---|
| 145 | ; | 
|---|
| 146 | ; Build the patient address area | 
|---|
| 147 | I '$D(^UTILITY("VAPA",$J)) D | 
|---|
| 148 | . N VAHOW,DFN,VAPA | 
|---|
| 149 | . S VAHOW=2,DFN=IBDFN,VAPA("P")="" D ADD^VADPT | 
|---|
| 150 | . Q | 
|---|
| 151 | ; | 
|---|
| 152 | I FLD=17 S VAL=$P($G(^UTILITY("VADM",$J,1)),U,1) G PIDEFX                          ; Name | 
|---|
| 153 | I FLD=3.01 S VAL=$$FMTE^XLFDT($P($G(^UTILITY("VADM",$J,3)),U,1),"5Z") G PIDEFX     ; Date of Birth | 
|---|
| 154 | I FLD=3.02 S VAL=$$EXTERNAL^DILFD(2,.325,,$P($G(^DPT(IBDFN,.32)),U,5)) G PIDEFX    ; Branch | 
|---|
| 155 | I FLD=3.05 S VAL=$P($G(^UTILITY("VADM",$J,2)),U,2) G PIDEFX                        ; SSN | 
|---|
| 156 | I FLD=3.06 S VAL=$P($G(^UTILITY("VAPA",$J,1)),U,1) G PIDEFX                        ; Street Address 1 | 
|---|
| 157 | I FLD=3.07 S VAL=$P($G(^UTILITY("VAPA",$J,2)),U,1) G PIDEFX                        ; Street Address 2 | 
|---|
| 158 | I FLD=3.08 S VAL=$P($G(^UTILITY("VAPA",$J,4)),U,1) G PIDEFX                        ; City | 
|---|
| 159 | I FLD=3.09 S VAL=$P($G(^UTILITY("VAPA",$J,5)),U,2) G PIDEFX                        ; State | 
|---|
| 160 | I FLD=3.1 S VAL=$P($G(^UTILITY("VAPA",$J,11)),U,2) G PIDEFX                        ; Zipcode | 
|---|
| 161 | I FLD=3.11 S VAL=$P($G(^UTILITY("VAPA",$J,8)),U,1) G PIDEFX                        ; Phone# | 
|---|
| 162 | I FLD=3.12 S VAL=$P($G(^UTILITY("VADM",$J,5)),U,2) G PIDEFX                        ; Sex | 
|---|
| 163 | PIDEFX ; | 
|---|
| 164 | Q VAL | 
|---|
| 165 | ; | 
|---|
| 166 | ASK(QUES,DEFLT) ; Function to ask Yes/No Question | 
|---|
| 167 | ; Returns 1 (yes), 0 (no, up-arrow, or timeout) | 
|---|
| 168 | NEW X,Y,DIR,DTOUT,DUOUT,DIRUT,DIROUT | 
|---|
| 169 | S DIR(0)="Y",DIR("A")=$G(QUES) | 
|---|
| 170 | S DIR("B")=$S($G(DEFLT):"Yes",1:"No") | 
|---|
| 171 | W ! D ^DIR W:Y ! | 
|---|
| 172 | I $D(DIRUT) S Y=0 | 
|---|
| 173 | ASKX ; | 
|---|
| 174 | Q Y | 
|---|
| 175 | ; | 
|---|
| 176 | EDIT(IBDFN,IBCDFN,IBQUIT) ; Main call to edit data in 2.312 pat ins subfile | 
|---|
| 177 | ;  IBDFN - patient DFN | 
|---|
| 178 | ; IBCDFN - ien for patient insurance policy in subfile 2.312 | 
|---|
| 179 | ; IBQUIT - Output variable.  Pass by reference.  Will be set to 1 if | 
|---|
| 180 | ;          the user entered an up-arrow, timed-out, or deleted the | 
|---|
| 181 | ;          2.312 subfile entry by entering "@" at the .01 field | 
|---|
| 182 | ; | 
|---|
| 183 | NEW DA,DR,DIE,IBZ,IBY,X,Y,DTOUT | 
|---|
| 184 | NEW IDS,SUB,PAT,PCE,SUB1,PAT1 | 
|---|
| 185 | S DA(1)=+$G(IBDFN)    ; patient IEN | 
|---|
| 186 | S DA=+$G(IBCDFN)      ; patient insurance IEN | 
|---|
| 187 | I 'DA!'DA(1) G EDITX | 
|---|
| 188 | S DIE="^DPT("_IBDFN_",.312," | 
|---|
| 189 | ; | 
|---|
| 190 | ; Find the input template IEN for the [IBCN PATIENT INSURANCE] template | 
|---|
| 191 | S IBY=+$$FIND1^DIC(.402,,"X","IBCN PATIENT INSURANCE") | 
|---|
| 192 | I 'IBY G EDITX | 
|---|
| 193 | ; | 
|---|
| 194 | ; Build the DR array/string - ICR# 5002 | 
|---|
| 195 | M DR(1)=^DIE(IBY,"DR",2) | 
|---|
| 196 | S DR=$G(DR(1,2.312)) | 
|---|
| 197 | I DR="" G EDITX | 
|---|
| 198 | ; | 
|---|
| 199 | S $P(^DIE(IBY,0),U,7)=DT   ; see TEM+2^DIE  ICR# 5002 | 
|---|
| 200 | ; | 
|---|
| 201 | D ^DIE     ; edit subfile data | 
|---|
| 202 | ; | 
|---|
| 203 | ; If the user entered an up-arrow, or timed-out, or deleted the entry, | 
|---|
| 204 | ; then set the output variable IBQUIT | 
|---|
| 205 | I $D(Y)!$D(DTOUT)!'$D(DA) S IBQUIT=1 | 
|---|
| 206 | ; | 
|---|
| 207 | F IBZ="VADM","VAPA" K ^UTILITY(IBZ,$J)    ; cleanup scratch global | 
|---|
| 208 | ; | 
|---|
| 209 | D UPDCLM(IBDFN,IBCDFN)      ; update editable claims | 
|---|
| 210 | ; | 
|---|
| 211 | ; Cleanup any problems in the secondary ID area | 
|---|
| 212 | S IDS=$G(^DPT(IBDFN,.312,IBCDFN,5))           ; whole 5 node | 
|---|
| 213 | S (SUB,PAT)="" | 
|---|
| 214 | F PCE=3:1:8 S $P(SUB,U,PCE)=$P(IDS,U,PCE-1)   ; subscriber sec ID/qual | 
|---|
| 215 | F PCE=3:1:8 S $P(PAT,U,PCE)=$P(IDS,U,PCE+5)   ; patient sec ID/qual | 
|---|
| 216 | ; SUB and PAT are 8-piece strings with pieces 1 and 2 being nil | 
|---|
| 217 | S SUB1=$$SCRUB^IBCEF21(SUB)                   ; scrub 8-piece string | 
|---|
| 218 | S PAT1=$$SCRUB^IBCEF21(PAT)                   ; scrub 8-piece string | 
|---|
| 219 | I SUB'=SUB1 S $P(^DPT(IBDFN,.312,IBCDFN,5),U,2,7)=$P(SUB1,U,3,8) | 
|---|
| 220 | I PAT'=PAT1 S $P(^DPT(IBDFN,.312,IBCDFN,5),U,8,13)=$P(PAT1,U,3,8) | 
|---|
| 221 | ; | 
|---|
| 222 | EDITX ; | 
|---|
| 223 | Q | 
|---|
| 224 | ; | 
|---|
| 225 | UPDCLM(IBDFN,IBCDFN) ; Update the Insurance nodes of claims that are still editable | 
|---|
| 226 | NEW IBIFN | 
|---|
| 227 | S IBIFN=0 F  S IBIFN=$O(^DGCR(399,"C",IBDFN,IBIFN)) Q:'IBIFN  D UPDCLM^IBCNSP2(IBIFN,IBDFN,IBCDFN) | 
|---|
| 228 | ; | 
|---|
| 229 | UPDCLMX ; | 
|---|
| 230 | Q | 
|---|
| 231 | ; | 
|---|
| 232 | PRELCNV(CODE,FLG) ; conversion between X12, NCPDP and VistA pt. relationship codes | 
|---|
| 233 | ; CODE - code for pt. relationship to convert | 
|---|
| 234 | ; FLG - 0 for X12 -> VistA conversion, 1 for VistA -> X12 conversion, 2 - for VistA -> NCPDP conversion | 
|---|
| 235 | ; returns converted code for pt. relationship, or null if no match found | 
|---|
| 236 | N I,RES,VSTR,X12STR | 
|---|
| 237 | S VSTR="01^02^03^08^11^15^32^33^34^35^36" | 
|---|
| 238 | S X12STR="18^01^19^20^39^41^32^33^29^53^G8" | 
|---|
| 239 | S RES="" | 
|---|
| 240 | I FLG=0 F I=1:1:11 S:$P(X12STR,U,I)=CODE RES=$P(VSTR,U,I) Q:RES'="" | 
|---|
| 241 | I FLG=1 F I=1:1:11 S:$P(VSTR,U,I)=CODE RES=$P(X12STR,U,I) Q:RES'="" | 
|---|
| 242 | I FLG=2,+CODE>0 S RES=$S(+CODE>3:"04",1:CODE) | 
|---|
| 243 | Q RES | 
|---|