USP_MEMBERSHIPDUESBATCH_VALIDATE_ADDRENEWPROGRAM

Parameters

Parameter Parameter Type Mode Description
@CURRENTAPPUSERID uniqueidentifier IN
@ROWID uniqueidentifier IN
@BATCHID uniqueidentifier IN
@MEMBERSHIPTRANSACTIONTYPECODE tinyint IN
@TRANSACTIONDATE datetime IN
@EXPIRATIONDATE datetime IN
@MEMBERSHIPPROGRAMID uniqueidentifier IN
@MEMBERSHIPLEVELID uniqueidentifier IN
@MEMBERSHIPLEVELTERMID uniqueidentifier IN
@CONSTITUENTID uniqueidentifier IN
@REVENUETYPECODE tinyint IN
@EXISTINGMEMBERSHIPID uniqueidentifier IN
@MEMBERSHIPPROGRAMADDON xml IN
@EXISTINGMEMBERS xml IN
@MEMBERSHIPCARDS xml IN
@EXISTINGCHILDREN xml IN
@NUMBEROFCHILDREN smallint IN
@IMPORTADDON xml IN
@IMPORT bit IN
@COMMITONLYCHECK bit IN

Definition

Copy


CREATE procedure dbo.USP_MEMBERSHIPDUESBATCH_VALIDATE_ADDRENEWPROGRAM
(
    @CURRENTAPPUSERID uniqueidentifier,
    @ROWID uniqueidentifier,
    @BATCHID uniqueidentifier,
    @MEMBERSHIPTRANSACTIONTYPECODE tinyint, -- 0 = Add, 1 = Renew

    @TRANSACTIONDATE datetime,
    @EXPIRATIONDATE datetime,
    @MEMBERSHIPPROGRAMID uniqueidentifier,
    @MEMBERSHIPLEVELID uniqueidentifier,
    @MEMBERSHIPLEVELTERMID uniqueidentifier,
    @CONSTITUENTID uniqueidentifier,
    @REVENUETYPECODE tinyint,
    @EXISTINGMEMBERSHIPID uniqueidentifier,
    @MEMBERSHIPPROGRAMADDON xml,
    @EXISTINGMEMBERS xml,
    @MEMBERSHIPCARDS xml,
    @EXISTINGCHILDREN xml,            -- not currently supported

    @NUMBEROFCHILDREN smallint,        -- Temporary workaround for children not being implemented in 2012 Q1

    @IMPORTADDON xml = null,
    @IMPORT bit = 0,
    @COMMITONLYCHECK bit = 0
)
as
begin
    declare @CANBEPAIDINFULL bit = 0;
    declare @CANBEPLEDGED bit = 0;
    declare @NUMBEROFMEMBERS smallint = 0;
    declare @CHILDREN smallint = 0;
    --declare @NUMBEROFCHILDREN smallint = 0;    -- Commented out until children are implemented.

    declare @ERRORMSG nvarchar(255);
    declare @MEMBERS table(ID uniqueidentifier);
    declare @CARDS table(ID uniqueidentifier, EXPIRATIONDATE datetime);
    declare @NUMBEROFCARDSALLOWED int = 0;
    declare @ADDONS table(ID uniqueidentifier, QUANTITY integer);
    declare @ISGROUP bit = 0;
    declare @OBTAINLEVELCODE smallint = 0;

    select
        @ISGROUP = ISGROUP
    from dbo.CONSTITUENT
    where 
        ID = @CONSTITUENTID;

    -- get the Batch ID for later use

    if @ROWID is not null and @BATCHID is null
        begin
            select
                @BATCHID = BATCHMEMBERSHIPDUES.BATCHID
            from dbo.BATCHMEMBERSHIPDUES
            where ID = @ROWID;
        end

    -- Make sure Level belongs to program, term belongs to level, and level is active

    if not exists (
            select ID
            from dbo.MEMBERSHIPLEVEL
            where ID = @MEMBERSHIPLEVELID
                and MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
                and MEMBERSHIPLEVEL.ISACTIVE = 1
        )
        raiserror('BBERR_INVALIDLEVELFORPROGRAM', 13, 1);

    if not exists(
            select ID
            from dbo.MEMBERSHIPLEVELTERM
            where ID = @MEMBERSHIPLEVELTERMID
                and LEVELID = @MEMBERSHIPLEVELID
        )
        raiserror('BBERR_INVALIDTERMFORLEVEL', 13, 1);

    -- Expiration date required for annual programs

    declare @PROGRAMTYPECODE tinyint;

    select
        @CANBEPAIDINFULL = MEMBERSHIPPROGRAM.ONEPAYMENTEACHTERM,
        @CANBEPLEDGED = MEMBERSHIPPROGRAM.MULTIPLEPAYMENTSEACHTERM,
        @CHILDREN = MEMBERSHIPLEVEL.CHILDRENALLOWED, 
        @NUMBEROFMEMBERS = MEMBERSHIPLEVEL.MEMBERSALLOWED,
        @NUMBEROFCARDSALLOWED = MEMBERSHIPLEVEL.CARDSALLOWED,
        @PROGRAMTYPECODE = MEMBERSHIPPROGRAM.PROGRAMTYPECODE,
        @OBTAINLEVELCODE = MEMBERSHIPLEVEL.OBTAINLEVELCODE
    from dbo.MEMBERSHIPPROGRAM
    inner join dbo.MEMBERSHIPLEVEL 
        on MEMBERSHIPPROGRAM.ID = MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID
    where MEMBERSHIPPROGRAM.ID = @MEMBERSHIPPROGRAMID
        and MEMBERSHIPLEVEL.ID = @MEMBERSHIPLEVELID;

    if @PROGRAMTYPECODE = 0 and @EXPIRATIONDATE is null
        raiserror('BBERR_EXPIRATIONDATE_REQUIRED', 13, 1);

    if @ROWID is not null 
        and exists(select 1 from dbo.BATCHMEMBERSHIPDUES bmd
                inner join dbo.MEMBERSHIPPROGRAM mp on bmd.MEMBERSHIPPROGRAMID = mp.ID
                where 
                    mp.ALLOWMULTIPLEMEMBERSHIPS = 0
                    and bmd.ID <> @ROWID
                    and bmd.BATCHID = @BATCHID
                    and bmd.MEMBERSHIPTRANSACTIONTYPECODE = @MEMBERSHIPTRANSACTIONTYPECODE
                    and coalesce(bmd.MEMBERSHIPRECIPIENTID, bmd.BILLTOCONSTITUENTID) = @CONSTITUENTID
                    and mp.ID = @MEMBERSHIPPROGRAMID)
        begin
            raiserror('BBERR_CONSTITUENTALREADYINBATCH_FORPROGRAM', 13, 1);
        end

    -- If adding a new membership

    if @MEMBERSHIPTRANSACTIONTYPECODE = 0
        begin
            if dbo.UFN_MEMBERSHIPDUESBATCH_CANADDCONSTITUENTTOPROGRAM_3(@CONSTITUENTID, @MEMBERSHIPPROGRAMID, @MEMBERSHIPTRANSACTIONTYPECODE,@EXISTINGMEMBERSHIPID) = 0
                raiserror('BBERR_CONSTITUENTINVALIDFORPROGRAM', 13,1);
        end
    else
        begin
            -- Do not allow individuals to renew other individuals' memberships

            if @ISGROUP = 0
                begin
                    if @EXISTINGMEMBERSHIPID is not null and not exists(select 1 from dbo.MEMBER where MEMBERSHIPID = @EXISTINGMEMBERSHIPID and CONSTITUENTID = @CONSTITUENTID)
                        raiserror('BBERR_INVALIDMEMBERSHIP_FORCONSTITUENT', 13,1);
                end
            else
                begin
                    -- ensure the existing membership Id is for a member that is in the group

                    if not exists(select 1
                                  from dbo.GROUPDATA g
                                    left join dbo.GROUPMEMBER gm on g.ID = gm.GROUPID
                                    left join dbo.MEMBER m on gm.MEMBERID = m.CONSTITUENTID
                                    left join dbo.MEMBER mem on g.ID = mem.CONSTITUENTID
                                  where g.ID = @CONSTITUENTID 
                                    and (m.MEMBERSHIPID = @EXISTINGMEMBERSHIPID or mem.MEMBERSHIPID = @EXISTINGMEMBERSHIPID))
                        raiserror('BBERR_INVALIDMEMBERSHIP_FORCONSTITUENT', 13,1);
                end


            -- Do not allow backdate transaction unless it is for a pending membership

            declare @CURRENTSTATUS tinyint = 0;
            declare @JOINDATE datetime;

            select 
                @CURRENTSTATUS = STATUSCODE,
                @JOINDATE = JOINDATE
            from dbo.MEMBERSHIP 
            where ID = @EXISTINGMEMBERSHIPID;

            if exists (
                    select * 
                    from dbo.MEMBERSHIPTRANSACTION 
                    where MEMBERSHIPID = @EXISTINGMEMBERSHIPID and 
                        cast(TRANSACTIONDATE as date) > @TRANSACTIONDATE
            ) and @CURRENTSTATUS <> 2
                raiserror('BBERR_DATEEARLIERTHANLASTMEMBERSHIPTRANSACTION', 13,1);

            if @EXPIRATIONDATE < @JOINDATE
                raiserror('BBERR_EXPIRATIONDATEB4JOINDATE', 13, 1);
        end    

    if @CANBEPAIDINFULL = 0 and @REVENUETYPECODE = 0
        raiserror('BBERR_PROGRAMCANNOTBEPAIDINFULL', 13, 1);

    if @CANBEPLEDGED = 0 and @REVENUETYPECODE <> 0 and @PROGRAMTYPECODE <> 1
        raiserror('BBERR_PROGRAMCANNOTBEPLEDGED', 13, 1);

    if @PROGRAMTYPECODE = 1 and @MEMBERSHIPTRANSACTIONTYPECODE = 1 and @CURRENTSTATUS <> 1 and @CURRENTSTATUS <> 5
        begin
            raiserror('BBERR_RECURRINGPROGRAMCANNOTBERENEWED', 13, 1);    
        end

    insert into @MEMBERS(ID)
        select 
            T.members.value('(CONSTITUENTID)[1]','uniqueidentifier'
        from @EXISTINGMEMBERS.nodes('/EXISTINGMEMBERS/ITEM') T(members)

    declare @ADDITIONALMEMBERS integer = 0;

    if @IMPORT = 0
        insert into @ADDONS(ID, QUANTITY)
            select 
                T.c.value('ADDONID [1]', 'uniqueidentifier'),
                T.c.value('NUMBEROFADDONS [1]', 'int')
            from @MEMBERSHIPPROGRAMADDON.nodes('/MEMBERSHIPPROGRAMADDON/ITEM') T(c)
            where T.c.value('APPLY [1]', 'bit') = 1;
    else
        insert into @ADDONS(ID, QUANTITY)
            select 
                T.c.value('ADDONID [1]', 'uniqueidentifier'),
                T.c.value('NUMBEROFADDONS [1]', 'int')
            from @IMPORTADDON.nodes('/IMPORTADDON/ITEM') T(c)

    if @OBTAINLEVELCODE = 1 and exists(select 1 from @ADDONS)
        begin
            raiserror('BBERR_CANNOTUSEADDONFORCONTRIBUTIONLEVEL', 13, 1);
        end

    if exists(
        select addons.ID
        from @ADDONS addons
        left outer join dbo.MEMBERSHIPPROGRAMADDON
            on addons.ID = MEMBERSHIPPROGRAMADDON.ADDONID
                and MEMBERSHIPPROGRAMADDON.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
        where MEMBERSHIPPROGRAMADDON.ID is null
    )
        raiserror('BBERR_INVALIDADDON', 13, 1);

    if exists(
        select addons.ID
        from @ADDONS addons
        left outer join dbo.MEMBERSHIPPROGRAMADDON
            on addons.ID = MEMBERSHIPPROGRAMADDON.ADDONID
                and MEMBERSHIPPROGRAMADDON.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
        where MEMBERSHIPPROGRAMADDON.MULTIPLEALLOWED = 0
        and addons.QUANTITY > 1
    )
        raiserror('BBERR_MULTIPLENOTALLOWED', 13, 1);

    select 
        @ADDITIONALMEMBERS = sum(addons.QUANTITY)
    from @ADDONS addons
    inner join dbo.ADDON A 
        on addons.ID = A.ID
    where A.ADDONTYPECODE = 1;

    set @NUMBEROFMEMBERS = @NUMBEROFMEMBERS + coalesce(@ADDITIONALMEMBERS, 0);

    set @ERRORMSG = 'Only ' +convert(nvarchar(6), @NUMBEROFMEMBERS)+ ' members are allowed for this membership.'

    declare @ADDITIONALMEMBERSPRESENT integer = 0
    select 
        @ADDITIONALMEMBERSPRESENT = coalesce(count(ID), 0)
    from @MEMBERS

    if @NUMBEROFMEMBERS < (@ADDITIONALMEMBERSPRESENT + 1) --and @NUMBEROFMEMBERS > 0

        raiserror(@ERRORMSG, 13, 1);

-- Commented out until children are implemented.

--    select @NUMBEROFCHILDREN = count(*)

--    from @EXISTINGCHILDREN.nodes('/EXISTINGCHILDREN/ITEM') T(c)

--


    -- Number of children validation

    if @CHILDREN < @NUMBEROFCHILDREN --and @CHILDREN > 0

    begin
        raiserror('BBERR_TOOMANYCHILDREN', 13, 1);
    end

    if exists (
            select ID
            from @MEMBERS
            where ID = @CONSTITUENTID
        )
        or exists (
            select count(CONSTITID)
            from
            (
                select ID as CONSTITID
                from @MEMBERS

                union all

                select @CONSTITUENTID as CONSTITID
            ) Result
            group by CONSTITID
            having count(*) > 1
        )
        raiserror('BBERR_DUPLICATEMEMBER', 13,1);

    insert into @CARDS(ID, EXPIRATIONDATE)
        select 
            T.membershipcards.value('(CONSTITUENTID)[1]','uniqueidentifier'),
            T.membershipcards.value('(EXPIRATIONDATE)[1]','datetime')
        from @MEMBERSHIPCARDS.nodes('/MEMBERSHIPCARDS/ITEM') T(membershipcards);

    if @NUMBEROFCARDSALLOWED < (select count(ID) from @CARDS)
        begin

            set @ERRORMSG = 
                case 
                    when @NUMBEROFCARDSALLOWED = 1 then 'Only 1 membership card is allowed for this membership.'
                    else 'Only ' + convert(nvarchar(6), @NUMBEROFCARDSALLOWED) + ' membership cards are allowed for this membership.'
                end;
            raiserror(@ERRORMSG, 13, 1)
        end
    if @COMMITONLYCHECK = 1
    begin
        if @ISGROUP = 0 
        begin
            -- individuals cannot have people on the cards that aren't on the membership

            if exists (
                select cards.ID
                from @CARDS cards
                left outer join @MEMBERS members
                    on cards.ID = members.ID
                where members.ID is null 
                    and cards.ID <> @CONSTITUENTID
            )
                raiserror('BBERR_CARDSFORMEMBERSONLY', 13, 1);
        end
        else
        begin
            -- groups however, can renew a membership for someone and not be on the card.

            if exists (
                select cards.ID
                from @CARDS cards
                left outer join @MEMBERS members
                    on cards.ID = members.ID
                left outer join dbo.UFN_GROUP_GETCURRENTMEMBERS(@CONSTITUENTID, @CURRENTAPPUSERID, 'aef629df-9698-41b4-97c3-a83a40f87b18', 0) groupmembers
                    on cards.ID = groupmembers.ID
                where 
                    members.ID is null 
                    and groupmembers.ID is null
                    and cards.ID <> @CONSTITUENTID
            )
                raiserror('BBERR_CARDSFORMEMBERSONLY', 13, 1);
        end
    end

    if exists (
        select ID
        from @CARDS cards        
        where cards.EXPIRATIONDATE < @TRANSACTIONDATE
    )
        raiserror('BBERR_INVALIDCARDEXPIRATIONDATE', 13, 1);

    -- If renewing for a program

    if @MEMBERSHIPTRANSACTIONTYPECODE = 1 and exists (
        select 1
        from dbo.MEMBERSHIP M
            inner join dbo.MEMBER MB on M.ID = MB.MEMBERSHIPID
            inner join dbo.MEMBERSHIPPROGRAM MP on M.MEMBERSHIPPROGRAMID = MP.ID
            inner join dbo.MEMBERSHIP existing on existing.ID = @EXISTINGMEMBERSHIPID
        where 
            M.STATUSCODE <> 1 -- membership is not cancelled

            and existing.STATUSCODE = 1 -- selected to renew is cancelled

            and MP.ALLOWMULTIPLEMEMBERSHIPS = 0
            and MP.ID = @MEMBERSHIPPROGRAMID
            and M.ID <> @EXISTINGMEMBERSHIPID
            and MB.CONSTITUENTID = @CONSTITUENTID
    )
        raiserror('BBERR_MUSTRENEW_ACTIVEMEMBERSHIP', 13, 1);
end