USP_SALESORDER_ADDREVENUE

Adds a revenue record for a sales order.

Parameters

Parameter Parameter Type Mode Description
@SALESORDERID uniqueidentifier IN
@REVENUEID uniqueidentifier IN
@TRANSACTIONDATE datetime IN
@CONSTITUENTID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN
@ISCOMPLETEDORDEREDITWITHNOADJUSTMENT bit IN
@COMPLETEDORDERADJUSTMENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_SALESORDER_ADDREVENUE
(
    @SALESORDERID uniqueidentifier,
    @REVENUEID uniqueidentifier,
    @TRANSACTIONDATE datetime,
    @CONSTITUENTID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier,
    @CURRENTDATE datetime,
    @ISCOMPLETEDORDEREDITWITHNOADJUSTMENT bit = 0,
    @COMPLETEDORDERADJUSTMENTID uniqueidentifier = null
)
as
begin
    declare @AMOUNT money

    select 
        @AMOUNT = isnull(sum(SALESORDERITEM.TOTAL),0)
    from
        dbo.SALESORDERITEM with (nolock)
    where
        SALESORDERITEM.SALESORDERID = @SALESORDERID and
        SALESORDERITEM.TYPECODE not in (5,12,13) --exclude discounts, sponsorships, and membership promotions


    declare @PDACCOUNTSYSTEMID uniqueidentifier;
    declare @ALLOWGLDISTRIBUTIONS bit;
    declare @CURRENCYSETID uniqueidentifier;

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

    declare @TRANSACTIONCURRENCYID uniqueidentifier;
    select 
        @TRANSACTIONCURRENCYID = BASECURRENCYID
    from 
        dbo.CURRENCYSET
    where 
        ID= @CURRENCYSETID

    if @TRANSACTIONCURRENCYID is null
        set @TRANSACTIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()

    declare @POSTDATE date = null;
    declare @POSTSTATUSCODE tinyint = 3;  -- Do not post


    if @ALLOWGLDISTRIBUTIONS = 1 begin
        set @POSTDATE = @TRANSACTIONDATE;
        set @POSTSTATUSCODE = 1;  -- Not posted

    end

    if @COMPLETEDORDERADJUSTMENTID is null and @ISCOMPLETEDORDEREDITWITHNOADJUSTMENT = 0 begin
        insert into dbo.FINANCIALTRANSACTION
        (
            ID,
            CONSTITUENTID,
            DATE,
            POSTDATE,
            TRANSACTIONAMOUNT,
            BASEAMOUNT,
            ORGAMOUNT,
            TYPECODE,
            POSTSTATUSCODE,
            TRANSACTIONCURRENCYID,
            PDACCOUNTSYSTEMID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        values
        (
            @REVENUEID,
            @CONSTITUENTID,
            @TRANSACTIONDATE,
            @POSTDATE,
            @AMOUNT,
            @AMOUNT,
            @AMOUNT,
            5, --Order

            @POSTSTATUSCODE,
            @TRANSACTIONCURRENCYID,
            @PDACCOUNTSYSTEMID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        );

        declare @REFERENCE nvarchar(255);
        select @REFERENCE = 'Order-' + convert(nvarchar(50),(select SALESORDER.SEQUENCEID from dbo.SALESORDER with (nolock) where SALESORDER.ID = @SALESORDERID));

        insert into dbo.REVENUE_EXT
        (
            ID,
            REFERENCE,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        values
        (    
            @REVENUEID,
            @REFERENCE,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        )

        --Add origination source

        exec dbo.USP_REVENUE_ADDORIGIN @REVENUEID, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;

        update dbo.SALESORDER with (rowlock)
        set REVENUEID = @REVENUEID,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        where ID = @SALESORDERID;

        --add payment method details

        insert into dbo.REVENUEPAYMENTMETHOD 
        (
            ID,
            REVENUEID, 
            PAYMENTMETHODCODE, 
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED
        )
        values 
        (
            newid(),
            @REVENUEID,
            9, -- none

            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        );
    end;

    --create the payment application(s)

    declare @APPLICATIONS table
    (
        ID uniqueidentifier,
        AMOUNT money,
        APPLICATIONCODE tinyint,
        TYPECODE tinyint,
        PROGRAMID uniqueidentifier,
        EVENTID uniqueidentifier,
        FEEID uniqueidentifier,
        TAXID uniqueidentifier,
        SALESORDERITEMID uniqueidentifier,
        RESOURCEID uniqueidentifier,
        VOLUNTEERTYPEID uniqueidentifier,
        EVENTLOCATIONID uniqueidentifier,
        MERCHANDISEPRODUCTINSTANCEID uniqueidentifier
    )

    insert into @APPLICATIONS
    select 
        newid(),
        AMOUNT, 
        APPLICATIONCODE, 
        TYPECODE, 
        PROGRAMID, 
        EVENTID, 
        FEEID, 
        TAXID, 
        SALESORDERITEMID, 
        RESOURCEID, 
        VOLUNTEERTYPEID, 
        EVENTLOCATIONID, 
        MERCHANDISEPRODUCTINSTANCEID
    from 
        dbo.UFN_SALESORDER_GETAPPLICATIONSFORPAYMENT(@SALESORDERID, @AMOUNT)
    where 
        AMOUNT > 0 or 
        (AMOUNT = 0 and TYPECODE = 2 and -- Membership

        (
            select 
                sum(ADDON.TOTAL) 
            from 
                dbo.SALESORDERITEM ADDON
            inner join 
                dbo.SALESORDERITEMMEMBERSHIPADDON on ADDON.ID = SALESORDERITEMMEMBERSHIPADDON.ID
            where 
                SALESORDERITEMMEMBERSHIPADDON.SALESORDERITEMMEMBERSHIPID = SALESORDERITEMID) > 0
        );

    --Add Splits

    insert into dbo.FINANCIALTRANSACTIONLINEITEM
    (
        ID,
        FINANCIALTRANSACTIONID,
        TRANSACTIONAMOUNT,
        BASEAMOUNT,
        ORGAMOUNT,
        POSTDATE,
        POSTSTATUSCODE,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED,
        FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
    )
    select
        temp.ID,
        @REVENUEID,
        temp.AMOUNT,
        temp.AMOUNT,
        temp.AMOUNT,
        @POSTDATE,
        @POSTSTATUSCODE,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE,
        @COMPLETEDORDERADJUSTMENTID
    from 
        @APPLICATIONS temp
    where 
        temp.APPLICATIONCODE not in (1,5); -- Membership and Event Registration


    insert into dbo.REVENUESPLIT_EXT
    (
        ID,
        APPLICATIONCODE,
        DESIGNATIONID,
        TYPECODE,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
    )
    select
        temp.ID,
        temp.APPLICATIONCODE,
        SOID.DESIGNATIONID,
        temp.TYPECODE,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
    from 
        @APPLICATIONS temp
    left join 
        dbo.SALESORDERITEMDONATION as SOID on temp.SALESORDERITEMID = SOID.ID
    where 
        temp.APPLICATIONCODE not in (1,5); -- Membership and Event Registration


    --add revenuesplits to item donation records

    update dbo.SALESORDERITEMDONATION
    set REVENUESPLITID = APPS.ID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from @APPLICATIONS APPS
    where APPS.SALESORDERITEMID = SALESORDERITEMDONATION.ID

    --insert recognitions if appropriate

    --only need to do this in a giving situation, is it necessary for tickets only?

    if @CONSTITUENTID is not null
        exec dbo.USP_REVENUE_CREATERECOGNITIONS @REVENUEID, @CHANGEAGENTID, @CURRENTDATE, null

    declare @APPLICATIONID uniqueidentifier
    declare @MEMBERSHIPS xml
    declare @APPLICATIONAMOUNT money
    declare @APPLICATIONCODE tinyint
    declare @SALESORDERITEMID uniqueidentifier
    declare @MEMBERSHIPTRANSACTIONID uniqueidentifier

    --add membership splits

    if exists
    (
        select 1
        from @APPLICATIONS
        where APPLICATIONCODE = 5
    )
    begin

        declare memberships_cursor cursor LOCAL FAST_FORWARD for
        select 
            SALESORDERITEMMEMBERSHIP.MEMBERSHIPID as APPLICATIONID,
            dbo.UFN_SALESORDER_GETMEMBERSHIPITEMS_TOXML(SALESORDERITEMMEMBERSHIP.ID),
            APPS.AMOUNT,
            APPS.APPLICATIONCODE,
            SALESORDERITEMMEMBERSHIP.ID as ID
        from 
            @APPLICATIONS APPS
        inner join 
            dbo.SALESORDERITEMMEMBERSHIP on APPS.SALESORDERITEMID = SALESORDERITEMMEMBERSHIP.ID
        where 
            APPS.APPLICATIONCODE = 5

        OPEN memberships_cursor
        fetch next from memberships_cursor into
        @APPLICATIONID, @MEMBERSHIPS, @APPLICATIONAMOUNT, @APPLICATIONCODE, @SALESORDERITEMID

        while @@FETCH_STATUS = 0
        begin
            exec dbo.USP_MEMBERSHIP_ADDFROMSALES @REVENUEID, @CONSTITUENTID, @APPLICATIONID output,    @APPLICATIONAMOUNT,    @TRANSACTIONDATE,
                @MEMBERSHIPS, @CURRENTDATE,    @CHANGEAGENTID,    @MEMBERSHIPTRANSACTIONID output

            update dbo.SALESORDERITEMMEMBERSHIP
            set 
                SALESORDERITEMMEMBERSHIP.MEMBERSHIPID = @APPLICATIONID,
                MEMBERSHIPTRANSACTIONID = @MEMBERSHIPTRANSACTIONID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            where SALESORDERITEMMEMBERSHIP.ID = @SALESORDERITEMID

            update dbo.SALESORDERITEMMEMBERSHIPADDON
            set
                MEMBERSHIPID = @APPLICATIONID,
                MEMBERSHIPTRANSACTIONID = @MEMBERSHIPTRANSACTIONID,
                MEMBERSHIPADDONID = MEMBERSHIPADDON.ID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            from 
                dbo.SALESORDERITEMMEMBERSHIPADDON
            inner join 
                dbo.MEMBERSHIPADDON    on MEMBERSHIPADDON.MEMBERSHIPID = @APPLICATIONID and
                    SALESORDERITEMMEMBERSHIPADDON.ADDONID = MEMBERSHIPADDON.ADDONID and
                    MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID = @MEMBERSHIPTRANSACTIONID
            where 
                SALESORDERITEMMEMBERSHIPADDON.SALESORDERITEMMEMBERSHIPID = @SALESORDERITEMID

            insert into dbo.REVENUESPLITORDER
            (
                ID,
                MEMBERSHIPADDONID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                T.addons.value('(SPLITID)[1]','uniqueidentifier'),
                SALESORDERITEMMEMBERSHIPADDON.MEMBERSHIPADDONID,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from @MEMBERSHIPS.nodes('/MEMBERSHIPFIELDS/ITEM/ADDONS/ITEM') T(addons)
            inner join dbo.SALESORDERITEMMEMBERSHIPADDON
                on SALESORDERITEMMEMBERSHIPADDON.ID = T.addons.value('(SALESORDERITEMID)[1]','uniqueidentifier')

            set @MEMBERSHIPTRANSACTIONID = null

            fetch next from memberships_cursor into
                @APPLICATIONID, @MEMBERSHIPS, @APPLICATIONAMOUNT, @APPLICATIONCODE, @SALESORDERITEMID
        end

        close memberships_cursor
        deallocate memberships_cursor

        insert into dbo.REVENUESPLITORDER
        (
            ID, 
            MEMBERSHIPLEVELID,
            DESIGNATIONID,
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED
        )
        select 
            MEMBERSHIPTRANSACTION.REVENUESPLITID,
            MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID,
            null as DESIGNATIONID,
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        from 
            dbo.MEMBERSHIPTRANSACTION
        inner join 
            dbo.FINANCIALTRANSACTIONLINEITEM on MEMBERSHIPTRANSACTION.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
        where 
            FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID

        --Add the associated donation (for contributed memberships) to the revenuesplitorder table

        union all
        select
            FINANCIALTRANSACTIONLINEITEM.ID,
            null as MEMBERSHIPLEVELID,
            REVENUESPLIT_EXT.DESIGNATIONID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        from 
            dbo.MEMBERSHIPTRANSACTION
        inner join 
            dbo.FINANCIALTRANSACTIONLINEITEM on MEMBERSHIPTRANSACTION.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID
        inner join 
            dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
        where 
            FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID
            and REVENUESPLIT_EXT.TYPECODE = 0 -- Gift

            and REVENUESPLIT_EXT.APPLICATIONCODE = 0 -- Donation

    end

    --add event registration splits

    if exists
    (
        select 
            1
        from 
            @APPLICATIONS
        where 
            APPLICATIONCODE = 1
    )
    begin
        declare eventregistrations_cursor cursor LOCAL FAST_FORWARD for
        select 
            SALESORDERITEMEVENTREGISTRATION.REGISTRANTID as APPLICATIONID,
            APPS.AMOUNT,
            APPS.APPLICATIONCODE,
            SALESORDERITEMEVENTREGISTRATION.ID as ID
        from @APPLICATIONS APPS
        inner join 
            dbo.SALESORDERITEMEVENTREGISTRATION on APPS.SALESORDERITEMID = SALESORDERITEMEVENTREGISTRATION.ID
        where 
            APPS.APPLICATIONCODE = 1;

        open eventregistrations_cursor
        fetch next from eventregistrations_cursor into
            @APPLICATIONID, @APPLICATIONAMOUNT, @APPLICATIONCODE, @SALESORDERITEMID

        while @@FETCH_STATUS = 0
        begin
            exec dbo.USP_EVENT_ADDPAYMENT @REVENUEID, @APPLICATIONID, @APPLICATIONAMOUNT, @CURRENTDATE,    @CHANGEAGENTID

            fetch next from eventregistrations_cursor into
                @APPLICATIONID, @APPLICATIONAMOUNT, @APPLICATIONCODE, @SALESORDERITEMID
        end

        close eventregistrations_cursor
        deallocate eventregistrations_cursor

        insert into dbo.REVENUESPLITORDER
        (
            ID, 
            EVENTID, 
            DESIGNATIONID,
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED
        )
        select 
            EVENTREGISTRANTPAYMENT.PAYMENTID,
            case 
                when REVENUESPLIT_EXT.DESIGNATIONID is not null then null
                else REGISTRANT.EVENTID
            end,
            REVENUESPLIT_EXT.DESIGNATIONID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        from dbo.EVENTREGISTRANTPAYMENT
        inner join 
            dbo.REGISTRANT on EVENTREGISTRANTPAYMENT.REGISTRANTID = REGISTRANT.ID
        inner join 
            dbo.FINANCIALTRANSACTIONLINEITEM on EVENTREGISTRANTPAYMENT.PAYMENTID = FINANCIALTRANSACTIONLINEITEM.ID
        inner join 
            dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
        where 
            FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID;
    end

    insert into dbo.REVENUESPLITORDER
    (
        ID, 
        PROGRAMID, 
        EVENTID, 
        FEEID, 
        TAXID, 
        RESOURCEID,
        VOLUNTEERTYPEID, 
        EVENTLOCATIONID, 
        MERCHANDISEPRODUCTINSTANCEID, 
        ADDEDBYID, 
        CHANGEDBYID, 
        DATEADDED, 
        DATECHANGED
    )
    select 
        temp.ID,
        temp.PROGRAMID,
        temp.EVENTID,
        temp.FEEID,
        temp.TAXID,
        temp.RESOURCEID,
        temp.VOLUNTEERTYPEID,
        temp.EVENTLOCATIONID,
        temp.MERCHANDISEPRODUCTINSTANCEID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
    from 
        @APPLICATIONS temp
    where 
        temp.TYPECODE in (5,6,7, 10, 11, 14, 16);

    --add benefits

    exec dbo.USP_SALESORDER_ADDBENEFITS @SALESORDERID, @REVENUEID, @CHANGEAGENTID, @CURRENTDATE

    --add receipt amounts

    exec dbo.USP_SALESORDER_ADDRECEIPTAMOUNTS @SALESORDERID, @REVENUEID, @CHANGEAGENTID, @CURRENTDATE

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

    if @ALLOWGLDISTRIBUTIONS = 1 begin
        --gl distributions

        exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION    @REVENUEID,    @CHANGEAGENTID, @CURRENTDATE
        exec dbo.USP_SAVE_BENEFITGLDISTRIBUTION_SALESORDER @REVENUEID,    @CHANGEAGENTID, @CURRENTDATE
    end
end