UFN_MEMBERSHIP_CALCULATEEXPIRATIONDATEBYLEVEL
Calculates the expiration date for a membership.
Return
Return Type |
---|
datetime |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@MEMBERSHIPLEVELID | uniqueidentifier | IN | |
@TERMID | uniqueidentifier | IN | |
@STARTDATE | datetime | IN |
Definition
Copy
CREATE function dbo.UFN_MEMBERSHIP_CALCULATEEXPIRATIONDATEBYLEVEL
(
@MEMBERSHIPLEVELID uniqueidentifier,
@TERMID uniqueidentifier,
@STARTDATE datetime
)
returns datetime
as
begin
declare @MEMBERSHIPPROGRAMID uniqueidentifier
declare @CUTOFFDAY tinyint
declare @CUTOFFDATEFORYEAR char(4)
declare @EXPIRATIONDATE datetime
declare @EXPIRESONCODE tinyint
declare @MONTH nvarchar(2)
declare @DAY nvarchar(2)
declare @OBTAINLEVELCODE tinyint
declare @CONTRIBUTIONBASEDEXPIRESONCODE tinyint
select
@CUTOFFDAY = MP.CUTOFFDAY,
@CUTOFFDATEFORYEAR = MP.CUTOFFDATEFORYEAR,
@EXPIRESONCODE = MP.EXPIRESONCODE,
@MEMBERSHIPPROGRAMID = MP.ID,
@OBTAINLEVELCODE = ML.OBTAINLEVELCODE,
@CONTRIBUTIONBASEDEXPIRESONCODE = coalesce(MPC.WHATDATETOCALCULATEEXPIRATIONDATECODE, 0)
from dbo.MEMBERSHIPLEVEL ML
inner join dbo.MEMBERSHIPPROGRAM MP
left outer join dbo.MEMBERSHIPPROGRAMCONTRIBUTION MPC
on MPC.ID = MP.ID
on MP.ID = ML.MEMBERSHIPPROGRAMID
where ML.ID = @MEMBERSHIPLEVELID;
declare @TERMTIMELENGTH int
declare @TERMLENGTHCODE tinyint
select
@TERMTIMELENGTH = TERMTIMELENGTH,
@TERMLENGTHCODE = TERMLENGTHCODE
from dbo.MEMBERSHIPLEVELTERM
where ID = @TERMID;
if @OBTAINLEVELCODE = 1
begin
if @CONTRIBUTIONBASEDEXPIRESONCODE = 0
begin
if @TERMLENGTHCODE = 0
set @EXPIRATIONDATE = dateadd(month, @TERMTIMELENGTH, @STARTDATE)
else
set @EXPIRATIONDATE = dateadd(year, @TERMTIMELENGTH, @STARTDATE)
end;
else
begin
if @TERMLENGTHCODE = 0
begin
set @STARTDATE = dateadd(month, @TERMTIMELENGTH, @STARTDATE)
end;
else
begin
set @STARTDATE = dateadd(year, @TERMTIMELENGTH, @STARTDATE)
end;
-- When using cut off day and the day from transaction falls before it, use
-- the month prior to the month of the transaction date.
if (@CUTOFFDAY > 0) And ( datepart(day, @STARTDATE) < @CUTOFFDAY)
begin
--last day of month
set @EXPIRATIONDATE = dateadd(day, -1, cast(datepart(month, @STARTDATE) as nvarchar(2)) + '/01/' + cast(datepart(year, @STARTDATE) as nvarchar(4)))
end;
-- Otherwise use the last day of the current month
else
begin
set @STARTDATE = dateadd(month, 1, @STARTDATE)
set @EXPIRATIONDATE = dateadd(day, -1, cast(datepart(month, @STARTDATE) as nvarchar(2)) + '/01/' + cast(datepart(year, @STARTDATE) as nvarchar(4)))
end;
end;
end;
else
begin
-- begin expiration date calculation
-- specific date
if @EXPIRESONCODE = 4
begin
declare @DATESTRING as nvarchar(4)
declare @DATEINT as smallint
-- Turning start date into month day.
set @DATESTRING = convert(nvarchar(2), month(@STARTDATE)) +
case
when day(@STARTDATE) < 10 then '0' + convert(nvarchar(2), day(@STARTDATE))
else convert(nvarchar(2), day(@STARTDATE))
end;
set @DATEINT = convert(smallint, @DATESTRING);
-- Load the expiration dates for this program in a table
-- with their effective push dates
-- (PUSHNEXTDATE if defined, the next EXPIRATIONDATE if not)
declare @DATETABLE as table (
EXPDATE nvarchar(4),
PUSHNEXTDATE nvarchar(4)
);
declare @EXPDATE as nvarchar(4)
declare @PUSHNEXTDATE as nvarchar(4)
insert into @DATETABLE (EXPDATE, PUSHNEXTDATE)
select
MPD.EXPIRATIONDATE,
case
when MPD.PUSHNEXTDATE is null or MPD.PUSHNEXTDATE = '0000' then (
coalesce(
( select top(1)
MPD2.EXPIRATIONDATE
from dbo.MEMBERSHIPPROGRAMENDDATE as MPD2
where
MPD2.EXPIRATIONDATE > MPD.EXPIRATIONDATE
and MPD2.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID ),
( select top(1)
MPD2.EXPIRATIONDATE
from dbo.MEMBERSHIPPROGRAMENDDATE as MPD2
where MPD2.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID )
)
)
else
MPD.PUSHNEXTDATE
end
from
dbo.MEMBERSHIPPROGRAMENDDATE as MPD
where
MPD.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
-- Get the valid expiration date by choosing the next push date
select top(1)
@EXPDATE = EXPDATE,
@PUSHNEXTDATE = PUSHNEXTDATE
from
@DATETABLE
where
convert(smallint, PUSHNEXTDATE) > @DATEINT
order by
PUSHNEXTDATE
asc
declare @CARRYOVER bit = 0;
if @EXPDATE is null
select top(1)
@EXPDATE = EXPDATE,
@PUSHNEXTDATE = PUSHNEXTDATE,
@CARRYOVER = 1
from
@DATETABLE
order by
PUSHNEXTDATE
asc
-- Construct the expiration date
set @MONTH = convert(smallint, substring(@EXPDATE, 1, 2))
set @DAY = convert(smallint, substring(@EXPDATE, 3, 2))
set @EXPIRATIONDATE = dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(@STARTDATE, 0)
set @EXPIRATIONDATE = dateadd(month, @MONTH - 1, @EXPIRATIONDATE)
set @EXPIRATIONDATE = dateadd(day, @DAY - 1, @EXPIRATIONDATE)
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, @TERMTIMELENGTH, @EXPIRATIONDATE)
when 0 then dateadd(month, @TERMTIMELENGTH, @EXPIRATIONDATE)
end
if @CARRYOVER = 1
begin
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, 1, @EXPIRATIONDATE)
when 0 then dateadd(month, 1, @EXPIRATIONDATE)
end
end
if convert(smallint, @PUSHNEXTDATE) < convert(smallint, @EXPDATE)
begin
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, -1, @EXPIRATIONDATE)
when 0 then dateadd(month, -1, @EXPIRATIONDATE)
end
end
end;
-- End of fiscal year
else if @EXPIRESONCODE = 3
begin
set @MONTH = substring(@CUTOFFDATEFORYEAR, 1, 2);
set @DAY = substring(@CUTOFFDATEFORYEAR, 3, 2);
declare @FISCALDATE datetime;
set @FISCALDATE = dbo.UFN_DATE_THISFISCALYEAR_LASTDAY(@STARTDATE, 1);
set @FISCALDATE = dateadd(year, -1, @FISCALDATE);
if month(@STARTDATE) < @MONTH or (month(@STARTDATE) = @MONTH and day(@STARTDATE) < @DAY)
begin
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, @TERMTIMELENGTH, @FISCALDATE)
when 0 then dateadd(month, @TERMTIMELENGTH, @FISCALDATE)
end
end
else
begin
set @FISCALDATE = dateadd(year,1,@FISCALDATE)
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, @TERMTIMELENGTH, @FISCALDATE)
when 0 then dateadd(month, @TERMTIMELENGTH, @FISCALDATE)
end
end
end;
-- End of calendar year
else if @EXPIRESONCODE = 2
begin
set @MONTH = substring(@CUTOFFDATEFORYEAR, 1, 2);
set @DAY = substring(@CUTOFFDATEFORYEAR, 3, 2);
declare @CALENDARDATE datetime;
set @CALENDARDATE = dbo.UFN_DATE_LASTCALENDARYEAR_LASTDAY(@STARTDATE, 1);
if month(@STARTDATE) < @MONTH or (month(@STARTDATE) = @MONTH and day(@STARTDATE) < @DAY)
begin
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, @TERMTIMELENGTH, @CALENDARDATE)
when 0 then dateadd(month, @TERMTIMELENGTH, @CALENDARDATE)
end
end
else
begin
set @CALENDARDATE = dateadd(year, 1, @CALENDARDATE);
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, @TERMTIMELENGTH, @CALENDARDATE)
when 0 then dateadd(month, @TERMTIMELENGTH, @CALENDARDATE)
end;
end
end;
-- End of month
else if @EXPIRESONCODE = 1
begin
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, @TERMTIMELENGTH, @STARTDATE)
when 0 then dateadd(month, @TERMTIMELENGTH, @STARTDATE)
end;
if @CUTOFFDAY <= day(@STARTDATE)
begin
set @EXPIRATIONDATE = dbo.UFN_DATE_THISMONTH_LASTDAY(@EXPIRATIONDATE, 1);
end
else
begin
set @EXPIRATIONDATE = dbo.UFN_DATE_LASTMONTH_LASTDAY(@EXPIRATIONDATE, 1);
end
end;
-- Join date
if @EXPIRESONCODE = 0
set @EXPIRATIONDATE = case @TERMLENGTHCODE
when 1 then dateadd(year, @TERMTIMELENGTH, @STARTDATE)
when 0 then dateadd(month, @TERMTIMELENGTH, @STARTDATE)
end;
end;
return dbo.UFN_DATE_GETLATESTTIME(@EXPIRATIONDATE)
end