USP_PLEDGE_UPDATEINSTALLMENT3

Update installments and linked payments.

Parameters

Parameter Parameter Type Mode Description
@PLEDGEID uniqueidentifier IN
@INSTALLMENTS xml IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN
@ADJPAYMENT_DATE datetime IN
@ADJPAYMENT_POSTDATE datetime IN
@ADJPAYMENT_REASONCODEID uniqueidentifier IN
@ADJPAYMENT_DETAILS nvarchar(255) IN
@BASECURRENCYID uniqueidentifier IN
@ORGANIZATIONEXCHANGERATEID uniqueidentifier IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@BASEEXCHANGERATEID uniqueidentifier IN
@SPLITS xml IN

Definition

Copy


CREATE procedure dbo.USP_PLEDGE_UPDATEINSTALLMENT3 (
    @PLEDGEID uniqueidentifier
    ,@INSTALLMENTS xml
    ,@CHANGEAGENTID uniqueidentifier
    ,@CURRENTDATE datetime
    ,@ADJPAYMENT_DATE datetime = null
    ,@ADJPAYMENT_POSTDATE datetime = null
    ,@ADJPAYMENT_REASONCODEID uniqueidentifier = null
    ,@ADJPAYMENT_DETAILS nvarchar(255) = null
    ,@BASECURRENCYID uniqueidentifier = null
    ,@ORGANIZATIONEXCHANGERATEID uniqueidentifier = null
    ,@TRANSACTIONCURRENCYID uniqueidentifier = null
    ,@BASEEXCHANGERATEID uniqueidentifier = null
  ,@SPLITS xml = null
    )
as
begin
    set nocount on;

    --what this routine will actually do:

    --1.  caches the payment and writeoff applications for the revenueid specified

    --2.  if adjustment info is passed in, it will

    --    iterate over each of these payment applications and

    --    call USP_SAVE_ADJUSTMENT for each posted application

    --3.  it will attempt to delete/mark deleted the payment applications

    --    which are no longer in the new installment splits - this is necessary

    --    in order to actually make the changes to the installment tables since

    --    there are database constraints in play that will prevent installments

    --    or installment splits from being deleted.  In addition to the deletion/mark deleted

    --    of the payment applications, it will also attempt to manually perform 'cascade deletes'

    --    on many foreign tables.

    --4.  adjustment history and GL stuff is done based on the cached payment applications

    --5.  the installments and installment splits that were passed in will

    --    get saved to the DB

    --6.  now it will iterate of the cached payment application info and re-add the payments

    --    presuming this will re-distribute them properly.  In the case of UK, it will also

    --    do some additional UK processing

    --7.  finally it will iterate over the adjustments it created in step 2 and save the history

    declare @PROCESSADJUSTMENTS bit = 1

    if @ADJPAYMENT_DATE is null
        and @ADJPAYMENT_POSTDATE is null
        and @ADJPAYMENT_REASONCODEID is null
    begin
        set @PROCESSADJUSTMENTS = 0
    end

    declare @INSTALLMENTSPLITS xml;

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

    if @CURRENTDATE is null
        set @CURRENTDATE = GetDate();

    --We need to make sure all of the installments have an ID so the child objects will update properly                    

    declare @NewInstallmentsWithSplits table (
        [ID] uniqueidentifier
        ,[DATE] datetime
        ,[AMOUNT] money
        ,[RECEIPTAMOUNT] money
        ,[BALANCE] money
        ,[APPLIED] money
        ,[SEQUENCE] int
        ,[SPLITID] uniqueidentifier
        ,[SPLITDESIGNATIONID] uniqueidentifier
        ,[SPLITAMOUNT] money
        ,[REVENUESPLITID] uniqueidentifier
    ,[DECLINESGIFTAID] bit
        );

    insert into @NewInstallmentsWithSplits
    select T1.c.value('(ID)[1]', 'uniqueidentifier') as 'ID'
        ,T1.c.value('(DATE)[1]', 'datetime') as 'DATE'
        ,T1.c.value('(AMOUNT)[1]', 'money') as 'AMOUNT'
        ,T1.c.value('(RECEIPTAMOUNT)[1]', 'money') as 'RECEIPTAMOUNT'
        ,T1.c.value('(BALANCE)[1]', 'money') as 'BALANCE'
        ,T1.c.value('(APPLIED)[1]', 'money') as 'APPLIED'
        ,T1.c.value('(SEQUENCE)[1]', 'int') as 'SEQUENCE'
        ,T2.split.value('(ID)[1]', 'nvarchar(50)') as 'SPLITID'
        ,T2.split.value('(DESIGNATIONID)[1]', 'uniqueidentifier') as 'SPLITDESIGNATIONID'
        ,T2.split.value('(AMOUNT)[1]', 'money') as 'SPLITAMOUNT'
        ,T2.split.value('(REVENUESPLITID)[1]', 'uniqueidentifier') as 'REVENUESPLITID'
         ,T2.split.value('(DECLINESGIFTAID)[1]', 'bit') as 'DECLINESGIFTAID'
    from @INSTALLMENTS.nodes('/INSTALLMENTS/ITEM') T1(c)
    cross apply T1.c.nodes('./INSTALLMENTSPLITS/ITEM') as T2(split);

  --only need to handle gift aid declines for uk

    --Gift Aid is for UK only

    declare @PRODUCTISUK bit = dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D');
    declare @GBPCURRENCYID uniqueidentifier = (select CURRENCY.ID from dbo.CURRENCY where CURRENCY.ISO4217 = 'GBP');

  if @PRODUCTISUK =1
  begin
      declare @SPLITSTBL table
       (ID uniqueidentifier
      ,[DESIGNATIONID] uniqueidentifier
      ,[DECLINESGIFTAID] bit);

      --If @SPLITS information has been included, it is assumed that this should be used to set the declines gift aid value for the installment splits.

      if @SPLITS is not null 
      begin

          insert into @SPLITSTBL
          select SPLITS.c.value('(ID)[1]', 'uniqueidentifier') as 'ID'
              ,SPLITS.c.value('(DESIGNATIONID)[1]', 'uniqueidentifier') as 'DESIGNATIONID'
              ,SPLITS.c.value('(DECLINESGIFTAID)[1]', 'bit') as 'DECLINESGIFTAID'
            from @SPLITS.nodes('/SPLITS/ITEM') SPLITS(c);


        --update @NewInstallmentsWithSplits to have the declines gift aid values from the splits

          update @NewInstallmentsWithSplits set DECLINESGIFTAID= SPLITS.DECLINESGIFTAID
          from @NewInstallmentsWithSplits INSTALLMENTSPLITS
            inner join @SPLITSTBL SPLITS on INSTALLMENTSPLITS.REVENUESPLITID=SPLITS.ID; 
    end
  end

    declare @TempSeqTbl table (
        [ID] uniqueidentifier
        ,[SEQUENCE] int
        );

    insert into @TempSeqTbl
    select newid() ID
        ,MISSINGID.SEQUENCE
    from (
        select distinct SEQUENCE
        from @NewInstallmentsWithSplits
        where id is null
        ) MISSINGID

    -- ** Work for PBI 40790 **

    declare @REVENUEID uniqueidentifier
    declare @DEPOSITID uniqueidentifier
    declare @WRITEOFFID uniqueidentifier;
    declare @APPLIEDAMOUNT money
    declare @DONOTPOST bit
    declare @REVENUEDATE datetime
    declare @UNAPPLIEDMATCHINGGIFTSPLITS xml
    declare @CREATEDSPLITS xml
    declare @OVERPAYMENTAPPLICATIONTYPECODE tinyint
    declare @PAYMENTCONSTITUENTID uniqueidentifier
    declare @REVENUEAPPEALID uniqueidentifier
    declare @REVENUEPAYMENTMETHODCODE tinyint
    declare @REVENUECREDITTYPECODEID uniqueidentifier
    declare @APPLICATIONTYPE tinyint
    declare @AMOUNTPAID money
    declare @ADJUSTMENTID uniqueidentifier
    declare @GIFTFEEADJUSTMENTID uniqueidentifier
    declare @ADJ_POSTSTATUS tinyint
    declare @ADJUSTED bit
    declare @ISPAYMENT bit;
    declare @POSTED bit;
    declare @ISDELETED bit;
    declare @PAYMENTADJUSTMENT bit;

-- Save the IDs for any payments that need to be updated. --

    -- Replaced Installment Split amount, with Payment amount, because we need the amount in the payment currency. --

    declare @TempRevenue table (
        REVENUEID uniqueidentifier
        ,RSPLITID uniqueidentifier
        ,DEPOSITID uniqueidentifier
        ,PAYMENTAMOUNT money
        ,REVENUEDATE datetime
        ,POSTED bit
        ,DONOTPOST bit
        ,ADJUSTED bit
        ,OVERPAYMENTAPPLICATIONTYPECODE tinyint
        ,CONSTITUENTID uniqueidentifier
        ,APPEALID uniqueidentifier
        ,PAYMENTMETHODCODE tinyint
        ,REVENUEDATEADDED datetime
        ,EXISTINGDESIGNATIONID bit
        ,ISPAYMENT bit
        ,INSTALLMENTSPLITTODELETEID uniqueidentifier
        ,SEQUENCENO tinyint
        ,DELETEDANDCHANGEDSPLITSINFOXML xml
        ,DECLINESGIFTAID bit
        ,ISDELETED bit
        );
    declare @RevenueAdjustmentHistoryMapping table (
        REVENUEID uniqueidentifier
        ,ADJUSTMENTID uniqueidentifier
        ,ISPAYMENT bit
        );

    --add info from the payment line items that will be impacted 

    insert into @TempRevenue (
        REVENUEID
        ,RSPLITID
        ,DEPOSITID
        ,PAYMENTAMOUNT
        ,REVENUEDATE
        ,POSTED
        ,DONOTPOST
        ,ADJUSTED
        ,OVERPAYMENTAPPLICATIONTYPECODE
        ,CONSTITUENTID
        ,APPEALID
        ,PAYMENTMETHODCODE
        ,REVENUEDATEADDED
        ,EXISTINGDESIGNATIONID
        ,ISPAYMENT
        ,SEQUENCENO
        ,DECLINESGIFTAID
        ,ISDELETED
        )
    select 
        --distinct: Removing distinct. Payments for multiple installments for the same amount were being excluded. 

        --These installment amounts are needed when rebuilding the payment (summation on PAYMENTAMOUNT later on in this sproc)

        --Multiple rows were already being placed in this table variable for payment/splits when payments covered multiple installments of different amounts, so this shouldn't introduce new bugs

        --Distinct probably isn't the most efficient method for excluding redundant information here. This could probably use a good refactoring.

         FTLI.FINANCIALTRANSACTIONID REVENUEID
        ,FTLI.ID RSPLITID
        ,BANKACCOUNTDEPOSITPAYMENT.DEPOSITID DEPOSITID
        ,SUM(case when INSTALLMENTSPLITPAYMENT.APPLICATIONEXCHANGERATEID is not null then dbo.UFN_CURRENCY_CONVERTINVERSE(INSTALLMENTSPLITPAYMENT.AMOUNT, INSTALLMENTSPLITPAYMENT.APPLICATIONEXCHANGERATEID) else INSTALLMENTSPLITPAYMENT.AMOUNT end) PAYMENTAMOUNT
        ,cast(FT.[DATE] as datetime) REVENUEDATE
        ,case 
            when (FT.POSTSTATUSCODE = 2)
                and (
                    FT.TYPECODE in (
                        0
                        ,1
                        ,2
                        ,3
                        ,4
                        ,5
                        ,6
                        ,7
                        ,8
                        ,9
                        )
                    )
                and (FT.DELETEDON is null)
                then 1
            else 0
            end POSTED
        ,case FT.POSTSTATUSCODE
            when 3
                then 1
            else 0
            end DONOTPOST
        ,case 
            when exists (
                    select 1
                    from dbo.ADJUSTMENT
                    where ADJUSTMENT.REVENUEID = FTLI.FINANCIALTRANSACTIONID
                        and POSTSTATUSCODE = 1
                    )
                then 1
            else 0
            end ADJUSTED
        ,INSTALLMENTSPLITPAYMENT.OVERPAYMENTAPPLICATIONTYPECODE OVERPAYMENTAPPLICATIONTYPECODE
        ,FT.CONSTITUENTID CONSTITUENTID
        ,REVENUE_EXT.APPEALID APPEALID
        ,REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE PAYMENTMETHODCODE
        ,FT.DATEADDED REVENUEDATEADDED
        ,case 
            when INSTALLMENTSPLIT.DESIGNATIONID = NEWINSTALLMENTSPLITS.SPLITDESIGNATIONID
                then 1
            else 0
            end EXISTINGDESIGNATIONID
        ,1 ISPAYMENT
        ,INSTALLMENT.SEQUENCE
        ,NEWINSTALLMENTSPLITS.DECLINESGIFTAID
        ,1
    from dbo.INSTALLMENT
    inner join dbo.INSTALLMENTSPLIT on INSTALLMENT.ID = INSTALLMENTSPLIT.INSTALLMENTID
    inner join dbo.INSTALLMENTSPLITPAYMENT on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on INSTALLMENTSPLITPAYMENT.PAYMENTID = FTLI.ID
    inner join dbo.FINANCIALTRANSACTION FT on FTLI.FINANCIALTRANSACTIONID = FT.ID
    inner join dbo.REVENUE_EXT on FT.ID = REVENUE_EXT.ID
    inner join dbo.REVENUEPAYMENTMETHOD on FT.ID = REVENUEPAYMENTMETHOD.REVENUEID
    left join dbo.BANKACCOUNTDEPOSITPAYMENT on FTLI.FINANCIALTRANSACTIONID = BANKACCOUNTDEPOSITPAYMENT.ID
    left join @NewInstallmentsWithSplits as NEWINSTALLMENTSPLITS on INSTALLMENTSPLIT.ID = NEWINSTALLMENTSPLITS.SPLITID
    where INSTALLMENT.REVENUEID = @PLEDGEID --and

        --(

        --  INSTALLMENTSPLIT.AMOUNT <> isnull(NEWINSTALLMENTSPLITS.SPLITAMOUNT, 0) or

        --  INSTALLMENTSPLIT.DESIGNATIONID <> IsNull(NEWINSTALLMENTSPLITS.SPLITDESIGNATIONID, '00000000-0000-0000-0000-000000000000')

        --)

    group by
     FTLI.FINANCIALTRANSACTIONID
     ,FTLI.ID
     ,BANKACCOUNTDEPOSITPAYMENT.DEPOSITID
     ,FT.[DATE]
     ,FT.POSTSTATUSCODE
     ,FT.TYPECODE
     ,FT.DELETEDON
     ,INSTALLMENTSPLITPAYMENT.OVERPAYMENTAPPLICATIONTYPECODE
     ,FT.CONSTITUENTID
     ,REVENUE_EXT.APPEALID
     ,REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE 
     ,FT.DATEADDED
     ,INSTALLMENTSPLIT.DESIGNATIONID
     ,NEWINSTALLMENTSPLITS.SPLITDESIGNATIONID
     ,INSTALLMENT.SEQUENCE
   ,NEWINSTALLMENTSPLITS.DECLINESGIFTAID

    --add info from the write off line items that will be impacted 

    insert into @TempRevenue (
        REVENUEID
        ,RSPLITID
        ,PAYMENTAMOUNT
        ,REVENUEDATE
        ,POSTED
        ,DONOTPOST
        ,ADJUSTED
        ,CONSTITUENTID
        ,APPEALID
        ,REVENUEDATEADDED
        ,EXISTINGDESIGNATIONID
        ,ISPAYMENT
        ,DECLINESGIFTAID
        ,ISDELETED
        )
    select distinct WOLI.FINANCIALTRANSACTIONID REVENUEID
        ,WOLI.ID RSPLITID
        ,SUM(WOLI.TRANSACTIONAMOUNT) PAYMENTAMOUNT
        ,cast(FT.[DATE] as datetime) REVENUEDATE
        ,case 
            when (FT.POSTSTATUSCODE = 2)
                and (
                    FT.TYPECODE in (
                        0
                        ,1
                        ,2
                        ,3
                        ,4
                        ,5
                        ,6
                        ,7
                        ,8
                        ,9
                        ,20
                        )
                    )
                and (FT.DELETEDON is null)
                then 1
            else 0
            end POSTED
        ,case FT.POSTSTATUSCODE
            when 3
                then 1
            else 0
            end DONOTPOST
        ,case 
            when exists (
                    select 1
                    from dbo.ADJUSTMENT
                    where ADJUSTMENT.REVENUEID = WOLI.FINANCIALTRANSACTIONID
                        and POSTSTATUSCODE = 1
                    )
                then 1
            else 0
            end ADJUSTED
        ,FT.CONSTITUENTID CONSTITUENTID
        ,REVENUE_EXT.APPEALID APPEALID
        ,FT.DATEADDED REVENUEDATEADDED
        ,case 
            when ISPLIT.DESIGNATIONID = NEWINSTALLMENTSPLITS.SPLITDESIGNATIONID
                then 1
            else 0
            end EXISTINGDESIGNATIONID
        ,0 ISPAYMENT
        ,NEWINSTALLMENTSPLITS.DECLINESGIFTAID
        ,1
    from dbo.INSTALLMENT I
    inner join dbo.INSTALLMENTSPLIT ISPLIT on I.ID = ISPLIT.INSTALLMENTID
    inner join dbo.INSTALLMENTSPLITWRITEOFF ISPWO on ISPWO.INSTALLMENTSPLITID = ISPLIT.ID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM WOLI on ISPWO.WRITEOFFID = WOLI.FINANCIALTRANSACTIONID
    inner join dbo.FINANCIALTRANSACTION FT on WOLI.FINANCIALTRANSACTIONID = FT.ID
    left join dbo.REVENUE_EXT on FT.ID = REVENUE_EXT.ID
    left join @NewInstallmentsWithSplits as NEWINSTALLMENTSPLITS on ISPLIT.ID = NEWINSTALLMENTSPLITS.SPLITID
    where I.REVENUEID = @PLEDGEID
        and WOLI.DELETEDON is null
        and (
            ISPLIT.REVENUESPLITID = WOLI.SOURCELINEITEMID
            or exists (
                select 1
                from dbo.FINANCIALTRANSACTIONLINEITEM NEW
                where NEW.ID = WOLI.SOURCELINEITEMID
                    and NEW.REVERSEDLINEITEMID = ISPLIT.REVENUESPLITID
                )
            )
    group by
     WOLI.FINANCIALTRANSACTIONID
     ,WOLI.ID
     ,WOLI.TRANSACTIONAMOUNT
     ,FT.[DATE]
     ,FT.POSTSTATUSCODE
     ,FT.TYPECODE
     ,FT.DELETEDON
     ,FT.CONSTITUENTID
     ,REVENUE_EXT.APPEALID
     ,FT.DATEADDED
     ,ISPLIT.DESIGNATIONID
     ,NEWINSTALLMENTSPLITS.SPLITDESIGNATIONID
   ,NEWINSTALLMENTSPLITS.DECLINESGIFTAID

    --cache the current Write-off info

    declare @WriteOffInstallmentAmounts table (
        WRITEOFFID uniqueidentifier
        ,INSTALLMENTID uniqueidentifier
        ,WRITEOFFAMOUNT money
        )

    --cache the current Gift Fees info

    declare @GiftFeeAdjustments table (
        REVENUEID uniqueidentifier
        ,GIFTFEEADJUSTMENTID uniqueidentifier
    )

    insert into @WriteOffInstallmentAmounts (
        WRITEOFFID
        ,INSTALLMENTID
        ,WRITEOFFAMOUNT
        )
    select INSTALLMENTSPLITWRITEOFF.WRITEOFFID
        ,INSTALLMENTSPLIT.INSTALLMENTID
        ,sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT)
    from dbo.INSTALLMENTSPLIT
    inner join dbo.INSTALLMENTSPLITWRITEOFF on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID
    where INSTALLMENTSPLIT.PLEDGEID = @PLEDGEID
    group by INSTALLMENTSPLITWRITEOFF.WRITEOFFID
        ,INSTALLMENTSPLIT.INSTALLMENTID


    --Now cache the gift aid stuff for later too.

  --Gift Aid is for UK only

    if @PRODUCTISUK = 1
    begin
        declare @DELETEDANDCHANGEDSPLITSINFOXML xml ;

        declare POSTEDCURSOR cursor local fast_forward
            for
            select distinct REVENUEID
            from @TempRevenue
            where ISPAYMENT = 1;

            open POSTEDCURSOR;

            fetch next
            from POSTEDCURSOR
            into @REVENUEID;

                while (@@FETCH_STATUS = 0)
                begin
                    exec USP_GETGIFTAIDSPLITSTOCACHE @REVENUEID, @BASECURRENCYID, null, @DELETEDANDCHANGEDSPLITSINFOXML output;

                    update @TempRevenue set DELETEDANDCHANGEDSPLITSINFOXML=@DELETEDANDCHANGEDSPLITSINFOXML where REVENUEID=@REVENUEID;

                    fetch next
                    from POSTEDCURSOR
                    into @REVENUEID;
            end

        close POSTEDCURSOR;

        deallocate POSTEDCURSOR;

    end

    -- Bug 122814

-- Remove posted transactions from update.

  if @PROCESSADJUSTMENTS <> 1
    begin
        delete
        from @TempRevenue
        where POSTED = 1;
    end

        -- Create adjustments for Posted Payments.  But do not create unnecessary payment reversals

        -- Check if any change is made in pledge amount or designation which should reset the payment split.

        declare PAYMENTCURSOR cursor local fast_forward
        for
        select distinct REVENUEID
            ,ADJUSTED,POSTED
        from @TempRevenue 
        where ISPAYMENT = 1;
        open PAYMENTCURSOR;

        fetch next
        from PAYMENTCURSOR
        into @REVENUEID
            ,@ADJUSTED,@POSTED;

        while (@@FETCH_STATUS = 0)
        begin
            set @ADJUSTMENTID = null
            set @GIFTFEEADJUSTMENTID = null
            set @ADJ_POSTSTATUS = 1 --< Revisit do we need to let User set this?


            declare @OldImpactedInstallmentSplitsForCurrentPayment table (
                [INSTALLMENTSPLITDESIGNATIONID] nvarchar(73)
                ,[DESIGNATIONID] uniqueidentifier
                ,[AMOUNT] money
                )
            declare @NewImpactedInstallmentSplitsForCurrentPayment table (
                [INSTALLMENTSPLITDESIGNATIONID] nvarchar(73)
                ,[DESIGNATIONID] uniqueidentifier
                ,[AMOUNT] money
                )

            delete @OldImpactedInstallmentSplitsForCurrentPayment

            insert into @OldImpactedInstallmentSplitsForCurrentPayment (
                [INSTALLMENTSPLITDESIGNATIONID]
                ,[DESIGNATIONID]
                ,[AMOUNT]
                )
            select CAST(INSTALLMENTSPLIT.ID as nvarchar(36)) + CAST(INSTALLMENTSPLIT.DESIGNATIONID as nvarchar(36)) [INSTALLMENTSPLITDESIGNATIONID]
                ,INSTALLMENTSPLIT.DESIGNATIONID [DESIGNATIONID]
                ,(INSTALLMENTSPLIT.TRANSACTIONAMOUNT) [AMOUNT]
            from dbo.FINANCIALTRANSACTIONLINEITEM LI
            inner join dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.PAYMENTID = LI.ID
            inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID = ISP.INSTALLMENTSPLITID
            inner join dbo.INSTALLMENT I on I.ID = INSTALLMENTSPLIT.INSTALLMENTID
            where LI.FINANCIALTRANSACTIONID = @REVENUEID -- PAYMENT

                and ISP.PLEDGEID = @PLEDGEID

            delete @NewImpactedInstallmentSplitsForCurrentPayment

            insert into @NewImpactedInstallmentSplitsForCurrentPayment (
                [INSTALLMENTSPLITDESIGNATIONID]
                ,[DESIGNATIONID]
                ,[AMOUNT]
                )
            select CAST(NIS.SPLITID as nvarchar(36)) + CAST(SPLITDESIGNATIONID as nvarchar(36)) [INSTALLMENTSPLITDESIGNATIONID]
                ,NIS.SPLITDESIGNATIONID [DESIGNATIONID]
                ,NIS.SPLITAMOUNT [AMOUNT]
            from @NewInstallmentsWithSplits NIS
            where NIS.SPLITID in (
                    select INSTALLMENTSPLIT.ID
                    from dbo.FINANCIALTRANSACTIONLINEITEM LI
                    inner join dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.PAYMENTID = LI.ID
                    inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID = ISP.INSTALLMENTSPLITID
                    where LI.FINANCIALTRANSACTIONID = @REVENUEID
                    )

            declare @CurrentPaymentImpactedInstallments table (
                [OLDDESIGNATIONID] uniqueidentifier
                ,[NEWDESIGNATIONID] uniqueidentifier
                ,[OLDAMOUNT] money
                ,[NEWAMOUNT] money
                )

            delete @CurrentPaymentImpactedInstallments

            insert into @CurrentPaymentImpactedInstallments (
                [OLDDESIGNATIONID]
                ,[NEWDESIGNATIONID]
                ,[OLDAMOUNT]
                ,[NEWAMOUNT]
                )
            select OLD.DESIGNATIONID
                ,NEW.DESIGNATIONID
                ,ISNULL(OLD.AMOUNT, 0)
                ,ISNULL(NEW.AMOUNT, 0)
            from @NewImpactedInstallmentSplitsForCurrentPayment NEW
            full join @OldImpactedInstallmentSplitsForCurrentPayment OLD on NEW.INSTALLMENTSPLITDESIGNATIONID = OLD.INSTALLMENTSPLITDESIGNATIONID

            declare @OldTotal as money
            declare @NewTotal as money

            select @OldTotal = SUM(OLDAMOUNT)
                ,@NewTotal = SUM(NEWAMOUNT)
            from @CurrentPaymentImpactedInstallments

            declare @PAYMENTADJUSTMENTNEEDED as bit = 0

            -- Check if the posted payment requires an adjustment, by checking if there are any differences between the new and old portions per designation

            if exists (
                    select *
                    from (
                        select case 
                                when @OldTotal <> 0
                                    then sum(OLDAMOUNT) / @OldTotal
                                else - 1
                                end OLD
                            ,case 
                                when @NewTotal <> 0
                                    then sum(NEWAMOUNT) / @NewTotal
                                else - 1
                                end NEW
                        from @CurrentPaymentImpactedInstallments
                        group by OLDDESIGNATIONID
                        ) D
                    where D.OLD != D.NEW
                    )
                set @PAYMENTADJUSTMENTNEEDED = 1

            if exists ( -- check if a revenue category change on the pledge causes a needed posted payment adjustment

                     select RCPLEDGE.GLREVENUECATEGORYMAPPINGID,RCPAYMENT.GLREVENUECATEGORYMAPPINGID
                    from dbo.FINANCIALTRANSACTION FT
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.FINANCIALTRANSACTIONID = FT.ID
                    inner join dbo.INSTALLMENTSPLITPAYMENT ISP on ISP.PAYMENTID = FTLI.ID
                    inner join dbo.FINANCIALTRANSACTION FT2 on ISP.PLEDGEID = FT2.ID
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI2 on FTLI2.FINANCIALTRANSACTIONID = FT2.ID
                    full outer join REVENUECATEGORY RCPAYMENT on RCPAYMENT.ID = FTLI.ID
                    full outer join REVENUECATEGORY RCPLEDGE on RCPLEDGE.ID = FTLI2.ID
                    where FT.ID = @REVENUEID -- payment

                        and ISP.PLEDGEID = @PLEDGEID
                        and IsNull(RCPAYMENT.GLREVENUECATEGORYMAPPINGID, '00000000-0000-0000-0000-000000000000') != IsNull(RCPLEDGE.GLREVENUECATEGORYMAPPINGID, '00000000-0000-0000-0000-000000000000')
                    )
                set @PAYMENTADJUSTMENTNEEDED = 1

                if exists(
                select 1 from @NewInstallmentsWithSplits NI 
                inner join dbo.INSTALLMENT on NI.ID = INSTALLMENT.ID
                inner join dbo.INSTALLMENTPAYMENT on NI.ID = INSTALLMENTPAYMENT.INSTALLMENTID
                where NI.AMOUNT <> INSTALLMENT.AMOUNT)
            begin 
                    set @PAYMENTADJUSTMENTNEEDED = 1 
            end

                if exists
                select 1 from @NewInstallmentsWithSplits NI
                left join INSTALLMENTSPLIT on NI.ID = INSTALLMENTSPLIT.INSTALLMENTID
                and INSTALLMENTSPLIT.DESIGNATIONID = NI.SPLITDESIGNATIONID
                where INSTALLMENTSPLIT.DESIGNATIONID is null)
            begin 
                    set @PAYMENTADJUSTMENTNEEDED = 1 
            end

            if @PAYMENTADJUSTMENTNEEDED = 1 
            begin
                -- update TempRevenue table to set ISDELETED so that all payment splits should reset.

                update @TempRevenue set ISDELETED = 1
                -- payment adjustment field is set so that not posted payments are not deleted in case of Uk flag from temp revenue table.

                set @PAYMENTADJUSTMENT = 1
                -- Do not add a new adjustment if an unposted adjustment exists. ?

                if @ADJUSTED = 0 and @POSTED = 1 and @PROCESSADJUSTMENTS = 1
                begin
                    exec dbo.USP_SAVE_ADJUSTMENT @REVENUEID
                        ,@ADJUSTMENTID output
                        ,@CHANGEAGENTID
                        ,@CURRENTDATE
                        ,@ADJPAYMENT_DATE
                        ,@ADJPAYMENT_POSTDATE
                        ,@ADJPAYMENT_DETAILS
                        ,default
                        ,@ADJPAYMENT_REASONCODEID
                        ,@ADJ_POSTSTATUS;

                    insert into @RevenueAdjustmentHistoryMapping (
                        REVENUEID
                        ,ADJUSTMENTID
                        ,ISPAYMENT
                        )
                    values (
                        @REVENUEID
                        ,@ADJUSTMENTID
                        ,1
                        )

                    exec dbo.USP_SAVE_GIFTFEEADJUSTMENT @REVENUEID
                        ,@GIFTFEEADJUSTMENTID output
                        ,@CHANGEAGENTID
                        ,@CURRENTDATE
                        ,@ADJPAYMENT_DATE
                        ,@ADJPAYMENT_POSTDATE
                        ,@ADJPAYMENT_DETAILS
                        ,default
                        ,@ADJPAYMENT_REASONCODEID
                        ,@ADJ_POSTSTATUS;

                    insert into @GiftFeeAdjustments
                    values (
                        @REVENUEID
                        ,@GIFTFEEADJUSTMENTID
                        )
                end
            end
            else
            begin
                -- remove payments that do not require an adjustment

                -- if product is uk and status is not posted then set isdeleted flag to prevent revenue from being deleted.

                if @PRODUCTISUK = 1 and @POSTED = 0 and @PAYMENTADJUSTMENT is null
                begin
                         update @TempRevenue set ISDELETED = 0 where REVENUEID = @REVENUEID
                end
                    -- revenue with uk flag and not posted status will not be deleted to manage declines gift aid status.

                        delete
                        from @TempRevenue
                        where REVENUEID = @REVENUEID and (case when @PRODUCTISUK = 1 then POSTED else 1 end) = 1;
            end
            fetch next
            from PAYMENTCURSOR
            into @REVENUEID
                ,@ADJUSTED,@POSTED;
        end

        close PAYMENTCURSOR;

        deallocate PAYMENTCURSOR;

    if @PROCESSADJUSTMENTS = 1
    begin
        if exists (
                select 1
                from dbo.JOURNALENTRY
                inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY_EXT.ID = JOURNALENTRY.ID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
                inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
                where FINANCIALTRANSACTION.PARENTID = @PLEDGEID
                    and FINANCIALTRANSACTION.TYPECODE = 20 --writeoff

                    and JOURNALENTRY_EXT.OUTDATED = 0
                    and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0 --standard

                )
        begin
            declare WRITEOFFCURSOR cursor local fast_forward
            for
            select WRITEOFF.ID
            from dbo.FINANCIALTRANSACTION WRITEOFF
            where WRITEOFF.PARENTID = @PLEDGEID
                and WRITEOFF.TYPECODE = 20
                and WRITEOFF.POSTSTATUSCODE = 2 --only adjust posted

                and WRITEOFF.DELETEDON is null;

            open WRITEOFFCURSOR;

            fetch next
            from WRITEOFFCURSOR
            into @WRITEOFFID;

            while @@FETCH_STATUS = 0
            begin
                declare @WRITEOFFADJUSTMENTID uniqueidentifier = null;

                exec dbo.USP_SAVE_WRITEOFFADJUSTMENT @WRITEOFFID
                    ,@WRITEOFFADJUSTMENTID output
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE
                    ,@ADJPAYMENT_DATE
                    ,@ADJPAYMENT_POSTDATE
                    ,@ADJPAYMENT_DETAILS
                    ,@ADJPAYMENT_REASONCODEID;

                --Save adjustment IDs for adjustment history

                insert into @RevenueAdjustmentHistoryMapping (
                    REVENUEID
                    ,ADJUSTMENTID
                    ,ISPAYMENT
                    )
                values (
                    @WRITEOFFID
                    ,@WRITEOFFADJUSTMENTID
                    ,0
                    );

                fetch next
                from WRITEOFFCURSOR
                into @WRITEOFFID;
            end

            close WRITEOFFCURSOR;

            deallocate WRITEOFFCURSOR;
        end
    end
    --    I want all the INSTALLMENTSPLITPAYMENT records to regenerate, but don't regenerate if the payment does not require adjustment

    delete INSTALLMENTSPLITPAYMENT
    from dbo.INSTALLMENTSPLITPAYMENT
    inner join @TempRevenue tr on INSTALLMENTSPLITPAYMENT.PAYMENTID = tr.RSPLITID and tr.ISDELETED = 1
    where tr.ISPAYMENT = 1

    delete INSTALLMENTSPLITWRITEOFF
    from dbo.INSTALLMENTSPLITWRITEOFF ISPWO
    inner join dbo.FINANCIALTRANSACTIONLINEITEM WOLI on ISPWO.WRITEOFFID = WOLI.FINANCIALTRANSACTIONID
    inner join @TempRevenue tr on WOLI.ID = tr.RSPLITID
    and tr.ISDELETED = 1
    where tr.ISPAYMENT = 0

    -- Delete the Revenue Split records and distributions.

    --Delete trigger on RevenueSplit view does a lot of checking for Foreign Keys to the view so I'll leave the view here

    declare @SplitsToDelete xml = (
            select RSPLITID as ID
            from @TempRevenue
            where EXISTINGDESIGNATIONID = 0 and ISDELETED = 1
            for xml raw('ITEM')
                ,type
                ,elements
                ,root('SPLITSTODELETE')
                ,binary BASE64
            )

    exec dbo.USP_FINANCIALTRANSACTIONLINEITEM_DELETESPLITSANDMARKORPHANED @SplitsToDelete
        ,@CHANGEAGENTID
        ,@CURRENTDATE

    --This marks the lineitems that can be updated in the merges in USP_PLEDGE_PAYINSTALLMENTS

    --Set TYPECODE to 99 which will signal to the merge statement and the records should be updated instead of new records created

    update FINANCIALTRANSACTIONLINEITEM
    set TYPECODE = 99
    from @TempRevenue t1
    inner join dbo.FINANCIALTRANSACTIONLINEITEM on t1.RSPLITID = FINANCIALTRANSACTIONLINEITEM.ID
    where t1.EXISTINGDESIGNATIONID = 1 and t1.ISDELETED = 1
        and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null 

    -- Delete the Distributions for any Un-posted Payments.

    -- I'm only commenting this code because it seems wrong.  PostStatusCode = 1 in Revenue Model is unposted, so this would delete records that are 

    -- other than unposted instead of deleting the unposted payments.  I think the deletion from RevenueGLDistribution saves it.

    /*Delete from GLTRANSACTION 
        where POSTSTATUSCODE <> 1 and ID In
            (Select GLTRANSACTIONID from REVENUEGLDISTRIBUTION 
             where OUTDATED=0 and REVENUEID in (Select REVENUEID from @TempRevenue)) 

        Delete from REVENUEGLDISTRIBUTION 
        where OUTDATED=0 and REVENUEID in (Select REVENUEID from @TempRevenue) 
        */
    --FTM Deletion

    --First do foreign keys

    update dbo.ADJUSTMENTHISTORY
    set GLTRANSACTIONID = null
        ,DATECHANGED = getdate()
        ,CHANGEDBYID = @CHANGEAGENTID
    from ADJUSTMENTHISTORY as AH
    inner join dbo.JOURNALENTRY on AH.GLTRANSACTIONID = JOURNALENTRY.ID
    inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
    inner join @TempRevenue as D on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = D.REVENUEID and D.ISDELETED = 1
    where JOURNALENTRY_EXT.OUTDATED = 0
        and FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE != 2;

    update dbo.ADJUSTMENTHISTORYPROPERTY
    set GLTRANSACTIONID = null
        ,DATECHANGED = getdate()
        ,CHANGEDBYID = @CHANGEAGENTID
    from ADJUSTMENTHISTORYPROPERTY as AH
    inner join dbo.JOURNALENTRY on AH.GLTRANSACTIONID = JOURNALENTRY.ID
    inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
    inner join @TempRevenue as D on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = D.REVENUEID and D.ISDELETED = 1
    where JOURNALENTRY_EXT.OUTDATED = 0
        and FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE != 2;

    update dbo.ADJUSTMENTHISTORYSTOCK
    set GLTRANSACTIONID = null
        ,DATECHANGED = getdate()
        ,CHANGEDBYID = @CHANGEAGENTID
    from ADJUSTMENTHISTORYSTOCK as AH
    inner join dbo.JOURNALENTRY on AH.GLTRANSACTIONID = JOURNALENTRY.ID
    inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
    inner join @TempRevenue as D on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = D.REVENUEID and D.ISDELETED = 1
    where JOURNALENTRY_EXT.OUTDATED = 0
        and FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE != 2;

    delete JOURNALENTRY
    from dbo.JOURNALENTRY
    inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY.ID = JOURNALENTRY_EXT.ID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
    inner join @TempRevenue as D on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = D.REVENUEID and D.ISDELETED = 1
    where JOURNALENTRY_EXT.OUTDATED = 0
        and FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE != 2
        and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
        --and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null;


    -- Update installments 

    update NEWI
    set NEWI.ID = SEQ.ID
    from @NewInstallmentsWithSplits NEWI
    inner join @TempSeqTbl SEQ on NEWI.SEQUENCE = SEQ.SEQUENCE;

    set @INSTALLMENTS = (
            select distinct NEWI.ID
                ,NEWI.[DATE]
                ,NEWI.AMOUNT
                ,NEWI.RECEIPTAMOUNT
                ,NEWI.BALANCE
                ,NEWI.APPLIED
                ,NEWI.SEQUENCE
            from @NewInstallmentsWithSplits NEWI
            order by NEWI.SEQUENCE --ordering shouldn't matter here, but it makes the XML look more like what it would normally

            for xml raw('ITEM')
                ,type
                ,elements
                ,root('INSTALLMENTS')
                ,binary BASE64
            );
    set @INSTALLMENTSPLITS = (
            select distinct NEWI.SPLITID ID
                ,NEWI.ID INSTALLMENTID
                ,NEWI.SPLITDESIGNATIONID DESIGNATIONID
                ,NEWI.SPLITAMOUNT AMOUNT
                ,isnull(REVSPLITS.ID, NEWI.REVENUESPLITID) as REVENUESPLITID
            from @NewInstallmentsWithSplits NEWI
            left join (
                select FINANCIALTRANSACTIONLINEITEM.ID
                    ,REVENUESPLIT_EXT.DESIGNATIONID
                from FINANCIALTRANSACTIONLINEITEM
                inner join REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @PLEDGEID
                    and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                    and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0
                ) REVSPLITS on NEWI.SPLITDESIGNATIONID = REVSPLITS.DESIGNATIONID
            for xml raw('ITEM')
                ,type
                ,elements
                ,root('INSTALLMENTSPLITS')
                ,binary BASE64
            );
    set @INSTALLMENTS = dbo.UFN_INSTALLMENT_CONVERTAMOUNTSINXML(@INSTALLMENTS, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID)

    exec dbo.USP_INSTALLMENT_GETINSTALLMENTS_2_UPDATEFROMXML @PLEDGEID
        ,@INSTALLMENTS
        ,@CHANGEAGENTID
        ,@CURRENTDATE;

    set @INSTALLMENTSPLITS = dbo.UFN_INSTALLMENTSPLIT_CONVERTAMOUNTSINXML(@INSTALLMENTSPLITS, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID)

    exec dbo.USP_PLEDGE_GETINSTALLMENTSPLITS_2_UPDATEFROMXML @PLEDGEID
        ,@INSTALLMENTSPLITS
        ,@CHANGEAGENTID
        ,@CURRENTDATE;

    -- More Work for PBI 40790

    set @APPLICATIONTYPE = 2

    --Update writeoffs

    declare @WRITEOFFIDTABLE UDT_GENERICID;

    insert into @WRITEOFFIDTABLE
    select ID
    from dbo.FINANCIALTRANSACTION
    where 
        PARENTID = @PLEDGEID
        and TYPECODE = 20 --writeoff

        and DELETEDON is null
        and exists (
            --exclude write-offs we've removed from updating

            select 1 
            from @TempRevenue [TempRevenue] 
            where FINANCIALTRANSACTION.ID = [TempRevenue].REVENUEID and [TempRevenue].ISDELETED = 1 
        )

    if exists (
            select 1
            from @WRITEOFFIDTABLE
            )
    begin
        declare @WRITEOFFCURSOR cursor;set @WRITEOFFCURSOR = cursor local fast_forward
        for
        select ID
        from @WRITEOFFIDTABLE

        open @WRITEOFFCURSOR;

        fetch next
        from @WRITEOFFCURSOR
        into @WRITEOFFID;

        while @@FETCH_STATUS = 0
        begin
            declare @WRITEOFFINSTALLMENTS xml = (
                    select ID
                        ,[DATE]
                        ,WRITEOFFINSTALLMENT.TRANSACTIONAMOUNT as AMOUNT
                        ,BALANCE
                        ,t1.WRITEOFFAMOUNT
                        ,SEQUENCE
                        ,TRANSACTIONCURRENCYID
                    from dbo.UFN_WRITEOFF_GETINSTALLMENTSFOREDIT(@WRITEOFFID) WRITEOFFINSTALLMENT
                    left join @WriteOffInstallmentAmounts t1 on WRITEOFFINSTALLMENT.ID = t1.InstallmentID
                        and t1.WRITEOFFID = @WRITEOFFID
                    for xml raw('ITEM')
                        ,type
                        ,elements
                        ,root('INSTALLMENTS')
                        ,binary BASE64
                    );
            declare @WRITEOFFTOTALAMOUNT money = (
                    select sum(WRITEOFFAMOUNT)
                    from @WriteOffInstallmentAmounts
                    where WRITEOFFID = @WRITEOFFID
                    );

            exec dbo.USP_INSTALLMENT_WRITEOFFINSTALLMENTS @WRITEOFFID
                ,@WRITEOFFTOTALAMOUNT
                ,@CHANGEAGENTID
                ,@CURRENTDATE
                ,1
                ,@WRITEOFFINSTALLMENTS;

            exec dbo.USP_WRITEOFF_FIXSPLITS2 @WRITEOFFID
                ,@PLEDGEID
                ,@CHANGEAGENTID
                ,@CURRENTDATE
                ,@ADJPAYMENT_POSTDATE;

            fetch next
            from @WRITEOFFCURSOR
            into @WRITEOFFID;
        end

        deallocate @WRITEOFFCURSOR;
    end

    declare REVENUECURSOR cursor local fast_forward
    for
    select REVENUEID
        ,DEPOSITID
        ,sum(PAYMENTAMOUNT)
        ,REVENUEDATE
        ,DONOTPOST
        ,OVERPAYMENTAPPLICATIONTYPECODE
        ,CONSTITUENTID
        ,APPEALID
        ,PAYMENTMETHODCODE
        ,ISDELETED
    from @TempRevenue
    where ISPAYMENT = 1
    group by REVENUEID
        ,DEPOSITID
        ,REVENUEDATE
        ,DONOTPOST
        ,OVERPAYMENTAPPLICATIONTYPECODE
        ,CONSTITUENTID
        ,APPEALID
        ,PAYMENTMETHODCODE
        ,REVENUEDATEADDED
        ,ISDELETED
    order by REVENUEDATEADDED

    open REVENUECURSOR;

    fetch next
    from REVENUECURSOR
    into @REVENUEID
        ,@DEPOSITID
        ,@APPLIEDAMOUNT
        ,@REVENUEDATE
        ,@DONOTPOST
        ,@OVERPAYMENTAPPLICATIONTYPECODE
        ,@PAYMENTCONSTITUENTID
        ,@REVENUEAPPEALID
        ,@REVENUEPAYMENTMETHODCODE
        ,@ISDELETED;

    while (@@FETCH_STATUS = 0)
    begin
        set @CREATEDSPLITS = null
        set @AMOUNTPAID = null

        -- Re-Add the Payment Split if the revenue require adjustment else pick the existing.  Except not for payments not requiring adjustment

    If @ISDELETED = 1 
        begin
        exec dbo.USP_PLEDGE_ADDPAYMENT @REVENUEID
            ,@PLEDGEID
            ,@APPLIEDAMOUNT
            ,@PAYMENTCONSTITUENTID
            ,@REVENUEDATE
            ,@UNAPPLIEDMATCHINGGIFTSPLITS
            ,@APPLICATIONTYPE
            ,@AMOUNTPAID output
            ,@CURRENTDATE
            ,@CHANGEAGENTID
            ,@CREATEDSPLITS output
            ,@OVERPAYMENTAPPLICATIONTYPECODE
        end
        else
        begin
            set @CREATEDSPLITS = (select
                FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT AMOUNT,
                REVENUESPLIT_EXT.DESIGNATIONID,
                FINANCIALTRANSACTIONLINEITEM.ID,
                FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID,
                REVENUESPLIT_EXT.APPLICATIONCODE,
                REVENUESPLIT_EXT.TYPECODE,
                FINANCIALTRANSACTION.TRANSACTIONCURRENCYID
                from FINANCIALTRANSACTIONLINEITEM
                inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
                and FINANCIALTRANSACTION.ID = @REVENUEID
                inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
                where FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1
                for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64)
        end

        declare @ORIGINALPAYMETHODID uniqueidentifier
        declare @ORIGINALPAYMENTMETHODCODE tinyint

        select @ORIGINALPAYMETHODID = RPM.ID
            ,@ORIGINALPAYMENTMETHODCODE = PAYMENTMETHODCODE
        from dbo.REVENUEPAYMENTMETHOD RPM
        where RPM.REVENUEID = @REVENUEID

        declare @STOCKSALEADJUSTMENTIDS xml;
        declare @GIFTINKINDSALEADJUSTMENTIDS xml;
        declare @PROPERTYDETAILADJUSTMENTID uniqueidentifier;

        if (@PROCESSADJUSTMENTS = 1)
        begin
            declare @STOCKSALEEXISTS as bit

            select @STOCKSALEEXISTS = case 
                    when exists (
                            select 1
                            from dbo.STOCKSALE_EXT T1
                            inner join dbo.FINANCIALTRANSACTION T2 on T1.ID = T2.ID
                            where T2.PARENTID = @REVENUEID
                                and T2.POSTSTATUSCODE = 2
                                and T2.DELETEDON is null
                            )
                        then 1
                    else 0
                    end

            /* If sold stock has been posted, log stock detail adjustment */
            if (@STOCKSALEEXISTS = 1)
                and @ORIGINALPAYMENTMETHODCODE = 4
            begin
                exec dbo.USP_SAVE_STOCKDETAILADJUSTMENT @ORIGINALPAYMETHODID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE
                    ,@ADJPAYMENT_DATE
                    ,@ADJPAYMENT_POSTDATE
                    ,@ADJPAYMENT_DETAILS
                    ,@STOCKSALEADJUSTMENTIDS output
                    ,@ADJPAYMENT_REASONCODEID
                    ,@ADJ_POSTSTATUS;

                if @STOCKSALEADJUSTMENTIDS is not null
                    exec dbo.USP_ADJUSTMENTHISTORY_STOCK_SAVEHISTORY @ORIGINALPAYMETHODID
                        ,@CHANGEAGENTID
                        ,null
                        ,@STOCKSALEADJUSTMENTIDS;
            end

            declare @GIFTINKINDSALEEXISTS as bit

            select @GIFTINKINDSALEEXISTS = case 
                    when exists (
                            select 1
                            from dbo.GIFTINKINDSALE_EXT T1
                            inner join dbo.FINANCIALTRANSACTION T2 on T1.ID = T2.ID
                            where T2.PARENTID = @REVENUEID
                                and T2.POSTSTATUSCODE = 2
                                and T2.DELETEDON is null
                            )
                        then 1
                    else 0
                    end

            /* If the sold gift-in-kind has been posted, log the gift-in-kind detail adjustment */
            if (@GIFTINKINDSALEEXISTS = 1)
                and @ORIGINALPAYMENTMETHODCODE = 6
            begin
                exec dbo.USP_SAVE_GIFTINKINDPAYMENTMETHODDETAILADJUSTMENT @ORIGINALPAYMETHODID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE
                    ,@ADJPAYMENT_DATE
                    ,@ADJPAYMENT_POSTDATE
                    ,@ADJPAYMENT_DETAILS
                    ,@GIFTINKINDSALEADJUSTMENTIDS output
                    ,@ADJPAYMENT_REASONCODEID
                    ,@ADJ_POSTSTATUS;

                if @GIFTINKINDSALEADJUSTMENTIDS is not null
                    exec dbo.USP_ADJUSTMENTHISTORY_GIFTINKIND_SAVEHISTORY @ORIGINALPAYMETHODID
                        ,@CHANGEAGENTID
                        ,null
                        ,@GIFTINKINDSALEADJUSTMENTIDS;
            end

            declare @PROPERTYSALEEXISTS as bit

            select @PROPERTYSALEEXISTS = case 
                    when exists (
                            select 1
                            from dbo.PROPERTYDETAIL_EXT T1
                            inner join dbo.FINANCIALTRANSACTION T2 on T1.ID = T2.ID
                            where T2.PARENTID = @REVENUEID
                                and T2.POSTSTATUSCODE = 2
                                and T2.DELETEDON is null
                            )
                        then 1
                    else 0
                    end

            /* If sold property has been posted, log property detail adjustment */
            if (@PROPERTYSALEEXISTS = 1)
                and @ORIGINALPAYMENTMETHODCODE = 5
            begin
                exec dbo.USP_SAVE_PROPERTYDETAILADJUSTMENT @ORIGINALPAYMETHODID
                    ,@PROPERTYDETAILADJUSTMENTID output
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE
                    ,@ADJPAYMENT_DATE
                    ,@ADJPAYMENT_POSTDATE
                    ,ADJPAYMENT_DETAILS
                    ,@ADJPAYMENT_REASONCODEID
                    ,@ADJ_POSTSTATUS;

                if @PROPERTYDETAILADJUSTMENTID is not null
                    exec dbo.USP_ADJUSTMENTHISTORY_PROPERTY_SAVEHISTORY @ORIGINALPAYMETHODID
                        ,@CHANGEAGENTID
                        ,null
                        ,@PROPERTYDETAILADJUSTMENTID;
            end
        end

        if @REVENUEPAYMENTMETHODCODE = 4
        begin
            if @PROCESSADJUSTMENTS = 0
                delete
                from dbo.STOCKSALEGLDISTRIBUTION
                where REVENUEID = @REVENUEID
                    and OUTDATED = 0;

            if @ADJ_POSTSTATUS <> 2
                or @PROCESSADJUSTMENTS = 0
                exec dbo.USP_SAVE_STOCKDETAILGLDISTRIBUTION @REVENUEID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE;-- Add new stock detail GL distributions

        end

        if @REVENUEPAYMENTMETHODCODE = 6
        begin
            if @PROCESSADJUSTMENTS = 0
                delete
                from dbo.GIFTINKINDSALEGLDISTRIBUTION
                where REVENUEID = @REVENUEID
                    and OUTDATED = 0;

            if @ADJ_POSTSTATUS <> 2
                or @PROCESSADJUSTMENTS = 0
                exec dbo.USP_SAVE_GIFTINKINDPAYMENTMETHODDETAILGLDISTRIBUTION @REVENUEID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE;-- Add new gift-in-kind detail GL distributions

        end

        if @REVENUEPAYMENTMETHODCODE = 5
        begin
            if @PROCESSADJUSTMENTS = 0
                delete
                from dbo.PROPERTYDETAILGLDISTRIBUTION
                where REVENUEID = @REVENUEID
                    and OUTDATED = 0;

            if @ADJ_POSTSTATUS <> 2
                or @PROCESSADJUSTMENTS = 0
                exec dbo.USP_SAVE_PROPERTYDETAILGLDISTRIBUTION @REVENUEID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE;-- Add new property detail GL distributions

        end

        --Only perform the following if the product is UK

        if @PRODUCTISUK = 1
        begin
            if @REVENUEPAYMENTMETHODCODE = 2
                select @REVENUECREDITTYPECODEID = CREDITCARD.CREDITTYPECODEID
                from dbo.FINANCIALTRANSACTION
                inner join dbo.REVENUEPAYMENTMETHOD on FINANCIALTRANSACTION.ID = REVENUEPAYMENTMETHOD.REVENUEID
                left join dbo.REVENUESCHEDULE on FINANCIALTRANSACTION.ID = REVENUESCHEDULE.ID
                left join dbo.CREDITCARD on CREDITCARD.ID = REVENUESCHEDULE.CREDITCARDID
                where FINANCIALTRANSACTION.ID = @REVENUEID

            set @DELETEDANDCHANGEDSPLITSINFOXML= 
                (select top 1 DELETEDANDCHANGEDSPLITSINFOXML from @TempRevenue where REVENUEID=@REVENUEID);

          --Need to identify the new splits id which need declines gift aid set to true on them (otherwise it will default to false.)

            declare @CREATEDSPLITSTBL table 
              ([ID] uniqueidentifier
                ,[DESIGNATIONID] uniqueidentifier
                ,[FINANCIALTRANSACTIONID] uniqueidentifier)

            insert into @CREATEDSPLITSTBL (ID, DESIGNATIONID, FINANCIALTRANSACTIONID)
          select T1.split.value('(ID)[1]', 'uniqueidentifier') as 'ID'
                ,T1.split.value('(DESIGNATIONID)[1]', 'uniqueidentifier') as 'DESIGNATIONID'
                ,T1.split.value('(FINANCIALTRANSACTIONID)[1]', 'uniqueidentifier') as 'FINANCIALTRANSACTIONID'  
                from @CREATEDSPLITS.nodes('/SPLITS/ITEM') T1(split);

            declare @SPLITSDECLININGGIFTAID xml
             declare @SPLITSDECLININGGIFTAIDTBL table (REVENUESPLITID uniqueidentifier)

      insert into @SPLITSDECLININGGIFTAIDTBL (REVENUESPLITID)
         (select RSPLITID as REVENUESPLITID
         from @TempRevenue
         where DECLINESGIFTAID = 1)
             union
             (select CREATEDSPLITS.ID as REVENUESPLITID
                  from @CREATEDSPLITSTBL CREATEDSPLITS
                    inner join @SPLITSTBL SPLITS on SPLITS.DESIGNATIONID=CREATEDSPLITS.DESIGNATIONID
                    where SPLITS.DECLINESGIFTAID=1
                    and CREATEDSPLITS.FINANCIALTRANSACTIONID=@REVENUEID)

          set @SPLITSDECLININGGIFTAID=
              (select REVENUESPLITID
            from @SPLITSDECLININGGIFTAIDTBL
          for xml raw('ITEM')
            ,type
            ,elements
            ,root('SPLITSDECLININGGIFTAID')
            ,binary BASE64
          )

            exec USP_MANAGEGIFTAIDFORSPLITS 
                @REVENUEID
                @BASECURRENCYID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE,
                @SPLITSDECLININGGIFTAID,
                null,
                @DELETEDANDCHANGEDSPLITSINFOXML;

        end

        if @DONOTPOST = 0
        begin
            set @GIFTFEEADJUSTMENTID = (
                    select GIFTFEEADJUSTMENTID
                    from @GiftFeeAdjustments
                    where REVENUEID = @REVENUEID
                    )

            -- Recreate the gift fees and associated gift fee distributions

            exec dbo.USP_PLEDGE_PAYMENT_ADDGIFTFEES @REVENUEID
                ,@CREATEDSPLITS
                ,@PAYMENTCONSTITUENTID
                ,@CHANGEAGENTID
                ,@CURRENTDATE
                ,@GIFTFEEADJUSTMENTID;

            if @GIFTFEEADJUSTMENTID is not null
            begin
                --Remap the existing gift-fee adjustments to the current payment source

                update FTLI
                set ftli.SOURCELINEITEMID = SOURCELINEITEM.REVERSEDLINEITEMID
                from FINANCIALTRANSACTIONLINEITEM FTLI
                inner join FINANCIALTRANSACTIONLINEITEM SOURCELINEITEM on ftli.SOURCELINEITEMID = SOURCELINEITEM.ID
                where FTLI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @GIFTFEEADJUSTMENTID
                    and ftli.TYPECODE = 7
                    and SOURCELINEITEM.SOURCELINEITEMID is null
                    and SOURCELINEITEM.REVERSEDLINEITEMID is not null

                exec dbo.USP_SAVE_GIFTFEEADJUSTMENTGLDISTRIBUTION @REVENUEID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE;

                --Link gift fees to adjustments

                update FTLI
                set FTLI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @GIFTFEEADJUSTMENTID
                from FINANCIALTRANSACTIONLINEITEM FTLI
                where FTLI.TYPECODE = 7
                    and FTLI.FINANCIALTRANSACTIONID = @REVENUEID
                    and FINANCIALTRANSACTIONLINEITEMADJUSTMENTID is null
            end
            else
            begin
                exec dbo.USP_SAVE_GIFTFEEGLDISTRIBUTION @REVENUEID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE;
            end

            -- Update the Distribution.

            exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @REVENUEID
                ,@CHANGEAGENTID
                ,@CURRENTDATE;

            -- Update the distribution with the deposit info.

            if @DEPOSITID is not null
                exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @REVENUEID
                    ,@DEPOSITID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE;
        end

        fetch next
        from REVENUECURSOR
        into @REVENUEID
            ,@DEPOSITID
            ,@APPLIEDAMOUNT
            ,@REVENUEDATE
            ,@DONOTPOST
            ,@OVERPAYMENTAPPLICATIONTYPECODE
            ,@PAYMENTCONSTITUENTID
            ,@REVENUEAPPEALID
            ,@REVENUEPAYMENTMETHODCODE
            ,@ISDELETED;
    end

    close REVENUECURSOR;

    deallocate REVENUECURSOR;

    if exists (
            select 1
            from @RevenueAdjustmentHistoryMapping
            )
    begin
        -- Call USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY for all adjustments initially created by the call to USP_SAVE_ADJUSTMENT earlier

        declare ADJUSTMENTCURSOR cursor local fast_forward
        for
        select distinct REVENUEID
            ,ADJUSTMENTID
            ,ISPAYMENT
        from @RevenueAdjustmentHistoryMapping

        open ADJUSTMENTCURSOR

        fetch next
        from ADJUSTMENTCURSOR
        into @REVENUEID
            ,@ADJUSTMENTID
            ,@ISPAYMENT

        while @@FETCH_STATUS = 0
        begin
            if (@ISPAYMENT = 1)
                exec dbo.USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY @REVENUEID
                    ,@CHANGEAGENTID
                    ,@CURRENTDATE
                    ,@ADJUSTMENTID
            else
                exec dbo.USP_ADJUSTMENTHISTORY_WRITEOFF_SAVEHISTORY @REVENUEID
                    ,@CHANGEAGENTID
                    ,null
                    ,@ADJUSTMENTID

            fetch next
            from ADJUSTMENTCURSOR
            into @REVENUEID
                ,@ADJUSTMENTID
                ,@ISPAYMENT
        end

        close ADJUSTMENTCURSOR

        deallocate ADJUSTMENTCURSOR
    end

    -- clear the user-defined gl distributions

    --if (@PROCESSADJUSTMENTS = 1)

    --begin

    delete
    from dbo.WRITEOFFGLDISTRIBUTION
    where WRITEOFFID in (
            select WO.ID
            from dbo.WRITEOFF WO
            where WO.REVENUEID = @PLEDGEID
            )
        and OUTDATED = 0;

    -- Add new writeoff GL distributions if appropriate

    if exists (
            select ID
            from dbo.FINANCIALTRANSACTION
            where PARENTID = @PLEDGEID
                and TYPECODE = 20 --writeoff

                and POSTSTATUSCODE <> 3 --do not post

                and DELETEDON is null
            )
    begin
        if (dbo.UFN_VALID_BASICGL_INSTALLED() = 1)
        begin
            exec dbo.USP_SAVE_PLEDGEWRITEOFFGLDISTRIBUTION @PLEDGEID
                ,@WRITEOFFIDTABLE
                ,@CHANGEAGENTID
                ,@CURRENTDATE;
        end
        else
        begin
            exec dbo.USP_SAVE_WRITEOFFGLDISTRIBUTION @PLEDGEID
                ,@CHANGEAGENTID
                ,@CURRENTDATE;
        end
    end
            --end

end