USP_DATAFORMTEMPLATE_EDIT_MEMBERSHIPTRANSACTION_3

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@MEMBERSHIPLEVELID uniqueidentifier IN
@MEMBERSHIPLEVELTERMID uniqueidentifier IN
@TRANSACTIONDATE datetime IN
@EXPIRATIONDATE datetime IN
@CANCELLATIONREASONCODE uniqueidentifier IN
@COMMENTS nvarchar(1000) IN

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_MEMBERSHIPTRANSACTION_3
(
    @ID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @MEMBERSHIPLEVELID uniqueidentifier,
    @MEMBERSHIPLEVELTERMID uniqueidentifier,
    @TRANSACTIONDATE datetime,
    @EXPIRATIONDATE datetime,
    @CANCELLATIONREASONCODE uniqueidentifier,
    @COMMENTS nvarchar(1000)
)
as
    set nocount on;

    if @CHANGEAGENTID is null
        exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

    declare @CURRENTDATE datetime
    set @CURRENTDATE = getdate()

    --get old transaction date, membership id, actioncode

    declare @OLDTRANSDATE datetime,
            @OLDEXPRDATE datetime,
            @MEMBERSHIPID uniqueidentifier,
            @ACTIONCODE tinyint,
            @DATEADDED datetime;

    select
        @OLDTRANSDATE = TRANSACTIONDATE,
        @OLDEXPRDATE = EXPIRATIONDATE,
        @MEMBERSHIPID = MEMBERSHIPID,
        @ACTIONCODE = ACTIONCODE,
        @DATEADDED = DATEADDED
    from dbo.MEMBERSHIPTRANSACTION
    where MEMBERSHIPTRANSACTION.ID = @ID;

    --get bounds for transaction date and expr date

    declare @PREVTRANSDATE datetime,
            @NEXTTRANSDATE datetime,
            @PREVEXPRDATE datetime,
            @NEXTEXPRDATE datetime,
            @PREVLEVELID uniqueidentifier,
            @NEXTLEVELID uniqueidentifier,
            @NEXTTRANSID uniqueidentifier,
            @PREVACTIONCODE tinyint,
            @NEXTACTIONCODE tinyint;

    select top 1
        @PREVTRANSDATE = TRANSACTIONDATE,
        @PREVEXPRDATE = EXPIRATIONDATE,
        @PREVLEVELID = MEMBERSHIPLEVELID,
        @PREVACTIONCODE = ACTIONCODE
    from
        dbo.MEMBERSHIPTRANSACTION
    where
        MEMBERSHIPID = @MEMBERSHIPID
        and (
            TRANSACTIONDATE < @OLDTRANSDATE
            or (
                TRANSACTIONDATE = @OLDTRANSDATE
                and DATEADDED < @DATEADDED
            )
        )
    order by
        TRANSACTIONDATE desc, DATEADDED desc;

    select top 1
        @NEXTTRANSDATE = TRANSACTIONDATE,
        @NEXTEXPRDATE = EXPIRATIONDATE,
        @NEXTLEVELID = MEMBERSHIPLEVELID,
        @NEXTACTIONCODE = ACTIONCODE,
        @NEXTTRANSID = ID
    from
        dbo.MEMBERSHIPTRANSACTION
    where
        MEMBERSHIPID = @MEMBERSHIPID
        and (
            TRANSACTIONDATE > @OLDTRANSDATE
            or (
                TRANSACTIONDATE = @OLDTRANSDATE
                and DATEADDED > @DATEADDED
            )
        )
    order by
        TRANSACTIONDATE asc, DATEADDED asc;

    -- check to make sure our dates are not breaking the bounds set by any 

    -- transactions before or after the one we are changing.


    begin try
    if @TRANSACTIONDATE is null
        raiserror('The transaction date must have a value.',13,1)

    if @EXPIRATIONDATE is null and @NEXTEXPRDATE is not null
        raiserror('The expiration date must have a value unless it is the latest transaction.',13,1)

    set @EXPIRATIONDATE = dbo.UFN_DATE_GETLATESTTIME(@EXPIRATIONDATE);
    set @TRANSACTIONDATE = dbo.UFN_DATE_GETEARLIESTTIME(@TRANSACTIONDATE);

    if @EXPIRATIONDATE <= @TRANSACTIONDATE  
        raiserror('BBERR_EXPIRATIONDATE', 13, 1);

    -- Update cancellation reason code

    if @ACTIONCODE = 6 -- Cancelled

    begin
        update dbo.MEMBERSHIP set
            CANCELLATIONREASONCODEID = @CANCELLATIONREASONCODE
        where
            ID = @MEMBERSHIPID
    end

    if (
        (@TRANSACTIONDATE >= @PREVTRANSDATE or @PREVTRANSDATE is null)
        and (@TRANSACTIONDATE <= @NEXTTRANSDATE or @NEXTTRANSDATE is null)
        and (
            (
                (@EXPIRATIONDATE >= @PREVEXPRDATE or @PREVEXPRDATE is null)
                and (@EXPIRATIONDATE <= @NEXTEXPRDATE or @NEXTEXPRDATE is null)
            )
            or (@EXPIRATIONDATE is null and @NEXTEXPRDATE is null)
        )
    )
    begin

    -- if transaction date or expiration date is changed

    -- need to decide the action code for the current transaction

    -- and the action code for the next transaction

    if @TRANSACTIONDATE <> @OLDTRANSDATE or @EXPIRATIONDATE <> @OLDEXPRDATE or @PREVLEVELID <> @MEMBERSHIPLEVELID
    begin
        set @ACTIONCODE = case @ACTIONCODE
                when 4 then 4
                else
                    dbo.UFN_MEMBERSHIPTRANSACTION_DETERMINENEWACTIONCODE(@PREVLEVELID,
                                                                            @PREVEXPRDATE,
                                                                            @PREVACTIONCODE,
                                                                            @MEMBERSHIPLEVELID,
                                                                            @TRANSACTIONDATE)
                end

        set @NEXTACTIONCODE = case @NEXTACTIONCODE
                when 4 then 4
                else
                    dbo.UFN_MEMBERSHIPTRANSACTION_DETERMINENEWACTIONCODE(@MEMBERSHIPLEVELID,
                                                                            @EXPIRATIONDATE,
                                                                            @ACTIONCODE,
                                                                            @NEXTLEVELID,
                                                                            @NEXTTRANSDATE)
                end

        update dbo.MEMBERSHIPTRANSACTION set
            ACTIONCODE = @NEXTACTIONCODE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        where ID = @NEXTTRANSID;
    end

    update dbo.MEMBERSHIPTRANSACTION set
            MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID,
            MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID,
            TRANSACTIONDATE = @TRANSACTIONDATE,
            EXPIRATIONDATE = @EXPIRATIONDATE,
            ACTIONCODE = @ACTIONCODE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE,
            COMMENTS = @COMMENTS
        where ID = @ID;
    end
    else
        raiserror('Transaction and expiration dates must stay in order with the other transactions.',13,1)

        --get the id of the latest transaction for this membership


        declare @LATESTTRANSACTIONID uniqueidentifier
        select top 1 @LATESTTRANSACTIONID = ID
        from dbo.MEMBERSHIPTRANSACTION
        where MEMBERSHIPID = @MEMBERSHIPID
        order by TRANSACTIONDATE desc, DATEADDED desc 

        --the next block does the following logic

        --if its the latest transaction, and a renew, then update level, term, expiration, last renewed

        --if its latest transaction, and a join, update joindate, expiration date, level, term

        --if its not the latest transaction, but it is a join, update joindate


        if @LATESTTRANSACTIONID = @ID
        begin
            declare @MEMBERSHIPSTATUSCODE tinyint;
            select @MEMBERSHIPSTATUSCODE = STATUSCODE from dbo.UFN_MEMBERSHIPTRANSACTION_CALCULATEMEMBERSHIPSTATUSCODE(@LATESTTRANSACTIONID, @CURRENTDATE);

            if @ACTIONCODE in (1,2,3,5)
            begin
                update dbo.MEMBERSHIP set
                    MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID,
                    MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID,
                    EXPIRATIONDATE = @EXPIRATIONDATE,
                    STATUSCODE = @MEMBERSHIPSTATUSCODE,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE,
                    LASTRENEWEDON = @TRANSACTIONDATE
                where ID = @MEMBERSHIPID
            end
            else if @ACTIONCODE = 0
                begin
                    update dbo.MEMBERSHIP set
                        MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID,
                        MEMBERSHIPLEVELTERMID = @MEMBERSHIPLEVELTERMID,
                        JOINDATE = @TRANSACTIONDATE,
                        EXPIRATIONDATE = @EXPIRATIONDATE,
                        STATUSCODE = @MEMBERSHIPSTATUSCODE,
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE
                    where ID = @MEMBERSHIPID
                end
        end
        else
            if @ACTIONCODE = 0
                begin
                    update dbo.MEMBERSHIP set
                        JOINDATE = @TRANSACTIONDATE,
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE
                    where ID = @MEMBERSHIPID
                end

    end try
    begin catch
        exec dbo.USP_RAISE_ERROR
        return 1
    end catch

return 0;