USP_DATAFORMTEMPLATE_ADD_MEMBERSHIPDUES

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@CURRENTAPPUSERID uniqueidentifier IN
@CHANGEAGENTID 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
@PAYINGORGIVINGRADIO tinyint IN
@MEMBERSHIPRECIPIENT uniqueidentifier IN
@RENEWALRECIPIENT tinyint IN
@BILLTOCONSTITUENTID uniqueidentifier IN
@EFFORTID uniqueidentifier IN
@FINDERNUMBER nvarchar(18) IN
@APPEALID uniqueidentifier IN
@CHANNELCODEID uniqueidentifier IN
@DATE date IN
@WHATPAYINGFORVALUE tinyint IN
@RENEWALREVENUETYPE tinyint IN
@PAYREVENUETYPE tinyint IN
@PAYADDITIONALTONEXTINSTALLMENT bit IN
@PAYADDITIONALMONEYAMOUNT money IN
@MEMBERSHIPPROGRAMID uniqueidentifier IN
@MEMBERSHIPLEVELID uniqueidentifier IN
@MEMBERSHIPLEVELTERMID uniqueidentifier IN
@MEMBERSHIPEXPIRESONDATE date IN
@MEMBERSHIPTRANSACTIONAMOUNT money IN
@MEMBERSHIPRECOGNITION xml IN
@CONTRIBUTORYDESIGNATIONID uniqueidentifier IN
@EXISTINGMEMBERSHIPID uniqueidentifier IN
@MEMBERSHIPPLEDGEAMOUNT money IN
@EXISTINGMEMBERS xml IN
@EXISTINGCHILDREN xml IN
@MEMBERSHIPCARDS xml IN
@USEDISCOUNTRADIO tinyint IN
@DISCOUNTTYPE uniqueidentifier IN
@PROMOTIONCODE nvarchar(50) IN
@APPLIEDDISCOUNTID uniqueidentifier IN
@MEMBERSHIPPROGRAMADDON xml IN
@ADDDONATION bit IN
@DONATIONAMOUNT money IN
@GIVENANONYMOUSLY bit IN
@DONATIONOPPORTUNITYID uniqueidentifier IN
@DONATIONDESIGNATIONID uniqueidentifier IN
@DONATIONCAMPAIGNSLIST nvarchar(100) IN
@DONATIONSOLICITORSLIST nvarchar(100) IN
@DONATIONRECOGNITIONSLIST nvarchar(100) IN
@CAMPAIGNS xml IN
@SOLICITORS xml IN
@DONATIONCATEGORYCODEID uniqueidentifier IN
@RECOGNITIONS xml IN
@DECLINESGIFTAID bit IN
@PLEDGEFREQUENCYCODE tinyint IN
@PLEDGENUMBEROFINSTALLMENTS int IN
@PLEDGESTARTDATE datetime IN
@INSTALLMENTS xml 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
@CONSTITUENTACCOUNTID uniqueidentifier IN
@REFERENCE nvarchar(255) IN
@AUTOMATICALLYRENEWMEMBERSHIP bit IN
@CREDITCARDNUMBER nvarchar(20) IN
@CREDITCARDTOKEN uniqueidentifier IN
@CARDHOLDERNAME nvarchar(255) IN
@EXPIRESON UDT_FUZZYDATE IN
@AUTHORIZECREDITCARD bit IN
@AUTHORIZATIONCODE nvarchar(20) IN
@CSC nvarchar(4) IN
@CREDITTYPECODEID uniqueidentifier IN
@MERCHANTACCOUNTID uniqueidentifier IN
@CREDITCARDTRANSACTIONID uniqueidentifier IN
@AUTOPAY bit IN
@DONOTACKNOWLEDGE bit IN
@TAXDEDUCTIBLEAMOUNT money IN
@LETTERCODEID uniqueidentifier IN
@TRIBUTEID uniqueidentifier IN
@NEWEVENTREGISTRATION bit IN
@TOTALAMOUNT money IN
@DONOTRECEIPT bit IN
@BENEFITS xml IN
@PERCENTAGEBENEFITS xml IN
@COMMENTS nvarchar(255) IN
@BATCHNUMBER nvarchar(100) IN
@NUMBEROFCHILDREN smallint IN
@OTHERPAYMENTMETHODCODEID uniqueidentifier IN
@SOURCECODE nvarchar(60) IN
@ISONEOFF bit IN
@MEMBERSHIPDECLINESGIFTAID bit IN
@DDISOURCECODEID uniqueidentifier IN
@DDISOURCEDATE date IN
@VENDORID nvarchar(50) IN
@MEMBERSHIPLEVELTYPECODEID uniqueidentifier IN
@BBNCTRANID int IN
@ORIGINPAGE nvarchar(100) IN
@ORIGINPAGEID int IN
@SEPAMANDATEID uniqueidentifier IN
@BATCHROWID uniqueidentifier IN
@REVENUECATEGORYID uniqueidentifier IN
@SOLICITCODES xml IN

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_MEMBERSHIPDUES
(
    @ID uniqueidentifier = null output,
    @CURRENTAPPUSERID uniqueidentifier = null,
    @CHANGEAGENTID 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,

    -- What are you doing with this payment?

    @PAYINGORGIVINGRADIO tinyint = 0,

    -- Who is the membership being given to?

    @MEMBERSHIPRECIPIENT uniqueidentifier = null,
    @RENEWALRECIPIENT tinyint = 0,

    -- Who is paying for this?

    @BILLTOCONSTITUENTID uniqueidentifier = null,
    @EFFORTID uniqueidentifier = null,
    @FINDERNUMBER nvarchar(18) = null,
    @APPEALID uniqueidentifier = null,
    @CHANNELCODEID uniqueidentifier = null,
    @DATE date = null,

    -- What are they paying for?

    @WHATPAYINGFORVALUE tinyint = 0,    --0 = Add, 1 = Renew, 2 = Pay, 3 = Upgrade

    @RENEWALREVENUETYPE tinyint = 0,
    @PAYREVENUETYPE tinyint = 0,
    @PAYADDITIONALTONEXTINSTALLMENT bit = 0,
    @PAYADDITIONALMONEYAMOUNT money = 0,
    @MEMBERSHIPPROGRAMID uniqueidentifier = null,
    @MEMBERSHIPLEVELID uniqueidentifier = null,
    @MEMBERSHIPLEVELTERMID uniqueidentifier = null,
    @MEMBERSHIPEXPIRESONDATE date = null,
    @MEMBERSHIPTRANSACTIONAMOUNT money = null,
    @MEMBERSHIPRECOGNITION xml = null,
    @CONTRIBUTORYDESIGNATIONID uniqueidentifier = null,
    @EXISTINGMEMBERSHIPID uniqueidentifier = null,
    @MEMBERSHIPPLEDGEAMOUNT money = 0,

    --Are these people still included in this membership?

    @EXISTINGMEMBERS xml = null,
    @EXISTINGCHILDREN xml = null,

    --Which members should receive a card?

    @MEMBERSHIPCARDS xml = null,

    -- Is there a discount or promotion?

    @USEDISCOUNTRADIO tinyint = 0,
    @DISCOUNTTYPE uniqueidentifier = null,
    @PROMOTIONCODE nvarchar(50) = null,
    @APPLIEDDISCOUNTID uniqueidentifier = null,
    @MEMBERSHIPPROGRAMADDON xml = null,

    -- Are they also giving a donation?

    @ADDDONATION bit = 0,
    @DONATIONAMOUNT money = 0,
    @GIVENANONYMOUSLY bit = 0,
    @DONATIONOPPORTUNITYID uniqueidentifier = null,
    @DONATIONDESIGNATIONID uniqueidentifier = null,
    @DONATIONCAMPAIGNSLIST nvarchar(100) = null,
    @DONATIONSOLICITORSLIST nvarchar(100) = null,
    @DONATIONRECOGNITIONSLIST nvarchar(100) = null,
    @CAMPAIGNS xml = null,
    @SOLICITORS xml = null,
    @DONATIONCATEGORYCODEID uniqueidentifier = null,
    @RECOGNITIONS xml = null,
    @DECLINESGIFTAID bit = 0,

    --What is the pledge schedule?

    @PLEDGEFREQUENCYCODE tinyint = 5,
    @PLEDGENUMBEROFINSTALLMENTS int = 1,
    @PLEDGESTARTDATE datetime = null,
    @INSTALLMENTS xml = null,
    @SENDPLEDGEREMINDER bit = 1,

    -- How are they paying?

    @CHECKDATE dbo.UDT_FUZZYDATE = null,
    @CHECKNUMBER nvarchar(20) = null,
    @REFERENCENUMBER nvarchar(20) = null,
    @REFERENCEDATE dbo.UDT_FUZZYDATE = null,
    @PAYMENTMETHODCODE tinyint = 1,
    @DIRECTDEBITRESULTCODE nvarchar(10) = null,
    @CONSTITUENTACCOUNTID uniqueidentifier = null,
    @REFERENCE nvarchar(255) = null,
    @AUTOMATICALLYRENEWMEMBERSHIP bit = 0,
    @CREDITCARDNUMBER nvarchar(20) = '',
    @CREDITCARDTOKEN uniqueidentifier = null,
    @CARDHOLDERNAME nvarchar(255) = '',
    @EXPIRESON dbo.UDT_FUZZYDATE = null,
    @AUTHORIZECREDITCARD bit = 0,
    @AUTHORIZATIONCODE nvarchar(20) = '',
    @CSC nvarchar(4) = '',
    @CREDITTYPECODEID uniqueidentifier = null,
    @MERCHANTACCOUNTID uniqueidentifier = null,
    @CREDITCARDTRANSACTIONID uniqueidentifier = null,
    @AUTOPAY bit = 0,

    -- Should it be acknowledged?

    @DONOTACKNOWLEDGE bit = 0,
    @TAXDEDUCTIBLEAMOUNT money = null,
    @LETTERCODEID uniqueidentifier = null,
    @TRIBUTEID uniqueidentifier = null,

    -- Are they also paying for an event registration?

    @NEWEVENTREGISTRATION bit = 0,
    @TOTALAMOUNT money = 0,

    @DONOTRECEIPT bit = 0,
    @BENEFITS xml = null,
    @PERCENTAGEBENEFITS xml = null,
    @COMMENTS nvarchar(255) = '',
    @BATCHNUMBER nvarchar(100) = '',
    @NUMBEROFCHILDREN smallint = 0,     -- Temporary workaround for children not being implemented in 2012 Q1

    @OTHERPAYMENTMETHODCODEID uniqueidentifier = null,
    @SOURCECODE nvarchar(60) = '',
    @ISONEOFF bit = 0,
    @MEMBERSHIPDECLINESGIFTAID bit = 0,
    @DDISOURCECODEID uniqueidentifier = null,
    @DDISOURCEDATE date = null,
    @VENDORID nvarchar(50) = '',
    @MEMBERSHIPLEVELTYPECODEID uniqueidentifier = null,

    --BBIS Fields

    @BBNCTRANID int = 0,
    @ORIGINPAGE nvarchar(100) = ''
    @ORIGINPAGEID int = 0,

    @SEPAMANDATEID uniqueidentifier = null,
  @BATCHROWID uniqueidentifier = null,
  @REVENUECATEGORYID uniqueidentifier = null,

  @SOLICITCODES xml = null
)
as

    set nocount on;

    declare @ANNUALPROGRAMTYPECODE int = 0
    declare @RECURRINGPROGRAMTYPECODE int = 1
    declare @LIFETIMEPROGRAMTYPECODE int = 2

    --These correspond to MembershipTransactionTypeCode declared in Blackbaud.AppFx.Membership.UIModel.MembershipDuesCommon 

    declare @ADD_MEMBERSHIPTRANSACTTIONTYPECODE int = 0
    declare @RENEW_MEMBERSHIPTRANSACTTIONTYPECODE int = 1
    declare @PAY_MEMBERSHIPTRANSACTTIONTYPECODE int = 2
    declare @UPGRADE_MEMBERSHIPTRANSACTTIONTYPECODE int = 3
    -- end MembershipTransactionTypeCode


    declare @MEMBERSHIPSPLITID uniqueidentifier
    declare @RGORPLEDGEMEMBERSHIPSPLITID uniqueidentifier
    declare @PAYMENTMETHODID uniqueidentifier
    declare @TAXDEDUCTIBLETYPE tinyint
    declare @INSTALLMENTPLEDGEPOSTSTATUSCODE tinyint
    declare @SPLITS xml;

    select 
        @TAXDEDUCTIBLETYPE = DEDUCTIBILITYCODE,
        @INSTALLMENTPLEDGEPOSTSTATUSCODE = case MEMBERSHIPPROGRAM.INSTALLMENTPOSTSTATUSCODE --Converting from FTM post status to USP_PLEDGE_ADD post status

            when 3 then 2
            when 1 then 1
        end
    from dbo.MEMBERSHIPPROGRAM 
    where ID = @MEMBERSHIPPROGRAMID

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

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

    if @POSTSTATUSCODE is null
        set @POSTSTATUSCODE = 1 --Not posted


    declare @CURRENTDATE datetime
    set @CURRENTDATE = getdate()

    begin try

    set @BENEFITS = dbo.UFN_MEMBERSHIPBENEFITS_SETIDSTONULL(@BENEFITS)
    set @PERCENTAGEBENEFITS = dbo.UFN_MEMBERSHIPPERCENTAGEBENEFITS_SETIDSTONULL(@PERCENTAGEBENEFITS)

        declare @STARTINGSTATUSCODE tinyint
        select
            @STARTINGSTATUSCODE = STATUSCODE
        from dbo.MEMBERSHIP
        where ID = @EXISTINGMEMBERSHIPID

        declare @SPLITSGIFTAIDINFOTBL table
        (
            REVENUESPLITID uniqueidentifier,
            DECLINESGIFTAID bit,
            ISCOVENANT bit,
            ISSPONSORSHIP bit
        )

        declare @SPLITSDECLININGGIFTAID xml
        declare @PAYMENTGIFTID uniqueidentifier

        if @PDACCOUNTSYSTEMID is null
            set @PDACCOUNTSYSTEMID = '4B121C2C-CCE6-440D-894C-EA0DEF80D50B';

        -- Check GL business rule for this account system and set to 'Do not post' if needed.

        if dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID) = 0
        begin
            set @POSTSTATUSCODE = 2; -- Do not post

            set @INSTALLMENTPLEDGEPOSTSTATUSCODE = 2; -- Do not post

            set @POSTDATE = null;
        end

        if @POSTSTATUSCODE = 2
            set @POSTDATE = null;

        if @POSTDATE is null and @POSTSTATUSCODE <> 2
            set @POSTDATE = @DATE

        --Set currency parameters for backwards compatibility

        if @TRANSACTIONCURRENCYID is null
            set @TRANSACTIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

        --Multicurrency - Retrieve base currency from the account system's currency set.

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

        if @CURRENCYSETID is null
            set @CURRENCYSETID = dbo.UFN_CURRENCYSET_GETAPPUSERDEFAULTCURRENCYSET();

        select @BASECURRENCYID = BASECURRENCYID from dbo.CURRENCYSET where ID = @CURRENCYSETID;

        -- 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
        )
        begin
            raiserror('TRANSACTIONCURRENCYINVALIDFORACCOUNTSYSTEM',13,1)
        end

        if @BASEEXCHANGERATEID = '00000000-0000-0000-0000-000000000001'
        begin
            set @BASEEXCHANGERATEID = newid()

            --Replace with call to USP_CURRENCYEXCHANGERATE_ENSURESPOTRATEEXISTS for PBI 102747 in the future

            /*if not dbo.UFN_SECURITY_APPUSER_GRANTED_SYSTEMPRIVILEGE_IN_SYSTEMROLE(@CURRENTAPPUSERID,'911f104d-ba5f-4469-b0ae-184c879aea99') = 1
            and not dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1
            begin
                raiserror('User does not have the right to add a new spot rate.', 13, 1);
                return 1;
            end*/

            insert into dbo.CURRENCYEXCHANGERATE
            (
                ID,
                FROMCURRENCYID,
                TOCURRENCYID,
                RATE,
                ASOFDATE,
                TYPECODE,
                SOURCECODEID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            values
            (
                @BASEEXCHANGERATEID,
                @TRANSACTIONCURRENCYID,
                @BASECURRENCYID,
                @EXCHANGERATE,
                @DATE,
                2,
                null,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            );
        end

        --Get Multicurrency values.

        declare @BASEAMOUNT money;
        declare @DONATIONBASEAMOUNT money
        declare @ORGANIZATIONAMOUNT money;
        declare @DONATIONORGANIZATIONAMOUNT money;
        declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
        declare @ORGANIZATIONCURRENCYID uniqueidentifier;
        declare @BASETOORGANIZATIONEXCHANGERATEID uniqueidentifier;
        declare @BASECURRENCYDECIMALDIGITS tinyint;
        declare @ORGANIZATIONCURRENCYDECIMALDIGITS tinyint;
        declare @TRANSACTIONCURRENCYDECIMALDIGITS tinyint;
        declare @NONREVENUEBASEAMOUNT money = 0;
        declare @WHEREISREVENUETRACKEDCODE tinyint;

        exec dbo.USP_CURRENCY_GETCURRENCYVALUES @MEMBERSHIPTRANSACTIONAMOUNT, @DATE, @BASECURRENCYID, @BASEEXCHANGERATEID output, @TRANSACTIONCURRENCYID output, @BASEAMOUNT output, @ORGANIZATIONCURRENCYID output, @ORGANIZATIONAMOUNT output, @ORGANIZATIONEXCHANGERATEID output, 1, @BASETOORGANIZATIONEXCHANGERATEID output;

        select @BASECURRENCYDECIMALDIGITS = DECIMALDIGITS
        from dbo.CURRENCY
        where ID = @BASECURRENCYID

        select @ORGANIZATIONCURRENCYDECIMALDIGITS = DECIMALDIGITS
        from dbo.CURRENCY
        where ID = @ORGANIZATIONCURRENCYID

        select @TRANSACTIONCURRENCYDECIMALDIGITS = DECIMALDIGITS
        from dbo.CURRENCY
        where ID=@TRANSACTIONCURRENCYID

        declare @LATESTBASEEXCHANGERATE uniqueidentifier
        set @LATESTBASEEXCHANGERATE =  dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(@TRANSACTIONCURRENCYID,@BASECURRENCYID,@DATE,1,null)

        select @WHEREISREVENUETRACKEDCODE = WHEREISREVENUETRACKEDCODE
            from dbo.MEMBERSHIPPROGRAM
            where ID = @MEMBERSHIPPROGRAMID

        if (@WHEREISREVENUETRACKEDCODE = 1)
        begin
            if (@TRANSACTIONCURRENCYID = @BASECURRENCYID)
                SET @NONREVENUEBASEAMOUNT = @MEMBERSHIPTRANSACTIONAMOUNT
            else
                SET @NONREVENUEBASEAMOUNT = dbo.UFN_CURRENCY_CONVERT(@MEMBERSHIPTRANSACTIONAMOUNT,@BASEEXCHANGERATEID)
        end

        if exists
            (
                select * from dbo.MEMBERSHIPTRANSACTION
                where MEMBERSHIPID = @EXISTINGMEMBERSHIPID and cast(TRANSACTIONDATE as date) > @DATE
            )
            raiserror('BBERR_DATEEARLIERTHANLASTMEMBERSHIPTRANSACTION', 13,1);

        if @PAYMENTMETHODCODE = 0 or @PAYMENTMETHODCODE = 1
            set @AUTOMATICALLYRENEWMEMBERSHIP = 0

        declare @PAYMENTCREATED bit = 0;

        if @ISONEOFF = 1
        begin

            declare @ISGROUP bit = 0;

      declare @CONSTITUENTID uniqueidentifier;
      select @CONSTITUENTID = 
        case @PAYINGORGIVINGRADIO 
          when 0 then @BILLTOCONSTITUENTID 
          else @MEMBERSHIPRECIPIENT 
        end;

            select
                @ISGROUP = ISGROUP
            from dbo.CONSTITUENT
            where 
                ID = @CONSTITUENTID;

            -- If adding a new membership

            if @WHATPAYINGFORVALUE = @ADD_MEMBERSHIPTRANSACTTIONTYPECODE or @WHATPAYINGFORVALUE = @RENEW_MEMBERSHIPTRANSACTTIONTYPECODE
                begin
                    if dbo.UFN_MEMBERSHIPDUESBATCH_CANADDCONSTITUENTTOPROGRAM_3(@CONSTITUENTID, @MEMBERSHIPPROGRAMID,@WHATPAYINGFORVALUE,@EXISTINGMEMBERSHIPID) = 0
                        raiserror('BBERR_CONSTITUENTINVALIDFORPROGRAM', 13,1);
                end
            else
                begin
                    -- Do not allow individuals to renew other individuals' memberships

                    if @ISGROUP = 0
                    begin
                            if @EXISTINGMEMBERSHIPID is not null and not exists(select 1 from dbo.MEMBER where MEMBERSHIPID = @EXISTINGMEMBERSHIPID and CONSTITUENTID = @CONSTITUENTID)
                                raiserror('BBERR_INVALIDMEMBERSHIP_FORCONSTITUENT', 13,1);
                    end
                    else
                    begin

                    -- Do not allow backdate transaction unless it is for a pending membership

                    declare @CURRENTSTATUS tinyint = 0;
                    declare @JOINDATE datetime;

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

                    if @MEMBERSHIPEXPIRESONDATE < @JOINDATE
                        raiserror('BBERR_EXPIRATIONDATEB4JOINDATE', 13, 1);
                end
            end
        end

        if @WHATPAYINGFORVALUE = @PAY_MEMBERSHIPTRANSACTTIONTYPECODE
        begin
            declare @LATESTMEMBERSHIPTRANSACTIONID uniqueidentifier = null;
            select @LATESTMEMBERSHIPTRANSACTIONID = dbo.UFN_MEMBERSHIP_GETLASTMEMBERSHIPTRANSACTIONID(@EXISTINGMEMBERSHIPID);

            --Get the pledge or recurring gift that this payment is being applied to

            declare @EXISTINGMEMBERSHIPFINANCIALTRANSACTIONID uniqueidentifier
            select top 1
                @EXISTINGMEMBERSHIPFINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
            from dbo.MEMBERSHIPTRANSACTION
                left join dbo.MEMBERSHIP on MEMBERSHIPTRANSACTION.MEMBERSHIPID = MEMBERSHIP.ID
                left join dbo.FINANCIALTRANSACTIONLINEITEM on MEMBERSHIPTRANSACTION.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
                left join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                left join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
                left join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
            where
                MEMBERSHIPTRANSACTION.ID = @LATESTMEMBERSHIPTRANSACTIONID
                and FINANCIALTRANSACTION.TYPECODE in (2,15)
                and FINANCIALTRANSACTION.DELETEDON is null
                and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1
                and (
                            (
                                FINANCIALTRANSACTION.TYPECODE = 15 and
                                MEMBERSHIPTRANSACTION.TRANSACTIONDATE >= coalesce(MEMBERSHIP.LASTRENEWEDON, MEMBERSHIP.JOINDATE)
                            ) or
                            (
                                FINANCIALTRANSACTION.TYPECODE = 2 and
                                MEMBERSHIPTRANSACTION.TRANSACTIONDATE >= MEMBERSHIP.JOINDATE
                            )
                        )
            order by MEMBERSHIPTRANSACTION.TRANSACTIONDATE desc;

            if @EXISTINGMEMBERSHIPFINANCIALTRANSACTIONID is null
                        raiserror('BBERR_NOCOMMITMENTFORPAY', 13, 1)

            if (@WHEREISREVENUETRACKEDCODE = 0)
            begin
                --Create payment

                exec dbo.USP_PAYMENT_ADDBASE 
                    @ID output
                    @CHANGEAGENTID
                    @CURRENTDATE
                    @BILLTOCONSTITUENTID,
                    @DATE
                    @TOTALAMOUNT
                    @PAYMENTMETHODCODE
                    @CHECKDATE
                    @CHECKNUMBER,
                    @REFERENCEDATE
                    @REFERENCENUMBER
                    @CARDHOLDERNAME
                    @CREDITCARDNUMBER,
                    @CREDITTYPECODEID
                    @AUTHORIZATIONCODE
                    @EXPIRESON
                    '',
                    0
                    ''
                    0
                    null,
                    null
                    @TAXDEDUCTIBLEAMOUNT
                    @CONSTITUENTACCOUNTID,
                    @POSTSTATUSCODE
                    @POSTDATE
                    @FINDERNUMBER,
                    @SOURCECODE
                    @APPEALID
                    @BENEFITS
                    0
                    @GIVENANONYMOUSLY
                    @EFFORTID
                    @CHANNELCODEID
                    @DONOTACKNOWLEDGE,@DONOTRECEIPT,
                    @BATCHNUMBER
                    @OTHERPAYMENTMETHODCODEID
                    @REFERENCE
                    @TRIBUTEID
                    @LETTERCODEID
                    @DIRECTDEBITRESULTCODE
                    0
                    0
                    ''
                    0
                    0
                    0
                    @PERCENTAGEBENEFITS
                    @TRANSACTIONCURRENCYID,
                    @BASECURRENCYID
                    @BASEEXCHANGERATEID
                    @EXCHANGERATE
                    @CURRENTAPPUSERID
                    @SEPAMANDATEID;

                exec dbo.USP_PDACCOUNTSYSTEM_LINKTOREVENUE
                        @ID = @ID,
                        @PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID,
                        @CHANGEDATE = @CURRENTDATE,
                        @CHANGEAGENTID = @CHANGEAGENTID

                set @PAYMENTMETHODID  = (select ID from dbo.REVENUEPAYMENTMETHOD where REVENUEID = @ID)

                if @CREDITCARDTRANSACTIONID is not null and @PAYMENTMETHODCODE = 2 -- Credit card

                begin
                    update dbo.CREDITCARDPAYMENTMETHODDETAIL set
                        TRANSACTIONID = @CREDITCARDTRANSACTIONID,
                        VENDORID = isnull(@VENDORID, ''),
                        DATECHANGED = @CURRENTDATE,
                        CHANGEDBYID = @CHANGEAGENTID
                    where ID = @PAYMENTMETHODID
                end

                declare @AMOUNTPAID money;
                declare @CREATEDSPLITS xml;
                declare @PAYMENTSPLITSDECLININGGIFTAID xml
                declare @PAYMENTRECEIPTTYPECODE tinyint;
                declare @PAYMENTAMOUNT money = @MEMBERSHIPTRANSACTIONAMOUNT + @PAYADDITIONALMONEYAMOUNT

                if (select TYPECODE from dbo.FINANCIALTRANSACTION where ID = @EXISTINGMEMBERSHIPFINANCIALTRANSACTIONID and DELETEDON is null) = 15
                begin
                    --Add the payment to the appropriate installment plan

                    exec dbo.USP_PLEDGE_ADDPAYMENT 
                        @ID,
                        @EXISTINGMEMBERSHIPFINANCIALTRANSACTIONID,
                        @PAYMENTAMOUNT,
                        @BILLTOCONSTITUENTID,
                        @DATE,
                        null,
                        19,
                        @AMOUNTPAID,
                        @CURRENTDATE,
                        @CHANGEAGENTID,
                        @CREATEDSPLITS output,
                        1,
                        0,
                        null,
                        null;

                    set @PAYMENTRECEIPTTYPECODE = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@BILLTOCONSTITUENTID,2);

                    set @RGORPLEDGEMEMBERSHIPSPLITID = (
                        select T.c.value('(ID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                        from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
                        where T.c.value('(TYPECODE)[1]','tinyint') = 2
                    )
                end
                else
                begin
                    declare @NEXTRECURRINGGIFTINSTALLMENTID uniqueidentifier = dbo.UFN_RECURRINGGIFT_GETNEXTINSTALLMENT(@EXISTINGMEMBERSHIPFINANCIALTRANSACTIONID, null)

                    exec dbo.USP_RECURRINGGIFT_ADDPAYMENT 
                        @REVENUEID = @ID,
                        @APPLICATIONID = @EXISTINGMEMBERSHIPFINANCIALTRANSACTIONID,
                        @APPLIEDAMOUNT = @PAYMENTAMOUNT,
                        @CONSTITUENTID = @BILLTOCONSTITUENTID,
                        @DATE = @DATE,
                        @CREATIONDATE = @CURRENTDATE,
                        @CHANGEAGENTID = @CHANGEAGENTID,
                        @CREATEDSPLITS = @CREATEDSPLITS output,
                        @BASEAPPLIEDAMOUNT = null,
                        @ORGANIZATIONAPPLIEDAMOUNT = null;

                    set @PAYMENTRECEIPTTYPECODE = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@BILLTOCONSTITUENTID,3);

                        set @RGORPLEDGEMEMBERSHIPSPLITID = (select
                                    T.c.value('(ID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                                from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
                                where T.c.value('(TYPECODE)[1]','tinyint') = 2)

                    --if the balance of the installment is now 0, then update the membership

                    if dbo.UFN_RECURRINGGIFTINSTALLMENT_GETINSTALLMENTBALANCE(@NEXTRECURRINGGIFTINSTALLMENTID) = 0
                    begin
                        update dbo.MEMBERSHIP
                        set LASTRENEWEDON = dbo.UFN_DATE_GETEARLIESTTIME(@DATE),
                            MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID
                            MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID,
                            ISGIFT = @PAYINGORGIVINGRADIO,
                            GIVENBYID = case when @PAYINGORGIVINGRADIO = 1 then @BILLTOCONSTITUENTID else null end,
                            CHANGEDBYID = @CHANGEAGENTID
                            DATECHANGED = @CURRENTDATE,
                            STATUSCODE = 0,
                            AUTOMATICALLYRENEWMEMBERSHIP = @AUTOMATICALLYRENEWMEMBERSHIP
                        where MEMBERSHIP.ID = @EXISTINGMEMBERSHIPID
                    end
                end

                -- create revenue category for any payments

                if @REVENUECATEGORYID is not null
                begin
                    exec dbo.USP_REVENUECATEGORY_UPDATESPLITS @ID, @REVENUECATEGORYID, @CHANGEAGENTID, @CURRENTDATE;
                end

                set @PAYMENTSPLITSDECLININGGIFTAID =
                    (
                        select
                            T.c.value('(ID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                        from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
                            inner join dbo.REVENUESPLITGIFTAID on T.c.value('(SOURCEREVENUESPLITID)[1]','uniqueidentifier') = REVENUESPLITGIFTAID.ID
                        where REVENUESPLITGIFTAID.DECLINESGIFTAID = 1
                        for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64
                    )

                if @ADDDONATION = 1
                begin
                    exec dbo.USP_GIFT_ADDPAYMENT
                        @REVENUEID = @ID,
                        @AMOUNT = @DONATIONAMOUNT,
                        @DESIGNATIONID = @DONATIONDESIGNATIONID,
                        @OPPORTUNITYID = @DONATIONOPPORTUNITYID,
                        @CAMPAIGNS = @CAMPAIGNS,
                        @SOLICITORS = @SOLICITORS,
                        @RECOGNITIONCREDITS = @RECOGNITIONS,
                        @CATEGORYCODEID = @DONATIONCATEGORYCODEID,
                        @CREATIONDATE =  @CURRENTDATE,
                        @CHANGEAGENTID = @CHANGEAGENTID,
                        @ID = @PAYMENTGIFTID output,
                        @REVENUETYPECODE = 0

                    select @SPLITS = (select sum(REVENUESPLIT.TRANSACTIONAMOUNT) AMOUNT, REVENUESPLIT_EXT.DESIGNATIONID, 0 as TYPECODE
                                        from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
                                        inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID
                                        where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.TYPECODE = 0 and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 0
                                        group by REVENUESPLIT_EXT.DESIGNATIONID
                                        for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64);  

                    -- create matching gift records

                    if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDMG() > 0
                        exec USP_MATCHINGGIFTPLEDGE_AUTOADD @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;

                    if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDSPOUSEMG() > 0
                        exec USP_MATCHINGGIFTPLEDGE_AUTOADDFROMSPOUSE @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;
                end

                exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 1, @PAYMENTSPLITSDECLININGGIFTAID;

                update dbo.REVENUE_EXT
                set RECEIPTTYPECODE = @PAYMENTRECEIPTTYPECODE
                where ID = @ID;

                if @PAYMENTAMOUNT + @DONATIONAMOUNT < (select sum(TRANSACTIONAMOUNT) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1)
                    raiserror('BBERR_AMOUNTLESSTHANAPPLIEDAMOUNT', 13, 1);

                if @PAYMENTAMOUNT + @DONATIONAMOUNT <> (select sum(TRANSACTIONAMOUNT) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1) -- and @RENEWALREVENUETYPE <> 3

                    raiserror('BBERR_ALLMONEYNOTAPPLIED', 13, 1);

                if (select count(*) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1) = 0
                    raiserror('BBERR_NOAPPLICATIONS', 13, 1);

                -- Add gift fees

                exec dbo.USP_PAYMENT_ADDGIFTFEES @ID, @BILLTOCONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

                            if @BBNCTRANID > 0
                    insert into dbo.REVENUEBBNC(ID, NETCOMMUNITYTRANSACTIONID, NETCOMMUNITYPAGENAME, NETCOMMUNITYPAGEID, NETCOMMUNITYAPPEALID, EMAILID, EMAILSUBJECT, EMAILNAME, ISTEAMFUNDRAISINGOFFLINEGIFT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                    values(@ID, @BBNCTRANID, @ORIGINPAGE, @ORIGINPAGEID, null, 0, '', '', 0, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);                        

                --If a SEPA mandate is used, mark the mandate record to show that a payment has been made towards it.

                if @SEPAMANDATEID is not null
                begin
                    if @BATCHROWID is not null
                    begin
                        exec dbo.USP_SEPAMANDATE_PAYMENTMADE @SEPAMANDATEID,@BATCHROWID,@ID, @CHANGEAGENTID;
                    end
                end

                set @PAYMENTCREATED = 1
            end
        end
        else
        begin
            declare @CANBEPAIDINFULL bit = 0;
            declare @CANBEPLEDGED bit = 0;
            declare @PLEDGECREATED bit = 0;
            declare @RECURRINGGIFTCREATED bit = 0;
            declare @PLEDGEID uniqueidentifier;
            declare @RECURRINGGIFTID uniqueidentifier;
            --declare @PAYMENTCREATED bit = 0;

            declare @MEMBERSHIPACTIONCODE tinyint = 0;
            declare @ALLOWMULTIPLEMEMBERSHIPS bit = 0;
            declare @NUMBEROFMEMBERS smallint = 0;
            declare @CHILDREN smallint = 0;
            --declare @NUMBEROFCHILDREN smallint = 0;   -- Commented out for 2012 Q1; children will be implemented later. For now @NUMBEROFCHILDREN is a parameter.

            declare @CONTRIBUTED bit = 0;

            declare @MEMBERS table(ID uniqueidentifier, ISPRIMARY bit);
            declare @PRIMARYMEMBERID uniqueidentifier;
            declare @BILLTOISGROUP bit = 0;

            declare @PROGRAMTYPE tinyint = 0;

            -- Create a Primary member field to encapsulate who should receive the membership.

            if @PAYINGORGIVINGRADIO = 1
                set @PRIMARYMEMBERID = @MEMBERSHIPRECIPIENT;
            else
                set @PRIMARYMEMBERID = @BILLTOCONSTITUENTID;

            select
                @BILLTOISGROUP = CONSTITUENT.ISGROUP
            from dbo.CONSTITUENT
            where
                CONSTITUENT.ID = @BILLTOCONSTITUENTID;

            if @BILLTOISGROUP = 1 and @PAYINGORGIVINGRADIO = 0 and @WHATPAYINGFORVALUE = @RENEW_MEMBERSHIPTRANSACTTIONTYPECODE and @EXISTINGMEMBERSHIPID is not null
            begin
                -- groups can renew a membership for a member of the group. 

                -- As such, we need to change the primary member to be the person on the existing membership

                select
                    @PRIMARYMEMBERID = MEMBER.CONSTITUENTID
                from dbo.MEMBER
                where
                    MEMBER.MEMBERSHIPID = @EXISTINGMEMBERSHIPID
                    and MEMBER.ISPRIMARY = 1;
            end

            declare @EXISTINGPRIMARYMEMBER uniqueidentifier = null;
            select
                @EXISTINGPRIMARYMEMBER = MEMBER.CONSTITUENTID
            from dbo.MEMBER
            where
                MEMBER.MEMBERSHIPID = @EXISTINGMEMBERSHIPID
                and MEMBER.ISPRIMARY = 1;

            insert into @MEMBERS(ID, ISPRIMARY)
            select T.members.value('(CONSTITUENTID)[1]','uniqueidentifier'), 0
            from @EXISTINGMEMBERS.nodes('/EXISTINGMEMBERS/ITEM') T(members)
            where T.members.value('(CONSTITUENTID)[1]','uniqueidentifier') is not null
            union all
            select @PRIMARYMEMBERID, 1


            -- When we're renewing, rejoining or upgrading...we don't want to change the primary if the billto changes, we want whomever is currently primary to remain.

            if ((@WHATPAYINGFORVALUE = @RENEW_MEMBERSHIPTRANSACTTIONTYPECODE or @WHATPAYINGFORVALUE = @UPGRADE_MEMBERSHIPTRANSACTTIONTYPECODE) and @EXISTINGMEMBERSHIPID is not null)
            begin

                --If primary member is in the @EXISTINGMEMBERS collection that means they're not the recipient or the billto and   we need to swap the ISPRIMARY flag so the primary remains 

                if exists (select 1 from 
                                     @EXISTINGMEMBERS.nodes('/EXISTINGMEMBERS/ITEM') T(members) 
                                     where T.members.value('(CONSTITUENTID)[1]','uniqueidentifier') = @EXISTINGPRIMARYMEMBER)
                begin
                    update @MEMBERS
                    set ISPRIMARY = 0
                    where ID = @PRIMARYMEMBERID;

                    update @MEMBERS
                    set ISPRIMARY = 1
                    where ID = @EXISTINGPRIMARYMEMBER;
                end
            end

            select
                @CANBEPAIDINFULL = MEMBERSHIPPROGRAM.ONEPAYMENTEACHTERM,
                @CANBEPLEDGED = MEMBERSHIPPROGRAM.MULTIPLEPAYMENTSEACHTERM,
                @ALLOWMULTIPLEMEMBERSHIPS = MEMBERSHIPPROGRAM.ALLOWMULTIPLEMEMBERSHIPS,
                @CHILDREN = MEMBERSHIPLEVEL.CHILDRENALLOWED,
                @NUMBEROFMEMBERS = MEMBERSHIPLEVEL.MEMBERSALLOWED,
                @PROGRAMTYPE = MEMBERSHIPPROGRAM.PROGRAMTYPECODE,
                @CONTRIBUTED = case when MEMBERSHIPLEVEL.OBTAINLEVELCODE = 1 then 1 else 0 end
            from
                dbo.MEMBERSHIPPROGRAM
                inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPPROGRAM.ID = MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID
            where
                MEMBERSHIPPROGRAM.ID = @MEMBERSHIPPROGRAMID
                and MEMBERSHIPLEVEL.ID = @MEMBERSHIPLEVELID

            declare @RECURRINGPAYMENTOPTIONS_MAKENEXTPAYMENT tinyint = 1
            declare @RECURRINGPAYMENTOPTIONS_CREATEGIFTONLY tinyint = 2
            declare @RECURRINGPAYMENTOPTION tinyint = null

            --Use @RECURRINGPAYMENTOPTION when you want to use @RENEWALREVENUETYPE only for recurring/sustaining memberships

            set @RECURRINGPAYMENTOPTION = case when @PROGRAMTYPE = @RECURRINGPROGRAMTYPECODE
                                                                                then @RENEWALREVENUETYPE 
                                                                                else null
                                                                        end

            declare @INSTALLMENTPAYMENTOPTION tinyint = null
            --Use @INSTALLMENTPAYMENTOPTION when you want to use @RENEWALREVENUETYPE only for installment based memberships (lifetime not paid in full or annual dues w/ installment payments)

            SET @INSTALLMENTPAYMENTOPTION = case when @PROGRAMTYPE <> @RECURRINGPROGRAMTYPECODE 
                                                                                then @RENEWALREVENUETYPE
                                                                                else null
                                                                            end

            --Store Addons

            declare @ADDONS table
            (
                ID uniqueidentifier,
                APPLY bit,
                ADDONID uniqueidentifier, 
                PRICE money,
                NUMBEROFADDONS integer,
                REVENUESPLITID uniqueidentifier
            );
            declare @ADDITIONALMEMBERS integer = 0;

            insert into @ADDONS(ID,APPLY, ADDONID, PRICE, NUMBEROFADDONS)
                select
                    newid(),
                    T.c.value('APPLY [1]', 'bit'),
                    T.c.value('ADDONID [1]', 'uniqueidentifier'),
                    T.c.value('PRICE [1]', 'money'),
                    T.c.value('NUMBEROFADDONS [1]', 'int')
                from @MEMBERSHIPPROGRAMADDON.nodes('/MEMBERSHIPPROGRAMADDON/ITEM') T(c)

            select
                @ADDITIONALMEMBERS = COALESCE(sum(NA.NUMBEROFADDONS), 0)
            from @ADDONS NA
                inner join dbo.ADDON A on NA.ADDONID = A.ID
            where
                A.ADDONTYPECODE = 1 and
                NA.APPLY = 1;

            set @NUMBEROFMEMBERS = @NUMBEROFMEMBERS + @ADDITIONALMEMBERS;

            declare @ERRORMSG nvarchar(52)
            if @NUMBEROFMEMBERS > 1
            begin
                set @ERRORMSG = 'Only ' + convert(nvarchar(6), @NUMBEROFMEMBERS) + ' members are allowed for this membership.'
            end
            else
            begin
                set @ERRORMSG = 'Only ' + convert(nvarchar(6), @NUMBEROFMEMBERS) + ' member is allowed for this membership.'
            end

            if @NUMBEROFMEMBERS < (select count(ID) from @MEMBERS)
            begin
                raiserror(@ERRORMSG, 13, 1);
            end

            set @ERRORMSG = 'The number of children may not be larger than '+convert(nvarchar(6), @CHILDREN)+'.'

            --For a future release, when children exist:


            --select @NUMBEROFCHILDREN =

            --count(*) from @EXISTINGCHILDREN.nodes('/EXISTINGCHILDREN/ITEM') T(c)


            -- Number of children validation

            if @CHILDREN < @NUMBEROFCHILDREN --and @CHILDREN > 0

            begin
                raiserror(@ERRORMSG, 13, 1);
            end

            if exists
            (
                select count(ID)
                from @MEMBERS
                group by ID
                having count(*) > 1
            )
                raiserror('BBERR_DUPLICATEMEMBER', 13,1);

            declare @UPGRADEACTIONCODE int = 2
            declare @DOWNGRADEACTIONCODE int = 3

            declare @UPGRADEMETHODCODE int
            declare @NOTANUPGRADE int = 0
            declare @RENEWALUPGRADE int = 1
            declare @MIDTERMUPGRADE int = 2

            set @MEMBERSHIPACTIONCODE = 
                    case @WHATPAYINGFORVALUE
                        when @UPGRADE_MEMBERSHIPTRANSACTTIONTYPECODE then @UPGRADEACTIONCODE
                        else dbo.UFN_MEMBERSHIPTRANSACTION_DETERMINEACTIONCODE(@EXISTINGMEMBERSHIPID, @MEMBERSHIPLEVELID, @DATE)
                    end
            set @UPGRADEMETHODCODE = 
                    case 
                        when @WHATPAYINGFORVALUE = @UPGRADE_MEMBERSHIPTRANSACTTIONTYPECODE then @MIDTERMUPGRADE
                        when (@WHATPAYINGFORVALUE = @RENEW_MEMBERSHIPTRANSACTTIONTYPECODE) and (@MEMBERSHIPACTIONCODE IN (@UPGRADEACTIONCODE,@DOWNGRADEACTIONCODE)) then @RENEWALUPGRADE
                        else @NOTANUPGRADE
                    end

            if (@WHEREISREVENUETRACKEDCODE = 0)
            begin
                if @PROGRAMTYPE = @RECURRINGPROGRAMTYPECODE
                begin
                    --Create a recurring gift for this membership

                    declare @RGCONTRIBUTEDAMOUNT money = 0;
                    declare @RGTERMCODE tinyint;
                    declare @RGTAXDEDUCTIBLEAMOUNT money;

                    --If were just creating the recurring gift, the taxdeductibleamount is going to be zero so look at the level instead.

                    if @RENEWALREVENUETYPE = 2
                    begin
                        if @TAXDEDUCTIBLETYPE = 0 -- "Yes, the entire amount is deductible"

                        begin
                            set @RGTAXDEDUCTIBLEAMOUNT = (select AMOUNT from dbo.MEMBERSHIPLEVELTERM where ID = @MEMBERSHIPLEVELTERMID);
                        end
                        else
                        begin
                            set @RGTAXDEDUCTIBLEAMOUNT = (select RECEIPTAMOUNT from dbo.MEMBERSHIPLEVEL where ID = @MEMBERSHIPLEVELID);
                        end

                        if @RGTAXDEDUCTIBLEAMOUNT > @MEMBERSHIPTRANSACTIONAMOUNT
                            set @RGTAXDEDUCTIBLEAMOUNT = @MEMBERSHIPTRANSACTIONAMOUNT

                    end
                    else
                    begin
                        set @RGTAXDEDUCTIBLEAMOUNT = @TAXDEDUCTIBLEAMOUNT
                    end

                    declare @RGSPLITTABLE table(ID uniqueidentifier, APPLICATIONCODE tinyint, TYPECODE tinyint, DESIGNATIONID uniqueidentifier, AMOUNT money, DECLINESGIFTAID bit, TRANSACTIONCURRENCYID uniqueidentifier)
                    insert into @RGSPLITTABLE(ID, APPLICATIONCODE, TYPECODE, DESIGNATIONID, AMOUNT, DECLINESGIFTAID, TRANSACTIONCURRENCYID)
                        select newid(), 0, 0, CONTRIBUTEDAMOUNTS.DESIGNATIONID, CONTRIBUTEDAMOUNTS.AMOUNT, @MEMBERSHIPDECLINESGIFTAID, @TRANSACTIONCURRENCYID
                        from dbo.UFN_MEMBERSHIP_GETCONTRIBUTEDAMOUNTSBYLEVELID(@MEMBERSHIPLEVELID, (@RGTAXDEDUCTIBLEAMOUNT - @DONATIONAMOUNT),@TRANSACTIONCURRENCYDECIMALDIGITS) CONTRIBUTEDAMOUNTS

                    select @RGCONTRIBUTEDAMOUNT = sum(AMOUNT) from @RGSPLITTABLE

                    declare @RGMEMBERSHIPPARENTSPLITID uniqueidentifier = newid()

                    declare @RGSPLITS xml =
                        (
                            select RGSPLITS.ID, RGSPLITS.APPLICATIONCODE, RGSPLITS.TYPECODE, RGSPLITS.DESIGNATIONID, RGSPLITS.AMOUNT, RGSPLITS.DECLINESGIFTAID, RGSPLITS.TRANSACTIONCURRENCYID
                            from
                                (
                                    select
                                        @RGMEMBERSHIPPARENTSPLITID as ID,
                                        5 as APPLICATIONCODE,
                                        2 as TYPECODE,
                                        null as DESIGNATIONID,
                                        @MEMBERSHIPTRANSACTIONAMOUNT - coalesce(@RGCONTRIBUTEDAMOUNT, 0) as AMOUNT,
                                        @MEMBERSHIPDECLINESGIFTAID as DECLINESGIFTAID,
                                        @TRANSACTIONCURRENCYID as TRANSACTIONCURRENCYID

                                        union all

                                        select
                                            ID as ID,
                                            APPLICATIONCODE,
                                            TYPECODE,
                                            DESIGNATIONID,
                                            AMOUNT,
                                            DECLINESGIFTAID,
                                            TRANSACTIONCURRENCYID
                                        from @RGSPLITTABLE) as RGSPLITS
                                        for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64
                                );

                    select @RGTERMCODE = MEMBERSHIPLEVELTERM.RECURRINGPAYMENTOPTIONCODE
                    from dbo.MEMBERSHIPLEVELTERM
                    where MEMBERSHIPLEVELTERM.ID = @MEMBERSHIPLEVELTERMID


                    --We must get a new base exchange rate here because the base currency of the user will be used as the base currency of the recurring gift, which may

                    --  be different from the base currency specified by the account system used.

                    declare @RGBASEEXCHANGERATEID uniqueidentifier = dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(@TRANSACTIONCURRENCYID, dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID), @DATE, 1, null)

                    exec USP_DATAFORMTEMPLATE_ADD_RECURRINGGIFT
                        @RECURRINGGIFTID output,
                        @CHANGEAGENTID,
                        @BILLTOCONSTITUENTID,
                        @DATE,
                        @MEMBERSHIPTRANSACTIONAMOUNT,
                        @PAYMENTMETHODCODE,
                        @REFERENCEDATE,
                        @REFERENCENUMBER,
                        @CARDHOLDERNAME,
                        @CREDITCARDNUMBER,
                        @CREDITTYPECODEID,
                        @EXPIRESON,
                        @CONSTITUENTACCOUNTID,
                        @RGSPLITS,
                        @RGTERMCODE,
                        null,
                        @DATE,
                        @FINDERNUMBER,
                        @SOURCECODE,
                        @APPEALID,
                        @GIVENANONYMOUSLY,
                        @EFFORTID,
                        @CHANNELCODEID,
                        @DONOTACKNOWLEDGE,
                        @AUTOPAY,
                        @REFERENCE,
            @REVENUECATEGORYID,
                        @CREDITCARDTOKEN,
                        0,   -- @STANDINGORDERSETUP

                        null,-- @STANDINGORDERSETUPDATE

                        @DDISOURCECODEID,
                        @DDISOURCEDATE,
                        1,
                        @TRANSACTIONCURRENCYID,
                        @RGBASEEXCHANGERATEID,
                        @EXCHANGERATE,
                        @CURRENTAPPUSERID,
                        0,
                        1,
                        null,
                        null,
                        null,
                        1,
                        @BATCHNUMBER,
                        @BASECURRENCYID,
                        @SEPAMANDATEID;

                    -- add benefits to recurring gift - bug 207057

                    declare @TOTALBENEFITS xml;
                    set @TOTALBENEFITS = dbo.UFN_REVENUEDETAIL_JOINBENEFITS(@BENEFITS, @PERCENTAGEBENEFITS);

                    --Update the organization total value, transaction total value, and exchange rates in the @TOTALBENEFITS XML.

                    set @TOTALBENEFITS = dbo.UFN_REVENUEBENEFIT_CONVERTAMOUNTSINXML_2(@TOTALBENEFITS,@TRANSACTIONCURRENCYID,@BASECURRENCYID);
                    exec dbo.USP_REVENUE_GETBENEFITS_3_ADDFROMXML @RECURRINGGIFTID, @TOTALBENEFITS, @CHANGEAGENTID, @CURRENTDATE;

                    update dbo.FINANCIALTRANSACTIONLINEITEM
                    set SOURCELINEITEMID = @RGMEMBERSHIPPARENTSPLITID
                    from dbo.FINANCIALTRANSACTIONLINEITEM
                    inner join @RGSPLITTABLE RGSPLITTABLE on RGSPLITTABLE.ID = FINANCIALTRANSACTIONLINEITEM.ID 
                    where FINANCIALTRANSACTIONLINEITEM.ID = RGSPLITTABLE.ID

                    set @RECURRINGGIFTCREATED = 1
                end
                else
                begin
                    --Decide if we need to create a pledge for this membership

                    if (@PROGRAMTYPE = @LIFETIMEPROGRAMTYPECODE and @RENEWALREVENUETYPE <> 0) or (@PROGRAMTYPE = @ANNUALPROGRAMTYPECODE and (@RENEWALREVENUETYPE <> 0 or (@CANBEPAIDINFULL = 0 and @CANBEPLEDGED = 1 and @RENEWALREVENUETYPE = 0)))
                    begin
                    declare @PLEDGECONTRIBUTEDAMOUNT money = 0
                    declare @PLEDGETOTALADDONAMOUNT money = 0
                    declare @PLEDGETAXDEDUCTIBLEAMOUNT money
                    declare @PLEDGESPLITTABLE table(ID uniqueidentifier, APPLICATIONCODE tinyint, TYPECODE tinyint, DESIGNATIONID uniqueidentifier, AMOUNT money, DECLINESGIFTAID bit, TRANSACTIONCURRENCYID uniqueidentifier, ADDONID uniqueidentifier)

                    insert into @PLEDGESPLITTABLE(ID, APPLICATIONCODE, TYPECODE, DESIGNATIONID, AMOUNT, DECLINESGIFTAID, TRANSACTIONCURRENCYID, ADDONID)
                    select
                        newid(),
                        18,
                        18,
                        null,
                        A.PRICE * A.NUMBEROFADDONS,
                        @MEMBERSHIPDECLINESGIFTAID,
                        @TRANSACTIONCURRENCYID,
                        A.ADDONID
                    from @ADDONS A
                    where A.APPLY = 1

                    --Link the revenue split to the addon so that we can display it properly

                    update ADDONS
                    set REVENUESPLITID = (select ID from @PLEDGESPLITTABLE PST where PST.ADDONID = ADDONS.ADDONID)
                    from @ADDONS ADDONS

                    select @PLEDGETOTALADDONAMOUNT = isnull(sum(AMOUNT),0) from @PLEDGESPLITTABLE where TYPECODE = 18

                    if @PROGRAMTYPE = @LIFETIMEPROGRAMTYPECODE and @TAXDEDUCTIBLETYPE <> 1
                    begin
                        -- For Lifetime programs, the value in the RECEIPTAMOUNT column may not apply to the selected term

                        -- We will trust the value coming from the UIModel in this case

                        set @PLEDGETAXDEDUCTIBLEAMOUNT = @MEMBERSHIPPLEDGEAMOUNT
                    end
                    else if @TAXDEDUCTIBLETYPE = 0
                    begin
                        --Program is set to 100% tax deductible

                        set @PLEDGETAXDEDUCTIBLEAMOUNT = @MEMBERSHIPPLEDGEAMOUNT - @PLEDGETOTALADDONAMOUNT
                    end
                    else
                    begin
                        set @PLEDGETAXDEDUCTIBLEAMOUNT = (select RECEIPTAMOUNT from dbo.MEMBERSHIPLEVEL where ID = @MEMBERSHIPLEVELID)
                    end

                    --Don't let the tax deductible amount be greater than the membership amount minus addons

                    if @PLEDGETAXDEDUCTIBLEAMOUNT > (@MEMBERSHIPPLEDGEAMOUNT - @PLEDGETOTALADDONAMOUNT)
                        set @PLEDGETAXDEDUCTIBLEAMOUNT = (@MEMBERSHIPPLEDGEAMOUNT - @PLEDGETOTALADDONAMOUNT)

                    if @CONTRIBUTED = 0
                    begin
                        insert into @PLEDGESPLITTABLE
                        (
                            ID,
                            APPLICATIONCODE,
                            TYPECODE,
                            DESIGNATIONID,
                            AMOUNT,
                            DECLINESGIFTAID,
                            TRANSACTIONCURRENCYID,
                            ADDONID
                        )
                        select
                            newid(),
                            0,
                            0,
                            CONTRIBUTEDAMOUNTS.DESIGNATIONID,
                            CONTRIBUTEDAMOUNTS.AMOUNT,
                            @MEMBERSHIPDECLINESGIFTAID,
                            @TRANSACTIONCURRENCYID,
                            null
                        from dbo.UFN_MEMBERSHIP_GETCONTRIBUTEDAMOUNTSBYLEVELID(@MEMBERSHIPLEVELID, @PLEDGETAXDEDUCTIBLEAMOUNT, @TRANSACTIONCURRENCYDECIMALDIGITS) CONTRIBUTEDAMOUNTS
                    end

                    --Resetting pledge contributed amount for earned calculation below to account for level rules determined by UFN_MEMBERSHIP_GETCONTRIBUTEDAMOUNTSBYLEVELID above

                    select @PLEDGECONTRIBUTEDAMOUNT = sum(AMOUNT) from @PLEDGESPLITTABLE where TYPECODE = 0

                    declare @PLEDGEMEMBERSHIPPARENTSPLITID uniqueidentifier = newid()

                        declare @PLEDGESPLITS xml = (
                            select
                                PLEDGESPLITS.ID,
                                PLEDGESPLITS.APPLICATIONCODE,
                                PLEDGESPLITS.TYPECODE,
                                PLEDGESPLITS.DESIGNATIONID,
                                PLEDGESPLITS.AMOUNT,
                                PLEDGESPLITS.DECLINESGIFTAID,
                                PLEDGESPLITS.TRANSACTIONCURRENCYID
                            from
                                (
                                    select @PLEDGEMEMBERSHIPPARENTSPLITID as ID,
                                    5 as APPLICATIONCODE,
                                    2 as TYPECODE,
                                    case when @CONTRIBUTED = 1 then @CONTRIBUTORYDESIGNATIONID else null end as DESIGNATIONID,
                                    @MEMBERSHIPPLEDGEAMOUNT - coalesce(@PLEDGECONTRIBUTEDAMOUNT, 0) - coalesce(@PLEDGETOTALADDONAMOUNT, 0) as AMOUNT,
                                    @MEMBERSHIPDECLINESGIFTAID as DECLINESGIFTAID,
                                    @TRANSACTIONCURRENCYID as TRANSACTIONCURRENCYID

                                    union all

                                    select
                                        ID as ID,
                                        APPLICATIONCODE,
                                        TYPECODE,
                                        DESIGNATIONID,
                                        AMOUNT,
                                        DECLINESGIFTAID,
                                        TRANSACTIONCURRENCYID
                                    from @PLEDGESPLITTABLE
                                ) as PLEDGESPLITS
                                    for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64
                        );

                    declare @PLEDGESPLITSDECLININGGIFTAID xml;

                    --GL will not be generated for the installment plan in USP_PLEDGE_ADD

                    --We need to hold off on creating GL until after the membership transaction is associated with the pledge (installment plan) financial transaction. The membership transaction (and GL) creation happens later in this sproc.

                    exec dbo.USP_PLEDGE_ADD
                        @PLEDGEID output,
                        @CHANGEAGENTID,
                        @BILLTOCONSTITUENTID,
                        @DATE,
                        @MEMBERSHIPPLEDGEAMOUNT,
                        @INSTALLMENTPLEDGEPOSTSTATUSCODE,
                        @DATE,
                        @SENDPLEDGEREMINDER,
                        @PLEDGESPLITS,
                        @PLEDGEFREQUENCYCODE,
                        @PLEDGENUMBEROFINSTALLMENTS,
                        @PLEDGESTARTDATE,
                        @INSTALLMENTS,
                        @AUTOPAY,
                        @PAYMENTMETHODCODE,
                        @CARDHOLDERNAME,
                        @CREDITCARDNUMBER,
                        @CREDITTYPECODEID,
                        @EXPIRESON,
                        @REFERENCEDATE,
                        @REFERENCENUMBER,
                        @CONSTITUENTACCOUNTID,
                        @FINDERNUMBER,
                        @SOURCECODE,
                        @APPEALID,
                        @BENEFITS, --Regular and percentage??

                        0,
                        @GIVENANONYMOUSLY,
                        @EFFORTID,
                        @CHANNELCODEID,
                        @DONOTACKNOWLEDGE,
                        null,
                        @BATCHNUMBER, -- batch number

                        null,
                        @REFERENCE,
            @REVENUECATEGORYID,
                        @CREDITCARDTOKEN,
                        null, --@STANDINGORDERSETUP,

                        null, --@STANDINGORDERSETUPDATE,

                        @DDISOURCECODEID,
                        @DDISOURCEDATE,
                        @PLEDGESPLITSDECLININGGIFTAID output,
                        @PERCENTAGEBENEFITS,
                        @TRANSACTIONCURRENCYID,
                        @BASECURRENCYID,
                        @BASEEXCHANGERATEID,
                        @PDACCOUNTSYSTEMID,
                        0, -- business units applied

                        0, --@GENERATEREFERENCENUMBER,

                        null, --@STANDINGORDERREFERENCENUMBER,

                        null, --@EVENTID

                        null, --@LOCALCORPID

                        1, --@ISMEMBERSHIPPLEDGE

                        @SEPAMANDATEID;

                    exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @PLEDGEID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 1, @PLEDGESPLITSDECLININGGIFTAID;

                                    if @BBNCTRANID > 0
                                    insert into dbo.REVENUEBBNC(ID, NETCOMMUNITYTRANSACTIONID, NETCOMMUNITYPAGENAME, NETCOMMUNITYPAGEID, NETCOMMUNITYAPPEALID, EMAILID, EMAILSUBJECT, EMAILNAME, ISTEAMFUNDRAISINGOFFLINEGIFT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                                        values(@PLEDGEID, @BBNCTRANID, @ORIGINPAGE, @ORIGINPAGEID, null, 0, '', '', 0, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);                                

                    set @PLEDGECREATED = 1
                end
                end
                --Create a payment if necessary


                if @RENEWALREVENUETYPE <> 2 or (@RENEWALREVENUETYPE = 2 and @PROGRAMTYPE = @RECURRINGPROGRAMTYPECODE and @TOTALAMOUNT > 0)
                begin

                    --Temp benefit collections to send to ADDBASE. If we've created a pledge or recurring gift we don't want to create the benefits on the payment.

                    declare @TEMP_BENEFITS xml = @BENEFITS;
                    declare @TEMP_PERCENTAGEBENEFITS xml = @PERCENTAGEBENEFITS;
                    if @RECURRINGGIFTCREATED = 1 or @PLEDGECREATED = 1
                    begin
                        set @TEMP_BENEFITS = null;
                        set @TEMP_PERCENTAGEBENEFITS = null;
                    end

                    exec dbo.USP_PAYMENT_ADDBASE 
                    @ID output,
                    @CHANGEAGENTID,
                    @CURRENTDATE,
                    @BILLTOCONSTITUENTID,
                    @DATE,
                    @TOTALAMOUNT,
                    @PAYMENTMETHODCODE,
                    @CHECKDATE,
                    @CHECKNUMBER,
                    @REFERENCEDATE,
                    @REFERENCENUMBER,
                    @CARDHOLDERNAME,
                    @CREDITCARDNUMBER,
                    @CREDITTYPECODEID,
                    @AUTHORIZATIONCODE,
                    @EXPIRESON,
                    '',                       --@ISSUER

                    0,                        --@NUMBEROFUNITS

                    '',                       --@SYMBOL

                    0,                        --@MEDIANPRICE

                    null,                     --@GIFTINKINDSUBTYPECODEID

                    null,                     --@PROPERTYSUBTYPECODEID 

                    @TAXDEDUCTIBLEAMOUNT,
                    @CONSTITUENTACCOUNTID,
                    @POSTSTATUSCODE,
                    @POSTDATE,
                    @FINDERNUMBER,
                    @SOURCECODE,
                    @APPEALID
                    @TEMP_BENEFITS,
                    0,                        --@BENEFITSWAIVED

                    @GIVENANONYMOUSLY
                    @EFFORTID,
                    @CHANNELCODEID,
                    @DONOTACKNOWLEDGE,
                    @DONOTRECEIPT,
                    @BATCHNUMBER,
                    @OTHERPAYMENTMETHODCODEID
                    @REFERENCE
                    @TRIBUTEID,
                    @LETTERCODEID
                    @DIRECTDEBITRESULTCODE,
                    0,                        --@LOWPRICE

                    0,                        --@HIGHPRICE

                    '',                       --@GIFTINKINDITEMNAME

                    0,                        --@GIFTINKINDDISPOSITIONCODE

                    0,                        --@GIFTINKINDNUMBEROFUNITS

                    0,                        --@GIFTINKINDFAIRMARKETVALUE

                    @TEMP_PERCENTAGEBENEFITS
                    @TRANSACTIONCURRENCYID,
                    @BASECURRENCYID
                    @BASEEXCHANGERATEID
                    @EXCHANGERATE
                    @CURRENTAPPUSERID,
                    @SEPAMANDATEID;

                    --If a SEPA mandate is used, mark the mandate record to show that a payment has been made towards it.

                    if @SEPAMANDATEID is not null
                    begin
                        if @BATCHROWID is not null
                        begin
                            exec dbo.USP_SEPAMANDATE_PAYMENTMADE @SEPAMANDATEID,@BATCHROWID,@ID, @CHANGEAGENTID;
                        end
                    end

                    set @PAYMENTMETHODID  = (select ID from dbo.REVENUEPAYMENTMETHOD where REVENUEID = @ID)
                    if @CREDITCARDTRANSACTIONID is not null and @PAYMENTMETHODCODE = 2 -- Credit card

                    begin
                        update dbo.CREDITCARDPAYMENTMETHODDETAIL set
                            TRANSACTIONID = @CREDITCARDTRANSACTIONID
                            ,VENDORID = isnull(@VENDORID, '')
                            , DATECHANGED = @CURRENTDATE
                            , CHANGEDBYID = @CHANGEAGENTID
                        where ID = @PAYMENTMETHODID
                    end

                    exec dbo.USP_PDACCOUNTSYSTEM_LINKTOREVENUE
                            @ID = @ID,
                            @PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID,
                            @CHANGEDATE = @CURRENTDATE,
                            @CHANGEAGENTID = @CHANGEAGENTID

                    --If this is for the first installment or the membership is being paid in full, but can only be pledged, then this is going to be a

                    --payment on a pledge. Otherwise it is a normal payment

                    if (@INSTALLMENTPAYMENTOPTION = 1) or (@CANBEPAIDINFULL = 0 and @CANBEPLEDGED = 1 and @RENEWALREVENUETYPE = 0)
                        begin
                        exec dbo.USP_PLEDGE_ADDPAYMENT @ID,
                                                @PLEDGEID,
                                                @MEMBERSHIPTRANSACTIONAMOUNT,
                                                @BILLTOCONSTITUENTID,
                                                @DATE,
                                                null,
                                                19,
                                                @AMOUNTPAID,
                                                @CURRENTDATE,
                                                @CHANGEAGENTID,
                                                @CREATEDSPLITS output,
                                                1,
                                                0,
                                                null,
                                                null

                        set @RGORPLEDGEMEMBERSHIPSPLITID = (select
                                    T.c.value('(ID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                                from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
                                where T.c.value('(TYPECODE)[1]','tinyint') = 2)

                        declare @PLEDGEPAYMENTSPLITSDECLININGGIFTAID xml
                        set @PLEDGEPAYMENTSPLITSDECLININGGIFTAID =
                            (
                                select
                                    T.c.value('(ID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                                from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
                                    inner join dbo.REVENUESPLITGIFTAID on T.c.value('(SOURCEREVENUESPLITID)[1]','uniqueidentifier') = REVENUESPLITGIFTAID.ID
                                where REVENUESPLITGIFTAID.DECLINESGIFTAID = 1
                                for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64
                            )

                    -- create revenue category for any payments

                    if @REVENUECATEGORYID is not null
                    begin
                        exec dbo.USP_REVENUECATEGORY_UPDATESPLITS @ID, @REVENUECATEGORYID, @CHANGEAGENTID, @CURRENTDATE;
                    end

                        --Additional donation added

                        if @ADDDONATION = 1
                        begin
                            exec dbo.USP_GIFT_ADDPAYMENT
                                        @REVENUEID = @ID,
                                        @AMOUNT = @DONATIONAMOUNT,
                                        @DESIGNATIONID = @DONATIONDESIGNATIONID,
                                        @OPPORTUNITYID = @DONATIONOPPORTUNITYID,
                                        @CAMPAIGNS = @CAMPAIGNS,
                                        @SOLICITORS = @SOLICITORS,
                                        @RECOGNITIONCREDITS = @RECOGNITIONS,
                                        @CATEGORYCODEID = @DONATIONCATEGORYCODEID,
                                        @CREATIONDATE =  @CURRENTDATE,
                                        @CHANGEAGENTID = @CHANGEAGENTID,
                                        @ID = @PAYMENTGIFTID output,
                                        @REVENUETYPECODE = 0

                            if @DECLINESGIFTAID = 1
                                insert into @SPLITSGIFTAIDINFOTBL (REVENUESPLITID, DECLINESGIFTAID) values (@PAYMENTGIFTID, 1)

                            set @PLEDGEPAYMENTSPLITSDECLININGGIFTAID =
                                (
                                    select
                                        DECLINEDSPLITS.REVENUESPLITID
                                    from
                                    (
                                        select
                                            REVENUESPLITID
                                        from @SPLITSGIFTAIDINFOTBL
                                        where
                                            DECLINESGIFTAID = 1

                                        union all

                                        select
                                            T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                                        from @PLEDGEPAYMENTSPLITSDECLININGGIFTAID.nodes('/SPLITSDECLININGGIFTAID/ITEM') T(c)) DECLINEDSPLITS
                                        for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64
                                    )

                            select @SPLITS = (select sum(REVENUESPLIT.TRANSACTIONAMOUNT) AMOUNT, REVENUESPLIT_EXT.DESIGNATIONID, 0 as TYPECODE
                                                from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
                                                inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID
                                                where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.TYPECODE = 0 and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 0
                                                group by REVENUESPLIT_EXT.DESIGNATIONID
                                                for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64);  

                            -- create matching gift records

                            if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDMG() > 0
                                exec USP_MATCHINGGIFTPLEDGE_AUTOADD @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;

                            if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDSPOUSEMG() > 0
                                exec USP_MATCHINGGIFTPLEDGE_AUTOADDFROMSPOUSE @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;
                    end
                    exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 1, @PLEDGEPAYMENTSPLITSDECLININGGIFTAID;

                    declare @PLEDGEPAYMENTRECEIPTTYPECODE tinyint;
                    set @PLEDGEPAYMENTRECEIPTTYPECODE = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@BILLTOCONSTITUENTID,2);

                    update dbo.REVENUE_EXT
                    set RECEIPTTYPECODE = @PLEDGEPAYMENTRECEIPTTYPECODE
                    where ID = @ID;

                    if @TOTALAMOUNT < (select sum(TRANSACTIONAMOUNT) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1)
                        raiserror('BBERR_AMOUNTLESSTHANAPPLIEDAMOUNT', 13, 1);

                    if @TOTALAMOUNT <> (select sum(TRANSACTIONAMOUNT) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1)
                        raiserror('BBERR_ALLMONEYNOTAPPLIED', 13, 1);

                    if (select count(*) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1) = 0
                        raiserror('BBERR_NOAPPLICATIONS', 13, 1);

                    -- Add gift fees

                    exec dbo.USP_PAYMENT_ADDGIFTFEES @ID, @BILLTOCONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

                    if @BBNCTRANID > 0
                        insert into dbo.REVENUEBBNC(ID, NETCOMMUNITYTRANSACTIONID, NETCOMMUNITYPAGENAME, NETCOMMUNITYPAGEID, NETCOMMUNITYAPPEALID, EMAILID, EMAILSUBJECT, EMAILNAME, ISTEAMFUNDRAISINGOFFLINEGIFT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                        values(@ID, @BBNCTRANID, @ORIGINPAGE, @ORIGINPAGEID, null, 0, '', '', 0, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);  

                    set @PAYMENTCREATED = 1
                end
                    else if @RECURRINGGIFTCREATED = 1
                    begin
                        --Create a payment to the recurring gift

                        if @RENEWALREVENUETYPE <> 2
                        begin
                            exec dbo.USP_RECURRINGGIFT_ADDPAYMENT 
                                @REVENUEID = @ID,
                                @APPLICATIONID = @RECURRINGGIFTID,
                                @APPLIEDAMOUNT = @MEMBERSHIPTRANSACTIONAMOUNT,
                                @CONSTITUENTID = @BILLTOCONSTITUENTID,
                                @DATE = @DATE,
                                @CREATIONDATE = @CURRENTDATE,
                                @CHANGEAGENTID = @CHANGEAGENTID,
                                @CREATEDSPLITS = @CREATEDSPLITS output,
                                @BASEAPPLIEDAMOUNT = null,
                                @ORGANIZATIONAPPLIEDAMOUNT = null;
                        end

                                set @RGORPLEDGEMEMBERSHIPSPLITID = (select
                                    T.c.value('(ID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                                from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T(c)
                                where T.c.value('(TYPECODE)[1]','tinyint') = 2)

                        --Link the revenue split to the addon so that we can display it properly

                        update ADDONS 
                        set REVENUESPLITID = newid() 
                        from @ADDONS ADDONS
                        where ADDONS.APPLY = 1

                        declare @RGPAYMENTSPLITSDECLININGGIFTAID xml
                        set @RGPAYMENTSPLITSDECLININGGIFTAID = (select DECLINEDSPLITS.REVENUESPLITID from (


                                select ADDONS.REVENUESPLITID
                                from @ADDONS ADDONS
                                where @MEMBERSHIPDECLINESGIFTAID = 1

                                union all

                                select
                                    T.c.value('(ID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                                from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T(c) 
                                    inner join dbo.REVENUESPLITGIFTAID on T.c.value('(SOURCEREVENUESPLITID)[1]','uniqueidentifier') = REVENUESPLITGIFTAID.ID
                                where
                                    REVENUESPLITGIFTAID.DECLINESGIFTAID = 1) DECLINEDSPLITS
                                for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64
                            )

                        declare @RGADDONBASEAMOUNT money = 0;
                        declare @RGADDONORGANIZATIONAMOUNT money = 0;
                        declare @RGADDONTRANSACTIONAMOUNT money = 0;

                        select @RGADDONTRANSACTIONAMOUNT = coalesce(sum(ADDONS.PRICE * ADDONS.NUMBEROFADDONS),0)
                        from @ADDONS ADDONS
                        where ADDONS.APPLY = 1

                        exec dbo.USP_CURRENCY_GETCURRENCYVALUES @RGADDONTRANSACTIONAMOUNT, @DATE, @BASECURRENCYID, @BASEEXCHANGERATEID, @TRANSACTIONCURRENCYID, @RGADDONBASEAMOUNT output, null, @RGADDONORGANIZATIONAMOUNT output, null, 1, null;

                        declare @RGADDONSPLITXML xml 
                        set @RGADDONSPLITXML = (select ADDONS.REVENUESPLITID as ID, (ADDONS.PRICE * ADDONS.NUMBEROFADDONS) as AMOUNT from @ADDONS ADDONS where ADDONS.APPLY = 1 for xml raw('ITEM'),type,elements,root('ADDONSPLITS'),BINARY BASE64)

                        insert into dbo.REVENUESPLIT
                        (
                            ID,
                            REVENUEID,
                            DESIGNATIONID,
                            AMOUNT,
                            APPLICATIONCODE,
                            TYPECODE,
                            TRANSACTIONAMOUNT,
                            ORGANIZATIONAMOUNT,
                            TRANSACTIONCURRENCYID,
                            BASECURRENCYID,
                            BASEEXCHANGERATEID,
                            ORGANIZATIONEXCHANGERATEID,
                            ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                        )
                        select
                            A.REVENUESPLITID,
                            @ID,
                            null,
                            CONVERTED.BASEAMOUNT,
                            18
                            18
                            A.PRICE * A.NUMBEROFADDONS,
                            CONVERTED.ORGANIZATIONAMOUNT,
                            @TRANSACTIONCURRENCYID,
                            @BASECURRENCYID,
                            @BASEEXCHANGERATEID,
                            @ORGANIZATIONEXCHANGERATEID,
                            @CHANGEAGENTID, @CHANGEAGENTID,  @CURRENTDATE,  @CURRENTDATE
                        from @ADDONS A
                            inner join dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTIONINXML(@RGADDONSPLITXML, @TRANSACTIONCURRENCYID, @BASECURRENCYID, @ORGANIZATIONCURRENCYID, @RGADDONTRANSACTIONAMOUNT, @RGADDONBASEAMOUNT, @BASECURRENCYDECIMALDIGITS, @RGADDONORGANIZATIONAMOUNT, @ORGANIZATIONCURRENCYDECIMALDIGITS) CONVERTED
                                on CONVERTED.ITEM.value('(ITEM/ID)[1]', 'uniqueidentifier') = A.REVENUESPLITID
                        where
                            A.APPLY = 1 and
                            A.NUMBEROFADDONS > 0

                        -- create revenue category for any payments

                        if @REVENUECATEGORYID is not null
                        begin
                            exec dbo.USP_REVENUECATEGORY_UPDATESPLITS @ID, @REVENUECATEGORYID, @CHANGEAGENTID, @CURRENTDATE;
                        end

                        --Additional donation added

                        if @ADDDONATION = 1
                        begin
                            exec dbo.USP_GIFT_ADDPAYMENT
                                @REVENUEID = @ID,
                                @AMOUNT = @DONATIONAMOUNT,
                                @DESIGNATIONID = @DONATIONDESIGNATIONID,
                                @OPPORTUNITYID = @DONATIONOPPORTUNITYID,
                                @CAMPAIGNS = @CAMPAIGNS,
                                @SOLICITORS = @SOLICITORS,
                                @RECOGNITIONCREDITS = @RECOGNITIONS,
                                @CATEGORYCODEID = @DONATIONCATEGORYCODEID,
                                @CREATIONDATE =  @CURRENTDATE,
                                @CHANGEAGENTID = @CHANGEAGENTID,
                                @ID = @PAYMENTGIFTID output,
                                @REVENUETYPECODE = 0

                            if @DECLINESGIFTAID = 1
                                insert into @SPLITSGIFTAIDINFOTBL (REVENUESPLITID, DECLINESGIFTAID) values (@PAYMENTGIFTID, 1)

                            set @RGPAYMENTSPLITSDECLININGGIFTAID =
                                (
                                    select
                                        DECLINEDSPLITS.REVENUESPLITID
                                    from
                                        (
                                            select
                                                REVENUESPLITID
                                            from
                                                @SPLITSGIFTAIDINFOTBL
                                            where
                                                DECLINESGIFTAID = 1

                                            union all

                                            select
                                                T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
                                            from @RGPAYMENTSPLITSDECLININGGIFTAID.nodes('/SPLITSDECLININGGIFTAID/ITEM') T(c)) DECLINEDSPLITS
                                            for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64
                                        )

                            select @SPLITS = (select sum(REVENUESPLIT.TRANSACTIONAMOUNT) AMOUNT, REVENUESPLIT_EXT.DESIGNATIONID, 0 as TYPECODE
                                                from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
                                                inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID
                                                where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.TYPECODE = 0 and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 0
                                                group by REVENUESPLIT_EXT.DESIGNATIONID
                                                for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64);  

                            -- create matching gift records

                            if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDMG() > 0
                                exec USP_MATCHINGGIFTPLEDGE_AUTOADD @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;

                            if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDSPOUSEMG() > 0
                                exec USP_MATCHINGGIFTPLEDGE_AUTOADDFROMSPOUSE @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;  
                        end

                        exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 1, @RGPAYMENTSPLITSDECLININGGIFTAID;

                        declare @RGPAYMENTRECEIPTTYPECODE tinyint = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@BILLTOCONSTITUENTID,3);

                        update dbo.REVENUE_EXT
                        set RECEIPTTYPECODE = @RGPAYMENTRECEIPTTYPECODE
                        where ID = @ID;

                        declare @TRANSACTIONTOTAL money = 0;
                        select @TRANSACTIONTOTAL = coalesce(sum(TRANSACTIONAMOUNT),0) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1;

                        if @TOTALAMOUNT < @TRANSACTIONTOTAL
                            raiserror('BBERR_AMOUNTLESSTHANAPPLIEDAMOUNT', 13, 1);

                        if @TOTALAMOUNT <> @TRANSACTIONTOTAL
                            raiserror('BBERR_ALLMONEYNOTAPPLIED', 13, 1);

                        if (select count(*) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1) = 0
                            raiserror('BBERR_NOAPPLICATIONS', 13, 1);

                        -- Add gift fees

                        exec dbo.USP_PAYMENT_ADDGIFTFEES @ID, @BILLTOCONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

                        if @BBNCTRANID > 0
                            insert into dbo.REVENUEBBNC(ID, NETCOMMUNITYTRANSACTIONID, NETCOMMUNITYPAGENAME, NETCOMMUNITYPAGEID, NETCOMMUNITYAPPEALID, EMAILID, EMAILSUBJECT, EMAILNAME, ISTEAMFUNDRAISINGOFFLINEGIFT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                            values(@ID, @BBNCTRANID, @ORIGINPAGE, @ORIGINPAGEID, null, 0, '', '', 0, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

                    set @PAYMENTCREATED = 1
                end
                else
                begin
                    set @MEMBERSHIPSPLITID = newid()

                        declare @OBTAINLEVELCODE tinyint
                        select
                            @OBTAINLEVELCODE = OBTAINLEVELCODE
                        from
                            dbo.MEMBERSHIPLEVEL
                        where
                            ID = @MEMBERSHIPLEVELID

                        if @OBTAINLEVELCODE = 0
                        begin
                            declare @MEMBERSHIPREVENUESPLITTABLE table(ID uniqueidentifier, APPLICATIONCODE tinyint, TYPECODE tinyint, DESIGNATIONID uniqueidentifier, AMOUNT money, DECLINESGIFTAID bit, TRANSACTIONCURRENCYID uniqueidentifier, ADDONID uniqueidentifier)

                            insert into @MEMBERSHIPREVENUESPLITTABLE(ID, APPLICATIONCODE, TYPECODE, DESIGNATIONID, AMOUNT, DECLINESGIFTAID, TRANSACTIONCURRENCYID)
                            select newid(), 0, 0, CONTRIBUTEDAMOUNTS.DESIGNATIONID, CONTRIBUTEDAMOUNTS.AMOUNT, @MEMBERSHIPDECLINESGIFTAID, @TRANSACTIONCURRENCYID
                            from dbo.UFN_MEMBERSHIP_GETCONTRIBUTEDAMOUNTSBYLEVELID(@MEMBERSHIPLEVELID, (@TAXDEDUCTIBLEAMOUNT - @DONATIONAMOUNT), @TRANSACTIONCURRENCYDECIMALDIGITS) as CONTRIBUTEDAMOUNTS

                            declare @MEMBERSHIPSPLITAMOUNT money =
                                (
                                    select @MEMBERSHIPTRANSACTIONAMOUNT - coalesce(sum(AMOUNT), 0)
                                    from @MEMBERSHIPREVENUESPLITTABLE where TYPECODE = 0
                                )

                            insert into @MEMBERSHIPREVENUESPLITTABLE(ID, APPLICATIONCODE, TYPECODE, DESIGNATIONID, AMOUNT, DECLINESGIFTAID, TRANSACTIONCURRENCYID)
                            values(@MEMBERSHIPSPLITID, 5, 2, null, @MEMBERSHIPSPLITAMOUNT, @MEMBERSHIPDECLINESGIFTAID, @TRANSACTIONCURRENCYID)

                            insert into @MEMBERSHIPREVENUESPLITTABLE(ID, APPLICATIONCODE, TYPECODE, DESIGNATIONID, AMOUNT, DECLINESGIFTAID, TRANSACTIONCURRENCYID, ADDONID)
                            select
                                newid(),
                                18,
                                18,
                                null,
                                A.PRICE * A.NUMBEROFADDONS,
                                @MEMBERSHIPDECLINESGIFTAID,
                                @TRANSACTIONCURRENCYID
                                A.ADDONID
                            from @ADDONS A
                            where A.APPLY = 1

                            declare @ADDONBASEAMOUNT money;
                            declare @ADDONORGANIZATIONAMOUNT money;
                            declare @ADDONTRANSACTIONAMOUNT money;

                            select @ADDONTRANSACTIONAMOUNT = sum(AMOUNT)
                            from @MEMBERSHIPREVENUESPLITTABLE
                            where TYPECODE = 18


                            declare @REVENUESPLITXML xml;
                            set @REVENUESPLITXML =
                                (
                                    select
                                        ID,
                                        AMOUNT
                                    from
                                    (
                                        select
                                            @MEMBERSHIPSPLITID as ID,
                                            @MEMBERSHIPSPLITAMOUNT as AMOUNT

                                        union all
                                                    select ID, AMOUNT 
                                                    from @MEMBERSHIPREVENUESPLITTABLE 
                                                    where TYPECODE = 0) SPLITS
                                                    for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64)
                            declare @ADDONSPLITXML xml
                            set @ADDONSPLITXML = (select ID, AMOUNT from @MEMBERSHIPREVENUESPLITTABLE where TYPECODE = 18 for xml raw('ITEM'),type,elements,root('ADDONSPLITS'),BINARY BASE64)

                            --Link the revenue split to the addon so that we can display it properly

                            update ADDONS 
                            set REVENUESPLITID = (select ID from @MEMBERSHIPREVENUESPLITTABLE MRST where MRST.ADDONID = ADDONS.ADDONID) 
                            from @ADDONS ADDONS

                            insert into dbo.FINANCIALTRANSACTIONLINEITEM
                            (
                                ID,
                                FINANCIALTRANSACTIONID,
                                BASEAMOUNT,
                                TRANSACTIONAMOUNT,
                                ORGAMOUNT,
                                SOURCELINEITEMID,
                                POSTDATE,
                                POSTSTATUSCODE,
                                TYPECODE,
                                ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                            )
                            select
                                SPLITS.ID,
                                @ID,
                                CONVERTED.BASEAMOUNT,
                                SPLITS.AMOUNT,
                                CONVERTED.ORGANIZATIONAMOUNT,
                                case SPLITS.TYPECODE when 0 then @MEMBERSHIPSPLITID else null end,
                                @POSTDATE,
                                case @POSTSTATUSCODE when 2 then 3 else 1 end,
                                0,
                                 @CHANGEAGENTID, @CHANGEAGENTID,  @CURRENTDATE,  @CURRENTDATE
                            from @MEMBERSHIPREVENUESPLITTABLE SPLITS
                                inner join dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTIONINXML(@REVENUESPLITXML, @TRANSACTIONCURRENCYID, @BASECURRENCYID, @ORGANIZATIONCURRENCYID, @MEMBERSHIPTRANSACTIONAMOUNT, @BASEAMOUNT, @BASECURRENCYDECIMALDIGITS, @ORGANIZATIONAMOUNT, @ORGANIZATIONCURRENCYDECIMALDIGITS) CONVERTED
                                    on CONVERTED.ITEM.value('(ITEM/ID)[1]', 'uniqueidentifier') = SPLITS.ID
                            where SPLITS.APPLICATIONCODE = 5 or (SPLITS.TYPECODE <> 18 and SPLITS.AMOUNT > 0)

                            insert into dbo.REVENUESPLIT_EXT
                            (
                                ID,
                                APPLICATIONCODE,
                                TYPECODE,
                                DESIGNATIONID,
                                ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                            )
                            select
                                SPLITS.ID,
                                SPLITS.APPLICATIONCODE,
                                SPLITS.TYPECODE,
                                SPLITS.DESIGNATIONID,
                                @CHANGEAGENTID, @CHANGEAGENTID,  @CURRENTDATE,  @CURRENTDATE
                            from @MEMBERSHIPREVENUESPLITTABLE SPLITS
                            where SPLITS.APPLICATIONCODE = 5 or (SPLITS.TYPECODE <> 18 and SPLITS.AMOUNT > 0)

                            insert into dbo.REVENUESPLIT
                            (
                                ID,
                                REVENUEID,
                                AMOUNT,
                                APPLICATIONCODE,
                                TYPECODE,
                                TRANSACTIONAMOUNT,
                                ORGANIZATIONAMOUNT,
                                TRANSACTIONCURRENCYID,
                                BASECURRENCYID,
                                BASEEXCHANGERATEID,
                                ORGANIZATIONEXCHANGERATEID,
                                ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                            )
                            select
                                SPLITS.ID,
                                @ID,
                                CONVERTED.BASEAMOUNT,
                                SPLITS.APPLICATIONCODE,
                                SPLITS.TYPECODE,
                                SPLITS.AMOUNT,
                                CONVERTED.ORGANIZATIONAMOUNT,
                                @TRANSACTIONCURRENCYID,
                                @BASECURRENCYID,
                                @BASEEXCHANGERATEID,
                                @ORGANIZATIONEXCHANGERATEID,
                                @CHANGEAGENTID, @CHANGEAGENTID,  @CURRENTDATE,  @CURRENTDATE
                            from @MEMBERSHIPREVENUESPLITTABLE SPLITS
                            inner join dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTIONINXML(@ADDONSPLITXML, @TRANSACTIONCURRENCYID, @BASECURRENCYID, @ORGANIZATIONCURRENCYID, @ADDONTRANSACTIONAMOUNT, @ADDONBASEAMOUNT, @BASECURRENCYDECIMALDIGITS, @ADDONORGANIZATIONAMOUNT, @ORGANIZATIONCURRENCYDECIMALDIGITS) CONVERTED
                                on CONVERTED.ITEM.value('(ITEM/ID)[1]', 'uniqueidentifier') = SPLITS.ID


                            if exists(select 1 from @MEMBERSHIPREVENUESPLITTABLE where TYPECODE = 18)
                            begin
                                --Create recognitions for the addon splits

                                declare @MEMBERSHIPREVENUEADDONSPLITID uniqueidentifier
                                declare MEMBERSHIPREVENUEADDONCURSOR cursor local fast_forward for select ID from @MEMBERSHIPREVENUESPLITTABLE where TYPECODE = 18
                                open MEMBERSHIPREVENUEADDONCURSOR
                                fetch next from MEMBERSHIPREVENUEADDONCURSOR into @MEMBERSHIPREVENUEADDONSPLITID
                                while @@FETCH_STATUS = 0
                                begin
                                    exec dbo.USP_REVENUEDETAIL_CREATERECOGNITIONS @MEMBERSHIPREVENUEADDONSPLITID, @CHANGEAGENTID, @CURRENTDATE;

                                    fetch next from MEMBERSHIPREVENUEADDONCURSOR into @MEMBERSHIPREVENUEADDONSPLITID
                                end
                                close MEMBERSHIPREVENUEADDONCURSOR
                                deallocate MEMBERSHIPREVENUEADDONCURSOR
                            end
                        end
                        else
                        begin
                            insert into dbo.REVENUESPLIT
                                (
                                    ID,
                                    REVENUEID,
                                    DESIGNATIONID,
                                    AMOUNT,
                                    APPLICATIONCODE,
                                    TYPECODE,
                                    TRANSACTIONAMOUNT,
                                    ORGANIZATIONAMOUNT,
                                    TRANSACTIONCURRENCYID,
                                    BASECURRENCYID,
                                    BASEEXCHANGERATEID,
                                    ORGANIZATIONEXCHANGERATEID,
                                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                )
                                values
                                (
                                    @MEMBERSHIPSPLITID,
                                    @ID,
                                    @CONTRIBUTORYDESIGNATIONID,
                                    @BASEAMOUNT,
                                    0,
                                    0,
                                    @MEMBERSHIPTRANSACTIONAMOUNT,
                                    @ORGANIZATIONAMOUNT,
                                    @TRANSACTIONCURRENCYID,
                                    @BASECURRENCYID,
                                    @BASEEXCHANGERATEID,
                                    @ORGANIZATIONEXCHANGERATEID,
                                    @CHANGEAGENTID, @CHANGEAGENTID,  @CURRENTDATE,  @CURRENTDATE
                                );

                            insert into dbo.REVENUESPLITCAMPAIGN
                                (
                                    ID,
                                    REVENUESPLITID,
                                    CAMPAIGNID,
                                    CAMPAIGNSUBPRIORITYID,
                                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                                )
                                select newid(),
                                        @MEMBERSHIPSPLITID,
                                        CAMPAIGNS.CAMPAIGNID,
                                        CAMPAIGNS.CAMPAIGNSUBPRIORITYID,
                                        @CHANGEAGENTID, @CHANGEAGENTID,  @CURRENTDATE,  @CURRENTDATE
                                from dbo.UFN_DESIGNATION_GETCAMPAIGNSTODEFAULT(@CONTRIBUTORYDESIGNATIONID, @DATE) CAMPAIGNS
                        end

            --Update campaign based on the contribution portion of the membership

            exec dbo.USP_REVENUE_ADDCAMPAIGNS @ID, @CHANGEAGENTID, @CURRENTDATE;

                        -- create revenue category for any payments

                        if @REVENUECATEGORYID is not null
                        begin
                            exec dbo.USP_REVENUECATEGORY_UPDATESPLITS @ID, @REVENUECATEGORYID, @CHANGEAGENTID, @CURRENTDATE;
                        end

                        declare @GIFTID uniqueidentifier

                        --Additional donation added

                        if @ADDDONATION = 1
                        begin
                            exec dbo.USP_GIFT_ADDPAYMENT
                                        @REVENUEID = @ID,
                                        @AMOUNT = @DONATIONAMOUNT,
                                        @DESIGNATIONID = @DONATIONDESIGNATIONID,
                                        @OPPORTUNITYID = @DONATIONOPPORTUNITYID,
                                        @CAMPAIGNS = @CAMPAIGNS,
                                        @SOLICITORS = @SOLICITORS,
                                        @RECOGNITIONCREDITS = @RECOGNITIONS,
                                        @CATEGORYCODEID = @DONATIONCATEGORYCODEID,
                                        @CREATIONDATE =  @CURRENTDATE,
                                        @CHANGEAGENTID = @CHANGEAGENTID,
                                        @ID = @GIFTID output,
                                        @REVENUETYPECODE = 0

                            if @DECLINESGIFTAID = 1
                                insert into @SPLITSGIFTAIDINFOTBL (REVENUESPLITID, DECLINESGIFTAID) values (@GIFTID, 1)

                            select @SPLITS = (select sum(REVENUESPLIT.TRANSACTIONAMOUNT) AMOUNT, REVENUESPLIT_EXT.DESIGNATIONID, 0 as TYPECODE
                                                from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
                                                inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID
                                                where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.TYPECODE = 0 and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 0
                                                group by REVENUESPLIT_EXT.DESIGNATIONID
                                                for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64);  

                            -- create matching gift records

                            if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDMG() > 0
                                exec USP_MATCHINGGIFTPLEDGE_AUTOADD @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;

                            if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDSPOUSEMG() > 0
                                exec USP_MATCHINGGIFTPLEDGE_AUTOADDFROMSPOUSE @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;
                        end

                        insert into @SPLITSGIFTAIDINFOTBL (REVENUESPLITID, DECLINESGIFTAID)
                        select ID,DECLINESGIFTAID
                        from @MEMBERSHIPREVENUESPLITTABLE

                        set @SPLITSDECLININGGIFTAID =
                                (
                                    select
                                        REVENUESPLITID
                                    from @SPLITSGIFTAIDINFOTBL
                                    where DECLINESGIFTAID = 1
                                    for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64
                                )
                        exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 0, @SPLITSDECLININGGIFTAID, null, null; --revenue transaction type code for payment is 0

                        -- create recognitions for the membership part of the payment

                        exec dbo.USP_REVENUEDETAIL_CREATERECOGNITIONS @MEMBERSHIPSPLITID, @CHANGEAGENTID, @CURRENTDATE;

                        -- create recognitions for any contributed portion of the membership payment

                        declare @MEMBERSHIPRECOGNITIONSTABLE table(CONSTITUENTID uniqueidentifier, REVENUERECOGNITIONTYPECODEID uniqueidentifier, DESIGNATIONID uniqueidentifier, EFFECTIVEDATE date, AMOUNT money, APPLICATIONCURRENCYID uniqueidentifier)
                        insert into @MEMBERSHIPRECOGNITIONSTABLE(CONSTITUENTID, REVENUERECOGNITIONTYPECODEID, DESIGNATIONID, EFFECTIVEDATE, AMOUNT, APPLICATIONCURRENCYID)
                        select
                            T.c.value('(CONSTITUENTID)[1]', 'uniqueidentifier'),
                            T.c.value('(REVENUERECOGNITIONTYPECODEID)[1]', 'uniqueidentifier'),
                            T.c.value('(DESIGNATIONID)[1]', 'uniqueidentifier'),
                            T.c.value('(EFFECTIVEDATE)[1]', 'date'),
                            T.c.value('(AMOUNT)[1]', 'money'),
                            T.c.value('(APPLICATIONCURRENCYID)[1]', 'uniqueidentifier')
                        from @MEMBERSHIPRECOGNITION.nodes('/MEMBERSHIPRECOGNITION/ITEM') T(c)

                        insert into dbo.REVENUERECOGNITION
                        (
                            REVENUESPLITID,
                            CONSTITUENTID,
                            AMOUNT,
                            EFFECTIVEDATE,
                            REVENUERECOGNITIONTYPECODEID,
                            ADDEDBYID,
                            CHANGEDBYID,
                            DATEADDED,
                            DATECHANGED,
                            BASECURRENCYID,
                            ORGANIZATIONAMOUNT,
                            ORGANIZATIONEXCHANGERATEID
                        )
                        select
                            MEMBERSHIPSPLITS.ID,
                            MEMBERSHIPRECOGNITION.CONSTITUENTID,
                            MEMBERSHIPRECOGNITION.AMOUNT,
                            @DATE,
                            MEMBERSHIPRECOGNITION.REVENUERECOGNITIONTYPECODEID,
                            @CHANGEAGENTID,
                            @CHANGEAGENTID,
                            @CURRENTDATE,
                            @CURRENTDATE,
                            @BASECURRENCYID,
                            case
                                when @BASECURRENCYID <> @ORGANIZATIONCURRENCYID
                                then dbo.UFN_CURRENCY_CONVERT(MEMBERSHIPRECOGNITION.AMOUNT, @BASETOORGANIZATIONEXCHANGERATEID)
                                else MEMBERSHIPRECOGNITION.AMOUNT
                            end,
                            @BASETOORGANIZATIONEXCHANGERATEID ORGANIZATIONEXCHANGERATEID
                        from @MEMBERSHIPREVENUESPLITTABLE MEMBERSHIPSPLITS
                            inner join @MEMBERSHIPRECOGNITIONSTABLE MEMBERSHIPRECOGNITION on MEMBERSHIPSPLITS.DESIGNATIONID = MEMBERSHIPRECOGNITION.DESIGNATIONID
                        where MEMBERSHIPSPLITS.TYPECODE = 0 and MEMBERSHIPSPLITS.AMOUNT > 0

                        exec dbo.USP_REVENUE_DEFAULTMARKETINGINFORMATION @ID, @CHANGEAGENTID, @CURRENTDATE;

                        declare @TOTALAPPLIEDAMOUNT money;

                        select
                            @TOTALAPPLIEDAMOUNT = sum(TRANSACTIONAMOUNT)
                        from dbo.FINANCIALTRANSACTIONLINEITEM
                            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                        where
                            FINANCIALTRANSACTIONID = @ID
                            and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                            and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0;

                        if @TOTALAMOUNT < @TOTALAPPLIEDAMOUNT
                            raiserror('BBERR_AMOUNTLESSTHANAPPLIEDAMOUNT', 13, 1);

                        if @TOTALAMOUNT <> @TOTALAPPLIEDAMOUNT
                            raiserror('BBERR_ALLMONEYNOTAPPLIED', 13, 1);

                        if (select count(*) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1) = 0
                            raiserror('BBERR_NOAPPLICATIONS', 13, 1);

                        -- USP_PAYMENT_ADDGIFTFEES creates GL distributions so it needs to be called after USP_PDACCOUNTSYSTEM_LINKTOREVENUE

                        exec dbo.USP_PAYMENT_ADDGIFTFEES @ID, @BILLTOCONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

                        if @BBNCTRANID > 0
                            insert into dbo.REVENUEBBNC(ID, NETCOMMUNITYTRANSACTIONID, NETCOMMUNITYPAGENAME, NETCOMMUNITYPAGEID, NETCOMMUNITYAPPEALID, EMAILID, EMAILSUBJECT, EMAILNAME, ISTEAMFUNDRAISINGOFFLINEGIFT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                            values(@ID, @BBNCTRANID, @ORIGINPAGE, @ORIGINPAGEID, null, 0, '', '', 0, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

                    set @PAYMENTCREATED = 1
                end
            end
            else
            begin
                declare @PLEDGEADDITIONALDONATIONGIFTID uniqueidentifier
                --Additional donation added

                if @ADDDONATION = 1
                begin
                    exec dbo.USP_PAYMENT_ADDBASE @ID output, @CHANGEAGENTID, @CURRENTDATE, @BILLTOCONSTITUENTID,
                        @DATE, @DONATIONAMOUNT, @PAYMENTMETHODCODE, @CHECKDATE, @CHECKNUMBER,
                        @REFERENCEDATE, @REFERENCENUMBER, @CARDHOLDERNAME, @CREDITCARDNUMBER,
                        @CREDITTYPECODEID, @AUTHORIZATIONCODE, @EXPIRESON, '',
                        0, '', 0, null,null, @TAXDEDUCTIBLEAMOUNT, @CONSTITUENTACCOUNTID,
                        @POSTSTATUSCODE, @POSTDATE, @FINDERNUMBER,
                        @SOURCECODE, @APPEALID, null, 0, @GIVENANONYMOUSLY
                        @EFFORTID, @CHANNELCODEID, @DONOTACKNOWLEDGE,@DONOTRECEIPT,
                        @BATCHNUMBER, @OTHERPAYMENTMETHODCODEID, @REFERENCE, @TRIBUTEID, @LETTERCODEID
                        @DIRECTDEBITRESULTCODE, 0, 0, ''
                        0, 0
                        0, null, @TRANSACTIONCURRENCYID,
                        @BASECURRENCYID, @BASEEXCHANGERATEID, @EXCHANGERATE, @CURRENTAPPUSERID, @SEPAMANDATEID;

                        set @PAYMENTMETHODID = (select ID from dbo.REVENUEPAYMENTMETHOD where REVENUEID = @ID)

                        if @CREDITCARDTRANSACTIONID is not null and @PAYMENTMETHODCODE = 2 -- Credit card

                        begin
                            update dbo.CREDITCARDPAYMENTMETHODDETAIL
                            set
                                TRANSACTIONID = @CREDITCARDTRANSACTIONID,
                                VENDORID = isnull(@VENDORID, ''),
                                DATECHANGED = @CURRENTDATE,
                                CHANGEDBYID = @CHANGEAGENTID
                            where ID = @PAYMENTMETHODID
                        end

                        exec dbo.USP_PDACCOUNTSYSTEM_LINKTOREVENUE
                                    @ID = @ID,
                                    @PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID,
                                    @CHANGEDATE = @CURRENTDATE,
                                    @CHANGEAGENTID = @CHANGEAGENTID

                        exec dbo.USP_GIFT_ADDPAYMENT
                                    @REVENUEID = @ID,
                                    @AMOUNT = @DONATIONAMOUNT,
                                    @DESIGNATIONID = @DONATIONDESIGNATIONID,
                                    @OPPORTUNITYID = @DONATIONOPPORTUNITYID,
                                    @CAMPAIGNS = @CAMPAIGNS,
                                    @SOLICITORS = @SOLICITORS,
                                    @RECOGNITIONCREDITS = @RECOGNITIONS,
                                    @CATEGORYCODEID = @DONATIONCATEGORYCODEID,
                                    @CREATIONDATE =  @CURRENTDATE,
                                    @CHANGEAGENTID = @CHANGEAGENTID,
                                    @ID = @PLEDGEADDITIONALDONATIONGIFTID output,
                                    @REVENUETYPECODE = 0

                        if @DECLINESGIFTAID = 1
                        begin
                            declare @PLEDGEADDITIONALDONATIONSPLITSDECLININGGIFTAID xml
                            set @PLEDGEADDITIONALDONATIONSPLITSDECLININGGIFTAID =
                                (
                                    select
                                        @PLEDGEADDITIONALDONATIONGIFTID
                                    for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64
                                );

                            exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 1, @PLEDGEADDITIONALDONATIONSPLITSDECLININGGIFTAID;
                        end
                        else
                            exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 1, null;

                            declare @PLEDGEADDITIONALDONATIONRECEIPTTYPECODE tinyint;
                            set @PLEDGEADDITIONALDONATIONRECEIPTTYPECODE = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@BILLTOCONSTITUENTID,2);

                            update dbo.REVENUE_EXT
                            set RECEIPTTYPECODE = @PLEDGEADDITIONALDONATIONRECEIPTTYPECODE
                            where ID = @ID;

                            if @DONATIONAMOUNT < (select sum(TRANSACTIONAMOUNT) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1)
                                raiserror('BBERR_AMOUNTLESSTHANAPPLIEDAMOUNT', 13, 1);

                            if @DONATIONAMOUNT <> (select sum(TRANSACTIONAMOUNT) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1)
                                raiserror('BBERR_ALLMONEYNOTAPPLIED', 13, 1);

                            if (select count(*) from dbo.FINANCIALTRANSACTIONLINEITEM inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID where FINANCIALTRANSACTIONID = @ID and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1) = 0
                                raiserror('BBERR_NOAPPLICATIONS', 13, 1);

                            -- Add gift fees

                            exec dbo.USP_PAYMENT_ADDGIFTFEES @ID, @BILLTOCONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

                                            if @BBNCTRANID > 0
                                        insert into dbo.REVENUEBBNC(ID, NETCOMMUNITYTRANSACTIONID, NETCOMMUNITYPAGENAME, NETCOMMUNITYPAGEID, NETCOMMUNITYAPPEALID, EMAILID, EMAILSUBJECT, EMAILNAME, ISTEAMFUNDRAISINGOFFLINEGIFT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                                            values(@ID, @BBNCTRANID, @ORIGINPAGE, @ORIGINPAGEID, null, 0, '', '', 0, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

                        set @PAYMENTCREATED = 1

                        select @SPLITS = (select sum(REVENUESPLIT.TRANSACTIONAMOUNT) AMOUNT, REVENUESPLIT_EXT.DESIGNATIONID, 0 as TYPECODE
                                            from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
                                            inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID
                                            where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.TYPECODE = 0 and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 0
                                            group by REVENUESPLIT_EXT.DESIGNATIONID
                                            for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64);  

                        -- create matching gift records

                        if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDMG() > 0
                            exec USP_MATCHINGGIFTPLEDGE_AUTOADD @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;

                        if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDSPOUSEMG() > 0
                            exec USP_MATCHINGGIFTPLEDGE_AUTOADDFROMSPOUSE @BILLTOCONSTITUENTID, @CHANGEAGENTID, @ID, @CURRENTDATE, @DONATIONAMOUNT, @TAXDEDUCTIBLEAMOUNT, @SPLITS, @CURRENTAPPUSERID;
                end
            end
            end

            if @SOLICITCODES is not null
            begin
                declare @SOLICITCODESTABLE table
                (
                    [CONSTITUENTSOLICITCODEID] [uniqueidentifier] NOT NULL,
                    [CONSTITUENTID] [uniqueidentifier] NOT NULL,
                    [SOLICITCODEID] [uniqueidentifier] NOT NULL,
                    [SEQUENCE] [int] NOT NULL,
                    [STARTDATE] [datetime] NULL,
                    [ENDDATE] [datetime] NULL,
                    [COMMENTS] [nvarchar](100) NOT NULL,
                    [CONSENTPREFERENCECODE] [tinyint] NOT NULL,
                    [SOURCECODEID] [uniqueidentifier] NULL,
                    [SOURCEFILEPATH] [nvarchar](260) NOT NULL,
                    [PRIVACYPOLICYFILEPATH] [nvarchar](260) NOT NULL,
                    [SUPPORTINGINFORMATION] [nvarchar](max) NOT NULL,
                    [CONSENTSTATEMENT] [nvarchar](max) NOT NULL
                );

                insert into @SOLICITCODESTABLE
                (
                    CONSTITUENTSOLICITCODEID,
                    CONSTITUENTID,
                    SOLICITCODEID,
                    STARTDATE,
                    ENDDATE,
                    COMMENTS,
                    SEQUENCE,
                    CONSENTPREFERENCECODE,
                    SOURCECODEID,
                    SOURCEFILEPATH,
                    PRIVACYPOLICYFILEPATH,
                    SUPPORTINGINFORMATION,
                    CONSENTSTATEMENT
                )
                select
                    coalesce(CONSTITUENTSOLICITCODEID,newid()),
                    @BILLTOCONSTITUENTID,
                    SOLICITCODEID,
                    STARTDATE,
                    ENDDATE,
                    coalesce(COMMENTS, ''),
                    SEQUENCE,
                    CONSENTPREFERENCECODE,
                    SOURCECODEID,
                    coalesce(SOURCEFILEPATH, ''),
                    coalesce(PRIVACYPOLICYFILEPATH, ''),
                    coalesce(SUPPORTINGINFORMATION, ''),
                    coalesce(CONSENTSTATEMENT, '')
                from dbo.UFN_MEMBERSHIPDUESBATCH_GETSOLICITCODES_FROMITEMLISTXML(@SOLICITCODES);

                -- Validate solicit codes

                exec dbo.USP_MEMBERSHIPDUESBATCH_VALIDATE_SOLICITCODES @SOLICITCODES;

                -- Update existing solicit codes

                update dbo.CONSTITUENTSOLICITCODE set
                    CONSTITUENTSOLICITCODE.CONSTITUENTID = SOLICITCODES.CONSTITUENTID,
                    CONSTITUENTSOLICITCODE.SOLICITCODEID = SOLICITCODES.SOLICITCODEID,
                    CONSTITUENTSOLICITCODE.STARTDATE = SOLICITCODES.STARTDATE,
                    CONSTITUENTSOLICITCODE.ENDDATE = SOLICITCODES.ENDDATE,
                    CONSTITUENTSOLICITCODE.COMMENTS = SOLICITCODES.COMMENTS,
                    CONSTITUENTSOLICITCODE.SEQUENCE = SOLICITCODES.SEQUENCE,
                    CONSTITUENTSOLICITCODE.CONSENTPREFERENCECODE = SOLICITCODES.CONSENTPREFERENCECODE,
                    CONSTITUENTSOLICITCODE.SOURCECODEID = SOLICITCODES.SOURCECODEID,
                    CONSTITUENTSOLICITCODE.SOURCEFILEPATH = SOLICITCODES.SOURCEFILEPATH,
                    CONSTITUENTSOLICITCODE.PRIVACYPOLICYFILEPATH = SOLICITCODES.PRIVACYPOLICYFILEPATH,
                    CONSTITUENTSOLICITCODE.SUPPORTINGINFORMATION = SOLICITCODES.SUPPORTINGINFORMATION,
                    CONSTITUENTSOLICITCODE.CONSENTSTATEMENT = SOLICITCODES.CONSENTSTATEMENT,
                    CONSTITUENTSOLICITCODE.CHANGEDBYID = @CHANGEAGENTID,
                    CONSTITUENTSOLICITCODE.DATECHANGED = @CURRENTDATE
                from @SOLICITCODESTABLE SOLICITCODES
                where CONSTITUENTSOLICITCODE.ID = SOLICITCODES.CONSTITUENTSOLICITCODEID;

                -- Remove existing rows from the table

                delete SOLICITCODES
                from @SOLICITCODESTABLE SOLICITCODES
                    inner join dbo.CONSTITUENTSOLICITCODE on SOLICITCODES.CONSTITUENTSOLICITCODEID = CONSTITUENTSOLICITCODE.ID;

                -- Add new solicit codes

                insert into CONSTITUENTSOLICITCODE
                (
                    ID,
                    CONSTITUENTID,
                    SOLICITCODEID,
                    STARTDATE,
                    ENDDATE,
                    COMMENTS,
                    SEQUENCE,
                    CONSENTPREFERENCECODE,
                    SOURCECODEID,
                    SOURCEFILEPATH,
                    PRIVACYPOLICYFILEPATH,
                    SUPPORTINGINFORMATION,
                    CONSENTSTATEMENT,
                    ADDEDBYID,
                    CHANGEDBYID,
                    DATEADDED,
                    DATECHANGED
                )
                select
                    CONSTITUENTSOLICITCODEID,
                    @BILLTOCONSTITUENTID,
                    SOLICITCODEID,
                    STARTDATE,
                    ENDDATE,
                    COMMENTS,
                    SEQUENCE,
                    CONSENTPREFERENCECODE,
                    SOURCECODEID,
                    SOURCEFILEPATH,
                    PRIVACYPOLICYFILEPATH,
                    SUPPORTINGINFORMATION,
                    CONSENTSTATEMENT,
                    @CHANGEAGENTID
                    @CHANGEAGENTID
                    @CURRENTDATE
                    @CURRENTDATE
                from @SOLICITCODESTABLE;
            end

            declare @SETEXPIRATIONDATE bit = (select case when PROGRAMTYPECODE = @ANNUALPROGRAMTYPECODE then 1 else 0 end from dbo.MEMBERSHIPPROGRAM where ID = @MEMBERSHIPPROGRAMID)

            if (@WHATPAYINGFORVALUE = @ADD_MEMBERSHIPTRANSACTTIONTYPECODE or @MEMBERSHIPACTIONCODE = 0) and 
                not exists (select 1 from dbo.MEMBERSHIP where MEMBERSHIP.ID = @EXISTINGMEMBERSHIPID)
            begin
                --New membership

                set @EXISTINGMEMBERSHIPID = newid()

                insert into dbo.MEMBERSHIP(ID, MEMBERSHIPPROGRAMID, MEMBERSHIPLEVELID, MEMBERSHIPLEVELTERMID, JOINDATE, EXPIRATIONDATE, ISGIFT, GIVENBYID, SENDRENEWALCODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, NUMBEROFCHILDREN, AUTOMATICALLYRENEWMEMBERSHIP,MEMBERSHIPLEVELTYPECODEID)
                values(@EXISTINGMEMBERSHIPID, @MEMBERSHIPPROGRAMID, @MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, dbo.UFN_DATE_GETEARLIESTTIME(@DATE), case when @SETEXPIRATIONDATE = 1 then dbo.UFN_DATE_GETLATESTTIME(@MEMBERSHIPEXPIRESONDATE) else null end, @PAYINGORGIVINGRADIO, case when @PAYINGORGIVINGRADIO = 1 then @BILLTOCONSTITUENTID else null end, case when @PAYINGORGIVINGRADIO = 1 then @RENEWALRECIPIENT else 1 end, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @NUMBEROFCHILDREN, @AUTOMATICALLYRENEWMEMBERSHIP,@MEMBERSHIPLEVELTYPECODEID)

                --Save Addons

                insert into dbo.MEMBERSHIPADDON(ID, MEMBERSHIPID, ADDONID, QUANTITY, EXPIRATIONDATE, REVENUESPLITID, PURCHASEPRICE, 
                    TRANSACTIONPURCHASEPRICE, ORGANIZATIONPURCHASEPRICE, TRANSACTIONCURRENCYID, BASECURRENCYID, BASEEXCHANGERATEID, 
                    ORGANIZATIONEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                select
                    A.ID,
                    @EXISTINGMEMBERSHIPID,
                    A.ADDONID,
                    A.NUMBEROFADDONS,
                    @MEMBERSHIPEXPIRESONDATE,
                    A.REVENUESPLITID,
                    case
                        when @BASEEXCHANGERATEID is null then A.PRICE
                        else dbo.UFN_CURRENCY_CONVERT(A.PRICE, @LATESTBASEEXCHANGERATE)
                    end,
                    A.PRICE,
                    case
                        when @ORGANIZATIONEXCHANGERATEID is null then A.PRICE
                        else dbo.UFN_CURRENCY_CONVERT(A.PRICE, @ORGANIZATIONEXCHANGERATEID)
                    end,
                    @TRANSACTIONCURRENCYID,
                    @BASECURRENCYID,
                    @BASEEXCHANGERATEID,
                    @ORGANIZATIONEXCHANGERATEID,
                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                from @ADDONS A
                where A.APPLY = 1

                insert into dbo.MEMBER(ID, CONSTITUENTID, MEMBERSHIPID, ISPRIMARY, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                select newid(), MEMBERS.ID, @EXISTINGMEMBERSHIPID, MEMBERS.ISPRIMARY, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                from @MEMBERS MEMBERS
            end
            else
            begin
                if (@MEMBERSHIPEXPIRESONDATE is not null)
                begin
                    if @MEMBERSHIPEXPIRESONDATE < (select JOINDATE from dbo.MEMBERSHIP where ID = @EXISTINGMEMBERSHIPID)
                        raiserror('BBERR_INVALIDEXPIRATIONDATE',13,1);
                end

                --Renew/Upgrade/Downgrade/Re-join an existing membership

                update dbo.MEMBERSHIP
                set EXPIRATIONDATE = (case when @SETEXPIRATIONDATE = 1 then dbo.UFN_DATE_GETLATESTTIME(@MEMBERSHIPEXPIRESONDATE) else null end),
                    LASTRENEWEDON = dbo.UFN_DATE_GETEARLIESTTIME(@DATE),
                    MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID,
                    MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID,
                    NUMBEROFCHILDREN = @NUMBEROFCHILDREN,
                    ISGIFT = @PAYINGORGIVINGRADIO,
                    GIVENBYID = case when @PAYINGORGIVINGRADIO = 1 then @BILLTOCONSTITUENTID else null end,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE,
                    STATUSCODE = 0,
                    AUTOMATICALLYRENEWMEMBERSHIP = @AUTOMATICALLYRENEWMEMBERSHIP,
          MEMBERSHIPLEVELTYPECODEID = @MEMBERSHIPLEVELTYPECODEID
                where MEMBERSHIP.ID = @EXISTINGMEMBERSHIPID

                --Save Addons

                insert into dbo.MEMBERSHIPADDON(ID, MEMBERSHIPID, ADDONID, QUANTITY, EXPIRATIONDATE, REVENUESPLITID, PURCHASEPRICE, 
                    TRANSACTIONPURCHASEPRICE, ORGANIZATIONPURCHASEPRICE, TRANSACTIONCURRENCYID, BASECURRENCYID, BASEEXCHANGERATEID, 
                    ORGANIZATIONEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                select
                    A.ID,
                    @EXISTINGMEMBERSHIPID,
                    A.ADDONID,
                    A.NUMBEROFADDONS,
                    @MEMBERSHIPEXPIRESONDATE,
                    A.REVENUESPLITID,
                    case 
                        when @BASEEXCHANGERATEID is null then A.PRICE
                        else dbo.UFN_CURRENCY_CONVERT(A.PRICE, @LATESTBASEEXCHANGERATE)
                    end
                    A.PRICE,
                    case
                        when @ORGANIZATIONEXCHANGERATEID is null then A.PRICE
                        else dbo.UFN_CURRENCY_CONVERT(A.PRICE, @ORGANIZATIONEXCHANGERATEID)
                    end,
                    @TRANSACTIONCURRENCYID,
                    @BASECURRENCYID,
                    @BASEEXCHANGERATEID,
                    @ORGANIZATIONEXCHANGERATEID,
                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                from @ADDONS A
                where A.APPLY = 1

                -- Drop members that no longer exist

                update dbo.MEMBER
                    set
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE,
                        ISDROPPED = 1,
                        ISPRIMARY = 0
                where MEMBERSHIPID = @EXISTINGMEMBERSHIPID
                    and CONSTITUENTID not in (select ID from @MEMBERS)
                    and CONSTITUENTID <> @PRIMARYMEMBERID;

                -- Update members that are still active

                update MEMBER
                    set
                        MEMBER.CHANGEDBYID = @CHANGEAGENTID,
                        MEMBER.DATECHANGED = @CURRENTDATE,
                        MEMBER.ISPRIMARY = MS.ISPRIMARY
                from
                  dbo.MEMBER
                inner join @MEMBERS MS on MS.ID = MEMBER.CONSTITUENTID
                where MEMBER.MEMBERSHIPID = @EXISTINGMEMBERSHIPID and MEMBER.ISDROPPED = 0;

                -- Insert new members

                insert into dbo.MEMBER
                    (ID, CONSTITUENTID, MEMBERSHIPID, ISPRIMARY, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                select
                    newid(), MEMBERS.ID, @EXISTINGMEMBERSHIPID, MEMBERS.ISPRIMARY, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
                from @MEMBERS MEMBERS
                where MEMBERS.ID not in (select CONSTITUENTID from dbo.MEMBER where MEMBERSHIPID = @EXISTINGMEMBERSHIPID and ISDROPPED = 0)

            end

            declare @MEMBERSHIPTRANSACTIONID uniqueidentifier = newid();

            --If we created a pledge for this payment, then link to the membership split of the pledge. Otherwise, link to the membership split of the payment

            if @PLEDGECREATED = 1
            begin
                insert into dbo.MEMBERSHIPTRANSACTION(ID, MEMBERSHIPID, MEMBERSHIPLEVELID, MEMBERSHIPLEVELTERMID, TRANSACTIONDATE, EXPIRATIONDATE, REVENUESPLITID, ISGIFT, DONORID, NUMBEROFCHILDREN, ACTIONCODE, MEMBERSHIPPROMOID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, COMMENTS,MEMBERSHIPLEVELTYPECODEID,UPGRADEMETHODCODE)
                values(@MEMBERSHIPTRANSACTIONID, @EXISTINGMEMBERSHIPID, @MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @DATE, case when @SETEXPIRATIONDATE = 1 then dbo.UFN_DATE_GETLATESTTIME(@MEMBERSHIPEXPIRESONDATE) else null end, @PLEDGEMEMBERSHIPPARENTSPLITID, @PAYINGORGIVINGRADIO, case when @PAYINGORGIVINGRADIO = 1 then @BILLTOCONSTITUENTID else null end, @NUMBEROFCHILDREN, @MEMBERSHIPACTIONCODE, @APPLIEDDISCOUNTID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @COMMENTS,@MEMBERSHIPLEVELTYPECODEID,@UPGRADEMETHODCODE)

                --USP_PLEDGE_ADD does not create membership installment GL. This is intentional--we need to associate the revenue with the membership transaction here (above). This needs to be done so the correct GL account segment values will be used on the gl generation.

                if @INSTALLMENTPLEDGEPOSTSTATUSCODE = 1
                    exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @PLEDGEID, @CHANGEAGENTID, @CURRENTDATE;
            end
            else if @RECURRINGGIFTCREATED = 1
            begin 
                insert into dbo.MEMBERSHIPTRANSACTION(ID, MEMBERSHIPID, MEMBERSHIPLEVELID, MEMBERSHIPLEVELTERMID, TRANSACTIONDATE, EXPIRATIONDATE, REVENUESPLITID, ISGIFT, DONORID, NUMBEROFCHILDREN, ACTIONCODE, MEMBERSHIPPROMOID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, COMMENTS,MEMBERSHIPLEVELTYPECODEID,UPGRADEMETHODCODE)
                values(@MEMBERSHIPTRANSACTIONID, @EXISTINGMEMBERSHIPID, @MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @DATE, case when @SETEXPIRATIONDATE = 1 then dbo.UFN_DATE_GETLATESTTIME(@MEMBERSHIPEXPIRESONDATE) else null end, @RGMEMBERSHIPPARENTSPLITID, @PAYINGORGIVINGRADIO, case when @PAYINGORGIVINGRADIO = 1 then @BILLTOCONSTITUENTID else null end, @NUMBEROFCHILDREN, @MEMBERSHIPACTIONCODE, @APPLIEDDISCOUNTID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @COMMENTS,@MEMBERSHIPLEVELTYPECODEID,@UPGRADEMETHODCODE)
            end
            else
            begin      
                if @PAYMENTCREATED = 1 or @WHEREISREVENUETRACKEDCODE = 1
                begin
                    if @STARTINGSTATUSCODE = 2 and exists (select ID from dbo.MEMBERSHIPTRANSACTION where MEMBERSHIPID = @EXISTINGMEMBERSHIPID)
                    begin
                        update dbo.MEMBERSHIPTRANSACTION
                        set
                            EXPIRATIONDATE = case when @SETEXPIRATIONDATE = 1 then dbo.UFN_DATE_GETLATESTTIME(@MEMBERSHIPEXPIRESONDATE) else null end,
                            REVENUESPLITID = @MEMBERSHIPSPLITID,
                            ACTIONCODE = 0, --Join

              MEMBERSHIPLEVELTYPECODEID = @MEMBERSHIPLEVELTYPECODEID
                        where
                            MEMBERSHIPID = @EXISTINGMEMBERSHIPID
                    end
                    else
                    begin
                        insert into dbo.MEMBERSHIPTRANSACTION(ID, MEMBERSHIPID, MEMBERSHIPLEVELID, MEMBERSHIPLEVELTERMID, TRANSACTIONDATE, EXPIRATIONDATE, REVENUESPLITID, ISGIFT, DONORID, NUMBEROFCHILDREN, ACTIONCODE, MEMBERSHIPPROMOID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, COMMENTS,MEMBERSHIPLEVELTYPECODEID,BASEAMOUNT,UPGRADEMETHODCODE)
                        values(@MEMBERSHIPTRANSACTIONID, @EXISTINGMEMBERSHIPID, @MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @DATE, case when @SETEXPIRATIONDATE = 1 then dbo.UFN_DATE_GETLATESTTIME(@MEMBERSHIPEXPIRESONDATE) else null end, @MEMBERSHIPSPLITID, @PAYINGORGIVINGRADIO, case when @PAYINGORGIVINGRADIO = 1 then @BILLTOCONSTITUENTID else null end, @NUMBEROFCHILDREN, @MEMBERSHIPACTIONCODE, @APPLIEDDISCOUNTID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @COMMENTS,@MEMBERSHIPLEVELTYPECODEID,@NONREVENUEBASEAMOUNT,@UPGRADEMETHODCODE)
                    end
                end
            end
        end

        update dbo.MEMBERSHIPADDON set MEMBERSHIPTRANSACTIONID = @MEMBERSHIPTRANSACTIONID
        from dbo.MEMBERSHIPADDON
            inner join @ADDONS ADDONS on ADDONS.ID = MEMBERSHIPADDON.ID

    if @MEMBERSHIPSPLITID is not null or @RGORPLEDGEMEMBERSHIPSPLITID is not null
    begin
            insert into dbo.REVENUESPLITCAMPAIGN
            (
                    REVENUESPLITID,
                    CAMPAIGNID,
                    CAMPAIGNSUBPRIORITYID,
                    ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
            )
            select
                    coalesce(@MEMBERSHIPSPLITID,@RGORPLEDGEMEMBERSHIPSPLITID),
                    -- Check override setting on this program/level. If on, use campaign on level if not use program.

                    case ML.OVERRIDECAMPAIGNS when 1 then MLC.CAMPAIGNID else MPC.CAMPAIGNID end CAMPAIGNID,
                    case ML.OVERRIDECAMPAIGNS when 1 then MLC.CAMPAIGNSUBPRIORITYID else MPC.CAMPAIGNSUBPRIORITYID end CAMPAIGNSUBPRIORITYID,
                    @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
            from dbo.MEMBERSHIPLEVEL ML
            left outer join dbo.MEMBERSHIPPROGRAMCAMPAIGN MPC on ML.MEMBERSHIPPROGRAMID = MPC.MEMBERSHIPPROGRAMID
            left outer join dbo.MEMBERSHIPLEVELCAMPAIGN MLC on ML.ID = MLC.MEMBERSHIPLEVELID
            where
                    ML.ID = @MEMBERSHIPLEVELID and
                    ((@DATE between MPC.DATEFROM and MPC.DATETO) or
                    (@DATE >= MPC.DATEFROM and MPC.DATETO IS NULL) or
                    (@DATE <= MPC.DATETO and MPC.DATEFROM is null) or
                    (MPC.DATEFROM IS NULL and MPC.DATETO IS NULL)) and

                    ((@DATE between MLC.DATEFROM and MLC.DATETO) or
                    (@DATE >= MLC.DATEFROM and MLC.DATETO IS NULL) or
                    (@DATE <= MLC.DATETO and MLC.DATEFROM is null) or
                    (MLC.DATEFROM IS NULL and MLC.DATETO IS NULL)) and

                    (isnull(MLC.CAMPAIGNID,MPC.CAMPAIGNID) is not null) and
                    (select CAMPAIGN.ISACTIVE from dbo.CAMPAIGN where CAMPAIGN.ID = (case ML.OVERRIDECAMPAIGNS when 1 then MLC.CAMPAIGNID else MPC.CAMPAIGNID end)) = 1;
    end

    --Update campaign based on the contribution portion of the membership

    exec dbo.USP_REVENUE_ADDCAMPAIGNS @ID, @CHANGEAGENTID, @CURRENTDATE

        --Enter the contribution portion into the MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE table

        if @OBTAINLEVELCODE = 1 AND @WHEREISREVENUETRACKEDCODE = 0
        begin
            insert into dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE
            (
                ID,
                FINANCIALTRANSACTIONLINEITEMID,
                MEMBERSHIPID,
                CONSTITUENTID,
                MEMBERSHIPPROGRAMID,
                ORIGINALMEMBERSHIPTRANSACTIONID,
                CURRENTMEMBERSHIPTRANSACTIONID,
                AMOUNT,
                EFFECTIVEDATE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                newid(),
                @MEMBERSHIPSPLITID,
                @EXISTINGMEMBERSHIPID,
                @BILLTOCONSTITUENTID,
                @MEMBERSHIPPROGRAMID,
                @MEMBERSHIPTRANSACTIONID,
                @MEMBERSHIPTRANSACTIONID,
                case when @BASEEXCHANGERATEID is null then @MEMBERSHIPTRANSACTIONAMOUNT else dbo.UFN_CURRENCY_CONVERT(@MEMBERSHIPTRANSACTIONAMOUNT, @BASEEXCHANGERATEID) end,
                @DATE,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
        end
        else
        begin
            insert into dbo.MEMBERSHIPPROGRAMCONTRIBUTIONREVENUE
            (
                ID,
                FINANCIALTRANSACTIONLINEITEMID,
                MEMBERSHIPID,
                CONSTITUENTID,
                MEMBERSHIPPROGRAMID,
                ORIGINALMEMBERSHIPTRANSACTIONID,
                CURRENTMEMBERSHIPTRANSACTIONID,
                AMOUNT,
                EFFECTIVEDATE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                newid(),
                ID,
                @EXISTINGMEMBERSHIPID,
                @BILLTOCONSTITUENTID,
                @MEMBERSHIPPROGRAMID,
                @MEMBERSHIPTRANSACTIONID,
                @MEMBERSHIPTRANSACTIONID,
                case when @BASEEXCHANGERATEID is null then AMOUNT else dbo.UFN_CURRENCY_CONVERT(AMOUNT, @BASEEXCHANGERATEID) end,
                @DATE,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from
                @MEMBERSHIPREVENUESPLITTABLE
            where APPLICATIONCODE = 0 and AMOUNT > 0

            union all

            select
                newid(),
                ID,
                @EXISTINGMEMBERSHIPID,
                @BILLTOCONSTITUENTID
                ,@MEMBERSHIPPROGRAMID,
                @MEMBERSHIPTRANSACTIONID
                ,@MEMBERSHIPTRANSACTIONID,
                case when @BASEEXCHANGERATEID is null then AMOUNT else dbo.UFN_CURRENCY_CONVERT(AMOUNT, @BASEEXCHANGERATEID) end,
                @DATE,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from @RGSPLITTABLE
            where APPLICATIONCODE = 0

            union all

            select
                newid(),
                ID,
                @EXISTINGMEMBERSHIPID,
                @BILLTOCONSTITUENTID,
                @MEMBERSHIPPROGRAMID,
                @MEMBERSHIPTRANSACTIONID,
                @MEMBERSHIPTRANSACTIONID,
                case when @BASEEXCHANGERATEID is null then AMOUNT else dbo.UFN_CURRENCY_CONVERT(AMOUNT, @BASEEXCHANGERATEID) end,
                @DATE,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from @PLEDGESPLITTABLE
            where APPLICATIONCODE = 0

            insert into dbo.MEMBERSHIPCONTRIBUTIONPORTION
            (
                ID,
                FINANCIALTRANSACTIONLINEITEMID,
                MEMBERSHIPPROGRAMID,
                MEMBERSHIPTRANSACTIONID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                newid(),
                ID,
                @MEMBERSHIPPROGRAMID,
                @MEMBERSHIPTRANSACTIONID,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from @MEMBERSHIPREVENUESPLITTABLE
            where APPLICATIONCODE = 0 and AMOUNT > 0

            union all

            select
                newid(),
                ID,
                @MEMBERSHIPPROGRAMID,
                @MEMBERSHIPTRANSACTIONID,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from @RGSPLITTABLE
            where APPLICATIONCODE = 0

            union all

            select
                newid(),
                ID,
                @MEMBERSHIPPROGRAMID,
                @MEMBERSHIPTRANSACTIONID,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from @PLEDGESPLITTABLE
            where APPLICATIONCODE = 0
        end

        if @WHATPAYINGFORVALUE <> @PAY_MEMBERSHIPTRANSACTTIONTYPECODE or @PROGRAMTYPE = @RECURRINGPROGRAMTYPECODE
        begin
            -- Membership cards

            declare @MEMBERSHIPCARDSTABLE table
            (
                ID uniqueidentifier,
                MEMBERID uniqueidentifier,
                CONSTITUENTID uniqueidentifier,
                NAMEONCARD nvarchar(100),
                EXPIRATIONDATE date
            )

            -- Populate from XML

            insert into @MEMBERSHIPCARDSTABLE (ID, MEMBERID, CONSTITUENTID, NAMEONCARD, EXPIRATIONDATE)
            select
                null,
                MEMBER.ID,
                T.c.value('(CONSTITUENTID)[1]','uniqueidentifier'),
                T.c.value('(NAMEONCARD)[1]','nvarchar(100)'),
                T.c.value('(EXPIRATIONDATE)[1]','date')
            from
                @MEMBERSHIPCARDS.nodes('/MEMBERSHIPCARDS/ITEM') T(c)
                inner join dbo.MEMBER on T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') = MEMBER.CONSTITUENTID and MEMBER.MEMBERSHIPID = @EXISTINGMEMBERSHIPID and MEMBER.ISDROPPED = 0

            -- Existing membership cards. We create this table and select distinct to avoid pulling duplicate cards that already exist. This would probably be better off being done in

            -- the UIModel and original pull.

            declare @EXISTINGCARDSTABLE table
            (
                MEMBERSHIPCARDID uniqueidentifier,
                MEMBERID uniqueidentifier,
                CONSTITUENTID uniqueidentifier,
                NAMEONCARD nvarchar(100)
            )
            insert into @EXISTINGCARDSTABLE
            select distinct MEMBERSHIPCARD.ID as MEMBERSHIPCARDID,
                                            MEMBER.ID as MEMBERID,
                                            MEMBER.CONSTITUENTID,
                                            MEMBERSHIPCARD.NAMEONCARD
            from dbo.MEMBERSHIPCARD
            inner join dbo.MEMBER on MEMBERSHIPCARD.MEMBERID = MEMBER.ID
            inner join @MEMBERSHIPCARDS.nodes('/MEMBERSHIPCARDS/ITEM') T(c) 
            on     T.c.value('(CONSTITUENTID)[1]','uniqueidentifier') = MEMBER.CONSTITUENTID
            where MEMBER.MEMBERSHIPID = @EXISTINGMEMBERSHIPID  and MEMBERSHIPCARD.STATUSCODE = 0

            update @MEMBERSHIPCARDSTABLE set [@MEMBERSHIPCARDSTABLE].ID = [@EXISTINGCARDSTABLE].MEMBERSHIPCARDID, [@MEMBERSHIPCARDSTABLE].MEMBERID = [@EXISTINGCARDSTABLE].MEMBERID
            from @MEMBERSHIPCARDSTABLE
            inner join @EXISTINGCARDSTABLE on [@EXISTINGCARDSTABLE].CONSTITUENTID = [@MEMBERSHIPCARDSTABLE].CONSTITUENTID and 
            [@EXISTINGCARDSTABLE].NAMEONCARD = [@MEMBERSHIPCARDSTABLE].NAMEONCARD


            update @MEMBERSHIPCARDSTABLE set ID = newid() where (ID is null) or (ID = '00000000-0000-0000-0000-000000000000');

            -- if existing membership card is printed and has an expiration date, cancel the old card and issue a new card

            update dbo.MEMBERSHIPCARD set STATUSCODE = 2
            from dbo.MEMBERSHIPCARD 
                inner join @MEMBERSHIPCARDSTABLE TEMPTBL on TEMPTBL.ID = MEMBERSHIPCARD.ID
            where MEMBERSHIPCARD.STATUSCODE = 1 and 
                (((MEMBERSHIPCARD.EXPIRATIONDATE is not null) and MEMBERSHIPCARD.EXPIRATIONDATE < TEMPTBL.EXPIRATIONDATE) or 
                    MEMBERSHIPCARD.NAMEONCARD <> TEMPTBL.NAMEONCARD)

            -- if a membership card already exists for this membership, but for a different member than the current card(s) being issued cancel the old card

            update dbo.MEMBERSHIPCARD set STATUSCODE = 2
            from @MEMBERSHIPCARDSTABLE TEMPTBL
                join dbo.MEMBER NEWCARDMEMBER on TEMPTBL.MEMBERID = NEWCARDMEMBER.ID
                join dbo.MEMBERSHIP MP on NEWCARDMEMBER.MEMBERSHIPID = MP.ID
                join dbo.MEMBER OLDCARDMEMBER on MP.ID = OLDCARDMEMBER.MEMBERSHIPID and OLDCARDMEMBER.ID != NEWCARDMEMBER.ID
                join dbo.MEMBERSHIPCARD OLDCARD on OLDCARDMEMBER.ID = OLDCARD.MEMBERID

            -- Cancel all cards that are issued from this existing membership for members that are dropped

            if @EXISTINGMEMBERSHIPID is not null 
            begin
                update dbo.MEMBERSHIPCARD set 
                    STATUSCODE = 2,
                    DATECHANGED = @CURRENTDATE,
                    CHANGEDBYID = @CHANGEAGENTID
                from dbo.MEMBERSHIPCARD
                    inner join dbo.MEMBER on MEMBER.ID = MEMBERSHIPCARD.MEMBERID
                where
                    MEMBER.MEMBERSHIPID = @EXISTINGMEMBERSHIPID
                    and MEMBER.ISDROPPED = 1
                    and MEMBERSHIPCARD.STATUSCODE <> 2
            end

            update TEMPTBL set ID = newid()
            from @MEMBERSHIPCARDSTABLE TEMPTBL
                inner join dbo.MEMBERSHIPCARD on TEMPTBL.ID = MEMBERSHIPCARD.ID
            where
                MEMBERSHIPCARD.STATUSCODE = 2 and 
                (
                    (
                        (MEMBERSHIPCARD.EXPIRATIONDATE is not null) and
                        MEMBERSHIPCARD.EXPIRATIONDATE < TEMPTBL.EXPIRATIONDATE
                    ) or
                    MEMBERSHIPCARD.NAMEONCARD <> TEMPTBL.NAMEONCARD
                )

            update dbo.[MEMBERSHIPCARD] set STATUSCODE = 2 where [MEMBERSHIPCARD].ID in 
                -- JLM 3/3/2012 : WI 199320

                /*    Using a locking hint here to alleviate contention for the MEMBERSHIPCARD table.  I'm not
                    a huge fan of adding locking hints vs refactoring, but given the nature of this subquery,
                    the hint should be ok here since we have the context of the specific membership record. */
                (select MEMBERSHIPCARD.ID from dbo.MEMBERSHIPCARD with (nolock) inner join dbo.MEMBER on MEMBER.ID = MEMBERSHIPCARD.MEMBERID where MEMBER.MEMBERSHIPID = @EXISTINGMEMBERSHIPID
                EXCEPT select ID from @MEMBERSHIPCARDSTABLE)

            -- If existing membership card doesn't have an expiration date, do not update expiration date

            update TEMPTBL set EXPIRATIONDATE = null
            from @MEMBERSHIPCARDSTABLE TEMPTBL
                inner join dbo.MEMBERSHIPCARD on TEMPTBL.ID = MEMBERSHIPCARD.ID
            where MEMBERSHIPCARD.EXPIRATIONDATE is null

            -- update the items that exist in the XML table and the db

            update dbo.[MEMBERSHIPCARD]
            set
                [MEMBERSHIPCARD].[NAMEONCARD] = temp.[NAMEONCARD],
                [MEMBERSHIPCARD].[EXPIRATIONDATE] = temp.[EXPIRATIONDATE],
                [MEMBERSHIPCARD].[MEMBERID] = temp.[MEMBERID],
                [MEMBERSHIPCARD].CHANGEDBYID = @CHANGEAGENTID,
                [MEMBERSHIPCARD].DATECHANGED = @CURRENTDATE
            from dbo.[MEMBERSHIPCARD] inner join @MEMBERSHIPCARDSTABLE as [temp] on [MEMBERSHIPCARD].ID = [temp].ID
            where
                ([MEMBERSHIPCARD].[NAMEONCARD] <> temp.[NAMEONCARD]) or
                ([MEMBERSHIPCARD].[NAMEONCARD] is null and temp.[NAMEONCARD] is not null) or
                ([MEMBERSHIPCARD].[NAMEONCARD] is not null and temp.[NAMEONCARD] is null) or
                ([MEMBERSHIPCARD].[EXPIRATIONDATE] <> temp.[EXPIRATIONDATE]) or
                ([MEMBERSHIPCARD].[EXPIRATIONDATE] is null and temp.[EXPIRATIONDATE] is not null) or
                ([MEMBERSHIPCARD].[EXPIRATIONDATE] is not null and temp.[EXPIRATIONDATE] is null) or
                ([MEMBERSHIPCARD].[MEMBERID] <> temp.[MEMBERID]) or
                ([MEMBERSHIPCARD].[MEMBERID] is null and temp.[MEMBERID] is not null) or
                ([MEMBERSHIPCARD].[MEMBERID] is not null and temp.[MEMBERID] is null)

            -- insert new items

            insert into dbo.[MEMBERSHIPCARD] 
                ([ID], 
                [MEMBERID],
                [NAMEONCARD],
                [EXPIRATIONDATE],
                ADDEDBYID, 
                CHANGEDBYID, 
                DATEADDED, 
                DATECHANGED)
            select [ID], 
                [MEMBERID],
                [NAMEONCARD],
                [EXPIRATIONDATE],
                @CHANGEAGENTID
                @CHANGEAGENTID
                @CURRENTDATE
                @CURRENTDATE
            from @MEMBERSHIPCARDSTABLE as [temp]
            where not exists (select ID from dbo.[MEMBERSHIPCARD] as data where data.ID = [temp].ID)
        end

        --Save the GL distributions

        --Moved to end of procedure to make sure all records necessary for building the account string have been saved.

        if @POSTSTATUSCODE <> 2 and @PAYMENTCREATED = 1
        begin
            exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;

            -- save any benefit distributions

            exec dbo.USP_SAVE_PAYMENT_BENEFITGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
        end

        -- KevinHi: Reports require that the Pledge/Recurring Gift ID only be outputted when we never made a payment.

        if @PLEDGECREATED = 1 and @RENEWALREVENUETYPE = 2
        begin
            set @ID = @PLEDGEID
        end

        if @RECURRINGGIFTCREATED = 1 and @RENEWALREVENUETYPE = 2
        begin
            set @ID = @RECURRINGGIFTID
        end

        if @ISONEOFF = 1
        begin
            set @ID=@EXISTINGMEMBERSHIPID
        end

    end try

    begin catch
        exec dbo.USP_RAISE_ERROR
        return 1
    end catch

    return 0