USP_DATAFORMTEMPLATE_EDIT_RECURRINGGIFT_9

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@DATE datetime IN
@AMOUNT money IN
@SPLITS xml IN
@FREQUENCYCODE tinyint IN
@ENDDATE datetime IN
@STARTDATE datetime IN
@FINDERNUMBER bigint IN
@SOURCECODE nvarchar(50) IN
@APPEALID uniqueidentifier IN
@GIVENANONYMOUSLY bit IN
@MAILINGID uniqueidentifier IN
@CHANNELCODEID uniqueidentifier IN
@DONOTACKNOWLEDGE bit IN
@REFERENCE nvarchar(255) IN
@CATEGORYCODEID uniqueidentifier IN
@SENDREMINDER bit IN
@NEXTINSTALLMENTID uniqueidentifier IN
@REVENUEDEVELOPMENTFUNCTIONCODEID uniqueidentifier IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@BASEEXCHANGERATEID uniqueidentifier IN
@EXCHANGERATE decimal(20, 8) IN
@HADSPOTRATE bit IN
@RATECHANGED bit IN
@UPDATERECOGNITIONOPTION tinyint IN
@CURRENTAPPUSERID uniqueidentifier IN
@SCHEDULESEEDDATE datetime IN
@ISMEMBERSHIPRECURRING bit IN
@PREVIOUSSCHEDULESEEDDATE datetime IN
@LASTACTIVITYDATE date IN

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_RECURRINGGIFT_9
(
    @ID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @DATE datetime,
    @AMOUNT money,
    @SPLITS xml,
    @FREQUENCYCODE tinyint,
    @ENDDATE datetime,
    @STARTDATE datetime,
    @FINDERNUMBER bigint,
    @SOURCECODE nvarchar(50),
    @APPEALID uniqueidentifier,
    @GIVENANONYMOUSLY bit,
    @MAILINGID uniqueidentifier,
    @CHANNELCODEID uniqueidentifier,
    @DONOTACKNOWLEDGE bit,
    @REFERENCE nvarchar(255),
    @CATEGORYCODEID uniqueidentifier,
    @SENDREMINDER bit,
    @NEXTINSTALLMENTID uniqueidentifier,
    @REVENUEDEVELOPMENTFUNCTIONCODEID uniqueidentifier,
    @TRANSACTIONCURRENCYID uniqueidentifier,
    @BASEEXCHANGERATEID uniqueidentifier,
    @EXCHANGERATE decimal(20,8),
    @HADSPOTRATE bit,
    @RATECHANGED bit,
    @UPDATERECOGNITIONOPTION tinyint,
    @CURRENTAPPUSERID uniqueidentifier = null,
    @SCHEDULESEEDDATE datetime,
    @ISMEMBERSHIPRECURRING bit,
    @PREVIOUSSCHEDULESEEDDATE datetime,
    @LASTACTIVITYDATE date
)

as
set nocount on;

declare @CURRENTDATE datetime;
declare @MAXACTIVITYDATE datetime;
declare @ERROR varchar(100);
declare @BASECURRENCYID uniqueidentifier;

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

set @CURRENTDATE = getdate();        

declare @SUM money 

begin try
    if @FINDERNUMBER is null
        set @FINDERNUMBER = 0;
    else if @FINDERNUMBER <> 0
        begin
            if dbo.[UFN_MKTFINDERNUMBER_VALIDATE_MOD10](@FINDERNUMBER) = 0
                raiserror('BBERR_FINDERNUMBER_FAILEDCHECKDIGIT', 13, 1);

            if dbo.[UFN_MKTSEGMENTATIONFINDERNUMBER_GETSEGMENTATION](@FINDERNUMBER) is null
                raiserror('BBERR_FINDERNUMBER_INVALID', 13, 1);
        end

    if @AMOUNT < 0 
    raiserror('BBERR_RECURRINGGIFT_AMOUNTPOSITIVE', 13, 1);

    --Make sure @DATE <= @STARTDATE <= @SCHEDULESEEDDATE

    if @STARTDATE < @DATE
    raiserror('BBERR_RECURRINGGIFT_STARTDATEBEFOREDATE', 13, 1);
    if @SCHEDULESEEDDATE < @STARTDATE
    raiserror('BBERR_RECURRINGGIFT_NEXTTRANSACTIONBEFORESTARTDATE', 13, 1);

    -- ensure that installments are not being adjusted before the last activity date

    if @SCHEDULESEEDDATE <= @LASTACTIVITYDATE
      raiserror('BBERR_RECURRINGGIFT_NEXTTRANSACTIONBEFORELASTACTIVITY', 13, 1);

    --Business units - AdiSa 6/13/10 - Calculate and store business unit ratios for all new splits given

    --the old splits.

    declare @BUSINESSUNITSRATIO table (DESIGNATIONID uniqueidentifier, OVERRIDEBUSINESSUNITS bit, REASON uniqueidentifier, BUSINESSUNITCODEID uniqueidentifier, RATIO float)
    insert into @BUSINESSUNITSRATIO
    select
        REVENUESPLIT_EXT.DESIGNATIONID,
        REVENUESPLIT_EXT.OVERRIDEBUSINESSUNITS,
        REVENUESPLIT_EXT.REVENUESPLITBUSINESSUNITOVERRIDECODEID as REASON,
        REVENUESPLITBUSINESSUNIT.BUSINESSUNITCODEID,
        REVENUESPLITBUSINESSUNIT.AMOUNT/REVENUESPLIT.BASEAMOUNT as RATIO
    from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID
    inner join dbo.REVENUESPLITBUSINESSUNIT on REVENUESPLITBUSINESSUNIT.REVENUESPLITID = REVENUESPLIT.ID
    where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.OVERRIDEBUSINESSUNITS = 1 and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1

    --get initial value of given anonymously to determine how to handle recognitions

    declare @INITIALGIVENANONYMOUSLY bit;

    --get the previous values for fields that are tracked in the RG amendment table

    declare @HASAMOUNTFREQUNCYEDITS bit = 0;
    declare @SCHEDULESEEDDATECHANGED bit = 0;
    declare @HASMARKETINGEDITS bit = 0;
    declare @PREVIOUSAMOUNT money;
    declare @PREVIOUSORGAMOUNT money;
    declare @PREVIOUSORGEXCHANGERATEID uniqueidentifier;
    declare @PREVIOUSBASEAMOUNT money;
    declare @PREVIOUSBASEEXCHANGERATEID uniqueidentifier;
    declare @PREVIOUSFREQUENCYCODE tinyint;
    declare @PREVIOUSSTATUSCODE tinyint;
    declare @DESIGNATIONS xml;

    declare @PREVIOUSFINDERNUMBER bigint;
    declare @PREVIOUSSOURCECODE nvarchar(50);
    declare @PREVIOUSAPPEALID uniqueidentifier;
    declare @PREVIOUSMAILINGID uniqueidentifier;
    declare @PREVIOUSCHANNELCODEID uniqueidentifier;
    declare @ACTIVITYTIMELINECODE tinyint;
    -- Cache the old split and recognition values for recognition updates

    declare @OLDSPLITS xml = dbo.UFN_REVENUE_GETSPLITS_2_TOITEMLISTXML(@ID);
    declare @OLDRECOGNITIONS xml = dbo.UFN_REVENUE_GETRECOGNITIONS_FORREVENUE_TOITEMLISTXML(@ID);

    select 
        @BASECURRENCYID = isnull(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, V.BASECURRENCYID),
        @INITIALGIVENANONYMOUSLY = REVENUE_EXT.GIVENANONYMOUSLY,
        @PREVIOUSSOURCECODE = REVENUE_EXT.SOURCECODE,
        @PREVIOUSFINDERNUMBER = REVENUE_EXT.FINDERNUMBER,
        @PREVIOUSAPPEALID = REVENUE_EXT.APPEALID,
        @PREVIOUSMAILINGID = REVENUE_EXT.MAILINGID,
        @PREVIOUSCHANNELCODEID = REVENUE_EXT.CHANNELCODEID
    from dbo.REVENUE_EXT 
    left outer join  dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on REVENUE_EXT.ID = V.FINANCIALTRANSACTIONID
    where REVENUE_EXT.ID = @ID

    select
        @PREVIOUSFREQUENCYCODE = FREQUENCYCODE,
        @PREVIOUSSTATUSCODE = STATUSCODE
    from dbo.REVENUESCHEDULE
    where ID = @ID

    select
        @PREVIOUSAMOUNT = TRANSACTIONAMOUNT, 
        @PREVIOUSORGAMOUNT = ORGAMOUNT,
        @PREVIOUSORGEXCHANGERATEID = ORGEXCHANGERATEID, 
        @PREVIOUSBASEAMOUNT = BASEAMOUNT,
        @PREVIOUSBASEEXCHANGERATEID = BASEEXCHANGERATEID
    from dbo.FINANCIALTRANSACTION
    where ID = @ID

    --Multicurrency - RSC 4/16/10 - If the revenue previously used a spot rate, but

    --its rate has changed, store the old rate's ID, so we can remove it later.

    declare @OLDSPOTRATE uniqueidentifier
    if @HADSPOTRATE = 1 and @RATECHANGED = 1
    begin
        select @OLDSPOTRATE = BASEEXCHANGERATEID from dbo.FINANCIALTRANSACTION where ID = @ID;
    end

    --If the record uses a new spot rate, create it and set the rate ID.

    -- WI 365571 AlexLa The rate coming in from UI model has a 1 at the end, not 0.  This wasn't working in 2.94 or 3.0.

    -- I don't see that we are clearing out the old rate even though we are storing it above.  This needs to be revisited.

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

        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

    if @ISMEMBERSHIPRECURRING = 1
    begin
        exec dbo.USP_MEMBERSHIPPLEDGE_VALIDATESPLITS @SPLITS=@SPLITS, @REVENUEAMOUNT=@AMOUNT, @REVENUEID=@ID, @TRANSACTIONCURRENCYID=@TRANSACTIONCURRENCYID;
    end
    else
    begin
        exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS=@SPLITS, @REVENUEAMOUNT=@AMOUNT, @REVENUEID=@ID, @TRANSACTIONCURRENCYID=@TRANSACTIONCURRENCYID;
    end

    declare @SPLITSCHANGED bit
    set @SPLITSCHANGED = dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS)

    -- check to see if the revenue record needs to be re-acknowledged                            

    if (coalesce((select top 1 REACKNOWLEDGEREVENUE from dbo.ACKNOWLEDGEMENTPREFERENCE), 0)) = 1
    begin
        declare @FIELDCHANGED bit;    
        set @FIELDCHANGED = 0;            

        -- check to see if amount have changed

        if (select count(REVENUE.ID) from dbo.FINANCIALTRANSACTION REVENUE where REVENUE.ID = @ID and TRANSACTIONAMOUNT = @AMOUNT) = 0
            set @FIELDCHANGED = 1;

        -- check to see if designations have changed

        if @FIELDCHANGED = 0
            if @SPLITSCHANGED = 1
                set @FIELDCHANGED = 1;

        -- if a field has changed, mark the revenue letters for this record out of date, if necessary

        if @FIELDCHANGED = 1
            exec dbo.USP_REVENUELETTER_SETREACKNOWLEDGEMENTS @ID, @CHANGEAGENTID;     
    end

    declare @INSTALLMENTSCHANGED bit

    select @INSTALLMENTSCHANGED = count(*)
    from dbo.FINANCIALTRANSACTION REVENUE
    where REVENUE.ID = @ID
    and REVENUE.TRANSACTIONAMOUNT <> @AMOUNT;

    --Multicurrency - SlyyMu 8/12/10 replaced the previous multicurrency section done by (RSC 4/16/10) with the UFN_CURRENCY_GETCURRENCYVALUES()                 

    declare @BASEAMOUNT money;
    declare @ORGANIZATIONCURRENCYID uniqueidentifier;
    declare @ORGANIZATIONAMOUNT money;
    declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
    declare @BASETOORGANIZATIONEXCHANGERATE uniqueidentifier;
    declare @EMPTYGUID uniqueidentifier = '00000000-0000-0000-0000-000000000000';

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


    if @REVENUEDEVELOPMENTFUNCTIONCODEID is not null
    begin
        declare @REVENUEDEVELOPMENTFUNCTIONID uniqueidentifier;
        set @REVENUEDEVELOPMENTFUNCTIONID = newid();

        insert into dbo.REVENUEDEVELOPMENTFUNCTION (
            ID,
            REVENUEID,
            REVENUEDEVELOPMENTFUNCTIONCODEID,
            ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
        )
        values (
            @REVENUEDEVELOPMENTFUNCTIONID,
            @ID,
            @REVENUEDEVELOPMENTFUNCTIONCODEID,
            @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
        )
    end

    -- capture amendments to the RG record

    if @PREVIOUSAMOUNT <> @AMOUNT or @PREVIOUSFREQUENCYCODE <> @FREQUENCYCODE 
       set @HASAMOUNTFREQUNCYEDITS = 1;

    if @PREVIOUSSCHEDULESEEDDATE <> @SCHEDULESEEDDATE
       set @SCHEDULESEEDDATECHANGED = 1

    if @PREVIOUSFINDERNUMBER <> @FINDERNUMBER or @PREVIOUSSOURCECODE <> @SOURCECODE or
           isnull(@PREVIOUSAPPEALID,@EMPTYGUID) <> isnull(@APPEALID,@EMPTYGUID) or 
           isnull(@PREVIOUSMAILINGID,@EMPTYGUID) <> isnull(@MAILINGID,@EMPTYGUID) or
           isnull(@PREVIOUSCHANNELCODEID,@EMPTYGUID) <> isnull(@CHANNELCODEID,@EMPTYGUID)
       set @HASMARKETINGEDITS = 1;

     if @SPLITSCHANGED = 1
     begin

       --process the designations      

        exec dbo.USP_REVENUE_GETSPLITS_MERGEDESIGNATIONSTOXML @SPLITS, @OLDSPLITS, @DESIGNATIONS output;

     end

     --insert records into the recurring gift amendment table.

     if @SPLITSCHANGED = 1 or @HASMARKETINGEDITS = 1 or @HASAMOUNTFREQUNCYEDITS = 1 or @REVENUEDEVELOPMENTFUNCTIONCODEID is not null or @SCHEDULESEEDDATECHANGED = 1
     begin
       insert into dbo.RECURRINGGIFTAMENDMENT(ID, FINANCIALTRANSACTIONID,AMENDMENTTYPECODE, DATE, REVENUEDEVELOPMENTFUNCTIONID,
                                              TRANSACTIONAMOUNT,PREVIOUSTRANSACTIONAMOUNT,TRANSACTIONCURRENCYID,
                                              ORGANIZATIONAMOUNT,PREVIOUSORGANIZATIONAMOUNT,ORGANIZATIONEXCHANGERATEID,PREVIOUSORGANIZATIONEXCHANGERATEID,
                       BASEAMOUNT,PREVIOUSBASEAMOUNT,BASECURRENCYID,BASEEXCHANGERATEID,PREVIOUSBASEEXCHANGERATEID,
                                              FREQUENCYCODE,PREVIOUSFREQUENCYCODE,DESIGNATIONS,SOURCECODE,FINDERNUMBER,APPEALID,
                                              MAILINGID,CHANNELCODEID,NEXTTRANSACTIONDATE,PREVIOUSNEXTTRANSACTIONDATE,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
       values(newid(),@ID,2,@CURRENTDATE,@REVENUEDEVELOPMENTFUNCTIONID,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @AMOUNT else 0 end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @PREVIOUSAMOUNT else 0 end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @TRANSACTIONCURRENCYID else null end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @ORGANIZATIONAMOUNT else 0 end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @PREVIOUSORGAMOUNT else 0 end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @ORGANIZATIONEXCHANGERATEID else null end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @PREVIOUSORGEXCHANGERATEID else null end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @BASEAMOUNT else 0 end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @PREVIOUSBASEAMOUNT else 0 end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @BASECURRENCYID else null end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @BASEEXCHANGERATEID else null end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @PREVIOUSBASEEXCHANGERATEID else null end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @FREQUENCYCODE else 99 end,
             case when @HASAMOUNTFREQUNCYEDITS = 1 then @PREVIOUSFREQUENCYCODE else 99 end,
             case when @SPLITSCHANGED = 1 then @DESIGNATIONS else null end,
             case when @HASMARKETINGEDITS = 1 then @SOURCECODE else '' end,
             case when @HASMARKETINGEDITS = 1 then @FINDERNUMBER else 0 end,
             case when @HASMARKETINGEDITS = 1 then @APPEALID else null end,
             case when @HASMARKETINGEDITS = 1 then @MAILINGID else null end,
             case when @HASMARKETINGEDITS = 1 then @CHANNELCODEID else null end,
             case when @SCHEDULESEEDDATECHANGED = 1 then @SCHEDULESEEDDATE else null end,
             case when @SCHEDULESEEDDATECHANGED = 1 then @PREVIOUSSCHEDULESEEDDATE else null end,
             @CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE)
     end

    -- make sure we aren't trying to modify revenue in a locked/closed deposit/bank

    exec dbo.USP_EDIT_REVENUE_VALIDATE_DEPOSIT_STATUS @ID;

    --Update Revenue

    if @AMOUNT < 0
        raiserror ('CK_REVENUE_RECEIPTAMOUNTNOTNEGATIVE', 16, 1);

    update dbo.FINANCIALTRANSACTION set
        DATE = @DATE
        ,BASEAMOUNT = @BASEAMOUNT
        ,ORGAMOUNT = @ORGANIZATIONAMOUNT
        ,TRANSACTIONAMOUNT = @AMOUNT
        ,BASEEXCHANGERATEID = @BASEEXCHANGERATEID
        ,ORGEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID
        ,CHANGEDBYID = @CHANGEAGENTID
        ,DATECHANGED = @CURRENTDATE
    where ID = @ID;

    update dbo.REVENUE_EXT set
        RECEIPTAMOUNT = @AMOUNT
        ,FINDERNUMBER = @FINDERNUMBER
        ,SOURCECODE = @SOURCECODE
        ,APPEALID = @APPEALID
        ,GIVENANONYMOUSLY = @GIVENANONYMOUSLY
        ,MAILINGID = @MAILINGID
        ,CHANNELCODEID = @CHANNELCODEID
        ,DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE
        ,REFERENCE = ISNULL(@REFERENCE, '')
        ,CHANGEDBYID = @CHANGEAGENTID
        ,DATECHANGED = @CURRENTDATE
    where ID = @ID;

    --only update schedule or start date if value changed

    --TAY:  Per MR, reset STARTDATE on edit.

    update dbo.REVENUESCHEDULE
    set
        SCHEDULESEEDDATE = isnull(@SCHEDULESEEDDATE,SCHEDULESEEDDATE),
        FREQUENCYCODE = @FREQUENCYCODE,
        STARTDATE = @STARTDATE,
        ENDDATE = @ENDDATE,
        NEXTTRANSACTIONDATE = @SCHEDULESEEDDATE, -- this is not right if there is a partially paid/written-off installment, it gets changed back later

        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    where
        ID = @ID
        and 
        (
            SCHEDULESEEDDATE <> @SCHEDULESEEDDATE
            or NEXTTRANSACTIONDATE <> @SCHEDULESEEDDATE
            or (@SCHEDULESEEDDATE is not null and SCHEDULESEEDDATE is null)
            or case when @SCHEDULESEEDDATE is null then 0 else 1 end <> case when NEXTTRANSACTIONDATE is null then 0 else 1 end
            or FREQUENCYCODE <> @FREQUENCYCODE
            or ENDDATE <> @ENDDATE
            or (@ENDDATE is null and ENDDATE is not null)
            or (@ENDDATE is not null and ENDDATE is null)
            or STARTDATE <> @STARTDATE
            or (@STARTDATE is null and STARTDATE is not null)
            or (@STARTDATE is not null and STARTDATE is null)
        );

    if @@ROWCOUNT = 1
        set @INSTALLMENTSCHANGED = 1;

    if not exists(select 'x' from dbo.RECURRINGGIFTINSTALLMENT where REVENUEID = @ID) and @PREVIOUSSTATUSCODE <> 3
    begin
        exec dbo.USP_RECURRINGGIFT_FIXMISSINGINSTALLMENTSCHEDULE @ID, @CHANGEAGENTID, @CURRENTDATE
    end
    else if @INSTALLMENTSCHANGED = 1
    begin
        -- if any activity exists on the RG, then the RG date must be <= the first installment

        if exists(select 'x'
                  from dbo.RECURRINGGIFTINSTALLMENT
                  left join dbo.RECURRINGGIFTINSTALLMENTPAYMENT on RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID = RECURRINGGIFTINSTALLMENT.ID
                  left join dbo.RECURRINGGIFTINSTALLMENTWRITEOFF on RECURRINGGIFTINSTALLMENTWRITEOFF.RECURRINGGIFTINSTALLMENTID = RECURRINGGIFTINSTALLMENT.ID
                  where REVENUEID = @ID
                  and (RECURRINGGIFTINSTALLMENTPAYMENT.ID is not null or RECURRINGGIFTINSTALLMENTWRITEOFF.ID is not null))
        begin
          declare @FIRSTINSTALLMENTDATE date;

          select @FIRSTINSTALLMENTDATE = min(DATE)
          from dbo.RECURRINGGIFTINSTALLMENT
          where REVENUEID = @ID;

          if @STARTDATE > @FIRSTINSTALLMENTDATE
            raiserror('CK_RECURRINGGIFTINSTALLMENT_VALIDDATE', 13, 1);
        end
        -- for backwards compatibility only

        else if exists(select 1 from dbo.RECURRINGGIFTACTIVITY where SOURCEREVENUEID = @ID and SCHEDULEDATE < @DATE)
            raiserror('CK_RECURRINGGIFTINSTALLMENT_VALIDDATE', 13, 1);

        if @NEXTINSTALLMENTID is not null or not exists(select 'x' from dbo.RECURRINGGIFTINSTALLMENT where REVENUEID = @ID)
        begin
            --Cache CONTEXT INFO

            declare @contextCache varbinary(128);
            set @contextCache = CONTEXT_INFO();
            set CONTEXT_INFO @CHANGEAGENTID;

            delete from dbo.RECURRINGGIFTINSTALLMENT
            where ID = @NEXTINSTALLMENTID
            or (REVENUEID = @ID and
                DATE >= (select DATE from dbo.RECURRINGGIFTINSTALLMENT where ID = @NEXTINSTALLMENTID));

            if not @contextCache is null
                set CONTEXT_INFO @contextCache;

            if @SCHEDULESEEDDATE is not null
            begin
              -- fix date for semi-monthly

              if @FREQUENCYCODE = 7
              begin
                  if datepart(day, @SCHEDULESEEDDATE) <> 1 and datepart(day, @SCHEDULESEEDDATE) <> 15
                      --Use the old version of UFN_REVENUE_GETNEXTTRANSACTIONDATE for this purpose because it doesn't take a revenue ID and does exactly what is needed.

                      set @SCHEDULESEEDDATE = dbo.UFN_REVENUE_GETNEXTTRANSACTIONDATE(@FREQUENCYCODE, @SCHEDULESEEDDATE);
              end

              -- add next installment

              insert into dbo.RECURRINGGIFTINSTALLMENT (ID, REVENUEID, AMOUNT, DATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, BASECURRENCYID,ORGANIZATIONAMOUNT,ORGANIZATIONEXCHANGERATEID,TRANSACTIONAMOUNT,TRANSACTIONCURRENCYID,BASEEXCHANGERATEID)
              values (newid(), @ID, @BASEAMOUNT, @SCHEDULESEEDDATE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE,@BASECURRENCYID,@ORGANIZATIONAMOUNT,@ORGANIZATIONEXCHANGERATEID,@AMOUNT,@TRANSACTIONCURRENCYID,@BASEEXCHANGERATEID);
            end
        end

        -- add any additional necessary installments

        exec dbo.USP_RECURRINGGIFT_ADDMISSINGINSTALLMENTS 
            @ID = @ID,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @CREATIONDATE = @CURRENTDATE,
            @AMOUNT = @BASEAMOUNT,
            @BASECURRENCYID = @BASECURRENCYID,
            @ORGANIZATIONAMOUNT = @ORGANIZATIONAMOUNT,
            @ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID,
            @TRANSACTIONAMOUNT = @AMOUNT,
            @TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
            @BASEEXCHANGERATEID = @BASEEXCHANGERATEID;

        exec dbo.USP_RECURRINGGIFT_UPDATEREVENUESCHEDULE
          @ID,
          8,
          null,
          null,
          null,
          @BASEAMOUNT,
          @BASECURRENCYID,
          @ORGANIZATIONAMOUNT,
          @ORGANIZATIONEXCHANGERATEID,
          @AMOUNT,
          @TRANSACTIONCURRENCYID,
          @BASEEXCHANGERATEID,     
          @CHANGEAGENTID,
          @CURRENTDATE;
    end

    --update reminder

    update dbo.REVENUESCHEDULE
    set SENDPLEDGEREMINDER = @SENDREMINDER,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    where ID = @ID
    and SENDPLEDGEREMINDER <> @SENDREMINDER;

    declare @ISSPONSORSHIPRECURRINGADDITIONALGIFT bit = 0;
    set @ISSPONSORSHIPRECURRINGADDITIONALGIFT =  dbo.UFN_RECURRINGGIFT_ISSPONSORSHIPRECURRINGADDITIONALGIFT(@ID); 

    -- Set the IDs for any blank entries in the splits XML so that it can associate the declines with gift aid

    -- flag with the generated splits.  Also, pull in the existing value for declines gift aid if it wasn't passed

    -- in the xml.

    set @SPLITS = (    select 
                        case when SPLITS.[ID] is null or SPLITS.[ID] = '00000000-0000-0000-0000-000000000000' then newid() else SPLITS.[ID] end [ID],
                        SPLITS.[AMOUNT],
                        SPLITS.[APPLICATIONCODE],
                        SPLITS.[DESIGNATIONID],
                        case @ISSPONSORSHIPRECURRINGADDITIONALGIFT 
                    when 0 then SPLITS.[TYPECODE]
                else 17
                end as TYPECODE,
                        case when (@SPLITS.exist('(/SPLITS/ITEM/CATEGORYCODEID)') = 0) then @CATEGORYCODEID else SPLITS.[CATEGORYCODEID] end as [CATEGORYCODEID],
                        case when SPLITS.[DECLINESGIFTAID] is null then REVENUESPLITGIFTAID.DECLINESGIFTAID else SPLITS.DECLINESGIFTAID end DECLINESGIFTAID
                    from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS) SPLITS
                    left join dbo.REVENUESPLITGIFTAID on SPLITS.ID = REVENUESPLITGIFTAID.ID
                    for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64)


    --JamesWill WI176241 Check to see if the revenue category should be copied around 

    declare @REVENUECATEGORYCOUNT int = 0;
    declare @REVENUECATEGORYID uniqueidentifier = null

    select top 1 @REVENUECATEGORYID = REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID
    from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
    inner join dbo.REVENUECATEGORY on REVENUECATEGORY.ID = REVENUESPLIT.ID
    where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1;

    select @REVENUECATEGORYCOUNT = count(distinct REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID)
    from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
  inner join dbo.REVENUECATEGORY on REVENUECATEGORY.ID = REVENUESPLIT.ID
    where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1;

    --Only set the revenue category on the splits if we can correctly infer what that should be 

    --(i.e., all the existing splits have the same category). So there should only be 1 distinct category

    --(If there are 0, that means that there shouldn't be a revenue category but also that there aren't currently any. 

    --so we shouldn't need to delete anything).

    if @REVENUECATEGORYCOUNT <> 1 
        set @REVENUECATEGORYID = null;

    declare @SPLITSAMOUNTMODIFIED table
    (
        ID uniqueidentifier
    );

    insert into @SPLITSAMOUNTMODIFIED (ID)
    select
        SPLITS.ID
    from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS) SPLITS
    left join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = SPLITS.ID and LI.DELETEDON is null and LI.TYPECODE !=1
    where
        LI.ID is null or
        SPLITS.AMOUNT != LI.BASEAMOUNT;

    --Multicurrency - RSC 4/16/10 - Process the splits xml to calculate the base and organization amounts and place them in proper nodes.

    set @SPLITS = dbo.UFN_REVENUESPLIT_CONVERTAMOUNTSINXML(@SPLITS,@BASECURRENCYID,@ORGANIZATIONEXCHANGERATEID,@TRANSACTIONCURRENCYID,@BASEEXCHANGERATEID)
    exec dbo.USP_REVENUE_GETSPLITS_2_CUSTOMUPDATEFROMXML @ID, @SPLITS, @CHANGEAGENTID, @CURRENTDATE;

    -- Update recognition based on user selected option

    exec dbo.USP_REVENUE_UPDATERECOGNITION @ID, @OLDSPLITS, @UPDATERECOGNITIONOPTION, @CHANGEAGENTID, @CURRENTDATE, @OLDRECOGNITIONS;

    exec dbo.USP_REVENUE_UPDATESOLICITORS @ID, @CHANGEAGENTID, @CURRENTDATE, @OLDSPLITS;

    --JamesWill WI176241 Check to see if the revenue category should be copied to newly created splits 

    if not @REVENUECATEGORYID is null
    begin
        insert into dbo.REVENUECATEGORY(ID, GLREVENUECATEGORYMAPPINGID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
        select 
            REVENUESPLIT.ID,
            @REVENUECATEGORYID,
            @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE 
        from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT 
        inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
        left join dbo.REVENUECATEGORY [CATEGORY] on [CATEGORY].ID = REVENUESPLIT.ID
        where [CATEGORY].ID is null and REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1;
    end

  if @CATEGORYCODEID is null
  begin
    exec dbo.USP_REVENUECATEGORY_UPDATESPLITS @ID, @CATEGORYCODEID, @CHANGEAGENTID, @CURRENTDATE
  end


    if @SPLITSCHANGED = 1
    begin
        exec dbo.USP_REVENUE_CLEARANDADDCAMPAIGNS @REVENUEID = @ID
            @CHANGEAGENTID = @CHANGEAGENTID,
            @CHANGEDATE = @CURRENTDATE
    end

    --Select the value for default anonymous recognition setting

    declare @DEFAULTANONYMOUSRECOGNITION bit = 0;
    select @DEFAULTANONYMOUSRECOGNITION = DEFAULTANONYMOUSRECOGNITION
    from dbo.RECOGNITIONDEFAULT

    --if GIVENANONYMOUSLY has toggled, fix recognitions

    if (@INITIALGIVENANONYMOUSLY = 1 and @GIVENANONYMOUSLY = 0) or (@INITIALGIVENANONYMOUSLY = 0 and @GIVENANONYMOUSLY = 1 and @DEFAULTANONYMOUSRECOGNITION = 1)
    begin
        if not exists(  
            select RR.ID 
                from dbo.REVENUERECOGNITION RR
            inner join dbo.FINANCIALTRANSACTIONLINEITEM RS on RR.REVENUESPLITID = RS.ID
            inner join dbo.REVENUESPLIT_EXT on RS.ID = REVENUESPLIT_EXT.ID
                where 
            RS.FINANCIALTRANSACTIONID = @ID and RS.DELETEDON is null and RS.TYPECODE != 1
        )
                --anonymous to named: add default recognition credits

            exec dbo.USP_REVENUE_CREATERECOGNITIONS @ID, @CHANGEAGENTID, @CURRENTDATE;
    end
    else if @INITIALGIVENANONYMOUSLY = 0 and @GIVENANONYMOUSLY = 1 and @DEFAULTANONYMOUSRECOGNITION = 0
    begin
        --named to anonymous: remove all recognition credits

        delete dbo.REVENUERECOGNITION 
            where ID in (
                select RR.ID 
                    from dbo.REVENUERECOGNITION RR
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM RS on RR.REVENUESPLITID = RS.ID
                        inner join dbo.REVENUESPLIT_EXT on RS.ID = REVENUESPLIT_EXT.ID
                    where 
                        RS.FINANCIALTRANSACTIONID = @ID and RS.DELETEDON is null and RS.TYPECODE != 1);
    end

    --Gift Aid is for UK only

    if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
    begin
        --Because the edit form does not include these values, we must retrieve them before updating the splits so that we can

        --  get the proper Gift Aid qualification status

        declare @PAYMENTMETHODCODE tinyint;
        declare @CREDITTYPECODEID uniqueidentifier;
        select @PAYMENTMETHODCODE = PAYMENTMETHODCODE from dbo.REVENUEPAYMENTMETHOD where REVENUEID = @ID;
        if @PAYMENTMETHODCODE = 2
        begin
            select @CREDITTYPECODEID = CREDITCARD.CREDITTYPECODEID 
            from dbo.REVENUEPAYMENTMETHOD
                left join dbo.REVENUESCHEDULE on REVENUEPAYMENTMETHOD.REVENUEID = REVENUESCHEDULE.ID
                left join dbo.CREDITCARD on CREDITCARD.ID = REVENUESCHEDULE.CREDITCARDID
            where REVENUEPAYMENTMETHOD.REVENUEID = @ID;
        end
        else if @PAYMENTMETHODCODE = 3 and dbo.UFN_PAPERLESSMANDATES_DAYSADVANCEDNOTICE_FORREVENUE(@ID) = -1
        begin
            --Bug 138736 - AdamBu 2/2/11 - Error on invalid paperless mandate setup.

            raiserror('BBERR_MULTIPLE_PAPERLESSMANDATECONFIGS', 13, 1);
            return 1;
        end

        declare @SPLITSDECLININGGIFTAID xml
        set @SPLITSDECLININGGIFTAID = (    
            select
                ID as REVENUESPLITID
            from dbo.UFN_REVENUE_GETSPLITS_2_FROMITEMLISTXML(@SPLITS)
            where DECLINESGIFTAID = 1
            for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64
        )

        exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, 2, @SPLITSDECLININGGIFTAID; --recurring gift is transaction type code 2

    end

    --Business units - AdiSa 8/12/10 - add adjusted splits back.

    declare @REVENUESPLITBUSINESSUNITID uniqueidentifier;
    declare BUSINESSUNITS cursor local fast_forward for
    select 
        REVENUESPLITBUSINESSUNIT.ID
    from dbo.REVENUESPLITBUSINESSUNIT
        inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESPLIT.ID = REVENUESPLITBUSINESSUNIT.REVENUESPLITID
        inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
    where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1;
    open BUSINESSUNITS;

    begin try
        fetch next from BUSINESSUNITS into @REVENUESPLITBUSINESSUNITID
        while (@@FETCH_STATUS = 0)
        begin
            exec dbo.USP_REVENUESPLITBUSINESSUNIT_DELETEBYID_WITHCHANGEAGENTID @REVENUESPLITBUSINESSUNITID, @CHANGEAGENTID;
        fetch next from BUSINESSUNITS into @REVENUESPLITBUSINESSUNITID
        end
        close BUSINESSUNITS;
        deallocate BUSINESSUNITS;
    end try
    begin catch
        close BUSINESSUNITS;
        deallocate BUSINESSUNITS;
        exec dbo.USP_RAISE_ERROR;
        return 1;
    end catch

    update dbo.REVENUESPLIT_EXT set
    OVERRIDEBUSINESSUNITS = BUR.OVERRIDEBUSINESSUNITS
    ,REVENUESPLITBUSINESSUNITOVERRIDECODEID = BUR.REASON
        ,CHANGEDBYID = @CHANGEAGENTID
        ,DATECHANGED = @CURRENTDATE
    from dbo.REVENUESPLIT_EXT
    inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = REVENUESPLIT_EXT.ID
    inner join @BUSINESSUNITSRATIO as BUR on REVENUESPLIT_EXT.DESIGNATIONID = BUR.DESIGNATIONID
    where BUR.OVERRIDEBUSINESSUNITS = 1 and LI.FINANCIALTRANSACTIONID = @ID and LI.DELETEDON is null and LI.TYPECODE != 1;

    insert into dbo.REVENUESPLITBUSINESSUNIT
    (
        ID,
        REVENUESPLITID,
        BUSINESSUNITCODEID,
        AMOUNT,
        BASECURRENCYID,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
    )
    select
        newid(),
        REVENUESPLIT_EXT.ID,
        BUR.BUSINESSUNITCODEID,
        LI.BASEAMOUNT * BUR.RATIO,
        V.BASECURRENCYID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
    from dbo.REVENUESPLIT_EXT
    inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = REVENUESPLIT_EXT.ID
        inner join @BUSINESSUNITSRATIO BUR on BUR.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
        inner join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on LI.FINANCIALTRANSACTIONID = V.FINANCIALTRANSACTIONID
    where LI.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.OVERRIDEBUSINESSUNITS=1 and LI.DELETEDON is null and LI.TYPECODE != 1;

    exec dbo.USP_REVENUESPLIT_APPLYBUSINESSUNITS @ID, @CHANGEAGENTID, @CURRENTDATE;
end try

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

return 0;