USP_DATAFORMTEMPLATE_EDIT_PAYMENT7

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@DATE datetime IN
@AMOUNT money IN
@RECEIPTAMOUNT money IN
@REVENUESTREAMS xml IN
@SOURCECODE nvarchar(50) IN
@APPEALID uniqueidentifier IN
@BENEFITS xml IN
@BENEFITSWAIVED bit IN
@GIVENANONYMOUSLY bit IN
@MAILINGID uniqueidentifier IN
@CHANNELCODEID uniqueidentifier IN
@DONOTRECEIPT bit IN
@DONOTACKNOWLEDGE bit IN
@REFERENCE nvarchar(255) IN
@POSTSTATUSCODE tinyint IN
@POSTDATE datetime IN
@PAYMENTMETHODCODE tinyint IN
@OTHERPAYMENTMETHODCODEID uniqueidentifier IN
@CHECKDATE UDT_FUZZYDATE IN
@CHECKNUMBER nvarchar(20) IN
@REFERENCEDATE UDT_FUZZYDATE IN
@REFERENCENUMBER nvarchar(20) IN
@CARDHOLDERNAME nvarchar(255) IN
@CREDITCARDNUMBER nvarchar(4) IN
@CREDITTYPECODEID uniqueidentifier IN
@AUTHORIZATIONCODE nvarchar(20) IN
@EXPIRESON UDT_FUZZYDATE IN
@ISSUER nvarchar(100) IN
@NUMBEROFUNITS decimal(20, 3) IN
@SYMBOL nvarchar(25) IN
@MEDIANPRICE decimal(19, 4) IN
@GIFTINKINDSUBTYPECODEID uniqueidentifier IN
@PROPERTYSUBTYPECODEID uniqueidentifier IN
@CONSTITUENTACCOUNTID uniqueidentifier IN
@DIRECTDEBITRESULTCODE nvarchar(10) IN
@LOWPRICE decimal(19, 4) IN
@HIGHPRICE decimal(19, 4) IN
@GIFTINKINDITEMNAME nvarchar(100) IN
@GIFTINKINDDISPOSITIONCODE tinyint IN
@GIFTINKINDNUMBEROFUNITS int IN
@GIFTINKINDFAIRMARKETVALUE money IN
@DIRECTDEBITISREJECTED bit IN
@PERCENTAGEBENEFITS xml IN
@BASEEXCHANGERATEID uniqueidentifier IN
@EXCHANGERATE decimal(20, 8) IN
@ADJUSTMATCHINGGIFTCLAIMS tinyint IN
@CURRENTAPPUSERID uniqueidentifier IN
@UPDATEGIFTFEEOPTION tinyint IN
@UPDATETRIBUTEOPTION tinyint IN
@VALIDATETRIBUTES bit IN
@SALE_SALEDATE datetime IN
@SALE_SALEAMOUNT money IN
@SALE_BROKERFEES money IN
@SALE_GLPOSTDATE datetime IN
@SALE_GLPOSTSTATUS tinyint IN
@SALE_LOWPRICE decimal(19, 4) IN
@SALE_MEDIANPRICE decimal(19, 4) IN
@SALE_HIGHPRICE decimal(19, 4) IN
@SEPAMANDATEID uniqueidentifier IN
@BATCHROWID uniqueidentifier IN
@NUMBEROFUNITSSOLD decimal(20, 3) IN

Definition

Copy


      CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_PAYMENT7
        (
          @ID uniqueidentifier,
          @CHANGEAGENTID uniqueidentifier,
          @DATE datetime,
          @AMOUNT money,
          @RECEIPTAMOUNT money ,
          @REVENUESTREAMS xml ,
          @SOURCECODE nvarchar(50),
          @APPEALID uniqueidentifier,
          @BENEFITS xml,
          @BENEFITSWAIVED bit,
          @GIVENANONYMOUSLY bit,
          @MAILINGID uniqueidentifier,
          @CHANNELCODEID uniqueidentifier,
          @DONOTRECEIPT bit,
          @DONOTACKNOWLEDGE bit,
          @REFERENCE nvarchar(255),
          @POSTSTATUSCODE tinyint,
          @POSTDATE datetime,
          @PAYMENTMETHODCODE tinyint,
          @OTHERPAYMENTMETHODCODEID uniqueidentifier,
          @CHECKDATE dbo.UDT_FUZZYDATE,
          @CHECKNUMBER nvarchar(20),
          @REFERENCEDATE dbo.UDT_FUZZYDATE,
          @REFERENCENUMBER nvarchar(20),
          @CARDHOLDERNAME nvarchar(255),
          @CREDITCARDNUMBER nvarchar(4),
          @CREDITTYPECODEID uniqueidentifier,
          @AUTHORIZATIONCODE nvarchar(20),
          @EXPIRESON dbo.UDT_FUZZYDATE,
          @ISSUER nvarchar(100),
          @NUMBEROFUNITS decimal(20,3),
          @SYMBOL nvarchar(25),
          @MEDIANPRICE decimal(19,4),
          @GIFTINKINDSUBTYPECODEID uniqueidentifier,
          @PROPERTYSUBTYPECODEID uniqueidentifier,
          @CONSTITUENTACCOUNTID uniqueidentifier,
          @DIRECTDEBITRESULTCODE nvarchar(10),
          @LOWPRICE decimal(19,4),
          @HIGHPRICE decimal(19,4),
          @GIFTINKINDITEMNAME nvarchar(100),
          @GIFTINKINDDISPOSITIONCODE tinyint,
          @GIFTINKINDNUMBEROFUNITS int,
          @GIFTINKINDFAIRMARKETVALUE money,
          @DIRECTDEBITISREJECTED bit,
          @PERCENTAGEBENEFITS xml,
          @BASEEXCHANGERATEID uniqueidentifier = null,
          @EXCHANGERATE decimal(20,8) = null,
          @ADJUSTMATCHINGGIFTCLAIMS tinyint = null,
          @CURRENTAPPUSERID uniqueidentifier = null,
          @UPDATEGIFTFEEOPTION tinyint = null,
          @UPDATETRIBUTEOPTION tinyint = null,
          @VALIDATETRIBUTES bit = null,
          @SALE_SALEDATE datetime = null,
          @SALE_SALEAMOUNT money = null,
          @SALE_BROKERFEES money = null,
          @SALE_GLPOSTDATE datetime = null,
          @SALE_GLPOSTSTATUS tinyint = null,
          @SALE_LOWPRICE decimal(19,4) = 0,
          @SALE_MEDIANPRICE decimal(19,4) = 0,
          @SALE_HIGHPRICE decimal(19,4) = 0,
          @SEPAMANDATEID uniqueidentifier = null,
          @BATCHROWID uniqueidentifier = null,
          @NUMBEROFUNITSSOLD decimal(20,3) = null
        )
        as
        set nocount on;

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

        declare @CURRENTDATE datetime;
        set @CURRENTDATE = GetDate();

        declare @CLEARALLGLDISTRIBUTIONS bit;
        declare @CLEARREVENUEGLDISTRIBUTION bit;
        declare @CLEARSTOCKGLDISTRIBUTION bit;
        declare @CLEARGIFTINKINDGLDISTRIBUTION bit;        
        declare @CLEARBENEFITSGLDISTRIBUTION bit;
        declare @CLEARAUCTIONPURCHASEGLDISTRIBUTION bit;
        declare @CLEARGIFTFEEGLDISTRIBUTION bit;
        declare @STREAMCHANGED bit = 0;
        declare @SHOULDUPDATEGIFTFEE tinyint = 1;
        declare @CLEARPROPERTYSALEGLDISTRIBUTION bit;

        set @CLEARALLGLDISTRIBUTIONS = 0;
        set @CLEARREVENUEGLDISTRIBUTION = 0;
        set @CLEARSTOCKGLDISTRIBUTION = 0;
        set @CLEARGIFTINKINDGLDISTRIBUTION = 0;        
        set @CLEARBENEFITSGLDISTRIBUTION = 0;
        set @CLEARAUCTIONPURCHASEGLDISTRIBUTION = 0;
        set @CLEARGIFTFEEGLDISTRIBUTION = 0;
        set @CLEARPROPERTYSALEGLDISTRIBUTION = 0;

        declare  @EMPTYGUID uniqueidentifier = '00000000-0000-0000-0000-000000000000'

   declare @contextCache varbinary(128);

        --cache current context information

        set @contextCache = CONTEXT_INFO();

        --set CONTEXT_INFO to @CHANGEAGENTID

        set CONTEXT_INFO @CHANGEAGENTID;

        if @UPDATEGIFTFEEOPTION is null
          set @UPDATEGIFTFEEOPTION = 0;

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

          -- ####

          declare @PDACCOUNTSYSTEMID uniqueidentifier;
          select @PDACCOUNTSYSTEMID=PDACCOUNTSYSTEMID from dbo.PDACCOUNTSYSTEMFORREVENUE where ID = @ID;
          declare @ALLOWGLDISTRIBUTIONS bit;
          set @ALLOWGLDISTRIBUTIONS = dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID)
          if @ALLOWGLDISTRIBUTIONS = 0
            begin
              set @POSTSTATUSCODE = 2;    -- Do not post

              set @POSTDATE = null;
            end
          -- ####                


          if exists(select 1
                    from dbo.BANKACCOUNTTRANSACTION BAT
                    inner join dbo.BANKACCOUNTDEPOSITPAYMENT DP on BAT.ID = DP.DEPOSITID and DP.ID = @ID
                    where BAT.POSTSTATUSCODE != @POSTSTATUSCODE)
            raiserror('BBERR_POSTSTATUS_DIFFER_DEPOSIT', 13, 1);

          if @POSTSTATUSCODE = 0
            raiserror('You cannot edit a gift to post it.', 13, 1);

          declare @DONOTPOST bit;
          select @DONOTPOST = case when @POSTSTATUSCODE = 2 then 1 else 0 end;

          -- Bug 194561 - if it is an auction item, do not allow payment to be anything but cash, check, or credit card. Those are the only payment methods implemented in AMPro.

          -- If more methods are added, update the error message in Errors.resx.

          if @PAYMENTMETHODCODE not in (0, 1, 2) -- cash, check, credit card

          and exists
          (
            select
              APPLICATIONCODE
            from
              dbo.UFN_REVENUE_GETAPPLICATIONS_FROMXML(@REVENUESTREAMS)
            where
              APPLICATIONCODE = 12 -- auction purchase

          )
          begin
            raiserror('BBERR_AUCTIONITEM_PAYMENT_INVALIDPAYMENTMETHOD : The chosen payment method cannot be applied to an auction item purchase. The acceptable payment methods are Cash, Check, or Credit Card.', 13, 1);
            return 1;
          end

          declare @BASECURRENCYID uniqueidentifier;
          declare @TRANSACTIONCURRENCYID uniqueidentifier;
          declare @CONSTITUENTID uniqueidentifier;
          declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
          declare @ORIGINALCHANNELCODEID uniqueidentifier;
          declare @ORIGINALAPPEALID uniqueidentifier;

          select
            @BASECURRENCYID = isnull(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, CURRENCYSET.BASECURRENCYID),
            @TRANSACTIONCURRENCYID = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
            @CONSTITUENTID = FINANCIALTRANSACTION.CONSTITUENTID,
            @ORGANIZATIONEXCHANGERATEID = FINANCIALTRANSACTION.ORGEXCHANGERATEID,
            @ORIGINALCHANNELCODEID = REVENUE_EXT.CHANNELCODEID,
            @ORIGINALAPPEALID = REVENUE_EXT.APPEALID
          from
            dbo.FINANCIALTRANSACTION
            inner join
              dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
            inner join 
              dbo.PDACCOUNTSYSTEM on FINANCIALTRANSACTION.PDACCOUNTSYSTEMID = PDACCOUNTSYSTEM.ID
            inner join 
              dbo.CURRENCYSET on PDACCOUNTSYSTEM.CURRENCYSETID = CURRENCYSET.ID
          where
            FINANCIALTRANSACTION.ID = @ID
            and FINANCIALTRANSACTION.DELETEDON is null;

          declare @ORIGINALPAYMETHODID uniqueidentifier, @ORIGINALPAYMENTMETHODCODE tinyint, @ORIGINALGIFTINKINDSUBTYPECODEID uniqueidentifier,
            @ORIGINALCREDITTYPECODEID uniqueidentifier, @ORIGINALPROPERTYSUBTYPECODEID uniqueidentifier, @ORIGINALOTHERPAYMENTMETHODCODEID uniqueidentifier,
            @ORIGINALVENDORID nvarchar(50), @ORIGINALTRANSACTIONID uniqueidentifier;

          select
            @ORIGINALPAYMETHODID = RPM.ID,
            @ORIGINALPAYMENTMETHODCODE = PAYMENTMETHODCODE,
            @ORIGINALGIFTINKINDSUBTYPECODEID = GIFTINKINDSUBTYPECODEID,
            @ORIGINALCREDITTYPECODEID = CREDITTYPECODEID,
            @ORIGINALPROPERTYSUBTYPECODEID = PROPERTYSUBTYPECODEID,
            @ORIGINALOTHERPAYMENTMETHODCODEID = OTHERPAYMENTMETHODCODEID,
            @ORIGINALVENDORID = CCPMD.VENDORID,
            @ORIGINALTRANSACTIONID = CCPMD.TRANSACTIONID
          from
            dbo.REVENUEPAYMENTMETHOD RPM
            left outer join dbo.GIFTINKINDPAYMENTMETHODDETAIL GIKPMD on RPM.ID = GIKPMD.ID
            left outer join dbo.CREDITCARDPAYMENTMETHODDETAIL CCPMD on RPM.ID = CCPMD.ID
            left outer join dbo.PROPERTYDETAIL_EXT PD on RPM.ID = PD.ID
            left outer join dbo.OTHERPAYMENTMETHODDETAIL OPMD on RPM.ID = OPMD.ID
          where
            RPM.REVENUEID = @ID;

          -- check to see if post status or payment method has changed

          if not exists(
            select 1 from dbo.FINANCIALTRANSACTION FT
            where FT.ID = @ID 
            and ((@POSTSTATUSCODE = 2 and FT.POSTSTATUSCODE = 3) or (@POSTSTATUSCODE = 1 and FT.POSTSTATUSCODE!= 3))
          )
          or @ORIGINALPAYMENTMETHODCODE <> @PAYMENTMETHODCODE
          or @ORIGINALGIFTINKINDSUBTYPECODEID <> @GIFTINKINDSUBTYPECODEID
          or @ORIGINALCREDITTYPECODEID <> @CREDITTYPECODEID
          or @ORIGINALPROPERTYSUBTYPECODEID <> @PROPERTYSUBTYPECODEID
          or @ORIGINALOTHERPAYMENTMETHODCODEID <> @OTHERPAYMENTMETHODCODEID
          begin
            set @CLEARALLGLDISTRIBUTIONS = 1;
          end

          -- If the post status changed, update the stock and gift-in-kind sales' post status 

          -- for all sales that haven't posted

          declare @ORIGINALDONOTPOST bit
          select @ORIGINALDONOTPOST = case FINANCIALTRANSACTION.POSTSTATUSCODE when 3 then 1 else 0 end from dbo.FINANCIALTRANSACTION inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID where FINANCIALTRANSACTION.ID = @ID and FINANCIALTRANSACTION.DELETEDON is null
          if @ORIGINALDONOTPOST <> @DONOTPOST
          begin
            update FT set
              POSTSTATUSCODE = case @POSTSTATUSCODE when 0 then 2 when 1 then 1 when 2 then 3 end,
              POSTDATE = case when @POSTSTATUSCODE = 2 then null else @POSTDATE end,
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CURRENTDATE
            from dbo.STOCKSALE_EXT
            inner join dbo.FINANCIALTRANSACTION FT on STOCKSALE_EXT.ID = FT.ID
            where
              STOCKSALE_EXT.STOCKDETAILID = @ORIGINALPAYMETHODID and
              FT.POSTSTATUSCODE != 2;

            if not (@POSTSTATUSCODE = 2 or @POSTDATE is not null)
              raiserror ('CK_GIFTINKINDSALE_POSTDATE_REQUIRED', 16, 1);

            update FT set
              POSTSTATUSCODE = case @POSTSTATUSCODE when 0 then 2 when 1 then 1 when 2 then 3 end,
              POSTDATE = case when @POSTSTATUSCODE = 2 then null else @POSTDATE end,
              CHANGEDBYID = @CHANGEAGENTID,
              DATECHANGED = @CURRENTDATE
            from GIFTINKINDSALE_EXT
            inner join dbo.FINANCIALTRANSACTION FT on FT.ID = GIFTINKINDSALE_EXT.ID
            where
              GIFTINKINDSALE_EXT.GIFTINKINDPAYMENTMETHODDETAILID = @ORIGINALPAYMETHODID and
              FT.POSTSTATUSCODE != 2;              
          end

          declare @REVENUESTREAMGIFTFEE table (REVENUESTREAMGIFTFEEXML xml);
          insert into @REVENUESTREAMGIFTFEE 
          select @REVENUESTREAMS;

          -- Calculates number of designation associated with the Specific revenue from DB

          declare @DESIGNATIONSCOUNTFROMDB int = (select count(1
                                                     from dbo.REVENUESPLIT_EXT RE 
                                                   inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on RE.ID = FTLI.ID 
                                                  where FTLI.FINANCIALTRANSACTIONID = @ID and FTLI.DELETEDON is null);

          -- Compares number of designation associated with the specific revenue from DB with the designations passed in revenue stream.

          declare @DESIGNATIONSMATCHCOUNT int = (select count(1
                                                from @REVENUESTREAMGIFTFEE
                                                  CROSS APPLY REVENUESTREAMGIFTFEEXML.nodes('(REVENUESTREAMS/ITEM)') x(c)
                                                  inner join dbo.REVENUESPLIT_EXT RE on RE.DESIGNATIONID = c.value('(GIFTFIELDS/ITEM/DESIGNATIONID)[1]', 'uniqueidentifier')
                                                  inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on RE.ID = FTLI.ID and FTLI.BASEAMOUNT = c.value('(GIFTFIELDS/ITEM/RECOGNITIONS/ITEM/AMOUNT)[1]', 'decimal')
                                                where FTLI.FINANCIALTRANSACTIONID = @ID and FTLI.DELETEDON is null);

          /* Check if revenue streams changed */
          if @CLEARALLGLDISTRIBUTIONS = 0
            if dbo.UFN_CHECKDETAIL_STREAMSCHANGED(@ID, @REVENUESTREAMS) = 1
            begin
              set @CLEARALLGLDISTRIBUTIONS = 1;
              set @STREAMCHANGED = 1;
              -- check if there's a designation change. If DESIGNATIONSMATCHCOUNT = DESIGNATIONSCOUNTFROMDB, it denotes no change in designation else there's a change in designation

              if (@DESIGNATIONSMATCHCOUNT < @DESIGNATIONSCOUNTFROMDB)
                set @UPDATEGIFTFEEOPTION = 1;
              if @UPDATEGIFTFEEOPTION = 0
                set @SHOULDUPDATEGIFTFEE = dbo.UFN_REVENUE_SHOULDUPDATEGIFTFEE(@ID, @CONSTITUENTID, @PAYMENTMETHODCODE, @TRANSACTIONCURRENCYID, @BASECURRENCYID, @BASEEXCHANGERATEID, @ORGANIZATIONEXCHANGERATEID, @REVENUESTREAMS, @RECEIPTAMOUNT, @AMOUNT)
            end

          -- check to see if reference has changed

          if @CLEARALLGLDISTRIBUTIONS = 0
            if coalesce(
                (select REFERENCE from dbo.REVENUE_EXT 
                where ID = @ID), '') <> @REFERENCE
            begin
              set @CLEARALLGLDISTRIBUTIONS = 1;
            end

          -- if we aren't clearing all GL, check whether we need to clear the revenue GL

          -- check whether the post date, inbound channel, or appeal have been updated

          if 
            @CLEARALLGLDISTRIBUTIONS = 0 and
            (
              isnull(@ORIGINALCHANNELCODEID, @EMPTYGUID) <> isnull(@CHANNELCODEID, @EMPTYGUID) or
              isnull(@ORIGINALAPPEALID, @EMPTYGUID) <> isnull(@APPEALID, @EMPTYGUID) or
              not exists (
              select 1 from dbo.FINANCIALTRANSACTION FT 
              where FT.ID = @ID 
              and FT.POSTDATE = @POSTDATE 
            )
            )
            begin
              set @CLEARREVENUEGLDISTRIBUTION = 1;
            end

          declare @SALEDATE datetime
          declare @SALEAMOUNT money
          declare @BROKERFEE money
          declare @SALEPOSTDATE datetime
          declare @SALEPOSTSTATUSCODE tinyint

          if @PAYMENTMETHODCODE = 5
          begin
            --Fetch the original Property sale detail values

            select top 1
              @SALEDATE = PD.SALEDATE,
              @SALEAMOUNT = isnull(case PD.ISNEGATIVE when 0 then FT.TRANSACTIONAMOUNT else -1 * FT.TRANSACTIONAMOUNT end,0),
              @BROKERFEE = PD.BROKERFEE,
              @SALEPOSTDATE = cast(FT.POSTDATE as datetime),
              @SALEPOSTSTATUSCODE = isnull(cast(case FT.POSTSTATUSCODE when 2 then 0 when 1 then 1 when 3 then 2 end as tinyint), 2)
            from dbo.PROPERTYDETAIL_EXT PD
              inner join dbo.FINANCIALTRANSACTION FT on FT.ID = PD.ID
            where PD.ID = @ORIGINALPAYMETHODID and PD.SALEDATE is not null;

            if @SALE_SALEDATE is not null and  @SALE_SALEAMOUNT is not null and @SALE_GLPOSTDATE is not null and @SALE_GLPOSTSTATUS is not null
            begin
              --Reset property sale GL distribution when the any of the sale field changes

              if ((@SALEDATE is null and  @SALEAMOUNT is null and @SALEPOSTDATE is null and @SALEPOSTSTATUSCODE is null) or
                  (@SALEDATE <> @SALE_SALEDATE or @SALEAMOUNT <> @SALE_SALEAMOUNT or @BROKERFEE <> @SALE_BROKERFEES or @SALEPOSTDATE <> @SALE_GLPOSTDATE or @SALEPOSTSTATUSCODE <> @SALE_GLPOSTSTATUS)) and
                  exists (select 1 from dbo.PROPERTYDETAIL where PROPERTYDETAIL.ID = @ORIGINALPAYMETHODID)
               begin
                 set @CLEARPROPERTYSALEGLDISTRIBUTION = 1;
               end

               --Reset the property sale values based on the modified values

               set @SALEDATE = @SALE_SALEDATE;
               set @SALEAMOUNT = @SALE_SALEAMOUNT;  
               set @BROKERFEE = @SALE_BROKERFEES;
               set @SALEPOSTDATE = @SALE_GLPOSTDATE;
               set @SALEPOSTSTATUSCODE =  @SALE_GLPOSTSTATUS;
             end
          end

          -- Reset stock GL distribution when the number of units or median price changed

          if @PAYMENTMETHODCODE = 4
          begin
            declare @ORIGINALNUMBEROFUNITS decimal(20,3), @ORIGINALMEDIANPRICE decimal(19,4), @ORIGINALBASEEXCHANGERATEID uniqueidentifier
            select
              @ORIGINALNUMBEROFUNITS = NUMBEROFUNITS,
              @ORIGINALMEDIANPRICE = TRANSACTIONMEDIANPRICE,
              @ORIGINALBASEEXCHANGERATEID = BASEEXCHANGERATEID
            from
              dbo.STOCKDETAIL
            where
              ID = @ORIGINALPAYMETHODID;

            if (@ORIGINALNUMBEROFUNITS <> @NUMBEROFUNITS or @ORIGINALMEDIANPRICE <> @MEDIANPRICE or @ORIGINALBASEEXCHANGERATEID <> @BASEEXCHANGERATEID) and 
              exists (select 1 from dbo.STOCKSALE where STOCKDETAILID = @ORIGINALPAYMETHODID)
            begin
              set @CLEARSTOCKGLDISTRIBUTION = 1;
            end
          end

          -- Reset gift-in-kind GL distribution when the number of units or fair market value changed

          if @PAYMENTMETHODCODE = 6
          begin
            declare @ORIGINALGIKNUMBEROFUNITS int, @ORIGINALFAIRMARKETVALUE decimal(19,4), @ORIGINALGIKBASEEXCHANGERATEID uniqueidentifier
            select
              @ORIGINALGIKNUMBEROFUNITS = NUMBEROFUNITS,
              @ORIGINALFAIRMARKETVALUE = FAIRMARKETVALUE,
              @ORIGINALGIKBASEEXCHANGERATEID = BASEEXCHANGERATEID
            from
              dbo.GIFTINKINDPAYMENTMETHODDETAIL
            where
              ID = @ORIGINALPAYMETHODID;

            if (@ORIGINALGIKNUMBEROFUNITS <> @GIFTINKINDNUMBEROFUNITS or @ORIGINALFAIRMARKETVALUE <> @GIFTINKINDFAIRMARKETVALUE or @ORIGINALGIKBASEEXCHANGERATEID <> @BASEEXCHANGERATEID) and 
              exists (select 1 from dbo.GIFTINKINDSALE_EXT where GIFTINKINDPAYMENTMETHODDETAILID = @ORIGINALPAYMETHODID)
            begin
              set @CLEARGIFTINKINDGLDISTRIBUTION = 1;
            end
          end    

          -- Merge the benefit types

          -- update benefits

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

          if dbo.UFN_CHECKDETAIL_BENEFITSCHANGEDFORGL(@ID, @TOTALBENEFITS) = 1
            set @CLEARBENEFITSGLDISTRIBUTION = 1;

          if dbo.UFN_CHECKDETAIL_AUCTIONPURCHASESCHANGED(@ID,@REVENUESTREAMS) = 1
            set @CLEARAUCTIONPURCHASEGLDISTRIBUTION = 1;

          -- Determine whether or not the original or new payment has auction splits

          -- before the original payment's splits are changed

          declare @HASAUCTIONSPLITS bit = 0;
          if exists
            (
              -- Existing revenue streams or current revenue streams contain auction splits

              select top 1 ID from dbo.UFN_REVENUE_GETAPPLICATIONS(@ID) where APPLICATIONCODE = 12
              union
              select top 1 ID from dbo.UFN_REVENUE_GETAPPLICATIONS_FROMXML(@REVENUESTREAMS) where APPLICATIONCODE = 12
            )
            set @HASAUCTIONSPLITS = 1;

          -- Reset the gift fee GL distributions if the post status or payment method changed.

          -- Even though those changes are included in CLEARALLGLDISTRIBUTIONS, CLEARALLGLDISTRIBUTIONS

          -- isn't used to reset gift fees distributions since CLEARALLGLDISTRIBUTIONS will change them when they

          -- don't need to be changed.

          if (@DONOTPOST <> @ORIGINALDONOTPOST) or (@PAYMENTMETHODCODE <> @ORIGINALPAYMENTMETHODCODE)
            set @CLEARGIFTFEEGLDISTRIBUTION = 1;

          declare @OLDAUCTIONPURCHASES xml;
          --Remove conditional because we can't know yet if multicurrency fields will change, clearing GL distributions.

          --if @CLEARALLGLDISTRIBUTIONS = 1 or @CLEARAUCTIONPURCHASEGLDISTRIBUTION = 1

          set @OLDAUCTIONPURCHASES = (
            select AUCTIONITEM.ID as AUCTIONITEMID,AUCTIONITEM.REVENUEAUCTIONDONATIONID,REVENUESPLIT.ID,REVENUESPLIT.BASEAMOUNT as AMOUNT
            from dbo.AUCTIONITEM inner join dbo.AUCTIONITEMPURCHASE on AUCTIONITEM.ID = AUCTIONITEMPURCHASE.AUCTIONITEMID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESPLIT.ID = AUCTIONITEMPURCHASE.PURCHASEID
            inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
            where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.APPLICATIONCODE = 12 and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1
            for xml raw('ITEM'),type,elements,root('AUCTIONPURCHASES'),BINARY BASE64
          )

          declare @OLDGIFTAID xml;
          set @OLDGIFTAID = (
            select REVENUESPLIT.ID, REVENUESPLIT_EXT.DESIGNATIONID, coalesce(REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID, '00000000-0000-0000-0000-000000000000') as GLREVENUECATEGORYMAPPINGID, dbo.UFN_GIFTAIDREVENUESPLIT_GETQUALIFICATIONSTATUS(REVENUESPLIT.ID) as STATUS
            from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT 
            inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
            inner join dbo.REVENUESPLITGIFTAID on REVENUESPLIT.ID = REVENUESPLITGIFTAID.ID
            left join dbo.REVENUECATEGORY on REVENUESPLIT.ID = REVENUECATEGORY.ID
            where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1
            for xml raw('ITEM'),type,elements,root('GIFTAIDQUALIFICATIONSTATUS'),BINARY BASE64
          )

          declare @SPLITSDECLININGGIFTAID xml;
          declare @GIFTAIDSPONSORSHIPSPLITS xml;
          declare @OLDSPOTRATEID uniqueidentifier;

          --Track changes in amount and rates due to the edit because they might mean GL distributions need to be cleared.

          declare @OLDTRANSACTIONAMOUNT money;
          declare @OLDBASEAMOUNT money;
          declare @OLDORGANIZATIONAMOUNT money;
          declare @OLDBASEEXCHANGERATEID uniqueidentifier;
          declare @OLDORGANIZATIONEXCHANGERATEID uniqueidentifier;

          select
            @OLDTRANSACTIONAMOUNT = TRANSACTIONAMOUNT,
            @OLDBASEAMOUNT = BASEAMOUNT,
            @OLDORGANIZATIONAMOUNT = ORGAMOUNT,
            @OLDBASEEXCHANGERATEID = BASEEXCHANGERATEID,
            @OLDORGANIZATIONEXCHANGERATEID = ORGEXCHANGERATEID
          from dbo.FINANCIALTRANSACTION
          where ID = @ID;

          declare @TRIBUTEAMOUNT money;
          select @TRIBUTEAMOUNT = sum(AMOUNT) from dbo.REVENUETRIBUTE where REVENUEID = @ID;

          -- do not allow the gift amount to be adjusted less than the applied tribute amount

          if (@TRIBUTEAMOUNT is not null) and (@AMOUNT < @TRIBUTEAMOUNT) and (@UPDATETRIBUTEOPTION = 0) and (@VALIDATETRIBUTES = 1)
          begin
            raiserror('The payment amount cannot be less than the sum of the tribute amounts applied to this payment.', 13, 1)
          end

          if @UPDATETRIBUTEOPTION = 1
          begin
            declare @TRIBUTES table
            (
              TRIBUTEID uniqueidentifier,
              AMOUNT money,
              DESIGNATIONID uniqueidentifier,
              SEQUENCE int,
              REVENUETRIBUTEID uniqueidentifier,
              BASECURRENCYID uniqueidentifier,
              ORGANIZATIONAMOUNT money,
              ORGANIZATIONEXCHANGERATEID uniqueidentifier
            );
            insert into @TRIBUTES 
            select TRIBUTEID, AMOUNT, DESIGNATIONID, SEQUENCE, REVENUETRIBUTEID, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID
              from dbo.UFN_REVENUE_GETTRIBUTESFORAMOUNT(@ID, @AMOUNT, @BASEEXCHANGERATEID, @EXCHANGERATE)

            update dbo.REVENUETRIBUTE
            set 
              REVENUETRIBUTE.AMOUNT = TRIBUTES.AMOUNT,
              REVENUETRIBUTE.ORGANIZATIONAMOUNT = TRIBUTES.ORGANIZATIONAMOUNT,
              REVENUETRIBUTE.ORGANIZATIONEXCHANGERATEID = TRIBUTES.ORGANIZATIONEXCHANGERATEID,
              REVENUETRIBUTE.CHANGEDBYID = @CHANGEAGENTID,
              REVENUETRIBUTE.DATECHANGED = @CURRENTDATE
            from dbo.REVENUETRIBUTE
              inner join @TRIBUTES TRIBUTES on TRIBUTES.REVENUETRIBUTEID = REVENUETRIBUTE.ID
          end

          exec dbo.USP_PAYMENT_EDIT_4
            @ID=@ID,
            @CHANGEAGENTID =@CHANGEAGENTID,
            @CURRENTDATE =@CURRENTDATE,
            @DATE =@DATE,
            @AMOUNT =@AMOUNT,
            @RECEIPTAMOUNT =@RECEIPTAMOUNT,
            @REVENUESTREAMS =@REVENUESTREAMS,
            @SOURCECODE =@SOURCECODE,
            @APPEALID =@APPEALID,
            @BENEFITS =@BENEFITS,
            @BENEFITSWAIVED =@BENEFITSWAIVED,
            @GIVENANONYMOUSLY =@GIVENANONYMOUSLY,
            @MAILINGID =@MAILINGID,
            @CHANNELCODEID =@CHANNELCODEID,
            @DONOTRECEIPT =@DONOTRECEIPT,
            @REFERENCE =@REFERENCE,
            @DONOTACKNOWLEDGE =@DONOTACKNOWLEDGE,
            @SPLITSDECLININGGIFTAID =@SPLITSDECLININGGIFTAID output,
            @PERCENTAGEBENEFITS = @PERCENTAGEBENEFITS output,
            @GIFTAIDSPONSORSHIPSPLITS = @GIFTAIDSPONSORSHIPSPLITS output,
            @BASEEXCHANGERATEID = @BASEEXCHANGERATEID output,
            @EXCHANGERATE = @EXCHANGERATE,
            @OLDSPOTRATEID = @OLDSPOTRATEID output,
            @CURRENTAPPUSERID  = @CURRENTAPPUSERID,
            @BENEFITSADJUSTMENTID = null,
            @ORIGINALPAYMETHODID = @ORIGINALPAYMETHODID,
            @PAYMENTMETHODCODE = @PAYMENTMETHODCODE
            @CHECKDATE = @CHECKDATE
            @CHECKNUMBER = @CHECKNUMBER
            @CONSTITUENTACCOUNTID = @CONSTITUENTACCOUNTID
            @REFERENCEDATE = @REFERENCEDATE
            @REFERENCENUMBER = @REFERENCENUMBER
            @CARDHOLDERNAME = @CARDHOLDERNAME
            @CREDITCARDNUMBER = @CREDITCARDNUMBER
            @CREDITTYPECODEID = @CREDITTYPECODEID
            @AUTHORIZATIONCODE = @AUTHORIZATIONCODE
            @EXPIRESON = @EXPIRESON
            @ISSUER = @ISSUER
            @NUMBEROFUNITS = @NUMBEROFUNITS
            @SYMBOL = @SYMBOL
            @MEDIANPRICE = @MEDIANPRICE
            @PROPERTYSUBTYPECODEID = @PROPERTYSUBTYPECODEID
            @GIFTINKINDSUBTYPECODEID = @GIFTINKINDSUBTYPECODEID
            @KEYALREADYOPEN = 0,
            @OTHERPAYMENTMETHODCODEID = @OTHERPAYMENTMETHODCODEID,
            @DIRECTDEBITRESULTCODE = @DIRECTDEBITRESULTCODE,
            @LOWPRICE = @LOWPRICE,
            @HIGHPRICE = @HIGHPRICE,
            @SALEDATE = @SALEDATE,
            @SALEAMOUNT = @SALEAMOUNT,
            @BROKERFEE = @BROKERFEE,
            @SALEPOSTDATE = @SALEPOSTDATE,
            @SALEPOSTSTATUSCODE = @SALEPOSTSTATUSCODE,
            @GIFTINKINDITEMNAME = @GIFTINKINDITEMNAME
            @GIFTINKINDDISPOSITIONCODE = @GIFTINKINDDISPOSITIONCODE
            @GIFTINKINDNUMBEROFUNITS = @GIFTINKINDNUMBEROFUNITS
            @GIFTINKINDFAIRMARKETVALUE = @GIFTINKINDFAIRMARKETVALUE,
            @DIRECTDEBITISREJECTED = @DIRECTDEBITISREJECTED,
            @ORIGINALVENDORID = @ORIGINALVENDORID,
            @ORIGINALTRANSACTIONID = @ORIGINALTRANSACTIONID,
            @SEPAMANDATEID = @SEPAMANDATEID,
            @OVERRIDESAVEDVENDORID = 1,
            @OVERRIDESAVEDBBPSTRANSACTIONID = 1,
            @OVERRIDESAVEDSEPAMANDATEID = 1;

          if @ADJUSTMATCHINGGIFTCLAIMS is null 
            set @ADJUSTMATCHINGGIFTCLAIMS = 0;

          if @ADJUSTMATCHINGGIFTCLAIMS <> 0
          begin
           -- if there are existing MGC, and user selected to update the records, run the update.

           if @ADJUSTMATCHINGGIFTCLAIMS = 2
           begin
             exec dbo.USP_MATCHINGGIFTCLAIM_AMOUNT_UPDATE @ID, @AMOUNT, @OLDTRANSACTIONAMOUNT, @ADJUSTMATCHINGGIFTCLAIMS, @CHANGEAGENTID, @CURRENTDATE
           end
           else  -- if there were no matching gifts, create the defaults since no prompt gets displayed for user

           -- code copied from add a payment where default MGC are created.

           begin
             if (select count(*) from dbo.UFN_REVENUE_GETMATCHINGGIFTBYROWNUMBER(@ID,1)) = 0
             begin
               declare @SPLITS xml;
               declare @APPLIEDAMOUNT money;
               select @SPLITS = (select sum(FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT) AMOUNT, REVENUESPLIT_EXT.DESIGNATIONID, 0 as TYPECODE
                 from dbo.FINANCIALTRANSACTIONLINEITEM
                   inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                 where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT_EXT.TYPECODE = 0
                   group by REVENUESPLIT_EXT.DESIGNATIONID
                   for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64);

               if (select count(*)
                 from dbo.FINANCIALTRANSACTIONLINEITEM
                   inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                   inner join dbo.DESIGNATION on REVENUESPLIT_EXT.DESIGNATIONID = DESIGNATION.ID
                 where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID and (REVENUESPLIT_EXT.TYPECODE = 0 or REVENUESPLIT_EXT.TYPECODE = 4)
                   and DESIGNATION.ISACTIVE = 0) > 0
               raiserror('Revenue cannot be added to inactive designations.', 13, 2);

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

               if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDMG() > 0
                 exec USP_MATCHINGGIFTPLEDGE_AUTOADD @CONSTITUENTID, @CHANGEAGENTID, @ID, @DATE, @APPLIEDAMOUNT, @RECEIPTAMOUNT, @SPLITS, @CURRENTAPPUSERID;

               if dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDSPOUSEMG() > 0
                 exec USP_MATCHINGGIFTPLEDGE_AUTOADDFROMSPOUSE @CONSTITUENTID, @CHANGEAGENTID, @ID, @DATE, @APPLIEDAMOUNT, @RECEIPTAMOUNT, @SPLITS, @CURRENTAPPUSERID;

  end
           end
         end

         --If the edit changed amount or rates, GL distributions need to be cleared.

         if @CLEARALLGLDISTRIBUTIONS = 0
         begin
           if exists(              
             select 1
             from dbo.REVENUE
             where ID = @ID
               and (
                 @OLDTRANSACTIONAMOUNT <> TRANSACTIONAMOUNT
                 or @OLDBASEAMOUNT <> AMOUNT
                 or @OLDORGANIZATIONAMOUNT <> ORGANIZATIONAMOUNT
                 or @OLDBASEEXCHANGERATEID <> BASEEXCHANGERATEID
                 or @OLDORGANIZATIONEXCHANGERATEID <> ORGANIZATIONEXCHANGERATEID
               )
           )
          begin
            set @CLEARALLGLDISTRIBUTIONS = 1;
          end
        end

        declare @OLDPOSTDATE datetime;
        declare @OLDDONOTPOST bit;

        select @OLDPOSTDATE = POSTDATE, @OLDDONOTPOST = case FINANCIALTRANSACTION.POSTSTATUSCODE when 3 then 1 else 0 end from dbo.FINANCIALTRANSACTION where FINANCIALTRANSACTION.ID = @ID;

        if @OLDPOSTDATE <> @POSTDATE or @OLDDONOTPOST <> @DONOTPOST 
        begin
          update dbo.FINANCIALTRANSACTION
          set  POSTDATE = @POSTDATE,
            POSTSTATUSCODE = case FINANCIALTRANSACTION.POSTSTATUSCODE when 2 then 2 else case when @DONOTPOST = 1 then 3 else case @POSTSTATUSCODE when 0 then 2 else 1 end end end,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
          where ID = @ID and POSTSTATUSCODE <> 2;

          update dbo.FINANCIALTRANSACTIONLINEITEM
          set POSTDATE = @POSTDATE,
            POSTSTATUSCODE = case FINANCIALTRANSACTION.POSTSTATUSCODE when 2 then 2 else case when @DONOTPOST = 1 then 3 else case @POSTSTATUSCODE when 0 then 2 else 1 end end end,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
          from dbo.FINANCIALTRANSACTIONLINEITEM
            inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            left outer join dbo.FINANCIALTRANSACTIONLINEITEM REVERSE on FINANCIALTRANSACTIONLINEITEM.ID = REVERSE.REVERSEDLINEITEMID   
          where FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE != 2 and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1 AND REVERSE.ID is null
            and FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID

          update dbo.PROPERTYDETAIL
          set SALEPOSTSTATUSCODE = @POSTSTATUSCODE,
            SALEPOSTDATE = case @POSTSTATUSCODE when 2 then null else coalesce(SALEPOSTDATE, @POSTDATE) end,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
          where ID in 
            (
            select REVENUEPAYMENTMETHOD.ID from dbo.REVENUEPAYMENTMETHOD where REVENUEID = @ID and PAYMENTMETHODCODE = 5
            ) and ISSOLD = 1;
        end

        -- clear the user-defined gl distributions

        if @CLEARALLGLDISTRIBUTIONS = 1
        begin                
        -- Clear GL

        delete from dbo.REVENUEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;  
        delete from dbo.STOCKSALEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;
        delete from dbo.GIFTINKINDSALEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;            
        delete from dbo.PROPERTYDETAILGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;
        delete from dbo.BENEFITGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;

        -- Add new GL distributions

        if @POSTSTATUSCODE <> 2
        begin

          -- Add new GL distributions

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

          -- Add new property detail GL distributions

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

    -- Add new stock detail GL distributions

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

          -- Add new gift-in-kind detail GL distributions

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

          -- add benefit distributions

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

          declare @DEPOSITID uniqueidentifier;
          select @DEPOSITID = DEPOSITID
          from dbo.BANKACCOUNTDEPOSITPAYMENT
            where ID = @ID;
              if @DEPOSITID is not null
                exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @ID, @DEPOSITID, @CHANGEAGENTID, @CURRENTDATE;
        end
      end
      else
      begin
        if @CLEARREVENUEGLDISTRIBUTION = 1 --if only post date, appeal, or inbound channel has changed, only clear revenue distributions

        begin
          -- Clear GL

          delete from dbo.REVENUEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;  

          delete from dbo.BENEFITGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;

          -- Add new GL distributions

          if @POSTSTATUSCODE <> 2
          begin                
            -- Add new GL distributions

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

            -- add benefit distributions

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

            select @DEPOSITID = DEPOSITID
            from dbo.BANKACCOUNTDEPOSITPAYMENT
            where ID = @ID;
            if @DEPOSITID is not null
              exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @ID, @DEPOSITID, @CHANGEAGENTID, @CURRENTDATE;
          end
        end
        else if @CLEARBENEFITSGLDISTRIBUTION = 1
        begin
          delete from dbo.BENEFITGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;
          if @POSTSTATUSCODE <> 2
            exec dbo.USP_SAVE_PAYMENT_BENEFITGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE
          end

          if @CLEARSTOCKGLDISTRIBUTION = 1
          begin
            delete from dbo.STOCKSALEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;

            -- Add new stock detail GL distributions

            if @POSTSTATUSCODE <> 2
              exec dbo.USP_SAVE_STOCKDETAILGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
          end

          if @CLEARGIFTINKINDGLDISTRIBUTION = 1
          begin
            delete from dbo.GIFTINKINDSALEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;

            -- Add new gift-in-kind detail GL distributions

            if @POSTSTATUSCODE <> 2
              exec dbo.USP_SAVE_GIFTINKINDPAYMENTMETHODDETAILGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
          end      

          if @CLEARPROPERTYSALEGLDISTRIBUTION = 1
          begin
            delete from dbo.PROPERTYDETAILGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;

            -- Add new property detail GL distributions

            if @POSTSTATUSCODE <> 2
              exec dbo.USP_SAVE_PROPERTYDETAILGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
          end
        end

        if @PAYMENTMETHODCODE = 4
        begin    
          declare @RETURNID uniqueidentifier
          if @SALE_SALEDATE is not null and  @SALE_SALEAMOUNT is not null and @SALE_GLPOSTDATE is not null and @SALE_GLPOSTSTATUS is not null       
            exec dbo.USP_DATAFORMTEMPLATE_ADD_STOCKSALEBYTRANSACTION @RETURNID, @ID, @CHANGEAGENTID, @SALE_SALEDATE, @SALE_SALEAMOUNT, @SALE_BROKERFEES, @NUMBEROFUNITSSOLD, @SALE_LOWPRICE, @SALE_MEDIANPRICE, @SALE_HIGHPRICE, @SALE_GLPOSTDATE, @SALE_GLPOSTSTATUS, @BASEEXCHANGERATEID, @EXCHANGERATE, @CURRENTAPPUSERID
        end 

        --Naveen 11/03/2010 Update gift fees based on payment update

        declare @REVENUEPOSTED bit;

        --Is the revenue posted?

        select @REVENUEPOSTED = (case when count(FINANCIALTRANSACTION.ID) > 0 then 1 else 0 end) from dbo.FINANCIALTRANSACTION 
          inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
          inner join dbo.REVENUEPOSTED on REVENUEPOSTED.ID = FINANCIALTRANSACTION.ID
        where FINANCIALTRANSACTION.ID = @ID and FINANCIALTRANSACTION.DELETEDON is null

        if @UPDATEGIFTFEEOPTION = 1 and exists (select 1 from dbo.GIFTFEEOVERRIDEREASONCODE where ISPAYMENTEDITDEFAULT=1 and ACTIVE=1)
        begin
          set @CLEARGIFTFEEGLDISTRIBUTION = 1;
          exec dbo.USP_REVENUE_UPDATEPAYMENTGIFTFEE @ID, @CONSTITUENTID, @CHANGEAGENTID,@PAYMENTMETHODCODE
        end
        else if (@SHOULDUPDATEGIFTFEE = 0 and @STREAMCHANGED = 1)
          set @CLEARGIFTFEEGLDISTRIBUTION = 1;

        --Check to make sure gift amount is more than the gift Fee

        --####

        declare @GIFTFEE_ENABLED bit;
        declare @GIFTFEEAMOUNT money;

        set @GIFTFEEAMOUNT = 0.00;

        select @GIFTFEE_ENABLED = dbo.UFN_GIFTFEE_ENABLED();

        if @GIFTFEE_ENABLED = 1 and exists (select 1 from dbo.REVENUESPLITGIFTFEE inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUESPLITGIFTFEE.ID = FINANCIALTRANSACTIONLINEITEM.ID 
                                              inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID 
                                            where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID and REVENUESPLITGIFTFEE.WAIVED <> 1
                                              and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1)
        begin
          select @GIFTFEEAMOUNT = coalesce(sum(REVENUESPLITGIFTFEE.TRANSACTIONAMOUNT), 0.00
          from dbo.REVENUESPLITGIFTFEE 
            inner join dbo.FINANCIALTRANSACTIONLINEITEM on REVENUESPLITGIFTFEE.ID = FINANCIALTRANSACTIONLINEITEM.ID
            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
          where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @ID
            and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
            and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1;

          if @GIFTFEEAMOUNT > @AMOUNT
          -- The gift fee cannot be greater than the application amount

          raiserror('BBERR_AMOUNTLESSTHANGIFTFEE', 13, 1);
          --####

        end

        -- CLEARGIFTFEEGLDISTRIBUTION isn't included in CLEARALLGLDISTRIBUTIONS so it isn't part of the above "else" block

        if @CLEARGIFTFEEGLDISTRIBUTION = 1
        begin
          delete from dbo.GIFTFEEGLDISTRIBUTION where REVENUEID = @ID and OUTDATED = 0;

          if @POSTSTATUSCODE <> 2
          begin
            -- add gift fee distributions

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

        -- update existing gift aid GL distributions

        exec dbo.USP_REVENUESPLITGIFTAID_UPDATEGLDISTRIBUTIONS_FORREVENUE @ID, @OLDGIFTAID, @ORIGINALDONOTPOST, @DONOTPOST, @CHANGEAGENTID, @CURRENTDATE;

        -- update existing auction purchase GL distributions

        if (@CLEARALLGLDISTRIBUTIONS = 1 or @CLEARAUCTIONPURCHASEGLDISTRIBUTION = 1) and @HASAUCTIONSPLITS = 1
          exec dbo.USP_REVENUE_UPDATEAUCTIONPURCHASEGLDISTRIBUTION @ID, @OLDAUCTIONPURCHASES, @CHANGEAGENTID, @CURRENTDATE;

        if  @OLDSPOTRATEID is not null 
          and not exists (select 1 from dbo.PAYMENTORIGINALAMOUNT where ID = @ID and BASEEXCHANGERATEID = @OLDSPOTRATEID)
          and not exists (select 1 from dbo.REVENUESPLITGIFTAIDAMOUNTS where FINANCIALTRANSACTIONID = @ID and BASEEXCHANGERATEID = @OLDSPOTRATEID)
        begin
          exec dbo.USP_CURRENCYEXCHANGERATE_DELETEBYID_WITHCHANGEAGENTID @OLDSPOTRATEID, @CHANGEAGENTID;
        end

      end try

      begin catch
        --reset CONTEXT_INFO to previous value

        if not @contextCache is null
          set CONTEXT_INFO @contextCache;

          exec dbo.USP_RAISE_ERROR;

          return 1;
        end catch

        --reset CONTEXT_INFO to previous value

        if not @contextCache is null
          set CONTEXT_INFO @contextCache;

        return 0;