USP_SALESORDERITEMMEMBERSHIP_ONLINE_GENERIC_UPDATE

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@SALESORDERID uniqueidentifier IN
@DESCRIPTION nvarchar(255) IN
@QUANTITY decimal(18, 0) IN
@AMOUNT money IN
@DATA xml IN
@OPTIONS xml IN
@CALLBACKURL nvarchar(255) IN
@SYSTEMTYPENAME nvarchar(255) IN
@ASSEMBLYNAME nvarchar(255) IN
@ATTRIBUTES xml IN
@CATEGORYNAME nvarchar(255) IN
@ACKNOWLEDGEMENT nvarchar(max) IN
@MEMBERSHIPID uniqueidentifier IN
@MEMBERSHIPPROGRAMID uniqueidentifier IN
@MEMBERSHIPLEVELID uniqueidentifier IN
@MEMBERSHIPLEVELTERMID uniqueidentifier IN
@MEMBERSHIPLEVELTYPEID uniqueidentifier IN
@MEMBERSHIPADDONS xml IN
@NUMBEROFCHILDREN tinyint IN

Definition

Copy


CREATE procedure USP_SALESORDERITEMMEMBERSHIP_ONLINE_GENERIC_UPDATE (
    @ID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @SALESORDERID uniqueidentifier,
    @DESCRIPTION nvarchar(255),
    @QUANTITY decimal,
    @AMOUNT money,
    @DATA xml,
    @OPTIONS xml,
    @CALLBACKURL nvarchar(255),
    @SYSTEMTYPENAME nvarchar(255),
    @ASSEMBLYNAME nvarchar(255),
    @ATTRIBUTES xml,
    @CATEGORYNAME nvarchar(255),
    @ACKNOWLEDGEMENT nvarchar(max),
    @MEMBERSHIPID uniqueidentifier,
    @MEMBERSHIPPROGRAMID uniqueidentifier,
    @MEMBERSHIPLEVELID uniqueidentifier,
    @MEMBERSHIPLEVELTERMID uniqueidentifier,
    @MEMBERSHIPLEVELTYPEID uniqueidentifier,
    @MEMBERSHIPADDONS xml,
    @NUMBEROFCHILDREN tinyint = 0
)
as
set nocount on;

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

declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()

-- handle inserting the data

merge dbo.[SALESORDERITEM] as [TARGET]
using (select @ID as ID) as [SOURCE]
on (TARGET.ID = SOURCE.ID)
when matched then
    update 
    set 
        [SALESORDERID] = @SALESORDERID
        [TYPECODE] = 1
        [DESCRIPTION] = @DESCRIPTION
        [QUANTITY] = 1
        [PRICE] = @AMOUNT,
        [CHANGEDBYID] = @CHANGEAGENTID
        [DATECHANGED] = @CURRENTDATE,
        [DATA] = @DATA,
        [OPTIONS] = @OPTIONS,
        [CALLBACKURL] = @CALLBACKURL,
        [SYSTEMTYPENAME] = @SYSTEMTYPENAME,
        [ASSEMBLYNAME] = @ASSEMBLYNAME,
        [ATTRIBUTES] = @ATTRIBUTES,
        [CATEGORYNAME] = @CATEGORYNAME,
        [ACKNOWLEDGEMENT] = @ACKNOWLEDGEMENT
    when not matched then
        insert (
            [ID], 
            [SALESORDERID], 
            [TYPECODE], 
            [DESCRIPTION], 
            [QUANTITY], 
            [PRICE], 
            [ADDEDBYID], 
            [CHANGEDBYID], 
            [DATEADDED], 
            [DATECHANGED],
            [DATA],
            [OPTIONS],
            [CALLBACKURL],
            [SYSTEMTYPENAME],
            [ASSEMBLYNAME],
            [ATTRIBUTES],
            [CATEGORYNAME],
            [ACKNOWLEDGEMENT]
        )
        values
        (
            @ID
            @SALESORDERID
            1
            @DESCRIPTION
            1
            @AMOUNT,
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE,
            @DATA,
            @OPTIONS,
            @CALLBACKURL,
            @SYSTEMTYPENAME,
            @ASSEMBLYNAME,
            @ATTRIBUTES,
            @CATEGORYNAME,
            @ACKNOWLEDGEMENT
        );

    declare @EXPIRATIONDATE datetime;
    declare @ACTIONCODE tinyint;
    select @ACTIONCODE = dbo.UFN_MEMBERSHIPTRANSACTION_DETERMINEACTIONCODE(@MEMBERSHIPID, @MEMBERSHIPLEVELID, @CURRENTDATE)

    if @ACTIONCODE = 0 or @ACTIONCODE = 5 --join/rejoin

        set @EXPIRATIONDATE = dbo.UFN_MEMBERSHIP_CALCULATEEXPIRATIONDATEBYLEVEL(@MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @CURRENTDATE);
    else
    begin
        declare @CURRENTSTATUS tinyint;
        select 
            @EXPIRATIONDATE = [EXPIRATIONDATE], 
            @CURRENTSTATUS = [STATUSCODE]
        from dbo.[MEMBERSHIP] 
        where ID = @MEMBERSHIPID;

        if @CURRENTSTATUS = 2 --pending membership                    

            set @EXPIRATIONDATE = dbo.UFN_MEMBERSHIP_CALCULATEEXPIRATIONDATEBYLEVEL(@MEMBERSHIPLEVELID, @MEMBERSHIPLEVELTERMID, @CURRENTDATE);
        else
            set @EXPIRATIONDATE = dbo.UFN_MEMBERSHIP_CALCULATERENEWALEXPIRATION(@EXPIRATIONDATE, @MEMBERSHIPLEVELTERMID);
    end

    declare @MEMBERSHIPLEVELTYPECODEID uniqueidentifier = null;
    if @MEMBERSHIPLEVELTYPEID is not null
        select @MEMBERSHIPLEVELTYPECODEID = [LEVELTYPECODEID] from dbo.[MEMBERSHIPLEVELTYPE] where [ID] = @MEMBERSHIPLEVELTYPEID;

    merge dbo.[SALESORDERITEMMEMBERSHIP] as [TARGET]
    using (select @ID as ID) as [SOURCE]
    on (TARGET.ID = SOURCE.ID)
    when matched then
        update
        set
            [MEMBERSHIPID] = @MEMBERSHIPID,
            [MEMBERSHIPPROGRAMID] = @MEMBERSHIPPROGRAMID,
            [MEMBERSHIPLEVELID] = @MEMBERSHIPLEVELID,
            [MEMBERSHIPLEVELTERMID] = @MEMBERSHIPLEVELTERMID,
            [MEMBERSHIPLEVELTYPECODEID] = @MEMBERSHIPLEVELTYPECODEID,
            [EXPIRATIONDATE] = @EXPIRATIONDATE,
            [NUMBEROFCHILDREN] = @NUMBEROFCHILDREN,
            [CHANGEDBYID] = @CHANGEAGENTID
            [DATECHANGED] = @CURRENTDATE
    when not matched then
        insert (
            [ID],
            [MEMBERSHIPID],
            [MEMBERSHIPPROGRAMID],
            [MEMBERSHIPLEVELID],
            [MEMBERSHIPLEVELTERMID],
            [MEMBERSHIPLEVELTYPECODEID],
            [EXPIRATIONDATE],
            [NUMBEROFCHILDREN],
            [ADDEDBYID], 
            [CHANGEDBYID], 
            [DATEADDED], 
            [DATECHANGED]
        )
        values (
            @ID,
            @MEMBERSHIPID,
            @MEMBERSHIPPROGRAMID,
            @MEMBERSHIPLEVELID,
            @MEMBERSHIPLEVELTERMID,
            @MEMBERSHIPLEVELTYPECODEID,
            @EXPIRATIONDATE,
            @NUMBEROFCHILDREN,
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        );

    --Handle add-ons

    declare @ADDONS_TABLE table (
        [ID] uniqueidentifier,
        [ADDONID] uniqueidentifier,
        [ADDONNAME] nvarchar(100),
        [ADDONTYPECODE] tinyint,
        [PRICE] money,
        [quantity] smallint
    );

    insert into @ADDONS_TABLE select
        isnull(SALESORDERITEMMEMBERSHIPADDON.ID, newid()),
        ADDON.ID,
        ADDON.NAME,
        ADDON.ADDONTYPECODE,
        T.membershipaddon.value('(PRICE)[1]','money') as 'PRICE',
        T.membershipaddon.value('(QUANTITY)[1]','int') as 'NUMBEROFADDONS'
    from @MEMBERSHIPADDONS.nodes('/MEMBERSHIPADDONS/ITEM') T(membershipaddon)
    inner join dbo.ADDON with (nolock) on
        T.membershipaddon.value('(ADDONID)[1]','uniqueidentifier') = ADDON.ID
    left join dbo.SALESORDERITEMMEMBERSHIPADDON on
        SALESORDERITEMMEMBERSHIPADDON.SALESORDERITEMMEMBERSHIPID = @ID and
        SALESORDERITEMMEMBERSHIPADDON.ADDONID = ADDON.ID

    --delete, add, and update sales order items

    delete dbo.SALESORDERITEM
    from dbo.SALESORDERITEM
    inner join dbo.SALESORDERITEMMEMBERSHIPADDON on
        SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIPADDON.ID
    where 
        SALESORDERITEMMEMBERSHIPADDON.SALESORDERITEMMEMBERSHIPID = @ID and
        not exists (
            select 1
            from @ADDONS_TABLE [ADDONS]
            where SALESORDERITEM.ID = ADDONS.ID
        )

    update dbo.SALESORDERITEM
    set
        [DESCRIPTION] = ADDONS.ADDONNAME,
        QUANTITY = ADDONS.QUANTITY,
        PRICE = ADDONS.PRICE,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from dbo.SALESORDERITEM
    inner join @ADDONS_TABLE [ADDONS] on
        SALESORDERITEM.ID = [ADDONS].ID

    insert into dbo.SALESORDERITEM
    (
        ID,
        SALESORDERID,
        TYPECODE,
        [DESCRIPTION],
        QUANTITY,
        PRICE,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
    )
    (
        select
            [ADDONS].ID,
            @SALESORDERID,
            16,
            [ADDONS].ADDONNAME,
            [ADDONS].QUANTITY,
            [ADDONS].PRICE,
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        from @ADDONS_TABLE [ADDONS]
        where not exists (select 1 from dbo.SALESORDERITEM where ID = ADDONS.ID)
    );

    update dbo.SALESORDERITEMMEMBERSHIPADDON
    set
        SALESORDERITEMMEMBERSHIPID = @ID,
        ADDONTYPECODE = ADDONS.ADDONTYPECODE,
        ADDONID = ADDONS.ADDONID,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    from dbo.SALESORDERITEMMEMBERSHIPADDON
    inner join @ADDONS_TABLE [ADDONS] on
        SALESORDERITEMMEMBERSHIPADDON.ID = [ADDONS].ID

    insert into dbo.SALESORDERITEMMEMBERSHIPADDON
    (
        ID,
        SALESORDERITEMMEMBERSHIPID,
        ADDONTYPECODE,
        ADDONID,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED
    )
    (
        select
            [ADDONS].ID,
            @ID,
            [ADDONS].ADDONTYPECODE,
            [ADDONS].ADDONID,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        from @ADDONS_TABLE [ADDONS]
        where not exists (select 1 from dbo.SALESORDERITEMMEMBERSHIPADDON where ID = ADDONS.ID)
    );

    exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @SALESORDERID, @CHANGEAGENTID;
    exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @SALESORDERID, @CHANGEAGENTID;    
    exec dbo.USP_SALESORDER_CALCULATETAXES @SALESORDERID, @CHANGEAGENTID;  
    exec dbo.USP_SALESORDER_UPDATEMEMBERSHIPPROMOS @SALESORDERID, @CHANGEAGENTID;
return 0;