USP_DATAFORMTEMPLATE_ADD_REVENUEBATCHROW

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

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@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 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
@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
@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
@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
@STANDINGORDERREFERENCEDATE UDT_FUZZYDATE IN Standing order reference date
@STANDINGORDERREFERENCENUMBER nvarchar(18) 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
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@PERCENTAGEBENEFITS xml IN Percent benefits
@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
@VENDORID nvarchar(50) IN

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_REVENUEBATCHROW
(
  @ID uniqueidentifier = null output,
  @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) = '',
  @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,
  @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,
  @MGRELATIONSHIPID uniqueidentifier = null,
  @OTHERPAYMENTMETHODCODEID uniqueidentifier = null,
  @LETTERCODEID uniqueidentifier = null,
  @ACKNOWLEDGEDATE datetime = null,
  @REFERENCE 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) = 0,
  @HIGHPRICE decimal(19,4) = 0,
  @NUMBEROFUNITSSOLD decimal(20,3) = 0,
  @USERMODIFIEDNUMBEROFUNITSSOLD bit = 0,
  @CREDITCARDTOKEN uniqueidentifier = null,
  @REJECTIONMESSAGE nvarchar(250) = '',
  @PARTIALCREDITCARDNUMBER nvarchar(4) = '',
  @STANDINGORDERCONSTITUENTACCOUNTID uniqueidentifier = null,
  @STANDINGORDERREFERENCEDATE dbo.UDT_FUZZYDATE = '00000000',
  @STANDINGORDERREFERENCENUMBER nvarchar(18) = '',
  @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,
  @CURRENTAPPUSERID uniqueidentifier = null,
  @PERCENTAGEBENEFITS xml = null,
  @ISGIFTAIDSPONSORSHIP bit = null,
  @GENERATEREFERENCENUMBER bit = 1,
  @SOURCECODEIMPORT nvarchar(60) = '',
  @MERCHANTACCOUNTID uniqueidentifier = null,
  @VENDORID nvarchar(50) = ''

as

begin
  set nocount on;

  declare @CURRENTDATE datetime;

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

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

  set @CURRENTDATE = GetDate();

  if isnull(@SOURCECODE, '') = ''
    set @SOURCECODE = @SOURCECODEIMPORT;

  begin try
    if @PAYMENTMETHODCODE = 11 --Standing order
    begin
      set @CONSTITUENTACCOUNTID = @STANDINGORDERCONSTITUENTACCOUNTID;
      --if @CONSTITUENTACCOUNTID is null
      --begin
        --raiserror('Standing order account must be specified for standing order payments', 13, 1)
      --end
      set @REFERENCEDATE = @STANDINGORDERREFERENCEDATE;
      if @GENERATEREFERENCENUMBER is null or @GENERATEREFERENCENUMBER = 1
        select 
          @STANDINGORDERREFERENCENUMBER = '',
          @GENERATEREFERENCENUMBER = 1
    end

    --JamesWill CR269707-031107 2007/03/19 Set default values for any non-nullable fields that might come in as null
    if @DONOTACKNOWLEDGE is null
      set @DONOTACKNOWLEDGE = 0;
    if @CHECKDATE is null
      set @CHECKDATE = '00000000';
    if @CHECKNUMBER is null
      set @CHECKNUMBER = '';
    if @REFERENCEDATE is null
      set @REFERENCEDATE = '00000000';
    if @REFERENCENUMBER is null
      set @REFERENCENUMBER = '';
    if @CARDHOLDERNAME is null
      set @CARDHOLDERNAME = '';
    if @CREDITCARDNUMBER is null
      set @CREDITCARDNUMBER = '';
    if @AUTHORIZATIONCODE is null
      set @AUTHORIZATIONCODE = '';
    if @EXPIRESON is null
      set @EXPIRESON = '00000000';
    if @ISSUER is null
      set @ISSUER = '';
    if @NUMBEROFUNITS is null
      set @NUMBEROFUNITS = 0;
    if @NUMBEROFUNITSSOLD is null
      set @NUMBEROFUNITSSOLD = 0;

    if @NUMBEROFUNITSSOLD > 0 and @NUMBEROFUNITS <> @NUMBEROFUNITSSOLD
      set @USERMODIFIEDNUMBEROFUNITSSOLD = 1

    if @SYMBOL is null
      set @SYMBOL = '';
    if @MEDIANPRICE is null
      set @MEDIANPRICE = 0;
    if @LOWPRICE is null
      set @LOWPRICE = 0;
    if @HIGHPRICE is null
      set @HIGHPRICE = 0;
    if @RECEIPTAMOUNT is null
      set @RECEIPTAMOUNT = 0;

    declare @DEFAULTRECEIPTAMOUNT money
    if @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);

      set @DEFAULTRECEIPTAMOUNT = @AMOUNT - @BENEFITAMOUNT;
    end
    else
      set @DEFAULTRECEIPTAMOUNT = @AMOUNT

    -- Check if the user has modified the receipt amount
    if @RECEIPTAMOUNT > 0 and @RECEIPTAMOUNT <> @DEFAULTRECEIPTAMOUNT
      set @USERMODIFIEDRECEIPTAMOUNT = 1

    if @DONOTRECEIPT is null
      set @DONOTRECEIPT = 0;
    if @NUMBEROFINSTALLMENTS is null
      set @NUMBEROFINSTALLMENTS = 1;
    if @SOURCECODE is null
      set @SOURCECODE = '';
    if @FINDERNUMBERISVALID is null
      set @FINDERNUMBERISVALID = 0;
    if @USERMODIFIEDBENEFITS is null
      set @USERMODIFIEDBENEFITS = 0;
    if @BENEFITSWAIVED is null
      set @BENEFITSWAIVED = 0;
    if @SENDPLEDGEREMINDER is null
      set @SENDPLEDGEREMINDER = 1;
    if @SALEAMOUNT is null
      set @SALEAMOUNT = 0;
    if @BROKERFEE is null
      set @BROKERFEE = 0;
    if @NOTETITLE is null 
      set @NOTETITLE = '';
    if @NOTETEXTNOTE is null
      set @NOTETEXTNOTE = '';
    if @MGAMOUNT is null
      set @MGAMOUNT = 0;
    if @MGPOSTSTATUSCODE is null
      set @MGPOSTSTATUSCODE = 1;
    if @GIVENANONYMOUSLY is null
      set @GIVENANONYMOUSLY = 0;
    if @USERMODIFIEDRECEIPTAMOUNT is null
      set @USERMODIFIEDRECEIPTAMOUNT = 0;
    if @DIDRECOGNITIONSDEFAULT is null
      set @DIDRECOGNITIONSDEFAULT = 0;
    if @REFERENCE is null
      set @REFERENCE = '';
    if @STANDINGORDERREFERENCEDATE is null
      set @REFERENCEDATE = '00000000';
    if @STANDINGORDERSETUP is null
      set @STANDINGORDERSETUP = 0;
    if @STANDINGORDERREFERENCENUMBER is null
      set @STANDINGORDERREFERENCENUMBER = '';
    if @AMOUNTFORVAT is null
      set @AMOUNTFORVAT = 0;
    if @VATAMOUNT is null
      set @VATAMOUNT = 0;

    --if @AMOUNT < 0 
    --  raiserror('The amount cannot be negative.', 13, 1) 

    if @FINDERNUMBER is null
      set @FINDERNUMBER = 0;

    /* JamesWill CR267402-021907 INSTALLMENTFREQUENCYCODE cannot be null in the database, but it can be null in the defaults */
    if @INSTALLMENTFREQUENCYCODE is null
    begin
      -- For Recurring Gifts, default to Monthly.  For other types, use Single Installment.
      if @TYPECODE = 3
        set @INSTALLMENTFREQUENCYCODE = 3;
      else
        set @INSTALLMENTFREQUENCYCODE = 5;
    end

    /* JamesWill CR265838-020507 2007/03/07 */
    if @POSTSTATUSCODE is null
      set @POSTSTATUSCODE = 255;
    if @SALEPOSTSTATUSCODE is null
      set @SALEPOSTSTATUSCODE = 255;

    if cast(@SPLITS as nvarchar(max)) = '' 
    begin
      set @SPLITS = null;
    end
    else
    begin
      if not exists
          select 1 
          from @SPLITS.nodes('/SPLITS/ITEM') T(c)
        )
        set @SPLITS = null;
    end

    if not @SPLITS is null
      set @SINGLEDESIGNATIONID = null;

    if @TYPECODE = 1 or @TYPECODE = 3 --Pledges and Recurring gifts do not receipt
      set @DONOTRECEIPT = 1;

    if @PAYMENTMETHODCODE is null
      set @PAYMENTMETHODCODE = 255;

    if @APPLICATIONCODE is null
      set @APPLICATIONCODE = 255;

    --JamesWill CR275664-052107 2007/05/24 Matching gifts claims are never posted
    set @MGPOSTDATE = null;
    set @MGPOSTSTATUSCODE = 2;

    if @RECEIPTTYPECODE is null
      set @RECEIPTTYPECODE = 255

    if @CONSTITUENTID is null 
      select @CONSTITUENTID = @CONSTITUENTLOOKUPID;

    if @NEWCONSTITUENT is not null 
      begin
        declare @NEWCONSTITUENTID uniqueidentifier;
        if not exists(select ID from dbo.CONSTITUENT where ID = @CONSTITUENTID)
          begin
            exec USP_REVENUEBATCH_ADDNEWCONSTITUENTFROMXML @NEWCONSTITUENT, @CHANGEAGENTID, @NEWCONSTITUENTID output;
            set @CONSTITUENTID = @NEWCONSTITUENTID;
          end;
      end;


    /* Lookup and set all possible marketing data (via output params) from the data that was specified. */
    declare @LOOKUPSINGLEDESIGNATION bit = (case when @SINGLEDESIGNATIONID is null and @SPLITS is null and @REVENUESTREAMS is null then 1 else 0 end);
    exec dbo.[USP_REVENUEBATCH_GETMARKETINGDATA]
      @FINDERNUMBER = @FINDERNUMBER,
      @LOOKUPSINGLEDESIGNATION = @LOOKUPSINGLEDESIGNATION,
      @CHANGEAGENTID = @CHANGEAGENTID,
      @CURRENTAPPUSERID = @CURRENTAPPUSERID,
      @SOURCECODE = @SOURCECODE output,
      @MAILINGID = @MAILINGID output,
      @APPEALID = @APPEALID output,
      @CONSTITUENTID = @CONSTITUENTID output,
      @FINDERNUMBERISVALID = @FINDERNUMBERISVALID output,
      @SINGLEDESIGNATIONID = @SINGLEDESIGNATIONID output,
      @BATCHID = @BATCHID;


    -- Use the partial card number if set.  This field is used for import
    -- and doesn't have any CC processing code run for it.
    if coalesce(@PARTIALCREDITCARDNUMBER, '') <> ''
      set @CREDITCARDNUMBER = @PARTIALCREDITCARDNUMBER

    -- Validate that if one credit card field is entered, the required fields are set.
    -- Server code should generally have validated this already unless the code is being
    -- added through import.

    if @PAYMENTMETHODCODE = 2     
      begin
        if len(coalesce(@CREDITCARDNUMBER, '')) >4
        begin                  
          if coalesce(@CARDHOLDERNAME, '') = ''
            raiserror('BBERR_CARDHOLDERREQUIRED', 13, 1)

          if coalesce(@EXPIRESON, '00000000') = '00000000'
            raiserror('BBERR_EXPIRESONREQUIRED', 13, 1)
        end
      end                  

    declare @CREDITCARDID uniqueidentifier
    if @PAYMENTMETHODCODE = 2 
    begin                      
      exec dbo.USP_CREDITCARD_SAVE
          @ID = @CREDITCARDID output,
          @CREDITCARDTOKEN = @CREDITCARDTOKEN,
          @CARDHOLDERNAME = @CARDHOLDERNAME,
          @CREDITCARDPARTIALNUMBER = @CREDITCARDNUMBER,
          @CREDITTYPECODEID = @CREDITTYPECODEID,
          @EXPIRESON = @EXPIRESON,
          @CHANGEAGENTID = @CHANGEAGENTID,
          @CURRENTDATE = @CURRENTDATE,
          @ISTRANSIENT = @ISTRANSIENTCARD
    end 

    --Even though Revenue Batch doesn't do multicurrency, we'll set the currency IDs to avoid triggering the trigger that would set them.
    declare @ORGANIZATIONCURRENCID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()

    insert into dbo.BATCHREVENUE (
      ID,BATCHID,CONSTITUENTID,DATE,PAYMENTMETHODCODE,DONOTACKNOWLEDGE,CHECKDATE,CHECKNUMBER,REFERENCEDATE,REFERENCENUMBER, 
      CREDITCARDID, AUTHORIZATIONCODE, CONSTITUENTACCOUNTID, AMOUNT, TYPECODE, RECEIPTAMOUNT, 
      DONOTRECEIPT, SEQUENCE, APPLYTOSHOWNFORCONSTITUENTID, INSTALLMENTFREQUENCYCODE, INSTALLMENTSTARTDATE, 
      INSTALLMENTENDDATE, NUMBEROFINSTALLMENTS, FINDERNUMBER, SOURCECODE, APPEALID, FINDERNUMBERISVALID, 
      USERMODIFIEDBENEFITS, BENEFITSWAIVED, POSTDATE, POSTSTATUSCODE, PROPERTYSUBTYPECODEID, GIFTINKINDSUBTYPECODEID, 
      SENDPLEDGEREMINDER, SALEDATE, SALEAMOUNT, BROKERFEE, SALEPOSTSTATUSCODE, SALEPOSTDATE, ISSUER, NUMBEROFUNITS, 
      SYMBOL, MEDIANPRICE, NOTETITLE, NOTEAUTHORID, NOTEDATEENTERED, NOTETYPECODEID, NOTETEXTNOTE, 
      MGMATCHINGCONSTITUENTID, MGDATE, MGAMOUNT, MGPOSTDATE, MGPOSTSTATUSCODE, MGCONDITIONID,
      GIVENANONYMOUSLY, GIVENANONYMOUSLYDEFAULTEDFORCONSTITUENTID, USERMODIFIEDRECEIPTAMOUNT, PLEDGESUBTYPEID,
      REJECTIONMESSAGE, MAILINGID, CHANNELCODEID, PAYMENTFORPLEDGEAMOUNT, RECEIPTTYPECODE, 
      ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED,MGRELATIONSHIPID,OTHERPAYMENTMETHODCODEID, LETTERCODEID, ACKNOWLEDGEDATE, REFERENCE, 
      GLREVENUECATEGORYMAPPINGID, ACKNOWLEDGEEID, APPLICATIONCODE, OTHERTYPECODEID,OPPORTUNITYID, DIRECTDEBITRESULTCODE, LOWPRICE, HIGHPRICE, NUMBEROFUNITSSOLD,
      USERMODIFIEDNUMBEROFUNITSSOLD, STANDINGORDERSETUP, STANDINGORDERSETUPDATE, TRANSACTIONID, DECLINESGIFTAID, DDISOURCECODEID, DDISOURCEDATE, ISCOVENANT,
      AMOUNTFORVAT, VATTAXRATEID, VATAMOUNT, ISGIFTAIDSPONSORSHIP, TRANSACTIONCURRENCYID, BASECURRENCYID, 
      USESYSTEMGENERATEDREFERENCENUMBER, STANDINGORDERREFERENCENUMBER, MERCHANTACCOUNTID,VENDORID
      )
      values (
      @ID,@BATCHID,@CONSTITUENTID,@DATE,@PAYMENTMETHODCODE,@DONOTACKNOWLEDGE,@CHECKDATE,@CHECKNUMBER,@REFERENCEDATE,@REFERENCENUMBER,
      @CREDITCARDID, @AUTHORIZATIONCODE, @CONSTITUENTACCOUNTID, @AMOUNT, @TYPECODE, @RECEIPTAMOUNT
      @DONOTRECEIPT,@SEQUENCE,@APPLYTOSHOWNFORCONSTITUENTID, @INSTALLMENTFREQUENCYCODE, @INSTALLMENTSTARTDATE
      @INSTALLMENTENDDATE, @NUMBEROFINSTALLMENTS, @FINDERNUMBER, @SOURCECODE, @APPEALID, @FINDERNUMBERISVALID
      @USERMODIFIEDBENEFITS, @BENEFITSWAIVED, @POSTDATE, @POSTSTATUSCODE, @PROPERTYSUBTYPECODEID, @GIFTINKINDSUBTYPECODEID
      @SENDPLEDGEREMINDER, @SALEDATE, @SALEAMOUNT, @BROKERFEE, @SALEPOSTSTATUSCODE, @SALEPOSTDATE, @ISSUER, @NUMBEROFUNITS
      @SYMBOL, @MEDIANPRICE, @NOTETITLE, @NOTEAUTHORID, @NOTEDATEENTERED, @NOTETYPECODEID, @NOTETEXTNOTE
      @MGMATCHINGCONSTITUENTID, @MGDATE, @MGAMOUNT, @MGPOSTDATE, @MGPOSTSTATUSCODE, @MGCONDITIONID,
      @GIVENANONYMOUSLY, @GIVENANONYMOUSLYDEFAULTEDFORCONSTITUENTID, @USERMODIFIEDRECEIPTAMOUNT, @PLEDGESUBTYPEID
      @REJECTIONMESSAGE, @MAILINGID, @CHANNELCODEID, @PAYMENTFORPLEDGEAMOUNT, @RECEIPTTYPECODE
      @CHANGEAGENTID, @CHANGEAGENTID,@CURRENTDATE,@CURRENTDATE,@MGRELATIONSHIPID,@OTHERPAYMENTMETHODCODEID,@LETTERCODEID,@ACKNOWLEDGEDATE,@REFERENCE,
      @CATEGORYCODEID, @ACKNOWLEDGEEID, @APPLICATIONCODE, @OTHERTYPECODEID, @OPPORTUNITYID, @DIRECTDEBITRESULTCODE, @LOWPRICE, @HIGHPRICE, @NUMBEROFUNITSSOLD,
      @USERMODIFIEDNUMBEROFUNITSSOLD, @STANDINGORDERSETUP, @STANDINGORDERSETUPDATE, @TRANSACTIONID, coalesce(@DECLINESGIFTAID, 0), @DDISOURCECODEID, @DDISOURCEDATE
      coalesce(@ISCOVENANT, 0), @AMOUNTFORVAT, @VATTAXRATEID, @VATAMOUNT, coalesce(@ISGIFTAIDSPONSORSHIP, 0), @ORGANIZATIONCURRENCID,@ORGANIZATIONCURRENCID
      @GENERATEREFERENCENUMBER, @STANDINGORDERREFERENCENUMBER, @MERCHANTACCOUNTID,isnull(@VENDORID, '')
      );

    -- Create the splits collection with the single designation if the splits collection is null and the designation isn't
    if @SPLITS is null and @SINGLEDESIGNATIONID is not null
    begin
      set @SPLITS = ( select
                        @SINGLEDESIGNATIONID as DESIGNATIONID,
                        @AMOUNT as AMOUNT,
                        1 as SEQUENCE,
                        @DECLINESGIFTAID as DECLINESGIFTAID,
                        @ISGIFTAIDSPONSORSHIP as ISGIFTAIDSPONSORSHIP
                      for xml raw('ITEM'),type,elements,root('SPLITS'),binary base64)
    end

    if @SPLITS is not null
    begin
      exec dbo.USP_REVENUEBATCH_SPLITSWITHCHILDREN_UPDATEFROMXML @ID, @SPLITS, @DATE, @CHANGEAGENTID, @CURRENTDATE;
    end

    if not @RECOGNITIONS is null
      exec dbo.USP_REVENUEBATCH_GETRECOGNITIONS_ADDFROMXML @ID, @RECOGNITIONS, @CHANGEAGENTID;
    else
      if @DIDRECOGNITIONSDEFAULT = 0
      begin
        -- Create default recognitions
        declare @SCAMOUNT money

        if @REVENUESTREAMS is null 
          set @SCAMOUNT = @AMOUNT;
        else
          set @SCAMOUNT = @AMOUNT - (select SUM(APPLIED) from dbo.UFN_REVENUEBATCH_GETAPPLICATIONS_FROMITEMLISTXML(@REVENUESTREAMS));

        if @SCAMOUNT > 0
        begin
          insert into dbo.BATCHREVENUERECOGNITION
          (
            BATCHREVENUEID, 
            CONSTITUENTID, 
            REVENUERECOGNITIONTYPECODEID,
            AMOUNT,
            EFFECTIVEDATE,
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED
          )
          (
            select
              @ID,
              RECOGNITIONS.CONSTITUENTID,
              RECOGNITIONS.REVENUERECOGNITIONTYPECODEID,
              RECOGNITIONS.AMOUNT,
              @date,
              @CHANGEAGENTID,
              @CHANGEAGENTID,
              @CURRENTDATE
              @CURRENTDATE
            from dbo.UFN_REVENUEBATCH_GETRECOGNITIONDEFAULTS(@GIVENANONYMOUSLY, @CONSTITUENTID, @SCAMOUNT, @DATE, null) as RECOGNITIONS
          );
        end
      end

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

    if not @BENEFITS is null
      exec dbo.USP_REVENUEBATCH_GETBENEFITS_ADDFROMXML @ID, @BENEFITS, @CHANGEAGENTID;

    if not @PERCENTAGEBENEFITS is null
      exec dbo.USP_REVENUEBATCH_GETBENEFITSPCT_ADDFROMXML @ID, @PERCENTAGEBENEFITS, @CHANGEAGENTID;

    if @BENEFITS is null and @PERCENTAGEBENEFITS is null and not @APPEALID is null
    begin
      declare @BENEFITID uniqueidentifier;
  declare @QUANTITY int;
      declare @BENSEQUENCE int;
      declare @UNITVALUE int;
      declare @VALUEPERCENT numeric(20, 2);
      declare @USEPERCENT bit;
      declare @BENEFITADDED bit = 0;

      declare BENEFITCURSOR cursor local fast_forward for
        select 
          [BENEFITID],
          [QUANTITY],
          [SEQUENCE],
          [VALUE], 
          [VALUEPERCENT], 
          [USEPERCENT]
        from dbo.UFN_APPEAL_GETBENEFITDETAILS_ALL(@APPEALID, @AMOUNT)
        order by USEPERCENT, SEQUENCE

      open BENEFITCURSOR;
      fetch next from BENEFITCURSOR into @BENEFITID, @QUANTITY, @BENSEQUENCE, @UNITVALUE, @VALUEPERCENT, @USEPERCENT

      while (@@FETCH_STATUS = 0)
      begin
        if @USEPERCENT = 0 
        begin
          insert into [BATCHREVENUEBENEFIT] 
          (
            [BATCHREVENUEID], 
            [BENEFITID],
            [QUANTITY],
            [SEQUENCE],
            [UNITVALUE],
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED
          )
          values
          (
            @ID
            @BENEFITID
            @QUANTITY
            @BENSEQUENCE
            @UNITVALUE
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
          )

          set @DEFAULTRECEIPTAMOUNT = @DEFAULTRECEIPTAMOUNT - (@QUANTITY * @UNITVALUE)
        end
        else
        begin
          insert into [BATCHREVENUEBENEFITPCT] 
          (
            [BATCHREVENUEID], 
            [BENEFITID],
            [SEQUENCE],
            [VALUEPERCENT],
            [PERCENTAPPLICABLEAMOUNT],
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED
          )
          values
          (
            @ID
            @BENEFITID
            @BENSEQUENCE
            @VALUEPERCENT,
            @DEFAULTRECEIPTAMOUNT,
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
          )

          set @DEFAULTRECEIPTAMOUNT = @DEFAULTRECEIPTAMOUNT - (@DEFAULTRECEIPTAMOUNT * @VALUEPERCENT/100)
        end

        set @BENEFITADDED = 1;

        fetch next from BENEFITCURSOR into @BENEFITID, @QUANTITY, @SEQUENCE, @UNITVALUE, @VALUEPERCENT, @USEPERCENT
      end

      close BENEFITCURSOR;
      deallocate BENEFITCURSOR;

      if @USERMODIFIEDRECEIPTAMOUNT = 0 and @BENEFITADDED = 1
        update dbo.BATCHREVENUE 
        set RECEIPTAMOUNT = @DEFAULTRECEIPTAMOUNT
          CHANGEDBYID = @CHANGEAGENTID
          DATECHANGED = @CURRENTDATE
        where ID = @ID;

    end

    if not @INSTALLMENTS is null
      exec dbo.USP_REVENUEBATCH_GETINSTALLMENTS_ADDFROMXML @ID, @INSTALLMENTS, @CHANGEAGENTID;

    if not @UNAPPLIEDMATCHINGGIFTSPLITS is null
      exec dbo.USP_REVENUEBATCH_GETUNAPPLIEDMATCHINGGIFTSPLITS_ADDFROMXML @ID, @UNAPPLIEDMATCHINGGIFTSPLITS, @CHANGEAGENTID;

    if not @MGSPLITS is null
      exec dbo.USP_REVENUEBATCH_GETMATCHINGGIFTSPLITS_ADDFROMXML @ID, @MGSPLITS, @CHANGEAGENTID;

    if not @TRIBUTES is null
      exec dbo.USP_REVENUEBATCH_GETTRIBUTES_ADDFROMXML @ID, @TRIBUTES, @CHANGEAGENTID;

    if not @TAXDECLARATIONS is null
      exec dbo.USP_REVENUEBATCH_GETTAXDECLARATIONS_ADDFROMXML @ID, @TAXDECLARATIONS, @CHANGEAGENTID;

    if not @REVENUESTREAMS is null
      begin 

        exec dbo.USP_REVENUEBATCH_REVENUEAPPLICATIONS_ADDFROMXML @ID, @REVENUESTREAMS, @CHANGEAGENTID, @CURRENTDATE, @CURRENTAPPUSERID;

        /*JamesWill 2006-10-06 Changed update from using an inner join to using a where ID in (select...) */
        /*JamesWill 2007-03-02 CR268756-030207 only mark gifts pending if they were automatically generated */
        update dbo.REVENUESCHEDULE
          set REVENUESCHEDULE.ISPENDING = 1,
            REVENUESCHEDULE.CHANGEDBYID = @CHANGEAGENTID,
            REVENUESCHEDULE.DATECHANGED = @CURRENTDATE
        where ID in (select REVENUEID from dbo.BATCHREVENUEAPPLICATION where BATCHREVENUEID = @ID and APPLIED > 0 and WASGENERATED = 1);
      end

  end try

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

  return 0;
end