USP_DATAFORMTEMPLATE_ADD_MEMBERSHIPPROGRAMCONFIGURATIONWIZARD

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@CHANGEAGENTID uniqueidentifier IN
@PROGRAMNAME nvarchar(100) IN
@CATEGORY tinyint IN
@DESCRIPTION nvarchar(255) IN
@SITEID uniqueidentifier IN
@ANNUAL bit IN
@RECURRINGSUSTAINING bit IN
@LIFETIME bit IN
@DUESBASED bit IN
@CONTRIBUTIONSBASED bit IN
@BOTHWAYSBASED bit IN
@SINGLETERM bit IN
@SINGLETERMLENGTH tinyint IN
@SINGLETERMLENGTHCODE tinyint IN
@MULTIPLETERMS bit IN
@MEMBERSHIPLEVELS xml IN
@ADDONS xml IN
@MEMBERSHIPLEVELTERMS xml IN
@RECURRINGPRICES xml IN
@CARDFORMAT nvarchar(255) IN
@NAMEFORMATLIST uniqueidentifier IN
@ENTIREAMOUNT bit IN
@PARTIALAMOUNT bit IN
@NOAMOUNT bit IN
@DUESTREATEDASCONTRIBUTION bit IN
@DUESONEPAYMENTEACHTERM bit IN
@DUESMULTIPLEPAYMENTSEACHTERM bit IN
@DESIGNATIONSFORCONTRIBUTEDPORTION xml IN
@DISCOUNTSFORPROGRAM xml IN
@MEMBERSHIPTERMTYPE tinyint IN
@DUESBASEDEXPIRATIONDATETYPE tinyint IN
@DUESBASEDEXPIRATIONDATE UDT_MONTHDAY IN
@CONTRIBUTIONISMEMBERSHIPDUECOUNTED bit IN
@CONTRIBUTIONISEVENTREGISTRATIONCOUNTED bit IN
@CONTRIBUTIONINCLUDEPAYMENTACTIVITYTYPECODE tinyint IN
@CONTRIBUTIONISRECURRINGGIFTCOUNTED bit IN
@CONTRIBUTIONISPLEDGECOUNTED bit IN
@CONTRIBUTIONISPAYMENTCOUNTED bit IN
@CONTRIBUTIONINCLUDEEVENTTYPECODE tinyint IN
@CONTRIBUTIONINCLUDEMEMBERSHIPTYPECODE tinyint IN
@CONTRIBUTIONEVENTCATEGORYCODEID uniqueidentifier IN
@CONTRIBUTIONMEMBERSHIPPROGRAMID uniqueidentifier IN
@CONTRIBUTIONDESIGNATIONID uniqueidentifier IN
@CONTRIBUTIONIDSETREGISTERID uniqueidentifier IN
@CONTRIBUTIONISMULTIPLEREVENUETRANSACTIONSCOUNTED bit IN
@EXPIRATIONENDOFPRIORMONTH bit IN
@EXPIRATIONENDOFPRIORMONTHCUTOFF tinyint IN
@RENEWALWINDOWSTART tinyint IN
@AUTOMATICRENEWALRADIO tinyint IN
@AUTOMATICRENEWALNUMBERDAY tinyint IN
@AUTOMATICRENEWALNUMBERMONTH tinyint IN
@AUTOMATICRENEWALTIMETYPE tinyint IN
@AUTOMATICRENEWALDAYOFMONTH int IN
@RENEWALWINDOWEND tinyint IN
@AFTEREXPIRATIONCLASSIFICATION1 tinyint IN
@AFTEREXPIRATIONCLASSIFICATION2 tinyint IN
@AFTEREXPIRATIONCLASSIFICATION3 tinyint IN
@AFTEREXPIRATIONTIMEPERIOD1 tinyint IN
@AFTEREXPIRATIONTIMEPERIOD2 tinyint IN
@AFTEREXPIRATIONTIMEPERIOD3 tinyint IN
@REVENUEAFTERRENEWALWINDOWTYPE tinyint IN
@CLASSIFICATIONAFTERRENEWALWINDOWTYPE tinyint IN
@BASECURRENCYID uniqueidentifier IN
@GLOBALBENEFITS xml IN
@WHATHAPPENSIFTHEYGIVEMORECODE tinyint IN
@WHATDATETOCALCULATEEXPIRATIONDATECODE tinyint IN
@MULTIPLETERMSUNITS xml IN
@ANNUALLYPAYMENTOPTION bit IN
@QUARTERLYPAYMENTOPTION bit IN
@SEMIANNUALLYPAYMENTOPTION bit IN
@MONTHLYPAYMENTOPTION bit IN
@LIFETIMEPAYMENTOPTIONS xml IN
@ADDONSUSED bit IN
@REPORTCATALOGID uniqueidentifier IN
@LETTERTEMPLATEID uniqueidentifier IN
@ISTYPEPROGRAM bit IN
@WHEREISREVENUETRACKED tinyint IN
@EXPIRATIONDATES xml IN
@INSTALLMENTPOSTSTATUSCODE tinyint IN
@CONTRIBUTIONCRITERIADEFINITIONTYPECODE tinyint IN
@CONTRIBUTIONAPPLICATIONSELECTIONID uniqueidentifier IN

Definition

Copy

                CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_MEMBERSHIPPROGRAMCONFIGURATIONWIZARD
                (
                    @ID uniqueidentifier = null output,
                    @CHANGEAGENTID uniqueidentifier = null,
                    @PROGRAMNAME nvarchar(100) = '',
                    @CATEGORY tinyint = 9,
                    @DESCRIPTION nvarchar(255) = '',
                    @SITEID uniqueidentifier = null,
                    @ANNUAL bit = 1,
                    @RECURRINGSUSTAINING bit = 0,
                    @LIFETIME bit = 0,
                    @DUESBASED bit = 1,
                    @CONTRIBUTIONSBASED bit = 0,
                    @BOTHWAYSBASED bit = 0,
                    @SINGLETERM bit = 1,
                    @SINGLETERMLENGTH tinyint = 1,
                    @SINGLETERMLENGTHCODE tinyint = 1,
                    @MULTIPLETERMS bit = 0,
                    @MEMBERSHIPLEVELS XML = null,
                    @ADDONS XML = null,
                    @MEMBERSHIPLEVELTERMS xml = null,
                    @RECURRINGPRICES xml = null,
                    @CARDFORMAT nvarchar(255) = null,
                    @NAMEFORMATLIST uniqueidentifier = null,
                    @ENTIREAMOUNT bit = 1,
                    @PARTIALAMOUNT bit = 0,
                    @NOAMOUNT bit = 0,
                    @DUESTREATEDASCONTRIBUTION bit = 0,
                    @DUESONEPAYMENTEACHTERM bit = 1,
                    @DUESMULTIPLEPAYMENTSEACHTERM bit = 0,
                    @DESIGNATIONSFORCONTRIBUTEDPORTION xml = null,
                    @DISCOUNTSFORPROGRAM xml = null,
                    @MEMBERSHIPTERMTYPE tinyint = 0,
                    @DUESBASEDEXPIRATIONDATETYPE tinyint = 0,
                    @DUESBASEDEXPIRATIONDATE dbo.UDT_MONTHDAY = 0000,
                    @CONTRIBUTIONISMEMBERSHIPDUECOUNTED bit = 0,
                    @CONTRIBUTIONISEVENTREGISTRATIONCOUNTED bit = 0,
                    @CONTRIBUTIONINCLUDEPAYMENTACTIVITYTYPECODE tinyint = 0,
                    @CONTRIBUTIONISRECURRINGGIFTCOUNTED bit = 0,
                    @CONTRIBUTIONISPLEDGECOUNTED bit = 0,
                    @CONTRIBUTIONISPAYMENTCOUNTED bit = 0,
                    @CONTRIBUTIONINCLUDEEVENTTYPECODE tinyint = 0,
                    @CONTRIBUTIONINCLUDEMEMBERSHIPTYPECODE tinyint = 0,
                    @CONTRIBUTIONEVENTCATEGORYCODEID uniqueidentifier = null,
                    @CONTRIBUTIONMEMBERSHIPPROGRAMID uniqueidentifier = null,
                    @CONTRIBUTIONDESIGNATIONID uniqueidentifier = null,
                    @CONTRIBUTIONIDSETREGISTERID uniqueidentifier = null,
                    @CONTRIBUTIONISMULTIPLEREVENUETRANSACTIONSCOUNTED bit = 0,
                    @EXPIRATIONENDOFPRIORMONTH bit = 0,
                    @EXPIRATIONENDOFPRIORMONTHCUTOFF tinyint = 1,
                    @RENEWALWINDOWSTART tinyint = 0,
                    @AUTOMATICRENEWALRADIO tinyint = 0,
                    @AUTOMATICRENEWALNUMBERDAY tinyint = 0,
                    @AUTOMATICRENEWALNUMBERMONTH tinyint = 0,
                    @AUTOMATICRENEWALTIMETYPE tinyint = 0,
                    @AUTOMATICRENEWALDAYOFMONTH int = 1,
                    @RENEWALWINDOWEND tinyint = 0,
                    @AFTEREXPIRATIONCLASSIFICATION1 tinyint = null,
                    @AFTEREXPIRATIONCLASSIFICATION2 tinyint = null,
                    @AFTEREXPIRATIONCLASSIFICATION3 tinyint = null,
                    @AFTEREXPIRATIONTIMEPERIOD1 tinyint = null,
                    @AFTEREXPIRATIONTIMEPERIOD2 tinyint = null,
                    @AFTEREXPIRATIONTIMEPERIOD3 tinyint = null,
                    @REVENUEAFTERRENEWALWINDOWTYPE tinyint = 0,
                    @CLASSIFICATIONAFTERRENEWALWINDOWTYPE tinyint = 4,
                    @BASECURRENCYID uniqueidentifier = null,
                    @GLOBALBENEFITS xml = null,
                    @WHATHAPPENSIFTHEYGIVEMORECODE tinyint = 0,
                    @WHATDATETOCALCULATEEXPIRATIONDATECODE tinyint = 0,
                    @MULTIPLETERMSUNITS xml = null,
                    @ANNUALLYPAYMENTOPTION bit = 1,
                    @QUARTERLYPAYMENTOPTION bit = 0,
                    @SEMIANNUALLYPAYMENTOPTION bit = 0,
                    @MONTHLYPAYMENTOPTION bit = 0,
                    @LIFETIMEPAYMENTOPTIONS XML = null,
                    @ADDONSUSED bit = 0,
                    @REPORTCATALOGID uniqueidentifier = null,
                    @LETTERTEMPLATEID uniqueidentifier = null,
                    @ISTYPEPROGRAM bit = 0,
                    @WHEREISREVENUETRACKED tinyint = 0,
                    @EXPIRATIONDATES xml = null,
                    @INSTALLMENTPOSTSTATUSCODE tinyint = 3,
                    @CONTRIBUTIONCRITERIADEFINITIONTYPECODE tinyint = 0,
                    @CONTRIBUTIONAPPLICATIONSELECTIONID uniqueidentifier = null
                )
                as

                set nocount on;

                if @ID is null
                    set @ID = newid()

                if @CHANGEAGENTID is null  
                    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

                declare @CURRENTDATE datetime
                set @CURRENTDATE = getdate()

                declare @RENEWALINFOID uniqueidentifier

                declare @MEMBERSHIPTERMTYPE_DATEVARIESWITHSTARTDATE tinyint = 0
                declare @MEMBERSHIPTERMTYPE_DATEISFIXED tinyint = 1

                --Default do not post if no post status is provided
                if isnull(@INSTALLMENTPOSTSTATUSCODE,0) = 0
                    set @INSTALLMENTPOSTSTATUSCODE = 3

                begin try

                    -- save program
                    insert into dbo.MEMBERSHIPPROGRAM
                    (
                        ID,
                        NAME,
                        DESCRIPTION,
                        SITEID,
                        ISACTIVE,
                        EXPIRESONCODE,
                        BACKDATEMEMBERSHIPS,
                        CUTOFFDAY,
                        CATEGORYCODE,
                        PROGRAMTYPECODE,
                        PROGRAMBASEDONCODE,
                        CARDFORMAT,
                        NAMEFORMATID,
                        DEDUCTIBILITYCODE,
                        DUESTREATEDASCONTRIBUTION,
                        ONEPAYMENTEACHTERM,
                        MULTIPLEPAYMENTSEACHTERM,
                        RENEWALWINDOWSTARTTYPECODE,
                        RENEWALWINDOWSTARTTIMECODE,
                        RENEWALWINDOWSTARTINTERVALCODE,
                        RENEWALWINDOWSTARTCUTOFFDAY,
                        RENEWALWINDOWREVENUETYPECODE,
                        NONRENEWALACTIONTYPECODE,
                        INSTALLMENTPOSTSTATUSCODE,
                        ADDEDBYID,
                        CHANGEDBYID,
                        DATEADDED,
                        DATECHANGED,
                        BASECURRENCYID,
                        REPORTCATALOGID,
                        LETTERTEMPLATEID,
                        ISTYPEPROGRAM,
                        WHEREISREVENUETRACKEDCODE,
                        MULTIPLETERMS
                    )
                    values
                    (
                        @ID,
                        @PROGRAMNAME,
                        @DESCRIPTION,
                        @SITEID,
                        1,
                        @DUESBASEDEXPIRATIONDATETYPE,
                        @EXPIRATIONENDOFPRIORMONTH,
                        case when @EXPIRATIONENDOFPRIORMONTH = 1 then @EXPIRATIONENDOFPRIORMONTHCUTOFF else 0 end,
                        @CATEGORY,
                        case when @ANNUAL = 1 then 0 when @RECURRINGSUSTAINING = 1 then 1 when @LIFETIME = 1 then 2 end,
                        case when @DUESBASED = 1 then 0 when @CONTRIBUTIONSBASED = 1 then 1 when @BOTHWAYSBASED = 1 then 2 end,
                        @CARDFORMAT,
                        @NAMEFORMATLIST,
                   case when @ENTIREAMOUNT = 1 then 0 when @PARTIALAMOUNT = 1 then 1 when @NOAMOUNT = 1 then 2 end,
                        @DUESTREATEDASCONTRIBUTION,
                        @DUESONEPAYMENTEACHTERM,
                        case when @LIFETIME = 1 then 1 else @DUESMULTIPLEPAYMENTSEACHTERM end,
                        @AUTOMATICRENEWALRADIO,
                        case when @AUTOMATICRENEWALTIMETYPE = 0 then @AUTOMATICRENEWALNUMBERDAY else @AUTOMATICRENEWALNUMBERMONTH end,
                        @AUTOMATICRENEWALTIMETYPE,
                        case when @AUTOMATICRENEWALRADIO = 1 then @AUTOMATICRENEWALDAYOFMONTH else 1 end,
                        @REVENUEAFTERRENEWALWINDOWTYPE,
                        @CLASSIFICATIONAFTERRENEWALWINDOWTYPE,
                        @INSTALLMENTPOSTSTATUSCODE,
                        @CHANGEAGENTID,
                        @CHANGEAGENTID,
                        @CURRENTDATE,
                        @CURRENTDATE,
                        @BASECURRENCYID,
                        @REPORTCATALOGID,
                        @LETTERTEMPLATEID,
                        @ISTYPEPROGRAM,
                        @WHEREISREVENUETRACKED,
                        @MULTIPLETERMS
                    )

                    if @MEMBERSHIPTERMTYPE = @MEMBERSHIPTERMTYPE_DATEISFIXED
                    begin
                        insert into dbo.MEMBERSHIPPROGRAMENDDATE
                        (
                            ID,
                            MEMBERSHIPPROGRAMID,
                            EXPIRATIONDATE,
                            PUSHNEXTDATE,
                            SEQUENCE,
                            ADDEDBYID,
                            CHANGEDBYID,
                            DATEADDED,
                            DATECHANGED
                        )
                        select
                            newid(),
                            @ID as MEMBERSHIPPROGRAMID,
                            T.c.value('(EXPIRATIONDATE)[1]', 'char(4)') as EXPIRATIONDATE,
                            T.c.value('(PUSHNEXTDATE)[1]', 'char(4)') as PUSHNEXTDATE,
                            row_number() over (order by T.c.value('(EXPIRATIONDATE)[1]', 'char(4)'), T.c.value('(PUSHNEXTDATE)[1]', 'char(4)')) as SEQUENCE,
                            @CHANGEAGENTID,
                            @CHANGEAGENTID,
                            @CURRENTDATE,
                            @CURRENTDATE
                        from @EXPIRATIONDATES.nodes('/EXPIRATIONDATES/ITEM') T(c)
                    end

                    -- save levels
                    insert into dbo.MEMBERSHIPLEVEL
                    (
                        ID,
                        NAME,
                        MEMBERSHIPPROGRAMID,
                        DESCRIPTION,
                        TIERCODEID,
                        MEMBERSALLOWED,
                        CHILDRENALLOWED,
                        CARDSALLOWED,
                        ISACTIVE,
                        FORCEMANUALDOWNGRADES,
                        RENEWALWINDOWREVENUETYPECODE,
                        NONRENEWALACTIONTYPECODE,
                        MEMBERSHIPTERMTYPECODE,
                        BEFOREEXPIRATION,
                        AFTEREXPIRATION,
                        RENEWALWINDOWSTARTTYPECODE,
                        RENEWALWINDOWSTARTTIMECODE,
                        RENEWALWINDOWSTARTINTERVALCODE,
                        RENEWALWINDOWSTARTCUTOFFDAY,
                        ADDEDBYID,
                        CHANGEDBYID,
                        DATEADDED,
                        DATECHANGED,
                        SEQUENCE,
                        RECEIPTAMOUNT,
                        OBTAINLEVELCODE,
                        BASECURRENCYID
                    )
                    select
                        T.c.value('(ID)[1]', 'uniqueidentifier'),
                        T.c.value('(NAME)[1]', 'nvarchar(100)'),
                        @ID,
                        T.c.value('(DESCRIPTION)[1]', 'nvarchar(255)'),
                        T.c.value('(TIER)[1]', 'uniqueidentifier'),
                        T.c.value('(MEMBERSALLOWED)[1]', 'smallint'),
                        T.c.value('(CHILDRENALLOWED)[1]', 'smallint'),
                        T.c.value('(CARDSALLOWED)[1]', 'smallint'),
                        1,
            T.c.value('(CANDEMOTE)[1]', 'bit'),
                        @REVENUEAFTERRENEWALWINDOWTYPE,
                        @CLASSIFICATIONAFTERRENEWALWINDOWTYPE,
                        @MEMBERSHIPTERMTYPE,
                        @RENEWALWINDOWSTART,
                        @RENEWALWINDOWEND,
                        @AUTOMATICRENEWALRADIO,
                        case when @AUTOMATICRENEWALTIMETYPE = 0 then @AUTOMATICRENEWALNUMBERDAY else @AUTOMATICRENEWALNUMBERMONTH end,
                        @AUTOMATICRENEWALTIMETYPE,
                        case when @AUTOMATICRENEWALRADIO = 1 then @AUTOMATICRENEWALDAYOFMONTH else 1 end,
                        @CHANGEAGENTID,
                        @CHANGEAGENTID,
                        @CURRENTDATE,
                        @CURRENTDATE,
                        T.c.value('(SEQUENCE)[1]', 'int'),
                        T.c.value('(RECEIPTAMOUNT[1])','money'),
                        case when @DUESBASED = 1 then 0 when @CONTRIBUTIONSBASED = 1 then 1 when @BOTHWAYSBASED = 1 then T.c.value('(HOWPEOPLEOBTAINLEVEL)[1]','tinyint') end,
                        @BASECURRENCYID
                    from @MEMBERSHIPLEVELS.nodes('/MEMBERSHIPLEVELS/ITEM') T(c)

                    --Save benefits
                    insert into dbo.MEMBERSHIPLEVELBENEFIT
                    (
                        ID, MEMBERSHIPLEVELID, BENEFITID,
                        QUANTITY, UNITVALUE, DETAILS,
                        ADDEDBYID, CHANGEDBYID, DATEADDED,
                        DATECHANGED, USEPERCENT, VALUEPERCENT,
                        BASECURRENCYID, FREQUENCYCODE, NUMBERTOOFFERCODE
                    )
                    select
                        newid(), T.c.value('(MEMBERSHIPLEVELID)[1]','uniqueidentifier'), T.c.value('(BENEFITID)[1]','uniqueidentifier'),
                        T.c.value('(QUANTITY)[1]','int'), T.c.value('(UNITVALUE)[1]','money'), coalesce(T.c.value('(DETAILS)[1]','nvarchar(255)'),''),
                        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE,
                        @CURRENTDATE, T.c.value('(USEPERCENT)[1]','bit'), T.c.value('(VALUEPERCENT)[1]','decimal'),
                        BENEFIT.BASECURRENCYID, T.c.value('(FREQUENCY)[1]','tinyint'), T.c.value('(NUMBERTOOFFER)[1]','tinyint')

                    from
                        @GLOBALBENEFITS.nodes('/GLOBALBENEFITS/ITEM') T(c)
            inner join dbo.BENEFIT on BENEFIT.ID = T.c.value('(BENEFITID)[1]','uniqueidentifier')

                    if @AFTEREXPIRATIONCLASSIFICATION1 is not null
                    begin
                        set @RENEWALINFOID = newid()

                        -- create new default record
                        insert into dbo.MEMBERSHIPPROGRAMRENEWAL
                        (
                            ID, MEMBERSHIPPROGRAMID, STATUSCODE,
                            INTERVALCODE, ADDEDBYID, CHANGEDBYID,
                            DATEADDED, DATECHANGED
                        )
                        values
                        (
                            @RENEWALINFOID, @ID, @AFTEREXPIRATIONCLASSIFICATION1,
                            @AFTEREXPIRATIONTIMEPERIOD1, @CHANGEAGENTID, @CHANGEAGENTID,
                            @CURRENTDATE, @CURRENTDATE
                        )

                        -- link default record to this one
                        update
                            dbo.MEMBERSHIPPROGRAM
                        set
                            MEMBERSHIPPROGRAMRENEWAL1ID = @RENEWALINFOID
                        where
                            ID = @ID


                        declare @RENEWALIDTABLE1 table (RENEWALID uniqueidentifier, MEMBERSHIPLEVELID uniqueidentifier)
                        insert into @RENEWALIDTABLE1 (RENEWALID,MEMBERSHIPLEVELID) select newid(),ID from dbo.MEMBERSHIPLEVEL where MEMBERSHIPPROGRAMID = @ID
                        -- create new level-specific records
                        insert into dbo.MEMBERSHIPLEVELRENEWAL
                        (
                            ID, MEMBERSHIPLEVELID, STATUSCODE,
                            INTERVALCODE, ADDEDBYID, CHANGEDBYID,
                            DATEADDED, DATECHANGED
                        )
                        select
                            RENEWALID, MEMBERSHIPLEVELID, @AFTEREXPIRATIONCLASSIFICATION1,
                            @AFTEREXPIRATIONTIMEPERIOD1, @CHANGEAGENTID, @CHANGEAGENTID,
                            @CURRENTDATE, @CURRENTDATE
                        from @RENEWALIDTABLE1

                        -- initialize all levels to default
                        update
                            dbo.MEMBERSHIPLEVEL
                        set
                                        MEMBERSHIPLEVELRENEWAL1ID = RIT.RENEWALID
                          from dbo.MEMBERSHIPLEVEL
                          inner join @RENEWALIDTABLE1 RIT on RIT.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
                    end

                    if @AFTEREXPIRATIONCLASSIFICATION2 is not null
                    begin
                        set @RENEWALINFOID = newid()

                        -- create new default record
                        insert into dbo.MEMBERSHIPPROGRAMRENEWAL
                        (
                            ID, MEMBERSHIPPROGRAMID, STATUSCODE,
                            INTERVALCODE, ADDEDBYID, CHANGEDBYID,
                            DATEADDED, DATECHANGED
                        )
                        values
                        (
                            @RENEWALINFOID, @ID, @AFTEREXPIRATIONCLASSIFICATION2,
                            @AFTEREXPIRATIONTIMEPERIOD2, @CHANGEAGENTID, @CHANGEAGENTID,
                            @CURRENTDATE, @CURRENTDATE
                        )

                        -- link default record to this one
                        update
                            dbo.MEMBERSHIPPROGRAM
                        set
                            MEMBERSHIPPROGRAMRENEWAL2ID = @RENEWALINFOID
                        where
                            ID = @ID

                        declare @RENEWALIDTABLE2 table (RENEWALID uniqueidentifier, MEMBERSHIPLEVELID uniqueidentifier)
                        insert into @RENEWALIDTABLE2 (RENEWALID,MEMBERSHIPLEVELID) select newid(),ID from dbo.MEMBERSHIPLEVEL where MEMBERSHIPPROGRAMID = @ID
                        -- create new level-specific records
                        insert into dbo.MEMBERSHIPLEVELRENEWAL
                        (
                            ID, MEMBERSHIPLEVELID, STATUSCODE,
                            INTERVALCODE, ADDEDBYID, CHANGEDBYID,
                            DATEADDED, DATECHANGED
                        )
                        select
                            RENEWALID, MEMBERSHIPLEVELID, @AFTEREXPIRATIONCLASSIFICATION2,
                            @AFTEREXPIRATIONTIMEPERIOD2, @CHANGEAGENTID, @CHANGEAGENTID,
                            @CURRENTDATE, @CURRENTDATE
                        from
                            @RENEWALIDTABLE2


                        -- initialize all levels to default
                        update
                            dbo.MEMBERSHIPLEVEL
                        set
                                        MEMBERSHIPLEVELRENEWAL2ID =  RIT.RENEWALID
                          from dbo.MEMBERSHIPLEVEL
                          inner join @RENEWALIDTABLE2 RIT on RIT.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID

                    end

                    if @AFTEREXPIRATIONCLASSIFICATION3 is not null
                    begin
                        set @RENEWALINFOID = newid()

                        -- create new default record
                        insert into dbo.MEMBERSHIPPROGRAMRENEWAL
                        (
                            ID, MEMBERSHIPPROGRAMID, STATUSCODE,
                            INTERVALCODE, ADDEDBYID, CHANGEDBYID,
                            DATEADDED, DATECHANGED
                        )
                        values
                        (
                            @RENEWALINFOID, @ID, @AFTEREXPIRATIONCLASSIFICATION3,
                            @AFTEREXPIRATIONTIMEPERIOD3, @CHANGEAGENTID, @CHANGEAGENTID,
                            @CURRENTDATE, @CURRENTDATE
                        )

                        -- link default record to this one
                        update
                            dbo.MEMBERSHIPPROGRAM
                        set
                            MEMBERSHIPPROGRAMRENEWAL3ID = @RENEWALINFOID
                        where
                            ID = @ID

                        -- create new level-specific records
                        declare @RENEWALIDTABLE3 table (RENEWALID uniqueidentifier, MEMBERSHIPLEVELID uniqueidentifier)
                        insert into @RENEWALIDTABLE3 (RENEWALID,MEMBERSHIPLEVELID) select newid(),ID from dbo.MEMBERSHIPLEVEL where MEMBERSHIPPROGRAMID = @ID

                        insert into dbo.MEMBERSHIPLEVELRENEWAL
                        (
                            ID, MEMBERSHIPLEVELID, STATUSCODE,
                            INTERVALCODE, ADDEDBYID, CHANGEDBYID,
                            DATEADDED, DATECHANGED
                        )
                        select
                            RENEWALID, MEMBERSHIPLEVELID, @AFTEREXPIRATIONCLASSIFICATION3,
                            @AFTEREXPIRATIONTIMEPERIOD3, @CHANGEAGENTID, @CHANGEAGENTID,
                            @CURRENTDATE, @CURRENTDATE
                        from
                            @RENEWALIDTABLE3

                        -- initialize all levels to default
                        update
                            dbo.MEMBERSHIPLEVEL
                        set
                                        MEMBERSHIPLEVELRENEWAL3ID =   RIT.RENEWALID
                          from dbo.MEMBERSHIPLEVEL
                          inner join @RENEWALIDTABLE3 RIT on RIT.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
                    end

                    declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier = dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTORGANIZATIONRATE(@BASECURRENCYID, dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(), @CURRENTDATE, null, null)              

                    if @ANNUAL = 1
                    begin                        
                        --save terms
                        if @SINGLETERM = 1
                        begin
                            --same term for every level
                            insert into dbo.MEMBERSHIPLEVELTERM
                                (ID, LEVELID, AMOUNT, TERMTIMELENGTH, TERMLENGTHCODE, BASECURRENCYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, LOWAMOUNT, ORGANIZATIONEXCHANGERATEID, ORGANIZATIONAMOUNT, ORGANIZATIONLOWAMOUNT)
                            select newid(), T.c.value('(ID)[1]', 'uniqueidentifier'), case when @DUESBASED = 1 then T.c.value('(PRICE)[1]', 'money') else T.c.value('(LARGESTGIFTAMOUNT)[1]','money') end, @SINGLETERMLENGTH, @SINGLETERMLENGTHCODE, @BASECURRENCYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, T.c.value('(SMALLESTGIFTAMOUNT)[1]','money'), @ORGANIZATIONEXCHANGERATEID, dbo.UFN_CURRENCY_CONVERT(case when @DUESBASED = 1 then T.c.value('(PRICE)[1]', 'money') else T.c.value('(LARGESTGIFTAMOUNT)[1]','money') end, @ORGANIZATIONEXCHANGERATEID), dbo.UFN_CURRENCY_CONVERT(T.c.value('(SMALLESTGIFTAMOUNT)[1]','money'), @ORGANIZATIONEXCHANGERATEID)
                                from @MEMBERSHIPLEVELS.nodes('/MEMBERSHIPLEVELS/ITEM') T(c)
                        end
                else
                        begin
                            --different terms for every level
                            insert into dbo.MEMBERSHIPLEVELTERM
                                (ID, LEVELID, AMOUNT, SEQUENCE, TERMTIMELENGTH, TERMLENGTHCODE, BASECURRENCYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, LOWAMOUNT, ORGANIZATIONEXCHANGERATEID, ORGANIZATIONAMOUNT, ORGANIZATIONLOWAMOUNT)
                            select newid(), T.c.value('(LEVELID)[1]', 'uniqueidentifier'), T.c.value('(HIGHPRICE)[1]', 'money'), T.c.value('(SEQUENCE)[1]','int'), S.c.value('(NUMBEROFUNITS)[1]', 'tinyint'), S.c.value('(UNITSCODE)[1]', 'tinyint'), @BASECURRENCYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, T.c.value('(LOWPRICE)[1]', 'money'), @ORGANIZATIONEXCHANGERATEID, dbo.UFN_CURRENCY_CONVERT(T.c.value('(HIGHPRICE)[1]','money'), @ORGANIZATIONEXCHANGERATEID), dbo.UFN_CURRENCY_CONVERT(T.c.value('(LOWPRICE)[1]','money'), @ORGANIZATIONEXCHANGERATEID)
                                from @MEMBERSHIPLEVELTERMS.nodes('/MEMBERSHIPLEVELTERMS/ITEM') T(c)
                                inner join @MULTIPLETERMSUNITS.nodes('/MULTIPLETERMSUNITS/ITEM') S(c) on T.c.value('(TERMID)[1]', 'uniqueidentifier') = S.c.value('(ID)[1]', 'uniqueidentifier')
                        end
                    end
                    else if @RECURRINGSUSTAINING = 1
                    begin
                        declare @RECURRINGPRICESSEQUENCE int = 0

                        if @ANNUALLYPAYMENTOPTION = 1
                        begin
                            insert into dbo.MEMBERSHIPLEVELTERM
                                (ID, LEVELID, RECURRINGPAYMENTOPTIONCODE, SEQUENCE, AMOUNT, BASECURRENCYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, ORGANIZATIONEXCHANGERATEID, ORGANIZATIONAMOUNT)
                            select newid(), T.c.value('(LEVELID)[1]','uniqueidentifier'), 0, @RECURRINGPRICESSEQUENCE, T.c.value('(ANNUALLYPRICE)[1]','money'), @BASECURRENCYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @ORGANIZATIONEXCHANGERATEID, dbo.UFN_CURRENCY_CONVERT(T.c.value('(ANNUALLYPRICE)[1]','money'), @ORGANIZATIONEXCHANGERATEID)
                                from @RECURRINGPRICES.nodes('/RECURRINGPRICES/ITEM') T(c);

                            set @RECURRINGPRICESSEQUENCE = @RECURRINGPRICESSEQUENCE + 1
                        end

                        if @SEMIANNUALLYPAYMENTOPTION = 1
                        begin
                            insert into dbo.MEMBERSHIPLEVELTERM
                                (ID, LEVELID, RECURRINGPAYMENTOPTIONCODE, SEQUENCE, AMOUNT, BASECURRENCYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, ORGANIZATIONEXCHANGERATEID, ORGANIZATIONAMOUNT)
                            select newid(), T.c.value('(LEVELID)[1]','uniqueidentifier'), 1, @RECURRINGPRICESSEQUENCE, T.c.value('(SEMIANNUALLYPRICE)[1]','money'), @BASECURRENCYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @ORGANIZATIONEXCHANGERATEID, dbo.UFN_CURRENCY_CONVERT(T.c.value('(SEMIANNUALLYPRICE)[1]','money'), @ORGANIZATIONEXCHANGERATEID)
                                from @RECURRINGPRICES.nodes('/RECURRINGPRICES/ITEM') T(c);

                            set @RECURRINGPRICESSEQUENCE = @RECURRINGPRICESSEQUENCE + 1
                        end

                        if @QUARTERLYPAYMENTOPTION = 1
                        begin
                            insert into dbo.MEMBERSHIPLEVELTERM
                                (ID, LEVELID, RECURRINGPAYMENTOPTIONCODE, SEQUENCE, AMOUNT, BASECURRENCYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, ORGANIZATIONEXCHANGERATEID, ORGANIZATIONAMOUNT)
                            select newid(), T.c.value('(LEVELID)[1]','uniqueidentifier'), 2, @RECURRINGPRICESSEQUENCE, T.c.value('(QUARTERLYPRICE)[1]','money'), @BASECURRENCYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @ORGANIZATIONEXCHANGERATEID, dbo.UFN_CURRENCY_CONVERT(T.c.value('(QUARTERLYPRICE)[1]','money'), @ORGANIZATIONEXCHANGERATEID)
                                from @RECURRINGPRICES.nodes('/RECURRINGPRICES/ITEM') T(c);

                            set @RECURRINGPRICESSEQUENCE = @RECURRINGPRICESSEQUENCE + 1
                        end

                        if @MONTHLYPAYMENTOPTION = 1
                        begin
                            insert into dbo.MEMBERSHIPLEVELTERM
                                (ID, LEVELID, RECURRINGPAYMENTOPTIONCODE, SEQUENCE, AMOUNT, BASECURRENCYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, ORGANIZATIONEXCHANGERATEID, ORGANIZATIONAMOUNT)
                            select newid(), T.c.value('(LEVELID)[1]','uniqueidentifier'), 3, @RECURRINGPRICESSEQUENCE, T.c.value('(MONTHLYPRICE)[1]','money'), @BASECURRENCYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @ORGANIZATIONEXCHANGERATEID, dbo.UFN_CURRENCY_CONVERT(T.c.value('(MONTHLYPRICE)[1]','money'), @ORGANIZATIONEXCHANGERATEID)
                                from @RECURRINGPRICES.nodes('/RECURRINGPRICES/ITEM') T(c)
                        end
                    end
                    else
                    begin
                        insert into dbo.MEMBERSHIPLEVELTERM
                            (ID, LEVELID, LIFETIMEPAYMENTOPTIONCODE, LIFETIMENUMBEROFPAYMENTS, AMOUNT, SEQUENCE, BASECURRENCYID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, LOWAMOUNT, ORGANIZATIONEXCHANGERATEID, ORGANIZATIONAMOUNT, ORGANIZATIONLOWAMOUNT)
                        select newid(), T.c.value('(LEVELID)[1]', 'uniqueidentifier'), S.c.value('(PAYMENTOPTION)[1]','tinyint'), S.c.value('(NUMBEROFPAYMENTS)[1]','smallint'), T.c.value('(LOWPRICE)[1]', 'money'), T.c.value('(SEQUENCE)[1]','int'), @BASECURRENCYID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, T.c.value('(HIGHPRICE)[1]', 'money'), @ORGANIZATIONEXCHANGERATEID, dbo.UFN_CURRENCY_CONVERT(T.c.value('(LOWPRICE)[1]','money'), @ORGANIZATIONEXCHANGERATEID), dbo.UFN_CURRENCY_CONVERT(T.c.value('(HIGHPRICE)[1]','money'), @ORGANIZATIONEXCHANGERATEID)
                            from @MEMBERSHIPLEVELTERMS.nodes('/MEMBERSHIPLEVELTERMS/ITEM') T(c)
                            inner join @LIFETIMEPAYMENTOPTIONS.nodes('/LIFETIMEPAYMENTOPTIONS/ITEM') S(c) on T.c.value('(TERMID)[1]', 'uniqueidentifier') = S.c.value('(ID)[1]', 'uniqueidentifier')
                    end

                    if @DUESBASED = 1 or @BOTHWAYSBASED = 1
                    begin
                        --save program designations
                        if @DUESTREATEDASCONTRIBUTION = 1
                        begin
                            insert into dbo.MEMBERSHIPPROGRAMDESIGNATION
                                (ID, MEMBERSHIPPROGRAMID, DESIGNATIONID, [PERCENT], ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                            select newid(), @ID, T.c.value('(DESIGNATIONID)[1]', 'uniqueidentifier'), T.c.value('(PERCENTAGE)[1]', 'decimal(7,4)'), @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE 
                            from @DESIGNATIONSFORCONTRIBUTEDPORTION.nodes('/DESIGNATIONSFORCONTRIBUTEDPORTION/ITEM') T(c)

                            insert into dbo.MEMBERSHIPLEVELDESIGNATION
                                (ID, MEMBERSHIPLEVELID, DESIGNATIONID, [PERCENT], ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                            select newid(), T.c.value('(LEVELID)[1]', 'uniqueidentifier'), T.c.value('(DESIGNATIONID)[1]', 'uniqueidentifier'), T.c.value('(PERCENTAGE)[1]', 'decimal(7,4)'), @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                            from @MEMBERSHIPLEVELS.nodes('/MEMBERSHIPLEVELS/ITEM/MEMBERSHIPLEVELDESIGNATIONS/ITEM') T(c)
                        end

                        --save program add-ons
                        if @ADDONSUSED = 1
                        begin
                    insert into dbo.MEMBERSHIPPROGRAMADDON
                                (ID, MEMBERSHIPPROGRAMID, ADDONID, PRICE, MULTIPLEALLOWED, DESCRIPTION, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED,BASECURRENCYID)
                            select newid(), @ID, T.c.value('(ADDONCODE)[1]', 'uniqueidentifier'), T.c.value('(PRICE)[1]', 'money'), T.c.value('(MULTIPLEALLOWED)[1]', 'bit'), T.c.value('(DESCRIPTION)[1]', 'nvarchar(255)'), @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE,@BASECURRENCYID
                                from @ADDONS.nodes('/ADDONS/ITEM') T(c)
                        end

                        --insert discount information for the membership program
                        insert into dbo.MEMBERSHIPPROMOAVAILABILITY
                            (ID, MEMBERSHIPPROMOID, MEMBERSHIPPROGRAMID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                        select newid(), T.c.value('(ID)[1]', 'uniqueidentifier'), @ID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                                from @DISCOUNTSFORPROGRAM.nodes('/DISCOUNTSFORPROGRAM/ITEM') T(c)
                                where T.c.value('(APPLY)[1]', 'bit') = 1
                    end

                    if @CONTRIBUTIONSBASED = 1 or @BOTHWAYSBASED = 1
                    begin
                        if @CONTRIBUTIONCRITERIADEFINITIONTYPECODE = 1
                        begin
                            select
                                @CONTRIBUTIONISPAYMENTCOUNTED = 0,
                                @CONTRIBUTIONISPLEDGECOUNTED = 0,
                                @CONTRIBUTIONISRECURRINGGIFTCOUNTED = 0,
                                @CONTRIBUTIONINCLUDEPAYMENTACTIVITYTYPECODE = 0,
                                @CONTRIBUTIONDESIGNATIONID = null,
                                @CONTRIBUTIONIDSETREGISTERID = null,
                                @CONTRIBUTIONISEVENTREGISTRATIONCOUNTED = 0,
                                @CONTRIBUTIONINCLUDEEVENTTYPECODE = 0,
                                @CONTRIBUTIONEVENTCATEGORYCODEID = null,
                                @CONTRIBUTIONISMEMBERSHIPDUECOUNTED = 0,
                                @CONTRIBUTIONINCLUDEMEMBERSHIPTYPECODE = 0,
                                @CONTRIBUTIONMEMBERSHIPPROGRAMID = null;
                        end
                        else
                        begin
                            select
                                @CONTRIBUTIONCRITERIADEFINITIONTYPECODE = 0,
                                @CONTRIBUTIONAPPLICATIONSELECTIONID = null;
                        end

                        insert into dbo.MEMBERSHIPPROGRAMCONTRIBUTION (
                            ID,
                            ISPAYMENTCOUNTED,
                            ISPLEDGECOUNTED,
                            ISRECURRINGGIFTCOUNTED,
                            INCLUDEPAYMENTACTIVITYTYPECODE,
                            DESIGNATIONID,
                            IDSETREGISTERID,
                            ISEVENTREGISTRATIONCOUNTED,
                            INCLUDEEVENTTYPECODE,
                            EVENTCATEGORYCODEID,
                            ISMEMBERSHIPDUECOUNTED,
                            INCLUDEMEMBERSHIPTYPECODE,
                            MEMBERSHIPPROGRAMID,
                            ISMULTIPLEREVENUETRANSACTIONSCOUNTED,
                            WHATHAPPENSIFTHEYGIVEMORECODE,
                            WHATDATETOCALCULATEEXPIRATIONDATECODE,
                            CRITERIADEFINITIONTYPECODE,
                            APPLICATIONSELECTIONID,
                            ADDEDBYID,
                            CHANGEDBYID,
                            DATEADDED,
                            DATECHANGED
                        )
                        values (
                            @ID,
                            @CONTRIBUTIONISPAYMENTCOUNTED,
                            @CONTRIBUTIONISPLEDGECOUNTED,
                            @CONTRIBUTIONISRECURRINGGIFTCOUNTED,
                            @CONTRIBUTIONINCLUDEPAYMENTACTIVITYTYPECODE,
                            @CONTRIBUTIONDESIGNATIONID,
                            @CONTRIBUTIONIDSETREGISTERID,
                            @CONTRIBUTIONISEVENTREGISTRATIONCOUNTED,
                            @CONTRIBUTIONINCLUDEEVENTTYPECODE,
      @CONTRIBUTIONEVENTCATEGORYCODEID,
                            @CONTRIBUTIONISMEMBERSHIPDUECOUNTED,
                            @CONTRIBUTIONINCLUDEMEMBERSHIPTYPECODE,
                            @CONTRIBUTIONMEMBERSHIPPROGRAMID,
                            @CONTRIBUTIONISMULTIPLEREVENUETRANSACTIONSCOUNTED,
                            @WHATHAPPENSIFTHEYGIVEMORECODE,
                            @WHATDATETOCALCULATEEXPIRATIONDATECODE,
                            @CONTRIBUTIONCRITERIADEFINITIONTYPECODE,
                            @CONTRIBUTIONAPPLICATIONSELECTIONID,
                            @CHANGEAGENTID,
                            @CHANGEAGENTID,
                            @CURRENTDATE,
                            @CURRENTDATE
                        )

                    end    

          insert into dbo.MEMBERSHIPLEVELRENEWALRULES(
            MEMBERSHIPLEVELID,
            BEFOREEXPIRATION,
            AFTEREXPIRATION,
            STARTDATE,
            MEMBERSHIPLEVELRENEWAL1ID,
            MEMBERSHIPLEVELRENEWAL2ID,
            MEMBERSHIPLEVELRENEWAL3ID,
            NONRENEWALACTIONTYPECODE,
            ADDEDBYID, 
              CHANGEDBYID, 
              DATEADDED, 
              DATECHANGED
          )
          select
          MEMBERSHIPLEVEL.ID,
          MEMBERSHIPLEVEL.BEFOREEXPIRATION,
          MEMBERSHIPLEVEL.AFTEREXPIRATION,
              '1/1/1753', -- use the smallest date
          MEMBERSHIPLEVEL.MEMBERSHIPLEVELRENEWAL1ID,
          MEMBERSHIPLEVEL.MEMBERSHIPLEVELRENEWAL2ID,
          MEMBERSHIPLEVEL.MEMBERSHIPLEVELRENEWAL3ID,
          MEMBERSHIPLEVEL.NONRENEWALACTIONTYPECODE,
          @CHANGEAGENTID,
          @CHANGEAGENTID,
          @CURRENTDATE,
          @CURRENTDATE
          from dbo.MEMBERSHIPLEVEL
          where MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @ID


       exec dbo.USP_MEMBERSHIPPROGRAM_CREATEQUERY @ID, @PROGRAMNAME, @CHANGEAGENTID;
       end try

       begin catch
         exec dbo.USP_RAISE_ERROR
         return 1
      end catch

      return 0