USP_SALESORDER_UPDATEMEMBERSHIPPROMOS

Ensures that membership promos in an order are linked to memberships if available and that percentages are calculated.

Parameters

Parameter Parameter Type Mode Description
@SALESORDERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_SALESORDER_UPDATEMEMBERSHIPPROMOS
(
    @SALESORDERID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier    = null
)
as
begin
    if @CHANGEAGENTID is null  
        exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

    -- Clear out the existing promos

    declare @e int;
    declare @contextCache varbinary(128);

    set @contextCache = CONTEXT_INFO();

    if not @CHANGEAGENTID is null
        set CONTEXT_INFO @CHANGEAGENTID

    delete 
        from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
    where
        SALESORDERITEMID in (select ID from dbo.SALESORDERITEM where SALESORDERID = @SALESORDERID) and
        MEMBERSHIPPROMOID is not null

    if not @contextCache is null
        set CONTEXT_INFO @contextCache

    select @e=@@error;

    if @e<>0 return -456; --always return non-zero sp result if an error occurs


    if exists (select 1 from dbo.SALESORDERMEMBERSHIPPROMO where SALESORDERID = @SALESORDERID) -- Only do stuff if there are membership promotions

    begin
        if exists (select 1 from dbo.SALESORDERITEM where SALESORDERID = @SALESORDERID and TYPECODE = 1) -- If there is a membership in the cart, do this!

        begin

            declare @PROMOVALUES table
            (
                MEMBERSHIPPROMOID uniqueidentifier,
                VALUE money
            )

            -- First, make sure the percentages are calculated correctly

            declare @MEMTOTAL money
            select @MEMTOTAL = sum(PRICE) from dbo.SALESORDERITEM where SALESORDERID = @SALESORDERID and TYPECODE = 1

            insert into @PROMOVALUES
            select
                MP.ID,
                @MEMTOTAL * MP.[PERCENT] * 0.01
            from dbo.SALESORDERMEMBERSHIPPROMO SOMP
                inner join dbo.MEMBERSHIPPROMO MP on SOMP.MEMBERSHIPPROMOID = MP.ID
            where 
                SOMP.SALESORDERID = @SALESORDERID and
                MP.PROMOTIONTYPECODE = 0 and
                MP.DISCOUNTCALCULATIONTYPECODE = 1

            -- Next, update the quantities on the amount discounts

            declare @MEMQUANTITY int
            select @MEMQUANTITY = count(*) from dbo.SALESORDERITEM where SALESORDERID = @SALESORDERID and TYPECODE = 1 and TOTAL > 0

            insert into @PROMOVALUES
            select
                MP.ID,
                MP.AMOUNT * @MEMQUANTITY
            from dbo.SALESORDERMEMBERSHIPPROMO SOMP
                inner join dbo.MEMBERSHIPPROMO MP on SOMP.MEMBERSHIPPROMOID = MP.ID
            where 
                SOMP.SALESORDERID = @SALESORDERID and
                MP.PROMOTIONTYPECODE = 0 and
                MP.DISCOUNTCALCULATIONTYPECODE = 0

            declare @CURRENTPROMO uniqueidentifier
            declare @PROMONAME nvarchar(100)
            declare @PROMOAMOUNT money
            declare @PROMOPERCENT decimal(5,2)
            declare @PROMOEXTTYPE tinyint
            declare @PROMOEXTVALUE int

            -- Now, find the biggest amount/percent discount

            select top(1)
                @CURRENTPROMO = MEMBERSHIPPROMOID
            from @PROMOVALUES
            order by VALUE desc

            if not (@CURRENTPROMO is null)
            begin

                select
                    @PROMONAME = NAME,
                    @PROMOAMOUNT = case DISCOUNTCALCULATIONTYPECODE when 0 then AMOUNT else null end,
                    @PROMOPERCENT = case DISCOUNTCALCULATIONTYPECODE when 1 then [PERCENT] else null end
                from dbo.MEMBERSHIPPROMO
                where ID = @CURRENTPROMO

                declare @MEMITEMS table
                (
                    SALESORDERITEMID uniqueidentifier,
                    CURRENTPRICE money,
                    PROMOAMOUNT money
                )

                insert into @MEMITEMS
                (
                    SALESORDERITEMID,
                    CURRENTPRICE,
                    PROMOAMOUNT
                )
                select
                    SOI.ID,
                    SOI.TOTAL - coalesce(sum(SOIMIP.AMOUNT),0),
                    case
                        when @PROMOAMOUNT is null then SOI.TOTAL * @PROMOPERCENT * 0.01
                        else @PROMOAMOUNT
                    end
                from dbo.SALESORDERITEM SOI
                    left join dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION SOIMIP on SOIMIP.SALESORDERITEMID = SOI.ID
                where
                    SOI.SALESORDERID = @SALESORDERID and
                    SOI.TYPECODE = 1 and
                    SOI.TOTAL > 0
                group by SOI.ID, SOI.TOTAL

                insert into dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
                (
                    SALESORDERITEMID,
                    PROMOTIONNAME,
                    AMOUNT,
                    MEMBERSHIPPROMOID,
                    ADDEDBYID,
                    CHANGEDBYID,
                    DATEADDED,
                    DATECHANGED
                )
                select
                    SALESORDERITEMID,
                    @PROMONAME,
                    case
                        when PROMOAMOUNT > CURRENTPRICE then CURRENTPRICE
                        else round(PROMOAMOUNT, 2)
                    end,
                    @CURRENTPROMO,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    getdate(),
                    getdate()
                from @MEMITEMS
            end

            -- Now find the best term extension promo

            set @CURRENTPROMO = null;

            select top(1)
                @CURRENTPROMO = MP.ID
            from dbo.SALESORDERMEMBERSHIPPROMO SOMP
                inner join dbo.MEMBERSHIPPROMO MP on SOMP.MEMBERSHIPPROMOID = MP.ID
            where
                SOMP.SALESORDERID = @SALESORDERID and
                MP.PROMOTIONTYPECODE = 1
            order by
                case MP.EXTENSIONCALCULATIONTYPECODE
                    when 0 then EXTENSIONVALUE
                    else 30 * EXTENSIONVALUE
                end desc

            if not (@CURRENTPROMO is null)
            begin

                select
                    @PROMONAME = NAME,
                    @PROMOEXTTYPE = EXTENSIONCALCULATIONTYPECODE,
                    @PROMOEXTVALUE = EXTENSIONVALUE
                from dbo.MEMBERSHIPPROMO
                where ID = @CURRENTPROMO

                insert into dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
                (
                    SALESORDERITEMID,
                    PROMOTIONNAME,
                    AMOUNT,
                    MEMBERSHIPPROMOID,
                    EXTENSIONCALCULATIONTYPECODE,
                    EXTENSIONVALUE,
                    ADDEDBYID,
                    CHANGEDBYID,
                    DATEADDED,
                    DATECHANGED
                )
                select
                    SOI.ID,
                    @PROMONAME,
                    0,
                    @CURRENTPROMO,
                    @PROMOEXTTYPE,
                    @PROMOEXTVALUE,
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    getdate(),
                    getdate()
                from dbo.SALESORDERITEM SOI
                where
                    SOI.SALESORDERID = @SALESORDERID and
                    SOI.TYPECODE = 1
            end
        end
    end

    return 0
end