USP_ADD_APPLYTICKETSTOMEMBERSHIP

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@SALESORDERITEMID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@SALESORDERID uniqueidentifier IN
@SALESORDERITEMMEMBERSHIPITEMPROMOTIONID uniqueidentifier IN
@SOURCESALESORDERID uniqueidentifier IN
@PROMOTIONNAME nvarchar(255) IN
@ITEMS xml IN
@TOTALDISCOUNT money IN

Definition

Copy


create procedure dbo.USP_ADD_APPLYTICKETSTOMEMBERSHIP
(
    @ID uniqueidentifier = null output,    
    @SALESORDERITEMID uniqueidentifier,    
    @CHANGEAGENTID uniqueidentifier = null,    
    @SALESORDERID uniqueidentifier = null,
    @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID uniqueidentifier = null,
    @SOURCESALESORDERID uniqueidentifier = null,
    @PROMOTIONNAME nvarchar(255) = '',
    @ITEMS xml = null,
    @TOTALDISCOUNT money = null
)
as
    set nocount on;

    if @ID is null
        set @ID = newid();

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

    declare @CURRENTDATE datetime
    set @CURRENTDATE = getdate()

    declare @ITEMSTABLE table (
        APPLIED bit,
        TICKETID uniqueidentifier,
        SALESORDERITEMID uniqueidentifier,
        AMOUNTTOAPPLY money
    )

    insert into @ITEMSTABLE (
        APPLIED,
        TICKETID,
        SALESORDERITEMID,
        AMOUNTTOAPPLY
    )
    select
        T.item.value('(APPLIED)[1]','bit'),
        T.item.value('(TICKETID)[1]','uniqueidentifier'),
        T.item.value('(SALESORDERITEMID)[1]','uniqueidentifier'),
        T.item.value('(AMOUNTTOAPPLY)[1]','decimal(20, 4)')
    from
        @ITEMS.nodes('/ITEMS/ITEM') as T(item)

    begin try
        exec dbo.USP_SALESORDER_ISCOMPLETE_RAISERROR @SALESORDERID, @EXCLUDEGROUPSALES = 1;

        if not (select count(*) from @ITEMSTABLE where APPLIED = 1) > 0
        begin    
            raiserror('ERR_APPLYTICKETSTOMEMBERSHIP_QUANTITYAPPLYINGZERO', 13, 1);
        end               

        declare @MEMBERSHIPCOST as money;

        select 
            @MEMBERSHIPCOST = (TOTAL - coalesce(DISCOUNTS.TOTALDISCOUNT, 0))
        from
            dbo.SALESORDERITEM
        left outer join (
            select
                sum(AMOUNT) TOTALDISCOUNT,
                SALESORDERITEMID
            from
                dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
            where
                SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID = @SALESORDERITEMID and
                SALESORDERITEMMEMBERSHIPITEMPROMOTION.ID <> @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID
            group by
                SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID
        ) DISCOUNTS on SALESORDERITEM.ID = DISCOUNTS.SALESORDERITEMID
        where
            SALESORDERITEM.ID = @SALESORDERITEMID;

        if @MEMBERSHIPCOST < @TOTALDISCOUNT
            set @TOTALDISCOUNT = @MEMBERSHIPCOST;

        if @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID is null begin
            set @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID = @ID;

            insert into dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION (
                ID,
                SALESORDERITEMID,
                PROMOTIONNAME,        
                AMOUNT,             
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            values (
                @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID,
                @SALESORDERITEMID,        
                @PROMOTIONNAME,  --change

                @TOTALDISCOUNT,              
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            )
        end
        else begin
            -- Hack since this is an add form that edits a record

            set @ID = @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID;

            update dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION set
                AMOUNT = @TOTALDISCOUNT,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
            where
                ID = @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID;

            --delete current promo information    

            delete from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTIONAPPLIEDITEM
            where SALESORDERITEMMEMBERSHIPITEMPROMOTIONAPPLIEDITEM.SALESORDERITEMMEMBERSHIPITEMPROMOTIONID = @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID
        end

        --insert new applied items  

        insert into dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTIONAPPLIEDITEM (
            ID,
            SALESORDERITEMMEMBERSHIPITEMPROMOTIONID,
            APPLIEDSALESORDERITEMID,
            QUANTITY,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )   
        select
            newid(),
            @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID,
            ITEMSTABLE.SALESORDERITEMID,
            count(*),
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        from
            @ITEMSTABLE as ITEMSTABLE
        where
            ITEMSTABLE.APPLIED = 1
        group by
            ITEMSTABLE.SALESORDERITEMID

        --apply tickets

        insert into dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTIONAPPLIEDITEMTICKET (
            ID,
            SALESORDERITEMMEMBERSHIPITEMPROMOTIONAPPLIEDITEMID,
            TICKETID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED,
            AMOUNTAPPLIED
        )    
        select
            newid(),
            APPLIED.ID,
            TICKET.ID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE,
            ITEMSTABLE.AMOUNTTOAPPLY
        from
            dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION PROMOTION
        inner join
            dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTIONAPPLIEDITEM APPLIED on PROMOTION.ID = APPLIED.SALESORDERITEMMEMBERSHIPITEMPROMOTIONID
        inner join
            dbo.TICKET on APPLIED.APPLIEDSALESORDERITEMID = TICKET.SALESORDERITEMTICKETID
        inner join
            @ITEMSTABLE ITEMSTABLE on ITEMSTABLE.TICKETID = TICKET.ID
        where                            
            PROMOTION.ID = @SALESORDERITEMMEMBERSHIPITEMPROMOTIONID
            and ITEMSTABLE.APPLIED = 1
            and TICKET.STATUSCODE in (0, 1)  -- Active, Reserved

            and TICKET.APPLIEDTOMEMBERSHIP = 0

        --set tickets to applied

        update dbo.TICKET set
            APPLIEDTOMEMBERSHIP = ITEMSTABLE.APPLIED,
            APPLIEDTOMEMBERSHIPSALESORDERID = case 
                                                  ITEMSTABLE.APPLIED
                                              when 1 then
                                                  @SALESORDERID
                                              else
                                                  null
                                              end,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        from
            dbo.TICKET
            inner join @ITEMSTABLE ITEMSTABLE
                on ITEMSTABLE.TICKETID = TICKET.ID
    end try

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

    return 0;