USP_ORDER_COPYSPLITS

Copies revenue splits for an order.

Parameters

Parameter Parameter Type Mode Description
@SOURCEID uniqueidentifier IN
@DESTINATIONID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@DATEADDED datetime IN
@DESTINATIONAMOUNT money IN
@APPLICATIONCODE tinyint IN

Definition

Copy


CREATE procedure dbo.USP_ORDER_COPYSPLITS
(
    @SOURCEID uniqueidentifier,
    @DESTINATIONID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier,
    @DATEADDED datetime,
    @DESTINATIONAMOUNT money = null,
    @APPLICATIONCODE tinyint = null
)
as
set nocount on;

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

    if @DESTINATIONAMOUNT is null
        select @DESTINATIONAMOUNT = AMOUNT from dbo.REVENUE where ID = @DESTINATIONID ;

    declare @MAPPING table
    (
        REVENUESPLITID uniqueidentifier,
        PAYMENTSPLITID uniqueidentifier,
        AMOUNT money,
        TYPECODE tinyint,
        APPLICATIONCODE tinyint,
        DESIGNATIONID uniqueidentifier,
        SOURCELINEITEMID uniqueidentifier,
        CREDITAMOUNT money,
        ORIGINALAPPLICATIONCODE tinyint
    );

    declare @WEIGHTSUM decimal(30, 5);
    declare @IDEALAMOUNT decimal(30, 5);
    declare @AMOUNTDISTRIBUTEDIDEAL decimal(30, 5);
    declare @AMOUNTDISTRIBUTED decimal(30, 5);
    declare @SOURCETYPE tinyint;

    declare @WEIGHTAMOUNT decimal(30, 5);
    declare @DESIGNATIONID uniqueidentifier;
    declare @APPLICATIONID uniqueidentifier;
    declare @SOURCELINEITEMID uniqueidentifier;
    declare @CREDITAMOUNT money;
    declare @ORIGINALAPPLICATIONCODE tinyint;
    declare @CONTRIBUTEDTOTAL money;
    declare @MEMBERSHIPLEVELID uniqueidentifier;

    declare @CONTRIBUTEDREVENUE table (
        ID uniqueidentifier,
        DESIGNATIONID uniqueidentifier,
        AMOUNT money
    );

    set @AMOUNTDISTRIBUTEDIDEAL = 0;
    set @AMOUNTDISTRIBUTED = 0;

    insert into @MAPPING(REVENUESPLITID, PAYMENTSPLITID, AMOUNT, TYPECODE, APPLICATIONCODE, DESIGNATIONID, SOURCELINEITEMID, CREDITAMOUNT, ORIGINALAPPLICATIONCODE)
    select
        FINANCIALTRANSACTIONLINEITEM.ID,
        newid(),
        FINANCIALTRANSACTIONLINEITEM.BASEAMOUNT,
        REVENUESPLIT_EXT.TYPECODE,
        @APPLICATIONCODE,
        REVENUESPLIT_EXT.DESIGNATIONID,
        FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID,
        coalesce((
                select sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS)
                from dbo.FINANCIALTRANSACTIONLINEITEM LI
                inner join dbo.CREDITITEM_EXT EXT on EXT.ID = LI.ID
                inner join dbo.FINANCIALTRANSACTION FT on FT.ID = LI.FINANCIALTRANSACTIONID
                where
                    LI.SOURCELINEITEMID = REVENUESPLIT_EXT.ID
                    and LI.TYPECODE = 5  -- Discount

                    and FT.TYPECODE in (5, 99)  -- Discount, Orphaned

        ), 0),
        REVENUESPLIT_EXT.APPLICATIONCODE
    from dbo.REVENUESPLIT_EXT with (nolock)
        inner join dbo.FINANCIALTRANSACTIONLINEITEM with (nolock) on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
    where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @SOURCEID
        and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0
        and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null;

    declare MEMBERSHIPSPLITS cursor local fast_forward for
        select REVENUESPLITID, AMOUNT, SOURCELINEITEMID, CREDITAMOUNT, ORIGINALAPPLICATIONCODE
        from @MAPPING MEMBERSHIPS
        where ORIGINALAPPLICATIONCODE = 5 and
                CREDITAMOUNT > 0 and
                exists (select * from @MAPPING DONATIONS where DONATIONS.SOURCELINEITEMID = MEMBERSHIPS.REVENUESPLITID and DONATIONS.ORIGINALAPPLICATIONCODE = 0)

    open MEMBERSHIPSPLITS
    fetch next from MEMBERSHIPSPLITS into @APPLICATIONID, @WEIGHTAMOUNT, @SOURCELINEITEMID, @CREDITAMOUNT, @ORIGINALAPPLICATIONCODE;
    while @@FETCH_STATUS = 0
    begin
        set @CONTRIBUTEDTOTAL = 0;
        select @CONTRIBUTEDTOTAL = SUM(AMOUNT)
        from @MAPPING DONATIONS where DONATIONS.SOURCELINEITEMID = @APPLICATIONID and DONATIONS.ORIGINALAPPLICATIONCODE = 0;

        if @CONTRIBUTEDTOTAL >= @CREDITAMOUNT
        begin
            set @CONTRIBUTEDTOTAL -= @CREDITAMOUNT;
        end
        else
        begin
            set @WEIGHTAMOUNT -= (@CREDITAMOUNT - @CONTRIBUTEDTOTAL);
            set @CONTRIBUTEDTOTAL = 0;
        end

        set @CREDITAMOUNT = 0;

        if @CONTRIBUTEDTOTAL > 0
        begin
            select @MEMBERSHIPLEVELID = MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID
            from dbo.MEMBERSHIPTRANSACTION
            where MEMBERSHIPTRANSACTION.REVENUESPLITID = @APPLICATIONID;

            insert into @CONTRIBUTEDREVENUE(ID, DESIGNATIONID, AMOUNT)
            select
                @APPLICATIONID,
                CONTRIBUTEDAMOUNTS.DESIGNATIONID,
                CONTRIBUTEDAMOUNTS.AMOUNT
            from dbo.UFN_MEMBERSHIP_GETCONTRIBUTEDAMOUNTSBYLEVELID(@MEMBERSHIPLEVELID, @CONTRIBUTEDTOTAL, 2) as CONTRIBUTEDAMOUNTS;
        end
        else
            delete @MAPPING where SOURCELINEITEMID = @APPLICATIONID and ORIGINALAPPLICATIONCODE = 0;

        update @MAPPING set AMOUNT = @WEIGHTAMOUNT, CREDITAMOUNT = 0 where REVENUESPLITID = @APPLICATIONID;

        fetch next from MEMBERSHIPSPLITS into @APPLICATIONID, @WEIGHTAMOUNT, @SOURCELINEITEMID, @CREDITAMOUNT, @ORIGINALAPPLICATIONCODE;
    end

    close MEMBERSHIPSPLITS
    deallocate MEMBERSHIPSPLITS;

    if exists (select ID from @CONTRIBUTEDREVENUE)
        update @MAPPING
        set AMOUNT = CONTRIBUTEDREVENUE.AMOUNT
        from @MAPPING MAPPING
        inner join @CONTRIBUTEDREVENUE CONTRIBUTEDREVENUE
            on MAPPING.SOURCELINEITEMID is not null and
                MAPPING.SOURCELINEITEMID = CONTRIBUTEDREVENUE.ID and
                MAPPING.DESIGNATIONID is not null and
                MAPPING.DESIGNATIONID = CONTRIBUTEDREVENUE.DESIGNATIONID;

    select
        @WEIGHTSUM = dbo.UFN_SALESORDER_TOTAL(SALESORDER.ID)
    from dbo.SALESORDER with (nolock)
    where SALESORDER.REVENUEID = @SOURCEID;

    declare PAYMENTSPLITS cursor local fast_forward for
        select REVENUESPLITID, AMOUNT, CREDITAMOUNT
        from @MAPPING;

    open PAYMENTSPLITS;
    fetch next from PAYMENTSPLITS into @APPLICATIONID, @WEIGHTAMOUNT, @CREDITAMOUNT;

    while @@FETCH_STATUS = 0
    begin

        set @WEIGHTAMOUNT -= @CREDITAMOUNT;

        if @WEIGHTSUM <> 0
            set @IDEALAMOUNT = (@WEIGHTAMOUNT / @WEIGHTSUM) * @DESTINATIONAMOUNT;
        else
            set @IDEALAMOUNT = 0;

        set @WEIGHTAMOUNT = ROUND(@IDEALAMOUNT + @AMOUNTDISTRIBUTEDIDEAL - @AMOUNTDISTRIBUTED, 2);

        update @MAPPING
        set AMOUNT = @WEIGHTAMOUNT
        where REVENUESPLITID = @APPLICATIONID;

        set @AMOUNTDISTRIBUTEDIDEAL += @IDEALAMOUNT;
        set @AMOUNTDISTRIBUTED += @WEIGHTAMOUNT;

        fetch next from PAYMENTSPLITS into @APPLICATIONID, @WEIGHTAMOUNT, @CREDITAMOUNT;
    end

    deallocate PAYMENTSPLITS;

    -- Don't create splits for items that have been discounted to 0

    delete from @MAPPING where AMOUNT = 0;


    declare @POSTSTATUSCODE tinyint;

    select  @POSTSTATUSCODE = case when POSTSTATUSCODE = 3 then 3 else 1 end
    from dbo.FINANCIALTRANSACTION where ID = @DESTINATIONID;


    declare @TRANSACTIONDATE datetime;

    if @POSTSTATUSCODE <> 3 begin
        select
            @TRANSACTIONDATE = cast(DATE as date)
        from
            dbo.FINANCIALTRANSACTION with (nolock)
        where
            ID = @SOURCEID;
    end

    insert into dbo.FINANCIALTRANSACTIONLINEITEM (
        ID,
        FINANCIALTRANSACTIONID,
        BASEAMOUNT,
        TRANSACTIONAMOUNT,
        ORGAMOUNT,
        TYPECODE,
        POSTSTATUSCODE,
        POSTDATE,
        SOURCELINEITEMID,
        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
    )
    select
        MAP.PAYMENTSPLITID,
        @DESTINATIONID,
        MAP.AMOUNT,
        MAP.AMOUNT,
        MAP.AMOUNT,
        0,
        @POSTSTATUSCODE,
        @TRANSACTIONDATE,
        MAP.REVENUESPLITID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @DATEADDED,
        @DATEADDED
    from @MAPPING MAP;

    insert into dbo.REVENUESPLIT_EXT (
        ID,
        APPLICATIONCODE,
        TYPECODE,
        DESIGNATIONID,
        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
    )
    select
        MAP.PAYMENTSPLITID,
        MAP.APPLICATIONCODE,
        MAP.TYPECODE,
        MAP.DESIGNATIONID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @DATEADDED,
        @DATEADDED
    from @MAPPING MAP;

    insert into dbo.REVENUESPLITORDER(ID, PROGRAMID, EVENTID, FEEID, TAXID, MEMBERSHIPLEVELID, RESOURCEID, VOLUNTEERTYPEID, EVENTLOCATIONID, MERCHANDISEPRODUCTINSTANCEID, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
    select MAP.PAYMENTSPLITID,
        SOURCE.PROGRAMID,
        SOURCE.EVENTID,
        SOURCE.FEEID,
        SOURCE.TAXID,
        SOURCE.MEMBERSHIPLEVELID,
        SOURCE.RESOURCEID,
        SOURCE.VOLUNTEERTYPEID,
        SOURCE.EVENTLOCATIONID,
        SOURCE.MERCHANDISEPRODUCTINSTANCEID,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @DATEADDED,
        @DATEADDED
    from dbo.REVENUESPLITORDER SOURCE
    inner join @MAPPING MAP on SOURCE.ID = MAP.REVENUESPLITID
    where MAP.TYPECODE in (1,2,5,6,7,10,11,14,16);

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