USP_MKTCOMMUNICATIONTEMPLATEDEFAULTKPI_SAVEFIELD_FROMXML

Parameters

Parameter Parameter Type Mode Description
@COMMUNICATIONTEMPLATEID uniqueidentifier IN
@KPICATALOGIDS xml IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTAPPUSERID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.[USP_MKTCOMMUNICATIONTEMPLATEDEFAULTKPI_SAVEFIELD_FROMXML]
(
  @COMMUNICATIONTEMPLATEID uniqueidentifier,
  @KPICATALOGIDS xml,
  @CHANGEAGENTID uniqueidentifier = null,
  @CURRENTAPPUSERID uniqueidentifier = null
)
as
  set nocount on;

  declare @TEMPLATETYPECODE tinyint;
  declare @KPIS table ([KPICATALOGID] uniqueidentifier, [LOCKED] bit);
  declare @ID uniqueidentifier;
  declare @CURRENTDATE datetime;

  begin try
    if @CHANGEAGENTID is null  
      exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;

    set @CURRENTDATE = getdate();

    select @TEMPLATETYPECODE = [TEMPLATETYPECODE] from dbo.[MKTCOMMUNICATIONTEMPLATE] where [ID] = @COMMUNICATIONTEMPLATEID;

    insert into @KPIS
    select
      T.c.value('(@KPICATALOGID)[1]', 'uniqueidentifier') as [KPICATALOGID],
      T.c.value('(@LOCKED)[1]', 'bit') as [LOCKED]
    from @KPICATALOGIDS.nodes('/DEFAULTKPIS/ITEM') T(c);

    if @TEMPLATETYPECODE <> 2
      and exists (select top 1 1
                  from @KPIS as [KPIS]
                  inner join dbo.[KPICATALOG] on [KPICATALOG].[ID] = [KPIS].[KPICATALOGID]
                  where isnull([KPICATALOG].[SPECXML].value(
                    'declare namespace bbafx="bb_appfx_kpi";
                    declare namespace c="bb_appfx_commontypes";
                    (bbafx:KpiSpec/c:MetaTags/@MarketingMembershipMailingKPI)[1]', 'tinyint')
                  , 0) = 1)
      begin
        raiserror('BBERR_MKTCOMMUNICATIONTEMPLATEDEFAULTKPI_INVALIDKPI', 13, 1);
        return 1;
      end

    -- update existing KPIs

    update dbo.[MKTCOMMUNICATIONTEMPLATEDEFAULTKPI] set
      [LOCKED] = [KPIS].[LOCKED],
      [CHANGEDBYID] = @CHANGEAGENTID,
      [DATECHANGED] = @CURRENTDATE
    from dbo.[MKTCOMMUNICATIONTEMPLATEDEFAULTKPI]
    inner join @KPIS as [KPIS] on [MKTCOMMUNICATIONTEMPLATEDEFAULTKPI].[KPICATALOGID] = [KPIS].[KPICATALOGID] 
                              and [MKTCOMMUNICATIONTEMPLATEDEFAULTKPI].[COMMUNICATIONTEMPLATEID] = @COMMUNICATIONTEMPLATEID;

    -- insert KPIs that do not already exist

    insert into dbo.[MKTCOMMUNICATIONTEMPLATEDEFAULTKPI]
    (
      [ID],
      [COMMUNICATIONTEMPLATEID],
      [KPICATALOGID],
      [LOCKED],
      [ADDEDBYID],
      [DATEADDED],
      [CHANGEDBYID],
      [DATECHANGED]
    )
    select
      newid(),
      @COMMUNICATIONTEMPLATEID,
      [KPIS].[KPICATALOGID],
      [KPIS].[LOCKED],
      @CHANGEAGENTID,
      @CURRENTDATE,
      @CHANGEAGENTID,
      @CURRENTDATE
    from @KPIS as [KPIS]
    where not exists (
      select top 1 1
      from dbo.[MKTCOMMUNICATIONTEMPLATEDEFAULTKPI]
      where [MKTCOMMUNICATIONTEMPLATEDEFAULTKPI].[COMMUNICATIONTEMPLATEID] = @COMMUNICATIONTEMPLATEID
      and [MKTCOMMUNICATIONTEMPLATEDEFAULTKPI].[KPICATALOGID] = [KPIS].[KPICATALOGID]);

    -- delete KPIs that no longer exist

    declare DELETECURSOR cursor local fast_forward for
      select
        [MKTCOMMUNICATIONTEMPLATEDEFAULTKPI].[ID]
      from dbo.[MKTCOMMUNICATIONTEMPLATEDEFAULTKPI]
      where [COMMUNICATIONTEMPLATEID] = @COMMUNICATIONTEMPLATEID
      and not exists (select top 1 1
                      from @KPIS as [KPIS]
                      where [KPIS].[KPICATALOGID] = [MKTCOMMUNICATIONTEMPLATEDEFAULTKPI].[KPICATALOGID])
      and (@CURRENTAPPUSERID is null or dbo.[UFN_SECURITY_APPUSER_GRANTED_KPI](@CURRENTAPPUSERID, [KPICATALOGID]) = 1);

    open DELETECURSOR;
    fetch next from DELETECURSOR into @ID;

    while (@@FETCH_STATUS = 0)
      begin
        exec dbo.[USP_MKTCOMMUNICATIONTEMPLATEDEFAULTKPI_DELETEBYID_WITHCHANGEAGENTID] @ID, @CHANGEAGENTID;
        fetch next from DELETECURSOR into @ID;
      end

    close DELETECURSOR;
    deallocate DELETECURSOR;
  end try

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

  return 0;