USP_CREDIT_CANCELMEMBERSHIPADDON

Parameters

Parameter Parameter Type Mode Description
@MEMBERSHIPADDONID uniqueidentifier IN
@NUMBERTOCANCEL smallint IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


create procedure dbo.USP_CREDIT_CANCELMEMBERSHIPADDON
(
    @MEMBERSHIPADDONID uniqueidentifier,
    @NUMBERTOCANCEL smallint,
    @CHANGEAGENTID uniqueidentifier
)
as
begin
    set nocount on;

    if @CHANGEAGENTID is null
        exec USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

    declare @CURRENTDATE datetime = getdate();

    declare @MEMBERSHIPTRANSACTIONID uniqueidentifier = (
        select MEMBERSHIPTRANSACTIONID
        from dbo.MEMBERSHIPADDON
        where ID = @MEMBERSHIPADDONID
    );

    -- Update the add-on first, so we can use the stored values uniformly in the additional member calculations below.

    update dbo.MEMBERSHIPADDON
    set
        NUMCANCELLED += @NUMBERTOCANCEL,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    where ID = @MEMBERSHIPADDONID;

    if (
        select ADDON.ADDONTYPECODE
        from dbo.MEMBERSHIPADDON
        inner join dbo.ADDON on ADDON.ID = MEMBERSHIPADDON.ADDONID
        where MEMBERSHIPADDON.ID = @MEMBERSHIPADDONID
    ) = 1  -- Additional member

    begin
        -- We might need to drop some members. We have to calculate the total number of members allowed

        --    (number of members the level allows + number of extra member add-ons sold - previously refunded add-ons).

        -- If there are now too many members, we drop as many as we need to.


        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 = @MEMBERSHIPTRANSACTIONID
                        and MEMBER.ISDROPPED = 0
                ) -
                (
                    -- Number of members allowed, based on the current membership level and the add-ons remaining

                    select
                        MEMBERSHIPLEVEL.MEMBERSALLOWED + sum(MEMBERSHIPADDON.QUANTITY) - sum(MEMBERSHIPADDON.NUMCANCELLED)
                    from dbo.MEMBERSHIPTRANSACTION
                    inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBERSHIPTRANSACTION.MEMBERSHIPID
                    inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID
                    inner join dbo.MEMBERSHIPADDON on MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID = MEMBERSHIPTRANSACTION.ID
                    inner join dbo.ADDON on ADDON.ID = MEMBERSHIPADDON.ADDONID
                    where
                        MEMBERSHIPTRANSACTION.ID = @MEMBERSHIPTRANSACTIONID
                        and ADDON.ADDONTYPECODE = 1
                    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 = @MEMBERSHIPTRANSACTIONID
                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

    return 0;
end