USP_DATAFORMTEMPLATE_ADD_REVENUEUPDATEBATCHCOMMIT

The save procedure used by the add dataform template "Revenue Update Batch Commit Add Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@REVENUEID uniqueidentifier IN Revenue
@REVENUESPLITID uniqueidentifier IN Revenue Split
@BATCHID uniqueidentifier IN Input parameter indicating the context ID for the record being added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@CONSTITUENTID uniqueidentifier IN Constituent
@TYPECODE tinyint IN Revenue type
@DATE datetime IN Date
@AMOUNT money IN Amount
@PAYMENTMETHODCODE tinyint IN Payment method
@DONOTACKNOWLEDGE bit IN Do not acknowledge
@CHECKDATE UDT_FUZZYDATE IN Check date
@CHECKNUMBER nvarchar(20) IN Check number
@REFERENCEDATE UDT_FUZZYDATE IN Reference date
@REFERENCENUMBER nvarchar(20) IN Reference number
@CARDHOLDERNAME nvarchar(255) IN Name on card
@CREDITCARDNUMBER nvarchar(20) IN Card number
@CREDITTYPECODEID uniqueidentifier IN Card type
@AUTHORIZATIONCODE nvarchar(20) IN Authorization code
@EXPIRESON UDT_FUZZYDATE IN Expires on
@ISSUER nvarchar(100) IN Issuer
@NUMBEROFUNITS decimal(20, 3) IN Stock number of units
@SYMBOL nvarchar(25) IN Symbol
@MEDIANPRICE decimal(19, 4) IN Median price
@PROPERTYSUBTYPECODEID uniqueidentifier IN Property subtype
@GIFTINKINDSUBTYPECODEID uniqueidentifier IN Gift-in-kind subtype
@RECEIPTAMOUNT money IN Receipt amount
@DONOTRECEIPT bit IN Do not receipt
@CONSTITUENTACCOUNTID uniqueidentifier IN Account
@SPLITS xml IN Designations
@SINGLEDESIGNATIONID uniqueidentifier IN Designation
@REVENUESTREAMS xml IN Revenue streams
@APPLYTOSHOWNFORCONSTITUENTID uniqueidentifier IN Apply to shown for constituent
@SEQUENCE int IN Sequence
@INSTALLMENTFREQUENCYCODE tinyint IN Installment frequency
@INSTALLMENTSTARTDATE datetime IN Installment start date
@INSTALLMENTENDDATE datetime IN Installment end date
@NUMBEROFINSTALLMENTS int IN No. installments
@SOLICITORS xml IN Solicitors
@BENEFITS xml IN Money benefits
@FINDERNUMBER bigint IN Finder number
@SOURCECODE nvarchar(60) IN Source code
@APPEALID uniqueidentifier IN Appeal
@FINDERNUMBERISVALID bit IN Finder number is valid
@USERMODIFIEDBENEFITS bit IN User modified benefits
@BENEFITSWAIVED bit IN User waived benefits
@POSTDATE datetime IN GL post date
@POSTSTATUSCODE tinyint IN GL post status
@SENDPLEDGEREMINDER bit IN Send reminders
@SALEDATE datetime IN Sale date
@SALEAMOUNT money IN Sale amount
@BROKERFEE money IN Sale fees
@SALEPOSTSTATUSCODE tinyint IN Sale GL post status
@SALEPOSTDATE datetime IN Sale GL post date
@NOTETITLE nvarchar(50) IN Note Title
@NOTEAUTHORID uniqueidentifier IN Note Author
@NOTEDATEENTERED datetime IN Note Date
@NOTETYPECODEID uniqueidentifier IN Note Type
@NOTETEXTNOTE nvarchar(max) IN Notes
@GIVENANONYMOUSLY bit IN Given anonymously
@GIVENANONYMOUSLYDEFAULTEDFORCONSTITUENTID uniqueidentifier IN Given anonymously defaulted for constituent
@USERMODIFIEDRECEIPTAMOUNT bit IN User modified receipt amount
@PLEDGESUBTYPEID uniqueidentifier IN Pledge subtype
@REJECTIONCODEID uniqueidentifier IN Rejection code
@CONSTITUENTLOOKUPID uniqueidentifier IN Lookup ID
@MAILINGID uniqueidentifier IN Effort
@CHANNELCODEID uniqueidentifier IN Inbound channel
@INSTALLMENTS xml IN Installments
@PAYMENTFORPLEDGEAMOUNT money IN Payment for pledge amount
@RECOGNITIONS xml IN Recognition credits
@DIDRECOGNITIONSDEFAULT bit IN Did default recognition credits
@TRIBUTES xml IN Tributes
@UNAPPLIEDMATCHINGGIFTSPLITS xml IN Unapplied MG Split
@UNAPPLIEDMATCHINGGIFTAMOUNT money IN Applied
@RECEIPTTYPECODE tinyint IN Receipt type
@NEWCONSTITUENT xml IN New constituent
@OTHERPAYMENTMETHODCODEID uniqueidentifier IN Other method
@LETTERCODEID uniqueidentifier IN Letter
@ACKNOWLEDGEDATE datetime IN Acknowledge date
@REFERENCE nvarchar(255) IN Reference
@CATEGORYCODEID uniqueidentifier IN Revenue category
@ACKNOWLEDGEEID uniqueidentifier IN Acknowledgee
@APPLICATIONINFO nvarchar(60) IN Application
@OTHERTYPECODEID uniqueidentifier IN Other type
@OPPORTUNITYID uniqueidentifier IN Opportunity
@DIRECTDEBITRESULTCODE nvarchar(10) IN Result code
@LOWPRICE decimal(19, 4) IN Low price
@HIGHPRICE decimal(19, 4) IN High price
@NUMBEROFUNITSSOLD decimal(20, 3) IN Stock sale number of units
@USERMODIFIEDNUMBEROFUNITSSOLD bit IN User modified stock number of units sold
@CREDITCARDTOKEN uniqueidentifier IN Credit card token
@REJECTIONMESSAGE nvarchar(250) IN Rejection message
@PARTIALCREDITCARDNUMBER nvarchar(4) IN Partial card number
@STANDINGORDERCONSTITUENTACCOUNTID uniqueidentifier IN Standing order account
@STANDINGORDERREFERENCEDATE UDT_FUZZYDATE IN Standing order reference date
@STANDINGORDERREFERENCENUMBER nvarchar(20) IN Standing order reference number
@STANDINGORDERSETUP bit IN Standing order has been setup
@STANDINGORDERSETUPDATE datetime IN Standing order setup date
@TAXDECLARATIONS xml IN Declarations
@TRANSACTIONID uniqueidentifier IN Transaction ID
@ISTRANSIENTCARD bit IN Is transient credit card
@DECLINESGIFTAID bit IN Declines Gift Aid
@DDISOURCECODEID uniqueidentifier IN DDI source
@DDISOURCEDATE date IN DDI source date
@ISCOVENANT bit IN Is covenant gift
@AMOUNTFORVAT money IN Portion subject to VAT
@VATTAXRATEID uniqueidentifier IN VAT tax rate
@VATAMOUNT money IN VAT amount
@ADDITIONALAPPLICATIONSSTREAM xml IN Additional applications stream
@REVENUELOOKUPID nvarchar(100) IN Revenue ID
@APPLICATIONSOLICITORS xml IN Application solicitors
@APPLICATIONRECOGNITIONS xml IN Application recognitions
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@MATCHINGGIFTS xml IN Matching gifts
@MGGENERATED bit IN MG Generated
@MGALTERED bit IN MG Altered
@PAYINGPENDINGREVENUEID uniqueidentifier IN Was paying pending revenue
@GIFTINKINDITEMNAME nvarchar(100) IN Item name
@GIFTINKINDDISPOSITIONCODE tinyint IN Disposition
@GIFTINKINDNUMBEROFUNITS int IN Gift-in-kind number of units
@GIFTINKINDFAIRMARKETVALUE money IN Fair market value per unit
@DIRECTDEBITISREJECTED bit IN Direct debit is rejected
@PERCENTAGEBENEFITS xml IN Percent benefits
@ISGIFTAIDSPONSORSHIP bit IN Gift Aid sponsorship
@LOCKBOXID uniqueidentifier IN Lockbox
@LOCKBOXBATCHNUMBER nvarchar(100) IN Lockbox batch number
@LOCKBOXBATCHSEQUENCE int IN Lockbox batch sequence
@PDACCOUNTSYSTEMID uniqueidentifier IN Account system
@VALIDATEONLY bit IN
@BATCHNUMBER nvarchar(100) IN
@ISADJUSTMENT bit IN ISADJUSTMENT
@ADJUSTMENTDATE datetime IN Adjustment date
@ADJUSTMENTPOSTDATE datetime IN Adjustment post date
@ADJUSTMENTREASON nvarchar(300) IN Adjustment details
@ADJUSTMENTREASONCODEID uniqueidentifier IN Adjustment reason
@ADJUSTMENTPOSTSTATUSCODE tinyint IN Adjustment post status
@REVENUEDEVELOPMENTFUNCTIONCODEID uniqueidentifier IN Revenue function
@ORIGINALAPPLICATIONINFO nvarchar(60) IN ORIGINALAPPLICATIONINFO
@RELOADRECOGNITION bit IN Reload recognition credit
@RELOADSOLICITORS bit IN Reload solicitors
@LETTERS xml IN Letters
@APPLICATIONBUSINESSUNITS xml IN Application business units
@NOTES xml IN Notes
@TRANSACTIONCURRENCYID uniqueidentifier IN Transaction currency
@BASECURRENCYID uniqueidentifier IN Base currency
@BASEEXCHANGERATEID uniqueidentifier IN Base exchange rate
@EXCHANGERATE decimal(20, 8) IN Exchange rate
@BATCHROWID uniqueidentifier IN
@GENERATEREFERENCENUMBER bit IN Automatically generate reference number
@UPDATEMATCHINGGIFTCLAIMS tinyint IN Update matching gift claims
@UPDATEGIFTFEES bit IN Update gift fees
@UPDATETRIBUTES bit IN Update tributes
@INSTALLMENTSCHEDULESEEDDATE datetime IN Installment next transaction
@APPLYBYPERCENT bit IN Apply by
@ADJPAYMENT_DATE datetime IN
@ADJPAYMENT_POSTDATE datetime IN
@ADJPAYMENT_REASONCODEID uniqueidentifier IN
@ADJPAYMENT_DETAILS nvarchar(255) IN
@SALE_LOWPRICE decimal(19, 4) IN
@SALE_MEDIANPRICE decimal(19, 4) IN
@SALE_HIGHPRICE decimal(19, 4) IN
@VENDORID nvarchar(50) IN

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_REVENUEUPDATEBATCHCOMMIT
(
  @ID uniqueidentifier = null output,  
  @REVENUEID uniqueidentifier,
  @REVENUESPLITID uniqueidentifier = null,
  @BATCHID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier,
  @CONSTITUENTID uniqueidentifier = null,
  @TYPECODE tinyint,
  @DATE datetime,
  @AMOUNT money,
  @PAYMENTMETHODCODE tinyint = 0,
  @DONOTACKNOWLEDGE bit = 0,
  @CHECKDATE dbo.UDT_FUZZYDATE = '00000000',
  @CHECKNUMBER nvarchar(20) = '',
  @REFERENCEDATE dbo.UDT_FUZZYDATE = '00000000',
  @REFERENCENUMBER nvarchar(20) = '',
  @CARDHOLDERNAME nvarchar(255) = '',
  @CREDITCARDNUMBER nvarchar(20) = '',
  @CREDITTYPECODEID uniqueidentifier = null,
  @AUTHORIZATIONCODE nvarchar(20) = '',
  @EXPIRESON dbo.UDT_FUZZYDATE = '00000000',
  @ISSUER nvarchar(100) = '',
  @NUMBEROFUNITS decimal(20,3) = 0,
  @SYMBOL nvarchar(25) = '',
  @MEDIANPRICE decimal(19,4) = 0,
  @PROPERTYSUBTYPECODEID uniqueidentifier = null,
  @GIFTINKINDSUBTYPECODEID uniqueidentifier = null,
  @RECEIPTAMOUNT money = 0,
  @DONOTRECEIPT bit = 0,
  @CONSTITUENTACCOUNTID uniqueidentifier = null,
  @SPLITS xml = null,
  @SINGLEDESIGNATIONID uniqueidentifier = null,
  @REVENUESTREAMS xml = null,
  @APPLYTOSHOWNFORCONSTITUENTID uniqueidentifier= null,
  @SEQUENCE int,
  @INSTALLMENTFREQUENCYCODE tinyint = 5,
  @INSTALLMENTSTARTDATE datetime = null,
  @INSTALLMENTENDDATE datetime = null,
  @NUMBEROFINSTALLMENTS int = 1,
  @SOLICITORS xml = null,
  @BENEFITS xml = null,
  @FINDERNUMBER bigint = null,
  @SOURCECODE nvarchar(60) = '',
  @APPEALID uniqueidentifier = null,
  @FINDERNUMBERISVALID bit = 0,
  @USERMODIFIEDBENEFITS bit = 0,
  @BENEFITSWAIVED bit = 0,
  @POSTDATE datetime = null,
  @POSTSTATUSCODE tinyint = 1,
  @SENDPLEDGEREMINDER bit = 1,
  @SALEDATE datetime = null,
  @SALEAMOUNT money = 0,
  @BROKERFEE money = 0,
  @SALEPOSTSTATUSCODE tinyint = 1,
  @SALEPOSTDATE datetime = null,
  @NOTETITLE nvarchar(50) = '',
  @NOTEAUTHORID uniqueidentifier = null,
  @NOTEDATEENTERED datetime = null,
  @NOTETYPECODEID uniqueidentifier = null,
  @NOTETEXTNOTE nvarchar(max) = '',
  @GIVENANONYMOUSLY bit = 0,
  @GIVENANONYMOUSLYDEFAULTEDFORCONSTITUENTID uniqueidentifier = null,
  @USERMODIFIEDRECEIPTAMOUNT bit = 0,
  @PLEDGESUBTYPEID uniqueidentifier = null,
  @REJECTIONCODEID uniqueidentifier = null,
  @CONSTITUENTLOOKUPID uniqueidentifier = null,
  @MAILINGID uniqueidentifier = null,
  @CHANNELCODEID uniqueidentifier = null,
  @INSTALLMENTS xml = null,
  @PAYMENTFORPLEDGEAMOUNT money = 0,
  @RECOGNITIONS xml = null,
  @DIDRECOGNITIONSDEFAULT bit = 0,
  @TRIBUTES xml = null,
  @UNAPPLIEDMATCHINGGIFTSPLITS xml = null,
  @UNAPPLIEDMATCHINGGIFTAMOUNT money = 0,
  @RECEIPTTYPECODE tinyint = 0,
  @NEWCONSTITUENT xml = null,
  @OTHERPAYMENTMETHODCODEID uniqueidentifier = null,
  @LETTERCODEID uniqueidentifier = null,
  @ACKNOWLEDGEDATE datetime = null,
  @REFERENCE nvarchar(255) = null,
  @CATEGORYCODEID uniqueidentifier = null,
  @ACKNOWLEDGEEID uniqueidentifier = null,
  @APPLICATIONINFO nvarchar(60) = null,
  @OTHERTYPECODEID uniqueidentifier = null,
  @OPPORTUNITYID uniqueidentifier = null,
  @DIRECTDEBITRESULTCODE nvarchar(10) = '',
  @LOWPRICE decimal(19,4) = 0,
  @HIGHPRICE decimal(19,4) = 0,
  @NUMBEROFUNITSSOLD decimal(20,3) = 0,
  @USERMODIFIEDNUMBEROFUNITSSOLD bit = 0,
  @CREDITCARDTOKEN uniqueidentifier = null,
  @REJECTIONMESSAGE nvarchar(250) = '',
  -- PARTIALCREDITCARDNUMBER is used to support import and 

  -- credit card - last 4 digits recurring gifts  

  @PARTIALCREDITCARDNUMBER nvarchar(4) = '',
  @STANDINGORDERCONSTITUENTACCOUNTID uniqueidentifier = null,
  @STANDINGORDERREFERENCEDATE dbo.UDT_FUZZYDATE = '00000000',
  @STANDINGORDERREFERENCENUMBER nvarchar(20) = '',
  @STANDINGORDERSETUP bit = 0,
  @STANDINGORDERSETUPDATE datetime = null,
  @TAXDECLARATIONS xml = null,
  @TRANSACTIONID uniqueidentifier = null,
  @ISTRANSIENTCARD bit = null,
  @DECLINESGIFTAID bit = null,
  @DDISOURCECODEID uniqueidentifier = null,
  @DDISOURCEDATE date = null,
  @ISCOVENANT bit = null,
  @AMOUNTFORVAT money = 0,
  @VATTAXRATEID uniqueidentifier = null,
  @VATAMOUNT money = 0,
  @ADDITIONALAPPLICATIONSSTREAM xml = null,
  @REVENUELOOKUPID nvarchar(100) = '',
  @APPLICATIONSOLICITORS xml = null,
  @APPLICATIONRECOGNITIONS xml = null,
  @CURRENTAPPUSERID uniqueidentifier = null,
  @MATCHINGGIFTS xml = null,
  @MGGENERATED bit = null,
  @MGALTERED bit = null,
  @PAYINGPENDINGREVENUEID uniqueidentifier = null,
  @GIFTINKINDITEMNAME nvarchar(100) = '',
  @GIFTINKINDDISPOSITIONCODE tinyint = 0,
  @GIFTINKINDNUMBEROFUNITS int = 0,
  @GIFTINKINDFAIRMARKETVALUE money = 0,
  @DIRECTDEBITISREJECTED bit = 0,
  @PERCENTAGEBENEFITS xml = null,
  @ISGIFTAIDSPONSORSHIP bit = null,
  @LOCKBOXID uniqueidentifier = null,
  @LOCKBOXBATCHNUMBER nvarchar(100) = '',
  @LOCKBOXBATCHSEQUENCE int = 0,
  @PDACCOUNTSYSTEMID uniqueidentifier = null,
  @VALIDATEONLY bit = 0,
  @BATCHNUMBER nvarchar(100),
  @ISADJUSTMENT bit = null,
  @ADJUSTMENTDATE datetime = null,
  @ADJUSTMENTPOSTDATE datetime = null,
  @ADJUSTMENTREASON nvarchar(300) = null,
  @ADJUSTMENTREASONCODEID uniqueidentifier = null,
  @ADJUSTMENTPOSTSTATUSCODE tinyint = null,
  @REVENUEDEVELOPMENTFUNCTIONCODEID uniqueidentifier = null,
  @ORIGINALAPPLICATIONINFO nvarchar(60) = null
  @RELOADRECOGNITION bit = 0,
  @RELOADSOLICITORS bit = 0,
  @LETTERS xml = null,
  @APPLICATIONBUSINESSUNITS xml = null,
  @NOTES xml = null,
  @TRANSACTIONCURRENCYID uniqueidentifier = null,
  @BASECURRENCYID uniqueidentifier = null,
  @BASEEXCHANGERATEID uniqueidentifier = null,
  @EXCHANGERATE decimal(20,8) = null,
  @BATCHROWID uniqueidentifier = null,
  @GENERATEREFERENCENUMBER bit = 1,
  @UPDATEMATCHINGGIFTCLAIMS tinyint = 0,
  @UPDATEGIFTFEES bit = null,        --This field is set to null so it can behave differently when field is not included in the batch

  @UPDATETRIBUTES bit = 0,
  @INSTALLMENTSCHEDULESEEDDATE datetime = null,
  @APPLYBYPERCENT bit= 0, -- -- AdiSa: This field is for UI purposes only, but needs to be stored in the database.

  @ADJPAYMENT_DATE datetime = null,
  @ADJPAYMENT_POSTDATE datetime = null,
  @ADJPAYMENT_REASONCODEID uniqueidentifier = null,
  @ADJPAYMENT_DETAILS nvarchar(255) = '',
  @SALE_LOWPRICE decimal(19,4) = 0,
  @SALE_MEDIANPRICE decimal(19,4) = 0,
  @SALE_HIGHPRICE decimal(19,4) = 0,
  @VENDORID nvarchar(50) = ''
)
as
  set nocount on;

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

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

  declare @CURRENTDATE datetime
  set @CURRENTDATE = getdate()

  declare @ISPAYMENT bit;
  declare @ISPOSTED bit;
  declare @ISORDERAPPLICATION bit;
  declare @HASGIFTAIDSPLITONPENDINGR68PROCESS bit;
  declare @ISMISCELLANEOUSPAYMENT bit;
  declare @ISMIXEDORDERPAYMENT bit;
  declare @GIFTFEE_ENABLED bit;
  declare @ISPLEDGE bit;
  declare @ISPENDING bit;
  declare @ISPLANNEDGIFT bit;
  declare @ISRECURRINGGIFT bit;
  declare @ISMGPLEDGE bit;
  declare @ISAUCTIONDONATION bit;
  declare @ISGRANTAWARD bit;
  declare @PLEDGEBALANCE money;
  declare @SPONSORSHIPID uniqueidentifier;
  declare @PAYMENTTYPECODE tinyint;
  declare @HASSOLDSTOCK bit;
  declare @HASSOLDPROPERTY bit;
  declare @EXTRADATAISPOSTED bit;
  declare @ISDONORCHALLENGE bit;

  declare @APPLICATIONSTREAM xml;
  declare @CAMPAIGNSTREAM xml;
  declare @PREVIOUSCONSTITUENTID uniqueidentifier;
  declare @PREVIOUSAMOUNT money;
  declare @PREVIOUSDATE datetime;
  declare @NEXTINSTALLMENTID uniqueidentifier;
  declare @LOCKBOXCHANGED bit;
  declare @PREVIOUSREVENUELOOKUPID nvarchar(100);
  declare @PREVIOUSRECEIPTTYPECODE tinyint;

  declare @BASEAMOUNT money;
  declare @ORGANIZATIONAMOUNT money;
  declare @ORGANIZATIONCURRENCYID uniqueidentifier;
  declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;

  declare @TRIBUTEAMOUNT money;

  declare @SHOULDUPDATEGIFTFEE tinyint;
  set @SHOULDUPDATEGIFTFEE = 0;

  -- recognitions temp table

  declare @RECOGNITIONSTABLE table
  (
    REVENUESPLITID uniqueidentifier,
    APPLICATIONID uniqueidentifier,
    RECOGNITIONS xml
  )

  -- solicitors temp table

  declare @SOLICITORSTABLE table
  (
    REVENUESPLITID uniqueidentifier,
    APPLICATIONID uniqueidentifier,
    SOLICITORS xml
  )

  -- fields declared below b/c not available in batch yet but used in edit procs.

  declare @HADSPOTRATE bit;
  declare @RATECHANGED bit;

  begin try    
    set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
    set @ORGANIZATIONEXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTORGANIZATIONRATE(@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATE, null, @TRANSACTIONCURRENCYID);
    exec dbo.USP_CURRENCY_GETCURRENCYVALUES
      @AMOUNT,
      @DATE,
      @BASECURRENCYID,
      @BASEEXCHANGERATEID,
      @TRANSACTIONCURRENCYID output,
      @BASEAMOUNT output,
      @ORGANIZATIONCURRENCYID output,
      @ORGANIZATIONAMOUNT output,
      @ORGANIZATIONEXCHANGERATEID output,
      1;

    declare @BATCHOWNERID uniqueidentifier
    select 
      @BATCHOWNERID = BATCH.APPUSERID,
      @BATCHID = BATCH.ID
    from 
      dbo.BATCH
      inner join dbo.BATCHREVENUE on BATCH.ID = BATCHREVENUE.BATCHID
    where 
      BATCHREVENUE.ID = @BATCHROWID

  -- Validate that multiple batch rows are not allowed for single revenue record.

    declare @BATCHROWIDCOUNT integer;
    select @BATCHROWIDCOUNT = count(ID) from BATCHREVENUE 
    where BATCHID = @BATCHID and REVENUEID = @REVENUEID;

    if @BATCHROWIDCOUNT > 1
       raiserror('BBERR_MULTIPLEBATCHROWSNOTALLOWEDFORSINGLEREVENUERECORD',13,1);

    declare @CONSTITUENTSECURITY bit = (select CONSTITUENTSECURITY from dbo.REVENUEBATCHCONSTITUENTSECURITY); 
    if @CONSTITUENTSECURITY = 1
    begin
      if dbo.UFN_CONSTITUENT_CANAPPUSERMODIFY(@CONSTITUENTID, @BATCHOWNERID) = 0
      begin
        raiserror('BBERR_CONSTITUENTSECURITY',13,1);
      end
    end

    if @TYPECODE = 0  -- payment

    begin
      if @PAYMENTMETHODCODE = 3 --Direct Debit

      begin
        if @CONSTITUENTACCOUNTID is null
          raiserror('BBERR_DEBIT_CONSTITUENTACCOUNTIDREQUIRED', 13, 1);
      end

      if @PAYMENTMETHODCODE = 4 --Stock

      begin
        -- Validate that the low/median/high price per share values aren't negative

        if @LOWPRICE < 0
          raiserror('BBERR_LOWPRICEPERSHARENEGATIVE', 13, 1)

        if @MEDIANPRICE < 0
          raiserror('BBERR_MEDIANPRICEPERSHARENEGATIVE', 13, 1)

        if @HIGHPRICE < 0
          raiserror('BBERR_HIGHPRICEPERSHARENEGATIVE', 13, 1)

        if @NUMBEROFUNITSSOLD > @NUMBEROFUNITS
          raiserror('BBERR_NUMBEROFUNITSREMAINING', 13, 1)

        if @NUMBEROFUNITSSOLD = 0 and (@USERMODIFIEDNUMBEROFUNITSSOLD = 1 or @NUMBEROFUNITS <= 0)
          raiserror('BBERR_NUMBEROFUNITS', 13, 1)

        -- Validate that if any of the sold fields are set, the required sale field is set.  For @NUMBEROFUNITSSOLD, verify it isn't 

        -- the same value as @NUMBEROFUNITS since it gets defaulted to that amount all the time.               

        if (@SALEDATE is not null or @SALEAMOUNT <> 0 or @BROKERFEE <> 0 or @SALEPOSTDATE is not null or @SALEPOSTSTATUSCODE <> 1 or (@NUMBEROFUNITSSOLD > 0 and @NUMBEROFUNITSSOLD <> @NUMBEROFUNITS)) 
        begin
          if @SALEDATE is null 
            raiserror('ERR_STOCK_SALEDATEREQUIRED.', 13, 1)                
          if @SALEPOSTSTATUSCODE is null 
            raiserror('ERR_STOCK_SALEGLPOSTSTATUSREQUIRED.', 13, 1)

          if (@SALEPOSTDATE is null and @SALEPOSTSTATUSCODE = 1)
            raiserror('ERR_STOCK_SALEGLPOSTDATEREQUIRED.', 13, 1)          
        end
      end

      if @PAYMENTMETHODCODE = 5 --Property

      begin
        if (@SALEDATE is not null or @SALEAMOUNT <> 0 or @BROKERFEE <> 0 or @SALEPOSTDATE is not null or @SALEPOSTSTATUSCODE <> 1
        begin
          if @SALEDATE is null 
            raiserror('ERR_PROPERTY_SALEDATEREQUIRED.', 13, 1)                    

          if @SALEPOSTDATE is null and @SALEPOSTSTATUSCODE = 1
            raiserror('ERR_PROPERTY_SALEGLPOSTDATEREQUIRED.', 13, 1)                    
        end
      end

      if @PAYMENTMETHODCODE = 6 --Gift-in-Kind

      begin
        if @GIFTINKINDITEMNAME is null or @GIFTINKINDITEMNAME = ''
          raiserror('BBERR_GIFTINKINDITEMNAMEREQUIRED', 13, 1)

        if @GIFTINKINDDISPOSITIONCODE is null
          raiserror('BBERR_GIFTINKINDDISPOSITIONCODEREQUIRED', 13, 1)

        if @GIFTINKINDNUMBEROFUNITS < 0
          raiserror('BBERR_GIFTINKINDNUMBEROFUNITSNEGATIVE', 13, 1)

        if @GIFTINKINDFAIRMARKETVALUE < 0
          raiserror('BBERR_GIFTINKINDFAIRMARKETVALUENEGATIVE', 13, 1)

        declare @GIFTINKINDVALUE as money = 0;
        -- Catch any overflows

        begin try
          set @GIFTINKINDVALUE = @GIFTINKINDNUMBEROFUNITS * @GIFTINKINDFAIRMARKETVALUE
        end try
        begin catch
          raiserror('BBERR_REVENUEAMOUNTNOTEQUALGIFTINKINDAMOUNT', 13, 1)
          return 1
        end catch

        if (@GIFTINKINDNUMBEROFUNITS > 0 or @GIFTINKINDFAIRMARKETVALUE > 0) and (@AMOUNT <> @GIFTINKINDVALUE)
        begin
          raiserror('BBERR_REVENUEAMOUNTNOTEQUALGIFTINKINDAMOUNT', 13, 1)
          return 1
        end 
      end --Gift-in-Kind


      if @PAYMENTMETHODCODE = 9 -- None

        raiserror('BBERR_PAYMENTMETHODCODE_NONE.', 13, 1)

      if @PAYMENTMETHODCODE = 255 or @PAYMENTMETHODCODE is null
        raiserror('BBERR_PAYMENTMETHODCODE_BLANK', 13, 1)

      if @PAYMENTMETHODCODE = 10 --Other

      begin
        if @OTHERPAYMENTMETHODCODEID is null
          raiserror('BBERR_PAYMENTMETHODCODE_OTHER', 13, 1);
      end

      if @PAYMENTMETHODCODE = 11 --Standing order

      begin
        if @CONSTITUENTACCOUNTID is null
          raiserror('BBERR_STANDINGORDER_CONSTITUENTACCOUNTIDREQUIRED', 13, 1);
      end

      if @BENEFITSWAIVED = 0
      begin
        if (@BENEFITS is not null) or (@PERCENTAGEBENEFITS is not null)
          exec dbo.USP_REVENUE_BENEFITS_VALIDATEGLMAPPINGS @TYPECODE, @PDAccountSystemID, @CURRENTAPPUSERID
      end
      else
      begin
        set @BENEFITS = null
        set @PERCENTAGEBENEFITS = null
      end

      if @TRIBUTES is not null
      begin
        select @TRIBUTEAMOUNT = sum(AMOUNT) from dbo.UFN_REVENUE_GETTRIBUTES_2_FROMITEMLISTXML(@TRIBUTES)
        -- do not allow the gift amount to be adjusted less than the applied tribute amount. Note that tributes are in base currency

        if (@TRIBUTEAMOUNT is not null) and (@BASEAMOUNT < @TRIBUTEAMOUNT)
        begin
          raiserror('BBERR_TRIBUTEAMOUNT', 13, 1)
        end
      end
    end -- type payment


    else if @TYPECODE = 1 -- Pledge

    begin
      if @PAYMENTMETHODCODE = 255 or @PAYMENTMETHODCODE is null
        set @PAYMENTMETHODCODE = 9;

      if not @PAYMENTMETHODCODE in (2, 3, 9, 11)
      begin
        if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
          raiserror('ERR_UK_PLEDGE_INVALIDPAYMENTMETHODCODE', 13, 1);
      else
        raiserror('ERR_PLEDGE_INVALIDPAYMENTMETHODCODE2', 13, 1);
      end

      if @PAYMENTMETHODCODE = 3 --Direct Debit

      begin
        if @CONSTITUENTACCOUNTID is null
          raiserror('ERR_PLEDGE_DEBITACCOUNTREQUIRED', 13, 1);
      end

      if @PAYMENTMETHODCODE = 11 --Standing order

      begin
     if @CONSTITUENTACCOUNTID is null
          raiserror('ERR_PLEDGE_STANDINGORDERACCOUNTREQUIRED', 13, 1);
      end

      if @INSTALLMENTSTARTDATE is null
        set @INSTALLMENTSTARTDATE = @DATE;

      if @INSTALLMENTFREQUENCYCODE not in (0,1,2,3,4,5,7,8)
        raiserror('ERR_VALIDATE_INSTALLMENTFREQUENCY', 13, 1);

      -- Validate installments

      exec dbo.USP_REVENUEINSTALLMENT_VALIDATEINSTALLMENTS @INSTALLMENTS, @DATE, @AMOUNT;

      if @INSTALLMENTSTARTDATE < @DATE
        raiserror('ERR_VALIDATE_INSTALLMENTSTARTDATE', 13, 1);

      if @INSTALLMENTENDDATE < @INSTALLMENTSTARTDATE
        raiserror('ERR_VALIDATE_INSTALLMENTENDDATE', 13, 1);

      if @PAYMENTFORPLEDGEAMOUNT > @AMOUNT
        raiserror('ERR_PLEDGE_INVALIDPLEDGEAMOUNT', 13, 1);

      select @TRIBUTEAMOUNT = sum(AMOUNT) from dbo.UFN_REVENUE_GETTRIBUTES_2_FROMITEMLISTXML(@TRIBUTES)
      -- do not allow the gift amount to be adjusted less than the applied tribute amount. Note that tributes are in base currency

      if (@TRIBUTEAMOUNT is not null) and (@BASEAMOUNT < @TRIBUTEAMOUNT)
      begin
        raiserror('BBERR_TRIBUTEAMOUNT', 13, 1)
      end

      -- Validate payment adjust fields

      if dbo.UFN_PLEDGEHASPOSTEDPAYMENTS(@REVENUEID) = 1 
      begin
        -- The pledge amount shouldn't be able to be reduced to less than the applied amount and increasing 

        -- the pledge amount doesn't affect the payments so the only amount change that should trigger a change

        -- to a payment is when relative distribution for a designation is changed.  As a result, changes to 

        -- the percent should be checked rather than changes to the actual amount.  This prevents unnecessary

        -- adjustments from being created for a payment.

        if 
          -- A posted payment on an installment has been edited

          exists
            select 1
            from dbo.INSTALLMENTSPLITPAYMENT
            inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
            inner join dbo.REVENUEPOSTED on REVENUEPOSTED.ID = REVENUESPLIT.REVENUEID
            inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID
            inner join dbo.INSTALLMENT on INSTALLMENTSPLIT.INSTALLMENTID = INSTALLMENT.ID
            left join
            (
              -- Using a derived table so the BATCHREVENUEID filter is applied before the BATCHREVENUEINSTALLMENT tables are left-joined

              select
                BATCHREVENUEINSTALLMENTSPLIT.DESIGNATIONID,
                BATCHREVENUEINSTALLMENTSPLIT.INSTALLMENTSPLITID,
                BATCHREVENUEINSTALLMENT.AMOUNT as INSTALLMENTAMOUNT,
                BATCHREVENUEINSTALLMENTSPLIT.AMOUNT as INSTALLMENTSPLITAMOUNT
              from dbo.BATCHREVENUEINSTALLMENT
              inner join dbo.BATCHREVENUEINSTALLMENTSPLIT on BATCHREVENUEINSTALLMENT.ID = BATCHREVENUEINSTALLMENTSPLIT.BATCHREVENUEINSTALLMENTID
              where
                BATCHREVENUEINSTALLMENT.BATCHREVENUEID = @BATCHROWID
            ) as BATCHREVENUEINSTALLMENTWITHINSTALLMENTSPLIT on BATCHREVENUEINSTALLMENTWITHINSTALLMENTSPLIT.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
            where
              INSTALLMENTSPLITPAYMENT.PLEDGEID = @REVENUEID
              and 
              (
                (
                  case
                    when INSTALLMENT.AMOUNT <> 0 then INSTALLMENTSPLIT.AMOUNT / INSTALLMENT.AMOUNT 
                    else 0 
                  end 
                    <> 
                  case
                    when BATCHREVENUEINSTALLMENTWITHINSTALLMENTSPLIT.INSTALLMENTAMOUNT <> 0 then BATCHREVENUEINSTALLMENTWITHINSTALLMENTSPLIT.INSTALLMENTSPLITAMOUNT / BATCHREVENUEINSTALLMENTWITHINSTALLMENTSPLIT.INSTALLMENTAMOUNT
                    else 0
                  end
                  -- If the new or original installment amount is 0, then either the payment applied amount is 0

                  -- or later validation will ensure that the payment amount must be 0.  If the payment amount is 0

                  -- then changing the relative distribution amounts won't require the payment to be adjusted.

                  and INSTALLMENT.AMOUNT <> 0
                  and BATCHREVENUEINSTALLMENTWITHINSTALLMENTSPLIT.INSTALLMENTAMOUNT <> 0
                )
                or INSTALLMENTSPLIT.DESIGNATIONID <> BATCHREVENUEINSTALLMENTWITHINSTALLMENTSPLIT.DESIGNATIONID
                or BATCHREVENUEINSTALLMENTWITHINSTALLMENTSPLIT.DESIGNATIONID is null
              )
            )
            or
            -- Check if the number of installment splits has changed for an installment that has already had payments applied to it and the 

            -- payment has been posted.  The previous check won't handle increasing the number of designations for an installment split when the 

            -- installment amount is $0.

            exists
            ( 
              select 1 from
              (
                select count(*) as INSTALLMENTSPLITCOUNT, INSTALLMENTSPLIT.INSTALLMENTID 
                from dbo.INSTALLMENT
                inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.INSTALLMENTID = INSTALLMENT.ID
                where 
                  INSTALLMENT.REVENUEID = @REVENUEID and
                  -- Has posted payment applied to the installment split

                  exists
                  (
                    select 1
                    from dbo.INSTALLMENTPAYMENT
                    inner join dbo.REVENUESPLIT on INSTALLMENTPAYMENT.PAYMENTID = REVENUESPLIT.ID
                    inner join dbo.REVENUEPOSTED on REVENUESPLIT.REVENUEID =  REVENUEPOSTED.ID
                    where
                      INSTALLMENTPAYMENT.INSTALLMENTID = INSTALLMENT.ID
                  )
                group by INSTALLMENTSPLIT.INSTALLMENTID
              ) as EXISTINGINSTALLMENTSPLITCOUNT
              inner join
              (
                select count(*) as INSTALLMENTSPLITCOUNT, BATCHREVENUEINSTALLMENT.INSTALLMENTID
                from dbo.BATCHREVENUEINSTALLMENT
                inner join dbo.BATCHREVENUEINSTALLMENTSPLIT on BATCHREVENUEINSTALLMENT.ID = BATCHREVENUEINSTALLMENTSPLIT.BATCHREVENUEINSTALLMENTID
                where BATCHREVENUEINSTALLMENT.BATCHREVENUEID = @BATCHROWID
                group by BATCHREVENUEINSTALLMENT.INSTALLMENTID
              ) as NEWINSTALLMENTSPLITCOUNT on EXISTINGINSTALLMENTSPLITCOUNT.INSTALLMENTID = NEWINSTALLMENTSPLITCOUNT.INSTALLMENTID
              where EXISTINGINSTALLMENTSPLITCOUNT.INSTALLMENTSPLITCOUNT <>  NEWINSTALLMENTSPLITCOUNT.INSTALLMENTSPLITCOUNT
            )
         or 
            exists
            (
                select  1
                from    dbo.INSTALLMENTSPLITPAYMENT
                inner join REVENUECATEGORY on REVENUECATEGORY.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
                where INSTALLMENTSPLITPAYMENT.PLEDGEID = @REVENUEID and REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID <> @CATEGORYCODEID
            )
        begin
          if @ADJPAYMENT_REASONCODEID is null
            raiserror('BBERR_ADJPAYMENT_REASONCODEID_REQUIRED', 13, 1);
          if @ADJPAYMENT_DATE is null
            raiserror('BBERR_ADJPAYMENT_DATE_REQUIRED', 13, 1);
          if @ADJPAYMENT_POSTDATE is null
            raiserror('BBERR_ADJPAYMENT_POSTDATE_REQUIRED', 13, 1);
        end
     end
     else -- If the pledge has no posted payments, clear the adjust fields

          select
            @ADJPAYMENT_DATE = null,
            @ADJPAYMENT_POSTDATE = null,
            @ADJPAYMENT_REASONCODEID = null,
            @ADJPAYMENT_DETAILS = '';
     end  --type pledge



    else if @TYPECODE = 3 -- recurring gift

    begin
      if not @SPLITS is null
        exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS, @AMOUNT, @TYPECODE, null, @TRANSACTIONCURRENCYID, 0;
      else
        if @SINGLEDESIGNATIONID is null
          raiserror('ERR_SINGLEDESIGNATION_REQUIRED', 13, 1);

      declare @NEXTTRANSACTIONDATE datetime;

      if @INSTALLMENTSTARTDATE is null
        set @INSTALLMENTSTARTDATE = @DATE;

      if @INSTALLMENTFREQUENCYCODE = 4 or @INSTALLMENTFREQUENCYCODE = 5
        raiserror('ERR_VALIDATE_INSTALLMENTFREQUENCY', 13, 1);

      if @PAYMENTMETHODCODE not in (0, 1, 2, 3, 9, 10, 11, 98, 101, 102)
      begin
        if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
          raiserror('ERR_UK_RECGIFT_INVALIDPAYMENTMETHODCODE', 13, 1);
      else
        raiserror('ERR_RECGIFT_INVALIDPAYMENTMETHODCODE2', 13, 1);
      end

      if @PAYMENTMETHODCODE = 3 --Direct Debit

      begin
        if @CONSTITUENTACCOUNTID is null
          raiserror('ERR_RECGIFT_DEBITACCOUNTREQUIRED', 13, 1);
      end

      if @PAYMENTMETHODCODE = 10 --Other

      begin
        if @OTHERPAYMENTMETHODCODEID is null
          raiserror('ERR_RECGIFT_OTHERMETHODREQUIRED', 13, 1);
      end

      if @PAYMENTMETHODCODE = 11 --Standing order

      begin
        if @CONSTITUENTACCOUNTID is null
          raiserror('ERR_RECGIFT_STANDINGORDERACCOUNTREQUIRED', 13, 1);
      end

      if @INSTALLMENTSTARTDATE < @DATE
        raiserror('ERR_VALIDATE_INSTALLMENTSTARTDATE', 13, 1);

      if @INSTALLMENTSCHEDULESEEDDATE < @INSTALLMENTSTARTDATE
        raiserror('ERR_VALIDATE_INSTALLMENTSCHEDULESEEDDATE', 13, 1);

      if @INSTALLMENTENDDATE < @INSTALLMENTSTARTDATE
        raiserror('ERR_VALIDATE_INSTALLMENTENDDATE', 13, 1);    
    end -- recurring gift


    -- Ensure that sold fixed assets don't have payment method changed

    if @PAYMENTMETHODCODE not in (4, 5, 6) --stock, property, gift-in-kind

    begin
      -- sold stock, sold property, or sold gift-in-kind

      if exists (select 1 from dbo.FINANCIALTRANSACTION
                 where FINANCIALTRANSACTION.PARENTID = @REVENUEID
                 and FINANCIALTRANSACTION.TYPECODE in (21,22,27))
        raiserror('BBERR_VALIDATE_FIXEDASSETSCHANGED', 13, 1);
    end

    if @FINDERNUMBER is null
      set @FINDERNUMBER = 0;


    /* Validate all marketing data and dependent fields */
    exec dbo.[USP_REVENUEBATCH_VALIDATEMARKETINGDATA]
      @FINDERNUMBER = @FINDERNUMBER,
      @SOURCECODE = @SOURCECODE,
      @MAILINGID = @MAILINGID,
      @APPEALID = @APPEALID,
      @CONSTITUENTID = @CONSTITUENTID,
      @BATCHID = @BATCHID;


    if (@DIRECTDEBITISREJECTED = 1) and (@AMOUNT > 0)
    begin
      raiserror('ERR_VALIDATE_DIRECTDEBITISREJECTED', 13, 1);
    end

    declare @CONSTITUENTEXISTS bit
    if exists(select ID from dbo.CONSTITUENT where ID = @CONSTITUENTID
      set @CONSTITUENTEXISTS = 1
    else
      set @CONSTITUENTEXISTS = 0

    -- Validate constituent fields if the constituent hasn't been created yet

    if @CONSTITUENTEXISTS = 0
    begin
      exec dbo.USP_REVENUEBATCH_VALIDATENEWCONSTITUENT @REVENUEBATCHCONSTITUENTID = @CONSTITUENTID, @ISDONOR = 1, @BATCHROWID = @BATCHROWID;

      declare @BATCHCONSTITID uniqueidentifier;
      set @BATCHCONSTITID = @CONSTITUENTID;

      -- Only pass recognitions into USP_REVENUEBATCH_CONSTITUENT_ADD if there is atleast one row

      -- so an empty set isn't constantly unserialized and then reserialized

      declare @RECOGNITIONSTOPASS xml
      if exists (select 1 from dbo.UFN_REVENUEBATCH_GETRECOGNITIONS_FROMITEMLISTXML(@RECOGNITIONS) for xml raw('ITEM'), type, elements, root('RECOGNITIONS'), binary base64)
        set @RECOGNITIONSTOPASS = @RECOGNITIONS
      else
        set @RECOGNITIONSTOPASS = null

      --add new constituent

      exec dbo.USP_REVENUEBATCH_CONSTITUENT_ADD 
        @CONSTITUENTID OUTPUT
        @CHANGEAGENTID
        @BATCHCONSTITID
        @CONSTITUENTACCOUNTID
        @CONSTITUENTACCOUNTID output,
        @CURRENTRECOGNITIONS = @RECOGNITIONSTOPASS,
        @UPDATEDRECOGNITIONS = @RECOGNITIONS output,
        @UPDATEDAPPLICATIONRECOGNITIONS = @APPLICATIONRECOGNITIONS output;

      if @FINDERNUMBER > 0
        exec dbo.USP_REVENUEBATCH_CONSTITUENTAPPEAL_ADD 
          @CONSTITUENTID
          @CHANGEAGENTID
          @BATCHCONSTITID,
          @FINDERNUMBER;

      --delete the temporary batch version of the constituent

      exec dbo.USP_REVENUEBATCH_CONSTITUENT_DELETE @BATCHREVENUECONSTITUENTID = @BATCHCONSTITID, @CHANGEAGENTID = @CHANGEAGENTID
    end;

    declare @ISORGANIZATION bit
    select @ISORGANIZATION = ISORGANIZATION
    from dbo.CONSTITUENT where ID = @CONSTITUENTID

    select  
      @PREVIOUSCONSTITUENTID = REVENUE.CONSTITUENTID, 
      @PREVIOUSAMOUNT = REVENUE.AMOUNT,
      --@TRANSACTIONCURRENCYID = REVENUE.TRANSACTIONCURRENCYID,

      --@BASECURRENCYID = REVENUE.BASECURRENCYID, 

      --@BASEEXCHANGERATEID = REVENUE.BASEEXCHANGERATEID,

      @PREVIOUSDATE = REVENUE.DATE,
      @PREVIOUSREVENUELOOKUPID = REVENUE.LOOKUPID,
      @HADSPOTRATE =  
        case
          when CURRENCYEXCHANGERATE.TYPECODE = 2
            then 1
          else 0
        end,
      @RATECHANGED = 0
      @PREVIOUSRECEIPTTYPECODE = RECEIPTTYPECODE
    from 
      dbo.REVENUE
      left join dbo.CURRENCYEXCHANGERATE on CURRENCYEXCHANGERATE.ID = REVENUE.BASEEXCHANGERATEID
    where 
      REVENUE.ID = @REVENUEID

    set @LOCKBOXCHANGED = (
            select(
              case when REVENUELOCKBOX.LOCKBOXID <> @LOCKBOXID then 
                1
              when REVENUELOCKBOX.BATCHNUMBER <> @LOCKBOXBATCHNUMBER then 
                1
              when REVENUELOCKBOX.BATCHSEQUENCE <> @LOCKBOXBATCHSEQUENCE then 
                1
              else 
                0
              end)
            from 
              dbo.REVENUELOCKBOX
            where 
              REVENUELOCKBOX.ID = @REVENUEID)

    -- If the system has set that households can't be donors, verify that constituent isn't a household

    if dbo.UFN_INSTALLATIONINFO_GETHOUSEHOLDSCANBEDONORS() = 0 and dbo.UFN_CONSTITUENT_ISHOUSEHOLD(@CONSTITUENTID) = 1
      raiserror('ERR_CONSTITUENT_HOUSEHOLD', 13, 1);

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

    if @NUMBEROFINSTALLMENTS > 150
      raiserror('BBERR_NUMINSTALLMENTS',13,1);

    if @AMOUNTFORVAT = 0 and (@VATTAXRATEID is not null or @VATAMOUNT <> 0)
      raiserror('INVALIDAMOUNTFORVAT_TAXRATEORVATAMOUNT', 13, 1);

    if @AMOUNTFORVAT <> 0 and @AMOUNTFORVAT > @AMOUNT
      raiserror('INVALIDAMOUNTFORVAT_REVENUEAMOUNT', 13, 1);

    if (@POSTSTATUSCODE = 1) and (@VALIDATEONLY = 1) and (@TYPECODE <> 3) -- Currently recurring gifts have no GL mappings

      exec dbo.USP_REVENUE_VALIDATEGLMAPPING @BATCHROWID, 1, @CURRENTAPPUSERID;

    --Validate that the total benefit amount is not greater than the revenue amount.

    declare @TOTALBENEFITAMOUNT money;

    if @BENEFITSWAIVED = 0
    begin
      select @TOTALBENEFITAMOUNT = coalesce(sum(TOTALVALUE), 0) from dbo.UFN_REVENUE_GETBENEFITS_3_FROMITEMLISTXML(@BENEFITS)    
      select @TOTALBENEFITAMOUNT = @TOTALBENEFITAMOUNT + coalesce(sum(PERCENTAPPLICABLEAMOUNT * VALUEPERCENT/100), 0) from dbo.UFN_REVENUEBATCH_GETBENEFITSPCT_FROMITEMLISTXML(@PERCENTAGEBENEFITS);

      if @TOTALBENEFITAMOUNT > @AMOUNT 
        raiserror('ERR_REVENUEBENEFIT_TOTALVALUELESSTHANREVENUEAMOUNT', 13, 1);
    end    

    if @LOCKBOXCHANGED is null and (@LOCKBOXID is not null or @LOCKBOXBATCHNUMBER is not null or  @LOCKBOXBATCHSEQUENCE is not null)
    begin
      set @LOCKBOXCHANGED = 1;
    end;

    -- if the group type can't be a donor, raise an error

    if exists(select GD.ID from dbo.GROUPDATA GD inner join dbo.GROUPTYPE GT on GD.GROUPTYPEID = GT.ID where GD.ID = @CONSTITUENTID and GT.CANBEDONOR = 0)
      raiserror('GROUPCANNOTBEDONOR', 13, 1);

    exec dbo.USP_DATAFORMTEMPLATE_VIEW_REVENUETRANSACTIONPAGEDATA
      @ID = @REVENUEID,
      @ISPAYMENT = @ISPAYMENT output,
      @ISPOSTED = @ISPOSTED output,
      @ISORDERAPPLICATION = @ISORDERAPPLICATION output,
      @HASGIFTAIDSPLITONPENDINGR68PROCESS = @HASGIFTAIDSPLITONPENDINGR68PROCESS output,
      @ISMISCELLANEOUSPAYMENT = @ISMISCELLANEOUSPAYMENT output,
      @ISMIXEDORDERPAYMENT = @ISMIXEDORDERPAYMENT output,
      @GIFTFEE_ENABLED = @GIFTFEE_ENABLED output,
      @ISPLEDGE = @ISPLEDGE output,
      @ISPENDING = @ISPENDING output,
      @ISPLANNEDGIFT = @ISPLANNEDGIFT output,
      @ISRECURRINGGIFT = @ISRECURRINGGIFT output,
      @ISMGPLEDGE = @ISMGPLEDGE output,
      @ISAUCTIONDONATION = @ISAUCTIONDONATION output,
      @ISGRANTAWARD = @ISGRANTAWARD output,
      @PLEDGEBALANCE = @PLEDGEBALANCE output,
      @SPONSORSHIPID = @SPONSORSHIPID output,
      @PAYMENTTYPECODE = @PAYMENTTYPECODE output,
      @HASSOLDSTOCK = @HASSOLDSTOCK output,
      @HASSOLDPROPERTY = @HASSOLDPROPERTY output,
      @EXTRADATAISPOSTED = @EXTRADATAISPOSTED output,
      @ISDONORCHALLENGE = @ISDONORCHALLENGE output

    declare @AUTOPAY bit;
    set @AUTOPAY = (SELECT case when @PAYMENTMETHODCODE in (2, 3, 11) then 1 else 0 end)

    -- paperless mandate order setup not available in batch

    declare @SENDPMINSTRUCTION bit = 0;
    declare @PMINSTRUCTIONTOSENDCODE tinyint = 0;
    declare @PMINSTRUCTIONDATE_NEW date = null;
    declare @PMINSTRUCTIONDATE_CANCEL date = null;
    declare @PMINSTRUCTIONDATE_SETUP date = null;
    declare @PMADVANCENOTICESENTDATE date = null
    declare @LASTACTIVITYDATE date = null;
    declare @PREVIOUSSCHEDULESEEDDATE date = null;

    if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 0
    begin
      set @DDISOURCECODEID = null;
      set @DDISOURCEDATE = null;
    end
    else if @PAYMENTMETHODCODE = 3 -- direct debit

    begin
      select 
        @SENDPMINSTRUCTION = REVENUESCHEDULEDIRECTDEBITPAYMENT.SENDPMINSTRUCTION,
        @PMINSTRUCTIONTOSENDCODE = REVENUESCHEDULEDIRECTDEBITPAYMENT.PMINSTRUCTIONTOSENDCODE,
        @PMINSTRUCTIONDATE_NEW = REVENUESCHEDULEDIRECTDEBITPAYMENT.PMINSTRUCTIONDATE_NEW,
        @PMINSTRUCTIONDATE_CANCEL = REVENUESCHEDULEDIRECTDEBITPAYMENT.PMINSTRUCTIONDATE_CANCEL,
        @PMINSTRUCTIONDATE_SETUP = REVENUESCHEDULEDIRECTDEBITPAYMENT.PMINSTRUCTIONDATE_SETUP,
        @PMADVANCENOTICESENTDATE = REVENUESCHEDULEDIRECTDEBITPAYMENT.PMADVANCENOTICESENTDATE
      from 
        dbo.REVENUESCHEDULEDIRECTDEBITPAYMENT
      where 
        REVENUESCHEDULEDIRECTDEBITPAYMENT.ID = @REVENUEID;
    end

    if @DDISOURCECODEID is null
    begin
      set @SENDPMINSTRUCTION = 0;
      set @PMINSTRUCTIONTOSENDCODE = 0;
      set @PMINSTRUCTIONDATE_NEW = null;
      set @PMINSTRUCTIONDATE_CANCEL = null;
      set @PMINSTRUCTIONDATE_SETUP = null;
      set @PMADVANCENOTICESENTDATE = null;
    end

    -- extract solicitors and recognitions from the corresponding application xmls

    set @RECOGNITIONS = dbo.UFN_REVENUEUPDATEBATCH_GETRECOGNITIONSXML(@ID, @APPLICATIONRECOGNITIONS)
    set @SOLICITORS = dbo.UFN_REVENUEUPDATEBATCH_GETSOLICITORSXML(@ID, @APPLICATIONSOLICITORS)

    -- fix up the benefits collections. The reason this is needed is that the ID given in the collections is not the correct ID to use when

    --  later code tries to map the benefits to the ones on payments, pledges, etc. The REVENUEBENEFITID field will have this information and

    --  needs to become the ID for the benefit.

    select @BENEFITS = (SELECT
                                T.c.value('(BENEFITCURRENCYID)[1]','uniqueidentifier') AS 'BENEFITCURRENCYID',
                                T.c.value('(BENEFITID)[1]','uniqueidentifier') AS 'BENEFITID',
                                T.c.value('(DETAILS)[1]','nvarchar(255)') AS 'DETAILS',
                                T.c.value('(QUANTITY)[1]','smallint') AS 'QUANTITY',
                                T.c.value('(REVENUEBENEFITID)[1]','uniqueidentifier') AS 'ID',
                                T.c.value('(SEQUENCE)[1]','int') AS 'SEQUENCE',
                                T.c.value('(TOTALVALUE)[1]','money') AS 'TOTALVALUE',
                                T.c.value('(UNITVALUE)[1]','money') AS 'UNITVALUE'
                            FROM @BENEFITS.nodes('/BENEFITS/ITEM') T(c)
                            for xml raw('ITEM'),type,elements,root('BENEFITS'),BINARY BASE64)
    select @PERCENTAGEBENEFITS = (SELECT
                                T.c.value('(BENEFITID)[1]','uniqueidentifier') AS 'BENEFITID',
                                T.c.value('(DETAILS)[1]','nvarchar(255)') AS 'DETAILS',
                                T.c.value('(PERCENTAPPLICABLEAMOUNT)[1]','money') AS 'PERCENTAPPLICABLEAMOUNT',
                                T.c.value('(REVENUEBENEFITID)[1]','uniqueidentifier') AS 'ID',
                                T.c.value('(SEQUENCE)[1]','int') AS 'SEQUENCE',
                                T.c.value('(TOTALVALUE)[1]','decimal(38, 6)') AS 'TOTALVALUE',
                                T.c.value('(VALUEPERCENT)[1]','decimal(20, 4)') AS 'VALUEPERCENT'
                            FROM @PERCENTAGEBENEFITS.nodes('/PERCENTAGEBENEFITS/ITEM') T(c)
                            for xml raw('ITEM'),type,elements,root('PERCENTAGEBENEFITS'),BINARY BASE64)

    -- PAYMENT

    if @TYPECODE = 0 
    begin

      declare @APPLICATIONCODE tinyint;
      declare @SINGLEAPPLICATIONID uniqueidentifier;
      declare @APPLICATIONTYPECODE tinyint;
      declare @APPLICATIONAMOUNT money;
      declare @REVENUESTREAMS1 xml;

      if (@APPLICATIONINFO is null or len(@APPLICATIONINFO) = 0) and @REVENUESTREAMS is null and @ADDITIONALAPPLICATIONSSTREAM is null
        raiserror('ERR_ATLEASTONEAPPLICATION', 13, 1)

      if @APPLICATIONINFO is not null
      begin
        if len(@APPLICATIONINFO) > 3
        begin
          select  
            @SINGLEAPPLICATIONID = SINGLEAPPLICATIONID,
            @APPLICATIONTYPECODE = APPLICATIONTYPECODE,
            @APPLICATIONAMOUNT = APPLICATIONAMOUNT
          from 
            dbo.UFN_REVENUEBATCH_PARSEAPPLICATIONINFO(@APPLICATIONINFO)

          if @APPLICATIONAMOUNT > @AMOUNT
            set @APPLICATIONAMOUNT = @AMOUNT;

          set @REVENUESTREAMS1 = @REVENUESTREAMS;
          set @SINGLEDESIGNATIONID = null
          set @SPLITS = null
          set @ADDITIONALAPPLICATIONSSTREAM = null
          set @REVENUESTREAMS = null
        end
      end  -- applicationinfo


      declare @ADDITIONALAPPLICATIONSAMOUNT money
      if @ADDITIONALAPPLICATIONSSTREAM is not null
        select 
          @ADDITIONALAPPLICATIONSAMOUNT = sum(APPLIED)
        from 
          dbo.UFN_REVENUEBATCH_GETADDITIONALAPPLICATIONS_FROMITEMLISTXML(@ADDITIONALAPPLICATIONSSTREAM);
      else
        set @ADDITIONALAPPLICATIONSAMOUNT = 0;

      if @SINGLEAPPLICATIONID is not null
      begin

        declare @STREAMCOUNT int;
        select @STREAMCOUNT = count(*) from @REVENUESTREAMS1.nodes('/REVENUESTREAMS/ITEM') T(c);
          declare @UNAPPLIEDAMOUNT money;

        if @REVENUESTREAMS1 is not null and @STREAMCOUNT > 0
        begin
          select @UNAPPLIEDAMOUNT = sum(APPLIED)
          from dbo.UFN_REVENUEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS1);

          if @UNAPPLIEDAMOUNT + @ADDITIONALAPPLICATIONSAMOUNT <> @AMOUNT
            raiserror('BBERR_ALLMONEYNOTAPPLIED', 13, 1);                  

          set @SINGLEDESIGNATIONID = null
          set @SPLITS = null
        end
        else
          set @UNAPPLIEDAMOUNT = 0

        set @APPLICATIONCODE = 
              (
                  select
                  case @APPLICATIONTYPECODE 
                    when 5 then 2 --Pledge Payment

                    when 8 then 7 --MGPledge Payment

                    when 4 then 3 --Recurring Gift Payment

                    when 7 then 1 --Event Registration Payment

                    when 6 then 6 --Planned gift

                    when 2 then 5 --Membership

                    when 1 then 3 --Sponsorship Payment

                    when 9 then 8 --Grant Award Payment

                    when 10 then 13 -- Donor Challenge

                    --else -1

                    -- below for now 5/20/2010

                    else @APPLICATIONCODE -- donation

                  end
                )

        if @REVENUESPLITID is not null
        begin
        set @REVENUESTREAMS = 
                (
                  select
                    @REVENUESPLITID as ID,
                    @REVENUESPLITID as REVENUESPLITID,
                    @SINGLEAPPLICATIONID as APPLICATIONID,
                    (
                      case @APPLICATIONTYPECODE 
                        when 5 then 1 --Pledge Payment

                        when 8 then 3 --MGPledge Payment

                        when 4 then 2 --Recurring Gift Payment

                        when 7 then 6 --Event Registration Payment

                        when 6 then 4 --Planned gift

                        when 2 then 5 --Membership

                        when 10 then 10 -- Donor challenge payment

                        when 1 then 33 --Sponsorship Payment

                        when 9 then 9 --Grant Award Payment

                        else -1
                      end
                    ) as TYPECODE,
                    @AMOUNT as APPLIED,
                    @DECLINESGIFTAID as DECLINESGIFTAID,
                    @OPPORTUNITYID as OPPORTUNITYID,
                    1 as SEQUENCE,
                    @ISGIFTAIDSPONSORSHIP as ISGIFTAIDSPONSORSHIP,
                    @SINGLEDESIGNATIONID as DESIGNATIONID
                  for xml raw('ITEM'),type,elements,root('REVENUESTREAMS'),binary base64)
         end
         else
         begin
          set @REVENUESTREAMS = 
                (
                  select T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') as ID,
                         T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') as REVENUESPLITID,
                         T.c.value('(APPLICATIONID)[1]','uniqueidentifier') as APPLICATIONID,
                         T.c.value('(TYPECODE)[1]','tinyint') as TYPECODE,
                         T.c.value('(APPLIED)[1]','money') AS 'APPLIED',
                         @DECLINESGIFTAID as DECLINESGIFTAID,
                         @OPPORTUNITYID as OPPORTUNITYID,
                         1 as SEQUENCE,
                         @ISGIFTAIDSPONSORSHIP as ISGIFTAIDSPONSORSHIP,
                         @SINGLEDESIGNATIONID as DESIGNATIONID
                  from @REVENUESTREAMS1.nodes('/REVENUESTREAMS/ITEM') T(c)
                  where T.c.value('(APPLIED)[1]','money') > 0
                for xml raw('ITEM'),type,elements,root('REVENUESTREAMS'),binary base64)
         end
      end
      else 
      begin
        -- It's possible for @ADDITIONALAPPLICATIONSSTREAM amounts to be 0.  In that case, the

        -- designations specified in @ADDITIONALAPPLICATIONSSTREAM should still be created; otherwise,

        -- the payment could wind up with no applications, causing an error.  This

        -- occurs specifically in the case of zeroing out a payment.

        set @SPLITS = @ADDITIONALAPPLICATIONSSTREAM

        if not @ADDITIONALAPPLICATIONSSTREAM is null
          exec dbo.USP_REVENUEBATCH_VALIDATEADDITIONALAPPLICATIONS @ADDITIONALAPPLICATIONSSTREAM, @TYPECODE, @PAYMENTMETHODCODE, @CATEGORYCODEID, @ISORGANIZATION;

      end

  -- Check if the payment has been applied to any recurring gift which is not active

  -- TYPECODE : 2 = Recurring gift

  -- STATUSCODE : 0 = Active, 1 = Held, 2 = Terminated, 3 = Canceled

  if(
    exists(
      select
        1
      from
        dbo.REVENUESCHEDULE
      where
        REVENUESCHEDULE.ID in
        (
          select
            REVENUESTREAMS.APPLICATIONID
          from
            dbo.UFN_REVENUEUPDATEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS) as REVENUESTREAMS
            inner join dbo.FINANCIALTRANSACTION as RECURRINGGIFTREVENUE on RECURRINGGIFTREVENUE.ID = REVENUESTREAMS.APPLICATIONID
          where
            REVENUESTREAMS.TYPECODE = 2
            -- Bug 301742 Allow edit if payment previously existed

            and not exists
            (
              select 1
              from
                dbo.RECURRINGGIFTACTIVITY
                inner join dbo.FINANCIALTRANSACTIONLINEITEM as PAYMENTREVENUESPLIT on
                  PAYMENTREVENUESPLIT.ID = RECURRINGGIFTACTIVITY.PAYMENTREVENUEID
                  and PAYMENTREVENUESPLIT.TYPECODE <> 1
                  and PAYMENTREVENUESPLIT.DELETEDON is null
                inner join dbo.FINANCIALTRANSACTION as PAYMENTREVENUE on
                  PAYMENTREVENUE.ID = PAYMENTREVENUESPLIT.FINANCIALTRANSACTIONID
                  and PAYMENTREVENUE.ID = @REVENUEID
              where
                RECURRINGGIFTACTIVITY.SOURCEREVENUEID = RECURRINGGIFTREVENUE.ID
            )
        )
        and REVENUESCHEDULE.STATUSCODE in (1,2,3)
      )
    )
  begin
    raiserror('BBERR_PAYMENTAPPLIED_INACTIVERECURRINGGIFT', 13, 1);
  end

      select @APPLICATIONSTREAM = dbo.[UFN_REVENUEUPDATEBATCH_GETAPPLICATIONS_TOITEMLISTXML] (@ID, @SPLITS, @REVENUESTREAMS,@APPEALID, @CATEGORYCODEID,@RECOGNITIONS,@SOLICITORS)

      --set up the recognition credits for the revenuestream (applications)

      insert into @RECOGNITIONSTABLE (REVENUESPLITID, APPLICATIONID, RECOGNITIONS)
      select 
        APPS.REVENUESPLITID,
        APPS.APPLICATIONID,
        (
          select 
            REVENUERECOGNITIONID as ID, 
            CONSTITUENTID, 
            AMOUNT, 
            EFFECTIVEDATE, 
            REVENUERECOGNITIONTYPECODEID, 
            RECOGNITIONCREDITDESIGNATIONID as DESIGNATIONID, 
            RECOGNITIONCREDITFKID, 
            DONORCHALLENGERECOGNITIONTYPECODE
          from 
            dbo.UFN_REVENUEUPDATEBATCH_GETRECOGNITIONSFOREDIT_FROMITEMLISTXML(@RECOGNITIONS) REC
          where 
            REC.APPLICATIONID = coalesce(APPS.REVENUESPLITID, APPS.APPLICATIONID)
            for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64
        ) as RECOGNITIONS
      from 
        dbo.UFN_REVENUEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS) APPS
      where 
        APPS.REVENUESPLITID is not null or
        (APPS.APPLIED > 0 and APPS.APPLICATIONID is not null);

      --set up solicitors for updates

      insert into @SOLICITORSTABLE (REVENUESPLITID, APPLICATIONID, SOLICITORS)
      select 
        APPS.REVENUESPLITID,
        APPS.APPLICATIONID,
        (
          select 
            REVENUESOLICITORID as ID, 
            CONSTITUENTID, 
            AMOUNT, SEQUENCE
          from 
            dbo.UFN_REVENUEUPDATEBATCH_GETSOLICITORSFOREDIT_FROMITEMLISTXML(@SOLICITORS) SOL
          where 
            SOL.APPLICATIONID = coalesce(APPS.REVENUESPLITID, APPS.APPLICATIONID)
          for xml raw('ITEM'),type,elements,root('SOLICITORS'),binary base64
        ) as SOLICITORS
      from 
        dbo.UFN_REVENUEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS) APPS
        where 
        APPS.REVENUESPLITID is not null or
        (APPS.APPLIED > 0 and APPS.APPLICATIONID is not null);

    end -- typecode payment


    --

    -- Set statuscode when null to posted 

    if @ISPOSTED = 1
      SET @POSTSTATUSCODE = coalesce(@POSTSTATUSCODE,0)

    -- pledge and recurring gift

    if @TYPECODE in (1, 3
    begin

      declare @SPLITTABLE table
      (
        ID uniqueidentifier,
        DESIGNATIONID uniqueidentifier,
        AMOUNT money,
        SEQUENCE int
        APPLICATIONCODE tinyint,
        TYPECODE tinyint,
        CATEGORYCODEID uniqueidentifier,
        DIDCAMPAIGNSDEFAULT bit,
        TRANSACTIONCURRENCYID uniqueidentifier,
        CAMPAIGNS xml,
        DECLINESGIFTAID bit
        ISGIFTAIDSPONSORSHIP bit
        REVENUESPLITID uniqueidentifier,
        ISNEW bit
      );

      insert into @SPLITTABLE 
      (
        ID, 
        DESIGNATIONID,
        AMOUNT,
        SEQUENCE,
        APPLICATIONCODE,
        TYPECODE,
        CATEGORYCODEID,
        DIDCAMPAIGNSDEFAULT,
        CAMPAIGNS,
        DECLINESGIFTAID,
        ISGIFTAIDSPONSORSHIP, 
        REVENUESPLITID,
        ISNEW
      )
      select
        ID,
        DESIGNATIONID,
        AMOUNT,
        SEQUENCE,
        APPLICATIONCODE,
        TYPECODE,
        case when @SPLITS.exist('(/ADDITIONALAPPLICATIONSSTREAM/ITEM/CATEGORYCODEID)') = 0 then @CATEGORYCODEID else CATEGORYCODEID end,
        DIDCAMPAIGNSDEFAULT,
        (
          select
            CAMP.REVENUESPLITCAMPAIGNID as ID, 
            CAMP.CAMPAIGNID,
            CAMP.CAMPAIGNSUBPRIORITYID
          from 
            dbo.UFN_REVENUEBATCH_GETSPLITCAMPAIGNS_FROMITEMLISTXML(CAMPAIGNS) CAMP
          for xml raw('ITEM'),type,elements,root('CAMPAIGNS'),BINARY BASE64
        ) as CAMPAIGNS,
        DECLINESGIFTAID,
        ISGIFTAIDSPONSORSHIP,
        coalesce(REVENUESPLITID, newID()),
        case when REVENUESPLITID is null then 1 else 0 end
      from 
        dbo.UFN_REVENUEBATCH_SPLITSWITHCHILDREN_FROMITEMLISTXML(@SPLITS)

      set @APPLICATIONSTREAM = 
        ( 
          select
            REVENUESPLITID as ID,
            DESIGNATIONID,
            AMOUNT,
            APPLICATIONCODE,
            TYPECODE,
            DECLINESGIFTAID,
            CATEGORYCODEID, 
            @TRANSACTIONCURRENCYID as TRANSACTIONCURRENCYID
          from 
            @SPLITTABLE
          for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64
        )

      set @CAMPAIGNSTREAM = 
      ( 
        select 
          REVENUESPLITID as ID,
          cast((select T.c.query('CAMPAIGNS/ITEM') from CAMPAIGNS.nodes('/') T(c)) as xml) as CAMPAIGNS
        from 
          @SPLITTABLE
        for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64
      )

      -- parse out the recognition credits only for existing splits

      insert into @RECOGNITIONSTABLE (REVENUESPLITID, RECOGNITIONS)
      select 
        SPLITWITHRECOGNITIONS.REVENUESPLITID,
        case 
          -- If this is a new split and the user hasn't manually set recognition credits, create default recognition credits

          when SPLITWITHRECOGNITIONS.ISNEW = 1 and SPLITWITHRECOGNITIONS.RECOGNITIONS is null then
          (
            select
              CONSTITUENTID,
              AMOUNT,
              @DATE EFFECTIVEDATE, 
              REVENUERECOGNITIONTYPECODEID
            from dbo.UFN_REVENUEDETAIL_GETDEFAULTRECOGNITIONS(@GIVENANONYMOUSLY, @CONSTITUENTID, SPLITWITHRECOGNITIONS.AMOUNT, @DATE, null)
            for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64
          )
          else SPLITWITHRECOGNITIONS.RECOGNITIONS
        end
      from 
      (
        select
          REVENUESPLITID,
          ISNEW,
          AMOUNT,
          (
            select 
              REVENUERECOGNITIONID as ID, 
              CONSTITUENTID, 
              AMOUNT, 
              EFFECTIVEDATE, 
              REVENUERECOGNITIONTYPECODEID
            from dbo.UFN_REVENUEUPDATEBATCH_GETRECOGNITIONSFOREDIT_FROMITEMLISTXML(@RECOGNITIONS) REC
            where REC.DESIGNATIONID = SPLITS.DESIGNATIONID
            for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64
          ) as RECOGNITIONS
        from @SPLITTABLE SPLITS
      ) as SPLITWITHRECOGNITIONS

      -- handle solicitors

      insert into @SOLICITORSTABLE (REVENUESPLITID, SOLICITORS)
      select 
        SPLITS.REVENUESPLITID,
        (
          select 
            REVENUESOLICITORID as ID, 
            CONSTITUENTID, 
            AMOUNT, 
            SEQUENCE
          from 
            dbo.UFN_REVENUEUPDATEBATCH_GETSOLICITORSFOREDIT_FROMITEMLISTXML(@SOLICITORS) SOL
          where 
            SOL.DESIGNATIONID = SPLITS.DESIGNATIONID
          for xml raw('ITEM'),type,elements,root('SOLICITORS'),binary base64
        ) as SOLICITORS
      from 
        @SPLITTABLE SPLITS

      if not @SPLITS is null
        exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS, @AMOUNT, @TYPECODE;
      else
        if @SINGLEDESIGNATIONID is null
          raiserror('ERR_SINGLEDESIGNATION_REQUIRED', 13, 1);

      -- for pledge only

      if @TYPECODE = 1
      begin
        -- redo the splits collection

        set @SPLITS = 
          (
            select 
              REVENUESPLITID as ID,
              DESIGNATIONID,
              AMOUNT,
              SEQUENCE
              APPLICATIONCODE,
              TYPECODE,
              CAMPAIGNS.query('(CAMPAIGNS/ITEM)') as CAMPAIGNS,
              DECLINESGIFTAID,
              ISGIFTAIDSPONSORSHIP,
              @TRANSACTIONCURRENCYID as TRANSACTIONCURRENCYID
            from 
              @SPLITTABLE
            for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64
          )

        -- handle pledge installments here

        set @INSTALLMENTS = 
          (
            select
              T.c.value('(INSTALLMENTID)[1]','uniqueidentifier') AS 'ID',
              T.c.value('(DATE)[1]','datetime') AS 'DATE',
              T.c.value('(AMOUNT)[1]','money') AS 'AMOUNT',
              T.c.value('(RECEIPTAMOUNT)[1]','money') AS 'RECEIPTAMOUNT',
              T.c.value('(BALANCE)[1]','money') AS 'BALANCE',
              T.c.value('(APPLIED)[1]','money') AS 'APPLIED',
              T.c.value('(SEQUENCE)[1]','int') AS 'SEQUENCE',
              @TRANSACTIONCURRENCYID as 'TRANSACTIONCURRENCYID',
              (
                select 
                  INSTALLMENTSPLITID as ID,
                  AMOUNT,
                  APPLIED,
                  DESIGNATIONID,
                  @TRANSACTIONCURRENCYID as 'TRANSACTIONCURRENCYID'
                from 
                  dbo.UFN_REVENUEUPDATEBATCH_GETINSTALLMENTSPLITS_FROMITEMLISTXML(T.c.query('(INSTALLMENTSPLITS)[1]'))
                for xml raw('ITEM'),type,elements,BINARY BASE64
              ) as 'INSTALLMENTSPLITS'
            from 
              @INSTALLMENTS.nodes('/INSTALLMENTS/ITEM') T(c)
            for xml raw('ITEM'),type,elements,root('INSTALLMENTS'),binary base64
          )

          update T1 set T1.INSTALLMENTAMOUNT = T2.INSTALLMENTAMOUNT 
            from dbo.PLEDGEINSTALLMENTOPTION T1 
            inner join dbo.BATCHREVENUE T2 on T1.ID = T2.REVENUEID and T2.ID = @BATCHROWID 


        /*
        exec dbo.USP_REVENUEUPDATEBATCH_BUILDINSTALLMENTS 
            @REVENUEID, 
            @AMOUNT, 
            @PREVIOUSAMOUNT,
            @INSTALLMENTFREQUENCYCODE,
            @NUMBEROFINSTALLMENTS,
            @TRANSACTIONCURRENCYID,
            @SPLITS, 
            @INSTALLMENTS output,
            @DATE,
            @PREVIOUSDATE
        */
      end

      if @TYPECODE = 3 -- recurring gift

      begin
        --get first installment w/ no activity, and after which there is no activity WI#254736

        exec dbo.USP_DATAFORMTEMPLATE_EDITLOAD_RECURRINGGIFT_2 @ID = @REVENUEID, @NEXTINSTALLMENTID = @NEXTINSTALLMENTID output, @LASTACTIVITYDATE = @LASTACTIVITYDATE output, @PREVIOUSSCHEDULESEEDDATE = @PREVIOUSSCHEDULESEEDDATE output;
      end
    end -- typecode pledge or recurring gift


    -- Handle validation for revenue splits and duplicate campaigns.

    -- Only run if validating since we'll get there's a constraint on the table that will generate 

    -- an error if it's inserted and that's processed as an expected DB exception.

    if (@VALIDATEONLY = 1)
    begin
      if (not @SPLITS is null)
      begin
        declare @CAMPAIGNSVALIDATE xml;
        declare CAMPAIGNVALIDATECURSOR cursor local fast_forward for 

        select
          CAMPAIGNS
        from 
          dbo.UFN_REVENUEBATCH_SPLITSWITHCHILDREN_FROMITEMLISTXML(@CAMPAIGNSTREAM);

        open CAMPAIGNVALIDATECURSOR;

        fetch next from CAMPAIGNVALIDATECURSOR into @CAMPAIGNSVALIDATE;

        while @@FETCH_STATUS = 0
        begin
          if exists(
            select 1 
            from 
              dbo.UFN_REVENUESPLIT_CAMPAIGNS_FROMITEMLISTXML(@CAMPAIGNSVALIDATE
            group by 
              CAMPAIGNID, CAMPAIGNSUBPRIORITYID
            having count(*) > 1
          )
          begin
            raiserror('ERR_VALIDATION_DUPLICATECAMPAIGN', 13, 1);
          end

          fetch next from CAMPAIGNVALIDATECURSOR into @CAMPAIGNSVALIDATE;
        end

        close CAMPAIGNVALIDATECURSOR;
        deallocate CAMPAIGNVALIDATECURSOR;
      end

      -- When actually committing, the declarations will be validated through table constraints

      exec dbo.USP_BATCH_VALIDATETAXDECLARATIONS @TAXDECLARATIONS = @TAXDECLARATIONS, @BATCHTYPE = 1, @CONSTITUENTID = @CONSTITUENTID
    end

    --Fetching this so we can use the newest payment detail edit procedures

    declare @SEPAMANDATEID uniqueidentifier;
    select
      @SEPAMANDATEID = REVENUESCHEDULEDIRECTDEBITPAYMENT.SEPAMANDATEID
    from
      dbo.REVENUESCHEDULEDIRECTDEBITPAYMENT
    where
      REVENUESCHEDULEDIRECTDEBITPAYMENT.ID = @REVENUEID
      and
      @PAYMENTMETHODCODE = 3;

    -- process the edits

    --

    -- handle payments

    if @ISPAYMENT = 1
    begin 
      if @RECEIPTAMOUNT > @AMOUNT
        raiserror('ERR_VALIDATE_RECEIPTAMOUNT', 13, 1);

      --Calculate the Gift fee if either UPDATEGIFTFEE field is not included or its value is set to true

      if @UPDATEGIFTFEES is null or @UPDATEGIFTFEES = 1
      begin
        set @SHOULDUPDATEGIFTFEE = dbo.UFN_REVENUE_SHOULDUPDATEGIFTFEE(@REVENUEID, @CONSTITUENTID, @PAYMENTMETHODCODE, @TRANSACTIONCURRENCYID, @BASECURRENCYID, @BASEEXCHANGERATEID, @ORGANIZATIONEXCHANGERATEID, @APPLICATIONSTREAM, @RECEIPTAMOUNT, @AMOUNT)
      end

      declare @OLDPOSTSTATUSCODE tinyint;    
      if @ISPOSTED = 0
        select 
          @OLDPOSTSTATUSCODE = 
          (
            case when REVENUE.DONOTPOST = 1 then 
              2 
            else 
              1 
            end 
          )
        from 
          dbo.REVENUE 
        where 
          REVENUE.ID = @REVENUEID;
      else
      begin
        select 
          @OLDPOSTSTATUSCODE = ADJUSTMENT.POSTSTATUSCODE 
        from 
          dbo.ADJUSTMENT 
        where 
          ADJUSTMENT.REVENUEID = @REVENUEID 
          and ADJUSTMENT.POSTSTATUSCODE <> 0;

        if @OLDPOSTSTATUSCODE is null
          set @OLDPOSTSTATUSCODE = @ADJUSTMENTPOSTSTATUSCODE;
      end

      if @ISPOSTED  = 0
      begin
        if @ISMISCELLANEOUSPAYMENT = 0 and @HASGIFTAIDSPLITONPENDINGR68PROCESS = 0
        begin
          exec dbo.USP_DATAFORMTEMPLATE_EDIT_PAYMENT7
            @ID = @REVENUEID,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @DATE = @DATE,
            @AMOUNT = @AMOUNT,
            @RECEIPTAMOUNT = @RECEIPTAMOUNT,
            @REVENUESTREAMS = @APPLICATIONSTREAM,
            @SOURCECODE = @SOURCECODE,
            @APPEALID = @APPEALID,
            @BENEFITS = @BENEFITS,
            @BENEFITSWAIVED = @BENEFITSWAIVED,
            @GIVENANONYMOUSLY = @GIVENANONYMOUSLY,
            @MAILINGID = @MAILINGID,
            @CHANNELCODEID = @CHANNELCODEID,
            @DONOTRECEIPT = @DONOTRECEIPT,
            @DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE,
            @REFERENCE = @REFERENCE,
            @POSTSTATUSCODE = @POSTSTATUSCODE,
            @POSTDATE = @POSTDATE,
            @PAYMENTMETHODCODE = @PAYMENTMETHODCODE,
            @OTHERPAYMENTMETHODCODEID = @OTHERPAYMENTMETHODCODEID,
            @CHECKDATE = @CHECKDATE,
            @CHECKNUMBER = @CHECKNUMBER,
            @REFERENCEDATE = @REFERENCEDATE,
            @REFERENCENUMBER = @REFERENCENUMBER,
            @CARDHOLDERNAME = @CARDHOLDERNAME,
            @CREDITCARDNUMBER = @CREDITCARDNUMBER,
            @CREDITTYPECODEID = @CREDITTYPECODEID,
            @AUTHORIZATIONCODE = @AUTHORIZATIONCODE,
            @EXPIRESON = @EXPIRESON,
            @ISSUER = @ISSUER,
            @NUMBEROFUNITS = @NUMBEROFUNITS,
            @SYMBOL = @SYMBOL,
            @MEDIANPRICE = @MEDIANPRICE,
            @GIFTINKINDSUBTYPECODEID = @GIFTINKINDSUBTYPECODEID,
            @PROPERTYSUBTYPECODEID = @PROPERTYSUBTYPECODEID,
            @CONSTITUENTACCOUNTID = @CONSTITUENTACCOUNTID,
            @DIRECTDEBITRESULTCODE = @DIRECTDEBITRESULTCODE,
            @LOWPRICE = @LOWPRICE,
            @HIGHPRICE = @HIGHPRICE,
            @GIFTINKINDITEMNAME = @GIFTINKINDITEMNAME,
            @GIFTINKINDDISPOSITIONCODE = @GIFTINKINDDISPOSITIONCODE,
            @GIFTINKINDNUMBEROFUNITS = @GIFTINKINDNUMBEROFUNITS,
            @GIFTINKINDFAIRMARKETVALUE = @GIFTINKINDFAIRMARKETVALUE,
            @DIRECTDEBITISREJECTED = @DIRECTDEBITISREJECTED,
            @PERCENTAGEBENEFITS = @PERCENTAGEBENEFITS,
            @BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
            @EXCHANGERATE = @EXCHANGERATE,
            @ADJUSTMATCHINGGIFTCLAIMS = @UPDATEMATCHINGGIFTCLAIMS,
            @CURRENTAPPUSERID = @CURRENTAPPUSERID,   
            @UPDATEGIFTFEEOPTION = null,
            @UPDATETRIBUTEOPTION = null,
            @VALIDATETRIBUTES = null,
            @SALE_SALEDATE = @SALEDATE,
            @SALE_SALEAMOUNT = @SALEAMOUNT,
            @SALE_BROKERFEES = @BROKERFEE,
            @SALE_GLPOSTDATE = @SALEPOSTDATE,
            @SALE_GLPOSTSTATUS = @SALEPOSTSTATUSCODE,
            @SALE_LOWPRICE = @SALE_LOWPRICE,
            @SALE_MEDIANPRICE = @SALE_MEDIANPRICE,
            @SALE_HIGHPRICE = @SALE_HIGHPRICE,
            @SEPAMANDATEID = @SEPAMANDATEID,
            @BATCHROWID = @BATCHROWID,
            @NUMBEROFUNITSSOLD = @NUMBEROFUNITSSOLD;

        end
      end  -- is unposted

      else -- posted payments

      begin
        if @ISMISCELLANEOUSPAYMENT = 0 and (@ISORDERAPPLICATION = 0) and (@HASGIFTAIDSPLITONPENDINGR68PROCESS = 0)
        begin
          exec dbo.USP_DATAFORMTEMPLATE_EDIT_PAYMENTADJUST7
            @ID = @REVENUEID,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @DATE = @DATE,
            @AMOUNT = @AMOUNT,
            @RECEIPTAMOUNT = @RECEIPTAMOUNT,
            @REVENUESTREAMS = @APPLICATIONSTREAM,
            @SOURCECODE = @SOURCECODE,
            @APPEALID = @APPEALID,
            @BENEFITS = @BENEFITS,
            @BENEFITSWAIVED = @BENEFITSWAIVED,
            @GIVENANONYMOUSLY = @GIVENANONYMOUSLY,
            @MAILINGID = @MAILINGID,
            @CHANNELCODEID = @CHANNELCODEID,
            @DONOTRECEIPT = @DONOTRECEIPT,
            @DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE,
            @REFERENCE = @REFERENCE,
            @ADJUSTMENTDATE = @ADJUSTMENTDATE,
            @ADJUSTMENTPOSTDATE = @ADJUSTMENTPOSTDATE,
            @ADJUSTMENTREASON = @ADJUSTMENTREASON,
            @PAYMENTMETHODCODE = @PAYMENTMETHODCODE,
            @OTHERPAYMENTMETHODCODEID = @OTHERPAYMENTMETHODCODEID,
            @CHECKDATE = @CHECKDATE,
            @CHECKNUMBER = @CHECKNUMBER,
            @REFERENCEDATE = @REFERENCEDATE,
     @REFERENCENUMBER = @REFERENCENUMBER,
            @CARDHOLDERNAME = @CARDHOLDERNAME,
            @CREDITCARDNUMBER = @CREDITCARDNUMBER,
            @CREDITTYPECODEID = @CREDITTYPECODEID,
            @AUTHORIZATIONCODE = @AUTHORIZATIONCODE,
            @EXPIRESON = @EXPIRESON,
            @ISSUER = @ISSUER,
            @NUMBEROFUNITS = @NUMBEROFUNITS,
            @SYMBOL = @SYMBOL,
            @MEDIANPRICE = @MEDIANPRICE,
            @GIFTINKINDSUBTYPECODEID = @GIFTINKINDSUBTYPECODEID,
            @PROPERTYSUBTYPECODEID = @PROPERTYSUBTYPECODEID,
            @CONSTITUENTACCOUNTID = @CONSTITUENTACCOUNTID,
            @DIRECTDEBITRESULTCODE = @DIRECTDEBITRESULTCODE,
            @LOWPRICE = @LOWPRICE,
            @HIGHPRICE = @HIGHPRICE,
            @ADJUSTMENTREASONCODEID = @ADJUSTMENTREASONCODEID,
            @ADJUSTMENTPOSTSTATUSCODE = @ADJUSTMENTPOSTSTATUSCODE,
            @GIFTINKINDITEMNAME = @GIFTINKINDITEMNAME,
            @GIFTINKINDDISPOSITIONCODE = @GIFTINKINDDISPOSITIONCODE,
            @GIFTINKINDNUMBEROFUNITS = @GIFTINKINDNUMBEROFUNITS,
            @GIFTINKINDFAIRMARKETVALUE = @GIFTINKINDFAIRMARKETVALUE,
            @DIRECTDEBITISREJECTED = @DIRECTDEBITISREJECTED,
            @PERCENTAGEBENEFITS = @PERCENTAGEBENEFITS,
            @BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
            @EXCHANGERATE = @EXCHANGERATE,
            @CURRENTAPPUSERID = @CURRENTAPPUSERID,
            @ADJUSTMATCHINGGIFTCLAIMS = @UPDATEMATCHINGGIFTCLAIMS,
            @UPDATEGIFTFEEOPTION = @UPDATEGIFTFEES,
            @UPDATETRIBUTEOPTION = null,
            @VALIDATETRIBUTES = null,
            @DEPOSITID = null,
            @SEPAMANDATEID = @SEPAMANDATEID,            
            @NUMBEROFUNITSSOLD = @NUMBEROFUNITSSOLD,
            @SALE_SALEDATE = @SALEDATE,
            @SALE_SALEAMOUNT = @SALEAMOUNT,
            @SALE_BROKERFEES = @BROKERFEE,
            @SALE_GLPOSTDATE = @SALEPOSTDATE,
            @SALE_GLPOSTSTATUS = @SALEPOSTSTATUSCODE,
            @SALE_LOWPRICE = @SALE_LOWPRICE,
            @SALE_MEDIANPRICE = @SALE_MEDIANPRICE,
            @SALE_HIGHPRICE = @SALE_HIGHPRICE;
          set @SHOULDUPDATEGIFTFEE = 0
        end
        /*
        if @ISORDERAPPLICATION and (not @ISMISCELLANEOUSPAYMENT) AndAlso Not @ISMIXEDORDERPAYMENT AndAlso (Not @HASGIFTAIDSPLITONPENDINGR68PROCESS)
        begin
          exec dbo.USP_DATAFORMTEMPLATE_EDIT_ORDERPAYMENTADJUST
        end
        */
      end  

      --AnkushGu - 12/18/2012 - WI 248767

      --We need to perform clean up from RUB when we change the Payment method from Other type to Donation, Unapplied MG etc.

      exec dbo.USP_REVENUEUPDATEBATCH_CLEANUPOTHERPAYMENTRECORDS @REVENUESTREAM = @APPLICATIONSTREAM

      --If any marketing information is null, try to default based on applications

      if @SOURCECODE is null or @SOURCECODE = '' or @MAILINGID is null or @APPEALID is null
        exec dbo.USP_REVENUE_DEFAULTMARKETINGINFORMATION @ID, @CHANGEAGENTID, @CURRENTDATE;

      if @PAYMENTMETHODCODE = 2 and len(@VENDORID) > 0 and @TRANSACTIONID is not null
        update CCD set
          VENDORID = isnull(@VENDORID, '')
          ,TRANSACTIONID = @TRANSACTIONID
          ,CHANGEDBYID = @CHANGEAGENTID
          ,DATECHANGED = @CURRENTDATE
        from dbo.CREDITCARDPAYMENTMETHODDETAIL CCD
        inner join dbo.REVENUEPAYMENTMETHOD RPM on CCD.ID = RPM.ID
        where RPM.REVENUEID = @REVENUEID;

    end  -- is payment

    --

    -- edit pledge

    if @ISPLEDGE = 1
    begin
      declare @ISMEMBERSHIPPLEDGE bit;
      declare @INSTALLMENTAMOUNT money;

      select
        @ISMEMBERSHIPPLEDGE = 
          case 
            when FINANCIALTRANSACTION.TYPECODE = 15 then
              1
            else
              0
          end,
        @INSTALLMENTAMOUNT = PLEDGEINSTALLMENTOPTION.INSTALLMENTAMOUNT
      from
        dbo.FINANCIALTRANSACTION
      left join
        dbo.PLEDGEINSTALLMENTOPTION on PLEDGEINSTALLMENTOPTION.ID = FINANCIALTRANSACTION.ID
      where
        FINANCIALTRANSACTION.ID = @REVENUEID;

      if @ISPOSTED = 0
      begin
        -- edit the main pledge information

        exec dbo.USP_DATAFORMTEMPLATE_EDIT_PLEDGE_8
          @ID = @REVENUEID,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @DATE = @DATE,
          @AMOUNT = @AMOUNT,
          @POSTSTATUSCODE = @POSTSTATUSCODE,
          @POSTDATE = @POSTDATE,
          @SENDPLEDGEREMINDER = @SENDPLEDGEREMINDER,
          @SPLITS = @APPLICATIONSTREAM,
          @FREQUENCYCODE = @INSTALLMENTFREQUENCYCODE,
          @NUMBEROFINSTALLMENTS = @NUMBEROFINSTALLMENTS,
          @NEXTTRANSACTIONDATE = @INSTALLMENTSTARTDATE,
          @INSTALLMENTS = @INSTALLMENTS,
          @SOURCECODE = @SOURCECODE,
          @APPEALID = @APPEALID,
          @BENEFITS = @BENEFITS,
          @BENEFITSWAIVED = @BENEFITSWAIVED,
          @GIVENANONYMOUSLY = @GIVENANONYMOUSLY,
          @MAILINGID = @MAILINGID,
          @CHANNELCODEID = @CHANNELCODEID,
          @DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE,
          @PLEDGESUBTYPEID = @PLEDGESUBTYPEID,
          @OPPORTUNITYID = @OPPORTUNITYID,
          @REFERENCE = @REFERENCE,
          @CATEGORYCODEID = @CATEGORYCODEID,
          @ADJPAYMENT_DATE = @ADJPAYMENT_DATE,
          @ADJPAYMENT_POSTDATE = @ADJPAYMENT_POSTDATE,
          @ADJPAYMENT_REASONCODEID = @ADJPAYMENT_REASONCODEID,
          @ADJPAYMENT_DETAILS = @ADJPAYMENT_DETAILS,
          @PERCENTAGEBENEFITS = @PERCENTAGEBENEFITS,
          @BASECURRENCYID = @BASECURRENCYID,
          @TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
          @BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
          @EXCHANGERATE = @EXCHANGERATE,
          @HADSPOTRATE = @HADSPOTRATE,
          @RATECHANGED = @RATECHANGED,
          @UPDATERECOGNITIONOPTION = 0,
          @UPDATETRIBUTEOPTION = 0,
          @VALIDATETRIBUTES = 0, --We do our own validation and will update the tributes in a future step.

          @ISMEMBERSHIPPLEDGE = @ISMEMBERSHIPPLEDGE,
          @INSTALLMENTAMOUNT = @INSTALLMENTAMOUNT;
      end
      else
      begin
        exec dbo.USP_DATAFORMTEMPLATE_EDIT_PLEDGEADJUST_9
          @ID = @REVENUEID,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @DATE = @DATE,
          @AMOUNT = @AMOUNT,
          @POSTSTATUSCODE = @POSTSTATUSCODE,
          @POSTDATE = @POSTDATE,
          @SENDPLEDGEREMINDER = @SENDPLEDGEREMINDER,
          @SPLITS = @APPLICATIONSTREAM,
          @FREQUENCYCODE = @INSTALLMENTFREQUENCYCODE,
          @NUMBEROFINSTALLMENTS =@NUMBEROFINSTALLMENTS,
          @NEXTTRANSACTIONDATE = @INSTALLMENTSTARTDATE,
          @INSTALLMENTS = @INSTALLMENTS,
          @SOURCECODE = @SOURCECODE,
          @APPEALID = @APPEALID,
          @BENEFITS = @BENEFITS,
          @BENEFITSWAIVED = @BENEFITSWAIVED,
          @GIVENANONYMOUSLY = @GIVENANONYMOUSLY,
          @MAILINGID = @MAILINGID,
          @CHANNELCODEID = @CHANNELCODEID,
          @DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE,
          @PLEDGESUBTYPEID = @PLEDGESUBTYPEID,
          @OPPORTUNITYID = @OPPORTUNITYID,
          @REFERENCE = @REFERENCE,
          @CATEGORYCODEID = @CATEGORYCODEID,
          @ADJUSTMENTDATE = @ADJUSTMENTDATE,
          @ADJUSTMENTPOSTDATE = @ADJUSTMENTPOSTDATE,
          @ADJUSTMENTREASON = @ADJUSTMENTREASON,
          @ADJUSTMENTREASONCODEID = @ADJUSTMENTREASONCODEID,
          @ADJPAYMENT_DATE = @ADJPAYMENT_DATE,
          @ADJPAYMENT_POSTDATE = @ADJPAYMENT_POSTDATE,
          @ADJPAYMENT_REASONCODEID = @ADJPAYMENT_REASONCODEID,
          @ADJPAYMENT_DETAILS = @ADJPAYMENT_DETAILS,
          @PERCENTAGEBENEFITS = @PERCENTAGEBENEFITS,
          @BASECURRENCYID = @BASECURRENCYID,
          @TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
          @BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
          @EXCHANGERATE = @EXCHANGERATE,
          @HADSPOTRATE = @HADSPOTRATE,
          @RATECHANGED = @RATECHANGED,
          @UPDATERECOGNITIONOPTION = 0,
          @UPDATETRIBUTEOPTION= 0,
          @VALIDATETRIBUTES = 0; --We do our own validation and will update the tributes in a future step.

      end 

      -- edit the payment method information

      exec dbo.USP_DATAFORMTEMPLATE_EDIT_PLEDGEPAYMENTDETAILS_6
        @ID = @REVENUEID,
        @CHANGEAGENTID = @CHANGEAGENTID,
        @PAYMENTMETHODCODE = @PAYMENTMETHODCODE,
        @AUTOPAY = @AUTOPAY,
        @CARDHOLDERNAME = @CARDHOLDERNAME,
        @CREDITCARDNUMBER = @CREDITCARDNUMBER,
        @CREDITTYPECODEID = @CREDITTYPECODEID,
        @EXPIRESON = @EXPIRESON,
        @REFERENCEDATE = @REFERENCEDATE,
        @REFERENCENUMBER = @REFERENCENUMBER,
        @ACCOUNTID = @CONSTITUENTACCOUNTID,
        @CREDITCARDTOKEN = @CREDITCARDTOKEN,
        @STANDINGORDERSETUP = @STANDINGORDERSETUP,
        @STANDINGORDERSETUPDATE = @STANDINGORDERSETUPDATE,
        @DDISOURCECODEID = @DDISOURCECODEID,
        @DDISOURCEDATE = @DDISOURCEDATE,
        @SENDPMINSTRUCTION = @SENDPMINSTRUCTION,
        @PMINSTRUCTIONTOSENDCODE = @PMINSTRUCTIONTOSENDCODE,
        @PMINSTRUCTIONDATE_NEW = @PMINSTRUCTIONDATE_NEW,
        @PMINSTRUCTIONDATE_CANCEL = @PMINSTRUCTIONDATE_CANCEL,
        @PMINSTRUCTIONDATE_SETUP = @PMINSTRUCTIONDATE_SETUP,
        @PMADVANCENOTICESENTDATE = @PMADVANCENOTICESENTDATE,
        @UPDATEOTHERTRANSACTIONSTOUSENEWCREDITCARD = 0,
        @USESYSTEMGENERATEDREFERENCENUMBER = @GENERATEREFERENCENUMBER,
        @STANDINGORDERREFERENCENUMBER = @STANDINGORDERREFERENCENUMBER,
        @SEPAMANDATEID = @SEPAMANDATEID

    end -- edit pledge

    --

    -- edit recurring gift   

    if @ISRECURRINGGIFT = 1
    begin
      declare @ISMEMBERSHIPRECURRING bit;

      if exists
      (
        select REVENUESPLIT.ID
        from dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT
        inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID
        inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = REVENUESPLIT.ID
        where REVENUESPLIT.FINANCIALTRANSACTIONID = @ID and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1
      )
      begin
        set @ISMEMBERSHIPRECURRING = 1
      end
      else
      begin
        set @ISMEMBERSHIPRECURRING = 0
      end

      exec dbo.USP_DATAFORMTEMPLATE_EDIT_RECURRINGGIFT_9
        @ID = @REVENUEID,
        @CHANGEAGENTID = @CHANGEAGENTID,
        @DATE = @DATE,
        @AMOUNT = @AMOUNT,
        @SPLITS = @APPLICATIONSTREAM,
        @FREQUENCYCODE = @INSTALLMENTFREQUENCYCODE,
        @ENDDATE = @INSTALLMENTENDDATE,
        @STARTDATE = @INSTALLMENTSTARTDATE,
        @FINDERNUMBER = @FINDERNUMBER,
        @SOURCECODE = @SOURCECODE,
        @APPEALID = @APPEALID,
        @GIVENANONYMOUSLY = @GIVENANONYMOUSLY,
        @MAILINGID = @MAILINGID,
        @CHANNELCODEID = @CHANNELCODEID,
        @DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE,
        @REFERENCE = @REFERENCE,
        @CATEGORYCODEID = @CATEGORYCODEID,
        @SENDREMINDER = @SENDPLEDGEREMINDER,
        @NEXTINSTALLMENTID = @NEXTINSTALLMENTID,
        @REVENUEDEVELOPMENTFUNCTIONCODEID = @REVENUEDEVELOPMENTFUNCTIONCODEID,
        @TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
        @BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
        @EXCHANGERATE = @EXCHANGERATE,
        @HADSPOTRATE = @HADSPOTRATE,
        @RATECHANGED = @RATECHANGED,
        @UPDATERECOGNITIONOPTION = 2,
        @SCHEDULESEEDDATE = @INSTALLMENTSCHEDULESEEDDATE,
        @ISMEMBERSHIPRECURRING =  @ISMEMBERSHIPRECURRING,
        @PREVIOUSSCHEDULESEEDDATE = @PREVIOUSSCHEDULESEEDDATE,
        @LASTACTIVITYDATE = @LASTACTIVITYDATE

       -- Use the partial card number if set. This field for the payment method of Credit card - last 4 digits

       if coalesce(@PARTIALCREDITCARDNUMBER, '') <> ''
          set @CREDITCARDNUMBER = @PARTIALCREDITCARDNUMBER

      -- edit payment method details

      exec dbo.USP_DATAFORMTEMPLATE_EDIT_RECURRINGGIFTPAYMENTDETAILS_7
        @ID = @REVENUEID,
        @CHANGEAGENTID = @CHANGEAGENTID
        @PAYMENTMETHODCODE = @PAYMENTMETHODCODE,
        @AUTOPAY = @AUTOPAY,
        @CARDHOLDERNAME = @CARDHOLDERNAME,
        @CREDITCARDNUMBER = @CREDITCARDNUMBER,
        @CREDITTYPECODEID = @CREDITTYPECODEID,
        @EXPIRESON = @EXPIRESON,
        @REFERENCEDATE = @REFERENCEDATE,
        @REFERENCENUMBER = @REFERENCENUMBER,
        @ACCOUNTID = @CONSTITUENTACCOUNTID,
        @CREDITCARDTOKEN = @CREDITCARDTOKEN,
        @STANDINGORDERSETUP = @STANDINGORDERSETUP,
        @STANDINGORDERSETUPDATE = @STANDINGORDERSETUPDATE,
        @DDISOURCECODEID = @DDISOURCECODEID,
        @DDISOURCEDATE = @DDISOURCEDATE,
        @SENDPMINSTRUCTION = @SENDPMINSTRUCTION,
        @PMINSTRUCTIONTOSENDCODE = @PMINSTRUCTIONTOSENDCODE,
        @PMINSTRUCTIONDATE_NEW = @PMINSTRUCTIONDATE_NEW,
        @PMINSTRUCTIONDATE_CANCEL = @PMINSTRUCTIONDATE_CANCEL,
        @PMINSTRUCTIONDATE_SETUP = @PMINSTRUCTIONDATE_SETUP,
        @PMADVANCENOTICESENTDATE = @PMADVANCENOTICESENTDATE,
        @UPDATEOTHERTRANSACTIONSTOUSENEWCREDITCARD = 0,
        @USESYSTEMGENERATEDREFERENCENUMBER = @GENERATEREFERENCENUMBER,
        @STANDINGORDERREFERENCENUMBER = @STANDINGORDERREFERENCENUMBER,
        @SEPAMANDATEID = @SEPAMANDATEID,
        @OTHERPAYMENTMETHODCODEID  = @OTHERPAYMENTMETHODCODEID;
    end  -- edit recurring gift


    -- handle campaign updates

    if @CAMPAIGNSTREAM is not null
    begin
      declare @CAMPAIGNREVENUESPLITID uniqueidentifier, @CAMPAIGNS xml
      declare CAMPAIGNCURSOR cursor local fast_forward for 
        select
          ID,
          CAMPAIGNS
        from 
          dbo.UFN_REVENUEBATCH_SPLITSWITHCHILDREN_FROMITEMLISTXML(@CAMPAIGNSTREAM)

      open CAMPAIGNCURSOR
      fetch next from CAMPAIGNCURSOR into @CAMPAIGNREVENUESPLITID, @CAMPAIGNS

      while @@FETCH_STATUS = 0
      begin
        exec dbo.USP_REVENUESPLIT_CAMPAIGNS_UPDATEFROMXML @CAMPAIGNREVENUESPLITID, @CAMPAIGNS, @CHANGEAGENTID;

        fetch next from CAMPAIGNCURSOR into @CAMPAIGNREVENUESPLITID, @CAMPAIGNS
      end

      close CAMPAIGNCURSOR
      deallocate CAMPAIGNCURSOR
    end

    -- handle revenue ID update

    if @PREVIOUSREVENUELOOKUPID <> @REVENUELOOKUPID
    begin
      update dbo.REVENUE 
        set
          CUSTOMIDENTIFIER = rtrim(ltrim(@REVENUELOOKUPID)),
          CHANGEDBYID = @CHANGEAGENTID,
          DATECHANGED = @CURRENTDATE
      where 
        ID = @REVENUEID
    end

    -- handle lockbox changes

    if @LOCKBOXCHANGED = 1
    begin
      exec dbo.USP_DATAFORMTEMPLATE_EDIT_REVENUELOCKBOX
        @ID = @REVENUEID,
        @CHANGEAGENTID = @CHANGEAGENTID,
        @LOCKBOXID = @LOCKBOXID,
        @BATCHNUMBER = @LOCKBOXBATCHNUMBER,
        @BATCHSEQUENCE = @LOCKBOXBATCHSEQUENCE
    end;

    -- always handle tributes in case records have been all deleted

    -- reload tributes replacing id with revenuetributeid

    if @TRIBUTES is not null
    begin
      set @TRIBUTES = 
        (
          select
            coalesce(ID, newid()) as ID,
            AMOUNT,
            TRIBUTEID,
            DESIGNATIONID,
                      BASECURRENCYID,
            ORGANIZATIONAMOUNT,
            ORGANIZATIONEXCHANGERATEID
          from 
            dbo.UFN_REVENUE_GETTRIBUTES_2_FROMITEMLISTXML(@TRIBUTES)
          for xml raw('ITEM'),type,elements,root('TRIBUTES'),binary base64
        )
    end

    set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
    set @ORGANIZATIONEXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTORGANIZATIONRATE(@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATE, null, @TRANSACTIONCURRENCYID);

    set @TRIBUTES = dbo.UFN_REVENUETRIBUTE_CONVERTAMOUNTSINXML(@TRIBUTES, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID);
    exec dbo.USP_REVENUE_GETTRIBUTES_2_UPDATEFROMXML 
      @REVENUEID = @REVENUEID
      @XML = @TRIBUTES,
      @CHANGEAGENTID = @CHANGEAGENTID,
      @CHANGEDATE = @CURRENTDATE

    /* commenting out since UI will handle creating default tribute letters
    if @TRIBUTES is not null
    begin
      -- insert default revenue tribute letters for any acknowledgees that have corresponding tribute letter codes
      insert into dbo.REVENUETRIBUTELETTER(ID,REVENUETRIBUTEID,CONSTITUENTID,TRIBUTELETTERCODEID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
      select newid(),RT.ID,TA.CONSTITUENTID,TA.TRIBUTELETTERCODEID,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE
      from dbo.REVENUETRIBUTE RT
      inner join dbo.TRIBUTEACKNOWLEDGEE TA on RT.TRIBUTEID = TA.TRIBUTEID
      where TA.TRIBUTELETTERCODEID is not null 
      and RT.REVENUEID = @REVENUEID
      and not exists (select 'x' from REVENUETRIBUTELETTER where REVENUETRIBUTELETTER.REVENUETRIBUTEID = RT.ID and REVENUETRIBUTELETTER.CONSTITUENTID = TA.CONSTITUENTID and REVENUETRIBUTELETTER.TRIBUTELETTERCODEID = TA.TRIBUTELETTERCODEID);
    end
    */

    if @ISRECURRINGGIFT = 1
    begin
    -- handle benefits 

    if @BENEFITS is not null
    begin
      set @BENEFITS = 
        (
          select
            coalesce(REVENUEBENEFITID, newID()) as ID,
            BENEFITID,
            QUANTITY,
            UNITVALUE,
            TOTALVALUE,
            DETAILS,
            SEQUENCE
          from 
            dbo.UFN_REVENUEBATCH_GETBENEFITS_FROMITEMLISTXML(@BENEFITS)  
          for xml raw('ITEM'),type,elements,root('BENEFITS'),binary base64
        )
    end

    if @PERCENTAGEBENEFITS is not null
    begin
      set @PERCENTAGEBENEFITS = 
        (
          select
            coalesce(REVENUEBENEFITID, newID()) as ID,
            BENEFITID,
            PERCENTAPPLICABLEAMOUNT,
            VALUEPERCENT,
            TOTALVALUE,
            DETAILS,
            SEQUENCE
          from 
            dbo.UFN_REVENUEBATCH_GETBENEFITSPCT_FROMITEMLISTXML(@PERCENTAGEBENEFITS)  
          for xml raw('ITEM'),type,elements,root('PERCENTAGEBENEFITS'),binary base64
        )
    end    

        if @ISPOSTED = 0
        begin
          exec dbo.USP_DATAFORMTEMPLATE_EDIT_REVENUEBENEFITS2
            @ID = @REVENUEID,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @BENEFITS = @BENEFITS,
            @BENEFITSWAIVED = @BENEFITSWAIVED,
            @PERCENTAGEBENEFITS = @PERCENTAGEBENEFITS,
            @ADJUSTMATCHINGGIFTCLAIMS = 3,
            @UPDATEGIFTFEEOPTION = 0
        end
        else
        begin
          exec dbo.USP_DATAFORMTEMPLATE_ADJUST_REVENUEBENEFITS_2
            @ID = @REVENUEID,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @BENEFITS = @BENEFITS,
            @BENEFITSWAIVED = @BENEFITSWAIVED,
            @ADJUSTMENTDATE = @ADJUSTMENTDATE,
            @ADJUSTMENTPOSTDATE = @ADJUSTMENTPOSTDATE,
            @ADJUSTMENTREASON = @ADJUSTMENTREASON,
            @ADJUSTMENTREASONCODEID = @ADJUSTMENTREASONCODEID,
            @PERCENTAGEBENEFITS = @PERCENTAGEBENEFITS,
            @ADJUSTMENTPOSTSTATUSCODE = @ADJUSTMENTPOSTSTATUSCODE
        end
    end

    -- handle matching gifts

    declare @DELETEDMGID uniqueidentifier;
    if @MATCHINGGIFTS is not null
    begin
      if exists(
        select 1 
        from
          @MATCHINGGIFTS.nodes('MATCHINGGIFTS/ITEM') as MATCHINGGIFTSXML([MATCHINGGIFT])
        where 
          MATCHINGGIFTSXML.[MATCHINGGIFT].value('AMOUNT[1]', 'money') < 0
      )
        raiserror('BBERR_VALIDATE_MATCHINGGIFTSAMOUNT', 13, 1);

      declare @MGTABLE table
      (
        [ID] uniqueidentifier,
        [MATCHEDCONSTITUENTID] uniqueidentifier,
        [ORGANIZATIONID] uniqueidentifier,
        [RELATIONSHIPID] uniqueidentifier,
        [MATCHINGGIFTCONDITIONTYPEID] uniqueidentifier,
        [AMOUNT] money,
        [DATE] datetime,
        [SPLITS] xml,
        [NEWMGID] uniqueidentifier,
        [TRANSACTIONCURRENCYID] uniqueidentifier,
        [BASECURRENCYID] uniqueidentifier,
        [BASEEXCHANGERATEID] uniqueidentifier,
        [EXCHANGERATE] decimal(20,8),
        [HADSPOTRATE] bit,
        [RATECHANGED] bit,
        [OPPORTUNITYID] uniqueidentifier,
        [RESETSOLICITORCREDITS] bit
      );

      declare @MGID uniqueidentifier, @MGCONSTITUENTID uniqueidentifier, @MGORGANIZATIONID uniqueidentifier;
      declare @MGRELATIONSHIPID uniqueidentifier, @MGCONDITIONTYPEID uniqueidentifier, @MGAMOUNT money;
      declare @MGDATE datetime, @MGSPLITS xml, @MGNEWID uniqueidentifier; 
      declare @MGTRANSACTIONCURRENCYID uniqueidentifier;
      declare @MGBASECURRENCYID uniqueidentifier;
      declare @MGBASEEXCHANGERATEID uniqueidentifier;
      declare @MGEXCHANGERATE decimal(20,8);
      declare @MGHADSPOTRATE bit;
      declare @MGRATECHANGED bit;
      declare @MGOPPORTUNITYID uniqueidentifier;
      declare @MGRESETSOLICITORCREDITS bit;

      insert into @MGTABLE
      (
        [ID],
        [MATCHEDCONSTITUENTID],
        [ORGANIZATIONID],
        [RELATIONSHIPID],
        [MATCHINGGIFTCONDITIONTYPEID],
        [AMOUNT],
        [DATE],
        [SPLITS],
        [NEWMGID],
        [TRANSACTIONCURRENCYID],
        [BASECURRENCYID],
        [BASEEXCHANGERATEID],
        [EXCHANGERATE],
        [HADSPOTRATE],
        [RATECHANGED],
        [OPPORTUNITYID],
        [RESETSOLICITORCREDITS]
      )
      select
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('REVENUEMATCHINGGIFTID[1]', 'uniqueidentifier'),
        @CONSTITUENTID,
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('ORGANIZATIONID[1]', 'uniqueidentifier'),
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('RELATIONSHIPID[1]', 'uniqueidentifier'),
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('MATCHINGGIFTCONDITIONID[1]', 'uniqueidentifier'),
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('AMOUNT[1]', 'money'),
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('DATE[1]', 'datetime'),
        MATCHINGGIFTSXML.[MATCHINGGIFT].query('SPLITS'),
        newID(),
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('TRANSACTIONCURRENCYID[1]', 'uniqueidentifier'),
        REVENUE.BASECURRENCYID,
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('BASEEXCHANGERATEID[1]', 'uniqueidentifier'),
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('EXCHANGERATE[1]', 'decimal(20, 8)'),
        case
          when CURRENCYEXCHANGERATE.TYPECODE = 2
            then 1
          else 
            0
        end HADSPOTRATE,
        0 RATECHANGED,
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('OPPORTUNITYID[1]', 'uniqueidentifier'),
        MATCHINGGIFTSXML.[MATCHINGGIFT].value('RESETSOLICITORCREDITS[1]', 'bit')
      from 
        @MATCHINGGIFTS.nodes('MATCHINGGIFTS/ITEM') as MATCHINGGIFTSXML([MATCHINGGIFT])
      left outer join dbo.REVENUE on REVENUE.ID =  MATCHINGGIFTSXML.[MATCHINGGIFT].value('REVENUEMATCHINGGIFTID[1]', 'uniqueidentifier')
      left outer join dbo.CURRENCYEXCHANGERATE on CURRENCYEXCHANGERATE.ID = REVENUE.BASEEXCHANGERATEID

      --delete existing matching gifts that aren't in the collection


      declare DELETEDMGCURSOR cursor local fast_forward for
        select
          REVENUEMATCHINGGIFT.ID
        from
          dbo.REVENUEMATCHINGGIFT
          left outer join @MGTABLE as MGTABLE on MGTABLE.ID = REVENUEMATCHINGGIFT.ID
        where
          REVENUEMATCHINGGIFT.MGSOURCEREVENUEID = @REVENUEID
          and MGTABLE.ID is null
          and dbo.UFN_PLEDGE_PAYMENTSEXIST(REVENUEMATCHINGGIFT.ID) = 0;

      open DELETEDMGCURSOR
      fetch next from DELETEDMGCURSOR into @DELETEDMGID;
      while @@fetch_status = 0
      begin
        exec dbo.USP_REVENUE_DELETE @DELETEDMGID, @CHANGEAGENTID;
        fetch next from DELETEDMGCURSOR into @DELETEDMGID;
      end  -- loop through MG records


      close DELETEDMGCURSOR;
      deallocate DELETEDMGCURSOR;

     --done delete


      declare MGCURSOR cursor local fast_forward for
        select
          MGTABLE.ID,
          MGTABLE.MATCHEDCONSTITUENTID,
          MGTABLE.ORGANIZATIONID,
          MGTABLE.RELATIONSHIPID,
          MGTABLE.MATCHINGGIFTCONDITIONTYPEID,
          MGTABLE.AMOUNT,
          MGTABLE.DATE,
          MGTABLE.SPLITS, 
          MGTABLE.NEWMGID,
          MGTABLE.TRANSACTIONCURRENCYID, 
          MGTABLE.BASECURRENCYID,
          MGTABLE.BASEEXCHANGERATEID,
          MGTABLE.EXCHANGERATE,
          MGTABLE.HADSPOTRATE,
          MGTABLE.RATECHANGED,
          MGTABLE.OPPORTUNITYID,
          MGTABLE.RESETSOLICITORCREDITS
        from 
          @MGTABLE as MGTABLE;

      declare @MGSPLITSTABLE table
      (
        MGNEWID uniqueidentifier,
        SPLITID uniqueidentifier,
        AMOUNT money,
        DESIGNATIONID uniqueidentifier, 
        TRANSACTIONCURRENCYID uniqueidentifier
      );

      insert into @MGSPLITSTABLE (MGNEWID, SPLITID, AMOUNT, DESIGNATIONID, TRANSACTIONCURRENCYID)
      select
        [MGTABLE].NEWMGID,
        coalesce(T.c.value('REVENUESPLITID[1]','uniqueidentifier'), T.c.value('ID[1]','uniqueidentifier')),
        T.c.value('AMOUNT[1]', 'money'),
        T.c.value('DESIGNATIONID[1]', 'uniqueidentifier'),
        [MGTABLE].TRANSACTIONCURRENCYID
      from 
        @MGTABLE as [MGTABLE]
      cross apply MGTABLE.[SPLITS].nodes('SPLITS/ITEM') as T(c) 

      declare @MGSPLITS_2 xml;

      open MGCURSOR
      fetch next from MGCURSOR into @MGID, @MGCONSTITUENTID, @MGORGANIZATIONID, @MGRELATIONSHIPID, @MGCONDITIONTYPEID, @MGAMOUNT,@MGDATE, @MGSPLITS, @MGNEWID, @MGTRANSACTIONCURRENCYID, @MGBASECURRENCYID, @MGBASEEXCHANGERATEID,  @MGEXCHANGERATE, @MGHADSPOTRATE, @MGRATECHANGED, @MGOPPORTUNITYID, @MGRESETSOLICITORCREDITS
      while @@fetch_status = 0
      begin
        set @MGSPLITS_2 = 
          (
            select  
              MGST.SPLITID as ID, 
              MGST.DESIGNATIONID,
              MGST.AMOUNT, 
              coalesce(SPLITS.APPLICATIONCODE, 0) as APPLICATIONCODE,  
              coalesce(SPLITS.TYPECODE, 0) as TYPECODE,
              MGST.TRANSACTIONCURRENCYID
            from 
              @MGSPLITSTABLE MGST
            left outer join dbo.REVENUESPLIT SPLITS on SPLITS.ID = MGST.SPLITID
            where 
              MGST.MGNEWID = @MGNEWID
            for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64
          );

        -- add matching gift record if the MGID is not filled in

        if @MGID is null
        begin
          exec dbo.USP_DATAFORMTEMPLATE_ADD_MGPLEDGE_2
            @ID = @MGNEWID output,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @ORIGINALGIFTID = @REVENUEID,
            @MATCHINGORGANIZATIONID = @MGORGANIZATIONID,
            @DATE = @MGDATE,
            @AMOUNT = @MGAMOUNT,
            @SPLITS = @MGSPLITS_2,
            @MATCHINGGIFTCONDITIONID = @MGCONDITIONTYPEID,
            @RELATIONSHIPID = @MGRELATIONSHIPID,
            @CURRENTAPPUSERID = @CURRENTAPPUSERID,
            @TRANSACTIONCURRENCYID = @MGTRANSACTIONCURRENCYID,
            @BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
            @EXCHANGERATE = @EXCHANGERATE

          if @MGOPPORTUNITYID is not null
          begin
            exec dbo.USP_DATAFORMTEMPLATE_ADD_REVENUEOPPORTUNITYLINK null, @MGNEWID, @MGOPPORTUNITYID, @CHANGEAGENTID, @MGRESETSOLICITORCREDITS
          end
        end
        else
        begin
          exec dbo.USP_DATAFORMTEMPLATE_EDIT_MGPLEDGE_4
            @ID = @MGID,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @ORIGINALGIFTID = @REVENUEID,
            @MATCHINGORGANIZATIONID = @MGORGANIZATIONID,
            @DATE = @MGDATE,
            @AMOUNT = @MGAMOUNT,
            @SPLITS = @MGSPLITS_2,
            @MATCHINGGIFTCONDITIONID = @MGCONDITIONTYPEID,
            @RELATIONSHIPID = @MGRELATIONSHIPID,
            @BASECURRENCYID = @MGBASECURRENCYID,
            @TRANSACTIONCURRENCYID = @MGTRANSACTIONCURRENCYID,
            @BASEEXCHANGERATEID = @MGBASEEXCHANGERATEID,
            @EXCHANGERATE = @MGEXCHANGERATE,
            @HADSPOTRATE = @MGHADSPOTRATE,
            @RATECHANGED = @MGRATECHANGED

          if exists(select 1 from dbo.REVENUEOPPORTUNITY inner join @MGSPLITSTABLE as MGST on MGST.SPLITID = REVENUEOPPORTUNITY.ID where MGST.MGNEWID = @MGNEWID)
          begin
            if @MGOPPORTUNITYID is not null
            begin
              exec dbo.USP_REVENUEOPPORTUNITY_UPDATEOPPORTUNITY @REVENUEID = @MGID, @OPPORTUNITYID = @MGOPPORTUNITYID;
            end
            else
            begin
              exec dbo.USP_RECORDOPERATION_REVENUEOPPORTUNITYUNLINK @MGID, @CHANGEAGENTID;
            end
          end
          else
          begin
            if @MGOPPORTUNITYID is not null
            begin
              exec dbo.USP_DATAFORMTEMPLATE_ADD_REVENUEOPPORTUNITYLINK null, @MGID, @MGOPPORTUNITYID, @CHANGEAGENTID, @MGRESETSOLICITORCREDITS
            end
          end

        end -- edit MG


        fetch next from MGCURSOR into @MGID, @MGCONSTITUENTID, @MGORGANIZATIONID, @MGRELATIONSHIPID, @MGCONDITIONTYPEID, @MGAMOUNT,@MGDATE, @MGSPLITS, @MGNEWID, @MGTRANSACTIONCURRENCYID, @MGBASECURRENCYID, @MGBASEEXCHANGERATEID,  @MGEXCHANGERATE, @MGHADSPOTRATE, @MGRATECHANGED, @MGOPPORTUNITYID, @MGRESETSOLICITORCREDITS
      end  -- loop through MG records


      close MGCURSOR;
      deallocate MGCURSOR;
    end -- MG xml is not null

    else
    begin

      --delete all existing matching gifts


      declare DELETEDMGCURSOR cursor local fast_forward for
        select
          REVENUEMATCHINGGIFT.ID
        from
          dbo.REVENUEMATCHINGGIFT
        where
          REVENUEMATCHINGGIFT.MGSOURCEREVENUEID = @REVENUEID
          and dbo.UFN_PLEDGE_PAYMENTSEXIST(REVENUEMATCHINGGIFT.ID) = 0;

      open DELETEDMGCURSOR
      fetch next from DELETEDMGCURSOR into @DELETEDMGID;
      while @@fetch_status = 0
      begin
        exec dbo.USP_REVENUE_DELETE @DELETEDMGID, @CHANGEAGENTID;
        fetch next from DELETEDMGCURSOR into @DELETEDMGID;
      end  -- loop through MG records


      close DELETEDMGCURSOR;
      deallocate DELETEDMGCURSOR;

    end

  /*Begin*/

    declare @NEWAPPLICATIONRECOGNITIONS table
    (
      APPLICATIONID uniqueidentifier,
      APPLICATIONRECOGNITIONS xml,
      REVENUESPLITID uniqueidentifier,
      REVENUESPLITAMOUNT money,
      PERCENTAPPLIED decimal(20, 2),
      REVENUESPLITRECOGNITIONS xml
    );

    /*
    Include all commitment types available, not just through INSTALLMENTSPLITPAYMENT
    */

    insert into
      @NEWAPPLICATIONRECOGNITIONS
    select
      RECTABLE.APPLICATIONID as APPLICATIONID,
      RECTABLE.RECOGNITIONS as APPLICATIONRECOGNITIONS,
      REVENUESPLIT.ID,
      REVENUESPLIT.AMOUNT,
      0,
      null as REVENUESPLITRECOGNITIONS
    from
      @RECOGNITIONSTABLE as RECTABLE
    inner join
      (select distinct PLEDGEID,PAYMENTID from dbo.INSTALLMENTSPLITPAYMENT) ISP on ISP.PLEDGEID = RECTABLE.APPLICATIONID
    inner join
      dbo.REVENUESPLIT on REVENUESPLIT.ID = ISP.PAYMENTID and REVENUESPLIT.REVENUEID = @REVENUEID
    where
      not exists (select 1 from dbo.REVENUESPLIT where ID = RECTABLE.REVENUESPLITID)

    union all

    select
      RECTABLE.APPLICATIONID as APPLICATIONID,
      RECTABLE.RECOGNITIONS as APPLICATIONRECOGNITIONS,
      REVENUESPLIT.ID,
      REVENUESPLIT.AMOUNT,
      0,
      null as REVENUESPLITRECOGNITIONS
    from
      @RECOGNITIONSTABLE as RECTABLE
    inner join
      dbo.EVENTREGISTRANTPAYMENT as ERP on ERP.REGISTRANTID = RECTABLE.APPLICATIONID
    inner join
      dbo.REVENUESPLIT on REVENUESPLIT.ID = ERP.PAYMENTID and REVENUESPLIT.REVENUEID = @REVENUEID
    where
      not exists (select 1 from dbo.REVENUESPLIT where ID = RECTABLE.REVENUESPLITID)

    union all

    select
      RECTABLE.APPLICATIONID as APPLICATIONID,
      RECTABLE.RECOGNITIONS as APPLICATIONRECOGNITIONS,
      REVENUESPLIT.ID,
      REVENUESPLIT.AMOUNT,
      0,
      null as REVENUESPLITRECOGNITIONS
    from
      @RECOGNITIONSTABLE as RECTABLE
    inner join
      dbo.RECURRINGGIFTACTIVITY as RGA on RGA.SOURCEREVENUEID = RECTABLE.APPLICATIONID
    inner join
      dbo.REVENUESPLIT on REVENUESPLIT.ID = RGA.PAYMENTREVENUEID and REVENUESPLIT.REVENUEID = @REVENUEID
    where
      not exists (select 1 from dbo.REVENUESPLIT where ID = RECTABLE.REVENUESPLITID)

    /*
    Prorate these amounts properly (add money to last row)... per constituent
    */
    update
      AR
    set
      AR.PERCENTAPPLIED = (AR.REVENUESPLITAMOUNT / SUBQ.APPLICATIONAMOUNT)
    from
      @NEWAPPLICATIONRECOGNITIONS as AR
    inner join
    (
      select
        APPLICATIONID,
        sum(REVENUESPLITAMOUNT) APPLICATIONAMOUNT
      from
        @NEWAPPLICATIONRECOGNITIONS
      group by
        APPLICATIONID
    ) SUBQ on SUBQ.APPLICATIONID = AR.APPLICATIONID


    update
      AR
    set
      AR.REVENUESPLITRECOGNITIONS = 
      (
        select 
          REVENUERECOGNITIONID as ID,
          CONSTITUENTID, 
          AMOUNT * AR.PERCENTAPPLIED as AMOUNT, 
          EFFECTIVEDATE, 
          REVENUERECOGNITIONTYPECODEID, 
          RECOGNITIONCREDITDESIGNATIONID as DESIGNATIONID, 
          RECOGNITIONCREDITFKID, 
          DONORCHALLENGERECOGNITIONTYPECODE
        from 
          dbo.UFN_REVENUEUPDATEBATCH_GETRECOGNITIONSFOREDIT_FROMITEMLISTXML(AR.APPLICATIONRECOGNITIONS) REC
        for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),binary base64
        )
    from
      @NEWAPPLICATIONRECOGNITIONS as AR


    delete from @RECOGNITIONSTABLE where APPLICATIONID in (select APPLICATIONID from @NEWAPPLICATIONRECOGNITIONS)

    insert into @RECOGNITIONSTABLE(REVENUESPLITID, RECOGNITIONS)
    select
      REVENUESPLITID,
      REVENUESPLITRECOGNITIONS
    from
      @NEWAPPLICATIONRECOGNITIONS


  /*End*/

    declare @NEWAPPLICATIONSOLICITORS table
    (
      APPLICATIONID uniqueidentifier,
      APPLICATIONSOLICITORS xml,
      REVENUESPLITID uniqueidentifier,
      REVENUESPLITAMOUNT money,
      PERCENTAPPLIED decimal(20, 2),
      REVENUESPLITSOLICITORS xml
    );

    /*
    Include all commitment types available, not just through INSTALLMENTSPLITPAYMENT
    */

    insert into
      @NEWAPPLICATIONSOLICITORS
    select
      SOLTABLE.APPLICATIONID as APPLICATIONID,
      SOLTABLE.SOLICITORS as APPLICATIONSOLICITORS,
      REVENUESPLIT.ID,
      REVENUESPLIT.AMOUNT,
      0,
      null as REVENUESPLITSOLICITORS
    from
      @SOLICITORSTABLE as SOLTABLE
    inner join
      (select distinct PLEDGEID,PAYMENTID from dbo.INSTALLMENTSPLITPAYMENT) ISP on ISP.PLEDGEID = SOLTABLE.APPLICATIONID
    inner join
      dbo.REVENUESPLIT on REVENUESPLIT.ID = ISP.PAYMENTID and REVENUESPLIT.REVENUEID = @REVENUEID
    where
      not exists (select 1 from dbo.REVENUESPLIT where ID = SOLTABLE.REVENUESPLITID)

    union all

    select
      SOLTABLE.APPLICATIONID as APPLICATIONID,
      SOLTABLE.SOLICITORS as APPLICATIONSOLICITORS,
      REVENUESPLIT.ID,
      REVENUESPLIT.AMOUNT,
      0,
      null as REVENUESPLITSOLICITORS
    from
      @SOLICITORSTABLE as SOLTABLE
    inner join
      dbo.EVENTREGISTRANTPAYMENT as ERP on ERP.REGISTRANTID = SOLTABLE.APPLICATIONID
    inner join
      dbo.REVENUESPLIT on REVENUESPLIT.ID = ERP.PAYMENTID and REVENUESPLIT.REVENUEID = @REVENUEID
    where
      not exists (select 1 from dbo.REVENUESPLIT where ID = SOLTABLE.REVENUESPLITID)

    union all

    select
      SOLTABLE.APPLICATIONID as APPLICATIONID,
      SOLTABLE.SOLICITORS as APPLICATIONSOLICITORS,
      REVENUESPLIT.ID,
      REVENUESPLIT.AMOUNT,
      0,
      null as REVENUESPLITSOLICITORS
    from
      @SOLICITORSTABLE as SOLTABLE
    inner join
      dbo.RECURRINGGIFTACTIVITY as RGA on RGA.SOURCEREVENUEID = SOLTABLE.APPLICATIONID
    inner join
      dbo.REVENUESPLIT on REVENUESPLIT.ID = RGA.PAYMENTREVENUEID and REVENUESPLIT.REVENUEID = @REVENUEID
    where
      not exists (select 1 from dbo.REVENUESPLIT where ID = SOLTABLE.REVENUESPLITID)

    /*
    Prorate these amounts properly (add money to last row)... per constituent
    */
    update
      APS
    set
      APS.PERCENTAPPLIED = (APS.REVENUESPLITAMOUNT / SUBQ.APPLICATIONAMOUNT)
    from
      @NEWAPPLICATIONSOLICITORS as APS
    inner join
    (
      select
        APPLICATIONID,
        sum(REVENUESPLITAMOUNT) APPLICATIONAMOUNT
      from
        @NEWAPPLICATIONSOLICITORS
      group by
        APPLICATIONID
    ) SUBQ on SUBQ.APPLICATIONID = APS.APPLICATIONID


    update
      APS
    set
      APS.REVENUESPLITSOLICITORS = 
      (
        select 
          REVENUESOLICITORID as ID,
          CONSTITUENTID, 
          AMOUNT * APS.PERCENTAPPLIED as AMOUNT,
          APPLICATIONCODE,
          DESIGNATIONID,
          SEQUENCE
        from 
          dbo.UFN_REVENUEUPDATEBATCH_GETSOLICITORSFOREDIT_FROMITEMLISTXML(APS.APPLICATIONSOLICITORS) SOL
        for xml raw('ITEM'),type,elements,root('SOLICITORS'),binary base64
        )
    from
      @NEWAPPLICATIONSOLICITORS as APS


    delete from @SOLICITORSTABLE where APPLICATIONID in (select APPLICATIONID from @NEWAPPLICATIONSOLICITORS)

    insert into @SOLICITORSTABLE(REVENUESPLITID, SOLICITORS)
    select
      REVENUESPLITID,
      REVENUESPLITSOLICITORS
    from
      @NEWAPPLICATIONSOLICITORS


  /*End*/


    -- handle recognition credits

    declare @RECREVENUESPLITID uniqueidentifier
    declare @RECRECOGNITIONS xml
    declare RECOGNITIONSCURSOR cursor local fast_forward for
    --RECOGNITIONS where predicted based on REVENUESTREAMS, but may not be the actuals

    --some defaults may have been created, or existing ones deleted/recreated

    with CTE_RECOGNITIONS as 
    (
     select distinct ACC.REVENUESPLITID 
     from   
     dbo.UFN_REVENUE_GETRECOGNITIONS_FORREVENUE(@REVENUEID) as ACC  
     where  
      --Do not overwrite predicted splits  

      ACC.REVENUESPLITID not in (select REVENUESPLITID from @RECOGNITIONSTABLE)
    )
    select   
      REVENUESPLITID,   
      RECOGNITIONS
    from   
      @RECOGNITIONSTABLE RCTABLE  
    where  
      --Can only edit records that exist  

    exists (select 1 from dbo.REVENUESPLIT where ID = RCTABLE.REVENUESPLITID)
    union all     
    --Get any distinct new ones that were created by default so they don't get deleted.

    select   
      REVENUESPLITID,  
      dbo.UFN_REVENUE_GETRECOGNITIONS_2_TOITEMLISTXML(REVENUESPLITID) as RECOGNITIONS
    from   
      CTE_RECOGNITIONS;

    open RECOGNITIONSCURSOR
    fetch next from RECOGNITIONSCURSOR into @RECREVENUESPLITID, @RECRECOGNITIONS

    while @@FETCH_STATUS = 0
    begin
      exec dbo.USP_REVENUEUPDATEBATCH_RECOGNITIONS_CREATECONSTITUENTS @RECRECOGNITIONS output, @CHANGEAGENTID

      if @ISRECURRINGGIFT = 1
      begin      
        exec dbo.USP_DATAFORMTEMPLATE_EDIT_REVENUE_RECOGNITIONRECURRINGGIFT
          @ID = @RECREVENUESPLITID,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @RECOGNITIONS = @RECRECOGNITIONS
      end
      else
      begin
        if dbo.UFN_REVENUESPLIT_MATCHEDBYDONORCHALLENGE(@RECREVENUESPLITID) = 1
        begin
          --If the new rows do not have RECOGNITIONCREDITFKID or ID they won't be added (e.g. if credits were reset)

          set @RECRECOGNITIONS = 
          (
            select 
            [AMOUNT], 
            [BASECURRENCYID], 
            [CONSTITUENT], 
            [CONSTITUENTID], 
            [EFFECTIVEDATE], 
            [GROSSAMOUNT], 
            [DESIGNATIONID], 
            case 
              when RECOGNITIONCREDITFKID is null and ID is null then 
              newid() 
              else 
              ID 
            end [ID], 
            [RECOGNITIONTYPE], 
            [REVENUERECOGNITIONTYPECODEID],
            case 
              when RECOGNITIONCREDITFKID is null then 
                @RECREVENUESPLITID 
              else 
                RECOGNITIONCREDITFKID 
            end [RECOGNITIONCREDITFKID],
            case 
              when RECOGNITIONCREDITFKID is null then 
                0 
              else
                DONORCHALLENGERECOGNITIONTYPECODE 
            end [DONORCHALLENGERECOGNITIONTYPECODE] 
            from 
            dbo.UFN_RECOGNITIONCREDIT_DONORCHALLENGE_GETRECOGNITIONS_FROMITEMLISTXML(@RECRECOGNITIONS)
            order by 
            EFFECTIVEDATE asc, CONSTITUENT asc
            for xml raw('ITEM'),type,elements,root('RECOGNITIONS'),BINARY BASE64
          )

          exec dbo.USP_DATAFORMTEMPLATE_EDIT_RECOGNITIONCREDIT_DONORCHALLENGE
            @ID = @RECREVENUESPLITID,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @RECOGNITIONS = @RECRECOGNITIONS
        end
        else
          exec dbo.USP_DATAFORMTEMPLATE_EDIT_REVENUE_RECOGNITION
            @ID = @RECREVENUESPLITID,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @RECOGNITIONS = @RECRECOGNITIONS
      end

      fetch next from RECOGNITIONSCURSOR into @RECREVENUESPLITID, @RECRECOGNITIONS
    end  

    close RECOGNITIONSCURSOR
    deallocate RECOGNITIONSCURSOR

    -- solicitors

    declare @SOLREVENUESPLITID uniqueidentifier
    declare @SOL xml

    declare SOLICITORSCURSOR cursor local fast_forward for
    select 
      REVENUESPLITID, 
      SOLICITORS
    from 
      @SOLICITORSTABLE

    open SOLICITORSCURSOR
    fetch next from SOLICITORSCURSOR into @SOLREVENUESPLITID, @SOL
    while @@FETCH_STATUS = 0
    begin
      exec dbo.USP_DATAFORMTEMPLATE_EDIT_REVENUESOLICITORS
        @ID = @SOLREVENUESPLITID,
        @CHANGEAGENTID = @CHANGEAGENTID,
        @SOLICITORS = @SOL

      fetch next from SOLICITORSCURSOR into @SOLREVENUESPLITID, @SOL
    end

    close SOLICITORSCURSOR
    deallocate SOLICITORSCURSOR

    -- handle business units

    declare @BUSINESSUNITCOUNT int
    select 
      @BUSINESSUNITCOUNT = count(*
    from 
      @APPLICATIONBUSINESSUNITS.nodes('/APPLICATIONBUSINESSUNITS/ITEM') T(c)

    if @BUSINESSUNITCOUNT > 0
    begin
      exec dbo.USP_REVENUEBATCH_APPLYBUSINESSUNITS @REVENUEID, @APPLICATIONBUSINESSUNITS, @TYPECODE, @CHANGEAGENTID, null, @REVENUESTREAMS, @ADDITIONALAPPLICATIONSSTREAM;
    end

    -- handle letters

    if @LETTERS is not null
    begin
      -- reset the ID for the letters xml

      set @LETTERS = 
        (
          select 
            ACKNOWLEDGEDATE,
            ACKNOWLEDGEEID,
            LETTERCODEID,
            LETTERTYPECODE,
            REVENUELETTERID as ID,
            TRIBUTEID, 
            OUTOFDATE,
            PROCESSDATE,
            CLEARDATES
          from 
            dbo.UFN_REVENUEUPDATEBATCH_GETLETTERS_FROMITEMLISTXML(@LETTERS)
          for xml raw('ITEM'),type,elements,root('LETTERS'),binary base64
        )
    end

    exec dbo.USP_REVENUE_LETTERS_CUSTOMUPDATEFROMXML
      @REVENUEID = @REVENUEID
      @LETTERS = @LETTERS
      @CHANGEAGENTID = @CHANGEAGENTID

    -- handle notes

    exec dbo.USP_REVENUEUPDATEBATCH_NOTE_CUSTOMUPDATEFORITEMLISTXML
      @REVENUEID = @REVENUEID
      @NOTES = @NOTES,
      @CHANGEAGENTID = @CHANGEAGENTID,
      @CHANGEDATE = @CURRENTDATE

    -- handle VAT edits, for UK only

    if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
    begin
 exec dbo.USP_DATAFORMTEMPLATE_EDIT_REVENUEVAT 
        @ID = @REVENUEID,
        @CHANGEAGENTID = @CHANGEAGENTID,
        @AMOUNTTOTAX = @AMOUNTFORVAT,
        @VATTAXRATEID = @VATTAXRATEID,
        @VATAMOUNT = @VATAMOUNT
    end;

    -- handle receipttypecode updates

    if @PREVIOUSRECEIPTTYPECODE <> @RECEIPTTYPECODE
    begin
      update
        dbo.REVENUE
      set
        RECEIPTTYPECODE = @RECEIPTTYPECODE,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
      where
        ID = @REVENUEID;
    end;

    -- handle gift fees

    if @SHOULDUPDATEGIFTFEE > 0
    begin
      declare @GIFTFEEADJUSTMENTID uniqueidentifier;      
      if @PREVIOUSCONSTITUENTID <> @CONSTITUENTID
      begin
        if @ISPOSTED = 1
          exec dbo.USP_SAVE_GIFTFEEADJUSTMENT @REVENUEID, @GIFTFEEADJUSTMENTID output, @CHANGEAGENTID, @CURRENTDATE, @ADJUSTMENTDATE, @ADJUSTMENTPOSTDATE, @ADJUSTMENTREASON, default, @ADJUSTMENTREASONCODEID, @ADJUSTMENTPOSTSTATUSCODE;

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

        if not @CHANGEAGENTID is null
          set CONTEXT_INFO @CHANGEAGENTID;

        delete from dbo.GLTRANSACTION
        where 
          GLTRANSACTION.ID in (
            select 
              GIFTFEEGLDISTRIBUTION.GLTRANSACTIONID
            from 
              dbo.GIFTFEEGLDISTRIBUTION
              inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = GIFTFEEGLDISTRIBUTION.REVENUESPLITGIFTFEEID
            where 
              REVENUESPLIT.REVENUEID = @REVENUEID 
              and GIFTFEEGLDISTRIBUTION.OUTDATED = 0
          );

        delete from dbo.REVENUESPLITGIFTFEE
        where 
          REVENUESPLITGIFTFEE.ID in (
            select 
              REVENUESPLIT.ID 
            from 
              dbo.REVENUESPLIT 
            where 
              REVENUESPLIT.REVENUEID = @REVENUEID
          );

        if not @contextCache is null
          set CONTEXT_INFO @contextCache;

        exec dbo.USP_PAYMENT_ADDGIFTFEES @REVENUEID, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;
      end
      else 
      begin
        if @ISPOSTED = 1          
          exec dbo.USP_SAVE_GIFTFEEADJUSTMENT @REVENUEID, @GIFTFEEADJUSTMENTID output, @CHANGEAGENTID, @CURRENTDATE, @ADJUSTMENTDATE, @ADJUSTMENTPOSTDATE, @ADJUSTMENTREASON, default, @ADJUSTMENTREASONCODEID, @ADJUSTMENTPOSTSTATUSCODE;

        exec dbo.USP_REVENUE_UPDATEPAYMENTGIFTFEE @REVENUEID, @CONSTITUENTID, @CHANGEAGENTID

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

        if @POSTSTATUSCODE = 1 or ((@POSTSTATUSCODE is null or @POSTSTATUSCODE = 0) and @ADJUSTMENTPOSTSTATUSCODE <> 2)
          exec dbo.USP_SAVE_GIFTFEEGLDISTRIBUTION @REVENUEID, @CHANGEAGENTID, @CURRENTDATE;
      end
    end
    else if (@ISPOSTED = 0 and @OLDPOSTSTATUSCODE <> @POSTSTATUSCODE) or (@ISPOSTED = 1 and @OLDPOSTSTATUSCODE <> @ADJUSTMENTPOSTSTATUSCODE)
    begin
      delete from dbo.GIFTFEEGLDISTRIBUTION where REVENUEID = @REVENUEID and OUTDATED = 0;
      if @POSTSTATUSCODE = 1 or ((@POSTSTATUSCODE is null or @POSTSTATUSCODE = 0) and @ADJUSTMENTPOSTSTATUSCODE <> 2)
        exec dbo.USP_SAVE_GIFTFEEGLDISTRIBUTION @REVENUEID, @CHANGEAGENTID, @CURRENTDATE;
    end

    -- handle constituent update at the end

    if @PREVIOUSCONSTITUENTID <> @CONSTITUENTID
    begin
      if @ISPOSTED = 0
      begin
        exec dbo.USP_DATAFORMTEMPLATE_EDITSAVE_REVENUETRANSACTIONCHANGECONSTITUENT_2
          @ID = @REVENUEID,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @NEWCONSTITUENTID = @CONSTITUENTID ,
          @CONSTITUENTACCOUNTID = @CONSTITUENTACCOUNTID,
          @RESETRECOGNITIONCREDITS = @RELOADRECOGNITION,
          @RESETSOLICITORS = @RELOADSOLICITORS,
          @CURRENTAPPUSERID = @CURRENTAPPUSERID
      end
      else
      begin
        exec dbo.USP_DATAFORMTEMPLATE_EDITSAVE_REVENUETRANSACTIONCHANGECONSTITUENTPOSTED_3
          @ID = @REVENUEID,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @NEWCONSTITUENTID = @CONSTITUENTID ,
          @CONSTITUENTACCOUNTID = @CONSTITUENTACCOUNTID,
          @ADJUSTMENTPOSTDATE = @ADJUSTMENTPOSTDATE,
          @ADJUSTMENTDATE = @ADJUSTMENTDATE,
          @ADJUSTMENTREASON = @ADJUSTMENTREASON,
          @RESETRECOGNITIONCREDITS = @RELOADRECOGNITION,
          @RESETSOLICITORS = @RELOADSOLICITORS,
          @ADJUSTMENTREASONCODEID = @ADJUSTMENTREASONCODEID
      end
    end

    -- required for control report to work

    set @ID = @REVENUEID

    update LI set
      BATCHID = @BATCHID
      ,CHANGEDBYID = @CHANGEAGENTID
      ,DATECHANGED = @CURRENTDATE
    from dbo.FINANCIALTRANSACTIONLINEITEM LI
    left join dbo.FINANCIALTRANSACTIONLINEITEM REVERSELI on REVERSELI.ID = LI.REVERSEDLINEITEMID and REVERSELI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
    where LI.FINANCIALTRANSACTIONID = @ID
      and (LI.CHANGEDBYID = @CHANGEAGENTID
        or REVERSELI.CHANGEDBYID = @CHANGEAGENTID)
      and LI.DELETEDON is null
      and LI.POSTSTATUSCODE != 2;

    update LI set
      BATCHID = @BATCHID
      ,CHANGEDBYID = @CHANGEAGENTID
      ,DATECHANGED = @CURRENTDATE
    from dbo.FINANCIALTRANSACTIONLINEITEM LI
    inner join dbo.FINANCIALTRANSACTION FT on FT.ID = LI.FINANCIALTRANSACTIONID
    left join dbo.FINANCIALTRANSACTIONLINEITEM REVERSELI on REVERSELI.ID = LI.REVERSEDLINEITEMID and REVERSELI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
    where FT.PARENTID = @ID
      and (LI.CHANGEDBYID = @CHANGEAGENTID
        or REVERSELI.CHANGEDBYID = @CHANGEAGENTID)
      and LI.DELETEDON is null
      and LI.POSTSTATUSCODE != 2;

  end try

  begin catch
    if CURSOR_STATUS('local','CAMPAIGNVALIDATECURSOR') >= -1
    begin
          close CAMPAIGNVALIDATECURSOR;
          deallocate CAMPAIGNVALIDATECURSOR;
    end

    if CURSOR_STATUS('local','CAMPAIGNCURSOR') >= -1
    begin
          close CAMPAIGNCURSOR;
          deallocate CAMPAIGNCURSOR;
    end

    if CURSOR_STATUS('local','DELETEDMGCURSOR') >= -1
    begin
          close DELETEDMGCURSOR;
          deallocate DELETEDMGCURSOR;
    end

    if CURSOR_STATUS('local','MGCURSOR') >= -1
    begin
          close MGCURSOR;
          deallocate MGCURSOR;
    end

    if CURSOR_STATUS('local','RECOGNITIONSCURSOR') >= -1
    begin
          close RECOGNITIONSCURSOR;
          deallocate RECOGNITIONSCURSOR;
    end

    if CURSOR_STATUS('local','SOLICITORSCURSOR') >= -1
    begin
          close SOLICITORSCURSOR;
          deallocate SOLICITORSCURSOR;
    end

    exec dbo.[USP_RAISE_ERROR];
    return 1;
  end catch

  return 0;