UFN_SALESORDERITEMMEMBERSHIP_CALCULATEFINALEXPIRATIONDATE

Given a membership sales order item and its expiration date, apply any term extension membership promotions

Return

Return Type
datetime

Parameters

Parameter Parameter Type Mode Description
@SALESORDERITEMMEMBERSHIPID uniqueidentifier IN
@TRANSACTIONDATE datetime IN

Definition

Copy


CREATE function dbo.UFN_SALESORDERITEMMEMBERSHIP_CALCULATEFINALEXPIRATIONDATE
(
    @SALESORDERITEMMEMBERSHIPID uniqueidentifier,
    @TRANSACTIONDATE datetime
)
returns datetime
with execute as caller
as begin
    declare @EXPIRATIONDATE datetime
    declare @MEMBERSHIPID uniqueidentifier
    declare @MEMBERSHIPLEVELID uniqueidentifier
    declare @MEMBERSHIPLEVELTERMID uniqueidentifier
    declare @SALESORDERID uniqueidentifier

    select 
        @EXPIRATIONDATE = EXPIRATIONDATE,
        @MEMBERSHIPID = MEMBERSHIPID,
        @MEMBERSHIPLEVELID = MEMBERSHIPLEVELID,
        @MEMBERSHIPLEVELTERMID = MEMBERSHIPLEVELTERMID
    from dbo.SALESORDERITEMMEMBERSHIP 
    where ID = @SALESORDERITEMMEMBERSHIPID

    if @EXPIRATIONDATE is null
    begin
        declare @ACTIONCODE tinyint;
        select @ACTIONCODE = dbo.UFN_MEMBERSHIPTRANSACTION_DETERMINEACTIONCODE(@MEMBERSHIPID, @MEMBERSHIPLEVELID, @TRANSACTIONDATE)

        if @ACTIONCODE = 0 or @ACTIONCODE = 5 --join/rejoin

        begin
            set @EXPIRATIONDATE = dbo.UFN_MEMBERSHIP_CALCULATEEXPIRATIONDATEBYLEVEL(@MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @TRANSACTIONDATE);
        end
        else
        begin
            declare @CURRENTSTATUS tinyint;
            select @EXPIRATIONDATE = EXPIRATIONDATE, 
                @CURRENTSTATUS = STATUSCODE
            from dbo.MEMBERSHIP where ID = @MEMBERSHIPID;

            if @CURRENTSTATUS = 2 --pending membership

            begin                            
                set @EXPIRATIONDATE = dbo.UFN_MEMBERSHIP_CALCULATEEXPIRATIONDATEBYLEVEL(@MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @TRANSACTIONDATE);
            end
            else
            begin
                set @EXPIRATIONDATE = dbo.UFN_MEMBERSHIP_CALCULATERENEWALEXPIRATION(@EXPIRATIONDATE, @MEMBERSHIPLEVELTERMID);
            end
        end
    end

    if exists (select top(1) 1 from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION where SALESORDERITEMID = @SALESORDERITEMMEMBERSHIPID)
    begin
        declare @GOTOMONTHEND bit = 0;

        if not (month(@EXPIRATIONDATE) = month(dateadd(d, 1, @EXPIRATIONDATE)))
            set @GOTOMONTHEND = 1;

        select top(1)
            @EXPIRATIONDATE = case EXTENSIONCALCULATIONTYPECODE
                                  when 0 then dateadd(d, EXTENSIONVALUE, @EXPIRATIONDATE)
                                  when 1 then dateadd(m, EXTENSIONVALUE, @EXPIRATIONDATE)
                                  else @EXPIRATIONDATE
                              end
        from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
        where 
            SALESORDERITEMID = @SALESORDERITEMMEMBERSHIPID and
            EXTENSIONVALUE > 0

        if @GOTOMONTHEND = 1
            set @EXPIRATIONDATE = dbo.UFN_DATE_THISMONTH_LASTDAY(@EXPIRATIONDATE, 1);
    end

    return @EXPIRATIONDATE
end