USP_DATAFORMTEMPLATE_ADD_REVENUEBATCHCOMMIT

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

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@BATCHNUMBER nvarchar(100) IN
@CONSTITUENTID uniqueidentifier IN
@TYPECODE tinyint IN Revenue type
@DATE datetime IN Date
@AMOUNT money IN Amount
@PAYMENTMETHODCODE tinyint IN Payment method
@DONOTACKNOWLEDGE bit IN Do not acknowledge
@DONOTRECEIPT bit IN Do not receipt
@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 Number of units
@SYMBOL nvarchar(25) IN Symbol
@MEDIANPRICE decimal(19, 4) IN Median price
@INSTALLMENTFREQUENCYCODE tinyint IN Installment frequency
@INSTALLMENTSTARTDATE datetime IN Installment start date
@INSTALLMENTENDDATE datetime IN Installment end date
@NUMBEROFINSTALLMENTS int IN No. installments
@PROPERTYSUBTYPECODEID uniqueidentifier IN Property subtype
@GIFTINKINDSUBTYPECODEID uniqueidentifier IN Gift-in-kind subtype
@RECEIPTAMOUNT money IN Receipt amount
@CONSTITUENTACCOUNTID uniqueidentifier IN Account
@SPLITS xml IN Designations
@SINGLEDESIGNATIONID uniqueidentifier IN Designation
@REVENUESTREAMS xml IN Revenue streams
@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
@MGMATCHINGCONSTITUENTID uniqueidentifier IN MG Matching constituent
@MGDATE datetime IN MG Date
@MGAMOUNT money IN MG Amount
@MGPOSTDATE datetime IN MG Post date
@MGPOSTSTATUSCODE tinyint IN MG Post status
@MGCONDITIONID uniqueidentifier IN Matching gift condition ID
@MGSPLITS xml IN MG Splits
@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
@VALIDATEONLY bit IN
@INSTALLMENTS xml IN Installments
@PAYMENTFORPLEDGEAMOUNT money IN Payment for pledge amount
@RECOGNITIONS xml IN Recognition credit
@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
@MGRELATIONSHIPID uniqueidentifier IN Relationship
@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
@APPLICATIONCODE tinyint 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 Sale number of units
@USERMODIFIEDNUMBEROFUNITSSOLD bit IN User modified 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
@STANDINGORDERREFERENCENUMBER nvarchar(18) IN Standing order reference number
@STANDINGORDERREFERENCEDATE UDT_FUZZYDATE IN Standing order reference date
@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
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@PERCENTAGEBENEFITS xml IN Percent benefits
@BATCHROWID uniqueidentifier IN
@ISGIFTAIDSPONSORSHIP bit IN Gift Aid sponsorship
@GENERATEREFERENCENUMBER bit IN Automatically generate reference number
@SOURCECODEIMPORT nvarchar(60) IN Source code (Import only)
@MERCHANTACCOUNTID uniqueidentifier IN Merchant account

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_REVENUEBATCHCOMMIT
(
  @ID uniqueidentifier = null output,
  @CHANGEAGENTID uniqueidentifier,
  @BATCHNUMBER nvarchar(100),
  @CONSTITUENTID uniqueidentifier = null,
  @TYPECODE tinyint = 0,
  @DATE datetime,
  @AMOUNT money,
  @PAYMENTMETHODCODE tinyint = 0,
  @DONOTACKNOWLEDGE bit = 0,
  @DONOTRECEIPT 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,
  @INSTALLMENTFREQUENCYCODE tinyint = 5,
  @INSTALLMENTSTARTDATE datetime = null,
  @INSTALLMENTENDDATE datetime = null,
  @NUMBEROFINSTALLMENTS int = 1,
  @PROPERTYSUBTYPECODEID uniqueidentifier = null,
  @GIFTINKINDSUBTYPECODEID uniqueidentifier = null,
  @RECEIPTAMOUNT money = 0,
  @CONSTITUENTACCOUNTID uniqueidentifier = null,
  @SPLITS xml = null,
  @SINGLEDESIGNATIONID uniqueidentifier = null,
  @REVENUESTREAMS xml = null,
  @SOLICITORS xml = null,
  @BENEFITS xml = null,
  @FINDERNUMBER bigint = 0,
  @SOURCECODE nvarchar(60) = '',
  @APPEALID uniqueidentifier = null,
  @FINDERNUMBERISVALID bit = null,
  @USERMODIFIEDBENEFITS bit = 0,
  @BENEFITSWAIVED bit = 0,
  @POSTDATE datetime = null,
  @POSTSTATUSCODE tinyint = null,
  @SENDPLEDGEREMINDER bit = 1,
  @SALEDATE datetime = null,
  @SALEAMOUNT money = null,
  @BROKERFEE money = null,
  @SALEPOSTSTATUSCODE tinyint = null,
  @SALEPOSTDATE datetime = null,
  @NOTETITLE nvarchar(50) = '',
  @NOTEAUTHORID uniqueidentifier = null,
  @NOTEDATEENTERED datetime = null,
  @NOTETYPECODEID uniqueidentifier = null,
  @NOTETEXTNOTE nvarchar(max) = '',
  @MGMATCHINGCONSTITUENTID uniqueidentifier = null,
  @MGDATE datetime = null,
  @MGAMOUNT money = 0,
  @MGPOSTDATE datetime = null,
  @MGPOSTSTATUSCODE tinyint = 1,
  @MGCONDITIONID uniqueidentifier = null,
  @MGSPLITS xml = null,
  @GIVENANONYMOUSLY bit = 0,
  @GIVENANONYMOUSLYDEFAULTEDFORCONSTITUENTID uniqueidentifier = null,
  @USERMODIFIEDRECEIPTAMOUNT bit = 0,
  @PLEDGESUBTYPEID uniqueidentifier = null,
  @REJECTIONCODEID uniqueidentifier = null,
  @CONSTITUENTLOOKUPID uniqueidentifier = null,
  @MAILINGID uniqueidentifier = null,
  @CHANNELCODEID uniqueidentifier = null,
  @VALIDATEONLY bit = 0,
  @INSTALLMENTS xml = null,
  @PAYMENTFORPLEDGEAMOUNT money = null,
  @RECOGNITIONS xml = null,
  @DIDRECOGNITIONSDEFAULT bit = 1,
  @TRIBUTES xml = null,
  @UNAPPLIEDMATCHINGGIFTSPLITS xml = null,
  @UNAPPLIEDMATCHINGGIFTAMOUNT money = 0,
  @RECEIPTTYPECODE tinyint = null,
  @MGRELATIONSHIPID uniqueidentifier = null,
  @OTHERPAYMENTMETHODCODEID uniqueidentifier = null,
  @LETTERCODEID as uniqueidentifier = null,
  @ACKNOWLEDGEDATE as datetime = null,
  @REFERENCE as nvarchar(255) = null,
  @CATEGORYCODEID uniqueidentifier = null,
  @ACKNOWLEDGEEID uniqueidentifier = null,
  @APPLICATIONCODE tinyint = 0,
  @OTHERTYPECODEID uniqueidentifier = null,
  @OPPORTUNITYID uniqueidentifier = null,
  @DIRECTDEBITRESULTCODE nvarchar(10) = '',
  @LOWPRICE decimal(19,4) = null,
  @HIGHPRICE decimal(19,4) = null,
  @NUMBEROFUNITSSOLD decimal(20,3) = null,
  @USERMODIFIEDNUMBEROFUNITSSOLD bit = null,
  @CREDITCARDTOKEN uniqueidentifier = null,
  @REJECTIONMESSAGE nvarchar(250) = '',
  -- PARTIALCREDITCARDNUMBER is used just to support import and so is only 
  -- actually used on RevenueBatchDataForm.Add.xml
  @PARTIALCREDITCARDNUMBER nvarchar(4) = '',
  @STANDINGORDERCONSTITUENTACCOUNTID uniqueidentifier = null,
  @STANDINGORDERREFERENCENUMBER nvarchar(18) = '',
  @STANDINGORDERREFERENCEDATE dbo.UDT_FUZZYDATE = '00000000',
  @STANDINGORDERSETUP bit = null,
  @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,
  @CURRENTAPPUSERID uniqueidentifier = null,
  @PERCENTAGEBENEFITS xml = null,
  @BATCHROWID uniqueidentifier = null,
  @ISGIFTAIDSPONSORSHIP bit = null,
  @GENERATEREFERENCENUMBER bit = 1,
  @SOURCECODEIMPORT nvarchar(60) = '',
  @MERCHANTACCOUNTID uniqueidentifier = null
)
as
  set nocount on;

  declare @PDACCOUNTSYSTEMID uniqueidentifier
  declare @NEXTTRANSACTIONDATE datetime;

  --Multicurrency workaround for Fire: Set currency fields for all inserts and updates to avoid the trigger performance hit during batch commit (we are assuming this is a single currency system for Fire).
  declare @ORGANIZATIONCURRENCYID uniqueidentifier;
  set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

  declare @CURRENTDATE datetime;
  declare @APPLIEDTOPLEDGES money;
  declare @TRANSACTIONAMOUNT money;

  set @TRANSACTIONAMOUNT = @AMOUNT;

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

  if @PAYMENTFORPLEDGEAMOUNT is null
    set @PAYMENTFORPLEDGEAMOUNT = 0;

  if @PAYMENTMETHODCODE = 11 --Standing order
  begin
    set @CONSTITUENTACCOUNTID = @STANDINGORDERCONSTITUENTACCOUNTID;
    set @REFERENCEDATE = @STANDINGORDERREFERENCEDATE;

    if @CONSTITUENTACCOUNTID is not null and not exists (
      select 1 from dbo.CONSTITUENTACCOUNT
      where CONSTITUENTID = coalesce(@CONSTITUENTID,@CONSTITUENTLOOKUPID) and ID = @CONSTITUENTACCOUNTID
      union
      select 1 from dbo.BATCHREVENUECONSTITUENTACCOUNT
      where CONSTITUENTID = coalesce(@CONSTITUENTID,@CONSTITUENTLOOKUPID) and ID = @CONSTITUENTACCOUNTID
      )
      raiserror('BBERR_STANDINGORDERCONSTITUENTACCOUNTID_CONSTITUENT_NOTEQUAL',13,1)

    if @GENERATEREFERENCENUMBER is null or @GENERATEREFERENCENUMBER = 1
      select 
        @STANDINGORDERREFERENCENUMBER = '',
        @GENERATEREFERENCENUMBER = 1
  end

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

  --If the post status is null, set it to 'Not posted' so that the GL distributions will get created for the record.
  if @POSTSTATUSCODE is null
    set @POSTSTATUSCODE = 1;

  --JamesWill CR275936-052407 2007/05/29 Don't try to post recurring gifts
  if @TYPECODE = 3
    set @POSTSTATUSCODE = 2;

  if @POSTSTATUSCODE = 2 --Do not post
    set @POSTDATE = null
  else if @POSTDATE is null
    set @POSTDATE = dbo.UFN_DATE_GETEARLIESTTIME(getdate()); --JamesWill CR275936-052407 2007/05/29 Don't include time-stamp on postdate

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

  set @CURRENTDATE = GetDate();

  set @APPLIEDTOPLEDGES = 0;

  if @RECEIPTAMOUNT is null
    set @RECEIPTAMOUNT = 0;

  if @APPLICATIONCODE = 255 or @APPLICATIONCODE is null
    set @APPLICATIONCODE = 0;

  --We need to convert the MGSPLITS to regular SPLITS (involves changing the root from "MGSPLITS" to "SPLITS" and adding a "REVENUEID" element) 
  declare @MGSPLITSTABLE table
  (
    ID uniqueidentifier,
    DESIGNATIONID uniqueidentifier,
    AMOUNT money,
    SEQUENCE int
  );

  declare @SENDNEWINSTRUCTION bit;
  declare @NEWINSTRUCTIONTOSEND tinyint;

  begin try

    if @FINDERNUMBER is null
      set @FINDERNUMBER = 0;

    if coalesce(@REJECTIONMESSAGE, '') <> ''
    begin
      raiserror(@REJECTIONMESSAGE, 13, 1);
    end

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

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

    if @BENEFITSWAIVED = 0
    begin
      if @BENEFITS is not null
        begin
          if exists(select BENEFITID,QUANTITY,UNITVALUE
                    from dbo.UFN_REVENUEBATCH_GETBENEFITS_FROMITEMLISTXML(@BENEFITS)  
                    where QUANTITY<0)
            raiserror('ERR_REVENUEBENEFIT_QUANTITY_NONNEGATIVE', 13, 1);

          if exists(select BENEFITID,QUANTITY,UNITVALUE
                    from dbo.UFN_REVENUEBATCH_GETBENEFITS_FROMITEMLISTXML(@BENEFITS)  
                    where UNITVALUE<0)
            raiserror('ERR_REVENUEBENEFIT_VALUE_NONNEGATIVE', 13, 1);
        end

      if @PERCENTAGEBENEFITS is not null
          begin
            if exists(select BENEFITID, PERCENTAPPLICABLEAMOUNT, VALUEPERCENT
                      from dbo.UFN_REVENUEBATCH_GETBENEFITSPCT_FROMITEMLISTXML(@PERCENTAGEBENEFITS)
                      where PERCENTAPPLICABLEAMOUNT<0)
              raiserror('ERR_REVENUEBENEFIT_PERCENTAPPLICABLEAMOUNT_NONNEGATIVE', 13, 1);

            if exists(select BENEFITID, PERCENTAPPLICABLEAMOUNT, VALUEPERCENT
                      from dbo.UFN_REVENUEBATCH_GETBENEFITSPCT_FROMITEMLISTXML(@PERCENTAGEBENEFITS)
                      where VALUEPERCENT<0)
              raiserror('ERR_REVENUEBENEFIT_VALUEPERCENT_NONNEGATIVE', 13, 1);
          end

      if (@BENEFITS is not null) or (@PERCENTAGEBENEFITS is not null)
        exec dbo.USP_REVENUE_BENEFITS_VALIDATEGLMAPPINGS @TYPECODE, null, @CURRENTAPPUSERID, @BENEFITS, @PERCENTAGEBENEFITS
    end

    /*Join the two benefit types together for the purpose of committing*/
    declare @TOTALBENEFITS xml;
    set @TOTALBENEFITS = dbo.UFN_REVENUEDETAIL_JOINBENEFITS(@BENEFITS, @PERCENTAGEBENEFITS);

    --Remove benefits if they are waived
    if @BENEFITSWAIVED = 1
      set @TOTALBENEFITS = null;
    else
    begin
      --Validate that the total benefit amount is not greater than the revenue amount.
      declare @TOTALBENEFITAMOUNT money;

      select @TOTALBENEFITAMOUNT = coalesce(sum(TOTALVALUE), 0)
      from dbo.UFN_REVENUE_GETBENEFITS_3_FROMITEMLISTXML(@TOTALBENEFITS);

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

    /*JamesWill CR269601-030907 2007/03/09 If @GIVENANONYMOUSLYDEFAULTEDFORCONSTITUENTID is not @CONSTITUENT ID, that means we 
    * didn't default GIVENANONYMOUSLY for this row. So default it now. */
    if @GIVENANONYMOUSLYDEFAULTEDFORCONSTITUENTID is null or @GIVENANONYMOUSLYDEFAULTEDFORCONSTITUENTID <> @CONSTITUENTID
    begin
      select
        @GIVENANONYMOUSLY = GIVESANONYMOUSLY
      from dbo.CONSTITUENT
      where ID = @CONSTITUENTID;
    end

    -- 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('HOUSEHOLDSCANNOTBEDONORS', 13, 1);

    -- 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);

    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);

    declare @BATCHOWNERID uniqueidentifier;
    declare @BATCHID uniqueidentifier;

    select
      @BATCHOWNERID = APPUSERID,
      @MERCHANTACCOUNTID = BATCHREVENUE.MERCHANTACCOUNTID,
      @BATCHID = [BATCH].[ID]
    from dbo.BATCH
    inner join dbo.BATCHREVENUE on BATCH.ID = BATCHREVENUE.BATCHID
    where BATCHREVENUE.ID = @BATCHROWID

    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 = 255
        set @PAYMENTMETHODCODE = null;

      if @CREDITCARDTOKEN is not null and len(@AUTHORIZATIONCODE) = 0 and @PAYMENTMETHODCODE = 2 and @AMOUNT > 0 -- credit card
      begin
        raiserror('BBERR_CREDITCARD_NOTPROCESSED', 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('The low price per share cannot be negative.', 13, 1)

        if @MEDIANPRICE < 0
          raiserror('The median price per share cannot be negative.', 13, 1)

        if @HIGHPRICE < 0
          raiserror('The high price per share cannot be negative.', 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 @SALEPOSTDATE is null and @SALEPOSTSTATUSCODE = 1
              raiserror('ERR_STOCK_SALEGLPOSTDATEREQUIRED', 13, 1)

            -- Validate GL Mappings
            if @NUMBEROFUNITSSOLD > 0
              exec dbo.USP_REVENUE_STOCK_VALIDATEGLMAPPINGS @PDACCOUNTSYSTEMID, @CURRENTAPPUSERID, @AMOUNT, @SALEAMOUNT, @NUMBEROFUNITSSOLD, @MEDIANPRICE, @BROKERFEE
          end

        if @NUMBEROFUNITSSOLD > @NUMBEROFUNITS
          raiserror('Units sold must be less than or equal to units remaining.', 13, 1)

        if @NUMBEROFUNITSSOLD = 0 and (@USERMODIFIEDNUMBEROFUNITSSOLD = 1 or @NUMBEROFUNITS <= 0)
          raiserror('You must sell one or more unit.', 13, 1)
      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      

      --JamesWill 2007/06/04 CR276243-053007 
      if @PAYMENTMETHODCODE = 3 --Direct Debit
      begin
        if @CONSTITUENTACCOUNTID is null
        raiserror('Please enter an Account for direct debit payments.', 13, 1);
      end

      -- DJH 5/27/2008 CR301226-052108 Validate that the payment method 'None' isn't used with payments
      if @PAYMENTMETHODCODE = 9 -- None
        raiserror('Only pledges or recurring gifts can have a payment method of ''None''.', 13, 1)

      if @PAYMENTMETHODCODE = 10 --Other
      begin
        if @OTHERPAYMENTMETHODCODEID is null
          raiserror('Please enter an ''other method'' for other payments.', 13, 1);
      end

      if @PAYMENTMETHODCODE = 11 --Standing order
      begin
        if @CONSTITUENTACCOUNTID is null
          raiserror('Please enter an Account for standing order payments.', 13, 1);
      end

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

      declare @APPLIEDAMOUNT money = 0;
      declare @RECEIPTABLEAMOUNT money = @AMOUNT;

      if @REVENUESTREAMS is not null and @STREAMCOUNT > 0
      begin

        declare @AMOUNTNOTRECEIPTABLE money = 0;

        with [APPLICATIONS]
        as
        (
          -- AdamBu - 7/22/11 - The only portion of revenue that shouldn't be receipted are event 
          --  costs, which are prorated depending on how much of the registration price was paid.
          select
            case  
              when TYPECODE = 6 then
                APPLIED - dbo.UFN_EVENTREGISTRANT_GETRECEIPTAMOUNT_NOBENEFITS(
                  APPLICATIONID,
                  @DATE,
                  @AMOUNT,
                  @ORGANIZATIONCURRENCYID,
                  @ORGANIZATIONCURRENCYID,
                  null,
                  0,
                  coalesce((select 1 from dbo.BATCHREVENUEREGISTRANT where ID = APPLICATIONID), 0),
                  null
                )
              else 0
            end as [AMOUNTNOTRECEIPTABLE],
            APPLIED
          from dbo.UFN_REVENUEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS)
          where APPLIED > 0
        )
        select 
          @APPLIEDAMOUNT = coalesce(sum(APPLIED), 0), -- If no applied amount > 0 exists, we want to still set the applied amount to 0 instead of null.
          @AMOUNTNOTRECEIPTABLE = sum(coalesce(AMOUNTNOTRECEIPTABLE, 0))
        from [APPLICATIONS];

        set @RECEIPTABLEAMOUNT = @AMOUNT - coalesce(@AMOUNTNOTRECEIPTABLE, 0);
      end

      declare @UNAPPLIEDAMOUNT money = @AMOUNT - @APPLIEDAMOUNT;

      if not @REVENUESTREAMS is null and @STREAMCOUNT > 0
        exec dbo.USP_REVENUEBATCH_VALIDATEREVENUESTREAMS @AMOUNT, @REVENUESTREAMS, @PAYMENTMETHODCODE;

      if not @UNAPPLIEDMATCHINGGIFTSPLITS is null
        exec dbo.USP_REVENUESPLITS_VALIDATEGLMAPPINGS @UNAPPLIEDMATCHINGGIFTSPLITS, @TYPECODE, @PAYMENTMETHODCODE, null, 1;

      if not @SOLICITORS is null
        exec dbo.USP_REVENUESOLICITOR_VALIDATESOLICITORS @SOLICITORS, @UNAPPLIEDAMOUNT;

      if not @TRIBUTES is null
      begin
        if (select sum(AMOUNT) from dbo.UFN_REVENUE_GETTRIBUTES_FROMITEMLISTXML(@TRIBUTES)) > @UNAPPLIEDAMOUNT
          raiserror('The sum of the tribute amounts cannot be greater than the revenue amount.', 13, 1)
      end

      if not @SPLITS is null 
      begin
        exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS, @UNAPPLIEDAMOUNT, @TYPECODE;

        exec dbo.USP_REVENUESPLITS_VALIDATEGLMAPPINGS @SPLITS, @TYPECODE, @PAYMENTMETHODCODE, @CATEGORYCODEID;

        -- 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
          declare @CAMPAIGNS xml
          declare CAMPAIGNCURSOR cursor local fast_forward for 
          select
            CAMPAIGNS
          from dbo.UFN_REVENUEBATCH_SPLITSWITHCHILDREN_FROMITEMLISTXML(@SPLITS)

          open CAMPAIGNCURSOR

          fetch next from CAMPAIGNCURSOR into @CAMPAIGNS

          while @@FETCH_STATUS = 0
          begin
            if exists(select 1 
                      from dbo.UFN_REVENUESPLIT_CAMPAIGNS_FROMITEMLISTXML(@CAMPAIGNS
                      group by CAMPAIGNID, CAMPAIGNSUBPRIORITYID
                      having count(*) > 1)
            begin
              raiserror('Duplicate campaigns and subpriorities cannot be specified for the same designation.', 13, 1)
            end

            fetch next from CAMPAIGNCURSOR into @CAMPAIGNS
          end

          close CAMPAIGNCURSOR
          deallocate CAMPAIGNCURSOR
        end
      end;
      else
      begin
        if @UNAPPLIEDAMOUNT > 0 or (@AMOUNT =0 and @UNAPPLIEDAMOUNT=0)
        begin
          if @SINGLEDESIGNATIONID is null
            raiserror('Please enter at least one designation.', 13, 1);

          exec dbo.USP_DESIGNATION_VALIDATEGLMAPPINGS @SINGLEDESIGNATIONID, @TYPECODE, @PAYMENTMETHODCODE, 0, 0, @CATEGORYCODEID;
        end
      end;

      if @RECEIPTAMOUNT > @RECEIPTABLEAMOUNT
        raiserror('The receipt amount must be less than or equal to the gift amount.', 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;

      --JamesWill 02/12/2008 CR293355-021208 Do validation for any created MG Claims
      if not @MGMATCHINGCONSTITUENTID is null
      begin
        if @MGAMOUNT < 0 
          raiserror('The matching gift amount cannot be negative.', 13, 1);

        --We need to convert the MGSPLITS to regular SPLITS (involves changing the root from "MGSPLITS" to "SPLITS" and adding a "REVENUEID" element) 
        /* JamesWill CR273846-042607 2007/04/27 the IDs from BATCHREVENUEMATCHINGGIFTSPLIT have the same IDs as corresponding
        * rows from BATCHREVENUESPLIT. Since USP_REVENUE_GETSPLITS_ADDFROMXML will use the ID from the xml to add to REVENUESPLIT, 
        * we need to use new IDs for matching gift splits. Making the change here instead of in the client component when we generate 
        * these splits allows the fix to work for previously existing batches without having to run "update BATCHREVENUEMATCHINGGIFTSPLIT set ID = newid()"
        * as a service revision. 
        */
        insert into @MGSPLITSTABLE(ID, DESIGNATIONID, AMOUNT, SEQUENCE
          select newid(), DESIGNATIONID, AMOUNT, SEQUENCE from dbo.UFN_REVENUEBATCH_GETMATCHINGGIFTSPLITS_FROMITEMLISTXML(@MGSPLITS);

        set @MGSPLITS = (select ID, DESIGNATIONID, AMOUNT, SEQUENCE, null as [REVENUEID], 0 as APPLICATIONCODE, 0 as TYPECODE
                         from @MGSPLITSTABLE 
                         for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64 )

        exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @MGSPLITS, @MGAMOUNT, @TYPECODE;
      end

      -- DJH 5/27/2008 CR301499-052308 Validate that SALEPOSTDATE is set if the payment type is sold property or stock
      --if @SALEDATE is not null and (@SALEPOSTDATE is null and @SALEPOSTSTATUSCODE =1)
      --  raiserror('Sale GL post date is required.', 13, 1)

      -- Verify that if the application type is other, that the other type code is set
      if @APPLICATIONCODE = 1 and @OTHERTYPECODEID is null
        raiserror('Other type is required if the application is Other.', 13, 1)

      -- If an unapplied matching gift payment was added, verify the constituent selected is an organization
      if @APPLICATIONCODE = 2
      begin
        declare @ISORGANIZATION bit
        select @ISORGANIZATION = ISORGANIZATION
        from dbo.CONSTITUENT where ID = @CONSTITUENTID

        if @ISORGANIZATION is null
          select @ISORGANIZATION = ISORGANIZATION
          from dbo.BATCHREVENUECONSTITUENT where ID = @CONSTITUENTID

        if @ISORGANIZATION = 0
          raiserror('Only organizations can add unapplied matching gift payments.', 13, 1)
      end
    end;
    else if @TYPECODE = 1  -- pledge
    begin

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

      if (@VALIDATEONLY = 1) and (@POSTSTATUSCODE = 1)
        exec dbo.USP_REVENUE_VALIDATEGLMAPPING @BATCHROWID, 1, @CURRENTAPPUSERID;

      if not @PAYMENTMETHODCODE in (2, 3, 9, 11)
      begin
        if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
          raiserror('Payment method for a pledge must be ''Credit card'', ''Direct debit'', ''Standing order'', or ''None''.', 13, 1);
        else
          raiserror('Payment method for a pledge must be ''Credit card'', ''Direct debit'', or ''None''.', 13, 1);
      end
      --JamesWill 2007/06/04 CR276243-053007 
      if @PAYMENTMETHODCODE = 3 --Direct Debit
      begin
        if @CONSTITUENTACCOUNTID is null
        raiserror('Please enter an Account for direct debit pledges.', 13, 1);
      end

      if @PAYMENTMETHODCODE = 11 --Standing order
      begin
        if @CONSTITUENTACCOUNTID is null
        raiserror('Please enter an Account for standing order pledges.', 13, 1);
      end

      if not @SPLITS is null
      begin
        exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS, @AMOUNT, @TYPECODE;

        exec dbo.USP_REVENUESPLITS_VALIDATEGLMAPPINGS @SPLITS, @TYPECODE, @PAYMENTMETHODCODE, @CATEGORYCODEID;
      end
      else
      begin
        if @SINGLEDESIGNATIONID is null
          raiserror('Please enter at least one designation.', 13, 1);

        exec dbo.USP_DESIGNATION_VALIDATEGLMAPPINGS @SINGLEDESIGNATIONID, @TYPECODE, @PAYMENTMETHODCODE, 0, 0, @CATEGORYCODEID;
      end

      if not @SOLICITORS is null
        exec dbo.USP_REVENUESOLICITOR_VALIDATESOLICITORS @SOLICITORS, @AMOUNT;

      if not @TRIBUTES is null
      begin
        if (select sum(AMOUNT) from dbo.UFN_REVENUE_GETTRIBUTES_FROMITEMLISTXML(@TRIBUTES)) > @AMOUNT
          raiserror('The sum of the tribute amounts cannot be greater than the revenue amount.', 13, 1)
      end

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

      if @INSTALLMENTFREQUENCYCODE not in (0,1,2,3,4,5,7,8)
        raiserror('The installment frequencies of bimonthly and weekly are not supported by pledges.', 13, 1);

      -- Validate installments if the frequency is irregular
      if @INSTALLMENTFREQUENCYCODE = 4
        exec dbo.USP_REVENUEINSTALLMENT_VALIDATEINSTALLMENTS @INSTALLMENTS, @DATE, @AMOUNT;

      if @INSTALLMENTSTARTDATE < @DATE
        raiserror('The schedule cannot start before the gift date.', 13, 1);

      if @INSTALLMENTENDDATE < @INSTALLMENTSTARTDATE
        raiserror('The schedule end date cannot occur before the schedule start date.', 13, 1);

      if @PAYMENTFORPLEDGEAMOUNT > @AMOUNT
        raiserror('The payment amount for a pledge cannot be more than the total pledge amount', 13, 1);
    end;
    else if @TYPECODE = 3  -- recurring gift
    begin
      if not @SPLITS is null
        exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS, @AMOUNT, @TYPECODE;
      else
        if @SINGLEDESIGNATIONID is null
          raiserror('Please enter at least one designation.', 13, 1);

      if not @SOLICITORS is null
        exec dbo.USP_REVENUESOLICITOR_VALIDATESOLICITORS @SOLICITORS, @AMOUNT;


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

      --if semi-monthly ensure nexttransaction date starts on 1st or 15th
      --JamesWill WI170811 2011-08-11 Do this before validating the transaction dates
      if @INSTALLMENTFREQUENCYCODE = 7 and not (day(@INSTALLMENTSTARTDATE) = 1 or day(@INSTALLMENTSTARTDATE) = 15)
        --Note: Use the old UFN_REVENUE_GETNEXTTRANSACTIONDATE function here because it doesn't require an ID and does exactly what is needed right here
        set @NEXTTRANSACTIONDATE = dbo.UFN_REVENUE_GETNEXTTRANSACTIONDATE(@INSTALLMENTFREQUENCYCODE, @INSTALLMENTSTARTDATE);
      else
        set @NEXTTRANSACTIONDATE = @INSTALLMENTSTARTDATE;



      if @INSTALLMENTFREQUENCYCODE = 4 or @INSTALLMENTFREQUENCYCODE = 5
        raiserror('The installment frequencies of irregular and single installment are not supported by recurring gifts.', 13, 1);

      if @PAYMENTMETHODCODE not in (2, 3, 9, 11)
      begin
        if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
          raiserror('Payment method for a recurring gift must be ''Credit card'', ''Direct debit'', ''Standing order'', or ''None''.', 13, 1);
        else
          raiserror('Payment method for a recurring gift must be ''Credit card'', ''Direct debit'', or ''None''.', 13, 1);
      end

      --JamesWill 2007/06/04 CR276243-053007 
      if @PAYMENTMETHODCODE = 3 --Direct Debit
      begin
        if @CONSTITUENTACCOUNTID is null
          raiserror('Please enter an Account for direct debit recurring gifts.', 13, 1);
      end

      if @PAYMENTMETHODCODE = 11 --Standing order
      begin
        if @CONSTITUENTACCOUNTID is null
          raiserror('Please enter an Account for standing order recurring gifts.', 13, 1);
      end

      if @INSTALLMENTSTARTDATE < @DATE
        raiserror('The schedule cannot start before the gift date.', 13, 1);

      if @INSTALLMENTENDDATE < @INSTALLMENTSTARTDATE
        raiserror('The schedule end date cannot occur before the schedule start date.', 13, 1);

      --JamesWill WI170811 2011-08-11 Validate the next transaction date in the same manner as CK_REVENUESCHEDULE_NEXTTRANSACTIONDATEVALID on 
      --REVENUESCHEDULE
      if not @NEXTTRANSACTIONDATE is null and @NEXTTRANSACTIONDATE > @INSTALLMENTENDDATE
        raiserror('BBERR_RECURRINGGIFT_NEXTTRANSACTIONDATEVALID', 13, 1);
    end;


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


    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
      exec dbo.USP_REVENUEBATCH_VALIDATENEWCONSTITUENT
        @REVENUEBATCHCONSTITUENTID = @CONSTITUENTID,
        @ISDONOR = 1,
        @BATCHROWID = @BATCHROWID;

    exec dbo.USP_REVENUEBATCH_VALIDATERECOGNITIONS @RECOGNITIONS, @BATCHROWID;

    -- DJH CR299323-042908 4/30/2008
    -- Using @GENERATEREVENUENOTE so that the same logic that determines
    -- whether validation occurs also determines whether the table is 
    -- actually populated
    --declare @GENERATEREVENUENOTE bit not necessary after revenue changes
    if (@NOTETITLE <> '') or (not @NOTEAUTHORID is null) or (not @NOTEDATEENTERED is null) or (not @NOTETYPECODEID is null) or (not @NOTETEXTNOTE = ''
    begin
      --set @GENERATEREVENUENOTE = 1 not necessary after revenue changes

      if @NOTETYPECODEID is null
        raiserror('Please enter a type for the revenue note.', 13, 1)

      if @NOTEDATEENTERED is null
        raiserror('Please enter a date for the revenue note.', 13, 1)
    end

    if @VALIDATEONLY = 1
    begin
      -- When actually committing, the declarations will be validated through table constraints
      exec dbo.USP_BATCH_VALIDATETAXDECLARATIONS @TAXDECLARATIONS = @TAXDECLARATIONS, @BATCHTYPE = 1, @CONSTITUENTID = @CONSTITUENTID
    end
    else if @VALIDATEONLY = 0
    begin
      if @CONSTITUENTEXISTS = 0
      begin
        declare @BATCHCONSTITID uniqueidentifier;
        set @BATCHCONSTITID = @CONSTITUENTID;
        set @CONSTITUENTID = newID();

        -- 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;

        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;

      -- Single designation ID is deprecated so it should be in the splits collection
      if @SINGLEDESIGNATIONID is not null and @SPLITS is null
      begin
        set @SPLITS = (select
                         @SINGLEDESIGNATIONID as DESIGNATIONID,
                         @AMOUNT as AMOUNT,
                         @DECLINESGIFTAID as DECLINESGIFTAID,
                         1 as SEQUENCE,
                         @ISGIFTAIDSPONSORSHIP as ISGIFTAIDSPONSORSHIP
                       for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64)
      end

      if @TYPECODE = 0  -- payment
      begin

        --Default the receipt amount to be the gift amount - benefits if the user did not explicitly set the receipt amount
        if @USERMODIFIEDRECEIPTAMOUNT = 0
        begin
          if not @BENEFITS is null and @BENEFITSWAIVED = 0
          begin
            declare @BENEFITAMOUNT money;
            select @BENEFITAMOUNT = coalesce(sum(QUANTITY * UNITVALUE), 0)
            from dbo.UFN_REVENUE_GETBENEFITS_FROMITEMLISTXML(@BENEFITS);

            select @BENEFITAMOUNT = @BENEFITAMOUNT + coalesce(sum(PERCENTAPPLICABLEAMOUNT * VALUEPERCENT/100), 0)
            from dbo.UFN_REVENUE_GETBENEFITS2_FROMITEMLISTXML(@PERCENTAGEBENEFITS);

            select @RECEIPTAMOUNT = @RECEIPTABLEAMOUNT - @BENEFITAMOUNT;
          end
          else
            set @RECEIPTAMOUNT = @RECEIPTABLEAMOUNT;
        end 

        if @RECEIPTAMOUNT < 0
          set @RECEIPTAMOUNT = 0;

        if @RECEIPTAMOUNT > @TRANSACTIONAMOUNT
          raiserror('ERR_VALIDATE_RECEIPTAMOUNT', 13, 1);

        if not @SPLITS is null
          exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS, @UNAPPLIEDAMOUNT, @TYPECODE;

        --if no receipt type is specified, get the default receipt type
        if @RECEIPTTYPECODE is null or @RECEIPTTYPECODE = 255
          set @RECEIPTTYPECODE = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@CONSTITUENTID,@TYPECODE);

        insert into dbo.REVENUE (ID, CONSTITUENTID, DATE, BATCHNUMBER, POSTDATE, DONOTPOST, AMOUNT, TRANSACTIONTYPECODE, RECEIPTAMOUNT, FINDERNUMBER, SOURCECODE, APPEALID, GIVENANONYMOUSLY, DONOTACKNOWLEDGE, DONOTRECEIPT, BENEFITSWAIVED, MAILINGID, CHANNELCODEID, RECEIPTTYPECODE, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
          values (@ID, @CONSTITUENTID, @DATE, @BATCHNUMBER, @POSTDATE, @DONOTPOST, @AMOUNT, 0, @RECEIPTAMOUNT, @FINDERNUMBER, @SOURCECODE, @APPEALID, @GIVENANONYMOUSLY, @DONOTACKNOWLEDGE, @DONOTRECEIPT, @BENEFITSWAIVED, @MAILINGID, @CHANNELCODEID, @RECEIPTTYPECODE, @ORGANIZATIONCURRENCYID, @AMOUNT, null, @AMOUNT, @ORGANIZATIONCURRENCYID, null, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

        --Add origination source
        exec dbo.USP_REVENUE_ADDORIGIN @ID, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

        --Add payment original amount
        exec dbo.USP_PAYMENT_ADDORIGINALAMOUNT @ID, @CHANGEAGENTID, @CURRENTDATE;

        if not @LETTERCODEID is null
        begin

          if @ACKNOWLEDGEEID is null
            set @ACKNOWLEDGEEID = @CONSTITUENTID;

          insert into dbo.REVENUELETTER
            (ID,REVENUEID,LETTERCODEID,ACKNOWLEDGEDATE,ACKNOWLEDGEEID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
          values
            (NewID(),@ID,@LETTERCODEID,@ACKNOWLEDGEDATE,@ACKNOWLEDGEEID, @CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE);
        end;

        declare @SPLITSDECLININGGIFTAIDAPPLICATIONS xml, @COVENANTGIFTSPLITS xml
        if @REVENUESTREAMS is not null and @STREAMCOUNT > 0
        begin
          -- BEGIN NEW PLEDGES FOR PAYMENTS HANDLING
          -- A payment revenue application may contain a new pledge which needs to be created.
          -- To handle this, we...
          --  1. Get the pledge definition in XML out of the @REVENUESTREAMS xml
          --  2. Use the stored procedure from Pledge.Add.xml to create a new pledge in the 
          --     database using variables pulled from the XML as parameters.
          --  3. Insert an APPLICATIONID element into the @REVENUESTREAMS item with the
          --     uniqueidentifier created by adding the pledge.  SQL Server does not allow
          --     SQL variables within the SQL XML modify statement, so this requires some trickery:
          --     a. Create a temporary XML variable combining the entire @REVENUESTREAMS and the 
          --        APPLICATIONID element using a SELECT ... FOR XML statement.
          --     b. Use the .modify method to insert the APPLICATIONID element into the revenue stream
          --        which contains the pledge element.
          --     c. Delete the outer APPLICATIONID element from the variable and reassign back to original variable.
          --  4. Carry on business as usual

          declare @APPLICATIONPLEDGE xml;
          select @APPLICATIONPLEDGE = PLEDGES from UFN_REVENUEBATCH_GETAPPLICATIONSWITHCHILDREN_FROMITEMLISTXML(@REVENUESTREAMS) where PLEDGES is not null;

          if (select count(ID) from UFN_REVENUEBATCH_GETPAYMENTPLEDGE_FROMITEMLISTXML(@APPLICATIONPLEDGE)) = 1
          begin
            declare @APPLICATIONPLEDGEREVENUEID uniqueidentifier;
            declare @APCONSTITUENTID uniqueidentifier;
            declare @APDATE datetime;
            declare @APAMOUNT money;
            declare @APPOSTSTATUSCODE tinyint;
            declare @APPOSTDATE datetime;
            declare @APSENDPLEDGEREMINDER bit;
            declare @APSPLITS xml;
            declare @APFREQUENCYCODE tinyint;
            declare @APNUMBEROFINSTALLMENTS int;
            declare @APSTARTDATE datetime;
            declare @APINSTALLMENTS xml;
            declare @APFINDERNUMBER bigint;
            declare @APSOURCECODE nvarchar(50);
            declare @APAPPEALID uniqueidentifier;
            declare @APBENEFITS xml;
            declare @APBENEFITSWAIVED bit;
            declare @APGIVENANONYMOUSLY bit;
            declare @APMAILINGID uniqueidentifier;
            declare @APCHANNELCODEID uniqueidentifier;
            declare @APDONOTACKNOWLEDGE bit;
            declare @APPLEDGESUBTYPEID uniqueidentifier;
            declare @APREFERENCE nvarchar(255);
            declare @APCATEGORYCODEID uniqueidentifier;
            declare @APOPPORTUNITYID uniqueidentifier;
            declare @APSPLITSDECLININGGIFTAID xml;
            declare @APPERCENTAGEBENEFITS xml;

            select
              @APCONSTITUENTID = BRAP.CONSTITUENTID,
              @APDATE = XML.DATE,
              @APAMOUNT = XML.AMOUNT,
              @APPOSTSTATUSCODE = XML.POSTSTATUSCODE,
              @APPOSTDATE = XML.POSTDATE,
              @APSENDPLEDGEREMINDER = XML.SENDPLEDGEREMINDER,
              @APSPLITS = XML.SPLITS,
              @APFREQUENCYCODE = XML.FREQUENCYCODE,
              @APNUMBEROFINSTALLMENTS = XML.NUMBEROFINSTALLMENTS,
              @APSTARTDATE = XML.STARTDATE,
              @APINSTALLMENTS = XML.INSTALLMENTS,
              @APFINDERNUMBER = XML.FINDERNUMBER,
              @APSOURCECODE = case when XML.SOURCECODE is null then '' else XML.SOURCECODE end,
              @APAPPEALID = XML.APPEALID,
              @APBENEFITS = XML.BENEFITS,
              @APBENEFITSWAIVED = XML.BENEFITSWAIVED,
              @APGIVENANONYMOUSLY = XML.GIVENANONYMOUSLY,
              @APMAILINGID = XML.MAILINGID,
              @APCHANNELCODEID = XML.CHANNELCODEID,
              @APDONOTACKNOWLEDGE = XML.DONOTACKNOWLEDGE,
              @APPLEDGESUBTYPEID = XML.PLEDGESUBTYPEID,
              @APREFERENCE = XML.REFERENCE,
              @APCATEGORYCODEID = XML.GLREVENUECATEGORYMAPPINGID,
              @APOPPORTUNITYID = XML.OPPORTUNITYID,
              @APPERCENTAGEBENEFITS = XML.PERCENTAGEBENEFITS

            from
            dbo.UFN_REVENUEBATCH_GETPAYMENTPLEDGE_FROMITEMLISTXML(@APPLICATIONPLEDGE) XML
            -- join to BATCHREVENUEAPPLICATIONPLEDGE to get the constituent ID
            -- in case it changed as a result of it originally being a batch revenue constituent ID.
            inner join dbo.BATCHREVENUEAPPLICATIONPLEDGE BRAP on XML.ID = BRAP.ID

            exec dbo.USP_PLEDGE_ADD
              @APPLICATIONPLEDGEREVENUEID output,
              @CHANGEAGENTID,
              @APCONSTITUENTID,
              @APDATE,
              @APAMOUNT,
              @APPOSTSTATUSCODE,
              @APPOSTDATE,
              @APSENDPLEDGEREMINDER,
              @APSPLITS,
              @APFREQUENCYCODE,
              @APNUMBEROFINSTALLMENTS,
              @APSTARTDATE,
              @APINSTALLMENTS,
              0,
              9,
              '',
              '',
              null,
              '00000000',
              '00000000',
              '',
              null,
              @APFINDERNUMBER,
              @APSOURCECODE,
              @APAPPEALID,
              @APBENEFITS,
              @APBENEFITSWAIVED,
              @APGIVENANONYMOUSLY,
              @APMAILINGID,
              @APCHANNELCODEID,
              @APDONOTACKNOWLEDGE,
              @APPLEDGESUBTYPEID,
              @BATCHNUMBER,
              @APOPPORTUNITYID,
              @APREFERENCE,
              @APCATEGORYCODEID,
              null,
              0,
              null,
              null,
              null,
              @APSPLITSDECLININGGIFTAID output,
              @APPERCENTAGEBENEFITS;

            exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @APPLICATIONPLEDGEREVENUEID, @APAPPEALID, 9, null, @CHANGEAGENTID, @APDATE, 1, @APSPLITSDECLININGGIFTAID; --revenue transaction type code of pledge is 1

            declare @APPLICATIONIDNODE xml;
            set @APPLICATIONIDNODE = '<APPLICATIONID>' + cast(@APPLICATIONPLEDGEREVENUEID as varchar(36)) + '</APPLICATIONID>';

            declare @COMBINEDXML xml;
            select @COMBINEDXML =
            (
              select 
                @APPLICATIONIDNODE,
                @REVENUESTREAMS
              for xml path(''), type
            );

            --JamesWill 03/27/2008 CR296359-032108 We also need to delete the original APPLICATIONID element from that /REVENUESTREAMS/ITEM or we'll end up with 2. The first will
            --be <APPLICATIONID>00000000-0000-0000-0000-000000000000</APPLICATIONID> and the second one will have the pledge's revenue ID. The empty guid will confuse code in
            --USP_REVENUEBATCH_APPLYTOREVENUESTREAMS and make it think it is applying to a MG Claim instead of a pledge.
            set @COMBINEDXML.modify('delete /REVENUESTREAMS/ITEM[count(./PLEDGES/ITEM)>0]/APPLICATIONID[1]');

            set @COMBINEDXML.modify('insert /APPLICATIONID[1] into (/REVENUESTREAMS/ITEM[count(./PLEDGES/ITEM)>0])[1]');

            set @COMBINEDXML.modify('delete /APPLICATIONID[1]');

            set @REVENUESTREAMS = @COMBINEDXML;
          end

          declare @returnid uniqueidentifier;
          --need to add @MAILINGID and @CHANNELCODEID.  currently passed in as null

          -- LTM - WI #186567, #167954 removing call to reduce extra logic since the actual population happens within the 2 SPs for pledge payment and recurring gift payment.
          --CR165881, ryu 07/15/11 need to populate marketing code/IDs from revenueStreams before the splits and recognitions are created
          --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_REVENUEBATCH_DEFAULTMARKETINGINFORMATION_FROMREVENUESTREAMS @REVENUESTREAMS, @ID, @CHANGEAGENTID, @CURRENTDATE;

          exec dbo.USP_REVENUEBATCH_APPLYTOREVENUESTREAMS @ID, @REVENUESTREAMS, @CONSTITUENTID, @DATE, @PAYMENTMETHODCODE, @BATCHNUMBER, @POSTDATE, @POSTSTATUSCODE, @DONOTRECEIPT, @DONOTACKNOWLEDGE, @FINDERNUMBER, @SOURCECODE, @APPEALID, @MAILINGID, @CHANNELCODEID, @CHECKDATE, @CHECKNUMBER, @CONSTITUENTACCOUNTID, @REFERENCEDATE, @REFERENCENUMBER, @CARDHOLDERNAME, @CREDITCARDNUMBER, @CREDITTYPECODEID, @AUTHORIZATIONCODE, @EXPIRESON, @ISSUER, @NUMBEROFUNITS, @SYMBOL, @MEDIANPRICE, @SALEDATE, @SALEAMOUNT, @BROKERFEE, @SALEPOSTSTATUSCODE, @SALEPOSTDATE, @PROPERTYSUBTYPECODEID, @GIFTINKINDSUBTYPECODEID, @CHANGEAGENTID, @CURRENTDATE, @UNAPPLIEDMATCHINGGIFTSPLITS,@APPLIEDTOPLEDGES output, @returnid output, 1, @OTHERPAYMENTMETHODCODEID, @REFERENCE, @CATEGORYCODEID, @SPLITSDECLININGGIFTAIDAPPLICATIONS output, @COVENANTGIFTSPLITS output, @BATCHOWNERID;

          --JamesWill CR268756-030207 2007/03/02 unset the ISPENDING flag for gifts which were generated
          update dbo.REVENUESCHEDULE
            set ISPENDING = 0,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
          from dbo.REVENUESCHEDULE
          where REVENUESCHEDULE.ID in (select APPLICATIONID from dbo.UFN_REVENUEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS) where APPLIED > 0 and WASGENERATED = 1)

          -- if a receipt type has been specified, update the revenue streams
          --bez 3/18/06 since the receipttype defaults to 0, don't set it if it is going to be zero
          if @RECEIPTTYPECODE is not null and @RECEIPTTYPECODE <> 255 and @RECEIPTTYPECODE <> 0
            update dbo.REVENUE 
              set RECEIPTTYPECODE = @RECEIPTTYPECODE, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CURRENTDATE
            where ID = @ID;

        end

        declare @REVENUESPLITAPPLICATIONCODE tinyint
        set @REVENUESPLITAPPLICATIONCODE = case
                                             when @APPLICATIONCODE = 0 then 0 -- Donation
                                             when @APPLICATIONCODE = 1 then 4 -- Other
                                             when @APPLICATIONCODE = 2 then 7 -- Unapplied matching gift claim
                                           end

        declare @REVENUESPLITTYPECODE tinyint
        set @REVENUESPLITTYPECODE = case 
                                      when @APPLICATIONCODE = 0 or @APPLICATIONCODE = 2 then 0
                                      when @APPLICATIONCODE = 1 then 4
                                    end

        declare @SPLITSDECLININGGIFTAIDDESIGNATIONS xml;
        declare @ISGIFTAIDSPONSORSHIPSPLITSDESIGNATIONS xml;
        exec dbo.USP_REVENUEBATCHCOMMIT_SPLITSWITHCHILDREN_ADDFROMXML @ID = @ID,
          @SPLITS = @SPLITS,
          @REVENUESPLITAPPLICATIONCODE = @REVENUESPLITAPPLICATIONCODE,
          @REVENUESPLITTYPECODE = @REVENUESPLITTYPECODE,
          @OTHERTYPECODEID = @OTHERTYPECODEID,
          @CATEGORYCODEID = @CATEGORYCODEID,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @CURRENTDATE = @CURRENTDATE,
          @OPPORTUNITYID = @OPPORTUNITYID,
          @ADDITIONALAPPLICATIONS = 0,
          @SPLITSDECLININGGIFTAID = @SPLITSDECLININGGIFTAIDDESIGNATIONS output,
          @ISGIFTAIDSPONSORSHIPSPLITS = @ISGIFTAIDSPONSORSHIPSPLITSDESIGNATIONS output;

        -- If this isn't a Donation, then gift aid can't be declined and the application can not be a Gift Aid sponsorship
        if @APPLICATIONCODE <> 0
        begin
          set @SPLITSDECLININGGIFTAIDDESIGNATIONS = null
          set @ISGIFTAIDSPONSORSHIPSPLITSDESIGNATIONS = null
        end

        declare @SPLITSDECLININGGIFTAID xml;
        set @SPLITSDECLININGGIFTAID = (
          select REVENUESPLITID from
          (
            select
              T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
            from @SPLITSDECLININGGIFTAIDAPPLICATIONS.nodes('/SPLITSDECLININGGIFTAID/ITEM') T(c)
            union all
            select
              T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
            from @SPLITSDECLININGGIFTAIDDESIGNATIONS.nodes('/SPLITSDECLININGGIFTAID/ITEM') T(c)
          ) as DATA
          for xml raw('ITEM'),type,elements,root('SPLITSDECLININGGIFTAID'),BINARY BASE64);

        declare @ISGIFTAIDSPONSORSHIPSPLITS xml;
       set @ISGIFTAIDSPONSORSHIPSPLITS = (
          select REVENUESPLITID from
          (
            select
              T.c.value('(REVENUESPLITID)[1]','uniqueidentifier') AS 'REVENUESPLITID'
            from @ISGIFTAIDSPONSORSHIPSPLITSDESIGNATIONS.nodes('/ISGIFTAIDSPONSORSHIPSPLITS/ITEM') T(c)
          ) as DATA
          for xml raw('ITEM'),type,elements,root('GIFTAIDSPONSORSHIPSPLITS'),BINARY BASE64);

        --bez 2/11/09 adding reference for donations (reference was already being added from applytorevenuestreams for other application types)
        exec dbo.USP_REVENUEREFERENCE_ADD @ID, @REFERENCE, @CHANGEAGENTID;

        -- Add payment details after splits are created so the distribution can be generated for sold stock/property
        declare @REVENUEPAYMETHODID uniqueidentifier
        set @REVENUEPAYMETHODID = newid();
        insert into dbo.REVENUEPAYMENTMETHOD (ID,REVENUEID, PAYMENTMETHODCODE, AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
          values (@REVENUEPAYMETHODID,@ID,@PAYMENTMETHODCODE, @AMOUNT, @CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE)

        if @POSTSTATUSCODE = 0
          insert into dbo.REVENUEPOSTED(ID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
            values(@ID,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE);

        exec dbo.USP_REVENUE_ADDPAYMENTDETAILS @REVENUEPAYMETHODID, @PAYMENTMETHODCODE, @CHECKDATE, @CHECKNUMBER, @CONSTITUENTACCOUNTID, @REFERENCEDATE, @REFERENCENUMBER, @CARDHOLDERNAME, @CREDITCARDNUMBER, @CREDITTYPECODEID, @AUTHORIZATIONCODE, @EXPIRESON, @ISSUER, @NUMBEROFUNITS, @SYMBOL, @MEDIANPRICE, @SALEDATE, @SALEAMOUNT, @BROKERFEE, @SALEPOSTSTATUSCODE, @SALEPOSTDATE, @PROPERTYSUBTYPECODEID, @GIFTINKINDSUBTYPECODEID, @CHANGEAGENTID, @CURRENTDATE, 1, @OTHERPAYMENTMETHODCODEID, @DIRECTDEBITRESULTCODE, @LOWPRICE, @HIGHPRICE, @NUMBEROFUNITSSOLD, @USERMODIFIEDNUMBEROFUNITSSOLD, @TRANSACTIONID, @TRANSACTIONAMOUNT, '', 0, 0, 0, 0, null, null, null, @MERCHANTACCOUNTID

        if not @SOLICITORS is null
          exec dbo.USP_REVENUEBATCH_ADDSOLICITORS @ID, @SOLICITORS, @CHANGEAGENTID, @CURRENTDATE;

        if not @RECOGNITIONS is null and not @GIVENANONYMOUSLY = 1
          exec dbo.USP_REVENUEBATCH_ADDRECOGNITIONS @ID, @RECOGNITIONS, @CHANGEAGENTID, @CURRENTDATE;

        --Update the organization total value, transaction total value, and exchange rates in the @TOTALBENEFITS XML.
        set @TOTALBENEFITS = dbo.UFN_REVENUEBENEFIT_CONVERTAMOUNTSINXML(@TOTALBENEFITS,@ORGANIZATIONCURRENCYID);
        exec dbo.USP_REVENUE_GETBENEFITS_3_ADDFROMXML @ID, @TOTALBENEFITS, @CHANGEAGENTID, @CURRENTDATE;

        --bez CR296386-032108 notes only got added for revenue when there was no donation
        --if @GENERATEREVENUENOTE = 1 not necessary after revenue changes
        --  insert into dbo.REVENUENOTE(DATEENTERED, TITLE, AUTHORID, TEXTNOTE, REVENUENOTETYPECODEID, REVENUEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
        --    values(@NOTEDATEENTERED, @NOTETITLE, @NOTEAUTHORID, @NOTETEXTNOTE, @NOTETYPECODEID, @ID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE)

        if not @TRIBUTES is null
        begin
          exec dbo.USP_REVENUE_GETTRIBUTES_UPDATEFROMXML @ID, @TRIBUTES, @CHANGEAGENTID, @CURRENTDATE;

          -- 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 = @ID;
        end

        declare @SPLITSFORGENERATEMGCLAIM xml;
        declare @AMOUNTFORGENERATINGMGCLAIM money;
        select @SPLITSFORGENERATEMGCLAIM = (select sum(AMOUNT) AMOUNT, DESIGNATIONID, 0 as TYPECODE
                                            from dbo.REVENUESPLIT
                                            where REVENUEID = @ID and REVENUESPLIT.TYPECODE = 0
                                            group by DESIGNATIONID
                                            for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64);

        select @AMOUNTFORGENERATINGMGCLAIM = sum(AMOUNT)
        from dbo.REVENUESPLIT
        where REVENUEID = @ID and REVENUESPLIT.TYPECODE = 0;

        if not @MGMATCHINGCONSTITUENTID is null
        begin

          declare @MGREVENUEID uniqueidentifier

          set @MGREVENUEID = newid();

          --JamesWill CR275664-052107 2007/05/24 Matching gift claims are never posted
          insert into dbo.REVENUE(ID, CONSTITUENTID, DATE, POSTDATE, DONOTPOST, AMOUNT, TRANSACTIONTYPECODE, RECEIPTAMOUNT, FINDERNUMBER, SOURCECODE, APPEALID, BATCHNUMBER, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@MGREVENUEID, @MGMATCHINGCONSTITUENTID, @MGDATE, null, 1, @MGAMOUNT, 3, @MGAMOUNT, 0, '', null, @BATCHNUMBER, @ORGANIZATIONCURRENCYID, @MGAMOUNT, null, @MGAMOUNT, @ORGANIZATIONCURRENCYID, null, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

          --Add origination source
          exec dbo.USP_REVENUE_ADDORIGIN @MGREVENUEID, @MGMATCHINGCONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;


          insert into dbo.REVENUEPAYMENTMETHOD (REVENUEID, PAYMENTMETHODCODE, AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values (@MGREVENUEID, 9, @AMOUNT, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE)

          insert into dbo.REVENUEMATCHINGGIFT (ID, MATCHINGGIFTCONDITIONID, MGSOURCEREVENUEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED,RELATIONSHIPID,ISACTIVE)
            values(@MGREVENUEID, @MGCONDITIONID, @ID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE,@MGRELATIONSHIPID,1)

          insert into dbo.REVENUESCHEDULE (ID, STARTDATE, FREQUENCYCODE, NUMBEROFINSTALLMENTS, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@MGREVENUEID, @MGDATE, 5, 1, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

          insert into dbo.INSTALLMENT (ID, REVENUEID, AMOUNT, DATE, SEQUENCE, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(newid(), @MGREVENUEID, @MGAMOUNT, @MGDATE, 1, @ORGANIZATIONCURRENCYID, @MGAMOUNT, null, @MGAMOUNT, @ORGANIZATIONCURRENCYID, null, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

          set @MGSPLITS = dbo.UFN_REVENUESPLIT_CONVERTAMOUNTSINXML(@MGSPLITS,@ORGANIZATIONCURRENCYID,null,@ORGANIZATIONCURRENCYID,null)
          exec dbo.USP_REVENUE_GETSPLITS_2_ADDFROMXML @MGREVENUEID, @MGSPLITS, @CHANGEAGENTID, @CURRENTDATE;

          exec dbo.USP_PLEDGE_GENERATEINSTALLMENTSPLITS @MGREVENUEID, @CHANGEAGENTID, @CURRENTDATE;

          if @CATEGORYCODEID is not null
            insert into dbo.REVENUECATEGORY (ID, GLREVENUECATEGORYMAPPINGID, DATEADDED, DATECHANGED, ADDEDBYID, CHANGEDBYID)
            select
              REVENUESPLIT.ID,
              @CATEGORYCODEID,
              @CURRENTDATE, @CURRENTDATE, @CHANGEAGENTID, @CHANGEAGENTID
            from dbo.REVENUESPLIT
            where
              REVENUESPLIT.REVENUEID = @MGREVENUEID

        end
        else if @AMOUNTFORGENERATINGMGCLAIM > 0
        begin

          declare @CREATEMGFROMMGRELATIONS bit;
          set @CREATEMGFROMMGRELATIONS = dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDMG();

          declare @CREATEMGFROMSPOUSEMGRELATIONS bit;
          set @CREATEMGFROMSPOUSEMGRELATIONS = dbo.UFN_MATCHINGGIFTPREFERENCE_AUTOADDSPOUSEMG();

          -- create matching gift records
          if @CREATEMGFROMMGRELATIONS > 0
            exec USP_MATCHINGGIFTPLEDGE_AUTOADD @CONSTITUENTID, @CHANGEAGENTID, @ID, @DATE, @AMOUNTFORGENERATINGMGCLAIM, @RECEIPTAMOUNT, @SPLITSFORGENERATEMGCLAIM, @CURRENTAPPUSERID;

          if @CREATEMGFROMSPOUSEMGRELATIONS > 0
            exec USP_MATCHINGGIFTPLEDGE_AUTOADDFROMSPOUSE @CONSTITUENTID, @CHANGEAGENTID, @ID, @DATE, @AMOUNTFORGENERATINGMGCLAIM, @RECEIPTAMOUNT, @SPLITSFORGENERATEMGCLAIM, @CURRENTAPPUSERID;
        end

        /* JamesWill CR258591-102706 2007/03/05 Add the note for every record in the transaction. */
        if (@NOTETITLE <> '') or (not @NOTEAUTHORID is null) or (not @NOTEDATEENTERED is null) or (not @NOTETYPECODEID is null) or (not @NOTETEXTNOTE = ''
        begin
          insert into dbo.REVENUENOTE(DATEENTERED, TITLE, AUTHORID, TEXTNOTE, REVENUENOTETYPECODEID, REVENUEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@NOTEDATEENTERED, @NOTETITLE, @NOTEAUTHORID, @NOTETEXTNOTE, @NOTETYPECODEID, @ID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE)
        end

        --If any marketing information is null, try to default based on applications
        /* replaced by USP_REVENUEBATCH_DEFAULTMARKETINGINFORMATION_FROMREVENUESTREAMS above, so no longer needed here
        if @SOURCECODE is null or @SOURCECODE = '' or @MAILINGID is null or @APPEALID is null
          exec dbo.USP_REVENUE_DEFAULTMARKETINGINFORMATION @ID, @CHANGEAGENTID, @CURRENTDATE;
        */            
        -- Link revenue to Default Account System
        if dbo.UFN_VALID_BASICGL_INSTALLED() = 1
        begin
          set @PDACCOUNTSYSTEMID = dbo.UFN_PDACCOUNTSYSTEM_GETDEFAULTSYSTEMIDSFORUSER(@CURRENTAPPUSERID)
          exec dbo.USP_PDACCOUNTSYSTEM_LINKTOREVENUE @ID, @PDACCOUNTSYSTEMID, @CURRENTDATE, @CHANGEAGENTID;
        end


        --Save the GL distributions
        if @POSTSTATUSCODE <> 2
        begin
          exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
          -- Priyanka - 125381 - save any benefit distributions
          exec dbo.USP_SAVE_PAYMENT_BENEFITGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
        end

        --Add Gift Fees
        exec dbo.USP_PAYMENT_ADDGIFTFEES @ID, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

        --Add VAT
        if @AMOUNTFORVAT > 0
          insert into dbo.REVENUEVAT(ID, AMOUNTTOTAX, VATTAXRATEID, VATAMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@ID, @AMOUNTFORVAT, @VATTAXRATEID, @VATAMOUNT, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

          -- Generate gift aid revenue split records
          exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, @TYPECODE, @SPLITSDECLININGGIFTAID, @COVENANTGIFTSPLITS, @ISGIFTAIDSPONSORSHIPSPLITS
        end
      else if @TYPECODE = 1  -- pledge
      begin

        declare @i int;
        declare @TYPICALAMOUNT money;
        declare @INSTALLMENTTABLE table(
          DATE datetime,
          AMOUNT money,
          RECEIPTAMOUNT money,
          SEQUENCE int
        );

        insert into dbo.REVENUE (ID,CONSTITUENTID,DATE,AMOUNT, TRANSACTIONTYPECODE, RECEIPTAMOUNT, FINDERNUMBER, SOURCECODE, APPEALID, GIVENANONYMOUSLY, DONOTACKNOWLEDGE, BATCHNUMBER, POSTDATE, DONOTPOST, DONOTRECEIPT, BENEFITSWAIVED, MAILINGID, CHANNELCODEID, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
          values (@ID,@CONSTITUENTID,@DATE, @AMOUNT, 1, 0, @FINDERNUMBER, @SOURCECODE, @APPEALID, @GIVENANONYMOUSLY, @DONOTACKNOWLEDGE, @BATCHNUMBER, @POSTDATE, @DONOTPOST, 1, @BENEFITSWAIVED, @MAILINGID, @CHANNELCODEID, @ORGANIZATIONCURRENCYID, @AMOUNT, null, @AMOUNT, @ORGANIZATIONCURRENCYID, null, @CHANGEAGENTID, @CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE);

        --Add origination source
        exec dbo.USP_REVENUE_ADDORIGIN @ID, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

        --Add pledge original amount
        exec dbo.USP_PLEDGE_ADDORIGINALAMOUNT @ID, null, @CHANGEAGENTID, @CURRENTDATE;

        exec dbo.USP_REVENUEREFERENCE_ADD @ID, @REFERENCE, @CHANGEAGENTID;

        if not @LETTERCODEID is null
        begin
          if @ACKNOWLEDGEEID is null
            set @ACKNOWLEDGEEID = @CONSTITUENTID;

          insert into dbo.REVENUELETTER
            (ID,REVENUEID,LETTERCODEID,ACKNOWLEDGEDATE,ACKNOWLEDGEEID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
          values
            (NewID(),@ID,@LETTERCODEID,@ACKNOWLEDGEDATE,@ACKNOWLEDGEEID,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE);
        end;

        insert into dbo.REVENUEPAYMENTMETHOD (REVENUEID, PAYMENTMETHODCODE, AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
          values (@ID,@PAYMENTMETHODCODE, @AMOUNT,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE)

        if @POSTSTATUSCODE = 0
          insert into dbo.REVENUEPOSTED(ID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
            values(@ID,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE);

        declare @PLEDGECREDITCARDID uniqueidentifier
        if @PAYMENTMETHODCODE = 2 -- Credit Card
        begin
          exec dbo.USP_CREDITCARD_SAVE @ID = @PLEDGECREDITCARDID output,
            @CREDITCARDTOKEN = @CREDITCARDTOKEN,
            @CARDHOLDERNAME = @CARDHOLDERNAME,
            @CREDITCARDPARTIALNUMBER = @CREDITCARDNUMBER,
            @CREDITTYPECODEID = @CREDITTYPECODEID,
            @EXPIRESON = @EXPIRESON,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @CURRENTDATE = @CURRENTDATE
        end

        insert into dbo.REVENUESCHEDULE (ID,STARTDATE,FREQUENCYCODE,NUMBEROFINSTALLMENTS,PLEDGESUBTYPEID,SENDPLEDGEREMINDER,CREDITCARDID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
          values (@ID, @INSTALLMENTSTARTDATE, @INSTALLMENTFREQUENCYCODE, @NUMBEROFINSTALLMENTS, @PLEDGESUBTYPEID, @SENDPLEDGEREMINDER, @PLEDGECREDITCARDID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

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

          set @SENDNEWINSTRUCTION = 0;
          set @NEWINSTRUCTIONTOSEND = 0;

          if not @DDISOURCECODEID is null
          begin
            set @SENDNEWINSTRUCTION = 1;
            set @NEWINSTRUCTIONTOSEND = 1;
          end

          insert into dbo.REVENUESCHEDULEDIRECTDEBITPAYMENT(ID, REFERENCEDATE, REFERENCENUMBER, CONSTITUENTACCOUNTID, DDISOURCECODEID, DDISOURCEDATE, SENDPMINSTRUCTION, PMINSTRUCTIONTOSENDCODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, DIRECTDEBITRESULTCODE)
            values (@ID, @REFERENCEDATE, @REFERENCENUMBER, @CONSTITUENTACCOUNTID, @DDISOURCECODEID, @DDISOURCEDATE, @SENDNEWINSTRUCTION, @NEWINSTRUCTIONTOSEND, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @DIRECTDEBITRESULTCODE);
        end

        if @PAYMENTMETHODCODE = 11 -- Standing Order
        begin
          insert into dbo.REVENUESCHEDULESTANDINGORDERPAYMENT(ID, REFERENCEDATE, REFERENCENUMBER, CONSTITUENTACCOUNTID, STANDINGORDERSETUP, STANDINGORDERSETUPDATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values (@ID, @REFERENCEDATE, @STANDINGORDERREFERENCENUMBER, @CONSTITUENTACCOUNTID, @STANDINGORDERSETUP, @STANDINGORDERSETUPDATE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

          insert into dbo.REVENUESTANDINGORDER(ID, CUSTOMREFERENCENUMBER, USESYSTEMGENERATEDREFERENCENUMBER, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@ID, @STANDINGORDERREFERENCENUMBER, @GENERATEREFERENCENUMBER, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);
        end

        declare @SPLITSDECLININGGIFTAIDPLEDGE xml
        exec dbo.USP_REVENUEBATCHCOMMIT_SPLITSWITHCHILDREN_ADDFROMXML @ID = @ID,
          @SPLITS = @SPLITS,
          @REVENUESPLITAPPLICATIONCODE = null,
          @REVENUESPLITTYPECODE = null,
          @OTHERTYPECODEID = null,
          @CATEGORYCODEID = @CATEGORYCODEID,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @CURRENTDATE = @CURRENTDATE,
          @OPPORTUNITYID = @OPPORTUNITYID,
          @ADDITIONALAPPLICATIONS = 0,
          @SPLITSDECLININGGIFTAID = @SPLITSDECLININGGIFTAIDPLEDGE output

        declare @COVENANTGIFTSPLITSPLEDGE xml
        if @ISCOVENANT = 1
        begin
          set @COVENANTGIFTSPLITSPLEDGE = (select
                                              REVENUESPLIT.ID as REVENUESPLITID
                                            from dbo.REVENUESPLIT
                                            where REVENUEID = @ID
                                            for xml raw('ITEM'),type,elements,root('COVENANTGIFTSPLITS'),BINARY BASE64)
        end

        -- Generate gift aid revenue split records
        exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS @ID, @APPEALID, @PAYMENTMETHODCODE, @CREDITTYPECODEID, @CHANGEAGENTID, @DATE, @TYPECODE, @SPLITSDECLININGGIFTAIDPLEDGE, @COVENANTGIFTSPLITSPLEDGE

        -- create installments for pledge
        set @i = 0;
        set @TYPICALAMOUNT = ROUND(@AMOUNT / @NUMBEROFINSTALLMENTS, 2);

        if @AMOUNT > 0
        begin
          if @AMOUNT - (@TYPICALAMOUNT * (@NUMBEROFINSTALLMENTS - 1)) < 0 
            set @TYPICALAMOUNT = @TYPICALAMOUNT - power(10, -2); 
        end

        if @INSTALLMENTFREQUENCYCODE <> 4
        begin
          while @i < @NUMBEROFINSTALLMENTS
          begin

            if @i = @NUMBEROFINSTALLMENTS - 1
              set @TYPICALAMOUNT = @AMOUNT - (@TYPICALAMOUNT * (@NUMBEROFINSTALLMENTS - 1));

            if @INSTALLMENTFREQUENCYCODE = 0
              insert into @INSTALLMENTTABLE values (dateadd(yy, @i, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
            else if @INSTALLMENTFREQUENCYCODE = 1
              insert into @INSTALLMENTTABLE values (dateadd(mm, @i * 6, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
            else if @INSTALLMENTFREQUENCYCODE = 2
              insert into @INSTALLMENTTABLE values (dateadd(qq, @i, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
            else if @INSTALLMENTFREQUENCYCODE = 3
              insert into @INSTALLMENTTABLE values (dateadd(mm, @i, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
            else if @INSTALLMENTFREQUENCYCODE = 5
              insert into @INSTALLMENTTABLE values (@INSTALLMENTSTARTDATE, @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);
            else if @INSTALLMENTFREQUENCYCODE = 7
              begin
                -- This is based on the algorithm for calculating semi-monthly dates found in RecurringGiftScheduleDataList.vb
                declare @NUMMONTHS int;
                declare @NEXTDATE datetime;

                set @NUMMONTHS = @i / 2;
                set @NEXTDATE = dateadd(mm,@NUMMONTHS,@INSTALLMENTSTARTDATE);

                if @i % 2 <> 0
                  begin
                    declare @NEXTDATE2 datetime;

                    if datepart(dd,@INSTALLMENTSTARTDATE) <= 15
                      begin

                        set @NEXTDATE2 = dateadd(dd,15,@NEXTDATE);

                        if datepart(mm,@NEXTDATE2) > datepart(mm,@NEXTDATE)
                          set @NEXTDATE2 = dbo.UFN_DATE_THISMONTH_LASTDAY(@NEXTDATE,0)

                        set @NEXTDATE = @NEXTDATE2;
                      end
                    else 
                      begin
                        if datepart(dd,@INSTALLMENTSTARTDATE) > 15
                          begin

                            set @NEXTDATE2 = dateadd(dd,15,@NEXTDATE);

                            if datepart(mm,@NEXTDATE2) = datepart(mm,@NEXTDATE) and datepart(dd,@NEXTDATE2) = 31
                              set @NEXTDATE2 = dateadd(dd,1,@NEXTDATE2);

                            set @NEXTDATE = @NEXTDATE2;

                          end
                        else
                          begin
                            set @NEXTDATE = dateadd(dd,15,@NEXTDATE);
                          end
                      end
                  end

                insert into @INSTALLMENTTABLE values (@NEXTDATE, @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);

              end
            else if @INSTALLMENTFREQUENCYCODE = 8
              insert into @INSTALLMENTTABLE values (dateadd(ww, @i * 2, @INSTALLMENTSTARTDATE), @TYPICALAMOUNT, @TYPICALAMOUNT, @i + 1);

            set @i = @i + 1;
          end

          declare @TOTALRECEIPTAMOUNT money = @AMOUNT - @TOTALBENEFITAMOUNT
          set @i = @NUMBEROFINSTALLMENTS

          -- calculate receipt amount for pledge
          while @i > 0
          begin
            declare @INSTALLMENTAMOUNT money
            select @INSTALLMENTAMOUNT = AMOUNT
            from @INSTALLMENTTABLE
            where SEQUENCE = @i

            if @TOTALRECEIPTAMOUNT > @INSTALLMENTAMOUNT
            begin
              update @INSTALLMENTTABLE
              set RECEIPTAMOUNT = @INSTALLMENTAMOUNT
              where SEQUENCE = @i
            end
            else
            begin
              update @INSTALLMENTTABLE
              set RECEIPTAMOUNT = @TOTALRECEIPTAMOUNT
              where SEQUENCE = @i
            end

            set @TOTALRECEIPTAMOUNT = @TOTALRECEIPTAMOUNT - @INSTALLMENTAMOUNT
            if @TOTALRECEIPTAMOUNT < 0
              set @TOTALRECEIPTAMOUNT = 0

            set @i = @i - 1
          end

          set @INSTALLMENTS = (select DATE, AMOUNT, RECEIPTAMOUNT, SEQUENCE
                                from @INSTALLMENTTABLE
                                for xml raw ('ITEM'), type, elements, root ('INSTALLMENTS'), binary base64
                              );
        end

        --Multicurrency - Process the installments xml to calculate the base and organization amounts and place them in proper nodes.
        set @INSTALLMENTS = dbo.UFN_INSTALLMENT_CONVERTAMOUNTSINXML(@INSTALLMENTS,@ORGANIZATIONCURRENCYID,null,@ORGANIZATIONCURRENCYID,null);

        -- Installments should never be null.  If they are, there is an error.
        exec dbo.USP_INSTALLMENT_GETINSTALLMENTS_2_ADDFROMXML @ID, @INSTALLMENTS, @CHANGEAGENTID, @CURRENTDATE;
        exec dbo.USP_PLEDGE_GENERATEINSTALLMENTSPLITS @ID, @CHANGEAGENTID, @CURRENTDATE;


        if @PAYMENTMETHODCODE = 3 and @DDISOURCECODEID is not null and dbo.UFN_PAPERLESSMANDATES_DAYSADVANCEDNOTICE_FORREVENUE(@ID) = -1
        begin
          raiserror('BBERR_MULTIPLE_PAPERLESSMANDATECONFIGS', 13, 1);
          return 1;
        end

        -- create payment for pledge
        if not @PAYMENTFORPLEDGEAMOUNT = 0
        begin
          declare @PAYMENTFORPLEDGE_REVSTREAMS xml;
          set @PAYMENTFORPLEDGE_REVSTREAMS = 
          (
            select
            @ID as 'APPLICATIONID',
            @PAYMENTFORPLEDGEAMOUNT as 'APPLIED',
            2 as 'APPLICATIONCODE'
            for xml raw('ITEM'), type, elements, root('REVENUESTREAMS'), binary base64
          );

          declare @PAYMENTFORPLEDGE_REVENUEID uniqueidentifier;
          exec dbo.USP_PAYMENT_ADD 
            @ID = @PAYMENTFORPLEDGE_REVENUEID output
            @CHANGEAGENTID = @CHANGEAGENTID
            @CURRENTDATE = @CURRENTDATE
            @CONSTITUENTID = @CONSTITUENTID
            @DATE = @DATE
            @AMOUNT=@PAYMENTFORPLEDGEAMOUNT,
            @POSTDATE = @DATE,
            @REVENUESTREAMS = @PAYMENTFORPLEDGE_REVSTREAMS,
            @FINDERNUMBER = @FINDERNUMBER,
            @SOURCECODE = @SOURCECODE,
            @BATCHNUMBER = @BATCHNUMBER,
            @RECEIPTAMOUNT = @PAYMENTFORPLEDGEAMOUNT;

        end

        if not @SOLICITORS is null
          exec dbo.USP_REVENUEBATCH_ADDSOLICITORS @ID, @SOLICITORS, @CHANGEAGENTID, @CURRENTDATE;

        if not @RECOGNITIONS is null and not @GIVENANONYMOUSLY = 1
          exec dbo.USP_REVENUEBATCH_ADDRECOGNITIONS @ID, @RECOGNITIONS, @CHANGEAGENTID, @CURRENTDATE;

        --Update the organization total value, transaction total value, and exchange rates in the @TOTALBENEFITS XML.
        set @TOTALBENEFITS = dbo.UFN_REVENUEBENEFIT_CONVERTAMOUNTSINXML(@TOTALBENEFITS,@ORGANIZATIONCURRENCYID);
        exec dbo.USP_REVENUE_GETBENEFITS_3_ADDFROMXML @ID, @TOTALBENEFITS, @CHANGEAGENTID, @CURRENTDATE;

        if not @TRIBUTES is null
        begin
          exec dbo.USP_REVENUE_GETTRIBUTES_UPDATEFROMXML @ID, @TRIBUTES, @CHANGEAGENTID, @CURRENTDATE;

          -- 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 = @ID;
        end

        if (@NOTETITLE <> '') or (not @NOTEAUTHORID is null) or (not @NOTEDATEENTERED is null) or (not @NOTETYPECODEID is null) or (not @NOTETEXTNOTE = ''
          insert into dbo.REVENUENOTE(DATEENTERED, TITLE, AUTHORID, TEXTNOTE, REVENUENOTETYPECODEID, REVENUEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@NOTEDATEENTERED, @NOTETITLE, @NOTEAUTHORID, @NOTETEXTNOTE, @NOTETYPECODEID, @ID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE)

        --Save the GL distributions
        if @POSTSTATUSCODE <> 2
                begin
          exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID, @CHANGEAGENTID, @CURRENTDATE;
          -- Priyanka - 125381 - save any benefit distributions
            if (dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('0E85C527-E6E9-4C5F-A8E8-105FD0E18FE7') = 1)  
            exec USP_SAVE_BENEFITGLDISTRIBUTION_FINANCIALTRANSACTION @ID, @CHANGEAGENTID, @CURRENTDATE
        end

        --Add VAT
        if @AMOUNTFORVAT > 0
          insert into dbo.REVENUEVAT(ID, AMOUNTTOTAX, VATTAXRATEID, VATAMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@ID, @AMOUNTFORVAT, @VATTAXRATEID, @VATAMOUNT, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);
      end

      else if @TYPECODE = 3  -- recurring gift
      begin
        insert into dbo.REVENUE (ID, CONSTITUENTID, DATE, AMOUNT, TRANSACTIONTYPECODE, RECEIPTAMOUNT, FINDERNUMBER, SOURCECODE, APPEALID, GIVENANONYMOUSLY, DONOTACKNOWLEDGE, BATCHNUMBER, POSTDATE, DONOTPOST, BENEFITSWAIVED, MAILINGID, CHANNELCODEID, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
          values (@ID, @CONSTITUENTID, @DATE, @AMOUNT, 2, @AMOUNT, @FINDERNUMBER, @SOURCECODE, @APPEALID, @GIVENANONYMOUSLY, @DONOTACKNOWLEDGE, @BATCHNUMBER, @POSTDATE, @DONOTPOST, @BENEFITSWAIVED, @MAILINGID, @CHANNELCODEID, @ORGANIZATIONCURRENCYID, @AMOUNT, null, @AMOUNT, @ORGANIZATIONCURRENCYID, null, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

        --Add origination source
        exec dbo.USP_REVENUE_ADDORIGIN @ID, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

        exec dbo.USP_REVENUEREFERENCE_ADD @ID, @REFERENCE, @CHANGEAGENTID;

        if not @LETTERCODEID is null
        begin
          if @ACKNOWLEDGEEID is null
            set @ACKNOWLEDGEEID = @CONSTITUENTID;

          insert into dbo.REVENUELETTER
            (ID,REVENUEID,LETTERCODEID,ACKNOWLEDGEDATE,ACKNOWLEDGEEID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
          values
            (NewID(),@ID,@LETTERCODEID,@ACKNOWLEDGEDATE,@ACKNOWLEDGEEID,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE);
        end;

        insert into dbo.REVENUEPAYMENTMETHOD (REVENUEID, PAYMENTMETHODCODE, AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
          values (@ID,@PAYMENTMETHODCODE, @AMOUNT,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE)

        if @POSTSTATUSCODE = 0
          insert into dbo.REVENUEPOSTED(ID,ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
            values(@ID,@CHANGEAGENTID,@CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE);

        declare @SPLITSDECLININGGIFTAIDRECURRINGGIFT xml
        exec dbo.USP_REVENUEBATCHCOMMIT_SPLITSWITHCHILDREN_ADDFROMXML @ID = @ID,
          @SPLITS = @SPLITS,
          @REVENUESPLITAPPLICATIONCODE = null,
          @REVENUESPLITTYPECODE = null,
          @OTHERTYPECODEID = null,
          @CATEGORYCODEID = @CATEGORYCODEID,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @CURRENTDATE = @CURRENTDATE,
          @OPPORTUNITYID = null,
          @ADDITIONALAPPLICATIONS = 0,
          @SPLITSDECLININGGIFTAID = @SPLITSDECLININGGIFTAIDRECURRINGGIFT output

        -- Generate gift aid revenue split records
        exec dbo.USP_GIFTAIDREVENUESPLIT_ADDUPDATESPLITS 
          @ID
          @APPEALID
          @PAYMENTMETHODCODE
          @CREDITTYPECODEID
          @CHANGEAGENTID
          @DATE
          2, -- 2 is the actual transaction type code for recurring gifts
          @SPLITSDECLININGGIFTAIDRECURRINGGIFT



        declare @RECURRINGGIFTCREDITCARDID uniqueidentifier
        if @PAYMENTMETHODCODE = 2 -- Credit Card
        begin
          exec dbo.USP_CREDITCARD_SAVE @ID = @RECURRINGGIFTCREDITCARDID output,
            @CREDITCARDTOKEN = @CREDITCARDTOKEN,
            @CARDHOLDERNAME = @CARDHOLDERNAME,
            @CREDITCARDPARTIALNUMBER = @CREDITCARDNUMBER,
            @CREDITTYPECODEID = @CREDITTYPECODEID,
            @EXPIRESON = @EXPIRESON,
            @CHANGEAGENTID = @CHANGEAGENTID,
            @CURRENTDATE = @CURRENTDATE
        end

        insert into dbo.REVENUESCHEDULE (ID, SENDPLEDGEREMINDER, STARTDATE, ENDDATE, FREQUENCYCODE, NEXTTRANSACTIONDATE, CREDITCARDID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
          values (@ID, @SENDPLEDGEREMINDER, @INSTALLMENTSTARTDATE, @INSTALLMENTENDDATE, @INSTALLMENTFREQUENCYCODE, @NEXTTRANSACTIONDATE, @RECURRINGGIFTCREDITCARDID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

        -- add first installment
        insert into dbo.RECURRINGGIFTINSTALLMENT (ID, REVENUEID, AMOUNT, DATE, BASECURRENCYID, ORGANIZATIONAMOUNT, ORGANIZATIONEXCHANGERATEID, TRANSACTIONAMOUNT, TRANSACTIONCURRENCYID, BASEEXCHANGERATEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
        values (newid(), @ID, @AMOUNT, @NEXTTRANSACTIONDATE, @ORGANIZATIONCURRENCYID, @AMOUNT, null, @AMOUNT, @ORGANIZATIONCURRENCYID, null, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

        -- add any additional installments to get us current
        exec dbo.USP_RECURRINGGIFT_ADDMISSINGINSTALLMENTS
          @ID,
          @CHANGEAGENTID,
          @CURRENTDATE,
          @AMOUNT

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

          set @SENDNEWINSTRUCTION = 0;
          set @NEWINSTRUCTIONTOSEND = 0;

          if not @DDISOURCECODEID is null
          begin
            set @SENDNEWINSTRUCTION = 1;
            set @NEWINSTRUCTIONTOSEND = 1;
          end


          if @PAYMENTMETHODCODE = 3 and @DDISOURCECODEID is not null and dbo.UFN_PAPERLESSMANDATES_DAYSADVANCEDNOTICE_FORREVENUE(@ID) = -1
          begin
            raiserror('BBERR_MULTIPLE_PAPERLESSMANDATECONFIGS', 13, 1);
            return 1;
          end

          insert into dbo.REVENUESCHEDULEDIRECTDEBITPAYMENT(ID, REFERENCEDATE, REFERENCENUMBER, CONSTITUENTACCOUNTID, DDISOURCECODEID, DDISOURCEDATE, SENDPMINSTRUCTION, PMINSTRUCTIONTOSENDCODE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, DIRECTDEBITRESULTCODE)
            values (@ID, @REFERENCEDATE, @REFERENCENUMBER, @CONSTITUENTACCOUNTID, @DDISOURCECODEID, @DDISOURCEDATE, @SENDNEWINSTRUCTION, @NEWINSTRUCTIONTOSEND, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @DIRECTDEBITRESULTCODE);
        end

        if @PAYMENTMETHODCODE = 11 -- Standing Order
        begin
          insert into dbo.REVENUESCHEDULESTANDINGORDERPAYMENT(ID, REFERENCEDATE, REFERENCENUMBER, CONSTITUENTACCOUNTID, STANDINGORDERSETUP, STANDINGORDERSETUPDATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values (@ID, @REFERENCEDATE, @STANDINGORDERREFERENCENUMBER, @CONSTITUENTACCOUNTID, @STANDINGORDERSETUP, @STANDINGORDERSETUPDATE, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

          insert into dbo.REVENUESTANDINGORDER(ID, CUSTOMREFERENCENUMBER, USESYSTEMGENERATEDREFERENCENUMBER, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@ID, @STANDINGORDERREFERENCENUMBER, @GENERATEREFERENCENUMBER, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);
        end

        if not @SOLICITORS is null
          exec dbo.USP_REVENUEBATCH_ADDSOLICITORS @ID, @SOLICITORS, @CHANGEAGENTID, @CURRENTDATE;

        if not @RECOGNITIONS is null and not @GIVENANONYMOUSLY = 1
          exec dbo.USP_REVENUEBATCH_ADDRECOGNITIONS @ID, @RECOGNITIONS, @CHANGEAGENTID, @CURRENTDATE;

        --Update the organization total value, transaction total value, and exchange rates in the @TOTALBENEFITS XML.
        set @TOTALBENEFITS = dbo.UFN_REVENUEBENEFIT_CONVERTAMOUNTSINXML(@TOTALBENEFITS,@ORGANIZATIONCURRENCYID);
        exec dbo.USP_REVENUE_GETBENEFITS_3_ADDFROMXML @ID, @TOTALBENEFITS, @CHANGEAGENTID, @CURRENTDATE;

        if (@NOTETITLE <> '') or (not @NOTEAUTHORID is null) or (not @NOTEDATEENTERED is null) or (not @NOTETYPECODEID is null) or (not @NOTETEXTNOTE = ''
          insert into dbo.REVENUENOTE(DATEENTERED, TITLE, AUTHORID, TEXTNOTE, REVENUENOTETYPECODEID, REVENUEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@NOTEDATEENTERED, @NOTETITLE, @NOTEAUTHORID, @NOTETEXTNOTE, @NOTETYPECODEID, @ID, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE)

        if @AMOUNTFORVAT > 0
          insert into dbo.REVENUEVAT(ID, AMOUNTTOTAX, VATTAXRATEID, VATAMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
            values(@ID, @AMOUNTFORVAT, @VATTAXRATEID, @VATAMOUNT, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);
      end

      -- Tax declarations can be added for all transaction types
      if @TAXDECLARATIONS is not null
      begin
        -- Make sure the constituent is an individual
        if exists (select 1 from dbo.CONSTITUENT where ID = @CONSTITUENTID and ISORGANIZATION = 0 and ISGROUP = 0)
        begin
          insert into dbo.TAXDECLARATION
          (
            CONSTITUENTID,
            DECLARATIONINDICATORCODE, 
            DECLARATIONMADE, 
            DECLARATIONSTARTS, 
            DECLARATIONENDS, 
            CHARITYCLAIMREFERENCENUMBERID, 
            PAYSTAXCODE,
            DECLARATIONSOURCECODEID,
            ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
          )
   select
            @CONSTITUENTID,
            DECLARATIONINDICATORCODE, 
            DECLARATIONMADE, 
            DECLARATIONSTARTS, 
            DECLARATIONENDS, 
            CHARITYCLAIMREFERENCENUMBERID, 
            PAYSTAXCODE,
            DECLARATIONSOURCECODEID,
            @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
          from dbo.UFN_REVENUEBATCH_GETTAXDECLARATIONS_FROMITEMLISTXML(@TAXDECLARATIONS)

          -- Only update tribute gift aid amounts if there is a Yes declaration since this is the only
          -- state that will affect gift aid eligibility
          if exists (select 1 from dbo.UFN_CONSTITUENTBATCH_GETTAXDECLARATIONS_FROMITEMLISTXML(@TAXDECLARATIONS) where PAYSTAXCODE = 1)
            exec dbo.USP_REVENUETRIBUTETAXCLAIMAMOUNT_ADDUPDATEBYCONSTITUENT @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;
        end
      end

      --Only create the records if this is a UK product and there were tributes included in this batch
      if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1 and @TRIBUTES is not null
        exec dbo.USP_REVENUETRIBUTETAXCLAIMAMOUNT_ADDUPDATE @ID, @CHANGEAGENTID, @CURRENTDATE;

    end
  end try

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

  return 0;