IBCNSUR ;ALB/CPM/CMS - MOVE SUBSCRIBERS TO DIFFERENT PLAN ; 09-SEP-96
 ;;2.0;INTEGRATED BILLING;**103,276,506,516,549,602,664,702,732**;21-MAR-94;Build 13
 ;;Per VA Directive 6402, this routine should not be modified.
 Q
 ;
EN ; Entry point from option. Main processing loop.
 I $S('($D(DUZ)#2):1,'$D(^VA(200,+DUZ,0)):1,1:0) W !!?3,"The variable DUZ must be set to an active user code before continuing." G ENQ
 W !!,?5,"MOVE SUBSCRIBERS OF ONE PLAN TO ANOTHER PLAN"
 W !,?5,"This option may be used to move subscribers from a selected Plan"
 W !,?5,"to a different Plan. The plans may be associated with the same"
 W !,?5,"Insurance Company or a different one. Plan and Annual Benefit"
 W !,?5,"information may be moved as well. Users of this option should"
 W !,?5,"be knowledgeable of the VistA Patient Insurance management options."
 W !
 W !,?5,"This option also gives the user the option to expire the old plan or"
 W !,?5,"replace it completely in the patient insurance profile.  The reason"
 W !,?5,"to expire the old plan is intended for use when Insurance groups change"
 W !,?5,"PBMs for processing electronic Pharmacy claims.  By leaving the old"
 W !,?5,"plan information intact (i.e. do not replace), the user will be able"
 W !,?5,"to monitor PBM changes  that affect the electronic Pharmacy claims."
 ;
 W !!,$TR($J("",75)," ","-")
 S IBSTOP=0 F  D PROC^IBCNSUR1 Q:IBSTOP
ENQ K IBSTOP
 Q
 ;
PROC ; - Process continuation from IBCNSUR1. 
 ; - display old plan attributes; allow new plan to be edited
 D PL^IBCNSUR2
 R !!,?10,"Press any key to continue.    ",IBX:DTIME
 ;
 ; - display coverage limitations; allow add/edit of plan 2 limitations
 D LIM^IBCNSUR2
 ;
 I $P($G(^IBA(355.3,IBP1,0)),"^",11) W !!,"Please note that ",IBC1N,"'s",!,"plan, subscribers were moved from, is already inactive." G PROCDP
 ;
 ; - does the user wish to inactivate the old plan?
 W !! S DIR(0)="Y",DIR("A")="Do you wish to inactivate "_IBC1N_"'s plan subscribers were moved from"
 S DIR("?")="If you wish to inactivate the old plan, enter 'Yes' - otherwise, enter 'No.'"
 D ^DIR K DIR I 'Y W !," <The old plan is still active>" G PROCQ
 ;
 D IRACT^IBCNSJ(IBP1,1) W !!,"The plan has been inactivated."
 ;
PROCDP ; - does the user wish to delete the old plan?
 ;IB*2*702/CKB - Add checks to determine whether a group is allowed to be delete or not
 ;
 ;IB*732/CKB - removed check for the number of subscribers
 ;If moving entire group by expiring the policy by adding a new effective
 ; date, do NOT allow the group to be deleted.
 I IBGRP,IBSPLIT,$G(IBEFFDT) D NODEL G PROCQ
 ;
 ;IB*732/CKB - should only check for only 1 subscriber.
 ;If moving the entire group (if there is only 1 subscriber) by replacing the
 ; old group plan,the user they should BE allowed to delete the group.
 I IBGRP,(IBSUB=1) G PROCDP1
 ;
 ;If moving a subset of subscribers from the group by expiring the policy adding
 ; a new effective date, do NOT allow the group to be deleted.
 ;IB*732/CKB - if user selected chose to select subscribers allow for the user
 ; selecting All or Some of the subscribers
 ;;***I 'IBGRP,+NUMSEL<IBSUB,$G(IBEFFDT) D NODEL G PROCQ
 I 'IBGRP,+NUMSEL'>IBSUB,$G(IBEFFDT) D NODEL G PROCQ
 ;
 ;If moving a subset of subscribers from the group by replacing the old group plan,
 ; do NOT allow the group to be deleted.
 ;IB*732/CKB - if user selected chose to select subscribers allow for the user
 ; selecting All or Some of the subscribers
 ;;***I 'IBGRP,+NUMSEL<IBSUB,'IBSPLIT D NODEL G PROCQ
 I 'IBGRP,+NUMSEL'>IBSUB,'IBSPLIT D NODEL G PROCQ
 ;
PROCDP1 ; Prompt to delete the plan
 W !! S DIR(0)="Y",DIR("A")="Do you wish to delete this plan"
 S DIR("?")="If you wish to delete the old plan, enter 'Yes' - otherwise, enter 'No.'"
 D ^DIR K DIR I 'Y G PROCQ
 ;
 ;IB*2*702/CKB - Added a "Are you sure" question before deleting the plan
 W ! S DIR(0)="Y",DIR("A")="Are you sure you want to delete this plan"
 S DIR("?")="If you're sure you want to delete the old plan, enter 'Yes' - otherwise, enter 'No.'"
 D ^DIR K DIR I 'Y G PROCQ
 ;
 D DEL^IBCNSJ(IBP1) W !!,"The plan has been deleted."
 ;
PROCQ Q
 ;
NODEL ;IB*2*702/CKB - Display a "not allowed to delete" message to the user
 W !,"There are still subscribers to this plan. The plan cannot be deleted.",!
 S DIR(0)="EA",DIR("A")="Press RETURN to continue."
 D ^DIR K DIR
 Q
 ;
SEL(IBNP) ; Select a company and plan.
 ;   Input:     IBNP  --  If set to 1, allows adding a new plan and
 ;                    --  Screen Inactive Companies
 ;                    --  If set to 0, must have at least one group plan
 ;  Output:   IBCNS  --  Pointer to selected company in file #36
 ;           IBPLAN  --  Pointer to selected/added plan in file #355.3
 ;           IBQUIT  --  Set to 1 if the user wants to quit.
 ;
 N X,Y K DIC,DIR
 S DIC(0)="QEAMZ",DIC="^DIC(36,"
 I 'IBNP S DIC("S")="I $$ANYGP^IBCNSJ(+Y,0,1)"
 I IBNP S DIC("S")="I '$P($G(^DIC(36,+Y,0)),U,5)"
 S DIC("A")="Select INSURANCE COMPANY: "
 D ^DIC K DIC S IBCNS=+Y
 I Y<0 W "   <No Insurance Company selected>" S IBQUIT=1 G SELQ
 ;
 ; - if a new plan may be added, allow adding
 I IBNP D  I (IBPLAN)!(IBQUIT) G SELQ
 .W !!,"You may add a new Plan at this time or select an existing Plan."
 .; IB*2.0*506 added IBKEY parameter (4th) to the NEW^IBCNSJ3 call (check user's security keys)
 .D NEW^IBCNSJ3(IBCNS,.IBPLAN,1,1)
 .I 'IBPLAN,'$$ANYGP^IBCNSJ(+IBCNS,0,1) W !!,*7,"Insurance Company receiving subscribers must have a Plan." S IBQUIT=1
 ;
 ; - see if user wants to select the plan
 W !!,"You may select an existing Plan from a list or enter a specific Plan.",!
 S DIR(0)="Y",DIR("B")="YES",DIR("A")="Do you wish to enter a specific plan"
 S DIR("?")="The look-up facility to select a group plan has been enhanced to use the List Manager.  Enter 'NO' if you wish to select a plan from this look-up, or 'YES' to directly enter a plan."
 D ^DIR K DIR I $D(DIRUT) S IBQUIT=1 G SELQ
 ;
 ; - invoke the plan look-up
 I 'Y D  G SELQ
 . N IBTITLE
 . S IBTITLE="Group Plan Lookup"
 . W "   ..."
 . S IBPLAN=0
 . D LKP^IBCNSU2(IBCNS,0,0,.IBPLAN,0,1,IBTITLE)
 . I 'IBPLAN W !!,*7,"*  No plan selected!",! S IBQUIT=1
 ;
 ; - allow a FileMan look-up
 ; MRD;IB*2.0*516 - Display new Group Name and Number fields.
 S DIC("A")="Select a GROUP PLAN: "
 S DIC="^IBA(355.3,",DIC(0)="AEQM",DIC("S")="I +^(0)=IBCNS,$P(^(0),U,2)"
 ;S DIC("W")="N IBX S IBX=$G(^(0)) W ""   Name: "",$E($S($P(IBX,U,3)]"""":$P(IBX,U,3),1:""<none>"")_$J("""",20),1,20),""   Number: "",$S($P(IBX,U,4)]"""":$P(IBX,U,4),1:""<none>"")"
 S DIC("W")="N IBX S IBX=$G(^(2)) W ""   Name: "",$E($S($P(IBX,U,1)]"""":$P(IBX,U,1),1:""<none>"")_$J("""",20),1,20),""   Number: "",$E($S($P(IBX,U,2)]"""":$P(IBX,U,2),1:""<none>""),1,14)"
 D ^DIC K DIC S IBPLAN=+Y
 I Y<0 W !!,*7,"*  No plan selected!",! S IBQUIT=1
 ;
SELQ K DIRUT,DUOUT,DTOUT,DIROUT
 Q
 ;
EXPGRP ; EP for [IBCN EXPIRE GROUP SUBSCRIBERS]
 ; IB*2.0*602/DM implement expire group plan 
 N X,Y,DIC,DIR,DTA,ERR,REF,IBLN,XMDUZ,XMTEXT,XMSUB,XMY
 N IBQUIT,IBCNS,IBPLAN,IBSUB,IBEXP,DFN,IBIPOL,IBIENWK
 N IBINSNM,IBGRPNM,IBGRPNO,IBEXPOK,IBEXPERR,IBSUPRES,IBCBI
 ;
 W !!,?5,"EXPIRE ALL SUBSCRIBERS WITHIN A GROUP PLAN"
 W !,?5,"You can use this option to specify an expiration date for all subscriber"
 W !,?5,"policies in a group plan without moving the subscribers to another group"
 W !,?5,"plan. If the group plan status is currently ""active"", you can also choose"
 W !,?5,"to ""inactivate"" the group plan."
 W !!,$TR($J("",75)," ","-")
 S IBQUIT=1
 ;
NXTGRP ; EP for next expire group process
 K ^TMP($J,"IBCNSUR") ; subscribers
 K ^TMP($J,"IBCNSURBLL") ; bulletin  
 I 'IBQUIT D
 . W !!,"=========================================="
 . W !,"EXPIRE ALL SUBSCRIBERS WITHIN A GROUP PLAN"
 . W !,"==========================================",!
 ; get insco and plan
 S IBQUIT=0
 D SEL^IBCNSUR(0) I IBQUIT Q
 ;
 ; Make sure plan has at least one subscriber
 I '$$SUBS^IBCNSJ(IBCNS,IBPLAN,0,,1) W !!,?5,*7,"* This group plan has no subscribers!",! G NXTGRP
 ;
 S IBINSNM=$$GET1^DIQ(36,IBCNS_",","NAME")
 S IBGRPNM=$$GET1^DIQ(355.3,IBPLAN_",","GROUP NAME")
 S IBGRPNO=$$GET1^DIQ(355.3,IBPLAN_",","GROUP NUMBER")
 ;
 W !!,"Collecting Subscribers ..."
 S IBSUB=$$SUBS^IBCNSJ(IBCNS,IBPLAN,0,"^TMP($J,""IBCNSUR"")")
 W !!,"This group plan has "_+IBSUB_" subscribers. All subscribers will be expired.",!
 S DIR(0)="Y"
 S DIR("A")="Do you want to expire all subscribers' policies for this plan"
 S DIR("?",1)="You will be asked for an expiration date to terminate the attached policies."
 S DIR("?",2)="You will have an opportunity to stop if desired."
 S DIR("?")="Enter 'Yes' to continue, or 'No' to stop the process now."
 D ^DIR K DIR
 I 'Y!$D(DIRUT) G NXTGRP
 ;
 W !
 ; get the expiration date
 ;IB*2.0*664/TAZ - Force exact date.
 S DIR(0)="D^::EX",DIR("A")="Enter expiration date (applies to all subscribers in this plan)"
 S DIR("?")="Each active policy will be expired with the expiration date entered."
 D ^DIR K DIR
 I 'Y!$D(DIRUT) G NXTGRP
 S IBEXP=Y
 ;
 W !!,"You selected to expire "_+IBSUB_" subscriber(s) with Expiration Date "_$$FMTE^XLFDT(IBEXP)_" for:"
 W !,?5,"Insurance Company "_IBINSNM
 W !,?5,"Plan Name "_IBGRPNM_"    Number "_IBGRPNO
 W !!,"Please Note that the policy will be EXPIRED in the patient profile!!",!
 ; 
 S DIR(0)="Y",DIR("A")="Okay to continue"
 S DIR("?",1)="If you wish to expire the policies for these subscribers, enter 'Yes'."
 S DIR("?")="Otherwise, enter 'No' to exit."
 D ^DIR K DIR
 I 'Y!$D(DIRUT) G NXTGRP
 ;
 ; expire the plan subscribers
 ; as we process the policies, we'll set the ^TMP nodes to 'O'k or 'E'rror
 W !!,"Expiring Policies...",!
 S IBSUPRES=1 ; tell COVERED^IBCNSM31 to be quiet
 S (IBEXPOK,IBEXPERR)=0
 S DFN=0 F  S DFN=$O(^TMP($J,"IBCNSUR",DFN)) Q:'DFN  D
 . S IBIPOL=0 F  S IBIPOL=$O(^TMP($J,"IBCNSUR",DFN,IBIPOL)) Q:IBIPOL=""  D
 .. S IBIENWK=IBIPOL_","_DFN_","
 .. Q:$$GET1^DIQ(2.312,IBIENWK,"GROUP PLAN","I")'=IBPLAN
 .. Q:+$$GET1^DIQ(2.312,IBIENWK,"INSURANCE EXPIRATION","I")
 .. I $$GET1^DIQ(2.312,IBIENWK,"EFFECTIVE DATE OF POLICY","I")>IBEXP S ^TMP($J,"IBCNSUR",DFN,IBIPOL)="E",IBEXPERR=IBEXPERR+1 Q
 .. S IBCBI=$$GET1^DIQ(2,DFN_",","COVERED BY HEALTH INSURANCE?","I")
 .. K DTA,ERR
 .. S DTA(2.312,IBIENWK,3)=IBEXP ; set the expiration date
 .. S DTA(2.312,IBIENWK,1.05)=$$NOW^XLFDT() ; last edited
 .. S DTA(2.312,IBIENWK,1.06)=DUZ ; by
 .. D FILE^DIE("","DTA","ERR")
 .. I $D(ERR) S ^TMP($J,"IBCNSUR",DFN,IBIPOL)="E",IBEXPERR=IBEXPERR+1 Q
 .. S ^TMP($J,"IBCNSUR",DFN,IBIPOL)="O",IBEXPOK=IBEXPOK+1
 .. D COVERED^IBCNSM31(DFN,IBCBI) ; set covered by insurance 
 ;
 W !,"Done. "_IBEXPOK_" Subscribers' policies were expired as of "_$$FMTE^XLFDT(IBEXP)_"."
 W !,"A Bulletin was sent to you and members of 'IB NEW INSURANCE' Mail Group."
 ;
 ; prepare the bulletin
 S IBLN=0,REF=$NA(^TMP($J,"IBCNSURBLL"))
 D ADD^IBCNSUR3(1,"EXPIRE ALL SUBSCRIBERS WITHIN A GROUP PLAN")
 D ADD^IBCNSUR3()
 D ADD^IBCNSUR3(1,"You selected to expire ",IBSUB," subscriber(s)")
 D ADD^IBCNSUR3()
 D ADD^IBCNSUR3(1,"FROM Insurance Company ",IBINSNM)
 D ADD^IBCNSUR3(1,"Plan Name ",IBGRPNM,"    Number ",IBGRPNO)
 D ADD^IBCNSUR3()
 D ADD^IBCNSUR3(1,"Policies will be expired as of ",$$FMTE^XLFDT(IBEXP),".")
 D ADD^IBCNSUR3()
 ;
 I IBEXPERR D
 . D ADD^IBCNSUR3(1,"* These ",IBEXPERR," entries could not be processed, they'll need to be adjusted manually")
 . W !!,@REF@(IBLN)
 . D ADD^IBCNSUR3(1,"-------------------------------------------------------------------------------")
 . W !,@REF@(IBLN)
 . D ADD^IBCNSUR3(1,"Patient Name/ID             Whose    Employer              Effective   Expires")
 . W !,@REF@(IBLN),!
 . S DFN=0 F  S DFN=$O(^TMP($J,"IBCNSUR",DFN)) Q:'DFN  D
 .. S IBIPOL=0 F  S IBIPOL=$O(^TMP($J,"IBCNSUR",DFN,IBIPOL)) Q:IBIPOL=""  D
 ... I ^TMP($J,"IBCNSUR",DFN,IBIPOL)'="E" Q
 ... D ADS^IBCNSUR3(DFN,IBIPOL)
 ... W !,@REF@(IBLN)
 . D ADD^IBCNSUR3(1,"============================")
 . D ADD^IBCNSUR3()
 . W !!,"Examine the entries that could not be processed."
 ;
 I IBEXPOK D
 . D ADD^IBCNSUR3(1,"These ",IBEXPOK," policies were processed successfully")
 . D ADD^IBCNSUR3(1,"-------------------------------------------------------------------------------")
 . D ADD^IBCNSUR3(1,"Patient Name/ID             Whose    Employer              Effective   Expires")
 . S DFN=0 F  S DFN=$O(^TMP($J,"IBCNSUR",DFN)) Q:'DFN  D
 .. S IBIPOL=0 F  S IBIPOL=$O(^TMP($J,"IBCNSUR",DFN,IBIPOL)) Q:IBIPOL=""  D
 ... I ^TMP($J,"IBCNSUR",DFN,IBIPOL)'="O" Q
 ... D ADS^IBCNSUR3(DFN,IBIPOL)
 . D ADD^IBCNSUR3(1,"============================")
 . D ADD^IBCNSUR3()
 ;
 I 'IBEXPOK,'IBEXPERR D
 . D ADD^IBCNSUR3(1,"============================")
 . D ADD^IBCNSUR3(1,"After processing, no changes were needed, no policies were expired.")
 . W !!,@REF@(IBLN)
 . D ADD^IBCNSUR3(1,"============================")
 . D ADD^IBCNSUR3()
 ;
 W !
 S DIR(0)="EA",DIR("A")="Press RETURN to continue." D ^DIR K DIR
 ;
 I +$$GET1^DIQ(355.3,IBPLAN_",","INACTIVE","I") D  G NXTGRP
 . D ADD^IBCNSUR3(1,"Please note the ",IBGRPNM," plan is already inactive.")
 . W !!,@REF@(IBLN),!
 . D SNDBULL
 ;
 W !
 S DIR(0)="Y",DIR("B")="NO"
 I IBEXPERR D
 . S DIR("A",1)="       ***********************************************"
 . S DIR("A",2)="       *                   WARNING                   *"
 . S DIR("A",3)="       *     There are still active subscribers      *"
 . S DIR("A",4)="       *   that will need to be adjusted manually    *"
 . S DIR("A",5)="       ***********************************************"
 . S DIR("A",6)=" "
 S DIR("A")="Do you wish to inactivate plan "_IBGRPNM
 D ^DIR K DIR
 I 'Y!$D(DIRUT) D  G NXTGRP
 . D ADD^IBCNSUR3(1,"The ",IBGRPNM," plan is still active.")
 . W !!,@REF@(IBLN),!
 . D SNDBULL
 ; inactivate the plan
 S IBIENWK=IBPLAN_","
 K DTA,ERR
 S DTA(355.3,IBIENWK,.11)=1 ; inactive
 S DTA(355.3,IBIENWK,1.05)=$$NOW^XLFDT() ; last edited
 S DTA(355.3,IBIENWK,1.06)=DUZ ; by
 D FILE^DIE("","DTA","ERR")
 I $D(ERR) D  G NXTGRP
 . D ADD^IBCNSUR3(1,"There was an issue inactivating the ",IBGRPNM," plan.")
 . W !!,@REF@(IBLN),!
 . D SNDBULL
 D ADD^IBCNSUR3(1,"The ",IBGRPNM," plan has been inactivated.")
 W !!,@REF@(IBLN),!
 D SNDBULL
 G NXTGRP
 ;
SNDBULL ; send out the bulletin 
 I '$G(IBLN) Q
 D ADD^IBCNSUR3()
 D ADD^IBCNSUR3(1,"THE PROCESS COMPLETED SUCCESSFULLY ON "_$$DAT1^IBOUTL($$NOW^XLFDT(),1))
 S XMSUB="SUBSCRIPTION LIST FOR INACTIVATED PLAN"
 S XMDUZ="INTEGRATED BILLING PACKAGE",XMTEXT="^TMP("_$J_",""IBCNSURBLL"","
 S XMY(DUZ)=""
 S XMY("G.IB NEW INSURANCE")=""
 D ^XMD
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBCNSUR   14770     printed  Sep 23, 2025@19:54:18                                                                                                                                                                                                    Page 2
IBCNSUR   ;ALB/CPM/CMS - MOVE SUBSCRIBERS TO DIFFERENT PLAN ; 09-SEP-96
 +1       ;;2.0;INTEGRATED BILLING;**103,276,506,516,549,602,664,702,732**;21-MAR-94;Build 13
 +2       ;;Per VA Directive 6402, this routine should not be modified.
 +3        QUIT 
 +4       ;
EN        ; Entry point from option. Main processing loop.
 +1        IF $SELECT('($DATA(DUZ)#2):1,'$DATA(^VA(200,+DUZ,0)):1,1:0)
               WRITE !!?3,"The variable DUZ must be set to an active user code before continuing."
               GOTO ENQ
 +2        WRITE !!,?5,"MOVE SUBSCRIBERS OF ONE PLAN TO ANOTHER PLAN"
 +3        WRITE !,?5,"This option may be used to move subscribers from a selected Plan"
 +4        WRITE !,?5,"to a different Plan. The plans may be associated with the same"
 +5        WRITE !,?5,"Insurance Company or a different one. Plan and Annual Benefit"
 +6        WRITE !,?5,"information may be moved as well. Users of this option should"
 +7        WRITE !,?5,"be knowledgeable of the VistA Patient Insurance management options."
 +8        WRITE !
 +9        WRITE !,?5,"This option also gives the user the option to expire the old plan or"
 +10       WRITE !,?5,"replace it completely in the patient insurance profile.  The reason"
 +11       WRITE !,?5,"to expire the old plan is intended for use when Insurance groups change"
 +12       WRITE !,?5,"PBMs for processing electronic Pharmacy claims.  By leaving the old"
 +13       WRITE !,?5,"plan information intact (i.e. do not replace), the user will be able"
 +14       WRITE !,?5,"to monitor PBM changes  that affect the electronic Pharmacy claims."
 +15      ;
 +16       WRITE !!,$TRANSLATE($JUSTIFY("",75)," ","-")
 +17       SET IBSTOP=0
           FOR 
               DO PROC^IBCNSUR1
               if IBSTOP
                   QUIT 
ENQ        KILL IBSTOP
 +1        QUIT 
 +2       ;
PROC      ; - Process continuation from IBCNSUR1. 
 +1       ; - display old plan attributes; allow new plan to be edited
 +2        DO PL^IBCNSUR2
 +3        READ !!,?10,"Press any key to continue.    ",IBX:DTIME
 +4       ;
 +5       ; - display coverage limitations; allow add/edit of plan 2 limitations
 +6        DO LIM^IBCNSUR2
 +7       ;
 +8        IF $PIECE($GET(^IBA(355.3,IBP1,0)),"^",11)
               WRITE !!,"Please note that ",IBC1N,"'s",!,"plan, subscribers were moved from, is already inactive."
               GOTO PROCDP
 +9       ;
 +10      ; - does the user wish to inactivate the old plan?
 +11       WRITE !!
           SET DIR(0)="Y"
           SET DIR("A")="Do you wish to inactivate "_IBC1N_"'s plan subscribers were moved from"
 +12       SET DIR("?")="If you wish to inactivate the old plan, enter 'Yes' - otherwise, enter 'No.'"
 +13       DO ^DIR
           KILL DIR
           IF 'Y
               WRITE !," <The old plan is still active>"
               GOTO PROCQ
 +14      ;
 +15       DO IRACT^IBCNSJ(IBP1,1)
           WRITE !!,"The plan has been inactivated."
 +16      ;
PROCDP    ; - does the user wish to delete the old plan?
 +1       ;IB*2*702/CKB - Add checks to determine whether a group is allowed to be delete or not
 +2       ;
 +3       ;IB*732/CKB - removed check for the number of subscribers
 +4       ;If moving entire group by expiring the policy by adding a new effective
 +5       ; date, do NOT allow the group to be deleted.
 +6        IF IBGRP
               IF IBSPLIT
                   IF $GET(IBEFFDT)
                       DO NODEL
                       GOTO PROCQ
 +7       ;
 +8       ;IB*732/CKB - should only check for only 1 subscriber.
 +9       ;If moving the entire group (if there is only 1 subscriber) by replacing the
 +10      ; old group plan,the user they should BE allowed to delete the group.
 +11       IF IBGRP
               IF (IBSUB=1)
                   GOTO PROCDP1
 +12      ;
 +13      ;If moving a subset of subscribers from the group by expiring the policy adding
 +14      ; a new effective date, do NOT allow the group to be deleted.
 +15      ;IB*732/CKB - if user selected chose to select subscribers allow for the user
 +16      ; selecting All or Some of the subscribers
 +17      ;;***I 'IBGRP,+NUMSEL<IBSUB,$G(IBEFFDT) D NODEL G PROCQ
 +18       IF 'IBGRP
               IF +NUMSEL'>IBSUB
                   IF $GET(IBEFFDT)
                       DO NODEL
                       GOTO PROCQ
 +19      ;
 +20      ;If moving a subset of subscribers from the group by replacing the old group plan,
 +21      ; do NOT allow the group to be deleted.
 +22      ;IB*732/CKB - if user selected chose to select subscribers allow for the user
 +23      ; selecting All or Some of the subscribers
 +24      ;;***I 'IBGRP,+NUMSEL<IBSUB,'IBSPLIT D NODEL G PROCQ
 +25       IF 'IBGRP
               IF +NUMSEL'>IBSUB
                   IF 'IBSPLIT
                       DO NODEL
                       GOTO PROCQ
 +26      ;
PROCDP1   ; Prompt to delete the plan
 +1        WRITE !!
           SET DIR(0)="Y"
           SET DIR("A")="Do you wish to delete this plan"
 +2        SET DIR("?")="If you wish to delete the old plan, enter 'Yes' - otherwise, enter 'No.'"
 +3        DO ^DIR
           KILL DIR
           IF 'Y
               GOTO PROCQ
 +4       ;
 +5       ;IB*2*702/CKB - Added a "Are you sure" question before deleting the plan
 +6        WRITE !
           SET DIR(0)="Y"
           SET DIR("A")="Are you sure you want to delete this plan"
 +7        SET DIR("?")="If you're sure you want to delete the old plan, enter 'Yes' - otherwise, enter 'No.'"
 +8        DO ^DIR
           KILL DIR
           IF 'Y
               GOTO PROCQ
 +9       ;
 +10       DO DEL^IBCNSJ(IBP1)
           WRITE !!,"The plan has been deleted."
 +11      ;
PROCQ      QUIT 
 +1       ;
NODEL     ;IB*2*702/CKB - Display a "not allowed to delete" message to the user
 +1        WRITE !,"There are still subscribers to this plan. The plan cannot be deleted.",!
 +2        SET DIR(0)="EA"
           SET DIR("A")="Press RETURN to continue."
 +3        DO ^DIR
           KILL DIR
 +4        QUIT 
 +5       ;
SEL(IBNP) ; Select a company and plan.
 +1       ;   Input:     IBNP  --  If set to 1, allows adding a new plan and
 +2       ;                    --  Screen Inactive Companies
 +3       ;                    --  If set to 0, must have at least one group plan
 +4       ;  Output:   IBCNS  --  Pointer to selected company in file #36
 +5       ;           IBPLAN  --  Pointer to selected/added plan in file #355.3
 +6       ;           IBQUIT  --  Set to 1 if the user wants to quit.
 +7       ;
 +8        NEW X,Y
           KILL DIC,DIR
 +9        SET DIC(0)="QEAMZ"
           SET DIC="^DIC(36,"
 +10       IF 'IBNP
               SET DIC("S")="I $$ANYGP^IBCNSJ(+Y,0,1)"
 +11       IF IBNP
               SET DIC("S")="I '$P($G(^DIC(36,+Y,0)),U,5)"
 +12       SET DIC("A")="Select INSURANCE COMPANY: "
 +13       DO ^DIC
           KILL DIC
           SET IBCNS=+Y
 +14       IF Y<0
               WRITE "   <No Insurance Company selected>"
               SET IBQUIT=1
               GOTO SELQ
 +15      ;
 +16      ; - if a new plan may be added, allow adding
 +17       IF IBNP
               Begin DoDot:1
 +18               WRITE !!,"You may add a new Plan at this time or select an existing Plan."
 +19      ; IB*2.0*506 added IBKEY parameter (4th) to the NEW^IBCNSJ3 call (check user's security keys)
 +20               DO NEW^IBCNSJ3(IBCNS,.IBPLAN,1,1)
 +21               IF 'IBPLAN
                       IF '$$ANYGP^IBCNSJ(+IBCNS,0,1)
                           WRITE !!,*7,"Insurance Company receiving subscribers must have a Plan."
                           SET IBQUIT=1
               End DoDot:1
               IF (IBPLAN)!(IBQUIT)
                   GOTO SELQ
 +22      ;
 +23      ; - see if user wants to select the plan
 +24       WRITE !!,"You may select an existing Plan from a list or enter a specific Plan.",!
 +25       SET DIR(0)="Y"
           SET DIR("B")="YES"
           SET DIR("A")="Do you wish to enter a specific plan"
 +26       SET DIR("?")="The look-up facility to select a group plan has been enhanced to use the List Manager.  Enter 'NO' if you wish to select a plan from this look-up, or 'YES' to directly enter a plan."
 +27       DO ^DIR
           KILL DIR
           IF $DATA(DIRUT)
               SET IBQUIT=1
               GOTO SELQ
 +28      ;
 +29      ; - invoke the plan look-up
 +30       IF 'Y
               Begin DoDot:1
 +31               NEW IBTITLE
 +32               SET IBTITLE="Group Plan Lookup"
 +33               WRITE "   ..."
 +34               SET IBPLAN=0
 +35               DO LKP^IBCNSU2(IBCNS,0,0,.IBPLAN,0,1,IBTITLE)
 +36               IF 'IBPLAN
                       WRITE !!,*7,"*  No plan selected!",!
                       SET IBQUIT=1
               End DoDot:1
               GOTO SELQ
 +37      ;
 +38      ; - allow a FileMan look-up
 +39      ; MRD;IB*2.0*516 - Display new Group Name and Number fields.
 +40       SET DIC("A")="Select a GROUP PLAN: "
 +41       SET DIC="^IBA(355.3,"
           SET DIC(0)="AEQM"
           SET DIC("S")="I +^(0)=IBCNS,$P(^(0),U,2)"
 +42      ;S DIC("W")="N IBX S IBX=$G(^(0)) W ""   Name: "",$E($S($P(IBX,U,3)]"""":$P(IBX,U,3),1:""<none>"")_$J("""",20),1,20),""   Number: "",$S($P(IBX,U,4)]"""":$P(IBX,U,4),1:""<none>"")"
 +43       SET DIC("W")="N IBX S IBX=$G(^(2)) W ""   Name: "",$E($S($P(IBX,U,1)]"""":$P(IBX,U,1),1:""<none>"")_$J("""",20),1,20),""   Number: "",$E($S($P(IBX,U,2)]"""":$P(IBX,U,2),1:""<none>""),1,14)"
 +44       DO ^DIC
           KILL DIC
           SET IBPLAN=+Y
 +45       IF Y<0
               WRITE !!,*7,"*  No plan selected!",!
               SET IBQUIT=1
 +46      ;
SELQ       KILL DIRUT,DUOUT,DTOUT,DIROUT
 +1        QUIT 
 +2       ;
EXPGRP    ; EP for [IBCN EXPIRE GROUP SUBSCRIBERS]
 +1       ; IB*2.0*602/DM implement expire group plan 
 +2        NEW X,Y,DIC,DIR,DTA,ERR,REF,IBLN,XMDUZ,XMTEXT,XMSUB,XMY
 +3        NEW IBQUIT,IBCNS,IBPLAN,IBSUB,IBEXP,DFN,IBIPOL,IBIENWK
 +4        NEW IBINSNM,IBGRPNM,IBGRPNO,IBEXPOK,IBEXPERR,IBSUPRES,IBCBI
 +5       ;
 +6        WRITE !!,?5,"EXPIRE ALL SUBSCRIBERS WITHIN A GROUP PLAN"
 +7        WRITE !,?5,"You can use this option to specify an expiration date for all subscriber"
 +8        WRITE !,?5,"policies in a group plan without moving the subscribers to another group"
 +9        WRITE !,?5,"plan. If the group plan status is currently ""active"", you can also choose"
 +10       WRITE !,?5,"to ""inactivate"" the group plan."
 +11       WRITE !!,$TRANSLATE($JUSTIFY("",75)," ","-")
 +12       SET IBQUIT=1
 +13      ;
NXTGRP    ; EP for next expire group process
 +1       ; subscribers
           KILL ^TMP($JOB,"IBCNSUR")
 +2       ; bulletin  
           KILL ^TMP($JOB,"IBCNSURBLL")
 +3        IF 'IBQUIT
               Begin DoDot:1
 +4                WRITE !!,"=========================================="
 +5                WRITE !,"EXPIRE ALL SUBSCRIBERS WITHIN A GROUP PLAN"
 +6                WRITE !,"==========================================",!
               End DoDot:1
 +7       ; get insco and plan
 +8        SET IBQUIT=0
 +9        DO SEL^IBCNSUR(0)
           IF IBQUIT
               QUIT 
 +10      ;
 +11      ; Make sure plan has at least one subscriber
 +12       IF '$$SUBS^IBCNSJ(IBCNS,IBPLAN,0,,1)
               WRITE !!,?5,*7,"* This group plan has no subscribers!",!
               GOTO NXTGRP
 +13      ;
 +14       SET IBINSNM=$$GET1^DIQ(36,IBCNS_",","NAME")
 +15       SET IBGRPNM=$$GET1^DIQ(355.3,IBPLAN_",","GROUP NAME")
 +16       SET IBGRPNO=$$GET1^DIQ(355.3,IBPLAN_",","GROUP NUMBER")
 +17      ;
 +18       WRITE !!,"Collecting Subscribers ..."
 +19       SET IBSUB=$$SUBS^IBCNSJ(IBCNS,IBPLAN,0,"^TMP($J,""IBCNSUR"")")
 +20       WRITE !!,"This group plan has "_+IBSUB_" subscribers. All subscribers will be expired.",!
 +21       SET DIR(0)="Y"
 +22       SET DIR("A")="Do you want to expire all subscribers' policies for this plan"
 +23       SET DIR("?",1)="You will be asked for an expiration date to terminate the attached policies."
 +24       SET DIR("?",2)="You will have an opportunity to stop if desired."
 +25       SET DIR("?")="Enter 'Yes' to continue, or 'No' to stop the process now."
 +26       DO ^DIR
           KILL DIR
 +27       IF 'Y!$DATA(DIRUT)
               GOTO NXTGRP
 +28      ;
 +29       WRITE !
 +30      ; get the expiration date
 +31      ;IB*2.0*664/TAZ - Force exact date.
 +32       SET DIR(0)="D^::EX"
           SET DIR("A")="Enter expiration date (applies to all subscribers in this plan)"
 +33       SET DIR("?")="Each active policy will be expired with the expiration date entered."
 +34       DO ^DIR
           KILL DIR
 +35       IF 'Y!$DATA(DIRUT)
               GOTO NXTGRP
 +36       SET IBEXP=Y
 +37      ;
 +38       WRITE !!,"You selected to expire "_+IBSUB_" subscriber(s) with Expiration Date "_$$FMTE^XLFDT(IBEXP)_" for:"
 +39       WRITE !,?5,"Insurance Company "_IBINSNM
 +40       WRITE !,?5,"Plan Name "_IBGRPNM_"    Number "_IBGRPNO
 +41       WRITE !!,"Please Note that the policy will be EXPIRED in the patient profile!!",!
 +42      ; 
 +43       SET DIR(0)="Y"
           SET DIR("A")="Okay to continue"
 +44       SET DIR("?",1)="If you wish to expire the policies for these subscribers, enter 'Yes'."
 +45       SET DIR("?")="Otherwise, enter 'No' to exit."
 +46       DO ^DIR
           KILL DIR
 +47       IF 'Y!$DATA(DIRUT)
               GOTO NXTGRP
 +48      ;
 +49      ; expire the plan subscribers
 +50      ; as we process the policies, we'll set the ^TMP nodes to 'O'k or 'E'rror
 +51       WRITE !!,"Expiring Policies...",!
 +52      ; tell COVERED^IBCNSM31 to be quiet
           SET IBSUPRES=1
 +53       SET (IBEXPOK,IBEXPERR)=0
 +54       SET DFN=0
           FOR 
               SET DFN=$ORDER(^TMP($JOB,"IBCNSUR",DFN))
               if 'DFN
                   QUIT 
               Begin DoDot:1
 +55               SET IBIPOL=0
                   FOR 
                       SET IBIPOL=$ORDER(^TMP($JOB,"IBCNSUR",DFN,IBIPOL))
                       if IBIPOL=""
                           QUIT 
                       Begin DoDot:2
 +56                       SET IBIENWK=IBIPOL_","_DFN_","
 +57                       if $$GET1^DIQ(2.312,IBIENWK,"GROUP PLAN","I")'=IBPLAN
                               QUIT 
 +58                       if +$$GET1^DIQ(2.312,IBIENWK,"INSURANCE EXPIRATION","I")
                               QUIT 
 +59                       IF $$GET1^DIQ(2.312,IBIENWK,"EFFECTIVE DATE OF POLICY","I")>IBEXP
                               SET ^TMP($JOB,"IBCNSUR",DFN,IBIPOL)="E"
                               SET IBEXPERR=IBEXPERR+1
                               QUIT 
 +60                       SET IBCBI=$$GET1^DIQ(2,DFN_",","COVERED BY HEALTH INSURANCE?","I")
 +61                       KILL DTA,ERR
 +62      ; set the expiration date
                           SET DTA(2.312,IBIENWK,3)=IBEXP
 +63      ; last edited
                           SET DTA(2.312,IBIENWK,1.05)=$$NOW^XLFDT()
 +64      ; by
                           SET DTA(2.312,IBIENWK,1.06)=DUZ
 +65                       DO FILE^DIE("","DTA","ERR")
 +66                       IF $DATA(ERR)
                               SET ^TMP($JOB,"IBCNSUR",DFN,IBIPOL)="E"
                               SET IBEXPERR=IBEXPERR+1
                               QUIT 
 +67                       SET ^TMP($JOB,"IBCNSUR",DFN,IBIPOL)="O"
                           SET IBEXPOK=IBEXPOK+1
 +68      ; set covered by insurance 
                           DO COVERED^IBCNSM31(DFN,IBCBI)
                       End DoDot:2
               End DoDot:1
 +69      ;
 +70       WRITE !,"Done. "_IBEXPOK_" Subscribers' policies were expired as of "_$$FMTE^XLFDT(IBEXP)_"."
 +71       WRITE !,"A Bulletin was sent to you and members of 'IB NEW INSURANCE' Mail Group."
 +72      ;
 +73      ; prepare the bulletin
 +74       SET IBLN=0
           SET REF=$NAME(^TMP($JOB,"IBCNSURBLL"))
 +75       DO ADD^IBCNSUR3(1,"EXPIRE ALL SUBSCRIBERS WITHIN A GROUP PLAN")
 +76       DO ADD^IBCNSUR3()
 +77       DO ADD^IBCNSUR3(1,"You selected to expire ",IBSUB," subscriber(s)")
 +78       DO ADD^IBCNSUR3()
 +79       DO ADD^IBCNSUR3(1,"FROM Insurance Company ",IBINSNM)
 +80       DO ADD^IBCNSUR3(1,"Plan Name ",IBGRPNM,"    Number ",IBGRPNO)
 +81       DO ADD^IBCNSUR3()
 +82       DO ADD^IBCNSUR3(1,"Policies will be expired as of ",$$FMTE^XLFDT(IBEXP),".")
 +83       DO ADD^IBCNSUR3()
 +84      ;
 +85       IF IBEXPERR
               Begin DoDot:1
 +86               DO ADD^IBCNSUR3(1,"* These ",IBEXPERR," entries could not be processed, they'll need to be adjusted manually")
 +87               WRITE !!,@REF@(IBLN)
 +88               DO ADD^IBCNSUR3(1,"-------------------------------------------------------------------------------")
 +89               WRITE !,@REF@(IBLN)
 +90               DO ADD^IBCNSUR3(1,"Patient Name/ID             Whose    Employer              Effective   Expires")
 +91               WRITE !,@REF@(IBLN),!
 +92               SET DFN=0
                   FOR 
                       SET DFN=$ORDER(^TMP($JOB,"IBCNSUR",DFN))
                       if 'DFN
                           QUIT 
                       Begin DoDot:2
 +93                       SET IBIPOL=0
                           FOR 
                               SET IBIPOL=$ORDER(^TMP($JOB,"IBCNSUR",DFN,IBIPOL))
                               if IBIPOL=""
                                   QUIT 
                               Begin DoDot:3
 +94                               IF ^TMP($JOB,"IBCNSUR",DFN,IBIPOL)'="E"
                                       QUIT 
 +95                               DO ADS^IBCNSUR3(DFN,IBIPOL)
 +96                               WRITE !,@REF@(IBLN)
                               End DoDot:3
                       End DoDot:2
 +97               DO ADD^IBCNSUR3(1,"============================")
 +98               DO ADD^IBCNSUR3()
 +99               WRITE !!,"Examine the entries that could not be processed."
               End DoDot:1
 +100     ;
 +101      IF IBEXPOK
               Begin DoDot:1
 +102              DO ADD^IBCNSUR3(1,"These ",IBEXPOK," policies were processed successfully")
 +103              DO ADD^IBCNSUR3(1,"-------------------------------------------------------------------------------")
 +104              DO ADD^IBCNSUR3(1,"Patient Name/ID             Whose    Employer              Effective   Expires")
 +105              SET DFN=0
                   FOR 
                       SET DFN=$ORDER(^TMP($JOB,"IBCNSUR",DFN))
                       if 'DFN
                           QUIT 
                       Begin DoDot:2
 +106                      SET IBIPOL=0
                           FOR 
                               SET IBIPOL=$ORDER(^TMP($JOB,"IBCNSUR",DFN,IBIPOL))
                               if IBIPOL=""
                                   QUIT 
                               Begin DoDot:3
 +107                              IF ^TMP($JOB,"IBCNSUR",DFN,IBIPOL)'="O"
                                       QUIT 
 +108                              DO ADS^IBCNSUR3(DFN,IBIPOL)
                               End DoDot:3
                       End DoDot:2
 +109              DO ADD^IBCNSUR3(1,"============================")
 +110              DO ADD^IBCNSUR3()
               End DoDot:1
 +111     ;
 +112      IF 'IBEXPOK
               IF 'IBEXPERR
                   Begin DoDot:1
 +113                  DO ADD^IBCNSUR3(1,"============================")
 +114                  DO ADD^IBCNSUR3(1,"After processing, no changes were needed, no policies were expired.")
 +115                  WRITE !!,@REF@(IBLN)
 +116                  DO ADD^IBCNSUR3(1,"============================")
 +117                  DO ADD^IBCNSUR3()
                   End DoDot:1
 +118     ;
 +119      WRITE !
 +120      SET DIR(0)="EA"
           SET DIR("A")="Press RETURN to continue."
           DO ^DIR
           KILL DIR
 +121     ;
 +122      IF +$$GET1^DIQ(355.3,IBPLAN_",","INACTIVE","I")
               Begin DoDot:1
 +123              DO ADD^IBCNSUR3(1,"Please note the ",IBGRPNM," plan is already inactive.")
 +124              WRITE !!,@REF@(IBLN),!
 +125              DO SNDBULL
               End DoDot:1
               GOTO NXTGRP
 +126     ;
 +127      WRITE !
 +128      SET DIR(0)="Y"
           SET DIR("B")="NO"
 +129      IF IBEXPERR
               Begin DoDot:1
 +130              SET DIR("A",1)="       ***********************************************"
 +131              SET DIR("A",2)="       *                   WARNING                   *"
 +132              SET DIR("A",3)="       *     There are still active subscribers      *"
 +133              SET DIR("A",4)="       *   that will need to be adjusted manually    *"
 +134              SET DIR("A",5)="       ***********************************************"
 +135              SET DIR("A",6)=" "
               End DoDot:1
 +136      SET DIR("A")="Do you wish to inactivate plan "_IBGRPNM
 +137      DO ^DIR
           KILL DIR
 +138      IF 'Y!$DATA(DIRUT)
               Begin DoDot:1
 +139              DO ADD^IBCNSUR3(1,"The ",IBGRPNM," plan is still active.")
 +140              WRITE !!,@REF@(IBLN),!
 +141              DO SNDBULL
               End DoDot:1
               GOTO NXTGRP
 +142     ; inactivate the plan
 +143      SET IBIENWK=IBPLAN_","
 +144      KILL DTA,ERR
 +145     ; inactive
           SET DTA(355.3,IBIENWK,.11)=1
 +146     ; last edited
           SET DTA(355.3,IBIENWK,1.05)=$$NOW^XLFDT()
 +147     ; by
           SET DTA(355.3,IBIENWK,1.06)=DUZ
 +148      DO FILE^DIE("","DTA","ERR")
 +149      IF $DATA(ERR)
               Begin DoDot:1
 +150              DO ADD^IBCNSUR3(1,"There was an issue inactivating the ",IBGRPNM," plan.")
 +151              WRITE !!,@REF@(IBLN),!
 +152              DO SNDBULL
               End DoDot:1
               GOTO NXTGRP
 +153      DO ADD^IBCNSUR3(1,"The ",IBGRPNM," plan has been inactivated.")
 +154      WRITE !!,@REF@(IBLN),!
 +155      DO SNDBULL
 +156      GOTO NXTGRP
 +157     ;
SNDBULL   ; send out the bulletin 
 +1        IF '$GET(IBLN)
               QUIT 
 +2        DO ADD^IBCNSUR3()
 +3        DO ADD^IBCNSUR3(1,"THE PROCESS COMPLETED SUCCESSFULLY ON "_$$DAT1^IBOUTL($$NOW^XLFDT(),1))
 +4        SET XMSUB="SUBSCRIPTION LIST FOR INACTIVATED PLAN"
 +5        SET XMDUZ="INTEGRATED BILLING PACKAGE"
           SET XMTEXT="^TMP("_$JOB_",""IBCNSURBLL"","
 +6        SET XMY(DUZ)=""
 +7        SET XMY("G.IB NEW INSURANCE")=""
 +8        DO ^XMD
 +9        QUIT