USP_GENERATEREVENUEUPDATEBATCH

Populates a row of the given batch with data from the given revenue ID.

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@BATCHID uniqueidentifier IN
@SEQUENCE int IN
@DEFAULTADJUSTMENTDATE datetime IN
@DEFAULTADJUSTMENTPOSTDATE datetime IN
@DEFAULTADJUSTMENTPOSTSTATUSCODE tinyint IN
@DEFAULTADJUSTMENTREASONCODEID uniqueidentifier IN
@DEFAULTADJUSTMENTREASON nvarchar(300) IN
@OVERWRITE bit IN
@OVERWRITEFIELD nvarchar(255) IN
@OLDGUIDVALUE uniqueidentifier IN
@NEWGUIDVALUE uniqueidentifier IN
@OLDDATEVALUE datetime IN
@NEWDATEVALUE datetime IN
@CURRENTAPPUSERID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_GENERATEREVENUEUPDATEBATCH
(
    @REVENUEID uniqueidentifier,
    @BATCHID uniqueidentifier,
    @SEQUENCE int,
    @DEFAULTADJUSTMENTDATE datetime,
    @DEFAULTADJUSTMENTPOSTDATE datetime,
    @DEFAULTADJUSTMENTPOSTSTATUSCODE tinyint,
    @DEFAULTADJUSTMENTREASONCODEID uniqueidentifier,
    @DEFAULTADJUSTMENTREASON nvarchar(300),
    @OVERWRITE bit,
    @OVERWRITEFIELD nvarchar(255),
    @OLDGUIDVALUE uniqueidentifier,
    @NEWGUIDVALUE uniqueidentifier,
    @OLDDATEVALUE datetime,
    @NEWDATEVALUE datetime,
    @CURRENTAPPUSERID uniqueidentifier

as
begin
    set nocount on;

    declare @ID uniqueidentifier;
    declare @CURRENTDATE datetime;
    declare @CHANGEAGENTID uniqueidentifier;
    declare @REVENUESPLITID uniqueidentifier;
    declare @CONSTITUENTID uniqueidentifier;
    declare @AMOUNT money;
    declare @DATE datetime;
    declare @TYPECODE tinyint;
    declare @PAYMENTMETHODCODE tinyint;
    declare @APPLICATIONINFO nvarchar(60);
    declare @APPEALID uniqueidentifier;
    declare @OPPORTUNITYID uniqueidentifier;
    declare @POSTSTATUSCODE tinyint;
    declare @POSTDATE datetime;
    declare @DONOTACKNOWLEDGE bit;
    declare @DONOTRECEIPT bit;
    declare @MAILINGID uniqueidentifier;
    declare @FINDERNUMBER bigint;
    declare @SOURCECODE nvarchar(60);
    declare @CHANNELCODEID uniqueidentifier;
    declare @GIVENANONYMOUSLY bit;
    declare @OTHERPAYMENTMETHODCODEID uniqueidentifier;
    declare @RECEIPTAMOUNT money;
    declare @RECEIPTTYPECODE tinyint;
    declare @REFERENCE nvarchar(255);
    declare @CATEGORYCODEID uniqueidentifier;
    declare @REVENUELOOKUPID nvarchar(100);
    declare @SPLITS xml;
    declare @INSTALLMENTS xml;
    declare @INSTALLMENTFREQUENCYCODE tinyint;
    declare @INSTALLMENTSTARTDATE datetime;
    declare @INSTALLMENTENDDATE datetime;
    declare @NUMBEROFINSTALLMENTS int;
    declare @SENDPLEDGEREMINDER bit;
    declare @LOCKBOXID uniqueidentifier;
    declare @LOCKBOXBATCHNUMBER nvarchar(100);
    declare @LOCKBOXBATCHSEQUENCE int;
    declare @ADDITIONALAPPLICATIONSSTREAM xml;
    declare @OTHERTYPECODEID uniqueidentifier;
    declare @PLEDGESUBTYPEID uniqueidentifier;
    declare @REVENUESTREAMS xml;
    declare @TRIBUTES xml;
    declare @MATCHINGGIFTS xml;
    declare @APPLICATIONRECOGNITIONS xml;
    declare @APPLICATIONSOLICITORS xml;
    declare @APPLICATIONBUSINESSUNITS xml;
    declare @LETTERS xml;
    declare @BASECURRENCYID uniqueidentifier;
    declare @TRANSACTIONCURRENCYID uniqueidentifier;
    declare @BASEEXCHANGERATEID uniqueidentifier;
    declare @EXCHANGERATE decimal(20,8);
    declare @PDACCOUNTSYSTEMID uniqueidentifier;
    declare @AMOUNTFORVAT money;
    declare @VATTAXRATEID uniqueidentifier;
    declare @VATAMOUNT money;
    declare @CHECKDATE dbo.UDT_FUZZYDATE;
    declare @CHECKNUMBER nvarchar(20);
    declare @CARDHOLDERNAME nvarchar(255);
    declare @CREDITCARDNUMBER nvarchar(20);
    declare @CREDITTYPECODEID uniqueidentifier;
    declare @AUTHORIZATIONCODE nvarchar(20);
    declare @EXPIRESON dbo.UDT_FUZZYDATE;
    declare @ISSUER nvarchar(100);
    declare @NUMBEROFUNITS decimal(20,3);
    declare @SYMBOL nvarchar(25);
    declare @MEDIANPRICE decimal(19,4);
    declare @LOWPRICE decimal(19,4);
    declare @HIGHPRICE decimal(19,4);
    declare @CONSTITUENTACCOUNTID uniqueidentifier;
    declare @DIRECTDEBITRESULTCODE nvarchar(10);
    declare @DIRECTDEBITISREJECTED bit;
    declare @PROPERTYSUBTYPECODEID uniqueidentifier;
    declare @GIFTINKINDSUBTYPECODEID uniqueidentifier;
    declare @GIFTINKINDITEMNAME nvarchar(100);
    declare @GIFTINKINDDISPOSITIONCODE tinyint;
    declare @GIFTINKINDNUMBEROFUNITS int;
    declare @GIFTINKINDFAIRMARKETVALUE money;
    declare @REFERENCEDATE dbo.UDT_FUZZYDATE;
    declare @REFERENCENUMBER nvarchar(20);
    --Variable names are changed to differentiate the benefits, as BENEFITS and PERCENTAGEBENEFITS fields getting overwritten by appeal benefits.

    declare @APPEALBENEFITS xml;
    declare @REVENUEBENEFITS xml;
    declare @REVENUEPERCENTAGEBENEFITS xml;
    declare @PERCENTAGEAPPEALBENEFITS xml;
    declare @NOTES xml;
    declare @STANDINGORDERSETUP bit;
    declare @STANDINGORDERSETUPDATE datetime;
    declare @USESYSTEMGENERATEDREFERENCENUMBER bit;
    declare @DDISOURCECODEID uniqueidentifier;
    declare @DDISOURCEDATE date;
    declare @ISADJUSTMENT bit;
    declare @ADJUSTMENTDATE datetime;
    declare @ADJUSTMENTPOSTDATE datetime;
    declare @ADJUSTMENTREASON nvarchar(300);
    declare @ADJUSTMENTREASONCODEID uniqueidentifier;
    declare @ADJUSTMENTPOSTSTATUSCODE tinyint;
    declare @ISPOSTED bit;
    declare @DECLINESGIFTAID bit;
    declare @ISGIFTAIDSPONSORSHIP bit;
    declare @INSTALLMENTSCHEDULESEEDDATE date;
    declare @SALEAMOUNT money;
    declare @SALEDATE datetime;
    declare @BROKERFEE money;
    declare @SALEPOSTSTATUSCODE tinyint;
    declare @SALEPOSTDATE datetime;
    declare @CREDITCARDID uniqueidentifier;
    declare @INSTALLMENTAMOUNT money;
    declare @SPLITSCHEDULEOPTIONCODE tinyint;
    --Introduce USERMODIFIEDBENEFITS field, for if the benefits are modified by user.

    declare @USERMODIFIEDBENEFITS bit;
  --Introduce STANDINGORDERREFERENCENUMBER field, for fetching reference number when payment method is standing order.

  declare @STANDINGORDERREFERENCENUMBER nvarchar(20);

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

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

    set @CURRENTDATE = GetDate();

    if exists
    (
        select
            MEMBERSHIPTRANSACTION.ID
        from
            dbo.MEMBERSHIPTRANSACTION
            inner join dbo.REVENUESPLIT on MEMBERSHIPTRANSACTION.REVENUESPLITID = REVENUESPLIT.ID
        where
            REVENUESPLIT.REVENUEID = @REVENUEID and
            REVENUESPLIT.DESIGNATIONID is null
    )
    begin
        raiserror('Membership-related revenue with no associated designation cannot be imported into this batch.',13,1)
        return 1;
    end

    if @OVERWRITE = 1 and @OVERWRITEFIELD = 'Designation'
    begin
        if exists (select 1 
                             from dbo.REVENUE
                             left join dbo.REVENUESPLIT on REVENUE.ID = REVENUESPLIT.REVENUEID
                             left join dbo.INSTALLMENTSPLITPAYMENT on REVENUESPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
                             where REVENUE.ID = @REVENUEID
                             and (((REVENUE.TRANSACTIONTYPECODE in (1,2)) and (REVENUESPLIT.DESIGNATIONID = @NEWGUIDVALUE)) or ((REVENUE.TRANSACTIONTYPECODE = 0) and (REVENUESPLIT.APPLICATIONCODE in (0,4,7)) and (REVENUESPLIT.TYPECODE in (0,4,9)) and (INSTALLMENTSPLITPAYMENT.ID is null) and (REVENUESPLIT.DESIGNATIONID = @NEWGUIDVALUE))))
        begin
            declare @ERRORMESSAGE nvarchar(max);
            declare @OLDDESIGNATION nvarchar(512);
            declare @NEWDESIGNATION nvarchar(512);

            select @OLDDESIGNATION = USERID from dbo.DESIGNATION where ID = @OLDGUIDVALUE;
            select @NEWDESIGNATION = USERID from dbo.DESIGNATION where ID = @NEWGUIDVALUE;

            set @ERRORMESSAGE = 'Designation ' + @OLDDESIGNATION + ' cannot be overwritten by designation ' + @NEWDESIGNATION + ' because a designation of ' + @NEWDESIGNATION + ' already exists.';
            raiserror(@ERRORMESSAGE, 13, 1);
            return 1;
        end
    end

    select 
        @REVENUESPLITID =  case when (select count(*) from dbo.REVENUESPLIT where REVENUESPLIT.REVENUEID = R.ID) <> 1 then null
                                             else (select ID from dbo.REVENUESPLIT where REVENUESPLIT.REVENUEID = R.ID) end,
        @CONSTITUENTID = R.CONSTITUENTID,
        @AMOUNT = R.TRANSACTIONAMOUNT,
        @DATE = R.DATE,
        @TYPECODE = case when R.TRANSACTIONTYPECODE = 2 then 3 else R.TRANSACTIONTYPECODE end,
        @PAYMENTMETHODCODE = RP.PAYMENTMETHODCODE,
        @APPLICATIONINFO = coalesce(dbo.UFN_REVENUEUPDATEBATCH_GETAPPLICATIONINFO(@REVENUEID), ''),
        @APPEALID = R.APPEALID,
        @OPPORTUNITYID =  case when (select count(*) from dbo.REVENUESPLIT where REVENUESPLIT.REVENUEID = R.ID) <> 1 then null
                                            else (select OPPORTUNITYID from dbo.REVENUEOPPORTUNITY inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = REVENUEOPPORTUNITY.ID where REVENUESPLIT.REVENUEID = R.ID) end,
        @POSTSTATUSCODE = case when R.DONOTPOST = 1 then 2 else 1 end,
        @POSTDATE = R.POSTDATE,
        @DONOTACKNOWLEDGE = R.DONOTACKNOWLEDGE,
        @DONOTRECEIPT = R.DONOTRECEIPT,
        @MAILINGID = R.MAILINGID,
        @FINDERNUMBER = R.FINDERNUMBER,
        @SOURCECODE = R.SOURCECODE,
        @CHANNELCODEID = R.CHANNELCODEID,
        @GIVENANONYMOUSLY  = R.GIVENANONYMOUSLY,
        @OTHERPAYMENTMETHODCODEID = OP.OTHERPAYMENTMETHODCODEID,  
        @RECEIPTAMOUNT = R.RECEIPTAMOUNT,
        @RECEIPTTYPECODE = coalesce(R.RECEIPTTYPECODE, 255),
        @REFERENCE = coalesce(RR.REFERENCE, ''),
        @CATEGORYCODEID = case 
                                                when (select count(*) from dbo.REVENUESPLIT where REVENUESPLIT.REVENUEID = R.ID) <> 1 then 
                                                        case when (R.TRANSACTIONTYPECODE = 1 or R.TRANSACTIONTYPECODE = 2) -- display revenue category for pledge or recurring gift (it is the same for each split)

                                                                then
                                                                (select top 1 GLREVENUECATEGORYMAPPINGID from dbo.REVENUECATEGORY inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = REVENUECATEGORY.ID where REVENUESPLIT.REVENUEID = R.ID)
                                                            else
                                                            null 
                                                            end
                                                    else (select GLREVENUECATEGORYMAPPINGID from dbo.REVENUECATEGORY inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = REVENUECATEGORY.ID where REVENUESPLIT.REVENUEID = R.ID) end,                                              
        @REVENUELOOKUPID = R.LOOKUPID,
        @SPLITS = case when R.TRANSACTIONTYPECODE in (1,2) then dbo.UFN_REVENUEUPDATEBATCH_GETSPLITS_TOITEMLISTXML(@REVENUEID) else null end,
        @INSTALLMENTS = case when R.TRANSACTIONTYPECODE = 1 then dbo.UFN_REVENUEUPDATEBATCH_LOADINSTALLMENTS_TOITEMLISTXML(@REVENUEID) else null end,
        @INSTALLMENTFREQUENCYCODE = RS.FREQUENCYCODE, 
        @INSTALLMENTSTARTDATE = RS.STARTDATE,
        @INSTALLMENTENDDATE = RS.ENDDATE,
        @SENDPLEDGEREMINDER = coalesce(RS.SENDPLEDGEREMINDER, 1), --cannot insert null, RevenueUpdateBatchDataForm.Add sets null to 1

        @LOCKBOXID = RB.LOCKBOXID,
        @LOCKBOXBATCHNUMBER = RB.BATCHNUMBER,
        @LOCKBOXBATCHSEQUENCE = RB.BATCHSEQUENCE,
        @ADDITIONALAPPLICATIONSSTREAM = case when R.TRANSACTIONTYPECODE = 0 then dbo.UFN_REVENUEUPDATEBATCH_GETADDITIONALAPPLICATIONS_TOITEMLISTXML(@REVENUEID) else null end,
        @OTHERTYPECODEID = case when (select count(*) from dbo.REVENUESPLIT where REVENUESPLIT.REVENUEID = R.ID) <> 1 then null
                                             else (select OTHERTYPECODEID from dbo.REVENUESPLITOTHER inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = REVENUESPLITOTHER.ID where REVENUESPLIT.REVENUEID = R.ID) end,
        @PLEDGESUBTYPEID = RS.PLEDGESUBTYPEID,
        @REVENUESTREAMS = case when R.TRANSACTIONTYPECODE = 0 then dbo.UFN_REVENUEUPDATEBATCH_GETAPPLICATIONSTREAM_TOITEMLISTXML(@REVENUEID, R.CONSTITUENTID) else null end,
        @TRIBUTES = case when R.TRANSACTIONTYPECODE in (0,1) then dbo.UFN_REVENUEUPDATEBATCH_GETTRIBUTES_TOITEMLISTXML(@REVENUEID) else null end,
        @MATCHINGGIFTS = case when R.TRANSACTIONTYPECODE = 0 then dbo.UFN_REVENUEUPDATEBATCH_GETMATCHINGGIFTS_TOITEMLISTXML(@REVENUEID) else null end,
        @APPLICATIONRECOGNITIONS = dbo.UFN_REVENUEUPDATEBATCH_GETRECOGNITIONS_TOITEMLISTXML(@REVENUEID),
        @APPLICATIONSOLICITORS = dbo.UFN_REVENUEUPDATEBATCH_GETSOLICITORS_TOITEMLISTXML(@REVENUEID),
        @APPLICATIONBUSINESSUNITS = dbo.UFN_REVENUEUPDATEBATCH_GETBUSINESSUNITS(@REVENUEID, R.TRANSACTIONTYPECODE),
        @LETTERS = dbo.UFN_REVENUEUPDATEBATCH_GETREVENUELETTERS(@REVENUEID),
        @BASECURRENCYID = R.BASECURRENCYID,
        @TRANSACTIONCURRENCYID = R.TRANSACTIONCURRENCYID,
        @BASEEXCHANGERATEID = R.BASEEXCHANGERATEID,
        @EXCHANGERATE = coalesce(CURRENCYEXCHANGERATE.RATE, 0),
        @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMFORREVENUE.PDACCOUNTSYSTEMID,
        @AMOUNTFORVAT = coalesce(REVENUEVAT.TRANSACTIONAMOUNTTOTAX, 0),
        @VATTAXRATEID = REVENUEVAT.VATTAXRATEID,
        @VATAMOUNT = coalesce(REVENUEVAT.TRANSACTIONVATAMOUNT, 0),
        @CHECKDATE = coalesce(CP.CHECKDATE, '00000000'),
        @CHECKNUMBER = coalesce(CP.CHECKNUMBER, ''),
        @CARDHOLDERNAME = coalesce(CCP.CARDHOLDERNAME, ''),
        @CREDITCARDNUMBER = coalesce(CCP.CREDITCARDPARTIALNUMBER, ''),
        @CREDITTYPECODEID = CCP.CREDITTYPECODEID,
        @AUTHORIZATIONCODE = coalesce(CCP.AUTHORIZATIONCODE, ''),
        @EXPIRESON = coalesce(CCP.EXPIRESON, '00000000'),
        @ISSUER = coalesce(SD.ISSUER, ''),
        @NUMBEROFUNITS = coalesce(SD.NUMBEROFUNITS, 0),
        @SYMBOL = coalesce(SD.SYMBOL, ''),
        @MEDIANPRICE = coalesce(SD.TRANSACTIONMEDIANPRICE, 0),
        @LOWPRICE = coalesce(SD.TRANSACTIONLOWPRICE, 0),
        @HIGHPRICE = coalesce(SD.TRANSACTIONHIGHPRICE, 0),
        @CONSTITUENTACCOUNTID = case RP.PAYMENTMETHODCODE when 3 then DDP.CONSTITUENTACCOUNTID when 11 then SOP.CONSTITUENTACCOUNTID else null end,
        @DIRECTDEBITRESULTCODE = coalesce(DDP.DIRECTDEBITRESULTCODE, ''),
        @DIRECTDEBITISREJECTED = coalesce(DDP.ISREJECTED, 0),
        @PROPERTYSUBTYPECODEID = PD.PROPERTYSUBTYPECODEID,
        @GIFTINKINDSUBTYPECODEID = GIKP.GIFTINKINDSUBTYPECODEID,
        @GIFTINKINDITEMNAME = coalesce(GIKP.ITEMNAME, ''),
        @GIFTINKINDDISPOSITIONCODE = coalesce(GIKP.DISPOSITIONCODE, 0),
        @GIFTINKINDNUMBEROFUNITS = coalesce(GIKP.NUMBEROFUNITS, 0),
        @GIFTINKINDFAIRMARKETVALUE = coalesce(GIKP.TRANSACTIONFAIRMARKETVALUE, 0),
        @REFERENCEDATE = case RP.PAYMENTMETHODCODE when 0 then CASH.REFERENCEDATE when 3 then DDP.REFERENCEDATE when 10 then OP.REFERENCEDATE when 11 then SOP.REFERENCEDATE else null end,
        @REFERENCENUMBER = case RP.PAYMENTMETHODCODE when 0 then CASH.REFERENCENUMBER when 3 then DDP.REFERENCENUMBER when 10 then OP.REFERENCENUMBER when 11 then N'' 
                        when 101 then PAYPAL.REFERENCENUMBER when 102 then VENMO.REFERENCENUMBER else null end,
        @ISPOSTED = case when P.ID is null then 0 else 1 end,
        @DECLINESGIFTAID = coalesce(case when (select count(*) from dbo.REVENUESPLIT where REVENUESPLIT.REVENUEID = R.ID) <> 1 then null
                                             else (select DECLINESGIFTAID 
                                                         from dbo.REVENUESPLIT 
                                                         inner join dbo.REVENUESPLITGIFTAID on REVENUESPLIT.ID = REVENUESPLITGIFTAID.ID
                                                         where REVENUESPLIT.REVENUEID = R.ID) end, 0),
        @ISGIFTAIDSPONSORSHIP = coalesce(case when (select count(*) from dbo.REVENUESPLIT where REVENUESPLIT.REVENUEID = R.ID) <> 1 then null
                                                        else (select ISSPONSORSHIP
                                                                    from dbo.REVENUESPLIT 
                                                                    inner join dbo.REVENUESPLITGIFTAID on REVENUESPLIT.ID = REVENUESPLITGIFTAID.ID
                                                                    where REVENUESPLIT.REVENUEID = R.ID) end, 0),
                                                                    @INSTALLMENTSCHEDULESEEDDATE = case when R.TRANSACTIONTYPECODE = 2 then RS.NEXTTRANSACTIONDATE else null end,
        @CREDITCARDID = RS.CREDITCARDID
    from dbo.REVENUE R
    inner join dbo.REVENUEPAYMENTMETHOD RP on R.ID = RP.REVENUEID  
    left join dbo.PDACCOUNTSYSTEMFORREVENUE on R.ID = PDACCOUNTSYSTEMFORREVENUE.ID
    left join dbo.OTHERPAYMENTMETHODDETAIL OP on OP.ID = RP.ID
    left join dbo.REVENUEREFERENCE RR on R.ID = RR.ID
    left join dbo.REVENUESCHEDULE RS on RS.ID = R.ID
    left join dbo.REVENUELOCKBOX RB on RB.ID = R.ID
    left join dbo.CURRENCYEXCHANGERATE on CURRENCYEXCHANGERATE.ID = R.BASEEXCHANGERATEID
    left join dbo.REVENUEVAT on R.ID = REVENUEVAT.ID
    left join dbo.CHECKPAYMENTMETHODDETAIL CP on RP.ID = CP.ID
    left join dbo.CREDITCARDPAYMENTMETHODDETAIL CCP on RP.ID = CCP.ID
    left join dbo.STOCKDETAIL SD on RP.ID = SD.ID
    left join dbo.DIRECTDEBITPAYMENTMETHODDETAIL DDP on RP.ID = DDP.ID
    left join dbo.PROPERTYDETAIL PD on RP.ID = PD.ID
    left join dbo.GIFTINKINDPAYMENTMETHODDETAIL GIKP on RP.ID = GIKP.ID
    left join dbo.STANDINGORDERPAYMENTMETHODDETAIL SOP on RP.ID = SOP.ID
    left join dbo.CASHPAYMENTMETHODDETAIL CASH on RP.ID = CASH.ID
    left join dbo.REVENUEPOSTED P on P.ID = R.ID
  left join dbo.PAYPALPAYMENTMETHODDETAIL PAYPAL on RP.ID = PAYPAL.ID
  left join dbo.VENMOPAYMENTMETHODDETAIL VENMO on RP.ID = VENMO.ID
    where R.ID = @REVENUEID

    exec dbo.USP_REVENUE_GETPAYMENTDETAILS
        @REVENUEID = @REVENUEID,
        @SALEAMOUNT = @SALEAMOUNT output,
        @SALEDATE = @SALEDATE output,
        @BROKERFEE = @BROKERFEE output,
        @SALEPOSTSTATUSCODE = @SALEPOSTSTATUSCODE output,
        @SALEPOSTDATE = @SALEPOSTDATE output;

    if @SALEAMOUNT is null
        set @SALEAMOUNT = 0;
    if @BROKERFEE is null
        set @BROKERFEE = 0;
    if @SALEPOSTSTATUSCODE is null
        set @SALEPOSTSTATUSCODE = 255;

    if @TYPECODE = 1 
        begin
            if @ISPOSTED = 1
                set @ISADJUSTMENT = 1;
            select @INSTALLMENTAMOUNT = INSTALLMENTAMOUNT, @SPLITSCHEDULEOPTIONCODE = 0 from dbo.PLEDGEINSTALLMENTOPTION where ID = @REVENUEID;
        end

    if @TYPECODE = 0 and @ISPOSTED = 1 and not exists(select ID from dbo.REVENUESPLIT where REVENUEID = @REVENUEID and APPLICATIONCODE = 11)
    begin
        declare @ISORDERAPPLICATION bit = 0;
        if exists(select 'x' from dbo.SALESORDERPAYMENT
        inner join dbo.SALESORDERITEM on SALESORDERITEM.SALESORDERID = SALESORDERPAYMENT.SALESORDERID
        where SALESORDERPAYMENT.PAYMENTID = @REVENUEID and SALESORDERITEM.TYPECODE <> 12
        begin
            select @ISORDERAPPLICATION = 1        
            from dbo.SALESORDERPAYMENT
            where PAYMENTID = @REVENUEID;  
        end

        if @ISORDERAPPLICATION = 0 and dbo.UFN_REVENUE_HASGIFTAIDSPLITONPENDINGR68(@REVENUEID, 1) = 0
            set @ISADJUSTMENT = 1;
    end

    if @PAYMENTMETHODCODE = 3 --Direct Debit

    begin                    
        if dbo.UFN_INSTALLEDPRODUCTS_PRODUCTIS('9568A6C2-F7AA-45fd-8F54-21FE9654EE2D') = 1
        begin
            select 
                @REFERENCEDATE = REFERENCEDATE,
                @REFERENCENUMBER = REFERENCENUMBER,
                @CONSTITUENTACCOUNTID = CONSTITUENTACCOUNTID,
                @DDISOURCECODEID = DDISOURCECODEID,
                @DDISOURCEDATE = DDISOURCEDATE
            from dbo.REVENUESCHEDULEDIRECTDEBITPAYMENT
            where ID = @REVENUEID 
        end
        else
        begin
            select 
                @REFERENCEDATE = REFERENCEDATE,
                @REFERENCENUMBER = REFERENCENUMBER,
                @CONSTITUENTACCOUNTID = CONSTITUENTACCOUNTID
            from dbo.REVENUESCHEDULEDIRECTDEBITPAYMENT
            where ID = @REVENUEID
        end
    end

    if @PAYMENTMETHODCODE = 11 -- standing order

    begin
        select 
            @REFERENCEDATE = REFERENCEDATE,
            @STANDINGORDERREFERENCENUMBER = dbo.UFN_STANDINGORDER_REFERENCENUMBER_FORDISPLAY(REVENUESCHEDULESTANDINGORDERPAYMENT.ID),
            @CONSTITUENTACCOUNTID = CONSTITUENTACCOUNTID,
            @STANDINGORDERSETUP = STANDINGORDERSETUP,
            @STANDINGORDERSETUPDATE = STANDINGORDERSETUPDATE,
            @USESYSTEMGENERATEDREFERENCENUMBER = USESYSTEMGENERATEDREFERENCENUMBER
        from dbo.REVENUESCHEDULESTANDINGORDERPAYMENT
        left join dbo.REVENUESTANDINGORDER on REVENUESTANDINGORDER.ID = REVENUESCHEDULESTANDINGORDERPAYMENT.ID
        where REVENUESCHEDULESTANDINGORDERPAYMENT.ID = @REVENUEID
    end

    set @REVENUEBENEFITS = 
    (
        select 
            '00000000-0000-0000-0000-000000000000' as ID,
            BENEFITID, 
            QUANTITY,
            UNITVALUE, 
            TOTALVALUE, 
            DETAILS,
            SEQUENCE,
            ID as REVENUEBENEFITID,
            BASECURRENCYID as BENEFITCURRENCYID,
            TRANSACTIONCURRENCYID,
            TRANSACTIONTOTALVALUE
        from UFN_REVENUE_GETBENEFITS_3(@REVENUEID) B
        where B.USEPERCENT = 0
        for xml raw('ITEM'), type, elements, root('BENEFITS'), binary base64
    );


    set @REVENUEPERCENTAGEBENEFITS = 
    (
        select 
            '00000000-0000-0000-0000-000000000000' as ID,
            BENEFITID, 
            PERCENTAPPLICABLEAMOUNT,
            VALUEPERCENT, 
            TOTALVALUE, 
            DETAILS,
            SEQUENCE,
            ID as REVENUEBENEFITID,
            TRANSACTIONCURRENCYID
        from UFN_REVENUE_GETBENEFITS_3(@REVENUEID) B
        where B.USEPERCENT = 1
        for xml raw('ITEM'), type, elements, root('PERCENTAGEBENEFITS'), binary base64
    );

    set @NOTES = 
    (
        select 
            '00000000-0000-0000-0000-000000000000' as ID,
            REVENUENOTETYPECODEID as NOTETYPECODEID, 
            TITLE AS NOTETITLE,
            DATEENTERED AS NOTEDATEENTERED, 
            AUTHORID AS NOTEAUTHORID, 
            TEXTNOTE AS NOTETEXTNOTE,
            ID as REVENUENOTEID,
            HTMLNOTE as NOTEHTMLNOTE
        from REVENUENOTE RN
        where RN.REVENUEID = @REVENUEID
        for xml raw('ITEM'), type, elements, root('NOTES'), binary base64
    );

    if @ISADJUSTMENT = 1
    begin
        select top 1
            @ADJUSTMENTDATE = ADJUSTMENT.DATE,
            @ADJUSTMENTPOSTDATE = ADJUSTMENT.POSTDATE,
            @ADJUSTMENTPOSTSTATUSCODE = ADJUSTMENT.POSTSTATUSCODE,
            @ADJUSTMENTREASON = ADJUSTMENT.REASON,
            @ADJUSTMENTREASONCODEID = ADJUSTMENT.REASONCODEID                  
        from dbo.ADJUSTMENT
        where ADJUSTMENT.REVENUEID = @REVENUEID
        order by dateadded desc

        if @ADJUSTMENTREASONCODEID is null
        begin
            select
                @ADJUSTMENTDATE = DATE,
                @ADJUSTMENTPOSTDATE = POSTDATE,
                @ADJUSTMENTPOSTSTATUSCODE = 1,
                @ADJUSTMENTREASON = REASON,
                @ADJUSTMENTREASONCODEID = REASONCODEID
            from dbo.BENEFITADJUSTMENT
            where REVENUEID = @REVENUEID and POSTSTATUSCODE = 1
        end

        --if the most recent adjustment has been posted then in essence we have no adjustment so clear out the adjustment fields

        if @ADJUSTMENTPOSTSTATUSCODE = 0
        begin
            select @ADJUSTMENTDATE = null,
                @ADJUSTMENTPOSTDATE = null,
                @ADJUSTMENTPOSTSTATUSCODE = 1,
                @ADJUSTMENTREASON = '',
                @ADJUSTMENTREASONCODEID = null
        end

        if @ADJUSTMENTREASONCODEID is null
        begin
            set @ADJUSTMENTDATE = coalesce(@DEFAULTADJUSTMENTDATE, @CURRENTDATE);
            set @ADJUSTMENTPOSTDATE = coalesce(@DEFAULTADJUSTMENTPOSTDATE, @CURRENTDATE);
            set @ADJUSTMENTPOSTSTATUSCODE = @DEFAULTADJUSTMENTPOSTSTATUSCODE;
            set @ADJUSTMENTREASONCODEID = @DEFAULTADJUSTMENTREASONCODEID;
            set @ADJUSTMENTREASON = @DEFAULTADJUSTMENTREASON;
        end            
    end

    declare @FIRSTUNPAIDINSTALLMENTSEQUENCE integer;
    select
            @FIRSTUNPAIDINSTALLMENTSEQUENCE = min(SEQUENCE)
    from dbo.INSTALLMENT
    where INSTALLMENT.REVENUEID = @REVENUEID and dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID) = INSTALLMENT.TRANSACTIONAMOUNT;

    if @FIRSTUNPAIDINSTALLMENTSEQUENCE is not null
        select @NUMBEROFINSTALLMENTS = count(INSTALLMENT.ID) from dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2(@REVENUEID) INSTALLMENT where INSTALLMENT.BALANCE > 0;
    else
        set @NUMBEROFINSTALLMENTS = 0;

    if @TYPECODE <> 0
        set @LOCKBOXID = null;                       
    if @LOCKBOXBATCHNUMBER is null or @LOCKBOXID is null
        set @LOCKBOXBATCHNUMBER = '';
    if @LOCKBOXBATCHSEQUENCE is null or @LOCKBOXID is null
        set @LOCKBOXBATCHSEQUENCE = 0;

    if @PDACCOUNTSYSTEMID is null
        set @PDACCOUNTSYSTEMID = dbo.UFN_PDACCOUNTSYSTEM_GETDEFAULTSYSTEMIDSFORUSER(@CURRENTAPPUSERID)

    if @BASECURRENCYID is null
    begin
        declare @CURRENCYSETID uniqueidentifier
        select @CURRENCYSETID = CURRENCYSETID
        from dbo.PDACCOUNTSYSTEM
        where ID = @PDACCOUNTSYSTEMID

        select @BASECURRENCYID = CURRENCYSET.BASECURRENCYID
        from dbo.CURRENCYSET
        where CURRENCYSET.ID = coalesce(@CURRENCYSETID,dbo.UFN_CURRENCYSET_GETAPPUSERDEFAULTCURRENCYSET())
    end

    if @USESYSTEMGENERATEDREFERENCENUMBER is null 
        set @USESYSTEMGENERATEDREFERENCENUMBER = 1;

 if @PAYMENTMETHODCODE = 11 and @USESYSTEMGENERATEDREFERENCENUMBER is null
 begin
    set @STANDINGORDERREFERENCENUMBER = ''
    set @USESYSTEMGENERATEDREFERENCENUMBER = 0;
 end

    if @PAYMENTMETHODCODE = 11 and @USESYSTEMGENERATEDREFERENCENUMBER = 1
    begin
            set @STANDINGORDERREFERENCENUMBER = ''
    end

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

        set @DONOTRECEIPT = 1;

    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

    if len(@APPLICATIONINFO) > 3
        set @APPLICATIONINFO = ''

    --USP to set the USERMODIFIEDBENEFITS field after comparing benefits, as it gets done in Revenue Update Batch.

        exec dbo.USP_BENEFIT_USERMODIFIEDBENEFITS 
                    @APPLICATIONINFO, @REVENUESTREAMS
                    @APPEALID, @AMOUNT, @DATE
                    @TRANSACTIONCURRENCYID
                    @BASECURRENCYID
                    @REVENUEBENEFITS
                    @REVENUEPERCENTAGEBENEFITS
                    @EXCHANGERATE
                    @BASEEXCHANGERATEID
                    @USERMODIFIEDBENEFITS output;

    if @USERMODIFIEDBENEFITS is null
            set @USERMODIFIEDBENEFITS = 0;

    if @OVERWRITE = 1
    begin
        if @OVERWRITEFIELD = 'Appeal'
        begin
             if @APPEALID <> @NEWGUIDVALUE
                begin
                    set @APPEALID = @NEWGUIDVALUE;  
                set @MAILINGID = NULL

                    -- Default benefits 

                    set @APPEALBENEFITS = 
                    (
                         select newid() ID, BENEFITID, QUANTITY, VALUE UNITVALUE, SEQUENCE, '' DETAILS
                         from dbo.UFN_APPEAL_GETBENEFITDETAILS_2(@APPEALID, @AMOUNT, @TRANSACTIONCURRENCYID, @BASECURRENCYID)
                         for xml raw('ITEM'), type, elements, root('BENEFITS'), binary base64
                    );
                    -- Default Percent benefits

                    set @PERCENTAGEAPPEALBENEFITS = 
                    (
                         select newid() ID, BENEFITID, 0 PERCENTAPPLICABLEAMOUNT, VALUEPERCENT, SEQUENCE, '' DETAILS
                         from dbo.UFN_APPEAL_GETBENEFITDETAILS_PCT_2(@APPEALID, @AMOUNT, @TRANSACTIONCURRENCYID)
                         for xml raw('ITEM'), type, elements, root('PERCENTAGEBENEFITS'), binary base64
                    );

                end  
        end
        else if @OVERWRITEFIELD = 'Campaign'
        begin
            if @TYPECODE = 0
            begin
                set @ADDITIONALAPPLICATIONSSTREAM =
                (select
                    '00000000-0000-0000-0000-000000000000' as ID, 
                    case when REVENUESPLIT.APPLICATIONCODE = 0 and REVENUESPLIT.TYPECODE = 0 then 0
                        when REVENUESPLIT.APPLICATIONCODE = 4 and REVENUESPLIT.TYPECODE = 4 then 1
                        when REVENUESPLIT.APPLICATIONCODE = 7 and REVENUESPLIT.TYPECODE = 0 then 2
                        when REVENUESPLIT.APPLICATIONCODE = 0 and REVENUESPLIT.TYPECODE = 9 then 3
                        end as TYPECODE,
                    REVENUESPLIT.TRANSACTIONAMOUNT as APPLIED,
                    DESIGNATIONID,
                    OTHERTYPECODEID,
                    0 as DECLINESGIFTAID,
                    OPPORTUNITYID,
                    case when REVENUESPLIT.APPLICATIONCODE = 0 and REVENUESPLIT.TYPECODE = 9 then 
                        (case when (select count(*) from dbo.SPONSORSHIP where CONSTITUENTID = REVENUE.CONSTITUENTID and ISMOSTRECENTFORCOMMITMENT = 1) <> 1 then null
                        else (select ID from dbo.SPONSORSHIP where CONSTITUENTID = REVENUE.CONSTITUENTID and ISMOSTRECENTFORCOMMITMENT = 1) end)
                        end SPONSORSHIPID,
                    0 as ISGIFTAIDSPONSORSHIP,
                    REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID as CATEGORYCODEID,
                    cast(1 as bit) as DIDCAMPAIGNSDEFAULT,
                    (select
                        '00000000-0000-0000-0000-000000000000' as ID,
                        case when CAMPAIGNID = @OLDGUIDVALUE then @NEWGUIDVALUE else CAMPAIGNID end as CAMPAIGNID,
                        case when CAMPAIGNID = @OLDGUIDVALUE then null else CAMPAIGNSUBPRIORITYID end as CAMPAIGNSUBPRIORITYID,
                        REVENUESPLITCAMPAIGN.ID as REVENUESPLITCAMPAIGNID
                     from dbo.REVENUESPLITCAMPAIGN
                     where REVENUESPLITCAMPAIGN.REVENUESPLITID = REVENUESPLIT.ID
                     and (CAMPAIGNID <> @OLDGUIDVALUE or not exists (select 1 from dbo.REVENUESPLITCAMPAIGN where REVENUESPLITID = REVENUESPLIT.ID and CAMPAIGNID = @NEWGUIDVALUE))
                     for xml raw('ITEM'),type,elements,BINARY BASE64) as CAMPAIGNS,
                    REVENUESPLIT.ID as REVENUESPLITID,
                    REVENUESPLIT.TRANSACTIONCURRENCYID,
                    0 as GIFTAIDCOMMITTED
                 from dbo.REVENUESPLIT
                 inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
                 left outer join dbo.REVENUECATEGORY on REVENUESPLIT.ID = REVENUECATEGORY.ID
                 left outer join dbo.REVENUEOPPORTUNITY on REVENUESPLIT.ID = REVENUEOPPORTUNITY.ID
                 left outer join dbo.REVENUESPLITOTHER on REVENUESPLITOTHER.ID = REVENUESPLIT.ID
                 left outer join dbo.INSTALLMENTSPLITPAYMENT on INSTALLMENTSPLITPAYMENT.PAYMENTID = REVENUESPLIT.ID
                 where REVENUE.ID = @REVENUEID
                 and APPLICATIONCODE in (0,4,7)
                 and TYPECODE in (0,4,9)
                 and INSTALLMENTSPLITPAYMENT.ID is null
                 for xml raw('ITEM'),type,elements,root('ADDITIONALAPPLICATIONSSTREAM'),BINARY BASE64)
            end
            else if @TYPECODE = 1 or @TYPECODE = 3
            begin
                set @SPLITS = 
                (select
                    '00000000-0000-0000-0000-000000000000' as ID,
                    REVENUESPLIT.DESIGNATIONID,
                    TRANSACTIONAMOUNT as AMOUNT,
                    ROW_NUMBER() OVER(order by REVENUESPLIT.dateadded) as SEQUENCE,
                    REVENUESPLIT.APPLICATIONCODE,
                    REVENUESPLIT.TYPECODE,
                    1 as DIDCAMPAIGNSDEFAULT,
                    (select
                        '00000000-0000-0000-0000-000000000000' as ID,
                        case when CAMPAIGNID = @OLDGUIDVALUE then @NEWGUIDVALUE else CAMPAIGNID end as CAMPAIGNID,
                        case when CAMPAIGNID = @OLDGUIDVALUE then null else CAMPAIGNSUBPRIORITYID end as CAMPAIGNSUBPRIORITYID,
                        REVENUESPLITCAMPAIGN.ID as REVENUESPLITCAMPAIGNID
                     from dbo.REVENUESPLITCAMPAIGN
                     where REVENUESPLITCAMPAIGN.REVENUESPLITID = REVENUESPLIT.ID
                     and (CAMPAIGNID <> @OLDGUIDVALUE or not exists (select 1 from dbo.REVENUESPLITCAMPAIGN where REVENUESPLITID = REVENUESPLIT.ID and CAMPAIGNID = @NEWGUIDVALUE))
                     for xml raw('ITEM'),type,elements,BINARY BASE64) as CAMPAIGNS,
                    coalesce(REVENUESPLITGIFTAID.DECLINESGIFTAID, cast(0 as bit)) as DECLINESGIFTAID,
                    coalesce(REVENUESPLITGIFTAID.ISSPONSORSHIP, cast(0 as bit)) as ISGIFTAIDSPONSORSHIP,
                    REVENUESPLIT.ID as REVENUESPLITID,
                    REVENUESPLIT.TRANSACTIONCURRENCYID
                 from dbo.REVENUESPLIT
                 left outer join dbo.REVENUESPLITGIFTAID on REVENUESPLITGIFTAID.ID = REVENUESPLIT.ID
                 where REVENUEID = @REVENUEID
                 for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64);
            end
        end
        else if @OVERWRITEFIELD = 'Date'
        begin
            set @DATE = @NEWDATEVALUE;
        end
        else if @OVERWRITEFIELD = 'Designation'
        begin
            if @TYPECODE = 0
            begin
                set @ADDITIONALAPPLICATIONSSTREAM =
                (select
                    '00000000-0000-0000-0000-000000000000' as ID, 
                    case when REVENUESPLIT.APPLICATIONCODE = 0 and REVENUESPLIT.TYPECODE = 0 then 0
                        when REVENUESPLIT.APPLICATIONCODE = 4 and REVENUESPLIT.TYPECODE = 4 then 1
                        when REVENUESPLIT.APPLICATIONCODE = 7 and REVENUESPLIT.TYPECODE = 0 then 2
                        when REVENUESPLIT.APPLICATIONCODE = 0 and REVENUESPLIT.TYPECODE = 9 then 3
                        end as TYPECODE,
                    REVENUESPLIT.TRANSACTIONAMOUNT as APPLIED,
                    case when DESIGNATIONID = @OLDGUIDVALUE then @NEWGUIDVALUE else DESIGNATIONID end as DESIGNATIONID,
                    OTHERTYPECODEID,
                    0 as DECLINESGIFTAID,
                    OPPORTUNITYID,
                    case when REVENUESPLIT.APPLICATIONCODE = 0 and REVENUESPLIT.TYPECODE = 9 then 
                        (case when (select count(*) from dbo.SPONSORSHIP where CONSTITUENTID = REVENUE.CONSTITUENTID and ISMOSTRECENTFORCOMMITMENT = 1) <> 1 then null
                        else (select ID from dbo.SPONSORSHIP where CONSTITUENTID = REVENUE.CONSTITUENTID and ISMOSTRECENTFORCOMMITMENT = 1) end)
                        end SPONSORSHIPID,
                    0 as ISGIFTAIDSPONSORSHIP,
                    REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID as CATEGORYCODEID,
                    cast(1 as bit) as DIDCAMPAIGNSDEFAULT,
                    case when DESIGNATIONID = @OLDGUIDVALUE then
                    (select
                        '00000000-0000-0000-0000-000000000000' as ID,
                        CAMPAIGNID,
                        CAMPAIGNSUBPRIORITYID,
                        '00000000-0000-0000-0000-000000000000' as REVENUESPLITCAMPAIGNID
                     from dbo.UFN_DESIGNATION_GETCAMPAIGNSTODEFAULT(@NEWGUIDVALUE, @CURRENTDATE)
                     for xml raw('ITEM'),type,elements,BINARY BASE64)
                    else
                    (select
                        '00000000-0000-0000-0000-000000000000' as ID,
                        CAMPAIGNID,
                        CAMPAIGNSUBPRIORITYID,
                        REVENUESPLITCAMPAIGN.ID as REVENUESPLITCAMPAIGNID
                     from dbo.REVENUESPLITCAMPAIGN
                     where REVENUESPLITCAMPAIGN.REVENUESPLITID = REVENUESPLIT.ID
                     for xml raw('ITEM'),type,elements,BINARY BASE64) end as CAMPAIGNS,
                    REVENUESPLIT.ID as REVENUESPLITID,
                    REVENUESPLIT.TRANSACTIONCURRENCYID,
                    0 as GIFTAIDCOMMITTED
                 from dbo.REVENUESPLIT
                 inner join dbo.REVENUE on REVENUE.ID = REVENUESPLIT.REVENUEID
                 left outer join dbo.REVENUECATEGORY on REVENUESPLIT.ID = REVENUECATEGORY.ID
                 left outer join dbo.REVENUEOPPORTUNITY on REVENUESPLIT.ID = REVENUEOPPORTUNITY.ID
                 left outer join dbo.REVENUESPLITOTHER on REVENUESPLITOTHER.ID = REVENUESPLIT.ID
                 left outer join dbo.INSTALLMENTSPLITPAYMENT on INSTALLMENTSPLITPAYMENT.PAYMENTID = REVENUESPLIT.ID
                 where REVENUE.ID = @REVENUEID
                 and APPLICATIONCODE in (0,4,7)
                 and TYPECODE in (0,4,9)
                 and INSTALLMENTSPLITPAYMENT.ID is null
                 for xml raw('ITEM'),type,elements,root('ADDITIONALAPPLICATIONSSTREAM'),BINARY BASE64)
            end
            else if @TYPECODE = 1 or @TYPECODE = 3
            begin
                set @SPLITS = 
                (select
                    '00000000-0000-0000-0000-000000000000' as ID,
                    case when DESIGNATIONID = @OLDGUIDVALUE then @NEWGUIDVALUE else DESIGNATIONID end as DESIGNATIONID,
                    TRANSACTIONAMOUNT as AMOUNT,
                    ROW_NUMBER() OVER(order by REVENUESPLIT.dateadded) as SEQUENCE,
                    REVENUESPLIT.APPLICATIONCODE,
                    REVENUESPLIT.TYPECODE,
                    1 as DIDCAMPAIGNSDEFAULT,
                    case when DESIGNATIONID = @OLDGUIDVALUE then
                    (select
                        '00000000-0000-0000-0000-000000000000' as ID,
                        CAMPAIGNID,
                        CAMPAIGNSUBPRIORITYID,
                        '00000000-0000-0000-0000-000000000000' as REVENUESPLITCAMPAIGNID
                     from dbo.UFN_DESIGNATION_GETCAMPAIGNSTODEFAULT(@NEWGUIDVALUE, @CURRENTDATE)
                     for xml raw('ITEM'),type,elements,BINARY BASE64)
                    else
                    (select
                        '00000000-0000-0000-0000-000000000000' as ID,
                        CAMPAIGNID,
                        CAMPAIGNSUBPRIORITYID,
                        REVENUESPLITCAMPAIGN.ID as REVENUESPLITCAMPAIGNID
                     from dbo.REVENUESPLITCAMPAIGN
                     where REVENUESPLITCAMPAIGN.REVENUESPLITID = REVENUESPLIT.ID
                     for xml raw('ITEM'),type,elements,BINARY BASE64) end as CAMPAIGNS,
                    coalesce(REVENUESPLITGIFTAID.DECLINESGIFTAID, cast(0 as bit)) as DECLINESGIFTAID,
                    coalesce(REVENUESPLITGIFTAID.ISSPONSORSHIP, cast(0 as bit)) as ISGIFTAIDSPONSORSHIP,
                    REVENUESPLIT.ID as REVENUESPLITID,
                    REVENUESPLIT.TRANSACTIONCURRENCYID
                 from dbo.REVENUESPLIT
                 left outer join dbo.REVENUESPLITGIFTAID on REVENUESPLITGIFTAID.ID = REVENUESPLIT.ID
                 where REVENUEID = @REVENUEID
                 for xml raw('ITEM'),type,elements,root('SPLITS'),BINARY BASE64);
            end

            while (select @APPLICATIONSOLICITORS.exist('(/APPLICATIONSOLICITORS/ITEM/ADDITIONALAPPLICATIONDESIGNATIONID[fn:upper-case(text()[1])=fn:upper-case(sql:variable("@OLDGUIDVALUE"))])')) = 1
            begin
                set @APPLICATIONSOLICITORS.modify('replace value of (/APPLICATIONSOLICITORS/ITEM/ADDITIONALAPPLICATIONDESIGNATIONID[fn:upper-case(text()[1])=fn:upper-case(sql:variable("@OLDGUIDVALUE"))]/text())[1] with sql:variable("@NEWGUIDVALUE")')
            end

        end
        else if @OVERWRITEFIELD = 'Solicitor'
        begin
            while (select @APPLICATIONSOLICITORS.exist('(/APPLICATIONSOLICITORS/ITEM/SOLICITORS/ITEM/CONSTITUENTID[fn:upper-case(text()[1])=fn:upper-case(sql:variable("@OLDGUIDVALUE"))])')) = 1
            begin
                set @APPLICATIONSOLICITORS.modify('replace value of (/APPLICATIONSOLICITORS/ITEM/SOLICITORS/ITEM/CONSTITUENTID[fn:upper-case(text()[1])=fn:upper-case(sql:variable("@OLDGUIDVALUE"))]/text())[1] with sql:variable("@NEWGUIDVALUE")')
            end
        end
    end

    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

    begin try
        if @CREDITCARDID is null
        begin
            exec dbo.USP_CREDITCARD_SAVE
                @ID = @CREDITCARDID output,
                @CREDITCARDTOKEN = null,
                @CARDHOLDERNAME = @CARDHOLDERNAME,
                @CREDITCARDPARTIALNUMBER = @CREDITCARDNUMBER,
                @CREDITTYPECODEID = @CREDITTYPECODEID,
                @EXPIRESON = @EXPIRESON,
                @CHANGEAGENTID = @CHANGEAGENTID,
                @CURRENTDATE = @CURRENTDATE;
        end

        --Insert the value in USERMODIFIEDBENEFITS field, based on which it decides whether to show or not benefits after appeal change, as it gets done in Revenue Update Batch.

        insert into dbo.BATCHREVENUE
        (
            ID, BATCHID, REVENUEID, REVENUESPLITID, CONSTITUENTID, DATE, PAYMENTMETHODCODE, DONOTACKNOWLEDGE, CHECKDATE, CHECKNUMBER, REFERENCEDATE, REFERENCENUMBER, 
            CREDITCARDID, AUTHORIZATIONCODE, CONSTITUENTACCOUNTID, AMOUNT, TYPECODE, RECEIPTAMOUNT, 
            DONOTRECEIPT, SEQUENCE, INSTALLMENTFREQUENCYCODE, INSTALLMENTSTARTDATE,
            INSTALLMENTENDDATE, NUMBEROFINSTALLMENTS, FINDERNUMBER, SOURCECODE, APPEALID, FINDERNUMBERISVALID, 
            POSTDATE, POSTSTATUSCODE, PROPERTYSUBTYPECODEID, GIFTINKINDSUBTYPECODEID,
            SENDPLEDGEREMINDER, SALEDATE, SALEAMOUNT, BROKERFEE, SALEPOSTSTATUSCODE, SALEPOSTDATE, ISSUER, NUMBEROFUNITS,
            SYMBOL, MEDIANPRICE,
            GIVENANONYMOUSLY, PLEDGESUBTYPEID,
            MAILINGID, CHANNELCODEID, RECEIPTTYPECODE, 
            ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, OTHERPAYMENTMETHODCODEID, REFERENCE, 
            GLREVENUECATEGORYMAPPINGID, OTHERTYPECODEID, OPPORTUNITYID, DIRECTDEBITRESULTCODE, LOWPRICE, HIGHPRICE,
            STANDINGORDERSETUP, STANDINGORDERSETUPDATE, DECLINESGIFTAID, DDISOURCECODEID, DDISOURCEDATE,
            AMOUNTFORVAT, VATTAXRATEID, VATAMOUNT, APPLICATIONINFO, REVENUELOOKUPID, MGGENERATED, MGALTERED,
            GIFTINKINDITEMNAME, GIFTINKINDDISPOSITIONCODE, GIFTINKINDNUMBEROFUNITS, GIFTINKINDFAIRMARKETVALUE, DIRECTDEBITISREJECTED, ISGIFTAIDSPONSORSHIP,
            LOCKBOXID, LOCKBOXBATCHNUMBER, LOCKBOXBATCHSEQUENCE, PDACCOUNTSYSTEMID, ISADJUSTMENT, ADJUSTMENTDATE, ADJUSTMENTPOSTDATE, ADJUSTMENTREASON, ADJUSTMENTREASONCODEID, ADJUSTMENTPOSTSTATUSCODE,
            ADJPAYMENT_DATE, ADJPAYMENT_POSTDATE, ADJPAYMENT_DETAILS, ADJPAYMENT_REASONCODEID,
            ORIGINALAPPLICATIONINFO, BASECURRENCYID, TRANSACTIONCURRENCYID,
            BASEEXCHANGERATEID, EXCHANGERATE, USESYSTEMGENERATEDREFERENCENUMBER, INSTALLMENTSCHEDULESEEDDATE,INSTALLMENTAMOUNT,SPLITSCHEDULEOPTIONCODE, USERMODIFIEDBENEFITS, STANDINGORDERREFERENCENUMBER
        )
        values 
        (
            @ID, @BATCHID, @REVENUEID, @REVENUESPLITID, @CONSTITUENTID, @DATE, @PAYMENTMETHODCODE, @DONOTACKNOWLEDGE, @CHECKDATE, @CHECKNUMBER, coalesce(@REFERENCEDATE, '00000000'), coalesce(@REFERENCENUMBER, ''),
            @CREDITCARDID, @AUTHORIZATIONCODE, @CONSTITUENTACCOUNTID, @AMOUNT, @TYPECODE, @RECEIPTAMOUNT
            @DONOTRECEIPT, @SEQUENCE, @INSTALLMENTFREQUENCYCODE, @INSTALLMENTSTARTDATE,
            @INSTALLMENTENDDATE, @NUMBEROFINSTALLMENTS, @FINDERNUMBER, @SOURCECODE, @APPEALID, case @FINDERNUMBER when 0 then 0 else 1 end
            @POSTDATE, @POSTSTATUSCODE, @PROPERTYSUBTYPECODEID, @GIFTINKINDSUBTYPECODEID,
            @SENDPLEDGEREMINDER, @SALEDATE, @SALEAMOUNT, @BROKERFEE, @SALEPOSTSTATUSCODE, @SALEPOSTDATE, @ISSUER, @NUMBEROFUNITS,
            @SYMBOL, @MEDIANPRICE,
            @GIVENANONYMOUSLY, @PLEDGESUBTYPEID,
            @MAILINGID, @CHANNELCODEID, @RECEIPTTYPECODE
            @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @OTHERPAYMENTMETHODCODEID, @REFERENCE,
            @CATEGORYCODEID, @OTHERTYPECODEID, @OPPORTUNITYID, @DIRECTDEBITRESULTCODE, @LOWPRICE, @HIGHPRICE,
            coalesce(@STANDINGORDERSETUP, 0), @STANDINGORDERSETUPDATE, @DECLINESGIFTAID, @DDISOURCECODEID, @DDISOURCEDATE
            @AMOUNTFORVAT, @VATTAXRATEID, @VATAMOUNT, @APPLICATIONINFO, coalesce(rtrim(ltrim(@REVENUELOOKUPID)),''), 0, 0,
            @GIFTINKINDITEMNAME, @GIFTINKINDDISPOSITIONCODE, @GIFTINKINDNUMBEROFUNITS, @GIFTINKINDFAIRMARKETVALUE, @DIRECTDEBITISREJECTED, @ISGIFTAIDSPONSORSHIP,
            @LOCKBOXID, @LOCKBOXBATCHNUMBER, @LOCKBOXBATCHSEQUENCE, @PDACCOUNTSYSTEMID, coalesce(@ISADJUSTMENT, 0), @ADJUSTMENTDATE, @ADJUSTMENTPOSTDATE, coalesce(@ADJUSTMENTREASON, ''), @ADJUSTMENTREASONCODEID, coalesce(@ADJUSTMENTPOSTSTATUSCODE, 1),
            @ADJUSTMENTDATE, @ADJUSTMENTPOSTDATE, coalesce(@ADJUSTMENTREASON, ''), @ADJUSTMENTREASONCODEID,
            @APPLICATIONINFO, @BASECURRENCYID, @TRANSACTIONCURRENCYID,
            @BASEEXCHANGERATEID, @EXCHANGERATE, @USESYSTEMGENERATEDREFERENCENUMBER, @INSTALLMENTSCHEDULESEEDDATE,@INSTALLMENTAMOUNT, coalesce(@SPLITSCHEDULEOPTIONCODE, 0), @USERMODIFIEDBENEFITS, coalesce(@STANDINGORDERREFERENCENUMBER, '')
        );

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

        if not @ADDITIONALAPPLICATIONSSTREAM is null                  
            exec dbo.USP_REVENUEBATCH_ADDITIONALAPPLICATIONWITHCHILDREN_UPDATEFROMXML @ID, @ADDITIONALAPPLICATIONSSTREAM, @DATE, @CHANGEAGENTID, @CURRENTDATE;

        declare @APPLICATIONCODE tinyint;
        declare @SINGLEAPPLICATIONID uniqueidentifier;
        declare @ADDITIONALAPPLICATIONCOUNT int;
        declare @SPLITCOUNT int;

        if @APPLICATIONINFO is not null
            if len(@APPLICATIONINFO) > 0
                if len(@APPLICATIONINFO) = 3
                    set @APPLICATIONCODE = cast(substring(@APPLICATIONINFO, 3, 1) as tinyint);

        select @ADDITIONALAPPLICATIONCOUNT = count(*) from @ADDITIONALAPPLICATIONSSTREAM.nodes('/ADDITIONALAPPLICATIONSSTREAM/ITEM') T(c)                
        select @SPLITCOUNT = count(*) from @SPLITS.nodes('/SPLITS/ITEM') T(c)                
        declare @REVENUESTREAMSCOUNT int;
        select @REVENUESTREAMSCOUNT = count(*) from @REVENUESTREAMS.nodes('/REVENUESTREAMS/ITEM') T(c)  

        -- deal with payment payment application recognitions/solicitors

        if @REVENUESTREAMSCOUNT > 0
             exec dbo.USP_REVENUEUPDATEBATCH_ADDPAYMENTRECOGNITIONSANDSOLICITORS @ID, @APPLICATIONRECOGNITIONS, @APPLICATIONSOLICITORS, @REVENUESTREAMS, @CHANGEAGENTID, @CURRENTDATE                            

        if @APPLICATIONCODE is not null and @SPLITCOUNT > 1 and @TYPECODE = 0
            exec dbo.USP_REVENUEBATCH_ADDRECOGNITIONSANDSOLICITORS @ID, @APPLICATIONRECOGNITIONS, @APPLICATIONSOLICITORS, @SPLITS, @APPLICATIONCODE, NULL, @CHANGEAGENTID, @CURRENTDATE
        else if @APPLICATIONCODE is not null and @ADDITIONALAPPLICATIONCOUNT >= 1 and @TYPECODE = 0
            exec dbo.USP_REVENUEUPDATEBATCH_ADDRECOGNITIONSANDSOLICITORS @ID, @APPLICATIONRECOGNITIONS, @APPLICATIONSOLICITORS, @ADDITIONALAPPLICATIONSSTREAM, @APPLICATIONCODE, @CHANGEAGENTID, @CURRENTDATE;
        else if @APPLICATIONCODE is null and @SINGLEAPPLICATIONID is null and @ADDITIONALAPPLICATIONCOUNT >= 1 and @TYPECODE = 0                      
            exec dbo.USP_REVENUEUPDATEBATCH_ADDRECOGNITIONSANDSOLICITORS @ID, @APPLICATIONRECOGNITIONS, @APPLICATIONSOLICITORS, @ADDITIONALAPPLICATIONSSTREAM, NULL, @CHANGEAGENTID, @CURRENTDATE;
        else
            exec dbo.USP_REVENUEUPDATEBATCH_ADDRECOGNITIONSANDSOLICITORS @ID, @APPLICATIONRECOGNITIONS, @APPLICATIONSOLICITORS, @SPLITS, 0, @CHANGEAGENTID, @CURRENTDATE;

        -- Add Revenue Benefits if they are exist, else appeal benefits, as it gets done in RUB.


      if @USERMODIFIEDBENEFITS = 1 or @OVERWRITE = 0
      begin
                if not @REVENUEBENEFITS is null
                    exec dbo.USP_REVENUEBATCH_GETBENEFITS_ADDFROMXML @ID, @REVENUEBENEFITS, @CHANGEAGENTID;

                if not @REVENUEPERCENTAGEBENEFITS is null
                    exec dbo.USP_REVENUEBATCH_GETBENEFITSPCT_ADDFROMXML @ID, @REVENUEPERCENTAGEBENEFITS, @CHANGEAGENTID;
            end
            else
            begin
                    if not @APPEALBENEFITS is null
                                exec dbo.USP_REVENUEBATCH_GETBENEFITS_ADDFROMXML @ID, @APPEALBENEFITS, @CHANGEAGENTID;

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

        if not @LETTERS is null
            exec dbo.USP_REVENUEUPDATEBATCH_GETLETTERS_ADDFROMXML @ID, @LETTERS, @CHANGEAGENTID;

        if not @NOTES is null
            exec dbo.USP_REVENUEUPDATEBATCH_GETNOTES_ADDFROMXML @ID, @NOTES, @CHANGEAGENTID;

        if not @INSTALLMENTS is null
        begin
            set @INSTALLMENTS = (select
                     case when T.c.value('(ID)[1]','uniqueidentifier') is null or T.c.value('(ID)[1]','uniqueidentifier') = '00000000-0000-0000-0000-000000000000' then newid() else T.c.value('(ID)[1]','uniqueidentifier') end as ID,
                     T.c.value('(INSTALLMENTID)[1]','uniqueidentifier') AS 'INSTALLMENTID',
                     T.c.value('(DATE)[1]','datetime') AS 'DATE',
                     T.c.value('(AMOUNT)[1]','money') AS 'AMOUNT',
                     T.c.value('(BALANCE)[1]','money') AS 'BALANCE',
                     T.c.value('(APPLIED)[1]','money') AS 'APPLIED',
                     T.c.value('(SEQUENCE)[1]','int') AS 'SEQUENCE',
                 T.c.value('(RECEIPTAMOUNT)[1]','money') AS 'RECEIPTAMOUNT',
                     (select 
                ID,
                INSTALLMENTSPLITID,
                AMOUNT, 
                APPLIED,
                case when @OVERWRITE = 1 and @OVERWRITEFIELD = 'Designation' and DESIGNATIONID = @OLDGUIDVALUE then @NEWGUIDVALUE else DESIGNATIONID end as DESIGNATIONID
                        from dbo.UFN_REVENUEUPDATEBATCH_GETINSTALLMENTSPLITS_FROMITEMLISTXML(T.c.query('(INSTALLMENTSPLITS)[1]'))
                        for xml raw('ITEM'),type,elements,BINARY BASE64) as 'INSTALLMENTSPLITS'
                    from @INSTALLMENTS.nodes('/INSTALLMENTS/ITEM') T(c)
                    for xml raw('ITEM'),type,elements,root('INSTALLMENTS'),binary base64);

            exec dbo.USP_REVENUEUPDATEBATCH_GETINSTALLMENTS_ADDFROMXML @ID, @INSTALLMENTS, @CHANGEAGENTID;

            declare @BATCHINSTALLMENTID uniqueidentifier;
            declare @INSTALLMENTSPLITS xml;
            declare INSTALLMENTSPLITS cursor local fast_forward for 
            select 
                T.c.value('(ID)[1]','uniqueidentifier') as BATCHINSTALLMENTID,
                cast(T.c.query('INSTALLMENTSPLITS') as xml) as INSTALLMENTSPLITS
            from @INSTALLMENTS.nodes('/INSTALLMENTS/ITEM') T(c)
            open INSTALLMENTSPLITS
            fetch next from INSTALLMENTSPLITS into @BATCHINSTALLMENTID, @INSTALLMENTSPLITS

            while @@FETCH_STATUS = 0
            begin

                exec dbo.USP_REVENUEUPDATEBATCH_GETINSTALLMENTSPLITS_ADDFROMXML @BATCHINSTALLMENTID, @INSTALLMENTSPLITS, @CHANGEAGENTID;

            fetch next from INSTALLMENTSPLITS into @BATCHINSTALLMENTID, @INSTALLMENTSPLITS
            end
            close INSTALLMENTSPLITS
            deallocate INSTALLMENTSPLITS
        end

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

        if not @REVENUESTREAMS is null      
            exec dbo.USP_REVENUEBATCH_REVENUEAPPLICATIONS_ADDFROMXML_2 @ID, @REVENUESTREAMS, @CHANGEAGENTID, @CURRENTDATE, @CURRENTAPPUSERID;

        exec dbo.USP_REVENUEBATCH_ENHANCEDMATCHINGGIFTSWITHCHILDREN_UPDATEFROMXML @ID, @MATCHINGGIFTS, @CHANGEAGENTID, @CURRENTDATE;

        if @APPLICATIONBUSINESSUNITS is not null
                exec dbo.USP_REVENUEBATCH_ADDBUSINESSUNITS @ID, @APPLICATIONBUSINESSUNITS, @TYPECODE    
    end try

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

    return 0;
end