USP_DATAFORMTEMPLATE_ADD_BATCHMEMBERSHIPDUESBATCHROW

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@BATCHID uniqueidentifier IN
@CURRENTAPPUSERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@SEQUENCE int IN
@BILLTOCONSTITUENTID uniqueidentifier IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@BASECURRENCYID uniqueidentifier IN
@BASEEXCHANGERATEID uniqueidentifier IN
@EXCHANGERATE decimal(20, 8) IN
@PDACCOUNTSYSTEMID uniqueidentifier IN
@POSTSTATUSCODE tinyint IN
@POSTDATE date IN
@DUESTYPECODE tinyint IN
@MEMBERSHIPRECIPIENT uniqueidentifier IN
@RENEWALRECIPIENT tinyint IN
@EFFORTID uniqueidentifier IN
@FINDERNUMBER nvarchar(19) IN
@APPEALID uniqueidentifier IN
@CHANNELCODEID uniqueidentifier IN
@DATE date IN
@MEMBERSHIPTRANSACTIONTYPECODE tinyint IN
@REVENUETYPECODE tinyint IN
@PAYADDITIONALTONEXTINSTALLMENT bit IN
@PAYADDITIONALMONEYAMOUNT money IN
@MEMBERSHIPPROGRAMID uniqueidentifier IN
@MEMBERSHIPLEVELID uniqueidentifier IN
@MEMBERSHIPLEVELTERMID uniqueidentifier IN
@MEMBERSHIPEXPIRESONDATE date IN
@MEMBERSHIPAMOUNT money IN
@MEMBERSHIPTRANSACTIONAMOUNT money IN
@EXISTINGMEMBERSHIPID uniqueidentifier IN
@MEMBERSHIPPLEDGEAMOUNT money IN
@CONTRIBUTORYDESIGNATIONID uniqueidentifier IN
@USEDISCOUNTRADIO tinyint IN
@DISCOUNTTYPE uniqueidentifier IN
@PROMOTIONCODE nvarchar(50) IN
@APPLIEDDISCOUNTID uniqueidentifier IN
@ADDDONATION bit IN
@DONATIONAMOUNT money IN
@GIVENANONYMOUSLY bit IN
@DONATIONOPPORTUNITYID uniqueidentifier IN
@DONATIONDESIGNATIONID uniqueidentifier IN
@DONATIONCATEGORYCODEID uniqueidentifier IN
@DECLINESGIFTAID bit IN
@PLEDGEFREQUENCYCODE tinyint IN
@PLEDGENUMBEROFINSTALLMENTS int IN
@PLEDGESTARTDATE datetime IN
@AUTOPAY bit IN
@SENDPLEDGEREMINDER bit IN
@CHECKDATE UDT_FUZZYDATE IN
@CHECKNUMBER nvarchar(20) IN
@REFERENCENUMBER nvarchar(20) IN
@REFERENCEDATE UDT_FUZZYDATE IN
@PAYMENTMETHODCODE tinyint IN
@DIRECTDEBITRESULTCODE nvarchar(10) IN
@DIRECTDEBITISREJECTED bit IN
@CONSTITUENTACCOUNTID uniqueidentifier IN
@REFERENCE nvarchar(255) IN
@AUTOMATICALLYRENEWMEMBERSHIP bit IN
@CREDITCARDID uniqueidentifier IN
@CREDITCARDNUMBER nvarchar(20) IN
@CREDITCARDTOKEN uniqueidentifier IN
@CARDHOLDERNAME nvarchar(255) IN
@EXPIRESON UDT_FUZZYDATE IN
@AUTHORIZATIONCODE nvarchar(20) IN
@REJECTIONMESSAGE nvarchar(500) IN
@CREDITTYPECODEID uniqueidentifier IN
@TRANSACTIONID uniqueidentifier IN
@PARTIALCREDITCARDNUMBER nvarchar(4) IN
@DONOTACKNOWLEDGE bit IN
@TAXDEDUCTIBLEAMOUNT money IN
@LETTERCODEID uniqueidentifier IN
@TRIBUTEID uniqueidentifier IN
@DONOTRECEIPT bit IN
@COMMENTS nvarchar(255) IN
@TOTALAMOUNT money IN
@EXISTINGMEMBERS xml IN
@EXISTINGCHILDREN xml IN
@MEMBERSHIPCARDS xml IN
@MEMBERSHIPRECOGNITION xml IN
@MEMBERSHIPPROGRAMADDON xml IN
@IMPORTADDON xml IN
@CAMPAIGNS xml IN
@SOLICITORS xml IN
@RECOGNITIONS xml IN
@BENEFITS xml IN
@PERCENTAGEBENEFITS xml IN
@INSTALLMENTS xml IN
@IMPORT bit IN
@NUMBEROFCHILDREN smallint IN
@OTHERPAYMENTMETHODCODEID uniqueidentifier IN
@SOURCECODE nvarchar(50) IN
@MEMBERSHIPDECLINESGIFTAID bit IN
@DDISOURCECODEID uniqueidentifier IN
@DDISOURCEDATE date IN
@VENDORID nvarchar(50) IN
@MEMBERSHIPLEVELTYPECODEID uniqueidentifier IN
@CREDITCARDATTEMPTCOUNT tinyint IN
@NEWCONSTITUENT xml IN
@BBNCTRANID int IN
@ORIGINPAGEID int IN
@ORIGINPAGE nvarchar(100) IN
@BBNCID int IN
@BBISPROCESSORID uniqueidentifier IN
@NAMECODE tinyint IN
@SIMILARADDRESSCODE tinyint IN
@UNSIMILARADDRESSCODE tinyint IN
@NEWADDRESSENDDATECODE tinyint IN
@NEWADDRESSPRIMARYCODE tinyint IN
@BIRTHDATERULECODE tinyint IN
@DIFFERENTPHONECODE tinyint IN
@NEWPHONEENDDATECODE tinyint IN
@NEWPHONEPRIMARYCODE tinyint IN
@DIFFERENTEMAILCODE tinyint IN
@NEWEMAILENDDATECODE tinyint IN
@NEWEMAILPRIMARYCODE tinyint IN
@USEGLOBALSETTINGS bit IN
@CREATEHISTORICALNAMECODE tinyint IN
@SEPAMANDATEID uniqueidentifier IN
@ADDSEPAMANDATE bit IN
@SEPAMANDATECUSTOMIDENTIFIER nvarchar(35) IN
@SEPAMANDATESIGNATUREDATE date IN
@SEPAMANDATETYPECODE tinyint IN
@REQUIRECREDITCARDPROCESSING bit IN
@PAYOTHERAMOUNT money IN
@ISGENERATEDPAYMENT bit IN
@GLREVENUECATEGORYMAPPINGID uniqueidentifier IN
@SOLICITCODES xml IN

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_BATCHMEMBERSHIPDUESBATCHROW
(
    @ID uniqueidentifier = null output,
    @BATCHID uniqueidentifier,
    @CURRENTAPPUSERID uniqueidentifier = null,
    @CHANGEAGENTID uniqueidentifier,
    @SEQUENCE int,
    @BILLTOCONSTITUENTID uniqueidentifier = null,
    @TRANSACTIONCURRENCYID uniqueidentifier = null,
    @BASECURRENCYID uniqueidentifier = null,
    @BASEEXCHANGERATEID uniqueidentifier = null,
    @EXCHANGERATE decimal(20,8) = null,
    @PDACCOUNTSYSTEMID uniqueidentifier = null,
    @POSTSTATUSCODE tinyint = 1,
    @POSTDATE date = null,
    @DUESTYPECODE tinyint = 0,
    @MEMBERSHIPRECIPIENT uniqueidentifier = null,
    @RENEWALRECIPIENT tinyint = 0,
    @EFFORTID uniqueidentifier = null,
    @FINDERNUMBER nvarchar(19) = null,
    @APPEALID uniqueidentifier = null,
    @CHANNELCODEID uniqueidentifier = null,
    @DATE date = null,
    @MEMBERSHIPTRANSACTIONTYPECODE tinyint = 0,         --0 = Add, 1 = Renew, 2 = Pay, 3 = Upgrade

    @REVENUETYPECODE tinyint = 0,                       -- 0 = Pay in full, 1 = Pay first/next installment, 2 = Pledge, 3 = Other Amount

    @PAYADDITIONALTONEXTINSTALLMENT bit = 0,
    @PAYADDITIONALMONEYAMOUNT money = 0,
    @MEMBERSHIPPROGRAMID uniqueidentifier = null,
    @MEMBERSHIPLEVELID uniqueidentifier = null,
    @MEMBERSHIPLEVELTERMID uniqueidentifier = null,
    @MEMBERSHIPEXPIRESONDATE date = null,
    @MEMBERSHIPAMOUNT money = null,
    @MEMBERSHIPTRANSACTIONAMOUNT money = null,
    @EXISTINGMEMBERSHIPID uniqueidentifier = null,
    @MEMBERSHIPPLEDGEAMOUNT money = 0,
    @CONTRIBUTORYDESIGNATIONID uniqueidentifier = null,
    @USEDISCOUNTRADIO tinyint = 0,
    @DISCOUNTTYPE uniqueidentifier = null,
    @PROMOTIONCODE nvarchar(50) = null,
    @APPLIEDDISCOUNTID uniqueidentifier = null,

    @ADDDONATION bit = 0,
    @DONATIONAMOUNT money = 0,
    @GIVENANONYMOUSLY bit = 0,
    @DONATIONOPPORTUNITYID uniqueidentifier = null,
    @DONATIONDESIGNATIONID uniqueidentifier = null,
    @DONATIONCATEGORYCODEID uniqueidentifier = null,
    @DECLINESGIFTAID bit = 0,

    @PLEDGEFREQUENCYCODE tinyint = 5,
    @PLEDGENUMBEROFINSTALLMENTS int = 1,
    @PLEDGESTARTDATE datetime = null,
    @AUTOPAY bit = 0,
    @SENDPLEDGEREMINDER bit = 1,

    @CHECKDATE dbo.UDT_FUZZYDATE = '00000000',
    @CHECKNUMBER nvarchar(20) = null,
    @REFERENCENUMBER nvarchar(20) = null,
    @REFERENCEDATE dbo.UDT_FUZZYDATE = '00000000',
    @PAYMENTMETHODCODE tinyint = 1,

    @DIRECTDEBITRESULTCODE nvarchar(10) = null,
    @DIRECTDEBITISREJECTED bit = 0,

    @CONSTITUENTACCOUNTID uniqueidentifier = null,
    @REFERENCE nvarchar(255) = null,
    @AUTOMATICALLYRENEWMEMBERSHIP bit = 0,
    @CREDITCARDID uniqueidentifier = null,
    @CREDITCARDNUMBER nvarchar(20) = '',
    @CREDITCARDTOKEN uniqueidentifier = null,
    @CARDHOLDERNAME nvarchar(255) = '',
    @EXPIRESON dbo.UDT_FUZZYDATE = '00000000',
    @AUTHORIZATIONCODE nvarchar(20) = '',
    @REJECTIONMESSAGE nvarchar(500) = '',
    @CREDITTYPECODEID uniqueidentifier = null,
    @TRANSACTIONID uniqueidentifier = null,
    @PARTIALCREDITCARDNUMBER nvarchar(4) = '',
    @DONOTACKNOWLEDGE bit = 0,
    @TAXDEDUCTIBLEAMOUNT money = null,
    @LETTERCODEID uniqueidentifier = null,
    @TRIBUTEID uniqueidentifier = null,
    @DONOTRECEIPT bit = 0,
    @COMMENTS nvarchar(255) = '' ,
    @TOTALAMOUNT money = 0,
    @EXISTINGMEMBERS xml = null,
    @EXISTINGCHILDREN xml = null,
    @MEMBERSHIPCARDS xml = null,
    @MEMBERSHIPRECOGNITION xml = null,
    @MEMBERSHIPPROGRAMADDON xml = null,
    @IMPORTADDON xml = null,

    @CAMPAIGNS xml = null,
    @SOLICITORS xml = null,
    @RECOGNITIONS xml = null,

    @BENEFITS xml = null,
    @PERCENTAGEBENEFITS xml = null,

    @INSTALLMENTS xml = null,
    @IMPORT bit = 1,
    @NUMBEROFCHILDREN smallint = 0,        -- Temporary workaround for children not being implemented in 2012 Q1

    @OTHERPAYMENTMETHODCODEID uniqueidentifier = null,
    @SOURCECODE nvarchar(50) = '',
    @MEMBERSHIPDECLINESGIFTAID bit = 0,
    @DDISOURCECODEID uniqueidentifier = null,
    @DDISOURCEDATE date = null,
    @VENDORID nvarchar(50) = '',
    @MEMBERSHIPLEVELTYPECODEID uniqueidentifier = null,
    @CREDITCARDATTEMPTCOUNT tinyint = 0,
    @NEWCONSTITUENT xml = null,
    @BBNCTRANID int = 0,
    @ORIGINPAGEID int = 0,
    @ORIGINPAGE nvarchar(100) = '',
    @BBNCID int = 0,
    @BBISPROCESSORID uniqueidentifier = null,
    @NAMECODE tinyint = 1,
    @SIMILARADDRESSCODE tinyint = 3,
    @UNSIMILARADDRESSCODE tinyint = 3,
    @NEWADDRESSENDDATECODE tinyint = 0,
    @NEWADDRESSPRIMARYCODE tinyint = 1,
    @BIRTHDATERULECODE  tinyint = 0,
    @DIFFERENTPHONECODE tinyint = 3,
    @NEWPHONEENDDATECODE tinyint = 0,
    @NEWPHONEPRIMARYCODE tinyint = 1,
    @DIFFERENTEMAILCODE tinyint = 3,
    @NEWEMAILENDDATECODE tinyint = 0,
    @NEWEMAILPRIMARYCODE tinyint = 1,
    @USEGLOBALSETTINGS bit = 1,  
    @CREATEHISTORICALNAMECODE tinyint = 1,
    @SEPAMANDATEID uniqueidentifier = null,
    @ADDSEPAMANDATE bit = 0,
    @SEPAMANDATECUSTOMIDENTIFIER nvarchar(35) = '',
    @SEPAMANDATESIGNATUREDATE date = null,
    @SEPAMANDATETYPECODE tinyint = 0,
    @REQUIRECREDITCARDPROCESSING bit = 0,
    @PAYOTHERAMOUNT money = null,
    @ISGENERATEDPAYMENT bit = 0,
    @GLREVENUECATEGORYMAPPINGID uniqueidentifier = null,
    @SOLICITCODES xml = null
)
as
begin
    set nocount on;

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

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

    if @MEMBERSHIPTRANSACTIONTYPECODE = 3
        select @EXISTINGMEMBERSHIPID = ID, @MEMBERSHIPPROGRAMID = MEMBERSHIPPROGRAMID from dbo.MEMBERSHIP where ID = @MEMBERSHIPPROGRAMID

    declare @CURRENTDATE datetime = getdate();

    --Passing transaction guid for reconciliation as BBIS sends BBISTransID

    if @TRANSACTIONID is null
        select @TRANSACTIONID = TransactionGUID from [dbo].[MembershipTransactions]
            where ID = @BBNCTRANID;

    --If we're using the 'Pay other amount' option, clear additional amount

    if @REVENUETYPECODE = 3
    begin
        set @PAYADDITIONALTONEXTINSTALLMENT = 0
        set @PAYADDITIONALMONEYAMOUNT = 0
    end

    begin try
    if @REVENUETYPECODE = 3 and @PAYOTHERAMOUNT <= 0
        raiserror('BBERR_INVALIDPAYOTHERAMOUNT', 13, 1);

        /*Because of the way this batch in particular works, the findernumber parameter is a string instead of bigint, so we need to do some extra validation and casting.*/
        if len(isnull(@FINDERNUMBER, '')) = 0
            set @FINDERNUMBER = 0;

        if len(@FINDERNUMBER) > 0 and isNumeric(@FINDERNUMBER) = 0
            raiserror('BBERR_INVALIDFINDERNUMBER', 13, 1);

        declare @MARKETINGCONSTITUENTID uniqueidentifier = @BILLTOCONSTITUENTID;

        /* Lookup and set all possible marketing data (via output params) from the data that was specified. */
        exec dbo.[USP_REVENUEBATCH_GETMARKETINGDATA]
            @FINDERNUMBER = @FINDERNUMBER,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @CURRENTAPPUSERID = @CURRENTAPPUSERID,
            @SOURCECODE = @SOURCECODE output,
            @MAILINGID = @EFFORTID output,
            @APPEALID = @APPEALID output,
            @CONSTITUENTID = @MARKETINGCONSTITUENTID output,
            @BATCHID = @BATCHID,
            @IMPORT = @IMPORT;

        if @BBNCTRANID = 0
            set @BILLTOCONSTITUENTID = @MARKETINGCONSTITUENTID;

        if @NEWCONSTITUENT.exist('NEWCONSTITUENT/ITEM') = 1 and not exists (select ID from dbo.CONSTITUENT where ID = @BILLTOCONSTITUENTID)
            begin
                declare @NEWCONSTITID uniqueidentifier;
                exec USP_REVENUEBATCH_ADDNEWCONSTITUENTFROMXML_1 @NEWCONSTITUENT, @CHANGEAGENTID, @NEWCONSTITID output, @BBNCTRANID;
                set @BILLTOCONSTITUENTID = @NEWCONSTITID;
            end


        declare @CONSTITUENTID uniqueidentifier;

        select @CONSTITUENTID = 
                    case @DUESTYPECODE 
                        when 0 then @BILLTOCONSTITUENTID 
                        else @MEMBERSHIPRECIPIENT 
                    end;

        --  Write Validation logic here.

        if @PDACCOUNTSYSTEMID is null
            set @PDACCOUNTSYSTEMID = dbo.UFN_PDACCOUNTSYSTEM_GETDEFAULTSYSTEMIDSFORUSER(@CURRENTAPPUSERID)

        if @IMPORT = 0 and @ADDDONATION = 0 and @SOLICITORS is not null
            begin
                set @SOLICITORS = null;
                set @DONATIONDESIGNATIONID = null;
                set @DONATIONCATEGORYCODEID = null;
            end

         if @GIVENANONYMOUSLY is null
            set @GIVENANONYMOUSLY = 0;

        --Set currency parameters for backwards compatibility

        if @BASECURRENCYID is null
            begin
                declare @CURRENCYSETID uniqueidentifier;

                select 
                    @CURRENCYSETID = CURRENCYSETID
                from dbo.PDACCOUNTSYSTEM
                where ID = @PDACCOUNTSYSTEMID;

                select 
                    @BASECURRENCYID = CURRENCY.ID
                from dbo.CURRENCYSET
                inner join dbo.CURRENCY 
                    on CURRENCY.ID = CURRENCYSET.BASECURRENCYID
                where CURRENCYSET.ID = coalesce(@CURRENCYSETID, dbo.UFN_CURRENCYSET_GETAPPUSERDEFAULTCURRENCYSET());
            end

        if @TRANSACTIONCURRENCYID is null
            set @TRANSACTIONCURRENCYID = @BASECURRENCYID;

        -- Ensure that we can add a payment of this transaction currency to the account system.

        if not exists(
                select 1
                from 
                    dbo.CURRENCYSETTRANSACTIONCURRENCY
                    inner join dbo.PDACCOUNTSYSTEM on PDACCOUNTSYSTEM.CURRENCYSETID = CURRENCYSETTRANSACTIONCURRENCY.CURRENCYSETID
                where 
                    PDACCOUNTSYSTEM.ID = @PDACCOUNTSYSTEMID
                    and CURRENCYSETTRANSACTIONCURRENCY.CURRENCYID = @TRANSACTIONCURRENCYID
            ) and @BBNCTRANID = 0
            raiserror('TRANSACTIONCURRENCYINVALIDFORACCOUNTSYSTEM',13,1)

        -- If the system has set that households can't be donors, verify that constituent isn't a household

        if dbo.UFN_INSTALLATIONINFO_GETHOUSEHOLDSCANBEDONORS() = 0 and dbo.UFN_CONSTITUENT_ISHOUSEHOLD(@CONSTITUENTID) = 1
            raiserror('HOUSEHOLDSCANNOTBEDONORS', 13, 1);

        -- if the group type can't be a donor, raise an error

        if exists(select GD.ID from dbo.GROUPDATA GD inner join dbo.GROUPTYPE GT on GD.GROUPTYPEID = GT.ID where GD.ID = @CONSTITUENTID and GT.CANBEDONOR = 0)
            raiserror('GROUPCANNOTBEDONOR', 13, 1);

        -- Handle any blank fields

        if @MEMBERSHIPTRANSACTIONTYPECODE is null
            set @MEMBERSHIPTRANSACTIONTYPECODE = 0;

        if @DUESTYPECODE is null
            set @DUESTYPECODE = 0;

        if @REVENUETYPECODE is null
            set @REVENUETYPECODE = 0;

        if @RENEWALRECIPIENT is null
            set @RENEWALRECIPIENT = 0;

        if @USEDISCOUNTRADIO is null
            set @USEDISCOUNTRADIO = 0;

        if @PLEDGEFREQUENCYCODE is null
            set @PLEDGEFREQUENCYCODe = 5;

        if @PLEDGESTARTDATE is null
            set @PLEDGESTARTDATE = @DATE;

        if @PLEDGENUMBEROFINSTALLMENTS is null and @PLEDGEFREQUENCYCODE = 5
            set @PLEDGENUMBEROFINSTALLMENTS = 1;

        if @POSTSTATUSCODE is null
            set @POSTSTATUSCODE = 1

        if @CREDITCARDATTEMPTCOUNT is null
            set @CREDITCARDATTEMPTCOUNT = 0;
        if @CARDHOLDERNAME is null
            set @CARDHOLDERNAME = '';
        if @CREDITCARDNUMBER is null
            set @CREDITCARDNUMBER = '';
        if @AUTHORIZATIONCODE is null
            set @AUTHORIZATIONCODE = '';
        if @EXPIRESON is null
            set @EXPIRESON = '00000000';

        if @SIMILARADDRESSCODE is null
            set @SIMILARADDRESSCODE = 3
        if @UNSIMILARADDRESSCODE is null
            set @UNSIMILARADDRESSCODE = 3
        if @NEWADDRESSENDDATECODE is null
            set @NEWADDRESSENDDATECODE = 0
        if @NEWADDRESSPRIMARYCODE is null
            set @NEWADDRESSPRIMARYCODE = 1
        if @BIRTHDATERULECODE is null
            set @BIRTHDATERULECODE = 0
        if @DIFFERENTPHONECODE is null
            set @DIFFERENTPHONECODE = 3
        if @NEWPHONEENDDATECODE is null
            set @NEWPHONEENDDATECODE = 0
        if @NEWPHONEPRIMARYCODE is null
            set @NEWPHONEPRIMARYCODE = 1
        if @DIFFERENTEMAILCODE is null
            set @DIFFERENTEMAILCODE = 3
        if @NEWEMAILENDDATECODE is null
            set @NEWEMAILENDDATECODE = 0
        if @NEWEMAILPRIMARYCODE is null
            set @NEWEMAILPRIMARYCODE = 1
        if @USEGLOBALSETTINGS is null
            set @USEGLOBALSETTINGS = 1
        if @NAMECODE is null
            set @NAMECODE = 1
        if @CREATEHISTORICALNAMECODE is null
            set @CREATEHISTORICALNAMECODE = 1
        if @ADDSEPAMANDATE is null
            set @ADDSEPAMANDATE = 0;
        if @REQUIRECREDITCARDPROCESSING is null
            set @REQUIRECREDITCARDPROCESSING = 0;
        if @ISGENERATEDPAYMENT is null
            set @ISGENERATEDPAYMENT = 0;

        declare @RECURRINGPROGRAMTYPECODE int = 1
        declare @MEMBERSHIPPROGRAMTYPECODE tinyint;
        declare @DEDUCTIBILITYCODE tinyint;
        declare @DUESTREATEDASCONTRIBUTION bit;
        declare @HASCONTRIBUTIONDESIGNATIONS bit;
        declare @MEMBERSHIPTERM int;  -- 0 = Pay in full, 1 = Monthly, 2 = Quarterly, 3 = Yearly


        select
            @MEMBERSHIPPROGRAMTYPECODE = PROGRAMTYPECODE,
            @DEDUCTIBILITYCODE = DEDUCTIBILITYCODE,
            @DUESTREATEDASCONTRIBUTION = DUESTREATEDASCONTRIBUTION
        from dbo.MEMBERSHIPPROGRAM
        where ID = @MEMBERSHIPPROGRAMID;

        select @MEMBERSHIPTERM=LIFETIMEPAYMENTOPTIONCODE from dbo.MEMBERSHIPLEVELTERM where ID=@MEMBERSHIPLEVELTERMID;
        if @BBNCTRANID > 0
        begin
            --Type always be pay in full when @MEMBERSHIPPROGRAMTYPECODE = lifetime membership(2 represent lifetime membership).

            if @MEMBERSHIPPROGRAMTYPECODE = 2  and @MEMBERSHIPTERM =0 and @MEMBERSHIPAMOUNT=0
            begin
                set @REVENUETYPECODE = 0;    --pay in full

            end
            else if @MEMBERSHIPPROGRAMTYPECODE = 2
            begin
                set @REVENUETYPECODE = 1;    --pay_installment

            end
        end

        declare @LEVELRECEIPTAMOUNT money;
        declare @OBTAINLEVELCODE tinyint;

        select
            @LEVELRECEIPTAMOUNT = RECEIPTAMOUNT,
            @OBTAINLEVELCODE = OBTAINLEVELCODE,
            @HASCONTRIBUTIONDESIGNATIONS = 
                case
                    when exists(select ID from dbo.MEMBERSHIPLEVELDESIGNATION where MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID) then 1
                    else 0
                end
        from dbo.MEMBERSHIPLEVEL
        where ID = @MEMBERSHIPLEVELID;

        if @IMPORT = 1
            begin

                --Always set Autopay = 1 when importing, this will store the CC/DD information on the InstallmentPlan/Recurring gift if it is specified.

                if @PAYMENTMETHODCODE = 2 or @PAYMENTMETHODCODE = 3
                begin
                    set @AUTOPAY = 1;
                end

                --Ensure that the Membership Level Type chosen is listed as associated with the level

                if @MEMBERSHIPLEVELTYPECODEID is not null
                begin
                    if (not exists (select * from dbo.MEMBERSHIPLEVELTYPE 
                                    where MEMBERSHIPLEVELTYPE.LEVELTYPECODEID = @MEMBERSHIPLEVELTYPECODEID
                                    and MEMBERSHIPLEVELTYPE.LEVELID = @MEMBERSHIPLEVELID))
                    begin
                         raiserror('BBERR_MEMBERSHIPLEVELTYPEINVALID', 13, 1);
                    end
                end

                -- Renewing or paying an existing membership

                if @MEMBERSHIPTRANSACTIONTYPECODE > 0 and @EXISTINGMEMBERSHIPID is null
                    begin
                        if object_id('tempdb..#GROUPID') is not null  
                        drop table #GROUPID;  

                        create table #GROUPID  
                        (  
                         ID uniqueidentifier  
                        );  
                        insert into #GROUPID  
                         select ID  
                         from dbo.UFN_CONSTITUENT_GETGROUPS(@CONSTITUENTID)  
                         where dbo.UFN_CONSTITUENT_ISHOUSEHOLD(ID) = 1
                        with ConstituentMemberships_CTE as (
                            select 
                                MEMBERSHIP.ID,
                                case 
                                    when MEMBER.CONSTITUENTID = @CONSTITUENTID then
                                        case
                                            when MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
                                                and MEMBERSHIP.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID
                                                and MEMBERSHIP.MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID then 1
                                            when MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
                                                and MEMBERSHIP.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID then 2
                                            when MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID then 3
                                        end
                                    else
                                        case
                                            when MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
                                                and MEMBERSHIP.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID
                                                and MEMBERSHIP.MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID then 4
                                            when MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
                                                and MEMBERSHIP.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID then 5
                                            when MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID then 6
                                        end
                                end MATCHCODE
                            from dbo.MEMBERSHIP
                            inner join dbo.MEMBER
                                on MEMBERSHIP.ID = MEMBER.MEMBERSHIPID
                            where MEMBERSHIP.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
                                and (@MEMBERSHIPTRANSACTIONTYPECODE = 1 or @MEMBERSHIPTRANSACTIONTYPECODE = 3    -- Renewing, level and term can change

                                    or (
                                        MEMBERSHIP.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID
                                        and MEMBERSHIP.MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID
                                    )
                                )
                                and MEMBER.CONSTITUENTID = @CONSTITUENTID
                                or MEMBER.CONSTITUENTID in (
                                    select ID
                                    from dbo.UFN_GROUP_GETCURRENTMEMBERS(@CONSTITUENTID, @CURRENTAPPUSERID, '3550edaf-780c-48c8-9700-f478eeac9e51', 0)
                                    -- Check security against Constituent Membership View Form

                                ) 
                or MEMBER.CONSTITUENTID in (select ID from #GROUPID)
                        )
                        select top 1
                            @EXISTINGMEMBERSHIPID = ID
                        from ConstituentMemberships_CTE
                        order by MATCHCODE;

                        if @EXISTINGMEMBERSHIPID is null
                            raiserror('BBERR_PAYRENEWMEMBERSHIPDNE', 13, 1);

                    end

                if @DONATIONAMOUNT > 0
                    begin
                        set @ADDDONATION = 1;

                        declare @NUMBERRECOGNITIONS integer = 0;

                        select 
                            @NUMBERRECOGNITIONS = count(T.c.value('CONSTITUENTID [1]', 'uniqueidentifier'))
                        from @RECOGNITIONS.nodes('/RECOGNITIONS/ITEM') T(c);

                        if @NUMBERRECOGNITIONS = 0
                            set @RECOGNITIONS = (
                                select
                                    RECOGNITIONS.CONSTITUENTID,
                                    coalesce(NF.NAME, BATCHREVENUECONSTITUENT.NAME) as NAME,
                                    RECOGNITIONS.REVENUERECOGNITIONTYPECODEID,
                                    getDate() as EFFECTIVEDATE,
                                    RECOGNITIONS.AMOUNT
                                from dbo.UFN_REVENUEBATCH_GETRECOGNITIONDEFAULTS(@GIVENANONYMOUSLY, @BILLTOCONSTITUENTID, @DONATIONAMOUNT, @DATE, null) as RECOGNITIONS
                                outer apply dbo.UFN_CONSTITUENT_DISPLAYNAME(RECOGNITIONS.CONSTITUENTID) NF
                                left join dbo.BATCHREVENUECONSTITUENT 
                                    on RECOGNITIONS.CONSTITUENTID = BATCHREVENUECONSTITUENT.ID 
                                        and BATCHREVENUECONSTITUENT.EXISTINGCONSTITUENTID is null
                                for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),BINARY BASE64
                            );

                    end

            end

        if @ADDDONATION = 1 and @DONATIONDESIGNATIONID is null
            raiserror('BBERR_DONATIONDESIGNATIONID_REQUIRED', 13, 1);

        if @OBTAINLEVELCODE = 1 and (select WHEREISREVENUETRACKEDCODE from dbo.MEMBERSHIPPROGRAM where ID = @MEMBERSHIPPROGRAMID) = 0 and @CONTRIBUTORYDESIGNATIONID is null
            raiserror('BBERR_CONTRIBUTORYDESIGNATIONID_REQUIRED', 13, 1);

        declare @PROMOTIONAMOUNT money = 0;
        declare @TOTALADDONAMOUNT money = 0;

        -- Adding or renewing

        if (@MEMBERSHIPTRANSACTIONTYPECODE = 0 or @MEMBERSHIPTRANSACTIONTYPECODE = 1 or @MEMBERSHIPTRANSACTIONTYPECODE = 3)
            begin
                if @IMPORT = 1
                    begin
                        if (@MEMBERSHIPAMOUNT is null or @MEMBERSHIPAMOUNT = 0 or @BBNCTRANID > 0) and @DUESTYPECODE in (0,1) -- Not comping membership

                            select
                                @MEMBERSHIPAMOUNT = AMOUNT
                            from dbo.MEMBERSHIPLEVELTERM
                            where ID = @MEMBERSHIPLEVELTERMID
                                and LEVELID = @MEMBERSHIPLEVELID;

                        declare @EXPIRATIONDATECALCULATED bit = 0;

                        if @MEMBERSHIPEXPIRESONDATE is null and @MEMBERSHIPPROGRAMTYPECODE = 0        -- Recurring and Lifetime do not have expiration dates.

                            begin
                                set @EXPIRATIONDATECALCULATED = 1
                                declare @ACTIONCODE tinyint = dbo.UFN_MEMBERSHIPTRANSACTION_DETERMINEACTIONCODE(@EXISTINGMEMBERSHIPID, @MEMBERSHIPLEVELID, @DATE);

                                if @ACTIONCODE = 0 or @ACTIONCODE = 5 --join/rejoin

                                    set @MEMBERSHIPEXPIRESONDATE = dbo.UFN_MEMBERSHIP_CALCULATEEXPIRATIONDATEBYLEVEL(@MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @DATE);
                                else
                                    begin
                                        declare @CURRENTSTATUS tinyint;
                                        declare @CURRENTEXPIRATIONDATE datetime;

                                        select 
                                            @CURRENTEXPIRATIONDATE = EXPIRATIONDATE, 
                                            @CURRENTSTATUS = STATUSCODE
                                        from dbo.MEMBERSHIP 
                                        where ID = @EXISTINGMEMBERSHIPID;

                                        if @CURRENTSTATUS = 2 --pending membership

                                            set @MEMBERSHIPEXPIRESONDATE = dbo.UFN_MEMBERSHIP_CALCULATEEXPIRATIONDATEBYLEVEL(@MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @DATE);
                                        else
                                            set @MEMBERSHIPEXPIRESONDATE = dbo.UFN_MEMBERSHIP_CALCULATERENEWALEXPIRATION_2(@CURRENTEXPIRATIONDATE, @MEMBERSHIPLEVELTERMID);

                                    end
                            end

                        if @DISCOUNTTYPE is not null or len(coalesce(@PROMOTIONCODE, '')) > 0
                            begin
                                declare @PROMOTIONTYPECODE tinyint = 0;
                                declare @DISCOUNTCALCULATIONTYPECODE tinyint = 0;
                                declare @DISCOUNTAMOUNT money = 0;
                                declare @DISCOUNTPERCENT decimal = 0;

                                declare @EXTENSIONCALCULATIONTYPECODE tinyint = 0;
                                declare @EXTENSIONVALUE integer = 0;

                                if @DISCOUNTTYPE is not null
                                    begin
                                        select
                                            @APPLIEDDISCOUNTID = MEMBERSHIPPROMO.ID,
                                            @PROMOTIONTYPECODE = MEMBERSHIPPROMO.PROMOTIONTYPECODE,
                                            @DISCOUNTCALCULATIONTYPECODE = MEMBERSHIPPROMO.DISCOUNTCALCULATIONTYPECODE,
                                            @EXTENSIONCALCULATIONTYPECODE = MEMBERSHIPPROMO.EXTENSIONCALCULATIONTYPECODE,
                                            @DISCOUNTAMOUNT = MEMBERSHIPPROMO.AMOUNT,
                                            @DISCOUNTPERCENT = MEMBERSHIPPROMO.[PERCENT]
                                        from dbo.MEMBERSHIPPROMO
                                        inner join dbo.MEMBERSHIPPROMOAVAILABILITY 
                                            on MEMBERSHIPPROMO.ID = MEMBERSHIPPROMOAVAILABILITY.MEMBERSHIPPROMOID
                                        where MEMBERSHIPPROMO.ID = @DISCOUNTTYPE
                                            and MEMBERSHIPPROMOAVAILABILITY.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID;

                                        if @APPLIEDDISCOUNTID is null
                                            raiserror('BBERR_INVALIDPROMOTION', 13, 1);
                                    end
                                else
                                    begin
                                        select
                                            @APPLIEDDISCOUNTID = MEMBERSHIPPROMO.ID,
                                            @PROMOTIONTYPECODE = PROMOTIONTYPECODE,
                                            @DISCOUNTCALCULATIONTYPECODE = DISCOUNTCALCULATIONTYPECODE,
                                            @EXTENSIONCALCULATIONTYPECODE = EXTENSIONCALCULATIONTYPECODE,
                                            @DISCOUNTAMOUNT = AMOUNT,
                                            @DISCOUNTPERCENT = [PERCENT]
                                        from dbo.MEMBERSHIPPROMO
                                        inner join dbo.MEMBERSHIPPROMOCODE
                                            on MEMBERSHIPPROMO.ID = MEMBERSHIPPROMOCODE.MEMBERSHIPPROMOID
                                        where MEMBERSHIPPROMOCODE.PROMOTIONALCODE = @PROMOTIONCODE
                                            and (MEMBERSHIPPROMOCODE.VALIDFROM is null or MEMBERSHIPPROMOCODE.VALIDFROM <= dbo.UFN_DATE_GETEARLIESTTIME(@DATE))
                                            and (MEMBERSHIPPROMOCODE.VALIDTO is null or MEMBERSHIPPROMOCODE.VALIDTO >= dbo.UFN_DATE_GETLATESTTIME(@DATE));

                                        if @APPLIEDDISCOUNTID is null
                                            raiserror('BBERR_INVALIDPROMOCODE', 13, 1);

                                    end

                                set @USEDISCOUNTRADIO = 1;

                                if @PROMOTIONTYPECODE = 0
                                    begin
                                        -- Discount

                                        if @DISCOUNTCALCULATIONTYPECODE = 0
                                            set @PROMOTIONAMOUNT = @DISCOUNTAMOUNT
                                        else
                                            set @PROMOTIONAMOUNT = @MEMBERSHIPAMOUNT * (@DISCOUNTPERCENT / 100)
                                    end
                                else
                                    begin
                                        -- Extension

                                        if @EXTENSIONCALCULATIONTYPECODE = 0
                                            -- Days

                                            set @MEMBERSHIPEXPIRESONDATE = dateadd(dd, @EXTENSIONVALUE, @MEMBERSHIPEXPIRESONDATE);
                                        else
                                            -- Months

                                            set @MEMBERSHIPEXPIRESONDATE = dateadd(mm, @EXTENSIONVALUE, @MEMBERSHIPEXPIRESONDATE);

                                    end

                            end        -- if discount or promo code


                        -- set expiration date on membership cards

                        if @MEMBERSHIPCARDS is not null and  @EXPIRATIONDATECALCULATED = 1
                            set @MEMBERSHIPCARDS.modify('replace value of (/MEMBERSHIPCARDS/ITEM/@EXPIRATIONDATE)[1] with sql:variable("@MEMBERSHIPEXPIRESONDATE")');

                        set @MEMBERSHIPTRANSACTIONAMOUNT = @MEMBERSHIPAMOUNT - @PROMOTIONAMOUNT;

                        if @MEMBERSHIPTRANSACTIONAMOUNT < 0
                            set @MEMBERSHIPTRANSACTIONAMOUNT = 0;

                        if (select T.c.value('(ADDONID)[1]', 'uniqueidentifier')
                                from @MEMBERSHIPPROGRAMADDON.nodes('/MEMBERSHIPPROGRAMADDON/ITEM[1]') T(c))
                                is not null
                            raiserror('BBERR_USEIMPORTADDONS', 13, 1);

                        -- We have a different collection for imported add-ons (for usability). Here we fill the real collection.

                        set @MEMBERSHIPPROGRAMADDON = (
                            select
                                1 as APPLY,
                                MPA.ADDONID,
                                ADDON.ADDONTYPECODE as ADDONTYPE,
                                case
                                    when MPA.BASECURRENCYID = @TRANSACTIONCURRENCYID then MPA.PRICE
                                    else dbo.UFN_CURRENCY_CONVERT(MPA.PRICE, dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(MPA.BASECURRENCYID, @TRANSACTIONCURRENCYID, @DATE, 1, null))
                                end as PRICE,
                                T.c.value('(NUMBEROFADDONS)[1]', 'smallint') as NUMBEROFADDONS,
                                MPA.MULTIPLEALLOWED,
                                MPA.TRANSACTIONCURRENCYID
                            from @IMPORTADDON.nodes('/IMPORTADDON/ITEM') T(c)
                            inner join dbo.MEMBERSHIPPROGRAMADDON MPA
                                on MPA.ADDONID = T.c.value('(ADDONID)[1]','uniqueidentifier')
                            inner join dbo.ADDON
                                on ADDON.ID = MPA.ADDONID
                            where MPA.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
                            for xml raw('ITEM'),type,elements,root('MEMBERSHIPPROGRAMADDON'),BINARY BASE64
                        );

                        set @TOTALADDONAMOUNT = (
                            select coalesce(sum(T.c.value('(PRICE)[1]','money') * (case when T.c.value('(MULTIPLEALLOWED)[1]','bit') = 1 then T.c.value('(NUMBEROFADDONS)[1]','smallint') else 1 end)), 0)
                            from @MEMBERSHIPPROGRAMADDON.nodes('/MEMBERSHIPPROGRAMADDON/ITEM') T(c)
                        );

                        set @MEMBERSHIPTRANSACTIONAMOUNT += @TOTALADDONAMOUNT;

                        -- Set up Benefits


                        if (select T.c.value('(BENEFITID)[1]', 'uniqueidentifier')
                                from @BENEFITS.nodes('/BENEFITS/ITEM[1]') T(c))
                                is null
                            begin

                                declare @TERMAMOUNT money = (select AMOUNT from dbo.MEMBERSHIPLEVELTERM where MEMBERSHIPLEVELTERM.ID = @MEMBERSHIPLEVELTERMID)

                                set @BENEFITS = (
                                    select
                                        newid() as ID
                                        , MEMBERSHIPLEVELBENEFIT.BENEFITID
                                        , MEMBERSHIPLEVELBENEFIT.QUANTITY
                                        , MEMBERSHIPLEVELBENEFIT.UNITVALUE
                                        , MEMBERSHIPLEVELBENEFIT.SEQUENCE
                                        , MEMBERSHIPLEVELBENEFIT.DETAILS
                                        , 0 as PERCENTAPPLICABLEAMOUNT
                                    from dbo.MEMBERSHIPLEVELBENEFIT
                                    inner join dbo.BENEFIT on MEMBERSHIPLEVELBENEFIT.BENEFITID = BENEFIT.ID
                                    where MEMBERSHIPLEVELBENEFIT.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID
                                    and MEMBERSHIPLEVELBENEFIT.USEPERCENT = 0
                                    order by MEMBERSHIPLEVELBENEFIT.SEQUENCE
                                    for xml raw('ITEM'),type,elements,root('BENEFITS'),BINARY BASE64
                                )
                            end
                        if (select T.c.value('(BENEFITID)[1]', 'uniqueidentifier')
                                from @PERCENTAGEBENEFITS.nodes('/PERCENTAGEBENEFITS/ITEM[1]') T(c))
                                is null
                            begin
                                declare @VALUEBENEFITTOTAL money = (select coalesce(sum(MEMBERSHIPLEVELBENEFIT.QUANTITY * MEMBERSHIPLEVELBENEFIT.UNITVALUE),0)
                                                                    from dbo.MEMBERSHIPLEVELBENEFIT
                                                                    where MEMBERSHIPLEVELBENEFIT.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID
                                                                    and MEMBERSHIPLEVELBENEFIT.USEPERCENT = 0)

                                set @PERCENTAGEBENEFITS = (select
                                        newid()
                                        , MEMBERSHIPLEVELBENEFIT.BENEFITID
                                        , MEMBERSHIPLEVELBENEFIT.QUANTITY
                                        , MEMBERSHIPLEVELBENEFIT.VALUEPERCENT
                                        , MEMBERSHIPLEVELBENEFIT.SEQUENCE
                                        , MEMBERSHIPLEVELBENEFIT.DETAILS
                                        , case when @TERMAMOUNT-@VALUEBENEFITTOTAL < 0 then 0
                                            else @TERMAMOUNT-@VALUEBENEFITTOTAL
                                            end as PERCENTAPPLICABLEAMOUNT
                                    from dbo.MEMBERSHIPLEVELBENEFIT
                                    inner join dbo.BENEFIT on MEMBERSHIPLEVELBENEFIT.BENEFITID = BENEFIT.ID
                                    where MEMBERSHIPLEVELBENEFIT.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID
                                    and MEMBERSHIPLEVELBENEFIT.USEPERCENT = 1
                                    order by MEMBERSHIPLEVELBENEFIT.SEQUENCE
                                    for xml raw('ITEM'),type,elements,root('PERCENTAGEBENEFITS'),BINARY BASE64
                                 )
                            end

                    end        -- if @IMPORT


                exec dbo.USP_MEMBERSHIPDUESBATCH_VALIDATE_ADDRENEWPROGRAM
                            @CURRENTAPPUSERID,
                            @ID,
                            @BATCHID,
                            @MEMBERSHIPTRANSACTIONTYPECODE,
                            @DATE,
                            @MEMBERSHIPEXPIRESONDATE,
                            @MEMBERSHIPPROGRAMID,
                            @MEMBERSHIPLEVELID,
                            @MEMBERSHIPLEVELTERMID,
                            @CONSTITUENTID,
                            @REVENUETYPECODE,
                            @EXISTINGMEMBERSHIPID,
                            @MEMBERSHIPPROGRAMADDON,
                            @EXISTINGMEMBERS,
                            @MEMBERSHIPCARDS,
                            @EXISTINGCHILDREN,
                            @NUMBEROFCHILDREN,        -- Temporary workaround for children not being implemented in 2012 Q1

                            @IMPORTADDON,
                            @IMPORT;

                -- Creating a pledge or recurring gift

                if @REVENUETYPECODE > 0
                    begin
                        if @IMPORT = 1 or @BBNCTRANID > 0
                            begin

                                if @BBNCTRANID > 0
                                begin
                                    select @MEMBERSHIPPLEDGEAMOUNT = case when MEMBERSHIPLEVELTERM.LIFETIMENUMBEROFPAYMENTS = 0 then  MEMBERSHIPLEVELTERM.AMOUNT
                                                                                                     else MEMBERSHIPLEVELTERM.LIFETIMENUMBEROFPAYMENTS * MEMBERSHIPLEVELTERM.AMOUNT
                                                                                                     end,
                                                 @PLEDGEFREQUENCYCODE = case MEMBERSHIPLEVELTERM.LIFETIMEPAYMENTOPTIONCODE when 0 then 5
                                                                                                                                                                                                     when 1 then 3
                                                                                                                                                                                                     when 2 then 2
                                                                                                                                                                                                     when 3 then 0
                                                                                                else 5
                                                                                                end,
                                                 @PLEDGENUMBEROFINSTALLMENTS = case MEMBERSHIPLEVELTERM.LIFETIMENUMBEROFPAYMENTS when 0 then 1
                                                                                                             else MEMBERSHIPLEVELTERM.LIFETIMENUMBEROFPAYMENTS
                                                                                                             end
                                    from dbo.MEMBERSHIPLEVELTERM
                                    where MEMBERSHIPLEVELTERM.ID = @MEMBERSHIPLEVELTERMID
                                end
                                else
                                begin
                                    set @MEMBERSHIPPLEDGEAMOUNT = isnull(@MEMBERSHIPAMOUNT, 0) - @PROMOTIONAMOUNT;
                                    if @MEMBERSHIPPLEDGEAMOUNT < 0
                                            set @MEMBERSHIPPLEDGEAMOUNT = 0;
                                    set @MEMBERSHIPPLEDGEAMOUNT += isnull(@TOTALADDONAMOUNT, 0)
                                end

                                if @MEMBERSHIPPLEDGEAMOUNT < 0
                                    set @MEMBERSHIPPLEDGEAMOUNT = 0;

                                if @PLEDGEFREQUENCYCODE <> 4
                                            begin
                                                declare @TOTALBENEFITS xml;
                                                set @TOTALBENEFITS = dbo.UFN_REVENUEDETAIL_JOINBENEFITSFORBATCH(@BENEFITS, @PERCENTAGEBENEFITS);

                                                set @INSTALLMENTS = dbo.UFN_REVENUEBATCH_GENERATEINSTALLMENTS2(@MEMBERSHIPPLEDGEAMOUNT, @PLEDGEFREQUENCYCODE, @PLEDGESTARTDATE, @PLEDGENUMBEROFINSTALLMENTS, @TRANSACTIONCURRENCYID, @TOTALBENEFITS);
                                            end
                                -- Paying first installment for Lifetime or Annual program (not recurring program)

                                if @MEMBERSHIPPROGRAMTYPECODE <> 1 and @REVENUETYPECODE = 1
                                    begin
                                        select top 1
                                            @MEMBERSHIPTRANSACTIONAMOUNT = T.c.value('AMOUNT [1]', 'money')
                                        from @INSTALLMENTS.nodes('/INSTALLMENTS/ITEM') T(c)
                                        order by T.c.value('SEQUENCE [1]', 'int');

                                        set @TOTALAMOUNT = @MEMBERSHIPTRANSACTIONAMOUNT;

                                        -- TODO This should be calculated based on the pledge installments and amount paid...

                                        set @TAXDEDUCTIBLEAMOUNT = @MEMBERSHIPTRANSACTIONAMOUNT;
                                    end
                                else if @MEMBERSHIPPROGRAMTYPECODE <> @RECURRINGPROGRAMTYPECODE and @REVENUETYPECODE = 2
                                    begin
                                        -- Pledge

                                        set @MEMBERSHIPTRANSACTIONAMOUNT = 0;
                                        set @TOTALAMOUNT = 0;
                                    end  

                            end

                        --Validate that pledge is valid

                        if @MEMBERSHIPPROGRAMTYPECODE <> @RECURRINGPROGRAMTYPECODE
                            exec dbo.USP_MEMBERSHIPDUESBATCH_VALIDATE_PLEDGE @DATE, @MEMBERSHIPPLEDGEAMOUNT, @PLEDGEFREQUENCYCODE, @PLEDGESTARTDATE, @PLEDGENUMBEROFINSTALLMENTS, @INSTALLMENTS;
                    end
                else
                    -- Paying in full

                    if @IMPORT = 1
                        begin
                            set @TAXDEDUCTIBLEAMOUNT = 
                                    case @DEDUCTIBILITYCODE
                                            when 0 then @MEMBERSHIPAMOUNT - @PROMOTIONAMOUNT
                                            when 1 then @LEVELRECEIPTAMOUNT - @PROMOTIONAMOUNT
                                            when 2 then 0
                                    end;

                            if @TAXDEDUCTIBLEAMOUNT < 0
                                set @TAXDEDUCTIBLEAMOUNT = 0;

                            set @TOTALAMOUNT = @MEMBERSHIPAMOUNT - @PROMOTIONAMOUNT;
                            if @TOTALAMOUNT < 0
                                set @TOTALAMOUNT = 0;
                            set @TOTALAMOUNT += @TOTALADDONAMOUNT;

                            -- Default Membership recognitions

                            -- Dues based level with Contributory portion

                            declare @NUMBERMEMBERSHIPRECOGNITIONS integer = 0;

                            select 
                                @NUMBERMEMBERSHIPRECOGNITIONS = count(T.c.value('CONSTITUENTID [1]', 'uniqueidentifier'))
                            from @MEMBERSHIPRECOGNITION.nodes('/MEMBERSHIPRECOGNITION/ITEM') T(c);

                            if @NUMBERMEMBERSHIPRECOGNITIONS = 0 and @OBTAINLEVELCODE = 0 and @DUESTREATEDASCONTRIBUTION = 1 and @HASCONTRIBUTIONDESIGNATIONS = 1
                                begin
                                    declare @BASETAXDEDUCTIBLEAMOUNT money = @TAXDEDUCTIBLEAMOUNT;

                                    if @TRANSACTIONCURRENCYID <> @BASECURRENCYID
                                        set @BASETAXDEDUCTIBLEAMOUNT = @BASETAXDEDUCTIBLEAMOUNT * @EXCHANGERATE;

                                    declare @DESIGNATIONSTABLE table(DESIGNATIONID uniqueidentifier, AMOUNT money);

                                    insert into @DESIGNATIONSTABLE(DESIGNATIONID, AMOUNT)
                                        select 
                                            MEMBERSHIPLEVELDESIGNATION.DESIGNATIONID, 
                                            case MEMBERSHIPLEVELDESIGNATION.[PERCENT]
                                                when 0 then 0
                                                else (MEMBERSHIPLEVELDESIGNATION.[PERCENT] / 100) * @BASETAXDEDUCTIBLEAMOUNT
                                            end as AMOUNT
                                        from dbo.MEMBERSHIPLEVELDESIGNATION
                                        where MEMBERSHIPLEVELDESIGNATION.MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID;

                                    set @MEMBERSHIPRECOGNITION = (
                                        select 
                                            RECOGNITIONS.CONSTITUENTID,
                                            RECOGNITIONS.REVENUERECOGNITIONTYPECODEID,
                                            DESIGNATIONS.DESIGNATIONID,
                                            @DATE as EFFECTIVEDATE,
                                            DESIGNATIONS.AMOUNT,
                                            @TRANSACTIONCURRENCYID as APPLICATIONCURRENCYID
                                        from @DESIGNATIONSTABLE DESIGNATIONS
                                        inner join dbo.DESIGNATION 
                                            on DESIGNATIONS.DESIGNATIONID = DESIGNATION.ID
                                        outer apply dbo.UFN_REVENUEBATCH_GETRECOGNITIONDEFAULTS_2(@GIVENANONYMOUSLY, @BILLTOCONSTITUENTID, DESIGNATIONS.AMOUNT, @DATE, null, default, default) as RECOGNITIONS
                                        left outer join dbo.REVENUERECOGNITIONTYPECODE 
                                            on RECOGNITIONS.REVENUERECOGNITIONTYPECODEID = REVENUERECOGNITIONTYPECODE.ID
                                        for xml raw('ITEM'),type,elements,root('MEMBERSHIPRECOGNITION'),BINARY BASE64
                                    );

                                end
                        end        -- if @IMPORT


            end
        else
            begin
                -- Paying for an existing pledged membership

                if @IMPORT = 1 
                    begin
                        declare @PLEDGEID uniqueidentifier = dbo.UFN_MEMBERSHIP_GETPLEDGE(@EXISTINGMEMBERSHIPID);
                        declare @RECURRINGGIFTID uniqueidentifier = dbo.UFN_MEMBERSHIP_GETRECURRINGGIFT(@EXISTINGMEMBERSHIPID)
                        declare @INSTALLMENTID uniqueidentifier = dbo.UFN_PLEDGE_GETNEXTINSTALLMENT(@PLEDGEID, null);

                        --When importing and paying for a pledged or recurring membership, we don't want to change the number of children even if it is sent.

                        set  @NUMBEROFCHILDREN = (select NUMBEROFCHILDREN from dbo.MEMBERSHIP where ID = @EXISTINGMEMBERSHIPID);

                        if @PLEDGEID is not null
                            begin
                                if @REVENUETYPECODE = 1 --Pay next

                                    set @MEMBERSHIPAMOUNT = dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(@INSTALLMENTID);
                                else if @REVENUETYPECODE = 3 --Pay other

                                    set @MEMBERSHIPAMOUNT = @PAYOTHERAMOUNT;
                                else --Pay in full

                                    set @MEMBERSHIPAMOUNT = dbo.UFN_PLEDGE_GETBALANCE(@PLEDGEID);

                                set @MEMBERSHIPTRANSACTIONAMOUNT = @MEMBERSHIPAMOUNT;

                                set @TOTALAMOUNT = @MEMBERSHIPAMOUNT +
                                                            case @PAYADDITIONALTONEXTINSTALLMENT
                                                                when 1 then coalesce(@PAYADDITIONALMONEYAMOUNT, 0)
                                                                else 0
                                                            end;

                                -- If the program is set to 'No, nothing is tax deductible then it should be zero.

                                declare @TAXDEDUCTIBLETYPE tinyint = (select MEMBERSHIPPROGRAM.DEDUCTIBILITYCODE from dbo.MEMBERSHIPPROGRAM where ID = @MEMBERSHIPPROGRAMID);
                                if @TAXDEDUCTIBLETYPE = 2
                                begin
                                    set @TAXDEDUCTIBLEAMOUNT = 0;
                                end
                                else if @TAXDEDUCTIBLEAMOUNT is null
                                begin
                                    set @TAXDEDUCTIBLEAMOUNT = @MEMBERSHIPAMOUNT;
                                end;

                                update dbo.REVENUESCHEDULE set 
                                    REVENUESCHEDULE.ISPENDING = 1,
                                    REVENUESCHEDULE.CHANGEDBYID = @CHANGEAGENTID,
                                    REVENUESCHEDULE.DATECHANGED = @CURRENTDATE
                                where REVENUESCHEDULE.ID = @PLEDGEID;

                                select @PLEDGEFREQUENCYCODE = REVENUESCHEDULE.FREQUENCYCODE, 
                                             @PLEDGENUMBEROFINSTALLMENTS = REVENUESCHEDULE.NUMBEROFINSTALLMENTS,
                                             @PLEDGESTARTDATE = REVENUESCHEDULE.STARTDATE
                                from dbo.REVENUESCHEDULE
                                where REVENUESCHEDULE.ID = @PLEDGEID;

                            end

                        if @RECURRINGGIFTID is not null
                            begin
                                if @MEMBERSHIPAMOUNT = 0
                                    select @MEMBERSHIPAMOUNT = NEXTINSTALLMENT.BALANCE
                                    from dbo.FINANCIALTRANSACTION
                                    cross apply dbo.UFN_RECURRINGGIFT_GETNEXTINSTALLMENTINFO(FINANCIALTRANSACTION.ID,null) NEXTINSTALLMENT
                                    where FINANCIALTRANSACTION.ID = dbo.UFN_MEMBERSHIP_GETRECURRINGGIFT(@EXISTINGMEMBERSHIPID)

                                if @MEMBERSHIPAMOUNT is null or @MEMBERSHIPAMOUNT = 0
                                    select
                                        @MEMBERSHIPAMOUNT = AMOUNT
                                    from dbo.MEMBERSHIPLEVELTERM
                                    where ID = @MEMBERSHIPLEVELTERMID
                                    and LEVELID = @MEMBERSHIPLEVELID;

                                set @MEMBERSHIPTRANSACTIONAMOUNT = @MEMBERSHIPAMOUNT;
                                set @TOTALAMOUNT = @MEMBERSHIPAMOUNT + case @PAYADDITIONALTONEXTINSTALLMENT
                                                                                                                 when 1 then coalesce(@PAYADDITIONALMONEYAMOUNT, 0)
                                                                                                                 else 0
                                                                                                             end;
                            end

                    end

                exec dbo.USP_MEMBERSHIPDUESBATCH_VALIDATE_PAYPLEDGEDMEMBERSHIP
                    @MEMBERSHIPTRANSACTIONTYPECODE,
                    @DATE,
                    @MEMBERSHIPEXPIRESONDATE,
                    @MEMBERSHIPPROGRAMID
                    @MEMBERSHIPLEVELID,
                    @MEMBERSHIPLEVELTERMID,
                    @CONSTITUENTID,
                    @REVENUETYPECODE,
                    @EXISTINGMEMBERSHIPID,
                    @MEMBERSHIPPROGRAMADDON,
                    @EXISTINGMEMBERS,
                    @MEMBERSHIPCARDS,
                    @EXISTINGCHILDREN,
                    @NUMBEROFCHILDREN;        -- Temporary workaround for children not being implemented in 2012 Q1

            end

        if @IMPORT = 1 and @ADDDONATION = 1
            begin
                set @TOTALAMOUNT = @TOTALAMOUNT + coalesce(@DONATIONAMOUNT, 0);
                set @TAXDEDUCTIBLEAMOUNT = @TAXDEDUCTIBLEAMOUNT + coalesce(@DONATIONAMOUNT, 0);
            end

        -- Use the partial card number if set.  This field is used for import

        -- and doesn't have any CC processing code run for it.

        if coalesce(@PARTIALCREDITCARDNUMBER, '') <> ''
            set @CREDITCARDNUMBER = @PARTIALCREDITCARDNUMBER

        -- Validate that if one credit card field is entered, the required fields are set.

        -- Server code should generally have validated this already unless the code is being

        -- added through import.

        if @PAYMENTMETHODCODE = 2     
        begin
            if len(coalesce(@CREDITCARDNUMBER, '')) > 4
            begin
                if coalesce(@CARDHOLDERNAME, '') = ''
                    raiserror('BBERR_CARDHOLDERREQUIRED', 13, 1)

                if coalesce(@EXPIRESON, '00000000') = '00000000'
                    raiserror('BBERR_EXPIRESONREQUIRED', 13, 1)
            end      
        end

        if @PAYMENTMETHODCODE = 2
            begin
                exec dbo.USP_CREDITCARD_SAVE
                    @ID = @CREDITCARDID output,
                    @CREDITCARDTOKEN = @CREDITCARDTOKEN,
                    @CARDHOLDERNAME = @CARDHOLDERNAME,
                    @CREDITCARDPARTIALNUMBER = @CREDITCARDNUMBER,
                    @CREDITTYPECODEID = @CREDITTYPECODEID,
                    @EXPIRESON = @EXPIRESON,
                    @CHANGEAGENTID = @CHANGEAGENTID,
                    @CURRENTDATE = @CURRENTDATE;
            end

        if @EXCHANGERATE is null
            set @EXCHANGERATE = 0;

        exec dbo.USP_REVENUEBATCH_SEPAMANDATE_VALIDATEORCREATE
            @SEPAMANDATEID output,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @ADDSEPAMANDATE,
            @SEPAMANDATECUSTOMIDENTIFIER,
            @SEPAMANDATESIGNATUREDATE,
            @SEPAMANDATETYPECODE,
            @PAYMENTMETHODCODE,
            @CONSTITUENTACCOUNTID,
            null, --FINANCIALINSTITUTIONID

            @TRANSACTIONCURRENCYID;

        insert into dbo.BATCHMEMBERSHIPDUES
            (
                ID,
                BATCHID,
                SEQUENCE,
                BILLTOCONSTITUENTID,
                DUESTYPECODE,
                MEMBERSHIPRECIPIENTID,
                RENEWALRECIPIENTCODE,
                FINDERNUMBER,
                APPEALID,
                EFFORTID,
                CHANNELCODEID,
                DATE,
                MEMBERSHIPTRANSACTIONTYPECODE,
                REVENUETYPECODE,
                PAYADDITIONALTONEXTINSTALLMENT,
                PAYADDITIONALMONEYAMOUNT,
                MEMBERSHIPPROGRAMID,
                MEMBERSHIPLEVELID,
                MEMBERSHIPLEVELTERMID,
                MEMBERSHIPEXPIRESONDATE,
                MEMBERSHIPAMOUNT,
                MEMBERSHIPTRANSACTIONAMOUNT,
                EXISTINGMEMBERSHIPID,
                MEMBERSHIPPLEDGEAMOUNT,
                CONTRIBUTORYDESIGNATIONID,
                USEDISCOUNT,
                MEMBERSHIPPROMOID,
                PROMOTIONCODE,
                APPLIEDDISCOUNTID,
                ADDDONATION,
                DONATIONAMOUNT,
                DONATIONGIVENANONYMOUSLY,
                DONATIONOPPORTUNITYID,
                DONATIONSINGLEDESIGNATIONID,
                DONATIONCATEGORYCODEID,
                DONATIONDECLINESGIFTAID,
                PLEDGEFREQUENCYCODE,
                PLEDGENUMBEROFINSTALLMENTS,
                PLEDGESTARTDATE,
                AUTOPAY,
                SENDPLEDGEREMINDER,
                CHECKDATE,
                CHECKNUMBER,
                REFERENCENUMBER,
                REFERENCEDATE,

                DIRECTDEBITRESULTCODE,
                DIRECTDEBITISREJECTED,

                REFERENCE,
                CONSTITUENTACCOUNTID,
                PAYMENTMETHODCODE,
                AUTOMATICALLYRENEWMEMBERSHIP,

                CREDITCARDID,
                AUTHORIZATIONCODE,
                REJECTIONMESSAGE,
                TRANSACTIONID,

                DONOTACKNOWLEDGE,
                LETTERCODEID,
                TAXDEDUCTIBLEAMOUNT,
                TRIBUTEID,
                DONOTRECEIPT,
                COMMENTS,
                TOTALAMOUNT,

                PDACCOUNTSYSTEMID,
                BASECURRENCYID,
                TRANSACTIONCURRENCYID,
                BASEEXCHANGERATEID,
                EXCHANGERATE,

                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED,
                NUMBEROFCHILDREN,
                OTHERPAYMENTMETHODCODEID,
                POSTSTATUSCODE,
                POSTDATE,
                SOURCECODE,
                MEMBERSHIPDECLINESGIFTAID,
                DDISOURCECODEID,
                DDISOURCEDATE,
                VENDORID,
                MEMBERSHIPLEVELTYPECODEID,
                CREDITCARDATTEMPTCOUNT,
                NAMECODE, 
                SIMILARADDRESSCODE,
                UNSIMILARADDRESSCODE, 
                NEWADDRESSENDDATECODE, 
                NEWADDRESSPRIMARYCODE, 
                BIRTHDATERULECODE, 
                DIFFERENTPHONECODE,
                NEWPHONEENDDATECODE, 
                NEWPHONEPRIMARYCODE, 
                DIFFERENTEMAILCODE, 
                NEWEMAILENDDATECODE, 
                NEWEMAILPRIMARYCODE, 
                USEGLOBALSETTINGS, 
                CREATEHISTORICALNAMECODE,
                SEPAMANDATEID,
                REQUIRECREDITCARDPROCESSING,
                ISGENERATEDPAYMENT,
                GLREVENUECATEGORYMAPPINGID
            )
            values 
            (
                @ID,
                @BATCHID,
                @SEQUENCE,
                @BILLTOCONSTITUENTID,

                @DUESTYPECODE,                     -- Paying, giving, comping

                @MEMBERSHIPRECIPIENT,
                @RENEWALRECIPIENT,
                @FINDERNUMBER,
                @APPEALID,
                @EFFORTID,
                @CHANNELCODEID,
                @DATE,
                @MEMBERSHIPTRANSACTIONTYPECODE,
                @REVENUETYPECODE,
                @PAYADDITIONALTONEXTINSTALLMENT,
                @PAYADDITIONALMONEYAMOUNT,
                @MEMBERSHIPPROGRAMID,
                @MEMBERSHIPLEVELID,
                @MEMBERSHIPLEVELTERMID,
                @MEMBERSHIPEXPIRESONDATE,
                @MEMBERSHIPAMOUNT,
                @MEMBERSHIPTRANSACTIONAMOUNT,
                @EXISTINGMEMBERSHIPID,
                @MEMBERSHIPPLEDGEAMOUNT,
                @CONTRIBUTORYDESIGNATIONID,
                cast(@USEDISCOUNTRADIO as bit),
                @DISCOUNTTYPE,                     -- MembershipPromoID

                @PROMOTIONCODE,
                @APPLIEDDISCOUNTID,
                @ADDDONATION,
                @DONATIONAMOUNT,
                @GIVENANONYMOUSLY,
                @DONATIONOPPORTUNITYID,
                @DONATIONDESIGNATIONID,            -- SingleDesignationID

                @DONATIONCATEGORYCODEID,
                @DECLINESGIFTAID,
                @PLEDGEFREQUENCYCODE,
                @PLEDGENUMBEROFINSTALLMENTS,
                @PLEDGESTARTDATE,
                @AUTOPAY,
                @SENDPLEDGEREMINDER,
                @CHECKDATE,
                @CHECKNUMBER,
                @REFERENCENUMBER,
                @REFERENCEDATE,

                @DIRECTDEBITRESULTCODE,
                @DIRECTDEBITISREJECTED,

                @REFERENCE,
                @CONSTITUENTACCOUNTID,
                @PAYMENTMETHODCODE,
                @AUTOMATICALLYRENEWMEMBERSHIP,

                @CREDITCARDID,
                @AUTHORIZATIONCODE,
                @REJECTIONMESSAGE,
                @TRANSACTIONID,

                @DONOTACKNOWLEDGE,
                @LETTERCODEID,
                @TAXDEDUCTIBLEAMOUNT,
                @TRIBUTEID,
                @DONOTRECEIPT,
                @COMMENTS,
                @TOTALAMOUNT,

                @PDACCOUNTSYSTEMID,
                @BASECURRENCYID,
                @TRANSACTIONCURRENCYID,
                @BASEEXCHANGERATEID,
                @EXCHANGERATE,

                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE,
                @NUMBEROFCHILDREN,
                @OTHERPAYMENTMETHODCODEID,
                @POSTSTATUSCODE,
                @POSTDATE,
                @SOURCECODE,
                @MEMBERSHIPDECLINESGIFTAID,
                @DDISOURCECODEID,
                @DDISOURCEDATE,
                isnull(@VENDORID, ''),
                @MEMBERSHIPLEVELTYPECODEID,
                @CREDITCARDATTEMPTCOUNT,
                @NAMECODE
                @SIMILARADDRESSCODE
                @UNSIMILARADDRESSCODE
                @NEWADDRESSENDDATECODE
                @NEWADDRESSPRIMARYCODE
                @BIRTHDATERULECODE
                @DIFFERENTPHONECODE,
                @NEWPHONEENDDATECODE
                @NEWPHONEPRIMARYCODE
                @DIFFERENTEMAILCODE
                @NEWEMAILENDDATECODE
                @NEWEMAILPRIMARYCODE
                @USEGLOBALSETTINGS
                @CREATEHISTORICALNAMECODE,
                @SEPAMANDATEID,
                @REQUIRECREDITCARDPROCESSING,
                @ISGENERATEDPAYMENT,
                @GLREVENUECATEGORYMAPPINGID
            );

        if @BBNCTRANID > 0 
        begin
                insert into dbo.BBNCDOWNLOADEDTRANSACTION ([ID])
                values (@BBNCID);

                insert into dbo.BATCHMEMBERSHIPDUESBBNCINFO
                (
                    BATCHMEMBERSHIPDUESID, BBNCTRANID, PAGEID, PAGENAME, BBNCID, NETCOMMUNITYTRANSACTIONPROCESSORID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                )
                values
                (
                    @ID, @BBNCTRANID, @ORIGINPAGEID, @ORIGINPAGE, @BBNCID, @BBISPROCESSORID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                )

                delete from dbo.BBNCUNSUCCESSFULDOWNLOADTRANSACTION where ID = @BBNCID;
        end

--  if @DONATIONDESIGNATIONID is null

--    exec dbo.USP_MEMBERSHIPDUESBATCH_GETDONATIONSPLITS_ADDFROMXML @ID, @DONATIONSPLITS, @CHANGEAGENTID, @CURRENTDATE; 


        -- Insert into child tables

        if @BENEFITS is not null
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETBENEFITS_ADDFROMXML @ID, @BENEFITS, @CHANGEAGENTID, @CURRENTDATE;

        if @PERCENTAGEBENEFITS is not null
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETPERCENTAGEBENEFITS_ADDFROMXML @ID, @PERCENTAGEBENEFITS, @CHANGEAGENTID, @CURRENTDATE;

        if @EXISTINGMEMBERS is not null
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETMEMBERS_UPDATEFROMXML @ID, @EXISTINGMEMBERS, @CHANGEAGENTID, @CURRENTDATE;

        if @EXISTINGCHILDREN is not null
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETCHILDREN_UPDATEFROMXML @ID, @EXISTINGCHILDREN, @CHANGEAGENTID, @CURRENTDATE;

        if @MEMBERSHIPCARDS is not null
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETMEMBERSHIPCARDS_ADDFROMXML @ID, @MEMBERSHIPCARDS, @CHANGEAGENTID, @CURRENTDATE;

        if @MEMBERSHIPPROGRAMADDON is not null
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETMEMBERSHIPPROGRAMADDONS_UPDATEFROMXML @ID, @MEMBERSHIPPROGRAMADDON, @CHANGEAGENTID, @CURRENTDATE;

        if @MEMBERSHIPRECOGNITION is not null
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETMEMBERSHIPRECOGNITIONS_ADDFROMXML @ID, @MEMBERSHIPRECOGNITION, @CHANGEAGENTID, @CURRENTDATE;

        -- TODO: Should I only do this is paying with pledge...?

        --       Or will this be null if not paying with pledge...?

        if @INSTALLMENTS is not null
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETPLEDGEINSTALLMENTS_ADDFROMXML @ID, @INSTALLMENTS, @CHANGEAGENTID, @CURRENTDATE;

        if @SOLICITCODES is not null
        begin
            exec dbo.USP_MEMBERSHIPDUESBATCH_GETSOLICITCODES_ADDFROMXML_DEFAULTID @ID, @SOLICITCODES, @CHANGEAGENTID, @CURRENTDATE;
        end

        -- add solicit codes for matched constituent

        if @IMPORT = 1 or @BBNCTRANID > 0
        begin
            -- When importing, load the constituent's existing solicit codes first

            insert into [dbo].[BATCHMEMBERSHIPDUESSOLICITCODE]
            (
                [ID],
                [BATCHMEMBERSHIPDUESID],
                [SOLICITCODEID],
                [CONSTITUENTSOLICITCODEID],
                [STARTDATE],
                [ENDDATE],
                [COMMENTS],
                [SEQUENCE],
                [CONSENTPREFERENCECODE],
                [SOURCECODEID],
                [SOURCEFILEPATH],
                [PRIVACYPOLICYFILEPATH],
                [SUPPORTINGINFORMATION],
                [CONSENTSTATEMENT],
                [ADDEDBYID],
                [CHANGEDBYID],
                [DATEADDED],
                [DATECHANGED]
            )
            select
                newid() ID,
                @ID [BATCHMEMBERSHIPDUESID],
                CONSTITUENTSOLICITCODE.[SOLICITCODEID],
                CONSTITUENTSOLICITCODE.[ID] [CONSTITUENTSOLICITCODEID],
                CONSTITUENTSOLICITCODE.[STARTDATE],
                CONSTITUENTSOLICITCODE.[ENDDATE],
                CONSTITUENTSOLICITCODE.[COMMENTS],
                CONSTITUENTSOLICITCODE.[SEQUENCE],
                CONSTITUENTSOLICITCODE.[CONSENTPREFERENCECODE],
                CONSTITUENTSOLICITCODE.[SOURCECODEID],
                CONSTITUENTSOLICITCODE.[SOURCEFILEPATH],
                CONSTITUENTSOLICITCODE.[PRIVACYPOLICYFILEPATH],
                CONSTITUENTSOLICITCODE.[SUPPORTINGINFORMATION],
                CONSTITUENTSOLICITCODE.[CONSENTSTATEMENT],
                CONSTITUENTSOLICITCODE.[ADDEDBYID],
                CONSTITUENTSOLICITCODE.[CHANGEDBYID],
                CONSTITUENTSOLICITCODE.[DATEADDED],
                CONSTITUENTSOLICITCODE.[DATECHANGED]
            from dbo.CONSTITUENTSOLICITCODE
                left join BATCHMEMBERSHIPDUESSOLICITCODE on CONSTITUENTSOLICITCODE.ID = BATCHMEMBERSHIPDUESSOLICITCODE.CONSTITUENTSOLICITCODEID and BATCHMEMBERSHIPDUESID = @ID
            where
                CONSTITUENTSOLICITCODE.[CONSTITUENTID] = @BILLTOCONSTITUENTID and 
                BATCHMEMBERSHIPDUESSOLICITCODE.ID is null;
        end

        select @SOLICITCODES = dbo.UFN_MEMBERSHIPDUESBATCH_GETSOLICITCODES_TOITEMLISTXML(@ID);

        if @SOLICITCODES is not null
        begin
            -- address the auto end date issues for consent based solicit codes

            exec dbo.USP_MEMBERSHIPDUESBATCH_ADJUSTSOLICITCODEDATERANGES @BILLTOCONSTITUENTID, @SOLICITCODES, @CHANGEAGENTID;
        end

        if @ADDDONATION = 1
            begin
                if @CAMPAIGNS is not null
                    exec dbo.USP_MEMBERSHIPDUESBATCH_GETDONATIONCAMPAIGNS_ADDFROMXML @ID, @CAMPAIGNS, @CHANGEAGENTID, @CURRENTDATE;

                if @RECOGNITIONS is not null
                    exec dbo.USP_MEMBERSHIPDUESBATCH_GETDONATIONRECOGNITIONS_ADDFROMXML @ID, @RECOGNITIONS, @CHANGEAGENTID, @CURRENTDATE;

                if @SOLICITORS is not null
                    exec dbo.USP_MEMBERSHIPDUESBATCH_GETDONATIONSOLICITORS_ADDFROMXML @ID, @SOLICITORS, @CHANGEAGENTID, @CURRENTDATE;

            end

            --this is a constituent update coming from import or BBIS - business rules are applied as well

        if @NEWCONSTITUENT.exist('NEWCONSTITUENT/ITEM') = 1 and exists (select ID from dbo.CONSTITUENT where ID = @BILLTOCONSTITUENTID)          
            begin
                exec USP_REVENUEBATCH_EDITCONSTITUENTFROMXML_1
                            @NEWCONSTITUENT
                            @BILLTOCONSTITUENTID
                            @BATCHID
                            @ID
                            @CHANGEAGENTID
                            @CURRENTAPPUSERID
                            @NAMECODE,
                            @SIMILARADDRESSCODE,
                            @UNSIMILARADDRESSCODE,
                            @NEWADDRESSPRIMARYCODE,
                            @BIRTHDATERULECODE,
                            @DIFFERENTPHONECODE,
                            @NEWPHONEPRIMARYCODE,
                            @DIFFERENTEMAILCODE,
                            @NEWEMAILPRIMARYCODE;              

                    if exists (select ID from dbo.BATCHREVENUECONSTITUENT where ID = @BILLTOCONSTITUENTID)
                    --constituent was resolved by DUPLICATE check

                    --delete the temporary batch version of the constituent

                    exec dbo.USP_REVENUEBATCH_CONSTITUENT_DELETE @BATCHREVENUECONSTITUENTID = @BILLTOCONSTITUENTID, @CHANGEAGENTID = @CHANGEAGENTID              
            end              

    end try
    begin catch
        exec dbo.USP_RAISE_ERROR;
        return 1;
    end catch

    return 0;
end