USP_SALESORDER_ADDPAYMENTREVENUE

Adds payment revenue details for a sales order payment.

Parameters

Parameter Parameter Type Mode Description
@SALESORDERID uniqueidentifier IN
@REVENUEID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN
@ORDERPAYMENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_SALESORDER_ADDPAYMENTREVENUE
(
    @SALESORDERID uniqueidentifier,
    @REVENUEID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier,
    @CURRENTDATE datetime,
    @ORDERPAYMENTID uniqueidentifier = null
)
as
begin
    set nocount on;

    declare @SALESMETHODTYPECODE tinyint;
    select 
        @SALESMETHODTYPECODE = SALESMETHODTYPECODE
    from 
        dbo.SALESORDER with (nolock)
    where 
        ID = @SALESORDERID;

    declare @PDACCOUNTSYSTEMID uniqueidentifier;
    declare @ALLOWGLDISTRIBUTIONS bit;
    declare @HASSPONSORSHIPS bit = 0;
    declare @CURRENCYISO nvarchar(3);

  if exists(select 'x' from dbo.SALESORDERITEM where SALESORDERID = @SALESORDERID and TYPECODE = 12
  begin
    set @HASSPONSORSHIPS = 1;

    select top 1
        @PDACCOUNTSYSTEMID = SALESORDERITEMSPONSORSHIP.PDACCOUNTSYSTEMID,
        @ALLOWGLDISTRIBUTIONS = PDACCOUNTSYSTEM.ALLOWGLDISTRIBUTIONS,
        @CURRENCYISO = CURRENCYISO
      from dbo.SALESORDERITEMSPONSORSHIP
      inner join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMSPONSORSHIP.ID
    inner join dbo.PDACCOUNTSYSTEM on PDACCOUNTSYSTEM.ID = SALESORDERITEMSPONSORSHIP.PDACCOUNTSYSTEMID
      where SALESORDERITEM.SALESORDERID = @SALESORDERID and SALESORDERITEM.TOTAL > 0;
   end

   if @PDACCOUNTSYSTEMID is null
   begin
     /** Bug Fix 177959 - Don't hardcode the PDACCOUNTSYSTEMID instead pick the default one **/  
      select
          @PDACCOUNTSYSTEMID = ID,
          @ALLOWGLDISTRIBUTIONS = ALLOWGLDISTRIBUTIONS
      from 
          dbo.UFN_PDACCOUNTSYSTEM_DEFAULTORSYSTEM();
   end

    declare @PAYMENTAMOUNT money;

    if @SALESMETHODTYPECODE = 3 begin
        select @PAYMENTAMOUNT = AMOUNT from dbo.[SALESORDERPAYMENT] where [PAYMENTID] = @ORDERPAYMENTID;
        exec dbo.USP_SALESORDER_CREATETOPDOWNDISTRIBUTIONS @REVENUEID, @SALESORDERID, @PDACCOUNTSYSTEMID, @ALLOWGLDISTRIBUTIONS, @CURRENTDATE, @CHANGEAGENTID, @ORDERPAYMENTID, @PAYMENTAMOUNT
    end
    else begin
        if @ORDERPAYMENTID is not null begin
            select @PAYMENTAMOUNT = AMOUNT from dbo.[SALESORDERPAYMENT] where [PAYMENTID] = @ORDERPAYMENTID;

            --insert the payment applications

            --This will copy the applications from the order revenue and appropriately split a partial payment

            exec dbo.USP_ORDER_COPYSPLITS @REVENUEID, @ORDERPAYMENTID, @CHANGEAGENTID, @CURRENTDATE, @PAYMENTAMOUNT, 10 

            exec dbo.USP_PDACCOUNTSYSTEM_LINKTOREVENUE             
                @ID = @ORDERPAYMENTID,
                @PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID,
                @CHANGEDATE = @CURRENTDATE,
                @CHANGEAGENTID = @CHANGEAGENTID                     

            if @ALLOWGLDISTRIBUTIONS = 1
                --gl distributions                    

                exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION    @ORDERPAYMENTID, @CHANGEAGENTID, @CURRENTDATE
        end
        else begin
            --create splits for sales order payments

            declare @PAYMENTID uniqueidentifier;
            declare @DEPOSITPOSTDATE date;
            declare @DEPOSITID uniqueidentifier;

            declare PAYMENTS_CURSOR cursor LOCAL FAST_FORWARD for
            select 
                PAYMENTID, 
                AMOUNT
            from 
                dbo.SALESORDERPAYMENT with (nolock)
            where 
                SALESORDERID = @SALESORDERID;

            open PAYMENTS_CURSOR
            fetch next from PAYMENTS_CURSOR into @PAYMENTID, @PAYMENTAMOUNT

            while @@FETCH_STATUS = 0
            begin
                --insert the payment applications

                --This will copy the applications from the order revenue and appropriately split a partial payment

                exec dbo.USP_ORDER_COPYSPLITS @REVENUEID, @PAYMENTID, @CHANGEAGENTID, @CURRENTDATE, @PAYMENTAMOUNT, 10 

                --------------------------------------------

                -- add sponsorship applications

                if @HASSPONSORSHIPS = 1 begin
                    declare @CONSTITUENTID uniqueidentifier
                    declare @TRANSACTIONDATE datetime
                    declare @TRANSACTIONCURRENCYID uniqueidentifier;
                    declare @BASECURRENCYID uniqueidentifier;

                    select @CONSTITUENTID = CONSTITUENTID,
                            @TRANSACTIONDATE = dbo.UFN_DATE_GETEARLIESTTIME(TRANSACTIONDATE)
                    from dbo.SALESORDER with (nolock)
                    where ID = @SALESORDERID;

                    /*
                        AS: WI 224281 - Pick the base currency of the account system's currency set as the
                        transaction currency. This change will only impact Sponsorship transactions.
                        LH: WI 326139  - Changing how base currency and transaction currency is determined.
                        base currency will be determined by the account system's base currency and the 
                        transaction currency will be determined by the currency on the merchant's account.
                        If the currencyISO on the incoming transaction is null, use the existing code from
                        WI 224281
                    */
                    if @CURRENCYISO is not null
                    begin
                        set @TRANSACTIONCURRENCYID = dbo.UFN_CURRENCY_GETCURRENCYFROMISO(@CURRENCYISO);
                        --

                        select @BASECURRENCYID = CURRENCYSET.BASECURRENCYID
                        from dbo.PDACCOUNTSYSTEM
                        inner join dbo.CURRENCYSET on CURRENCYSET.ID = PDACCOUNTSYSTEM.CURRENCYSETID
                        where PDACCOUNTSYSTEM.ID = @PDACCOUNTSYSTEMID
                    end
                    else
                    begin
                        select @TRANSACTIONCURRENCYID = CURRENCYSET.BASECURRENCYID,
                        @BASECURRENCYID = CURRENCYSET.BASECURRENCYID
                        from dbo.PDACCOUNTSYSTEM
                        inner join dbo.CURRENCYSET on CURRENCYSET.ID = PDACCOUNTSYSTEM.CURRENCYSETID
                        where PDACCOUNTSYSTEM.ID = @PDACCOUNTSYSTEMID
                    end

                    update dbo.REVENUE_EXT set
                        RECEIPTAMOUNT = @PAYMENTAMOUNT,
                        --WI#274833  Get proper receipt type for (3=recurring gift payment)

                        RECEIPTTYPECODE = dbo.UFN_CONSTITUENT_GETRECEIPTPREFERENCE(@CONSTITUENTID,3),
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE
                    where ID = @PAYMENTID;

                    declare @TOTAL money, @ORGANIZATIONAPPLIEDAMOUNT money,
                    @DESIGNATIONID uniqueidentifier,@EXCHANGERATEID uniqueidentifier

                    declare @BASEEXCHANGERATEID uniqueidentifier,@BASEAMOUNT money
                    declare @ORGANIZATIONCURRENCYID uniqueidentifier
                    set  @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
                    -- WI 257256  We need the proper org exchange rate and org amount on the revenued record.

                    set @ORGANIZATIONAPPLIEDAMOUNT = @PAYMENTAMOUNT
                    set @BASEAMOUNT =  @PAYMENTAMOUNT

                    set @BASEEXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATEST(@TRANSACTIONCURRENCYID, @BASECURRENCYID, @CURRENTDATE,1,null)

                    if @BASEEXCHANGERATEID is not null
                        set @BASEAMOUNT = dbo.UFN_CURRENCY_CONVERT(@PAYMENTAMOUNT, @BASEEXCHANGERATEID)

                    if @BASECURRENCYID <> @ORGANIZATIONCURRENCYID
                    begin
                        set @EXCHANGERATEID = dbo.UFN_CURRENCYEXCHANGERATE_GETLATESTORGANIZATIONRATE(@BASECURRENCYID,@ORGANIZATIONCURRENCYID,@CURRENTDATE,null,null)

                        if @EXCHANGERATEID is not null
                            set @ORGANIZATIONAPPLIEDAMOUNT = dbo.UFN_CURRENCY_CONVERTTOORGANIZATIONCURRENCY(@BASEAMOUNT,@EXCHANGERATEID,@PAYMENTAMOUNT)
                    end
                    else
                        set @ORGANIZATIONAPPLIEDAMOUNT = @BASEAMOUNT

                    update dbo.FINANCIALTRANSACTION set
                        TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
                        ORGEXCHANGERATEID = @EXCHANGERATEID,
                        ORGAMOUNT = @ORGANIZATIONAPPLIEDAMOUNT,
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE,
                        BASEEXCHANGERATEID = @BASEEXCHANGERATEID,
                        BASEAMOUNT = @BASEAMOUNT
                    where ID = @PAYMENTID;

                    declare SPONSORSHIPSPLITS cursor local fast_forward for 
                    select
                        FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID,
                        SALESORDERITEM.TOTAL,
                        SALESORDERITEMSPONSORSHIP.ID
                    from 
                        dbo.SALESORDERITEMSPONSORSHIP
                    inner join 
                        dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMSPONSORSHIP.ID
                    inner join 
                        dbo.SPONSORSHIP on SPONSORSHIP.ID = SALESORDERITEMSPONSORSHIP.SPONSORSHIPID
                    inner join 
                        dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = SPONSORSHIP.REVENUESPLITID
                    where 
                        SALESORDERITEM.SALESORDERID = @SALESORDERID
                        and SALESORDERITEM.TOTAL > 0;

                    declare @APPLICATIONID uniqueidentifier
                    declare @APPLICATIONAMOUNT money
                    declare @SALESORDERITEMID uniqueidentifier

                    OPEN SPONSORSHIPSPLITS
                    fetch next from SPONSORSHIPSPLITS into @APPLICATIONID, @APPLICATIONAMOUNT, @SALESORDERITEMID

                    while @@FETCH_STATUS = 0
                    begin
                        exec dbo.USP_RECURRINGGIFT_ADDPAYMENT @PAYMENTID, @APPLICATIONID, @APPLICATIONAMOUNT, @CONSTITUENTID, @TRANSACTIONDATE,    @CURRENTDATE, @CHANGEAGENTID
                        fetch next from SPONSORSHIPSPLITS into @APPLICATIONID, @APPLICATIONAMOUNT, @SALESORDERITEMID
                    end

                    close SPONSORSHIPSPLITS
                    deallocate SPONSORSHIPSPLITS

                    --insert statements for additional donation on sponsorship

                    declare SPONSORSHIPADDITIONALSPLITS cursor local fast_forward for 
                    select
                        TOTAL,
                        DESIGNATIONID
                    from 
                        dbo.SALESORDERITEM
                    inner join 
                        dbo.SALESORDERITEMDONATION on SALESORDERITEM.ID = SALESORDERITEMDONATION.ID
                    where 
                        SALESORDERITEM.CATEGORYNAME = 'Sponsorship' and SALESORDERITEM.TYPECODE = 2 -- Donation

                        and SALESORDERITEM.SALESORDERID = @SALESORDERID;

                    OPEN SPONSORSHIPADDITIONALSPLITS
                    fetch next from SPONSORSHIPADDITIONALSPLITS into @TOTAL, @DESIGNATIONID

                    while @@FETCH_STATUS = 0
                    begin
                        declare @LINEITEMID uniqueidentifier = newid();
                        insert into dbo.FINANCIALTRANSACTIONLINEITEM 
                        (
                            ID,
                            FINANCIALTRANSACTIONID,
                            TYPECODE,
                            BASEAMOUNT,
                            TRANSACTIONAMOUNT,
                            ORGAMOUNT,
                            POSTDATE,
                            ADDEDBYID,
                            CHANGEDBYID,
                            DATEADDED,
                            DATECHANGED
                        ) 
                        values 
                        (
                            @LINEITEMID,
                            @PAYMENTID,
                            0,
                            dbo.UFN_CURRENCY_CONVERT(@TOTAL, @BASEEXCHANGERATEID),
                            @TOTAL,
                            dbo.UFN_CURRENCY_CONVERTTOORGANIZATIONCURRENCY(@TOTAL, @EXCHANGERATEID, @TOTAL),
                            isnull(@DEPOSITPOSTDATE, @TRANSACTIONDATE),
                            @CHANGEAGENTID,
                            @CHANGEAGENTID,
                            @CURRENTDATE,
                            @CURRENTDATE
                        );

                        insert into dbo.REVENUESPLIT_EXT 
                        (
                            ID,
                            APPLICATIONCODE,
                            DESIGNATIONID,
                            TYPECODE,
                            ADDEDBYID,
                            CHANGEDBYID,
                            DATEADDED,
                            DATECHANGED
                        )
                        values 
                        (
                            @LINEITEMID,
                            0,
                            @DESIGNATIONID,
                            17,
                            @CHANGEAGENTID,
                            @CHANGEAGENTID,
                            @CURRENTDATE,
                            @CURRENTDATE
                        );

                        -- create recognitions

                        declare @REVENUEGIVENANONYMOUSLY bit;
                        select @REVENUEGIVENANONYMOUSLY = R.GIVENANONYMOUSLY
                        from dbo.REVENUE_EXT R
                        where R.ID = @PAYMENTID;

                        insert into dbo.REVENUERECOGNITION
                        (
                            REVENUESPLITID, 
                            CONSTITUENTID, 
                            AMOUNT,
                            EFFECTIVEDATE,
                            REVENUERECOGNITIONTYPECODEID,
                            ORGANIZATIONAMOUNT,
                            ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, BASECURRENCYID
                        )
                        select
                            @LINEITEMID,
                            RECOGNITIONS.CONSTITUENTID,
                            RECOGNITIONS.AMOUNT,
                            @TRANSACTIONDATE,
                            RECOGNITIONS.REVENUERECOGNITIONTYPECODEID,
                            dbo.UFN_CURRENCY_CONVERTTOORGANIZATIONCURRENCY(RECOGNITIONS.AMOUNT, @EXCHANGERATEID, RECOGNITIONS.AMOUNT),
                            @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE, @BASECURRENCYID
                        from 
                            dbo.UFN_REVENUEDETAIL_GETDEFAULTRECOGNITIONS(@REVENUEGIVENANONYMOUSLY, @CONSTITUENTID, @TOTAL, @TRANSACTIONDATE, null) as RECOGNITIONS;

                        fetch next from SPONSORSHIPADDITIONALSPLITS into @TOTAL, @DESIGNATIONID
                    end

                    close SPONSORSHIPADDITIONALSPLITS
                    deallocate SPONSORSHIPADDITIONALSPLITS
                end
                --------------------------------------------


                exec dbo.USP_PDACCOUNTSYSTEM_LINKTOREVENUE 
                    @ID = @PAYMENTID
                    @PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID
                    @CHANGEDATE = @CURRENTDATE
                    @CHANGEAGENTID = @CHANGEAGENTID;

                if @ALLOWGLDISTRIBUTIONS = 1
                begin
                    --gl distributions                    

                    exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION    @PAYMENTID,    @CHANGEAGENTID, @CURRENTDATE

                    if @DEPOSITID is not null
                        exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @PAYMENTID, @DEPOSITID, @CHANGEAGENTID, @CURRENTDATE;
                end

                fetch next from PAYMENTS_CURSOR into @PAYMENTID, @PAYMENTAMOUNT
            end

            close PAYMENTS_CURSOR
            deallocate PAYMENTS_CURSOR
        end
    end

    return 0;
end