USP_REVENUE_DELETEPOSTED

Executes the "Posted Revenue: Delete" record operation.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN Input parameter indicating the ID of the record being deleted.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the delete.

Definition

Copy


          CREATE procedure dbo.USP_REVENUE_DELETEPOSTED
          (
            @ID uniqueidentifier,
            @CHANGEAGENTID uniqueidentifier 
          )
          as 
          set nocount on;

        begin try

          declare @TRANSACTIONTYPECODE int;
          declare @CHANGEDATE datetime
          declare @POSTDATE datetime
          declare @PAYMENTMETHODCODE tinyint;
          declare @ADJUSTMENTHISTORYID uniqueidentifier;
          declare @ADJUSTMENTHISTORYPROPERTYID uniqueidentifier;
          declare @ADJUSTMENTHISTORYSTOCKID uniqueidentifier;
          declare @ADJUSTMENTHISTORYWRITEOFFID uniqueidentifier;
          declare @REVENUEPAYMENTMETHODID uniqueidentifier;
          declare @ERRORMESSAGE nvarchar(255);
          declare @ADJUSTMENTHISTORYGIFTINKINDID uniqueidentifier;


          if dbo.UFN_REVENUE_ISPOSTED(@ID) = 0
            raiserror('Unposted revenue items cannot be deleted with this task.', 13, 1);

          select
            @TRANSACTIONTYPECODE = TYPECODE,
            @CHANGEDATE = getdate()
          from dbo.FINANCIALTRANSACTION
          where ID = @ID

          select 
            @PAYMENTMETHODCODE = PAYMENTMETHODCODE,
            @REVENUEPAYMENTMETHODID = ID
          from dbo.REVENUEPAYMENTMETHOD
          where REVENUEID = @ID;


          -- remove revenueid from committed batches so deleting revenue records will not cause

          -- foreign key constraint errors

          if exists (select 'x' from batchrevenue where REVENUEID = @ID)
          begin
            declare @ISINACTIVEBATCH bit;

            set @ISINACTIVEBATCH = 0;

            select top 1 @ISINACTIVEBATCH = 1
            from BATCHREVENUE
            inner join BATCH on BATCH.ID = BATCHREVENUE.BATCHID
            where BATCHREVENUE.REVENUEID = @ID
            and BATCH.STATUSCODE not in (1,2);

            if @ISINACTIVEBATCH = 0
            begin
              update BATCHREVENUE
              set REVENUEID = null
              where REVENUEID = @ID;
            end
          end



          --Deletion rules for payment

          -- 1) Cannot delete a payment if there is a matching gift attached to any of its details

          -- 2) Also delete a payment if there is a deleted matching gift attached

          if (select count(FINANCIALTRANSACTION.ID) 
            from dbo.FINANCIALTRANSACTION
            inner join dbo.REVENUEMATCHINGGIFT on REVENUEMATCHINGGIFT.MGSOURCEREVENUEID = FINANCIALTRANSACTION.ID                            
            where FINANCIALTRANSACTION.ID = @ID
                and FINANCIALTRANSACTION.DELETEDON is null
            and exists(select 1 from FINANCIALTRANSACTION where ID =REVENUEMATCHINGGIFT.ID and DELETEDON is null)) > 0
          begin
            raiserror('There are matching gift claims against this payment. Delete those matching gift claims before deleting this payment.', 13, 1);
            return 0;
          end

          --if there is an unclaimed gift aid refund this needs dealt with before deletion

          if exists(select top 1 dbo.FINANCIALTRANSACTION.ID
            from dbo.FINANCIALTRANSACTION
              inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID=FINANCIALTRANSACTION.ID
              inner join dbo.REVENUESPLITGIFTAIDREFUND on REVENUESPLITGIFTAIDREFUND.REVENUESPLITID=FINANCIALTRANSACTIONLINEITEM.ID
            where REVENUESPLITGIFTAIDREFUND.REFUNDTAXCLAIMNUMBER =''
              and FINANCIALTRANSACTION.ID=@ID)
          begin
            raiserror('BBERR_REVENUE_ASSOCIATEDOUTSTANDINGGIFTAIDREFUND', 13, 1);
            return 0;
          end

          --Deletion rules for Pledge

          if (@TRANSACTIONTYPECODE in (1, 3, 4, 6, 15)) --Pledge, matching gift claim, planned gift, grant award, membership installment plan

          begin
            -- 1) Cannot delete a pledge if there are payments made against it                        

            if exists (select 1 
              from dbo.INSTALLMENTSPLITPAYMENT IP
                inner join dbo.FINANCIALTRANSACTION PLEDGERD on IP.PLEDGEID = PLEDGERD.ID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM PAYRD on IP.PAYMENTID = PAYRD.ID
              where PLEDGERD.ID = @ID and PAYRD.DELETEDON is null and PAYRD.TYPECODE != 1
            )
            begin
              if @TRANSACTIONTYPECODE = 1
                raiserror('There are payments made against this pledge. Delete those payments before deleting this pledge.', 13, 1);
              if @TRANSACTIONTYPECODE = 3
                raiserror('There are payments made against this matching gift claim. Delete those payments before deleting this matching gift claim.', 13, 1);
              if @TRANSACTIONTYPECODE = 4
                raiserror('There are payments made against this planned gift. Delete those payments before deleting this planned gift.', 13, 1);
              if @TRANSACTIONTYPECODE = 6
                raiserror('There are payments made against this grant award. Delete those payments before deleting this grant award.', 13, 1);
              if @TRANSACTIONTYPECODE = 15
                raiserror('There are payments made against this membership installment plan. Delete those payments before deleting this plan.', 13, 1);
            end

            exec dbo.USP_ADJUSTMENTHISTORY_WRITEOFFS_FIXFORDELETE @ID, @CHANGEAGENTID, @CHANGEDATE;

            -- Delete unposted write-off distributions.

            delete from dbo.WRITEOFFGLDISTRIBUTION where ID in (
              select WRITEOFFGLDISTRIBUTION.ID
              from dbo.WRITEOFFGLDISTRIBUTION
              inner join dbo.GLTRANSACTION on WRITEOFFGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              where WRITEOFFGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE <> 0
            );

            -- also delete the  INSTALLMENTSPLITWRITEOFF  wi 328761                    

            delete T1 from 
            dbo.INSTALLMENTSPLITWRITEOFF T1 join dbo.FINANCIALTRANSACTION T2 on T1.WRITEOFFID = T2.ID
            where T2.POSTSTATUSCODE != 2  and T2.PARENTID =  @ID;          

            -- 2) Log reversals for any posted writeoffs this pledge may have

            if not exists (select ADJ.ID from dbo.WRITEOFFADJUSTMENT ADJ inner join dbo.WRITEOFF WO on ADJ.WRITEOFFID = WO.ID where WO.REVENUEID = @ID and ADJ.POSTSTATUSCODE > 0)
            begin
              select top 1 @POSTDATE = WRITEOFFADJUSTMENT.POSTDATE from dbo.WRITEOFFADJUSTMENT 
              inner join dbo.WRITEOFF on WRITEOFFADJUSTMENT.WRITEOFFID = WRITEOFF.ID
              where WRITEOFF.REVENUEID = @ID and WRITEOFFADJUSTMENT.POSTSTATUSCODE = 0 order by WRITEOFFADJUSTMENT.DATEADDED desc

              if @POSTDATE is null
                select @POSTDATE = POSTDATE from dbo.WRITEOFF where REVENUEID = @ID;
              if @POSTDATE is not null
              begin
                set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);
                if @ERRORMESSAGE <> ''
                  raiserror(@ERRORMESSAGE, 13, 1);
              end

              --Log reversals in the GLTRANSACTION table

              exec dbo.USP_GLTRANSACTION_ADDWRITEOFFREVERSALS_BYREVENUEID @ID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;
            end
            else --Update the post date of the existing write-off reversal rows to today's date

            begin
              update dbo.GLTRANSACTION
              set 
                POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CHANGEDATE
              where ID in (
                select
                  REVERSAL.ID
                from
                  dbo.WRITEOFFGLDISTRIBUTION
                inner join 
                  dbo.GLTRANSACTION on WRITEOFFGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                inner join 
                  dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
                where 
                  WRITEOFFGLDISTRIBUTION.REVENUEID = @ID
                and 
                  REVERSAL.POSTSTATUSCODE > 0);
            end

            -- 3) Log reversals for any posted unrealized gain/loss this pledge may have

            if exists (
              select UNREALIZEDGAINLOSSADJUSTMENT.ID 
              from dbo.UNREALIZEDGAINLOSSADJUSTMENT 
              where UNREALIZEDGAINLOSSADJUSTMENT.REVENUEID = @ID and UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE > 0
            )
            begin
              --Update the post date of the existing unrealized gain/loss reversal rows to today's date

              update dbo.GLTRANSACTION
              set 
                POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CHANGEDATE
              where ID in (
                select
                  REVERSAL.ID
                from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION
                  inner join dbo.GLTRANSACTION on UNREALIZEDGAINLOSSGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                  inner join dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
                where UNREALIZEDGAINLOSSGLDISTRIBUTION.REVENUEID = @ID
                  and REVERSAL.POSTSTATUSCODE > 0);
            end
            else 
            begin
              --Get post date off last posted adjustment or the revenue record.

              select top 1 @POSTDATE = UNREALIZEDGAINLOSSADJUSTMENT.POSTDATE 
              from dbo.UNREALIZEDGAINLOSSADJUSTMENT 
              where UNREALIZEDGAINLOSSADJUSTMENT.REVENUEID = @ID 
                and UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE = 0 
              order by UNREALIZEDGAINLOSSADJUSTMENT.DATEADDED desc

              if @POSTDATE is null
                select @POSTDATE = POSTDATE 
                from dbo.FINANCIALTRANSACTION
                where ID = @ID;

              if @POSTDATE is not null
              begin
                set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);

                if @ERRORMESSAGE <> ''
                begin
                  raiserror(@ERRORMESSAGE, 13, 1);
                  return 1;
                end
              end

              --Log reversals in the GLTRANSACTION table

              exec dbo.USP_GLTRANSACTION_ADDUNREALIZEDGAINLOSSREVERSALS @ID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;
            end


            --REVISIT

            --Pick one of the newly created GLTRANSACTION reversal rows since they will all get posted together

            update dbo.ADJUSTMENTHISTORYWRITEOFF
            set ADJUSTMENTHISTORYWRITEOFF.GLTRANSACTIONID = (
               select top 1 REVERSAL.ID from JOURNALENTRY
               inner join dbo.JOURNALENTRY_EXT ON JOURNALENTRY.ID = JOURNALENTRY_EXT.ID and JOURNALENTRY_EXT.TABLENAMECODE = 12
               inner join JOURNALENTRY_EXT REVERSAL on JOURNALENTRY_EXT.ID = REVERSAL.REVERSEDGLTRANSACTIONID
               inner join dbo.FINANCIALTRANSACTIONLINEITEM ON JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
               inner join dbo.FINANCIALTRANSACTION ON FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
               where isnull(JOURNALENTRY_EXT.LOGICALREVENUEID, FINANCIALTRANSACTION.PARENTID) = @ID
               order by REVERSAL.DATEADDED desc)
            where ADJUSTMENTHISTORYWRITEOFF.DATEADDED = @CHANGEDATE;

          end

          --Deletion rules for Recurring Gift

          -- 1) Cannot delete a Recurring Gift if there are payments made against it

          -- 2) Cannot delete a Recurring Gift that is marked as pending (because a gift in a batch somewhere references it).

          if @TRANSACTIONTYPECODE = 2                        
            begin
              if (select count(ID) from dbo.RECURRINGGIFTACTIVITY where SOURCEREVENUEID = @ID and not PAYMENTREVENUEID is null) > 0 
              begin
                raiserror('There are payments made against this recurring gift. Delete those payments before deleting this recurring gift.', 13, 1);
                return 0;
              end

              if (select ISPENDING from dbo.REVENUESCHEDULE where ID = @ID) = 1
              begin
                raiserror('There are pending transactions for this recurring gift in one or more revenue batches. Delete those pending transactions before deleting this recurring gift.', 13, 1);
                return 0;
              end
      end


          /* if the payment method is sold stock/gift-in-kind/property and at least one other revenue exists for this payment, 
             create adjustments for the other revenue items so that broker fee and gain/loss information can be recalculated */
          if (@PAYMENTMETHODCODE = 4 and exists(select ID from dbo.STOCKSALE where STOCKDETAILID = @REVENUEPAYMENTMETHODID)) or 
            (@PAYMENTMETHODCODE = 5 and exists(select ID from dbo.PROPERTYDETAIL where ID = @REVENUEPAYMENTMETHODID and ISSOLD = 1)) or
             (@PAYMENTMETHODCODE = 6 and exists(select ID from dbo.GIFTINKINDSALE where GIFTINKINDPAYMENTMETHODDETAILID = @REVENUEPAYMENTMETHODID))
          begin
            declare @ADJUSTMENTDATE datetime;
            declare @ADJUSTMENTPOSTDATE datetime;
            declare @ADJUSTMENTREASON nvarchar(300);

            --use existing unposted adjustment values if present

            select top 1 
              @ADJUSTMENTDATE = coalesce(ADJUSTMENT.DATE, dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE)),
              @ADJUSTMENTPOSTDATE = coalesce(ADJUSTMENT.POSTDATE, dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE)),
              @ADJUSTMENTREASON = coalesce(ADJUSTMENT.REASON, 'Deleting revenue')
            from dbo.FINANCIALTRANSACTION
            left outer join dbo.ADJUSTMENT
              on FINANCIALTRANSACTION.ID = ADJUSTMENT.REVENUEID and ADJUSTMENT.POSTSTATUSCODE > 0
            where FINANCIALTRANSACTION.ID = @ID

          end

          --Deletion rules for auction item

          if (@TRANSACTIONTYPECODE = 7)
          begin
            -- 1) Cannot delete an auction item if it was purchased

            if exists(select 1 from dbo.AUCTIONITEM left join dbo.AUCTIONITEMREVENUEPURCHASE on AUCTIONITEM.ID = AUCTIONITEMREVENUEPURCHASE.AUCTIONITEMID where REVENUEAUCTIONDONATIONID = @ID and AUCTIONITEMREVENUEPURCHASE.REVENUEPURCHASEID is not null)
              raiserror('Purchased auction items cannot be deleted.', 13, 1);

            exec dbo.USP_ADJUSTMENTHISTORY_WRITEOFFS_FIXFORDELETE @ID, @CHANGEAGENTID, @CHANGEDATE;

            -- 2) Log reversals for any posted writeoffs this auction item may have

            if not exists (select ADJ.ID from dbo.WRITEOFFADJUSTMENT ADJ inner join dbo.WRITEOFF WO on ADJ.WRITEOFFID = WO.ID where WO.REVENUEID = @ID and ADJ.POSTSTATUSCODE > 0)
            begin
              select top 1 
                @POSTDATE = WRITEOFFADJUSTMENT.POSTDATE 
              from 
                dbo.WRITEOFFADJUSTMENT 
                inner join dbo.WRITEOFF on WRITEOFFADJUSTMENT.WRITEOFFID = WRITEOFF.ID
              where 
                WRITEOFF.REVENUEID = @ID 
                and 
                WRITEOFFADJUSTMENT.POSTSTATUSCODE = 0 
              order by WRITEOFFADJUSTMENT.DATEADDED desc

              if @POSTDATE is null
                select @POSTDATE = POSTDATE 
                from dbo.WRITEOFF 
                where REVENUEID = @ID;

              if @POSTDATE is not null
              begin
                set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);
                if @ERRORMESSAGE <> ''
                  raiserror(@ERRORMESSAGE, 13, 1);
              end

              --make sure that the writeoff is actually posted before trying to create reversals for it 

              if exists(select ID from dbo.WRITEOFF where WRITEOFF.REVENUEID = @ID and WRITEOFF.POSTSTATUSCODE = 0)
                exec dbo.USP_GLTRANSACTION_ADDWRITEOFFREVERSALS_BYREVENUEID @ID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;
            end
            else --Update the post date of the existing write-off reversal rows to today's date

            begin
              update dbo.GLTRANSACTION
              set 
                POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CHANGEDATE
              where ID in (
                select
                  REVERSAL.ID
                from
                  dbo.WRITEOFFGLDISTRIBUTION
                  inner join 
                    dbo.GLTRANSACTION on WRITEOFFGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                  inner join 
                    dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
                  where 
                    WRITEOFFGLDISTRIBUTION.REVENUEID = @ID
                  and 
                    REVERSAL.POSTSTATUSCODE > 0
                );
            end

            --REVISIT

            --Pick one of the newly created GLTRANSACTION reversal rows since they will all get posted together

            update dbo.ADJUSTMENTHISTORYWRITEOFF
            set ADJUSTMENTHISTORYWRITEOFF.GLTRANSACTIONID = (
              select top 1 REVERSAL.ID from JOURNALENTRY
               inner join dbo.JOURNALENTRY_EXT ON JOURNALENTRY.ID = JOURNALENTRY_EXT.ID and JOURNALENTRY_EXT.TABLENAMECODE = 12
               inner join JOURNALENTRY_EXT REVERSAL on JOURNALENTRY_EXT.ID = REVERSAL.REVERSEDGLTRANSACTIONID
               inner join dbo.FINANCIALTRANSACTIONLINEITEM ON JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
               inner join dbo.FINANCIALTRANSACTION ON FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
               where isnull(JOURNALENTRY_EXT.LOGICALREVENUEID, FINANCIALTRANSACTION.PARENTID) = @ID
               order by REVERSAL.DATEADDED desc)
            where ADJUSTMENTHISTORYWRITEOFF.DATEADDED = @CHANGEDATE;

          end

          /* update REVENUE */

          -- 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 dbo.FINANCIALTRANSACTION
          set 
            BASEAMOUNT=0,
            TRANSACTIONAMOUNT = 0,
            ORGAMOUNT = 0,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CHANGEDATE
          where ID = @ID

          update dbo.REVENUE_EXT
          set 
              RECEIPTAMOUNT=0,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CHANGEDATE
          where ID = @ID

          /* update REVENUERECOGNITION */
          update REVENUERECOGNITION
          set AMOUNT = 0,
            CHANGEDBYID = @CHANGEAGENTID
          from dbo.REVENUERECOGNITION
          inner join dbo.FINANCIALTRANSACTIONLINEITEM
            on REVENUERECOGNITION.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
          where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID

          update dbo.RECOGNITIONCREDIT
          set AMOUNT=0,
            CHANGEDBYID = @CHANGEAGENTID
          from dbo.RECOGNITIONCREDIT
            inner join dbo.DONORCHALLENGEENCUMBERED on RECOGNITIONCREDIT.DONORCHALLENGEENCUMBEREDID = DONORCHALLENGEENCUMBERED.ID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM
              on DONORCHALLENGEENCUMBERED.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
            where 
              FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID and
              RECOGNITIONCREDIT.RECOGNITIONCREDITTYPECODE = 1;

          /*log the deletion for the adjusted revenue report*/
          exec dbo.USP_ADJUSTMENTHISTORY_REVENUE_FIXFORDELETE @ID, @CHANGEAGENTID, @CHANGEDATE, @ADJUSTMENTHISTORYID output;

          /* LOG REVERSALS */
          /*if there is an unposted adjustment, the reversal would already have been logged for that adjustment so don't do it again*/
          if (select count(ID) from dbo.ADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE > 0) = 0  
          begin
            set @POSTDATE = null
            select top 1 @POSTDATE = POSTDATE from dbo.ADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE = 0 order by DATEADDED desc;
            if @POSTDATE is null
              select @POSTDATE = POSTDATE from dbo.FINANCIALTRANSACTION where ID = @ID;
            set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);
            if @ERRORMESSAGE <> ''
              raiserror(@ERRORMESSAGE, 13, 1);

            --Log reversals in the GLTRANSACTION table                                work item 68564 

            exec dbo.USP_GLTRANSACTION_ADDREVENUEREVERSALS @ID, @CHANGEAGENTID, @CHANGEDATE --, @CHANGEDATE;


          end
          else --Update the post date of the existing revenue reversal rows to today's date

          begin
            update dbo.GLTRANSACTION
            set 
              POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CHANGEDATE,
              POSTSTATUSCODE = 1
            where ID in (
              select
                REVERSAL.ID
              from
                dbo.REVENUEGLDISTRIBUTION
              inner join 
                dbo.GLTRANSACTION on REVENUEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              inner join 
                dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
              where 
                REVENUEGLDISTRIBUTION.REVENUEID = @ID
              and 
                REVERSAL.POSTSTATUSCODE > 0);

          end

    if exists(select 1 from dbo.PLANNEDGIFTPAYOUT where REVENUEID = @ID)
      and not exists(select 1 from dbo.PLANNEDGIFTPAYOUTADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE > 0)
          begin
            set @POSTDATE = null
            select top 1 @POSTDATE = POSTDATE from dbo.PLANNEDGIFTPAYOUTADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE = 0 order by DATEADDED desc;
            if @POSTDATE is null
              select @POSTDATE = POSTDATE from dbo.FINANCIALTRANSACTION where ID = @ID;
            set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);
            if @ERRORMESSAGE <> ''
              raiserror(@ERRORMESSAGE, 13, 1);

            exec dbo.USP_GLTRANSACTION_ADDPAYOUTREVERSALS @ID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;
          end
          else --Update the post date of the existing revenue reversal rows to today's date

          begin
            update dbo.GLTRANSACTION
            set 
              POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CHANGEDATE
            where ID in (
              select
                REVERSAL.ID
              from
                dbo.PLANNEDGIFTPAYOUTGLDISTRIBUTION
              inner join 
                dbo.GLTRANSACTION on PLANNEDGIFTPAYOUTGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              inner join 
               dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
              where 
                PLANNEDGIFTPAYOUTGLDISTRIBUTION.REVENUEID = @ID
              and 
                REVERSAL.POSTSTATUSCODE > 0);                            
          end        

          --Update the new ADJUSTMENTHISTORY record with one of the newly created GLTRANSACTION reversal IDs

          update dbo.ADJUSTMENTHISTORY
          set GLTRANSACTIONID = (
            select top 1 REVERSAL.ID  from JOURNALENTRY
            inner join dbo.JOURNALENTRY_EXT ON JOURNALENTRY.ID = JOURNALENTRY_EXT.ID and JOURNALENTRY_EXT.TABLENAMECODE = 1
            inner join JOURNALENTRY_EXT REVERSAL on JOURNALENTRY_EXT.ID = REVERSAL.REVERSEDGLTRANSACTIONID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM ON JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
            inner join dbo.FINANCIALTRANSACTION ON FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
            where FINANCIALTRANSACTION.DELETEDON IS NULL and FINANCIALTRANSACTION.ID = @ID
            order by REVERSAL.DATEADDED desc)
          where ID = @ADJUSTMENTHISTORYID;

          if (@PAYMENTMETHODCODE = 5) and exists(select ID from dbo.PROPERTYDETAIL where ID = @REVENUEPAYMENTMETHODID and ISSOLD = 1) --Sold property

          begin

            exec dbo.USP_ADJUSTMENTHISTORY_PROPERTY_FIXFORDELETE @REVENUEPAYMENTMETHODID, 0, @CHANGEAGENTID, @CHANGEDATE, @ADJUSTMENTHISTORYPROPERTYID output;

            --If there is no unposted property detail adjustment but the property sale has been posted, create reversals for the property sale.

            if 
              (select count(ID) from dbo.PROPERTYDETAILADJUSTMENT where PROPERTYDETAILID = @REVENUEPAYMENTMETHODID and POSTSTATUSCODE > 0) = 0
              and 
              exists
              (
                select 1 from dbo.PROPERTYDETAILGLDISTRIBUTION 
                inner join dbo.GLTRANSACTION on PROPERTYDETAILGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                where PROPERTYDETAILGLDISTRIBUTION.PROPERTYDETAILID = @REVENUEPAYMENTMETHODID and GLTRANSACTION.POSTSTATUSCODE = 0
              )
            begin
              set @POSTDATE = null
              select top 1 @POSTDATE = POSTDATE from dbo.PROPERTYDETAILADJUSTMENT where PROPERTYDETAILID = @REVENUEPAYMENTMETHODID and POSTSTATUSCODE = 0 order by DATEADDED desc;
              if @POSTDATE is null
                select @POSTDATE = SALEPOSTDATE from dbo.PROPERTYDETAIL where ID = @REVENUEPAYMENTMETHODID;
              if @POSTDATE is not null
              begin
                set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);
                if @ERRORMESSAGE <> ''
                  raiserror(@ERRORMESSAGE, 13, 1);
              end

              --Log reversals in the GLTRANSACTION table

              exec dbo.USP_GLTRANSACTION_ADDPROPERTYDETAILREVERSALS @REVENUEPAYMENTMETHODID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;
            end
            else --Update the post date of the existing property detail reversal rows to today's date

            begin
              update dbo.GLTRANSACTION
              set 
                POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CHANGEDATE
              where ID in (
                select
                  REVERSAL.ID
                from
                  dbo.PROPERTYDETAILGLDISTRIBUTION
                inner join 
                  dbo.GLTRANSACTION on PROPERTYDETAILGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                inner join 
                  dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
                where 
                  PROPERTYDETAILGLDISTRIBUTION.REVENUEID = @ID
                and 
 REVERSAL.POSTSTATUSCODE > 0);
            end

            --Update the new ADJUSTMENTHISTORYPROPERTY record with one of the newly created GLTRANSACTION reversal IDs

            update dbo.ADJUSTMENTHISTORYPROPERTY
            set GLTRANSACTIONID = (
              select top 1 REVERSAL.ID from dbo.PROPERTYDETAILGLDISTRIBUTION
              inner join dbo.GLTRANSACTION on PROPERTYDETAILGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              inner join dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
              where PROPERTYDETAILGLDISTRIBUTION.REVENUEID = @ID
              order by REVERSAL.DATEADDED desc)
            where ID = @ADJUSTMENTHISTORYPROPERTYID;
          end

          if @PAYMENTMETHODCODE = 4 and exists(select ID from dbo.STOCKSALE where STOCKDETAILID = @REVENUEPAYMENTMETHODID) --Sold stock

          begin
            exec dbo.USP_ADJUSTMENTHISTORY_STOCK_FIXFORDELETE @REVENUEPAYMENTMETHODID, 0, @CHANGEAGENTID, @CHANGEDATE, @ADJUSTMENTHISTORYSTOCKID output;

            -- Delete unposted stock detail distributions.

            delete from dbo.STOCKSALEGLDISTRIBUTION where ID in (
              select STOCKSALEGLDISTRIBUTION.ID
              from dbo.STOCKSALEGLDISTRIBUTION
              inner join dbo.GLTRANSACTION on STOCKSALEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              where STOCKSALEGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE <> 0
            );

            if (select count(STOCKSALEADJUSTMENT.ID) from dbo.STOCKSALEADJUSTMENT
              inner join dbo.STOCKSALE on STOCKSALEADJUSTMENT.STOCKSALEID = STOCKSALE.ID
              where STOCKSALE.STOCKDETAILID = @REVENUEPAYMENTMETHODID and POSTSTATUSCODE > 0) = 0
            begin
              set @POSTDATE = null
              select top 1 @POSTDATE = POSTDATE 
              from dbo.STOCKSALEADJUSTMENT
              inner join dbo.STOCKSALE on STOCKSALE.ID = STOCKSALEADJUSTMENT.STOCKSALEID
              where STOCKSALE.STOCKDETAILID = @REVENUEPAYMENTMETHODID and POSTSTATUSCODE = 0 
              order by STOCKSALEADJUSTMENT.DATEADDED desc;                
              if @POSTDATE is null
                select top 1 @POSTDATE = SALEPOSTDATE from dbo.STOCKSALE where STOCKDETAILID = @REVENUEPAYMENTMETHODID order by SALEDATE desc, DATEADDED desc;
              if @POSTDATE is not null
              begin
                set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);
                if @ERRORMESSAGE <> ''
                  raiserror(@ERRORMESSAGE, 13, 1);
              end

              --Log reversals in the GLTRANSACTION table

              exec dbo.USP_GLTRANSACTION_ADDSTOCKDETAILREVERSALS @REVENUEPAYMENTMETHODID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;                            
            end
            else --Update the post date of the existing stock detail reversal rows to today's date

            begin
              update dbo.GLTRANSACTION
              set 
                POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CHANGEDATE
              where ID in (
                select
                  REVERSAL.ID
                from
                  dbo.STOCKSALEGLDISTRIBUTION
                inner join 
                  dbo.GLTRANSACTION on STOCKSALEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                inner join 
                  dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
                where 
                  STOCKSALEGLDISTRIBUTION.REVENUEID = @ID
                and 
                  REVERSAL.POSTSTATUSCODE > 0);
            end

            --Update the new ADJUSTMENTHISTORYSTOCK record with one of the newly created GLTRANSACTION reversal IDs

            update dbo.ADJUSTMENTHISTORYSTOCK
            set GLTRANSACTIONID = (
              select top 1 REVERSAL.ID from dbo.STOCKSALEGLDISTRIBUTION
              inner join dbo.GLTRANSACTION on STOCKSALEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              inner join dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
              where STOCKSALEGLDISTRIBUTION.REVENUEID = @ID
              order by REVERSAL.DATEADDED desc)
            where ID = @ADJUSTMENTHISTORYSTOCKID;

          end

          if @PAYMENTMETHODCODE = 6
            while exists(
              select GIFTINKINDPAYMENTMETHODDETAIL.ID from dbo.GIFTINKINDPAYMENTMETHODDETAIL 
              inner join dbo.GIFTINKINDSALE on GIFTINKINDPAYMENTMETHODDETAIL.ID = GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID 
              where GIFTINKINDPAYMENTMETHODDETAIL.ID = @REVENUEPAYMENTMETHODID --Sold gift-in-kind

            )
            exec dbo.USP_RECORDOPERATION_GIFTINKINDSELLUNDO @REVENUEPAYMENTMETHODID, @CHANGEAGENTID

          --If there is no unposted benefit adjustment but the benefit has been posted, create reversals for the benefit.

          if (select count(ID) from dbo.BENEFITADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE > 0) = 0  
            and
            exists
            (
              select 1 from dbo.BENEFITGLDISTRIBUTION 
              inner join dbo.GLTRANSACTION on BENEFITGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              where BENEFITGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE = 0
            )
          begin
            set @POSTDATE = null
            select top 1 @POSTDATE = POSTDATE from dbo.BENEFITADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE = 0 order by DATEADDED desc;
            if @POSTDATE is null
              select @POSTDATE = POSTDATE from dbo.FINANCIALTRANSACTION where ID = @ID;
            set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);
            if @ERRORMESSAGE <> ''
              raiserror(@ERRORMESSAGE, 13, 1);

            exec dbo.USP_GLTRANSACTION_ADDBENEFITREVERSALS @ID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;
            exec dbo.USP_GLTRANSACTION_ADDBENEFITLIABILITYREVERSALS @ID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;
            exec dbo.USP_GLTRANSACTION_ADDBENEFITBACKOUTREVERSALS @ID, @CHANGEAGENTID, @CHANGEDATE, @POSTDATE;

          end
          else --Update the post date of the existing revenue reversal rows to today's date

          begin
            update dbo.GLTRANSACTION
            set 
              POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CHANGEDATE
            where ID in (
              select
                REVERSAL.ID
              from
                dbo.BENEFITGLDISTRIBUTION
              inner join 
                dbo.GLTRANSACTION on BENEFITGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              inner join 
                dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
              where 
                BENEFITGLDISTRIBUTION.REVENUEID = @ID
              and 
                REVERSAL.POSTSTATUSCODE > 0);                            
          end    

          --Update auction purchase distributions

          exec dbo.USP_AUCTIONPURCHASEDELETE_UPDATEGLDISTRIBUTION @ID, @CHANGEAGENTID, @CHANGEDATE

          if (select count(ID) from dbo.AUCTIONPURCHASEADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE > 0) <> 0  
          begin --Update the post date of the existing revenue reversal rows to today's date

            update dbo.GLTRANSACTION
            set 
              POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CHANGEDATE
            where ID in (
              select
                REVERSAL.ID
              from
                dbo.AUCTIONPURCHASEGLDISTRIBUTION
inner join 
                dbo.GLTRANSACTION on AUCTIONPURCHASEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              inner join 
                dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
              where 
                AUCTIONPURCHASEGLDISTRIBUTION.REVENUEPURCHASEID = @ID
              and 
                REVERSAL.POSTSTATUSCODE > 0);                            
          end

          /* Cache CONTEXT INFO */
          declare @CONTEXTCACHE varbinary(128);
          set @CONTEXTCACHE = CONTEXT_INFO();

          if not @CHANGEAGENTID is null
            set CONTEXT_INFO @CHANGEAGENTID;

          --Log reversals for any posted gift aid

          if exists (select 1 from dbo.GIFTAIDGLDISTRIBUTION where REVENUEID = @ID)
          begin
            -- Delete unposted gift aid distributions.

            delete from dbo.GIFTAIDGLDISTRIBUTION where ID in (
              select GIFTAIDGLDISTRIBUTION.ID
              from dbo.GIFTAIDGLDISTRIBUTION
              inner join dbo.GLTRANSACTION on GIFTAIDGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              where GIFTAIDGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE <> 0
            );

            declare @REVENUESPLITGIFTAIDID uniqueidentifier;

            declare GIFTAID_CURSOR cursor local fast_forward for
              select FINANCIALTRANSACTIONLINEITEM.ID from dbo.FINANCIALTRANSACTIONLINEITEM 
                inner join dbo.REVENUESPLITGIFTAID on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLITGIFTAID.ID
              where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
                and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null;

            open GIFTAID_CURSOR;
            fetch next from GIFTAID_CURSOR into @REVENUESPLITGIFTAIDID;

            while (@@FETCH_STATUS = 0)
            begin
              if dbo.UFN_REVENUESPLITGIFTAID_HASPENDINGADJUSTMENT(@REVENUESPLITGIFTAIDID) = 0
              begin
                set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@CHANGEDATE);
                if @ERRORMESSAGE <> ''
                  raiserror(@ERRORMESSAGE, 13, 1);

                --Log reversals in the GLTRANSACTION table

                exec dbo.USP_GLTRANSACTION_ADDGIFTAIDREVERSALS @REVENUESPLITGIFTAIDID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE;
              end
              else --Update the post date of the existing gift aid reversal rows to today's date

              begin
                update dbo.GLTRANSACTION
                set 
                  POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
                  CHANGEDBYID = @CHANGEAGENTID,
                  DATECHANGED = @CHANGEDATE
                where ID in (
                  select
                    REVERSAL.ID
                  from
                    dbo.GIFTAIDGLDISTRIBUTION
                  inner join 
                    dbo.GLTRANSACTION on GIFTAIDGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
                  inner join 
                    dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
                  where 
                    GIFTAIDGLDISTRIBUTION.REVENUESPLITGIFTAIDID = @REVENUESPLITGIFTAIDID
                  and 
                    REVERSAL.POSTSTATUSCODE > 0);
              end

              fetch next from GIFTAID_CURSOR into @REVENUESPLITGIFTAIDID;
            end

            close GIFTAID_CURSOR;
            deallocate GIFTAID_CURSOR;
          end

          -- Create gift fee reversals

          if (select count(ID) from dbo.GIFTFEEADJUSTMENT where REVENUEID = @ID and POSTSTATUSCODE > 0) = 0  
            and
            exists
            (
              select 1 from dbo.GIFTFEEGLDISTRIBUTION
              inner join dbo.GLTRANSACTION on GIFTFEEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              where GIFTFEEGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE = 0
            )
          begin
            set @POSTDATE = null

            select top 1 @POSTDATE = POSTDATE from dbo.GIFTFEEADJUSTMENT 
            where REVENUEID = @ID and POSTSTATUSCODE = 0 order by DATEADDED desc;

            if @POSTDATE is null
              select @POSTDATE = POSTDATE from dbo.FINANCIALTRANSACTION where ID = @ID;
            set @ERRORMESSAGE = dbo.UFN_GLDISTRIBUTION_VALIDPOSTDATE(@POSTDATE);
            if @ERRORMESSAGE <> ''
              raiserror(@ERRORMESSAGE, 13, 1);

            --Log reversals in the GLTRANSACTION table

            exec dbo.USP_GLTRANSACTION_ADDGIFTFEEREVERSALS @ID, @CHANGEAGENTID, @CHANGEDATE;                                                
          end
          else --Update the post date of the existing revenue reversal rows to today's date

          begin
            update dbo.GLTRANSACTION
            set 
              POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@CHANGEDATE),
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CHANGEDATE,
              POSTSTATUSCODE = 1
            where ID in (
              select
                REVERSAL.ID
              from dbo.GIFTFEEGLDISTRIBUTION
              inner join dbo.GLTRANSACTION on GIFTFEEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              inner join dbo.GLTRANSACTION REVERSAL on GLTRANSACTION.ID = REVERSAL.REVERSEDGLTRANSACTIONID
              where 
                GIFTFEEGLDISTRIBUTION.REVENUEID = @ID and 
                REVERSAL.POSTSTATUSCODE > 0);

          end

          --Delete unposted revenue distributions.

          delete from dbo.REVENUEGLDISTRIBUTION where ID in (
            select REVENUEGLDISTRIBUTION.ID
            from dbo.REVENUEGLDISTRIBUTION
            inner join dbo.GLTRANSACTION on REVENUEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
            where REVENUEGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE <> 0
          );

          delete from dbo.PLANNEDGIFTPAYOUTGLDISTRIBUTION where ID in (
            select PLANNEDGIFTPAYOUTGLDISTRIBUTION.ID
            from dbo.PLANNEDGIFTPAYOUTGLDISTRIBUTION
            inner join dbo.GLTRANSACTION on PLANNEDGIFTPAYOUTGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
            where PLANNEDGIFTPAYOUTGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE <> 0
          );

          --Delete unposted gift fee distributions

          delete from dbo.GIFTFEEGLDISTRIBUTION where ID in (
            select 
              GIFTFEEGLDISTRIBUTION.ID
            from dbo.GIFTFEEGLDISTRIBUTION
            inner join dbo.GLTRANSACTION on GIFTFEEGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
            where 
              GIFTFEEGLDISTRIBUTION.REVENUEID = @ID and 
              GLTRANSACTION.POSTSTATUSCODE <> 0
          );

          declare @RGINSTALLMENTSTOFIX table (ID uniqueidentifier);
          if @TRANSACTIONTYPECODE = 0
          begin

            -- Delete unposted property detail distributions.

            delete from dbo.PROPERTYDETAILGLDISTRIBUTION where ID in (
              select PROPERTYDETAILGLDISTRIBUTION.ID
              from dbo.PROPERTYDETAILGLDISTRIBUTION
              inner join dbo.GLTRANSACTION on PROPERTYDETAILGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              where PROPERTYDETAILGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE <> 0
            );

            -- Cache any recurring gifts to which this payment was applied; need to make updates to these.

            insert into @RGINSTALLMENTSTOFIX
            select distinct RECURRINGGIFTINSTALLMENT.REVENUEID
            from dbo.RECURRINGGIFTINSTALLMENTPAYMENT
            inner join dbo.RECURRINGGIFTINSTALLMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID
            where RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID = @ID;

            exec dbo.USP_RECURRINGGIFT_UNDOINSTALLMENTCHANGESONDELETEPAYMENT
              @PAYMENTID = @ID,
              @CHANGEAGENTID = @CHANGEAGENTID,
              @CURRENTDATE = @CHANGEDATE

            --Remove the link to any event registration payments

            delete dbo.EVENTREGISTRANTPAYMENT
            where EVENTREGISTRANTPAYMENT.PAYMENTID in (select FINANCIALTRANSACTIONLINEITEM.ID from dbo.FINANCIALTRANSACTIONLINEITEM where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID);
          end

          if @TRANSACTIONTYPECODE in (1,4,6,15) --Pledge, planned gift, grant award, membership installment plan

          begin                    
            --Delete unposted unrealized gain/loss distributions.

            delete from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION where ID in (
              select UNREALIZEDGAINLOSSGLDISTRIBUTION.ID
              from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION
                inner join dbo.GLTRANSACTION on UNREALIZEDGAINLOSSGLDISTRIBUTION.GLTRANSACTIONID = GLTRANSACTION.ID
              where UNREALIZEDGAINLOSSGLDISTRIBUTION.REVENUEID = @ID and GLTRANSACTION.POSTSTATUSCODE <> 0
            );
          end

          if @TRANSACTIONTYPECODE = 7
          begin
            --Delete the auction item information in REVENUEAUCTIONDONATION

            delete dbo.REVENUEAUCTIONDONATION
            where ID = @ID;
          end

          /* DELETE RECURRING GIFT ACTIVITY */
          delete RECURRINGGIFTACTIVITY
          from dbo.RECURRINGGIFTACTIVITY 
          inner join dbo.FINANCIALTRANSACTIONLINEITEM
            on FINANCIALTRANSACTIONLINEITEM.ID = RECURRINGGIFTACTIVITY.PAYMENTREVENUEID
          where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
            and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null

          /* DELETE LINK TO PLANNED GIFT */
          delete from dbo.PLANNEDGIFTREVENUE
          where REVENUEID = @ID;

          delete from dbo.PLANNEDGIFTPAYOUT
          where REVENUEID = @ID;

          delete from dbo.PLANNEDGIFTADDITIONREVENUE
          where REVENUEID = @ID;

          -- Delete link to Opportunity.  Even though the FK is set to cascade delete, this is still

          -- necessary since posted revenue will be soft-deleted by having its DELETEDON field set.                    

          delete from dbo.REVENUEOPPORTUNITY
          where 
            ID in 
            (    
              select
                ID
              from dbo.FINANCIALTRANSACTIONLINEITEM
              where
                FINANCIALTRANSACTIONID = @ID
            )

          -- delete the linked sponsorship payment.  Same reason as for revenueopportunity delete

          delete from dbo.SPONSORSHIPPAYMENT
          where
            ID in
            (
              select
                ID
              from dbo.FINANCIALTRANSACTIONLINEITEM
              where
                FINANCIALTRANSACTIONID = @ID
            )

          --Remove all encumbered funds that are not currently matched

          delete DCE 
          from dbo.DONORCHALLENGEENCUMBERED DCE
          inner join dbo.FINANCIALTRANSACTIONLINEITEM
            on DCE.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
          where
            FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID and
            DCE.STATUSTYPECODE <> 1;

          -- Delete link to revenue funding request

          delete from dbo.REVENUEFUNDINGREQUEST
          where ID = @ID;

          /* Restore CONTEXT INFO */
          if not @CONTEXTCACHE is null
            set CONTEXT_INFO @CONTEXTCACHE;

          exec dbo.USP_REVENUE_CREATEREFUNDSONDELETE @ID, @CHANGEAGENTID

          /* delete posted writeoffs */
          if exists (select 1 from dbo.FINANCIALTRANSACTION left join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
              where ((FINANCIALTRANSACTION.POSTSTATUSCODE = 2 and FINANCIALTRANSACTION.DELETEDON is null)
                or (FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE = 2 and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null))
              and FINANCIALTRANSACTION.PARENTID = @ID)
          begin
            while exists (select 1 from dbo.FINANCIALTRANSACTION where TYPECODE = 20 and POSTSTATUSCODE = 2 and DELETEDON is null and PARENTID = @ID)
            begin
              declare @WRITEOFFID uniqueidentifier = (select top 1 ID from dbo.FINANCIALTRANSACTION where TYPECODE = 20 and POSTSTATUSCODE = 2 and DELETEDON is null and PARENTID = @ID)
              exec dbo.USP_WRITEOFF_DELETEPOSTED @WRITEOFFID, @CHANGEAGENTID
            end
          end

          -- Delete any CRM refund records

          declare @REFUNDS table (ID uniqueidentifier);
          insert into @REFUNDS select CREDITID from dbo.CREDITPAYMENT where REVENUEID = @ID

          if exists(select 1 from @REFUNDS
          begin
              delete from dbo.CREDITPAYMENT where CREDITID in (select id from @REFUNDS);
              delete from dbo.FINANCIALTRANSACTION where id in (select id from @REFUNDS);
          end

          if not @CHANGEAGENTID is null
            set CONTEXT_INFO @CHANGEAGENTID;

          /* delete revenue */
          -- replacing USP_REVENUE_DELETEBYID_WITHCHANGEAGENTID with instead of delete trigger logic on revenue view (excluding statements for non-posted revenue)

          -- new financial transaction types are not picked up with delete against review view


          --deleting split payments (there is a check for split payments for several revenue types under "Deletion rules for Pledge" which will cause the record op to fail if they exist. Still, I'm keeping this delete in place as it is the existing behavior (for other revenue types?)).

          delete INSTALLMENTSPLITPAYMENT
          from dbo.INSTALLMENTSPLITPAYMENT
          inner join dbo.FINANCIALTRANSACTIONLINEITEM on INSTALLMENTSPLITPAYMENT.PAYMENTID = FINANCIALTRANSACTIONLINEITEM.ID
          where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID

          --Stock, Gift in kind

          merge dbo.FINANCIALTRANSACTION as target
          using (
            select FT.ID, FT.POSTSTATUSCODE 
            from dbo.FINANCIALTRANSACTION FT 
            where FT.PARENTID = @ID and FT.TYPECODE in (21,27)
          ) as source
          on (target.ID = source.ID)
          when matched and source.POSTSTATUSCODE = 2
            then 
              update set
              target.DELETEDON = @CHANGEDATE,
              target.CHANGEDBYID = @CHANGEAGENTID,
              target.DATECHANGED = @CHANGEDATE
          when matched
            then delete;

          --Sold stock

          merge dbo.FINANCIALTRANSACTION as target
          using (
              select top 1 FT.ID, 
              FT.POSTSTATUSCODE,
              FTLI.POSTSTATUSCODE as HASADJUSTMENT
            from dbo.FINANCIALTRANSACTION FT 
            left outer join FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.FINANCIALTRANSACTIONID = FT.ID and FTLI.POSTSTATUSCODE = 2
            where FT.PARENTID = @ID and FT.TYPECODE in (22)
          ) as source
          on (target.ID = source.ID)
          when matched and (source.POSTSTATUSCODE = 2 or source.HASADJUSTMENT = 2)
            then 
              update set 
                target.DELETEDON = @CHANGEDATE,
                target.CHANGEDBYID = @CHANGEAGENTID,
                target.DATECHANGED = @CHANGEDATE
          when matched
            then delete;

          --Auction donation Write-off

          merge dbo.FINANCIALTRANSACTION as target
          using (
            select FT.ID, FT.POSTSTATUSCODE from dbo.FINANCIALTRANSACTION FT
            where FT.PARENTID = @ID and FT.TYPECODE = 20 and @TRANSACTIONTYPECODE = 7
          ) as source
          on (target.ID = source.ID)
          when matched and source.POSTSTATUSCODE = 2
            then 
              update set 
                target.DELETEDON = @CHANGEDATE,
                target.CHANGEDBYID = @CHANGEAGENTID,
                target.DATECHANGED = @CHANGEDATE
          when matched
            then delete;

          --Mark child splits deleted

          update dbo.FINANCIALTRANSACTIONLINEITEM
          set 
            DELETEDON = @CHANGEDATE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CHANGEDATE
          from dbo.FINANCIALTRANSACTION FT
          inner join dbo.FINANCIALTRANSACTIONLINEITEM on
            FT.id = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
          where FT.PARENTID = @ID

          --Mark transaction as deleted

          merge dbo.FINANCIALTRANSACTION as target
          using (
            select 
              FT2.ID,
              FT2.POSTSTATUSCODE,
              case
                when exists (
                  select FT3.POSTSTATUSCODE
                  from dbo.FINANCIALTRANSACTION as FT3 
                  where FT3.PARENTID = FT2.ID and FT3.POSTSTATUSCODE = 2 and FT3.TYPECODE != 26
                )
                  then 2
                else 0
              end as HASPOSTEDCHILD 
            from dbo.FINANCIALTRANSACTION as FT2 
            where FT2.ID = @ID
          ) as source
          on (target.ID = source.ID)
          when matched and (source.POSTSTATUSCODE = 2 or source.HASPOSTEDCHILD = 2)
            then 
              update set 
                target.DELETEDON = @CHANGEDATE,
                target.CHANGEDBYID = @CHANGEAGENTID,
                target.DATECHANGED = @CHANGEDATE
          when matched
            then delete;

          update dbo.FINANCIALTRANSACTIONLINEITEM
          set 
            DELETEDON = @CHANGEDATE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CHANGEDATE
          where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID

          delete from dbo.BANKACCOUNTDEPOSITPAYMENT where ID = @ID;

          if not @contextCache is null
            set CONTEXT_INFO @contextCache;

          -- Update RG installments

          declare @RGID uniqueidentifier;
          declare RGCURSOR cursor local fast_forward for
          select ID
          from @RGINSTALLMENTSTOFIX;

          open RGCURSOR;
          fetch next from RGCURSOR into @RGID;
          while @@FETCH_STATUS = 0
          begin
            exec dbo.USP_RECURRINGGIFT_DELETEFUTUREINSTALLMENTS @RGID, @CHANGEAGENTID;

          exec dbo.USP_RECURRINGGIFT_UPDATEREVENUESCHEDULE
            @REVENUEID = @RGID,
            @STATUSCHANGETYPECODE = 2,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @CURRENTDATETIME = @CHANGEDATE;

            fetch next from RGCURSOR into @RGID;
        end
        deallocate RGCURSOR;

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


        return 0;