USP_MEMBERSHIP_RESETFROMLASTTRANSACTION
Resets membership using the last transaction. Commonly used after the last transaction is deleted and we want to reset the membership to the previous.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@MEMBERSHIPID | uniqueidentifier | IN | |
@RESETMEMBERSHIPCARDDATE | date | IN | |
@CHANGEAGENTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_MEMBERSHIP_RESETFROMLASTTRANSACTION
(
@MEMBERSHIPID uniqueidentifier,
--Date of membership cards in which to reset.
--Usually, this is the expiration date of the membership transaction that was deleted prior to executing this sp.
--The idea is that if the cards had been set to expire on the same date as the membership, then that should probably still hold
@RESETMEMBERSHIPCARDDATE date = null,
@CHANGEAGENTID uniqueidentifier
)
as
begin
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @CURRENTDATE datetime = getdate();
declare @LATESTTRANSACTIONID uniqueidentifier = dbo.UFN_MEMBERSHIP_GETLASTMEMBERSHIPTRANSACTIONID(@MEMBERSHIPID);
declare @MEMBERSHIPSTATUSCODE tinyint;
select @MEMBERSHIPSTATUSCODE = STATUSCODE from dbo.UFN_MEMBERSHIPTRANSACTION_CALCULATEMEMBERSHIPSTATUSCODE(@LATESTTRANSACTIONID, @CURRENTDATE);
update dbo.MEMBERSHIP
set
MEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID,
MEMBERSHIP.MEMBERSHIPLEVELTERMID = MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELTERMID,
MEMBERSHIP.MEMBERSHIPLEVELTYPECODEID = MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELTYPECODEID,
MEMBERSHIP.NUMBEROFCHILDREN = MEMBERSHIPTRANSACTION.NUMBEROFCHILDREN,
MEMBERSHIP.COMMENTS = MEMBERSHIPTRANSACTION.COMMENTS,
MEMBERSHIP.ISGIFT = MEMBERSHIPTRANSACTION.ISGIFT,
MEMBERSHIP.EXPIRATIONDATE = MEMBERSHIPTRANSACTION.EXPIRATIONDATE,
MEMBERSHIP.STATUSCODE = @MEMBERSHIPSTATUSCODE,
MEMBERSHIP.GIVENBYID = MEMBERSHIPTRANSACTION.DONORID,
MEMBERSHIP.DATECHANGED = @CURRENTDATE,
MEMBERSHIP.CHANGEDBYID = @CHANGEAGENTID
from dbo.MEMBERSHIPTRANSACTION
where
MEMBERSHIPTRANSACTION.ID = @LATESTTRANSACTIONID
and MEMBERSHIP.ID = @MEMBERSHIPID
update dbo.MEMBERSHIPCARD
set
MEMBERSHIPCARD.EXPIRATIONDATE = MEMBERSHIPTRANSACTION.EXPIRATIONDATE,
MEMBERSHIPCARD.DATECHANGED = @CURRENTDATE,
MEMBERSHIPCARD.CHANGEDBYID = @CHANGEAGENTID
from dbo.MEMBERSHIPCARD
inner join dbo.MEMBER
on MEMBERSHIPCARD.MEMBERID = MEMBER.ID
inner join dbo.MEMBERSHIP
on MEMBER.MEMBERSHIPID = MEMBERSHIP.ID
inner join dbo.MEMBERSHIPTRANSACTION
on MEMBERSHIP.ID = MEMBERSHIPTRANSACTION.MEMBERSHIPID
where
MEMBERSHIPTRANSACTION.ID = dbo.UFN_MEMBERSHIP_GETLASTMEMBERSHIPTRANSACTIONID([MEMBERSHIP].[ID]) and
MEMBERSHIP.ID = @MEMBERSHIPID and
cast(MEMBERSHIPCARD.EXPIRATIONDATE as date) = @RESETMEMBERSHIPCARDDATE
--Drop additional members by date added if available member slots have changed
declare @MEMBERSTODROP dbo.UDT_GENERICID;
with CTE_ADDONINFO as
(
select
(
-- Number of members on the associated transaction
select
count(MEMBER.ID)
from dbo.MEMBERSHIPTRANSACTION
inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBERSHIPTRANSACTION.MEMBERSHIPID
inner join dbo.MEMBER on MEMBER.MEMBERSHIPID = MEMBERSHIP.ID
where
MEMBERSHIPTRANSACTION.ID = @LATESTTRANSACTIONID
and MEMBER.ISDROPPED = 0
) -
(
-- Number of members allowed, based on the current membership level and the add-ons remaining
select
MEMBERSHIPLEVEL.MEMBERSALLOWED + isnull(sum(MEMBERSHIPADDON.QUANTITY) - sum(MEMBERSHIPADDON.NUMCANCELLED), 0)
from dbo.MEMBERSHIPTRANSACTION
inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBERSHIPTRANSACTION.MEMBERSHIPID
inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID
left outer join dbo.MEMBERSHIPADDON on MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID = MEMBERSHIPTRANSACTION.ID
left outer join dbo.ADDON on ADDON.ID = MEMBERSHIPADDON.ADDONID
where
MEMBERSHIPTRANSACTION.ID = @LATESTTRANSACTIONID
and (ADDON.ADDONTYPECODE = 1 or ADDON.ADDONTYPECODE is null)
group by MEMBERSHIPLEVEL.MEMBERSALLOWED
) as NUMBEROFMEMBERSTODROP
),
CTE_MEMBERINFO as
(
select
MEMBER.ID as MEMBERID,
row_number() over (partition by MEMBERSHIPTRANSACTION.ID order by MEMBER.DATEADDED desc) as ROWNUMBER
from dbo.MEMBERSHIPTRANSACTION
inner join dbo.MEMBER on MEMBER.MEMBERSHIPID = MEMBERSHIPTRANSACTION.MEMBERSHIPID
where MEMBERSHIPTRANSACTION.ID = @LATESTTRANSACTIONID
and MEMBER.ISPRIMARY = 0
and MEMBER.ISDROPPED = 0
)
insert into @MEMBERSTODROP (ID)
select MEMBERID
from CTE_MEMBERINFO
where ROWNUMBER <= (select NUMBEROFMEMBERSTODROP from CTE_ADDONINFO);
update dbo.MEMBER set
ISDROPPED = 1,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
ID in (select ID from @MEMBERSTODROP);
update dbo.MEMBERSHIPCARD set
STATUSCODE = 2, -- Cancelled
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
MEMBERID in (select ID from @MEMBERSTODROP)
and STATUSCODE <> 2; -- Cancelled
end