IBCNSJ53 ;AITC/DTG - INSURANCE PLAN MAINTENANCE ACTION VIEW SUBSCRIBER ; 15-MAY-2023
 ;;2.0;INTEGRATED BILLING;**763,771,778,804**;21-MAR-94;Build 6
 ;;Per VA Directive 6402, this routine should not be modified.
 ;
 ;
VP ; -- Edit/View Plan  (VS entry point)
 D FULL^VALM1
 D EN^VALM("IBCNSC PLAN VIEW SUBSCRIBERS")
 S VALMBCK="R",VALMBG=1
 Q
 ;
VSUBS ; entry from list template protocol 'IBCNSJ PLAN VIEW SUBSCRIBERS' from the 'IBCNSC PLAN DETAIL' menu
 ;
 N DIR,FIEN,FTF,FTFV,IBA,IBB,IBC,IBD,IBDOB,IBDTCK,IBE,IBEFFDT,IBERR,IBEXPDT,IBF
 N IBIND,IBINS0,IBNAM,IBPTDFN,IBPTHOLD,IBPTINS,NUM
 N ST,X,XX,X0,X11,Y,Z
 ; clear working array
 S IBTMP="^TMP(""IBCNSJ53I"",$J)"
 K @IBTMP
 S (IBCST,IBACCT,IBINACCT,LENEP,LENPT)=0
 ;set insurance CO. info
 ;
 S X0=$G(^DIC(36,IB36,0))
 S X11=$G(^DIC(36,IB36,.11))
 S Z=$P(X11,"^",6)
 S ST=$S($P(X11,"^",5):$P($G(^DIC(5,$P(X11,"^",5),0)),"^",2),1:"")
 S XX=$S($P(X0,"^",5):"*",1:"")
 S X=XX_$E($P(X0,"^",1),1,30)
 S $P(X,"^",2)=$P(X11,"^",1)
 S $P(X,"^",3)=$P(X11,"^",4) S:$P(X,U,3)'="" $P(X,U,3)=$P(X,U,3)_","
 S $P(X,"^",4)=$G(ST)
 S $P(X,"^",5)=$E(Z,1,5)
 S $P(X,"^",6)=""
 S $P(X,U,7)=$P(X,U,3)_" "_$P(X,U,4)_" "_$P(X,U,5)
 ; Insurance Company name (first 30 chars) with leading '*' if inactive ^ Street Address Line 1
 ; ^ City ^ ST ^ ZIP ^
 S @IBTMP@(1)=X
 ;set plan info
 ;            A1 - Group Plan Number (leading '*' if Inactive)
 ;            A2 - Group Plan Name   (leading '+' if Individual)
 ;            A3 - 
 ;            A4 - Electronic Plan Type (max length 26)
 ;            A5 - Type of Plan (max length 34)
 ;
 N IBFL1,IBFL2,NAME,NUM,XX,ZZ
 S NUM=$$GET1^DIQ(355.3,IB3553,2.02)
 S:NUM="" NUM="<NO GROUP NUMBER>"
 S XX=$$GET1^DIQ(355.3,IB3553,.02,"I")     ; Group or Individual Plan
 S IBFL1=$S(XX=1:"",1:"+")
 S ZZ=$$GET1^DIQ(355.3,IB3553,.11,"I")     ; Inactive Flag
 S IBFL2=$S(ZZ=1:"*",1:"")
 S $P(XX,"^",1)=IBFL2_NUM                     ; Add Inactive/Individual flags
 S NAME=$$GET1^DIQ(355.3,IB3553,2.01)
 S:NAME="" NAME="<NO GROUP NAME>"
 S $P(XX,"^",2)=IBFL1_NAME                       ; Group Name
 S $P(XX,"^",3)=""
 S ZZ=$$GET1^DIQ(355.3,IB3553_",",.15)       ; Electronic Plan Type
 S:$L(ZZ)>$G(LENEP) LENEP=$L(ZZ)               ; Maximum Electronic Plan length
 S $P(XX,"^",4)=ZZ
 S ZZ=$$GET1^DIQ(355.3,IB3553_",",.09)       ; Type of Plan
 S:$L(ZZ)>34 ZZ=$E(ZZ,1,34)
 S:$L(ZZ)>$G(LENEP) LENEP=$L(ZZ)               ; Maximum Plan Type length
 S $P(XX,"^",5)=ZZ
 ; plan info
 S @IBTMP@(2)=XX
 S IBINS0=$G(^IBA(355.3,+IB3553,0))
 ; get plan subscribers
 ;IB*804/DTG add sort to view subscribers
 ;F IBA=3,4,5 K @IBTMP@(IBA)
 F IBA=3,4,5,9,10,11 K @IBTMP@(IBA)
 ;
 S IBPTDFN=0
 F  S IBPTDFN=$O(^DPT("AB",IB36,IBPTDFN)) Q:'IBPTDFN  S IBPTINS=0 D
 .F  S IBPTINS=$O(^DPT("AB",IB36,IBPTDFN,IBPTINS)) Q:'IBPTINS  D
 ..S IBA=$$GET1^DIQ(2.312,IBPTINS_","_IBPTDFN_",",.18,"I") I IBA=IB3553 D
 ...S IBIND=$$ZND^IBCNS1(IBPTDFN,IBPTINS)
 ...S IBCST=IBCST+1
 ...S X=$$PT^IBEFUNC(IBPTDFN)
 ...S IBNAM=$E($P(X,"^",1),1,22)               ; Patient's Name (22 chars)
 ...S:IBNAM="" IBNAM="<Pt. "_IBPTDFN_" Name Missing>"
 ...S IBPTHOLD=IBNAM
 ...; Retrieve last 4 of SSN (last 5 if pseudo SSN)
 ...S XX=$$GET1^DIQ(2,IBPTDFN_",",.09,"I")         ; Patient's SSN
 ...S XX=$S($E(XX,$L(XX))="P":$E(XX,$L(XX)-4,$L(XX)),1:$E(XX,$L(XX)-3,$L(XX)))
 ...S $P(IBPTHOLD,"^",2)=XX
 ...S IBDOB=$$GET1^DIQ(2,IBPTDFN_",",.03,"I"),XX=$$DTC(IBDOB)         ; Patient's DOB
 ...S $P(IBPTHOLD,"^",3)=XX
 ...S XX=$$DTC5(IBDOB),$P(IBPTHOLD,"^",12)=XX  ;IB*804/DTG add in the 5 digit date for sort
 ...S XX=$P(IBIND,"^",2),XX=$S(XX'="":XX,1:"<NO SUBS ID>")
 ...S $P(IBPTHOLD,"^",4)=XX                         ; Subscriber ID (20 chars max)
 ...S IBEFFDT=$P(IBIND,"^",8),XX=$$DTC(IBEFFDT)   ; Effective Date
 ...S $P(IBPTHOLD,"^",5)=XX
 ...S XX=$$DTC5(IBEFFDT),$P(IBPTHOLD,"^",13)=XX  ;IB*804/DTG add in the 5 digit date for sort
 ...S IBEXPDT=$P(IBIND,"^",4),XX=$$DTC(IBEXPDT)   ; Expiration Date
 ...S $P(IBPTHOLD,"^",6)=XX
 ...S XX=$$DTC5(IBEXPDT),$P(IBPTHOLD,"^",14)=XX  ;IB*804/DTG add in the 5 digit date for sort
 ...; Whose Insurance?
 ...S XX=$P(IBIND,"^",6),XX=$S(XX="v":"VET",XX="s":"SPO",XX="o":"OTH",1:"UNK")
 ...S $P(IBPTHOLD,"^",7)=XX
 ...S XX=$$GET1^DIQ(2.312,IBPTINS_","_IBPTDFN_",",5.01,"I")  ; Patient ID
 ...S $P(IBPTHOLD,"^",8)=XX
 ...; IB*778/DTG removed code for unused variable LENPID
 ...;active or inactive
 ...S (IBACT,IBINACT)=0 D  S $P(IBPTHOLD,U,9)=IBACT,$P(IBPTHOLD,U,10)=IBINACT
 ....;
 ....I 'IBEFFDT!($P(IBPTHOLD,U,5)="") S IBINACT=1 Q  ; if not a valid effective date count inactive
 ....;
 ....I (IBEXPDT'=""&($P(IBPTHOLD,U,6)'="")) D  Q  ; if there is a valid expiration date
 .....;
 .....I IBEXPDT<DT S IBINACT=1 Q  ; if the expiration date is less than today count inactive
 .....;
 .....S IBACT=1  ; otherwise count active
 ....;
 ....I (IBEFFDT&($P(IBPTHOLD,U,5)'="")&(IBEFFDT>DT)) S IBINACT=1 Q  ; if a valid effective date and the date is greater than today count inactive
 ....;
 ....S IBACT=1  ; otherwise count active
 ....;
 ...S IBACCT=IBACCT+IBACT,IBINACCT=IBINACCT+IBINACT
 ...;
 ...;end active or inactive
 ...;
 ...; 3=ALL, 4=ACTIVE, 5=INACTIVE
 ...; Patient's Name (22 chars) ^ Patient's SSN ^ Patient's DOB ^ Subscriber ID (20 chars max)
 ...; ^ Effective Date ^ Expiration Date ^ Whose Insurance? ^ Patient ID ^ ACTIVE ^ INACTIVE ^^ 4 digit DOB year
 ...; ^ 4 digit eff dt year ^ 4 digit exp dt year 
 ...; IB*804/DTG add sort to view subscribers
 ...;S @IBTMP@(3,IB3553,IBNAM_"@@"_IBPTDFN_"@@"_IBPTINS)=IBPTHOLD
 ...;S @IBTMP@(($S(IBACT=1:4,1:5)),IB3553,IBNAM_"@@"_IBPTDFN_"@@"_IBPTINS)=IBPTHOLD
 ...S @IBTMP@(9,IB3553,IBNAM_"@@"_IBPTDFN_"@@"_IBPTINS)=IBPTHOLD
 ...S @IBTMP@(($S(IBACT=1:10,1:11)),IB3553,IBNAM_"@@"_IBPTDFN_"@@"_IBPTINS)=IBPTHOLD
 ...; total ^ active ^ inactive
 ...S @IBTMP@(0)=+IBCST_U_+IBACCT_U_+IBINACCT
 ;
 ;IB*804/DTG add sort to view subscribers
 ; base set of values
 D IBASE
 ;
VSUBX ; quit back
 ;
 Q
DTC(IBDTCK) ; check date return external if valid
 ;
 N IBDT,IBBK S IBDT=""
 I 'IBDTCK G DTCO
 S IBDT=$$FMTE^XLFDT(IBDTCK,"2DZ")
 ;
 G DTCO
 ;
DTCO ; date check exit
 ;
 Q IBDT
 ;
DTC5(IBDTCK) ; check date return external if valid ;IB*804/DTG 4 digit year for sort's
 ;
 N IBDT,IBBK S IBDT=""
 I 'IBDTCK G DTCO
 S IBDT=$$FMTE^XLFDT(IBDTCK,"5DZ")
 ;
 G DTC5O
 ;
DTC5O ; date check exit
 ;
 Q IBDT
 ;
EXIT ; -- exit code
 K VALMBCK,^TMP("IBCNSJ53",$J),^TMP("IBCNSJ53I",$J),IBVPCLBG,IBVPCLEN
 D CLEAN^VALM10,CLEAR^VALM1
 S VALMBCK="R",VALMBG=1
 Q
 ;
HELP ; -- help code
 ;
 I $G(VALMANS)="??" S X="?" D DISP^XQORM1 W !! Q
 D FULL^VALM1
 N DIR,X,Y
 W !
 W !," Enter AC to only see active subscribers."
 W !," Enter IN to only see inactive subscribers."
 ; IB*804/DTG add sort to view subscribers
 ;W !," Enter VA to see all subscribers.",!
 W !," Enter VA to see all subscribers."
 W !," Enter ST to sort the subscriber records",!
 S DIR(0)="E",DIR("A")="Press <Enter> to return to View Subscribers"
 D ^DIR
 K DIR,X,Y
 S VALMBCK="R"
 Q
 ;
INIT ; -- Load the plan detail segments
 ;
 K ^TMP("IBCNSJ53",$J)
 S VALMBG=1,(IBLCNT,VALMCNT)=0
 S IB36=+$G(IBCNS),IB3553=+$G(IBCPOL)
 S IBTMP="^TMP(""IBCNSJ53I"",$J)",(IBCST,IBACCT,IBINACCT,LENEP,LENPT)=0
 S (IBOSRT,IBSORTA)=0,IBSACT=3  ;IB*804/DTG add sort to view subscribers. default sort type is all
 K @IBTMP
 D NOW^%DTC
 S IBHDT=$$DAT2^IBOUTL($E(%,1,12))
 S IBSPACE="",$P(IBSPACE," ",80)=""
 I IB36<1!(IB3553<1) D  Q
 . W !!,*7,"Missing Insurance or Plan IEN."
 ;
 D KILL^VALM10()
 ;
 D VSUBS
 ;
 D BVA
 S VALMBCK="R",VALMBG=1
 Q
 ;
ACINI ; active subscribers
 ;
 S IBSORTA="",IBSACT=4 D IBASE  ; IB*804/DTG VS sort
 D FULL^VALM1
 D HDR("Active")
 D AC
 S VALMBCK="R",VALMBG=1
 Q
 ;
ININI ; inactive subscribers
 ;
 S IBSORTA="",IBSACT=5 D IBASE  ; IB*804/DTG VS sort
 D FULL^VALM1
 D HDR("Inactive")
 D IS
 S VALMBCK="R",VALMBG=1
 Q
 ;
ALLINI ; all subscribers
 ;
 S IBSORTA="",IBSACT=3 D IBASE  ; IB*804/DTG VS sort
 D FULL^VALM1
 D HDR("All")
 D BVA
 S VALMBCK="R",VALMBG=1
 Q
 ;
HDR(IBDIS) ; -- Plan Subscribers
 ;
 N IBA,IBB,IBC,IBD,IBE,IBF1,IBF2,IBL,IB1,IB2,IB3
 S (IB1,IB2,IB3)=""
 S IBA=$G(^TMP("IBCNSJ53I",$J,1)),IBB=$G(^TMP("IBCNSJ53I",$J,2)),IBC=$G(^TMP("IBCNSJ53I",$J,0))
 S IBF2=$E($P(IBB,U,2))
 S IBF1=$E($P(IBB,U,1))
 S IBDIS=$G(IBDIS),IBDIS=$S(IBDIS'="":IBDIS,1:"All")
 S VALM("TITLE")=IBDIS_" Subscribers"
 ;
 S IB1=$E($P(IBA,U,1),1,30) ; ins co name
 ; IB*804/DTG include sorts in view subscriber
 N IB5,IBLA S (IB5,IBLA)=""
 I '$G(IBSORTA) S IB5="Sort by: NAME"  ;IB*804/DTG added in for sort type if none chosen
 I $G(IBSORTA) S IB5="Sort by: "_$S(IBSORTA=1:"NAME",IBSORTA=2:"DOB",IBSORTA=3:"EFF DATE",IBSORTA=4:"EXP DATE",1:"")
 ;S IBL=(30-$L(IB1))+30,IB2=$E(IBSPACE,1,IBL)
 S IBL=(35-$L(IB1)),IBLA=(25-$L(IB5)),IB2=$E(IBSPACE,1,IBL)_IB5_$E(IBSPACE,1,IBLA)
 ;
 S IB3="TOTAL SUB: "_($E(IBSPACE,1,(8-($L(+$P(IBC,U,1))))))_(+$P(IBC,U,1))
 S VALMHDR(1)=IB1_IB2_IB3
 ;
 S IB1=$E($P(IBA,U,2),1,35)  ; ins addr
 S IBE=$E($P(IBB,U,2),1,(21+($S(IBF2="+":1,1:0))))
 S IBL=(35-$L(IB1))+(1+($S(IBF2="+":0,1:1)))
 S IB2=$E(IBSPACE,1,IBL)_IBE ; group name
 S IBL=(($S(IBF2="+":22,1:21))-$L(IBE))+1
 S IB3=$E(IBSPACE,1,IBL)_"ACTIVE SUB: "_($E(IBSPACE,1,(8-($L(+$P(IBC,U,2))))))_(+$P(IBC,U,2))
 S VALMHDR(2)=IB1_IB2_IB3
 ;
 S IB1=$E($P(IBA,U,7),1,35)  ; city, state zip
 S IBE=$E($P(IBB,U,1),1,(19+($S(IBF1="*":1,1:0))))
 S IBL=(35-($L(IB1))+(1+($S(IBF1="*":0,1:1))))
 S IB2=$E(IBSPACE,1,IBL)_IBE  ; group number
 S IBL=(($S(IBF1="*":20,1:19))-$L(IBE))+1
 S IB3=$E(IBSPACE,1,IBL)_"INACTIVE SUB: "_($E(IBSPACE,1,(8-($L(+$P(IBC,U,3))))))_(+$P(IBC,U,3))
 S VALMHDR(3)=IB1_IB2_IB3
 ;
 Q
 ;
BVA ; Build ALL subscribers
 ;
 N IBLINE,IBTMP1,IBF
 ;IB*804/DTG chage array for sort
 ;S IBTMP1="^TMP(""IBCNSJ53I"",$J,3,"_IB3553_")"
 S IBTMP1="^TMP(""IBCNSJ53I"",$J,3)"
 S VALMCNT=0,VALMBG=1,IBLINE=0
 K @VALMAR
 S IBF=$G(^TMP("IBCNSJ53I",$J,0))
 I '+IBF D  Q  ; IB*771/DTG put none found back in display
 . S VALMCNT=2,@VALMAR@(1,0)=" "
 . S @VALMAR@(2,0)=" ***Group Contains No Subscribers***"
 ; go through the 3 level
 D BPAS
 Q
 ;
BPAS ; build items from base into valm display
 ;
 N IBA,IBB,IBC,IBD,IBE,IBNM,IBDFN,IBNODE,X
 ;S IBA="",X="" F  S IBA=$O(@IBTMP1@(IBA)) Q:IBA=""  D
 ; IB*804/DTG include sorts in view subscriber Change from a single dot '.' level to three dot '.' levels
 ;S IBA="",X="" F  S IBA=$O(@IBTMP1@(IBA)) Q:IBA=""  D
 N IBCNTR,IBG
 S IBCNTR="" F  S IBCNTR=$O(@IBTMP1@(IBCNTR)) Q:IBCNTR=""  S IBG="" D
 . F  S IBG=$O(@IBTMP1@(IBCNTR,IBG)) Q:IBG=""  S IBA="",X="" D
 .. F  S IBA=$O(@IBTMP1@(IBCNTR,IBG,IBA)) Q:IBA=""  D
 ... S IBNM=$P(IBA,"@@",1),IBDFN=$P(IBA,"@@",2),IBNODE=$P(IBA,"@@",3)
 ... S VALMCNT=VALMCNT+1,IBC=@IBTMP1@(IBCNTR,IBG,IBA),X="",IBLINE=IBLINE+1
 ... S X=$$SETFLD^VALM1($P(IBC,"^",1),X,"SNAME")
 ... S X=$$SETFLD^VALM1($P(IBC,"^",2),X,"SSN4")
 ... S X=$$SETFLD^VALM1($P(IBC,U,3),X,"DOB10")
 ... S X=$$SETFLD^VALM1($P(IBC,"^",4),X,"SUBID")
 ... S X=$$SETFLD^VALM1($P(IBC,U,5),X,"EFFDT")
 ... S X=$$SETFLD^VALM1($P(IBC,U,6),X,"EXPDT")
 ... S X=$$SETFLD^VALM1($P(IBC,"^",7),X,"WHO")
 ... S X=$$SETFLD^VALM1($P(IBC,"^",8),X,"PATID")
 ... S IBD=$P(IBC,U,9),X=$$SETFLD^VALM1($S(IBD=1:"Y",1:""),X,"ACT")
 ... S @VALMAR@(VALMCNT,0)=X
 Q
 ;
AC ; active subscriber entry
 ;
 N IBLINE,IBTMP1,IBF
 ;IB*804/DTG chage array for sort
 ;S IBTMP1="^TMP(""IBCNSJ53I"",$J,4,"_IB3553_")"
 S IBTMP1="^TMP(""IBCNSJ53I"",$J,4)"
 S VALMCNT=0,VALMBG=1,IBLINE=0
 K @VALMAR
 S IBF=$G(^TMP("IBCNSJ53I",$J,0))
 I '+$P(IBF,U,2) D  Q
 . S VALMCNT=2,@VALMAR@(1,0)=" "
 . S @VALMAR@(2,0)=" ***Group Contains No Active Subscribers***"
 ; go through the 4 level
 D BPAS
 Q
 ;
IS ; inactive subscriber entry
 ;
 N IBLINE,IBTMP1,IBF
 ;IB*804/DTG chage array for sort
 ;S IBTMP1="^TMP(""IBCNSJ53I"",$J,5,"_IB3553_")"
 S IBTMP1="^TMP(""IBCNSJ53I"",$J,5)"
 S VALMCNT=0,VALMBG=1,IBLINE=0
 K @VALMAR
 S IBF=$G(^TMP("IBCNSJ53I",$J,0))
 I '+$P(IBF,U,3) D  Q
 . S VALMCNT=2,@VALMAR@(1,0)=" "
 . S @VALMAR@(2,0)=" ***Group Contains No Inactive Subscribers***"
 ; go through the 5 level
 D BPAS
 Q
 ;
 ;IB*804/DTG new for sort SORT - IBASE
SORT ; ask sort questions if sort selected then re-build ^TMP("IBCNSJ53I",$J,
 ;
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,IBJ,IBQUIT,IBSRF,IBSRNM,IBWORK,X,Y
 S IBQUIT=0
 D FULL^VALM1
 S IBSACT=$G(IBSACT) I IBSACT<3 S IBSACT=3
 S IBOSRT=IBSORTA
 K DIR S DIR(0)="S^1:Subscriber Name;2:Date of Birth;3:Effective Date;4:Expiration Date"
 S DIR("A")="SELECT 1, 2, 3, or 4"
 S DIR("?")="Select a sort method or Enter '^' to quit"
 S DIR("B")=$S(IBOSRT=2:"Date of Birth",IBOSRT=3:"Effective Date",IBOSRT=4:"Expiration Date",1:"Subscriber Name")
 D ^DIR
 I $E(Y)=U!$D(DIROUT)!$D(DIRUT)!$D(DTOUT)!$D(DUOUT) S Y="^"
 I $E(Y)=U S IBQUIT=1 G SORTQ
 S IBSORTA=+Y I Y<1 S IBQUIT=1 G SORTQ
 I IBSORTA=1 D IBSRTNM G SORTQ
 S IBJ=$S(IBSORTA=2:"Date of Birth",IBSORTA=3:"Effective Date",IBSORTA=4:"Expiration Date",1:"")
 I IBJ="" S IBQUIT=1 G SORTQ
 S Y=$$IBSRQU(IBJ,"",0)
 I $E(Y)=U!(Y="") S IBQUIT=1 G SORTQ
 D IBSRTCOM(IBSORTA,IBWORK) G SORTQ
 ;
SORTQ ; sort exit point
 ;
 I IBQUIT S IBSORTA=IBOSRT I 'IBSORTA D IBASE
 D FULL^VALM1
 ; update header and build output array for SHOW^VALM
 I $G(IBSACT)=3 D HDR("All"),BVA
 I $G(IBSACT)=4 D HDR("Active"),AC
 I $G(IBSACT)=5 D HDR("Inactive"),IS
 S VALMBCK="R",VALMBG=1
 Q
 ;
IBSRTNM ; subscriber name sort type and order
 ;
 N X,Y
 S Y=$$IBSRQU("Subscriber Name","",0)
 I $E(Y)=U!(Y="") S IBQUIT=1 Q
 D IBSRTCOM(IBSORTA,IBWORK)
 Q
 ;
 ;
IBSRQU(IBSRNM,IBSRF,IBSRR) ; get the type
 ;
 ; IBSRNM - sort name
 ;  IBSRF - default response "" =none, 1 =Ascending, 2 =Descending
 ;  IBSRR - required response 0 or "" =no, 1 =yes
 ;
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,IBQUIT,X,Y
 K DIR S IBSRF=$G(IBSRF)
 S DIR(0)="S"_($S(+IBSRR:"",1:"O"))_"^1:Ascending "_IBSRNM_";2:Descending "_IBSRNM
 I IBSRF'="" S DIR("B")=IBSRF
 S DIR("A")="SELECT 1 or 2"
 S DIR("?")="Select Ascending or Descending "_IBSRNM_" or Enter '^' to quit"
 D ^DIR
 I Y=""&(IBSRF'="") S Y=IBSRF
 I $E(Y)=U!$D(DIROUT)!$D(DIRUT)!$D(DTOUT)!$D(DUOUT) S Y="^"
 S IBWORK=""
 S IBWORK=$S(+Y=2:"-1",1:"1")
 Q Y
 ;
IBSRTCOM(IBSORTA,IBWORK) ; go thru the compiled and sort for display
 ;
 ; IBSORTA - Sort Type
 ; IBWORK  - Sort Order
 ;
 ; 3=ALL-9, 4=ACTIVE-10, 5=INACTIVE-11
 ; Patient's Name (22 chars) ^ Patient's SSN ^ Patient's DOB ^ Subscriber ID (20 chars max)
 ; ^ Effective Date ^ Expiration Date ^ Whose Insurance? ^ Patient ID ^ ACTIVE ^ INACTIVE ^^ 4 digit DOB year
 ; ^ 4 digit eff dt year ^ 4 digit exp dt year
 N IBA,IBC,IBD,IBE,IBF,IBI,IBJ,IBK
 I IBSORTA="" Q  ; sort not picked
 ;         1         Subscriber Name
 ;         2         Date of Birth
 ;         3         Effective Date
 ;         4         Expiration Date
 ;
 ; cycle through all, active, inactive
 S IBI=IBSACT K ^TMP("IBCNSJ53I",$J,IBI)
 ; to save time only clear and sort for the current display
 S IBI=(IBSACT+6) K ^TMP("IBCNSJ53I",$J,"TEMP"),^TMP("IBCNSJ53I",$J,"TEMPA")
 S IBA=""  F  S IBA=$O(^TMP("IBCNSJ53I",$J,IBI,IBA)) D:IBA="" IBSRTMV Q:IBA=""  D
 . S IBB="" F  S IBB=$O(^TMP("IBCNSJ53I",$J,IBI,IBA,IBB)) Q:IBB=""  D
 .. S IBC=$G(^TMP("IBCNSJ53I",$J,IBI,IBA,IBB)),(IBD,IBJ)=""
 .. I IBSORTA=1 S IBD=$P(IBC,U,1) S:IBD="" IBD=" " D IBSV Q
 .. I IBSORTA=2!(IBSORTA=3)!(IBSORTA=4) S IBD="",IBK=$S(IBSORTA=2:12,IBSORTA=3:13,IBSORTA=4:14,1:"") D
 ... S:IBK IBD=$P(IBC,U,IBK) S IBJ=""
 ... D DT^DILF(,IBD,.IBJ) S IBD=$G(IBJ) S:IBD="" IBD=" " S:IBD="-1" IBD="  "
 ... I $E(IBD)'=" " D IBSV Q
 ... I $E(IBD)=" " D IBSVA Q
 ;
 K ^TMP("IBCNSJ53I",$J,"TEMP"),^TMP("IBCNSJ53I",$J,"TEMPA")
 Q
 ;
IBSV ; save in selected item order to temp area
 ;
 S ^TMP("IBCNSJ53I",$J,"TEMP",IBD,IBA,IBB)=IBC
 Q
 ;
IBSVA ; save invalid dates in selected item order to temp area
 ;
 S ^TMP("IBCNSJ53I",$J,"TEMP",IBD,IBA,IBB)=IBC
 Q
 ;
IBSRTMV ; move from temp and place in viewing order
 ;
 N IBCT,IBG,IBH,IBK,IBJ
 S IBK=$S(IBWORK="-1":"ZZZZZ",1:""),IBCT=0
 I IBWORK'="-1" D IBSRTA
 F  S IBK=$O(^TMP("IBCNSJ53I",$J,"TEMP",IBK),IBWORK) Q:IBK=""  D
 . I $E(IBK)=" " Q
 . S IBG=$S(IBWORK="-1":"ZZZZZ",1:"")
 . F  S IBG=$O(^TMP("IBCNSJ53I",$J,"TEMP",IBK,IBG),IBWORK) Q:IBG=""  D
 .. S IBH=$S(IBWORK="-1":"ZZZZZ",1:"")
 .. F  S IBH=$O(^TMP("IBCNSJ53I",$J,"TEMP",IBK,IBG,IBH),IBWORK) Q:IBH=""  D
 ... S IBJ=$G(^TMP("IBCNSJ53I",$J,"TEMP",IBK,IBG,IBH))
 ... S IBCT=IBCT+1,^TMP("IBCNSJ53I",$J,(IBI-6),IBCT,IBG,IBH)=IBJ
 I IBWORK="-1" D IBSRTA
 Q
 ;
IBSRTA ; pick up blank and bad date items
 ;
 N IBA,IBB,IBC,IBD,IBE
 I IBWORK'="-1" D
 . F IBA=" ","  " D IBSRTA1
 I IBWORK="-1" D
 . F IBA="  "," " D IBSRTA1
 Q
 ;
IBSRTA1 ; loop through bad/blank dates
 ;
 S IBB=$S(IBWORK="-1":"ZZZZZ",1:"")
 F  S IBB=$O(^TMP("IBCNSJ53I",$J,"TEMP",IBA,IBB),IBWORK) Q:IBB=""  D
 . S IBC=$S(IBWORK="-1":"ZZZZZ",1:"")
 . F  S IBC=$O(^TMP("IBCNSJ53I",$J,"TEMP",IBA,IBB,IBC),IBWORK) Q:IBC=""  D
 .. S IBD=$G(^TMP("IBCNSJ53I",$J,"TEMP",IBA,IBB,IBC))
 .. S IBCT=IBCT+1,^TMP("IBCNSJ53I",$J,(IBI-6),IBCT,IBB,IBC)=IBD
 Q
 ;
IBASE ; reset levels to base
 ;
 ;IB*804/DTG add sort to view subscribers
 ; base set of values
 N IBA,IBB,IBC,IBCNT,IBD,IBI
 F IBA=3,4,5 K ^TMP("IBCNSJ53I",$J,IBA)
 F IBI=9,10,11 S IBA="",IBCNT=0 F  S IBA=$O(^TMP("IBCNSJ53I",$J,IBI,IBA)) Q:IBA=""  S IBB="" D
 . F  S IBB=$O(^TMP("IBCNSJ53I",$J,IBI,IBA,IBB)) Q:IBB=""  D
 .. S IBD=^TMP("IBCNSJ53I",$J,IBI,IBA,IBB),IBCNT=IBCNT+1
 .. S ^TMP("IBCNSJ53I",$J,(IBI-6),IBCNT,IBA,IBB)=IBD
 ;
 Q
 ;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBCNSJ53   17749     printed  Sep 23, 2025@19:53:37                                                                                                                                                                                                   Page 2
IBCNSJ53  ;AITC/DTG - INSURANCE PLAN MAINTENANCE ACTION VIEW SUBSCRIBER ; 15-MAY-2023
 +1       ;;2.0;INTEGRATED BILLING;**763,771,778,804**;21-MAR-94;Build 6
 +2       ;;Per VA Directive 6402, this routine should not be modified.
 +3       ;
 +4       ;
VP        ; -- Edit/View Plan  (VS entry point)
 +1        DO FULL^VALM1
 +2        DO EN^VALM("IBCNSC PLAN VIEW SUBSCRIBERS")
 +3        SET VALMBCK="R"
           SET VALMBG=1
 +4        QUIT 
 +5       ;
VSUBS     ; entry from list template protocol 'IBCNSJ PLAN VIEW SUBSCRIBERS' from the 'IBCNSC PLAN DETAIL' menu
 +1       ;
 +2        NEW DIR,FIEN,FTF,FTFV,IBA,IBB,IBC,IBD,IBDOB,IBDTCK,IBE,IBEFFDT,IBERR,IBEXPDT,IBF
 +3        NEW IBIND,IBINS0,IBNAM,IBPTDFN,IBPTHOLD,IBPTINS,NUM
 +4        NEW ST,X,XX,X0,X11,Y,Z
 +5       ; clear working array
 +6        SET IBTMP="^TMP(""IBCNSJ53I"",$J)"
 +7        KILL @IBTMP
 +8        SET (IBCST,IBACCT,IBINACCT,LENEP,LENPT)=0
 +9       ;set insurance CO. info
 +10      ;
 +11       SET X0=$GET(^DIC(36,IB36,0))
 +12       SET X11=$GET(^DIC(36,IB36,.11))
 +13       SET Z=$PIECE(X11,"^",6)
 +14       SET ST=$SELECT($PIECE(X11,"^",5):$PIECE($GET(^DIC(5,$PIECE(X11,"^",5),0)),"^",2),1:"")
 +15       SET XX=$SELECT($PIECE(X0,"^",5):"*",1:"")
 +16       SET X=XX_$EXTRACT($PIECE(X0,"^",1),1,30)
 +17       SET $PIECE(X,"^",2)=$PIECE(X11,"^",1)
 +18       SET $PIECE(X,"^",3)=$PIECE(X11,"^",4)
           if $PIECE(X,U,3)'=""
               SET $PIECE(X,U,3)=$PIECE(X,U,3)_","
 +19       SET $PIECE(X,"^",4)=$GET(ST)
 +20       SET $PIECE(X,"^",5)=$EXTRACT(Z,1,5)
 +21       SET $PIECE(X,"^",6)=""
 +22       SET $PIECE(X,U,7)=$PIECE(X,U,3)_" "_$PIECE(X,U,4)_" "_$PIECE(X,U,5)
 +23      ; Insurance Company name (first 30 chars) with leading '*' if inactive ^ Street Address Line 1
 +24      ; ^ City ^ ST ^ ZIP ^
 +25       SET @IBTMP@(1)=X
 +26      ;set plan info
 +27      ;            A1 - Group Plan Number (leading '*' if Inactive)
 +28      ;            A2 - Group Plan Name   (leading '+' if Individual)
 +29      ;            A3 - 
 +30      ;            A4 - Electronic Plan Type (max length 26)
 +31      ;            A5 - Type of Plan (max length 34)
 +32      ;
 +33       NEW IBFL1,IBFL2,NAME,NUM,XX,ZZ
 +34       SET NUM=$$GET1^DIQ(355.3,IB3553,2.02)
 +35       if NUM=""
               SET NUM="<NO GROUP NUMBER>"
 +36      ; Group or Individual Plan
           SET XX=$$GET1^DIQ(355.3,IB3553,.02,"I")
 +37       SET IBFL1=$SELECT(XX=1:"",1:"+")
 +38      ; Inactive Flag
           SET ZZ=$$GET1^DIQ(355.3,IB3553,.11,"I")
 +39       SET IBFL2=$SELECT(ZZ=1:"*",1:"")
 +40      ; Add Inactive/Individual flags
           SET $PIECE(XX,"^",1)=IBFL2_NUM
 +41       SET NAME=$$GET1^DIQ(355.3,IB3553,2.01)
 +42       if NAME=""
               SET NAME="<NO GROUP NAME>"
 +43      ; Group Name
           SET $PIECE(XX,"^",2)=IBFL1_NAME
 +44       SET $PIECE(XX,"^",3)=""
 +45      ; Electronic Plan Type
           SET ZZ=$$GET1^DIQ(355.3,IB3553_",",.15)
 +46      ; Maximum Electronic Plan length
           if $LENGTH(ZZ)>$GET(LENEP)
               SET LENEP=$LENGTH(ZZ)
 +47       SET $PIECE(XX,"^",4)=ZZ
 +48      ; Type of Plan
           SET ZZ=$$GET1^DIQ(355.3,IB3553_",",.09)
 +49       if $LENGTH(ZZ)>34
               SET ZZ=$EXTRACT(ZZ,1,34)
 +50      ; Maximum Plan Type length
           if $LENGTH(ZZ)>$GET(LENEP)
               SET LENEP=$LENGTH(ZZ)
 +51       SET $PIECE(XX,"^",5)=ZZ
 +52      ; plan info
 +53       SET @IBTMP@(2)=XX
 +54       SET IBINS0=$GET(^IBA(355.3,+IB3553,0))
 +55      ; get plan subscribers
 +56      ;IB*804/DTG add sort to view subscribers
 +57      ;F IBA=3,4,5 K @IBTMP@(IBA)
 +58       FOR IBA=3,4,5,9,10,11
               KILL @IBTMP@(IBA)
 +59      ;
 +60       SET IBPTDFN=0
 +61       FOR 
               SET IBPTDFN=$ORDER(^DPT("AB",IB36,IBPTDFN))
               if 'IBPTDFN
                   QUIT 
               SET IBPTINS=0
               Begin DoDot:1
 +62               FOR 
                       SET IBPTINS=$ORDER(^DPT("AB",IB36,IBPTDFN,IBPTINS))
                       if 'IBPTINS
                           QUIT 
                       Begin DoDot:2
 +63                       SET IBA=$$GET1^DIQ(2.312,IBPTINS_","_IBPTDFN_",",.18,"I")
                           IF IBA=IB3553
                               Begin DoDot:3
 +64                               SET IBIND=$$ZND^IBCNS1(IBPTDFN,IBPTINS)
 +65                               SET IBCST=IBCST+1
 +66                               SET X=$$PT^IBEFUNC(IBPTDFN)
 +67      ; Patient's Name (22 chars)
                                   SET IBNAM=$EXTRACT($PIECE(X,"^",1),1,22)
 +68                               if IBNAM=""
                                       SET IBNAM="<Pt. "_IBPTDFN_" Name Missing>"
 +69                               SET IBPTHOLD=IBNAM
 +70      ; Retrieve last 4 of SSN (last 5 if pseudo SSN)
 +71      ; Patient's SSN
                                   SET XX=$$GET1^DIQ(2,IBPTDFN_",",.09,"I")
 +72                               SET XX=$SELECT($EXTRACT(XX,$LENGTH(XX))="P":$EXTRACT(XX,$LENGTH(XX)-4,$LENGTH(XX)),1:$EXTRACT(XX,$LENGTH(XX)-3,$LENGTH(XX)))
 +73                               SET $PIECE(IBPTHOLD,"^",2)=XX
 +74      ; Patient's DOB
                                   SET IBDOB=$$GET1^DIQ(2,IBPTDFN_",",.03,"I")
                                   SET XX=$$DTC(IBDOB)
 +75                               SET $PIECE(IBPTHOLD,"^",3)=XX
 +76      ;IB*804/DTG add in the 5 digit date for sort
                                   SET XX=$$DTC5(IBDOB)
                                   SET $PIECE(IBPTHOLD,"^",12)=XX
 +77                               SET XX=$PIECE(IBIND,"^",2)
                                   SET XX=$SELECT(XX'="":XX,1:"<NO SUBS ID>")
 +78      ; Subscriber ID (20 chars max)
                                   SET $PIECE(IBPTHOLD,"^",4)=XX
 +79      ; Effective Date
                                   SET IBEFFDT=$PIECE(IBIND,"^",8)
                                   SET XX=$$DTC(IBEFFDT)
 +80                               SET $PIECE(IBPTHOLD,"^",5)=XX
 +81      ;IB*804/DTG add in the 5 digit date for sort
                                   SET XX=$$DTC5(IBEFFDT)
                                   SET $PIECE(IBPTHOLD,"^",13)=XX
 +82      ; Expiration Date
                                   SET IBEXPDT=$PIECE(IBIND,"^",4)
                                   SET XX=$$DTC(IBEXPDT)
 +83                               SET $PIECE(IBPTHOLD,"^",6)=XX
 +84      ;IB*804/DTG add in the 5 digit date for sort
                                   SET XX=$$DTC5(IBEXPDT)
                                   SET $PIECE(IBPTHOLD,"^",14)=XX
 +85      ; Whose Insurance?
 +86                               SET XX=$PIECE(IBIND,"^",6)
                                   SET XX=$SELECT(XX="v":"VET",XX="s":"SPO",XX="o":"OTH",1:"UNK")
 +87                               SET $PIECE(IBPTHOLD,"^",7)=XX
 +88      ; Patient ID
                                   SET XX=$$GET1^DIQ(2.312,IBPTINS_","_IBPTDFN_",",5.01,"I")
 +89                               SET $PIECE(IBPTHOLD,"^",8)=XX
 +90      ; IB*778/DTG removed code for unused variable LENPID
 +91      ;active or inactive
 +92                               SET (IBACT,IBINACT)=0
                                   Begin DoDot:4
 +93      ;
 +94      ; if not a valid effective date count inactive
                                       IF 'IBEFFDT!($PIECE(IBPTHOLD,U,5)="")
                                           SET IBINACT=1
                                           QUIT 
 +95      ;
 +96      ; if there is a valid expiration date
                                       IF (IBEXPDT'=""&($PIECE(IBPTHOLD,U,6)'=""))
                                           Begin DoDot:5
 +97      ;
 +98      ; if the expiration date is less than today count inactive
                                               IF IBEXPDT<DT
                                                   SET IBINACT=1
                                                   QUIT 
 +99      ;
 +100     ; otherwise count active
                                               SET IBACT=1
                                           End DoDot:5
                                           QUIT 
 +101     ;
 +102     ; if a valid effective date and the date is greater than today count inactive
                                       IF (IBEFFDT&($PIECE(IBPTHOLD,U,5)'="")&(IBEFFDT>DT))
                                           SET IBINACT=1
                                           QUIT 
 +103     ;
 +104     ; otherwise count active
                                       SET IBACT=1
 +105     ;
                                   End DoDot:4
                                   SET $PIECE(IBPTHOLD,U,9)=IBACT
                                   SET $PIECE(IBPTHOLD,U,10)=IBINACT
 +106                              SET IBACCT=IBACCT+IBACT
                                   SET IBINACCT=IBINACCT+IBINACT
 +107     ;
 +108     ;end active or inactive
 +109     ;
 +110     ; 3=ALL, 4=ACTIVE, 5=INACTIVE
 +111     ; Patient's Name (22 chars) ^ Patient's SSN ^ Patient's DOB ^ Subscriber ID (20 chars max)
 +112     ; ^ Effective Date ^ Expiration Date ^ Whose Insurance? ^ Patient ID ^ ACTIVE ^ INACTIVE ^^ 4 digit DOB year
 +113     ; ^ 4 digit eff dt year ^ 4 digit exp dt year 
 +114     ; IB*804/DTG add sort to view subscribers
 +115     ;S @IBTMP@(3,IB3553,IBNAM_"@@"_IBPTDFN_"@@"_IBPTINS)=IBPTHOLD
 +116     ;S @IBTMP@(($S(IBACT=1:4,1:5)),IB3553,IBNAM_"@@"_IBPTDFN_"@@"_IBPTINS)=IBPTHOLD
 +117                              SET @IBTMP@(9,IB3553,IBNAM_"@@"_IBPTDFN_"@@"_IBPTINS)=IBPTHOLD
 +118                              SET @IBTMP@(($SELECT(IBACT=1:10,1:11)),IB3553,IBNAM_"@@"_IBPTDFN_"@@"_IBPTINS)=IBPTHOLD
 +119     ; total ^ active ^ inactive
 +120                              SET @IBTMP@(0)=+IBCST_U_+IBACCT_U_+IBINACCT
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +121     ;
 +122     ;IB*804/DTG add sort to view subscribers
 +123     ; base set of values
 +124      DO IBASE
 +125     ;
VSUBX     ; quit back
 +1       ;
 +2        QUIT 
DTC(IBDTCK) ; check date return external if valid
 +1       ;
 +2        NEW IBDT,IBBK
           SET IBDT=""
 +3        IF 'IBDTCK
               GOTO DTCO
 +4        SET IBDT=$$FMTE^XLFDT(IBDTCK,"2DZ")
 +5       ;
 +6        GOTO DTCO
 +7       ;
DTCO      ; date check exit
 +1       ;
 +2        QUIT IBDT
 +3       ;
DTC5(IBDTCK) ; check date return external if valid ;IB*804/DTG 4 digit year for sort's
 +1       ;
 +2        NEW IBDT,IBBK
           SET IBDT=""
 +3        IF 'IBDTCK
               GOTO DTCO
 +4        SET IBDT=$$FMTE^XLFDT(IBDTCK,"5DZ")
 +5       ;
 +6        GOTO DTC5O
 +7       ;
DTC5O     ; date check exit
 +1       ;
 +2        QUIT IBDT
 +3       ;
EXIT      ; -- exit code
 +1        KILL VALMBCK,^TMP("IBCNSJ53",$JOB),^TMP("IBCNSJ53I",$JOB),IBVPCLBG,IBVPCLEN
 +2        DO CLEAN^VALM10
           DO CLEAR^VALM1
 +3        SET VALMBCK="R"
           SET VALMBG=1
 +4        QUIT 
 +5       ;
HELP      ; -- help code
 +1       ;
 +2        IF $GET(VALMANS)="??"
               SET X="?"
               DO DISP^XQORM1
               WRITE !!
               QUIT 
 +3        DO FULL^VALM1
 +4        NEW DIR,X,Y
 +5        WRITE !
 +6        WRITE !," Enter AC to only see active subscribers."
 +7        WRITE !," Enter IN to only see inactive subscribers."
 +8       ; IB*804/DTG add sort to view subscribers
 +9       ;W !," Enter VA to see all subscribers.",!
 +10       WRITE !," Enter VA to see all subscribers."
 +11       WRITE !," Enter ST to sort the subscriber records",!
 +12       SET DIR(0)="E"
           SET DIR("A")="Press <Enter> to return to View Subscribers"
 +13       DO ^DIR
 +14       KILL DIR,X,Y
 +15       SET VALMBCK="R"
 +16       QUIT 
 +17      ;
INIT      ; -- Load the plan detail segments
 +1       ;
 +2        KILL ^TMP("IBCNSJ53",$JOB)
 +3        SET VALMBG=1
           SET (IBLCNT,VALMCNT)=0
 +4        SET IB36=+$GET(IBCNS)
           SET IB3553=+$GET(IBCPOL)
 +5        SET IBTMP="^TMP(""IBCNSJ53I"",$J)"
           SET (IBCST,IBACCT,IBINACCT,LENEP,LENPT)=0
 +6       ;IB*804/DTG add sort to view subscribers. default sort type is all
           SET (IBOSRT,IBSORTA)=0
           SET IBSACT=3
 +7        KILL @IBTMP
 +8        DO NOW^%DTC
 +9        SET IBHDT=$$DAT2^IBOUTL($EXTRACT(%,1,12))
 +10       SET IBSPACE=""
           SET $PIECE(IBSPACE," ",80)=""
 +11       IF IB36<1!(IB3553<1)
               Begin DoDot:1
 +12               WRITE !!,*7,"Missing Insurance or Plan IEN."
               End DoDot:1
               QUIT 
 +13      ;
 +14       DO KILL^VALM10()
 +15      ;
 +16       DO VSUBS
 +17      ;
 +18       DO BVA
 +19       SET VALMBCK="R"
           SET VALMBG=1
 +20       QUIT 
 +21      ;
ACINI     ; active subscribers
 +1       ;
 +2       ; IB*804/DTG VS sort
           SET IBSORTA=""
           SET IBSACT=4
           DO IBASE
 +3        DO FULL^VALM1
 +4        DO HDR("Active")
 +5        DO AC
 +6        SET VALMBCK="R"
           SET VALMBG=1
 +7        QUIT 
 +8       ;
ININI     ; inactive subscribers
 +1       ;
 +2       ; IB*804/DTG VS sort
           SET IBSORTA=""
           SET IBSACT=5
           DO IBASE
 +3        DO FULL^VALM1
 +4        DO HDR("Inactive")
 +5        DO IS
 +6        SET VALMBCK="R"
           SET VALMBG=1
 +7        QUIT 
 +8       ;
ALLINI    ; all subscribers
 +1       ;
 +2       ; IB*804/DTG VS sort
           SET IBSORTA=""
           SET IBSACT=3
           DO IBASE
 +3        DO FULL^VALM1
 +4        DO HDR("All")
 +5        DO BVA
 +6        SET VALMBCK="R"
           SET VALMBG=1
 +7        QUIT 
 +8       ;
HDR(IBDIS) ; -- Plan Subscribers
 +1       ;
 +2        NEW IBA,IBB,IBC,IBD,IBE,IBF1,IBF2,IBL,IB1,IB2,IB3
 +3        SET (IB1,IB2,IB3)=""
 +4        SET IBA=$GET(^TMP("IBCNSJ53I",$JOB,1))
           SET IBB=$GET(^TMP("IBCNSJ53I",$JOB,2))
           SET IBC=$GET(^TMP("IBCNSJ53I",$JOB,0))
 +5        SET IBF2=$EXTRACT($PIECE(IBB,U,2))
 +6        SET IBF1=$EXTRACT($PIECE(IBB,U,1))
 +7        SET IBDIS=$GET(IBDIS)
           SET IBDIS=$SELECT(IBDIS'="":IBDIS,1:"All")
 +8        SET VALM("TITLE")=IBDIS_" Subscribers"
 +9       ;
 +10      ; ins co name
           SET IB1=$EXTRACT($PIECE(IBA,U,1),1,30)
 +11      ; IB*804/DTG include sorts in view subscriber
 +12       NEW IB5,IBLA
           SET (IB5,IBLA)=""
 +13      ;IB*804/DTG added in for sort type if none chosen
           IF '$GET(IBSORTA)
               SET IB5="Sort by: NAME"
 +14       IF $GET(IBSORTA)
               SET IB5="Sort by: "_$SELECT(IBSORTA=1:"NAME",IBSORTA=2:"DOB",IBSORTA=3:"EFF DATE",IBSORTA=4:"EXP DATE",1:"")
 +15      ;S IBL=(30-$L(IB1))+30,IB2=$E(IBSPACE,1,IBL)
 +16       SET IBL=(35-$LENGTH(IB1))
           SET IBLA=(25-$LENGTH(IB5))
           SET IB2=$EXTRACT(IBSPACE,1,IBL)_IB5_$EXTRACT(IBSPACE,1,IBLA)
 +17      ;
 +18       SET IB3="TOTAL SUB: "_($EXTRACT(IBSPACE,1,(8-($LENGTH(+$PIECE(IBC,U,1))))))_(+$PIECE(IBC,U,1))
 +19       SET VALMHDR(1)=IB1_IB2_IB3
 +20      ;
 +21      ; ins addr
           SET IB1=$EXTRACT($PIECE(IBA,U,2),1,35)
 +22       SET IBE=$EXTRACT($PIECE(IBB,U,2),1,(21+($SELECT(IBF2="+":1,1:0))))
 +23       SET IBL=(35-$LENGTH(IB1))+(1+($SELECT(IBF2="+":0,1:1)))
 +24      ; group name
           SET IB2=$EXTRACT(IBSPACE,1,IBL)_IBE
 +25       SET IBL=(($SELECT(IBF2="+":22,1:21))-$LENGTH(IBE))+1
 +26       SET IB3=$EXTRACT(IBSPACE,1,IBL)_"ACTIVE SUB: "_($EXTRACT(IBSPACE,1,(8-($LENGTH(+$PIECE(IBC,U,2))))))_(+$PIECE(IBC,U,2))
 +27       SET VALMHDR(2)=IB1_IB2_IB3
 +28      ;
 +29      ; city, state zip
           SET IB1=$EXTRACT($PIECE(IBA,U,7),1,35)
 +30       SET IBE=$EXTRACT($PIECE(IBB,U,1),1,(19+($SELECT(IBF1="*":1,1:0))))
 +31       SET IBL=(35-($LENGTH(IB1))+(1+($SELECT(IBF1="*":0,1:1))))
 +32      ; group number
           SET IB2=$EXTRACT(IBSPACE,1,IBL)_IBE
 +33       SET IBL=(($SELECT(IBF1="*":20,1:19))-$LENGTH(IBE))+1
 +34       SET IB3=$EXTRACT(IBSPACE,1,IBL)_"INACTIVE SUB: "_($EXTRACT(IBSPACE,1,(8-($LENGTH(+$PIECE(IBC,U,3))))))_(+$PIECE(IBC,U,3))
 +35       SET VALMHDR(3)=IB1_IB2_IB3
 +36      ;
 +37       QUIT 
 +38      ;
BVA       ; Build ALL subscribers
 +1       ;
 +2        NEW IBLINE,IBTMP1,IBF
 +3       ;IB*804/DTG chage array for sort
 +4       ;S IBTMP1="^TMP(""IBCNSJ53I"",$J,3,"_IB3553_")"
 +5        SET IBTMP1="^TMP(""IBCNSJ53I"",$J,3)"
 +6        SET VALMCNT=0
           SET VALMBG=1
           SET IBLINE=0
 +7        KILL @VALMAR
 +8        SET IBF=$GET(^TMP("IBCNSJ53I",$JOB,0))
 +9       ; IB*771/DTG put none found back in display
           IF '+IBF
               Begin DoDot:1
 +10               SET VALMCNT=2
                   SET @VALMAR@(1,0)=" "
 +11               SET @VALMAR@(2,0)=" ***Group Contains No Subscribers***"
               End DoDot:1
               QUIT 
 +12      ; go through the 3 level
 +13       DO BPAS
 +14       QUIT 
 +15      ;
BPAS      ; build items from base into valm display
 +1       ;
 +2        NEW IBA,IBB,IBC,IBD,IBE,IBNM,IBDFN,IBNODE,X
 +3       ;S IBA="",X="" F  S IBA=$O(@IBTMP1@(IBA)) Q:IBA=""  D
 +4       ; IB*804/DTG include sorts in view subscriber Change from a single dot '.' level to three dot '.' levels
 +5       ;S IBA="",X="" F  S IBA=$O(@IBTMP1@(IBA)) Q:IBA=""  D
 +6        NEW IBCNTR,IBG
 +7        SET IBCNTR=""
           FOR 
               SET IBCNTR=$ORDER(@IBTMP1@(IBCNTR))
               if IBCNTR=""
                   QUIT 
               SET IBG=""
               Begin DoDot:1
 +8                FOR 
                       SET IBG=$ORDER(@IBTMP1@(IBCNTR,IBG))
                       if IBG=""
                           QUIT 
                       SET IBA=""
                       SET X=""
                       Begin DoDot:2
 +9                        FOR 
                               SET IBA=$ORDER(@IBTMP1@(IBCNTR,IBG,IBA))
                               if IBA=""
                                   QUIT 
                               Begin DoDot:3
 +10                               SET IBNM=$PIECE(IBA,"@@",1)
                                   SET IBDFN=$PIECE(IBA,"@@",2)
                                   SET IBNODE=$PIECE(IBA,"@@",3)
 +11                               SET VALMCNT=VALMCNT+1
                                   SET IBC=@IBTMP1@(IBCNTR,IBG,IBA)
                                   SET X=""
                                   SET IBLINE=IBLINE+1
 +12                               SET X=$$SETFLD^VALM1($PIECE(IBC,"^",1),X,"SNAME")
 +13                               SET X=$$SETFLD^VALM1($PIECE(IBC,"^",2),X,"SSN4")
 +14                               SET X=$$SETFLD^VALM1($PIECE(IBC,U,3),X,"DOB10")
 +15                               SET X=$$SETFLD^VALM1($PIECE(IBC,"^",4),X,"SUBID")
 +16                               SET X=$$SETFLD^VALM1($PIECE(IBC,U,5),X,"EFFDT")
 +17                               SET X=$$SETFLD^VALM1($PIECE(IBC,U,6),X,"EXPDT")
 +18                               SET X=$$SETFLD^VALM1($PIECE(IBC,"^",7),X,"WHO")
 +19                               SET X=$$SETFLD^VALM1($PIECE(IBC,"^",8),X,"PATID")
 +20                               SET IBD=$PIECE(IBC,U,9)
                                   SET X=$$SETFLD^VALM1($SELECT(IBD=1:"Y",1:""),X,"ACT")
 +21                               SET @VALMAR@(VALMCNT,0)=X
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +22       QUIT 
 +23      ;
AC        ; active subscriber entry
 +1       ;
 +2        NEW IBLINE,IBTMP1,IBF
 +3       ;IB*804/DTG chage array for sort
 +4       ;S IBTMP1="^TMP(""IBCNSJ53I"",$J,4,"_IB3553_")"
 +5        SET IBTMP1="^TMP(""IBCNSJ53I"",$J,4)"
 +6        SET VALMCNT=0
           SET VALMBG=1
           SET IBLINE=0
 +7        KILL @VALMAR
 +8        SET IBF=$GET(^TMP("IBCNSJ53I",$JOB,0))
 +9        IF '+$PIECE(IBF,U,2)
               Begin DoDot:1
 +10               SET VALMCNT=2
                   SET @VALMAR@(1,0)=" "
 +11               SET @VALMAR@(2,0)=" ***Group Contains No Active Subscribers***"
               End DoDot:1
               QUIT 
 +12      ; go through the 4 level
 +13       DO BPAS
 +14       QUIT 
 +15      ;
IS        ; inactive subscriber entry
 +1       ;
 +2        NEW IBLINE,IBTMP1,IBF
 +3       ;IB*804/DTG chage array for sort
 +4       ;S IBTMP1="^TMP(""IBCNSJ53I"",$J,5,"_IB3553_")"
 +5        SET IBTMP1="^TMP(""IBCNSJ53I"",$J,5)"
 +6        SET VALMCNT=0
           SET VALMBG=1
           SET IBLINE=0
 +7        KILL @VALMAR
 +8        SET IBF=$GET(^TMP("IBCNSJ53I",$JOB,0))
 +9        IF '+$PIECE(IBF,U,3)
               Begin DoDot:1
 +10               SET VALMCNT=2
                   SET @VALMAR@(1,0)=" "
 +11               SET @VALMAR@(2,0)=" ***Group Contains No Inactive Subscribers***"
               End DoDot:1
               QUIT 
 +12      ; go through the 5 level
 +13       DO BPAS
 +14       QUIT 
 +15      ;
 +16      ;IB*804/DTG new for sort SORT - IBASE
SORT      ; ask sort questions if sort selected then re-build ^TMP("IBCNSJ53I",$J,
 +1       ;
 +2        NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,IBJ,IBQUIT,IBSRF,IBSRNM,IBWORK,X,Y
 +3        SET IBQUIT=0
 +4        DO FULL^VALM1
 +5        SET IBSACT=$GET(IBSACT)
           IF IBSACT<3
               SET IBSACT=3
 +6        SET IBOSRT=IBSORTA
 +7        KILL DIR
           SET DIR(0)="S^1:Subscriber Name;2:Date of Birth;3:Effective Date;4:Expiration Date"
 +8        SET DIR("A")="SELECT 1, 2, 3, or 4"
 +9        SET DIR("?")="Select a sort method or Enter '^' to quit"
 +10       SET DIR("B")=$SELECT(IBOSRT=2:"Date of Birth",IBOSRT=3:"Effective Date",IBOSRT=4:"Expiration Date",1:"Subscriber Name")
 +11       DO ^DIR
 +12       IF $EXTRACT(Y)=U!$DATA(DIROUT)!$DATA(DIRUT)!$DATA(DTOUT)!$DATA(DUOUT)
               SET Y="^"
 +13       IF $EXTRACT(Y)=U
               SET IBQUIT=1
               GOTO SORTQ
 +14       SET IBSORTA=+Y
           IF Y<1
               SET IBQUIT=1
               GOTO SORTQ
 +15       IF IBSORTA=1
               DO IBSRTNM
               GOTO SORTQ
 +16       SET IBJ=$SELECT(IBSORTA=2:"Date of Birth",IBSORTA=3:"Effective Date",IBSORTA=4:"Expiration Date",1:"")
 +17       IF IBJ=""
               SET IBQUIT=1
               GOTO SORTQ
 +18       SET Y=$$IBSRQU(IBJ,"",0)
 +19       IF $EXTRACT(Y)=U!(Y="")
               SET IBQUIT=1
               GOTO SORTQ
 +20       DO IBSRTCOM(IBSORTA,IBWORK)
           GOTO SORTQ
 +21      ;
SORTQ     ; sort exit point
 +1       ;
 +2        IF IBQUIT
               SET IBSORTA=IBOSRT
               IF 'IBSORTA
                   DO IBASE
 +3        DO FULL^VALM1
 +4       ; update header and build output array for SHOW^VALM
 +5        IF $GET(IBSACT)=3
               DO HDR("All")
               DO BVA
 +6        IF $GET(IBSACT)=4
               DO HDR("Active")
               DO AC
 +7        IF $GET(IBSACT)=5
               DO HDR("Inactive")
               DO IS
 +8        SET VALMBCK="R"
           SET VALMBG=1
 +9        QUIT 
 +10      ;
IBSRTNM   ; subscriber name sort type and order
 +1       ;
 +2        NEW X,Y
 +3        SET Y=$$IBSRQU("Subscriber Name","",0)
 +4        IF $EXTRACT(Y)=U!(Y="")
               SET IBQUIT=1
               QUIT 
 +5        DO IBSRTCOM(IBSORTA,IBWORK)
 +6        QUIT 
 +7       ;
 +8       ;
IBSRQU(IBSRNM,IBSRF,IBSRR) ; get the type
 +1       ;
 +2       ; IBSRNM - sort name
 +3       ;  IBSRF - default response "" =none, 1 =Ascending, 2 =Descending
 +4       ;  IBSRR - required response 0 or "" =no, 1 =yes
 +5       ;
 +6        NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,IBQUIT,X,Y
 +7        KILL DIR
           SET IBSRF=$GET(IBSRF)
 +8        SET DIR(0)="S"_($SELECT(+IBSRR:"",1:"O"))_"^1:Ascending "_IBSRNM_";2:Descending "_IBSRNM
 +9        IF IBSRF'=""
               SET DIR("B")=IBSRF
 +10       SET DIR("A")="SELECT 1 or 2"
 +11       SET DIR("?")="Select Ascending or Descending "_IBSRNM_" or Enter '^' to quit"
 +12       DO ^DIR
 +13       IF Y=""&(IBSRF'="")
               SET Y=IBSRF
 +14       IF $EXTRACT(Y)=U!$DATA(DIROUT)!$DATA(DIRUT)!$DATA(DTOUT)!$DATA(DUOUT)
               SET Y="^"
 +15       SET IBWORK=""
 +16       SET IBWORK=$SELECT(+Y=2:"-1",1:"1")
 +17       QUIT Y
 +18      ;
IBSRTCOM(IBSORTA,IBWORK) ; go thru the compiled and sort for display
 +1       ;
 +2       ; IBSORTA - Sort Type
 +3       ; IBWORK  - Sort Order
 +4       ;
 +5       ; 3=ALL-9, 4=ACTIVE-10, 5=INACTIVE-11
 +6       ; Patient's Name (22 chars) ^ Patient's SSN ^ Patient's DOB ^ Subscriber ID (20 chars max)
 +7       ; ^ Effective Date ^ Expiration Date ^ Whose Insurance? ^ Patient ID ^ ACTIVE ^ INACTIVE ^^ 4 digit DOB year
 +8       ; ^ 4 digit eff dt year ^ 4 digit exp dt year
 +9        NEW IBA,IBC,IBD,IBE,IBF,IBI,IBJ,IBK
 +10      ; sort not picked
           IF IBSORTA=""
               QUIT 
 +11      ;         1         Subscriber Name
 +12      ;         2         Date of Birth
 +13      ;         3         Effective Date
 +14      ;         4         Expiration Date
 +15      ;
 +16      ; cycle through all, active, inactive
 +17       SET IBI=IBSACT
           KILL ^TMP("IBCNSJ53I",$JOB,IBI)
 +18      ; to save time only clear and sort for the current display
 +19       SET IBI=(IBSACT+6)
           KILL ^TMP("IBCNSJ53I",$JOB,"TEMP"),^TMP("IBCNSJ53I",$JOB,"TEMPA")
 +20       SET IBA=""
           FOR 
               SET IBA=$ORDER(^TMP("IBCNSJ53I",$JOB,IBI,IBA))
               if IBA=""
                   DO IBSRTMV
               if IBA=""
                   QUIT 
               Begin DoDot:1
 +21               SET IBB=""
                   FOR 
                       SET IBB=$ORDER(^TMP("IBCNSJ53I",$JOB,IBI,IBA,IBB))
                       if IBB=""
                           QUIT 
                       Begin DoDot:2
 +22                       SET IBC=$GET(^TMP("IBCNSJ53I",$JOB,IBI,IBA,IBB))
                           SET (IBD,IBJ)=""
 +23                       IF IBSORTA=1
                               SET IBD=$PIECE(IBC,U,1)
                               if IBD=""
                                   SET IBD=" "
                               DO IBSV
                               QUIT 
 +24                       IF IBSORTA=2!(IBSORTA=3)!(IBSORTA=4)
                               SET IBD=""
                               SET IBK=$SELECT(IBSORTA=2:12,IBSORTA=3:13,IBSORTA=4:14,1:"")
                               Begin DoDot:3
 +25                               if IBK
                                       SET IBD=$PIECE(IBC,U,IBK)
                                   SET IBJ=""
 +26                               DO DT^DILF(,IBD,.IBJ)
                                   SET IBD=$GET(IBJ)
                                   if IBD=""
                                       SET IBD=" "
                                   if IBD="-1"
                                       SET IBD="  "
 +27                               IF $EXTRACT(IBD)'=" "
                                       DO IBSV
                                       QUIT 
 +28                               IF $EXTRACT(IBD)=" "
                                       DO IBSVA
                                       QUIT 
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +29      ;
 +30       KILL ^TMP("IBCNSJ53I",$JOB,"TEMP"),^TMP("IBCNSJ53I",$JOB,"TEMPA")
 +31       QUIT 
 +32      ;
IBSV      ; save in selected item order to temp area
 +1       ;
 +2        SET ^TMP("IBCNSJ53I",$JOB,"TEMP",IBD,IBA,IBB)=IBC
 +3        QUIT 
 +4       ;
IBSVA     ; save invalid dates in selected item order to temp area
 +1       ;
 +2        SET ^TMP("IBCNSJ53I",$JOB,"TEMP",IBD,IBA,IBB)=IBC
 +3        QUIT 
 +4       ;
IBSRTMV   ; move from temp and place in viewing order
 +1       ;
 +2        NEW IBCT,IBG,IBH,IBK,IBJ
 +3        SET IBK=$SELECT(IBWORK="-1":"ZZZZZ",1:"")
           SET IBCT=0
 +4        IF IBWORK'="-1"
               DO IBSRTA
 +5        FOR 
               SET IBK=$ORDER(^TMP("IBCNSJ53I",$JOB,"TEMP",IBK),IBWORK)
               if IBK=""
                   QUIT 
               Begin DoDot:1
 +6                IF $EXTRACT(IBK)=" "
                       QUIT 
 +7                SET IBG=$SELECT(IBWORK="-1":"ZZZZZ",1:"")
 +8                FOR 
                       SET IBG=$ORDER(^TMP("IBCNSJ53I",$JOB,"TEMP",IBK,IBG),IBWORK)
                       if IBG=""
                           QUIT 
                       Begin DoDot:2
 +9                        SET IBH=$SELECT(IBWORK="-1":"ZZZZZ",1:"")
 +10                       FOR 
                               SET IBH=$ORDER(^TMP("IBCNSJ53I",$JOB,"TEMP",IBK,IBG,IBH),IBWORK)
                               if IBH=""
                                   QUIT 
                               Begin DoDot:3
 +11                               SET IBJ=$GET(^TMP("IBCNSJ53I",$JOB,"TEMP",IBK,IBG,IBH))
 +12                               SET IBCT=IBCT+1
                                   SET ^TMP("IBCNSJ53I",$JOB,(IBI-6),IBCT,IBG,IBH)=IBJ
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +13       IF IBWORK="-1"
               DO IBSRTA
 +14       QUIT 
 +15      ;
IBSRTA    ; pick up blank and bad date items
 +1       ;
 +2        NEW IBA,IBB,IBC,IBD,IBE
 +3        IF IBWORK'="-1"
               Begin DoDot:1
 +4                FOR IBA=" ","  "
                       DO IBSRTA1
               End DoDot:1
 +5        IF IBWORK="-1"
               Begin DoDot:1
 +6                FOR IBA="  "," "
                       DO IBSRTA1
               End DoDot:1
 +7        QUIT 
 +8       ;
IBSRTA1   ; loop through bad/blank dates
 +1       ;
 +2        SET IBB=$SELECT(IBWORK="-1":"ZZZZZ",1:"")
 +3        FOR 
               SET IBB=$ORDER(^TMP("IBCNSJ53I",$JOB,"TEMP",IBA,IBB),IBWORK)
               if IBB=""
                   QUIT 
               Begin DoDot:1
 +4                SET IBC=$SELECT(IBWORK="-1":"ZZZZZ",1:"")
 +5                FOR 
                       SET IBC=$ORDER(^TMP("IBCNSJ53I",$JOB,"TEMP",IBA,IBB,IBC),IBWORK)
                       if IBC=""
                           QUIT 
                       Begin DoDot:2
 +6                        SET IBD=$GET(^TMP("IBCNSJ53I",$JOB,"TEMP",IBA,IBB,IBC))
 +7                        SET IBCT=IBCT+1
                           SET ^TMP("IBCNSJ53I",$JOB,(IBI-6),IBCT,IBB,IBC)=IBD
                       End DoDot:2
               End DoDot:1
 +8        QUIT 
 +9       ;
IBASE     ; reset levels to base
 +1       ;
 +2       ;IB*804/DTG add sort to view subscribers
 +3       ; base set of values
 +4        NEW IBA,IBB,IBC,IBCNT,IBD,IBI
 +5        FOR IBA=3,4,5
               KILL ^TMP("IBCNSJ53I",$JOB,IBA)
 +6        FOR IBI=9,10,11
               SET IBA=""
               SET IBCNT=0
               FOR 
                   SET IBA=$ORDER(^TMP("IBCNSJ53I",$JOB,IBI,IBA))
                   if IBA=""
                       QUIT 
                   SET IBB=""
                   Begin DoDot:1
 +7                    FOR 
                           SET IBB=$ORDER(^TMP("IBCNSJ53I",$JOB,IBI,IBA,IBB))
                           if IBB=""
                               QUIT 
                           Begin DoDot:2
 +8                            SET IBD=^TMP("IBCNSJ53I",$JOB,IBI,IBA,IBB)
                               SET IBCNT=IBCNT+1
 +9                            SET ^TMP("IBCNSJ53I",$JOB,(IBI-6),IBCNT,IBA,IBB)=IBD
                           End DoDot:2
                   End DoDot:1
 +10      ;
 +11       QUIT 
 +12      ;