| [613] | 1 | IBCNS3 ;ALB/ARH - DISPLAY EXTENDED INSURANCE ; 01-DEC-04
 | 
|---|
 | 2 |  ;;2.0;INTEGRATED BILLING;**287**;21-MAR-94
 | 
|---|
 | 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 | DISP(DFN,DATE,DISPLAY) ;  Display all insurance company information
 | 
|---|
 | 6 |  ;    input: DFN     = pointer to patient
 | 
|---|
 | 7 |  ;           DATE    = date to check for coverage and riders
 | 
|---|
 | 8 |  ;           DISPLAY = contain indicators of data to display (123)
 | 
|---|
 | 9 |  ;
 | 
|---|
 | 10 |  Q:'$G(DFN)  D:'$D(IOF) HOME^%ZIS
 | 
|---|
 | 11 |  N IBINS,IBPOLFN,IBPOL0,IBPLNFN S DISPLAY=$G(DISPLAY) I '$G(DATE) S DATE=DT
 | 
|---|
 | 12 |  K ^TMP($J,"IBCNS3")
 | 
|---|
 | 13 |  ;
 | 
|---|
 | 14 |  D ALL^IBCNS1(DFN,"IBINS")
 | 
|---|
 | 15 |  ;
 | 
|---|
 | 16 |  I '$D(IBINS) D SETLN(" "),SETLN("No Insurance Information")
 | 
|---|
 | 17 |  ;
 | 
|---|
 | 18 |  ;
 | 
|---|
 | 19 |  S IBPOLFN=0 F  S IBPOLFN=$O(IBINS(IBPOLFN)) Q:'IBPOLFN  D
 | 
|---|
 | 20 |  . S IBPOL0=IBINS(IBPOLFN,0),IBPLNFN=$P(IBPOL0,U,18)
 | 
|---|
 | 21 |  . S ^TMP($J,"IBCNS3")=IBPOLFN
 | 
|---|
 | 22 |  . ;
 | 
|---|
 | 23 |  . D GETLN(IBPOL0,DATE)
 | 
|---|
 | 24 |  . I DISPLAY[2 D GETEXT(DFN,IBPOLFN,IBPOL0,DATE) ; display extended
 | 
|---|
 | 25 |  . I DISPLAY[3 D GETCOM(IBPLNFN,$G(IBINS(IBPOLFN,1))) ; display extended 3, comments
 | 
|---|
 | 26 |  ;
 | 
|---|
 | 27 |  S ^TMP($J,"IBCNS3")="" D GETNOTES(DFN)
 | 
|---|
 | 28 |  ;
 | 
|---|
 | 29 |  D PRINT
 | 
|---|
 | 30 |  ;
 | 
|---|
 | 31 | DISPQ K ^TMP($J,"IBCNS3")
 | 
|---|
 | 32 |  Q
 | 
|---|
 | 33 |  ;
 | 
|---|
 | 34 | PRINT ; display compiled array of patient insurance information in ^TMP($J,"IBCNS3")
 | 
|---|
 | 35 |  N IBSUB,IBCOUNT,IBQUIT,IBLEVEL,IBLNX,IBDASH,IBLINE,IBCNTLN S $P(IBDASH,"-",80)="-" S DISPLAY=+$G(DISPLAY)
 | 
|---|
 | 36 |  ;
 | 
|---|
 | 37 |  D HDR S IBSUB="IBCNS3",IBCOUNT=3,IBQUIT=0
 | 
|---|
 | 38 |  ;
 | 
|---|
 | 39 |  S IBLEVEL=0 F  S IBLEVEL=$O(^TMP($J,IBSUB,IBLEVEL)) Q:'IBLEVEL  D  Q:IBQUIT
 | 
|---|
 | 40 |  . S IBCNTLN=+$G(^TMP($J,IBSUB,IBLEVEL))+1
 | 
|---|
 | 41 |  . ;
 | 
|---|
 | 42 |  . I IBCOUNT>10,(IBCNTLN+IBCOUNT)>(IOSL-3) S IBQUIT=$$EOP Q:IBQUIT  D HDR S IBCOUNT=3
 | 
|---|
 | 43 |  . ;
 | 
|---|
 | 44 |  . S IBLNX=0 F  S IBLNX=$O(^TMP($J,IBSUB,IBLEVEL,IBLNX)) Q:'IBLNX  D  Q:IBQUIT
 | 
|---|
 | 45 |  .. ;
 | 
|---|
 | 46 |  .. S IBLINE=$G(^TMP($J,IBSUB,IBLEVEL,IBLNX))
 | 
|---|
 | 47 |  .. ;
 | 
|---|
 | 48 |  .. W !,IBLINE S IBCOUNT=IBCOUNT+1 I IBCOUNT>(IOSL-3) S IBQUIT=$$EOP Q:IBQUIT  W @IOF S IBCOUNT=2
 | 
|---|
 | 49 |  . ;
 | 
|---|
 | 50 |  . I 'IBQUIT,DISPLAY>1 W !,IBDASH S IBCOUNT=IBCOUNT+1
 | 
|---|
 | 51 |  ;
 | 
|---|
 | 52 |  I 'IBQUIT,IBCOUNT>2 S IBQUIT=$$EOP
 | 
|---|
 | 53 |  Q
 | 
|---|
 | 54 |  ;
 | 
|---|
 | 55 | SETLN(LINE) ; set line as next line for current policy
 | 
|---|
 | 56 |  N CNT,POL S LINE=$G(LINE)
 | 
|---|
 | 57 |  S POL=+$G(^TMP($J,"IBCNS3"))
 | 
|---|
 | 58 |  I 'POL S POL=$O(^TMP($J,"IBCNS3","~"),-1)+1 S ^TMP($J,"IBCNS3")=POL
 | 
|---|
 | 59 |  ;
 | 
|---|
 | 60 |  S CNT=+$G(^TMP($J,"IBCNS3",POL))+1
 | 
|---|
 | 61 |  S ^TMP($J,"IBCNS3",POL)=CNT
 | 
|---|
 | 62 |  S ^TMP($J,"IBCNS3",POL,CNT)=LINE
 | 
|---|
 | 63 |  Q
 | 
|---|
 | 64 |  ;
 | 
|---|
 | 65 |  ;
 | 
|---|
 | 66 |  ;
 | 
|---|
 | 67 | GETLN(IBPOL0,IBDATE) ; get single line of primary data on insurance policy
 | 
|---|
 | 68 |  ;     input:   IBPOL0 = line from array, zero node of patient policy (2,.312)
 | 
|---|
 | 69 |  ;              IBDATE = date to check coverage, default today
 | 
|---|
 | 70 |  ;    output:   formatted line of data for insurance policy in TMP($J,"IBCNS")
 | 
|---|
 | 71 |  ;
 | 
|---|
 | 72 |  N IBX,IBLINE S IBLINE=" " S IBPOL0=$G(IBPOL0)
 | 
|---|
 | 73 |  ;
 | 
|---|
 | 74 |  S IBX=$G(^DIC(36,+IBPOL0,0)),IBX=$S($P(IBX,U,1)'="":$P(IBX,U,1),1:"UNKNOWN") S IBLINE=$$FRMLN(IBX,IBLINE,11,0)
 | 
|---|
 | 75 |  S IBX=$P(IBPOL0,U,20),IBX=$S(IBX=1:"p",IBX=2:"s",IBX=3:"t",1:"") S IBLINE=$$FRMLN(IBX,IBLINE,1,14)
 | 
|---|
 | 76 |  S IBX=$P(IBPOL0,U,2) S IBLINE=$$FRMLN(IBX,IBLINE,16,17)
 | 
|---|
 | 77 |  S IBX=$$FNDGRP($P(IBPOL0,U,18)) S IBLINE=$$FRMLN(IBX,IBLINE,10,35)
 | 
|---|
 | 78 |  S IBX=$P(IBPOL0,U,6),IBX=$S(IBX="v":"SELF",IBX="s":"SPOUSE",1:"OTHER") S IBLINE=$$FRMLN(IBX,IBLINE,7,47)
 | 
|---|
 | 79 |  S IBX=$$DAT1^IBOUTL($P(IBPOL0,U,8)) S IBLINE=$$FRMLN(IBX,IBLINE,8,55)
 | 
|---|
 | 80 |  S IBX=$$DAT1^IBOUTL($P(IBPOL0,U,4)) S IBLINE=$$FRMLN(IBX,IBLINE,8,65)
 | 
|---|
 | 81 |  S IBX=$$FNDCOV(+IBPOL0,+$P(IBPOL0,U,18),$G(IBDATE)) S IBLINE=$$FRMLN(IBX,IBLINE,5,75)
 | 
|---|
 | 82 |  ;
 | 
|---|
 | 83 |  D SETLN(IBLINE)
 | 
|---|
 | 84 | GETLNQ Q
 | 
|---|
 | 85 |  ;
 | 
|---|
 | 86 |  ;
 | 
|---|
 | 87 | GETEXT(DFN,IBPOLFN,IBPOL0,DATE) ; display extended insurance information
 | 
|---|
 | 88 |  ; Plan Filing Timeframe, Plan Coverage, Conditional Coverage Comments, and Riders
 | 
|---|
 | 89 |  ;     input:   DFN     = pointer to patient (2)
 | 
|---|
 | 90 |  ;              IBPOLFN = pointer to patient insurance policy in 2.312
 | 
|---|
 | 91 |  ;              IBPOL0  = line from array, zero node of patient policy (2,.312)
 | 
|---|
 | 92 |  ;              DATE    = date to check coverage, default today
 | 
|---|
 | 93 |  ;              DISPARR = array to pass data back in, pass by reference
 | 
|---|
 | 94 |  ;    output:   array of extended data in TMP($J,"IBCNS")
 | 
|---|
 | 95 |  ;
 | 
|---|
 | 96 |  N IBX,IBY,IBZ,IBC,IBINSFN,IBPLNFN,IBPLN0,IBLINE,IBCAT,IBCATFN,IBCOVRD,ARR,ARR1 S:'$G(DATE) DATE=DT
 | 
|---|
 | 97 |  S IBINSFN=+$G(IBPOL0) Q:'IBINSFN  S IBPLNFN=+$P(IBPOL0,U,18),IBPLN0=$G(^IBA(355.3,IBPLNFN,0)) Q:IBPLN0=""
 | 
|---|
 | 98 |  ;
 | 
|---|
 | 99 |  S IBLINE="Last Verified:   ",(IBY,IBX)=""
 | 
|---|
 | 100 |  S IBY=$P($G(^DPT(DFN,.312,IBPOLFN,1)),U,3) I IBY'="" S IBX=$$DAT1^IBOUTL(IBY) S IBLINE=IBLINE_IBX D SETLN(" "),SETLN(IBLINE)
 | 
|---|
 | 101 |  ;
 | 
|---|
 | 102 |  S IBLINE="Plan Filing Time Frame: "
 | 
|---|
 | 103 |  S IBY=$P(IBPLN0,U,13) I IBY'="" S IBLINE=IBLINE_IBY D:IBX="" SETLN(" ") D SETLN(IBLINE)
 | 
|---|
 | 104 |  ;
 | 
|---|
 | 105 |  S IBLINE="Insurance Comp:  "
 | 
|---|
 | 106 |  I $P($G(^DIC(36,IBINSFN,0)),U,2)="N" S IBLINE=IBLINE_"Will Not Reimburse" D SETLN(" "),SETLN(IBLINE)
 | 
|---|
 | 107 |  ;
 | 
|---|
 | 108 |  S IBLINE="Conditional: ",IBCOVRD=""
 | 
|---|
 | 109 |  K ARR F IBCAT="INPATIENT","OUTPATIENT","PHARMACY","MENTAL HEALTH","DENTAL" D
 | 
|---|
 | 110 |  . S IBCATFN=+$O(^IBE(355.31,"B",IBCAT,"")) Q:'IBCATFN
 | 
|---|
 | 111 |  . S IBY=$$PLCOV^IBCNSU3(+IBPLNFN,DATE,IBCATFN,.ARR) Q:IBY'>0
 | 
|---|
 | 112 |  . I IBY=1 S IBCOVRD=$G(IBCOVRD)_IBCAT_", " Q
 | 
|---|
 | 113 |  . S IBX=IBCAT_": ",IBC=$G(IBC)+100 S IBLINE=$$FRMLN(IBX,IBLINE,15,17)
 | 
|---|
 | 114 |  . S IBZ=0 F  S IBZ=$O(ARR(IBZ)) Q:'IBZ  S IBX=ARR(IBZ) D  S IBLINE=""
 | 
|---|
 | 115 |  .. S IBLINE=$$FRMLN(IBX,IBLINE,46,33) S ARR1(IBC+IBZ)=IBLINE
 | 
|---|
 | 116 |  I IBCOVRD'="" S IBLINE="Plan Coverage:   "_$G(IBCOVRD) D SETLN(" "),SETLN(IBLINE)
 | 
|---|
 | 117 |  I $O(ARR1("")) D:IBCOVRD="" SETLN(" ") S IBZ=0 F  S IBZ=$O(ARR1(IBZ)) Q:'IBZ  S IBX=ARR1(IBZ) D SETLN(IBX)
 | 
|---|
 | 118 |  ;
 | 
|---|
 | 119 |  S IBLINE="Policy Riders: "
 | 
|---|
 | 120 |  K ARR D RIDERS^IBCNSU3(+$G(DFN),+$G(IBPOLFN),.ARR) I $O(ARR("")) D SETLN(" ")
 | 
|---|
 | 121 |  S IBZ=0 F  S IBZ=$O(ARR(IBZ)) Q:'IBZ  S IBX=ARR(IBZ) D  S IBLINE=""
 | 
|---|
 | 122 |  . S IBLINE=$$FRMLN(IBX,IBLINE,62,17) D SETLN(IBLINE)
 | 
|---|
 | 123 |  Q
 | 
|---|
 | 124 |  ;
 | 
|---|
 | 125 |  ;
 | 
|---|
 | 126 | GETCOM(IBPLNFN,IBPOL1) ; get patient insurance and plan insurance comments in TMP($J,"IBCNS")
 | 
|---|
 | 127 |  N IBX,IBY
 | 
|---|
 | 128 |  ;
 | 
|---|
 | 129 |  S IBX=$P($G(IBPOL1),U,8) I IBX'="" S IBY="Patient Policy Comments: " D SETLN(" "),SETLN(IBY),SETLN(IBX)
 | 
|---|
 | 130 |  ;
 | 
|---|
 | 131 |  I +$G(IBPLNFN),$O(^IBA(355.3,+IBPLNFN,11,0)) S IBX="Group/Plan Comments:" D SETLN(" "),SETLN(IBX) D
 | 
|---|
 | 132 |  . S IBX=0 F  S IBX=$O(^IBA(355.3,+IBPLNFN,11,IBX)) Q:'IBX  S IBY=$G(^IBA(355.3,+IBPLNFN,11,IBX,0)) D SETLN(IBY)
 | 
|---|
 | 133 |  Q
 | 
|---|
 | 134 |  ;
 | 
|---|
 | 135 |  ;
 | 
|---|
 | 136 | GETNOTES(DFN) ; get final notes/warnings in TMP($J,"IBCNS")
 | 
|---|
 | 137 |  N IBX,IBY,IBLINE1,IBLINE2,IBFND S (IBFND,IBLINE1,IBLINE2)=""  Q:'$G(DFN)
 | 
|---|
 | 138 |  ;
 | 
|---|
 | 139 |  S IBX=+$G(^IBA(354,DFN,60)) I +IBX S IBY="*** Verification of No Coverage "_$$FMTE^XLFDT(IBX)_" ***" S IBLINE1=$$FRMLN(IBY,"",60,16),IBFND=1
 | 
|---|
 | 140 |  I $$BUFFER^IBCNBU1(DFN) S IBY="***  Patient has Insurance Buffer entries  ***" S IBLINE2=$$FRMLN(IBY,"",50,17),IBFND=1
 | 
|---|
 | 141 |  ;
 | 
|---|
 | 142 |  I +IBFND D SETLN(" ") D:IBLINE1'="" SETLN(IBLINE1) D:IBLINE2'="" SETLN(IBLINE2) D SETLN(" ")
 | 
|---|
 | 143 |  ;
 | 
|---|
 | 144 |  Q
 | 
|---|
 | 145 |  ;
 | 
|---|
 | 146 |  ;
 | 
|---|
 | 147 |  ;
 | 
|---|
 | 148 |  ;
 | 
|---|
 | 149 | FRMLN(FIELD,IBLINE,FLNG,COL) ; format line data fields, returns IBLINE with FIELD of length FLNG at column COL
 | 
|---|
 | 150 |  N IBNEW,IBL S FIELD=$G(FIELD),IBLINE=$G(IBLINE),FLNG=$G(FLNG),COL=$G(COL)
 | 
|---|
 | 151 |  ;
 | 
|---|
 | 152 |  S IBNEW=$E(IBLINE,1,COL),IBL=$L(IBNEW),IBNEW=IBNEW_$J("",COL-IBL)
 | 
|---|
 | 153 |  S IBNEW=IBNEW_$E(FIELD,1,FLNG),IBL=$L(FIELD),IBNEW=IBNEW_$J("",FLNG-IBL)
 | 
|---|
 | 154 |  S IBNEW=IBNEW_$E(IBLINE,COL+FLNG+1,9999)
 | 
|---|
 | 155 |  Q IBNEW
 | 
|---|
 | 156 |  ;
 | 
|---|
 | 157 |  ;
 | 
|---|
 | 158 |  ;
 | 
|---|
 | 159 | FNDCOV(IBINSFN,IBPLNFN,IBDATE) ; -- return group/plan coverage limitations indications
 | 
|---|
 | 160 |  ;     input:   IBINSFN = pointer to insurance company entry in 36
 | 
|---|
 | 161 |  ;              IBPLNFN = pointer to insurance plan entry in 355.3
 | 
|---|
 | 162 |  ;              IBDATE  = date to check coverage, default today
 | 
|---|
 | 163 |  ;    output:   if insurance company will not reimburse = WNR, if all covered then returns null
 | 
|---|
 | 164 |  ;              otherwise list of first characters of types covered, if conditional then character in lower case
 | 
|---|
 | 165 |  ;              
 | 
|---|
 | 166 |  N IBOUT,IBX,IBY,IBCAT,IBCATFN S IBOUT="" S:'$G(IBDATE) IBDATE=DT I '$G(IBINSFN)!'$G(IBPLNFN) G FNDCOVQ
 | 
|---|
 | 167 |  ;
 | 
|---|
 | 168 |  I $P($G(^DIC(36,+IBINSFN,0)),U,2)="N" S IBOUT="*WNR*" G FNDCOVQ
 | 
|---|
 | 169 |  F IBCAT="INPATIENT","OUTPATIENT","PHARMACY","MENTAL HEALTH","DENTAL" D
 | 
|---|
 | 170 |  . S IBCATFN=+$O(^IBE(355.31,"B",IBCAT,"")) Q:'IBCATFN
 | 
|---|
 | 171 |  . S IBY=$$PLCOV^IBCNSU3(+IBPLNFN,IBDATE,+IBCATFN) Q:'IBY
 | 
|---|
 | 172 |  . S IBX=$S(IBCAT="PHARMACY":"R",1:$E(IBCAT)) S:IBY>1 IBX=$C($A(IBX)+32) S IBOUT=IBOUT_IBX
 | 
|---|
 | 173 |  S:IBOUT="" IBOUT="no CV" I IBOUT?5U S IBOUT=""
 | 
|---|
 | 174 | FNDCOVQ Q IBOUT
 | 
|---|
 | 175 |  ;
 | 
|---|
 | 176 |  ;
 | 
|---|
 | 177 | FNDGRP(IBPLNFN) ; -- return group name/group policy
 | 
|---|
 | 178 |  ;     input:   IBPLNFN = pointer to insurance plan entry in 355.3
 | 
|---|
 | 179 |  ;    output:   group name or group number, if both group NUMBER, check for Individual plans
 | 
|---|
 | 180 |  ;
 | 
|---|
 | 181 |  N IBX,IBOUT S IBOUT=""
 | 
|---|
 | 182 |  S IBX=$G(^IBA(355.3,+$G(IBPLNFN),0))
 | 
|---|
 | 183 |  S IBOUT=$S($P(IBX,U,4)'="":$P(IBX,U,4),1:$P(IBX,U,3))
 | 
|---|
 | 184 |  I $P(IBX,U,10) S IBOUT="Ind. Plan "_IBOUT
 | 
|---|
 | 185 | FNDGRPQ Q IBOUT
 | 
|---|
 | 186 |  ;
 | 
|---|
 | 187 |  ;
 | 
|---|
 | 188 |  ;
 | 
|---|
 | 189 |  ;
 | 
|---|
 | 190 | HDR ; -- print header
 | 
|---|
 | 191 |  N IBX W @IOF
 | 
|---|
 | 192 |  W !,"Insurance",?13,"COB",?17,"Subscriber ID",?35,"Group",?47,"Holder",?55,"Effectve",?65,"Expires",?75,"Only"
 | 
|---|
 | 193 |  S IBX="",$P(IBX,"=",80)="=" W !,IBX
 | 
|---|
 | 194 |  Q
 | 
|---|
 | 195 |  ;
 | 
|---|
 | 196 | EOP() ; ask user for return at end of page, return 1 if '^' entered
 | 
|---|
 | 197 |  N IBQ,DIR,DIRUT,DUOUT,DTOUT,X,Y W ! S IBQ=0,DIR(0)="E" D ^DIR K DIR I $D(DUOUT)!($D(DIRUT)) S IBQ=1
 | 
|---|
 | 198 |  Q IBQ
 | 
|---|