USP_DATAFORMTEMPLATE_EDIT_MKTSEGMENTATIONSEGMENT_8

The save procedure used by the edit dataform template "Marketing Effort Segment Edit Form 4".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter indicating the ID of the record being edited.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@SEGMENTID uniqueidentifier IN Segment
@CODE nvarchar(10) IN Code
@TESTSEGMENTCODE nvarchar(10) IN Test segment
@PACKAGEID uniqueidentifier IN Package
@PACKAGECODE nvarchar(10) IN Package code
@RESPONSERATE decimal(5, 2) IN Response rate
@GIFTAMOUNT money IN Gift amount
@SAMPLESIZE int IN Sample size
@SAMPLESIZETYPECODE tinyint IN Sample size type
@SAMPLESIZEMETHODCODE tinyint IN Sample size method
@SAMPLESIZEEXCLUDEREMAINDER bit IN Exclude remaining records from the marketing effort
@ASKLADDERID uniqueidentifier IN Ask ladder
@OVERRIDEADDRESSPROCESSING bit IN Override address processing / name format rules
@USEADDRESSPROCESSING bit IN Use address processing?
@ADDRESSPROCESSINGOPTIONID uniqueidentifier IN Address processing options
@ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE tinyint IN Consider seasonal addresses as of
@ADDRESSPROCESSINGOPTIONSEASONALASOFDATE datetime IN Consider seasonal addresses as of
@NAMEFORMATPARAMETERID uniqueidentifier IN Name format options
@CODEVALUEID uniqueidentifier IN Code value ID
@PACKAGECODEVALUEID uniqueidentifier IN Package code value ID
@TESTSEGMENTCODEVALUEID uniqueidentifier IN Test segment code value ID
@ITEMLIST xml IN Items
@CHANNELSOURCECODE nvarchar(10) IN Channel source code
@CHANNELSOURCECODEVALUEID uniqueidentifier IN Channel code value ID
@EXCLUDESPOUSE bit IN Exclude spouse (invalid)
@OVERRIDEBUSINESSUNITS bit IN Override business units
@BUSINESSUNITS xml IN Business units
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@EXCLUDE bit IN Exclude from effort but show counts

Definition

Copy


CREATE procedure dbo.[USP_DATAFORMTEMPLATE_EDIT_MKTSEGMENTATIONSEGMENT_8]
(
  @ID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier = null,
  @SEGMENTID uniqueidentifier,
  @CODE nvarchar(10),
  @TESTSEGMENTCODE nvarchar(10),
  @PACKAGEID uniqueidentifier,
  @PACKAGECODE nvarchar(10),
  @RESPONSERATE decimal(5,2),
  @GIFTAMOUNT money,
  @SAMPLESIZE int,
  @SAMPLESIZETYPECODE tinyint,
  @SAMPLESIZEMETHODCODE tinyint,
  @SAMPLESIZEEXCLUDEREMAINDER bit,
  @ASKLADDERID uniqueidentifier,
  @OVERRIDEADDRESSPROCESSING bit,
  @USEADDRESSPROCESSING bit,
  @ADDRESSPROCESSINGOPTIONID uniqueidentifier,
  @ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE tinyint,
  @ADDRESSPROCESSINGOPTIONSEASONALASOFDATE datetime,
  @NAMEFORMATPARAMETERID uniqueidentifier,
  @CODEVALUEID uniqueidentifier,
  @PACKAGECODEVALUEID uniqueidentifier,
  @TESTSEGMENTCODEVALUEID uniqueidentifier,
  @ITEMLIST xml,
  @CHANNELSOURCECODE nvarchar(10),
  @CHANNELSOURCECODEVALUEID uniqueidentifier,
  @EXCLUDESPOUSE bit,
  @OVERRIDEBUSINESSUNITS bit,
  @BUSINESSUNITS xml,
  @CURRENTAPPUSERID uniqueidentifier,
  @EXCLUDE bit
)
as
  set nocount on;

  declare @SQL nvarchar(max);
  declare @SEGMENTATIONID uniqueidentifier;
  declare @DATATABLENAME nvarchar(128);
  declare @ACTIVE bit;
  declare @SEGMENTTYPECODE tinyint;
  declare @ISVENDORMANAGED bit;
  declare @SOURCECODEID uniqueidentifier;
  declare @MAILINGTYPECODE tinyint;
  declare @PACKAGECHANNELCODE tinyint;
  declare @OLDSEGMENTID uniqueidentifier;
  declare @OLDEXCLUDE bit;
  declare @OLDSEGMENTATIONPACKAGEID uniqueidentifier;
  declare @OLDPACKAGEID uniqueidentifier;
  declare @OLDPACKAGECHANNELCODE tinyint;
  declare @OLDSAMPLESIZE int;
  declare @OLDSAMPLESIZETYPECODE tinyint;
  declare @OLDSAMPLESIZEMETHODCODE tinyint;
  declare @OLDSAMPLESIZEEXCLUDEREMAINDER bit;
  declare @OLDASKLADDERID uniqueidentifier;
  declare @OLDUSEADDRESSPROCESSING bit;
  declare @OLDADDRESSPROCESSINGOPTIONID uniqueidentifier;
  declare @CURRENTDATE datetime;
  declare @BASECURRENCYID uniqueidentifier;
  declare @ORGANIZATIONCURRENCYID uniqueidentifier;
  declare @ORGANIZATIONGIFTAMOUNT money;
  declare @ORGANIZATIONCURRENCYEXCHANGERATEID uniqueidentifier;
  declare @DATEADDED datetime;
  declare @TESTSEGMENTID uniqueidentifier;

  begin try
    select
      @SEGMENTATIONID = [MKTSEGMENTATION].[ID],
      @DATATABLENAME = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([MKTSEGMENTATION].[ID]),
      @SOURCECODEID = [MKTSEGMENTATION].[SOURCECODEID],
      @ACTIVE = [MKTSEGMENTATION].[ACTIVE],
      @SEGMENTTYPECODE = [MKTSEGMENT].[SEGMENTTYPECODE],
      @ISVENDORMANAGED = (case when [MKTSEGMENT].[SEGMENTTYPECODE] = 2 then dbo.[UFN_MKTSEGMENT_ISVENDORMANAGEDLIST]([MKTSEGMENT].[ID]) else 0 end),
      @MAILINGTYPECODE = [MKTSEGMENTATION].[MAILINGTYPECODE],
      @OLDUSEADDRESSPROCESSING = case when [MKTSEGMENTATIONSEGMENT].[OVERRIDEADDRESSPROCESSING] = 1 then [MKTSEGMENTATIONSEGMENT].[USEADDRESSPROCESSING] else [MKTSEGMENTATION].[USEADDRESSPROCESSING] end,
      @OLDADDRESSPROCESSINGOPTIONID = case when [MKTSEGMENTATIONSEGMENT].[OVERRIDEADDRESSPROCESSING] = 1 then [MKTSEGMENTATIONSEGMENT].[ADDRESSPROCESSINGOPTIONID] else [MKTSEGMENTATION].[ADDRESSPROCESSINGOPTIONID] end,
      @BASECURRENCYID = [MKTSEGMENTATIONSEGMENT].[BASECURRENCYID],
      @ORGANIZATIONCURRENCYEXCHANGERATEID = [MKTSEGMENTATIONSEGMENT].[CURRENCYEXCHANGERATEID],
      @DATEADDED = [MKTSEGMENTATIONSEGMENT].[DATEADDED]
    from dbo.[MKTSEGMENTATIONSEGMENT]
    inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
    inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
    where [MKTSEGMENTATIONSEGMENT].[ID] = @ID;

    if @ACTIVE = 0
      begin
        --Check if the mailing is currently being activated...

        exec dbo.[USP_MKTSEGMENTATION_CHECKACTIVATION] @SEGMENTATIONID;

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

        set @CURRENTDATE = getdate();

        if @PACKAGEID is not null
          select @PACKAGECHANNELCODE = [CHANNELCODE] from dbo.[MKTPACKAGE] where [ID] = @PACKAGEID;
        else
          set @PACKAGECHANNELCODE = 255;

        /* Grab the old packageID info before we save the segment */
        select 
          @OLDSEGMENTID = [MKTSEGMENTATIONSEGMENT].[SEGMENTID],
          @OLDEXCLUDE = [MKTSEGMENTATIONSEGMENT].[EXCLUDE],
          @OLDSEGMENTATIONPACKAGEID = (select [ID] from dbo.[MKTSEGMENTATIONPACKAGE] where [SEGMENTATIONID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] and [PACKAGEID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]),
          @OLDPACKAGEID = [MKTSEGMENTATIONSEGMENT].[PACKAGEID],
          @OLDPACKAGECHANNELCODE = isnull([MKTPACKAGE].[CHANNELCODE], 255),
          @OLDSAMPLESIZE = [MKTSEGMENTATIONSEGMENT].[SAMPLESIZE],
          @OLDSAMPLESIZETYPECODE = [MKTSEGMENTATIONSEGMENT].[SAMPLESIZETYPECODE],
          @OLDSAMPLESIZEMETHODCODE = [MKTSEGMENTATIONSEGMENT].[SAMPLESIZEMETHODCODE],
          @OLDSAMPLESIZEEXCLUDEREMAINDER = [MKTSEGMENTATIONSEGMENT].[SAMPLESIZEEXCLUDEREMAINDER],
          @OLDASKLADDERID = [MKTSEGMENTATIONSEGMENT].[ASKLADDERID]
        from dbo.[MKTSEGMENTATIONSEGMENT]
        left outer join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]
        where [MKTSEGMENTATIONSEGMENT].[ID] = @ID;

        if @EXCLUDE = 1
          begin
            set @PACKAGEID = null;
            set @ASKLADDERID = null;
            set @RESPONSERATE = 0;
            set @GIFTAMOUNT = 0;
            set @SAMPLESIZE = 100;
            set @SAMPLESIZETYPECODE = 0;
            set @SAMPLESIZEMETHODCODE = 0;
            set @OVERRIDEADDRESSPROCESSING = 0;
            set @ITEMLIST = null;
            set @CODE = '';
            set @CODEVALUEID = null;
            set @PACKAGECODE = '';
            set @PACKAGECODEVALUEID = null;
            set @CHANNELSOURCECODE = '';
            set @CHANNELSOURCECODEVALUEID = null;
            set @TESTSEGMENTCODE = '';
            set @TESTSEGMENTCODEVALUEID = null;
            set @OVERRIDEBUSINESSUNITS = 0;
            set @BUSINESSUNITS = null;
          end

        if @SAMPLESIZETYPECODE = 0 and @SAMPLESIZE = 100
          set @SAMPLESIZEEXCLUDEREMAINDER = 1;

        --For acknowledgement mailings, don't allow the user to change the segment or package...

        if @MAILINGTYPECODE = 1 and (@SEGMENTID <> @OLDSEGMENTID or isnull(@PACKAGEID, '00000000-0000-0000-0000-000000000000') <> isnull(@OLDPACKAGEID, '00000000-0000-0000-0000-000000000000'))
          begin
            set @SEGMENTID = @OLDSEGMENTID;
            set @PACKAGEID = @OLDPACKAGEID;
          end

        set @ORGANIZATIONCURRENCYID = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();

        if (@ORGANIZATIONCURRENCYID = @BASECURRENCYID)
          set @ORGANIZATIONGIFTAMOUNT = @GIFTAMOUNT;
        else
          begin
            if @ORGANIZATIONCURRENCYEXCHANGERATEID is null
              set @ORGANIZATIONCURRENCYEXCHANGERATEID = dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@BASECURRENCYID, @ORGANIZATIONCURRENCYID, @DATEADDED, 0, null);

            set @ORGANIZATIONGIFTAMOUNT = dbo.[UFN_CURRENCY_CONVERT](@GIFTAMOUNT, @ORGANIZATIONCURRENCYEXCHANGERATEID);
          end

        /* Save the segment */
        update dbo.[MKTSEGMENTATIONSEGMENT] set 
          [SEGMENTID] = @SEGMENTID,
          [EXCLUDE] = @EXCLUDE,
          [CODE] = @CODE,
          [PARTDEFINITIONVALUESID] = @CODEVALUEID,
          [TESTSEGMENTCODE] = @TESTSEGMENTCODE,
          [TESTPARTDEFINITIONVALUESID] = @TESTSEGMENTCODEVALUEID,
          [PACKAGEID] = @PACKAGEID,
          [RESPONSERATE] = @RESPONSERATE,
          [GIFTAMOUNT] = @GIFTAMOUNT,
          [SAMPLESIZE] = @SAMPLESIZE,
          [SAMPLESIZETYPECODE] = @SAMPLESIZETYPECODE,
          [SAMPLESIZEMETHODCODE] = @SAMPLESIZEMETHODCODE,
          [SAMPLESIZEEXCLUDEREMAINDER] = @SAMPLESIZEEXCLUDEREMAINDER,
          [ASKLADDERID] = @ASKLADDERID,
          [OVERRIDEADDRESSPROCESSING] = @OVERRIDEADDRESSPROCESSING,
          [USEADDRESSPROCESSING] = case when @OVERRIDEADDRESSPROCESSING = 1 then @USEADDRESSPROCESSING else 0 end,
          [ADDRESSPROCESSINGOPTIONID] = case when @OVERRIDEADDRESSPROCESSING = 1 and @USEADDRESSPROCESSING = 1 then @ADDRESSPROCESSINGOPTIONID else null end,
          [ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE] = case when @OVERRIDEADDRESSPROCESSING = 1 and @USEADDRESSPROCESSING = 1 then @ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE else 0 end,
          [ADDRESSPROCESSINGOPTIONSEASONALASOFDATE] = case when @OVERRIDEADDRESSPROCESSING = 1 and @USEADDRESSPROCESSING = 1 then @ADDRESSPROCESSINGOPTIONSEASONALASOFDATE else null end,
          [NAMEFORMATPARAMETERID] = case when @OVERRIDEADDRESSPROCESSING = 1 and @USEADDRESSPROCESSING = 1 then @NAMEFORMATPARAMETERID else null end,
          [OVERRIDEBUSINESSUNITS] = @OVERRIDEBUSINESSUNITS,
          [CHANGEDBYID] = @CHANGEAGENTID,
          [DATECHANGED] = @CURRENTDATE,
          [ORGANIZATIONGIFTAMOUNT] = @ORGANIZATIONGIFTAMOUNT,
          [CURRENCYEXCHANGERATEID] = @ORGANIZATIONCURRENCYEXCHANGERATEID
        where [ID] = @ID;

        /* Save and update the package for the segment */
        if isnull(@OLDPACKAGEID, '00000000-0000-0000-0000-000000000000') <> isnull(@PACKAGEID, '00000000-0000-0000-0000-000000000000') or @OLDEXCLUDE <> @EXCLUDE
          begin
            /* Remove the old package, only if is not being used by any other segments and test segments */
            if @OLDEXCLUDE = 0 and
               not exists(select [ID] from dbo.[MKTSEGMENTATIONSEGMENT] where [SEGMENTATIONID] = @SEGMENTATIONID and [PACKAGEID] = @OLDPACKAGEID) and
               not exists(select [MKTSEGMENTATIONTESTSEGMENT].[ID] from dbo.[MKTSEGMENTATIONTESTSEGMENT] inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID and [MKTSEGMENTATIONTESTSEGMENT].[PACKAGEID] = @OLDPACKAGEID)
              exec dbo.[USP_MKTSEGMENTATIONPACKAGE_DELETE] @OLDSEGMENTATIONPACKAGEID, @CHANGEAGENTID;

            /* Add the new package, only if it doesn't exist already */
            if @EXCLUDE = 0 and not exists(select [ID] from dbo.[MKTSEGMENTATIONPACKAGE] where [SEGMENTATIONID] = @SEGMENTATIONID and [PACKAGEID] = @PACKAGEID)
              exec dbo.[USP_DATAFORMTEMPLATE_ADD_MKTSEGMENTATIONPACKAGE] null, @CHANGEAGENTID, @SEGMENTATIONID, @PACKAGEID;
          end

        if @EXCLUDE = 0
          begin
            /* Update the package with the selected code */
            exec dbo.[USP_MKTPACKAGE_UPDATECODE] @PACKAGEID, @PACKAGECODE, @PACKAGECODEVALUEID, @CHANNELSOURCECODE, @CHANNELSOURCECODEVALUEID, @CHANGEAGENTID, @CURRENTAPPUSERID;

            /* Update the segment with the selected code */
            if @SEGMENTTYPECODE <> 2 or (@SEGMENTTYPECODE = 2 and @ISVENDORMANAGED = 0) or (@SEGMENTTYPECODE = 2 and @ISVENDORMANAGED = 1 and @SOURCECODEID is not null)
              exec dbo.[USP_MKTSEGMENT_UPDATECODE] @SEGMENTID, @CODE, @CODEVALUEID, @CHANGEAGENTID, 0, @CURRENTAPPUSERID;
          end

        if @OLDEXCLUDE <> @EXCLUDE
          begin
            if exists (select top 1 1 from sys.objects where name = @DATATABLENAME)
              begin
                set @SQL = '-- make finder number nullable' + char(13) +

                           'if exists (select top 1 1 from dbo.sysindexes where name = ''UIX_' + @DATATABLENAME + '_FINDERNUMBER'')' + char(13) +
                           '  drop index [UIX_' + @DATATABLENAME + '_FINDERNUMBER] on dbo.[' + @DATATABLENAME + '];' + char(13) +
                           'alter table dbo.[' + @DATATABLENAME + '] alter column [FINDERNUMBER] bigint null;' + char(13) +
                           char(13) +
                           '-- wipe out finder numbers for this segment' + char(13) +

                           'update dbo.[' + @DATATABLENAME + '] set [FINDERNUMBER] = null' +
                           case when @EXCLUDE = 1 then ', [SOURCECODE] = '''' ' else ' ' end +
                           'where [SEGMENTID] = @SEGMENTID;';

                exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier', @SEGMENTID = @ID;
              end

            if @EXCLUDE = 1
              begin
                -- inline exclusions may not have test segments

                declare TESTSEGMENTS cursor local fast_forward for
                select [ID]
                from dbo.[MKTSEGMENTATIONTESTSEGMENT]
                where [SEGMENTID] = @ID
                order by [SEQUENCE] desc;

                open TESTSEGMENTS
                fetch next from TESTSEGMENTS into @TESTSEGMENTID;

                while (@@FETCH_STATUS = 0)
                  begin
                    exec dbo.[USP_MKTSEGMENTATIONTESTSEGMENT_DELETE] @TESTSEGMENTID, @CHANGEAGENTID;
                    fetch next from TESTSEGMENTS into @TESTSEGMENTID;
                  end

                close TESTSEGMENTS;
                deallocate TESTSEGMENTS;
              end
          end

        /* Clear the segment cache if any of the following is true:
          *  - The segment or sample size settings changed
          *  - The address processing settings changed
          *  - Address processing is being used and the new package has a different channel than the old one (since the package's channel can affect record counts when address processing is used)
          *  - The ask ladder changed (since ask ladders are generated during the segment counts process, we need to make sure activate can pick up the latest ask ladders)
          */
        if (@OLDSEGMENTID <> @SEGMENTID or @OLDEXCLUDE <> @EXCLUDE or @OLDSAMPLESIZEEXCLUDEREMAINDER <> @SAMPLESIZEEXCLUDEREMAINDER or @OLDSAMPLESIZE <> @SAMPLESIZE or @OLDSAMPLESIZETYPECODE <> @SAMPLESIZETYPECODE or @OLDSAMPLESIZEMETHODCODE <> @SAMPLESIZEMETHODCODE) or 
           (@OLDUSEADDRESSPROCESSING <> @USEADDRESSPROCESSING or (@USEADDRESSPROCESSING = 1 and ((@OLDADDRESSPROCESSINGOPTIONID is null and @OLDADDRESSPROCESSINGOPTIONID is not null) or (@OLDADDRESSPROCESSINGOPTIONID is not null and @OLDADDRESSPROCESSINGOPTIONID is null) or @OLDADDRESSPROCESSINGOPTIONID <> @OLDADDRESSPROCESSINGOPTIONID))) or
           (@OLDPACKAGECHANNELCODE <> @PACKAGECHANNELCODE and (@USEADDRESSPROCESSING = 1 and @ADDRESSPROCESSINGOPTIONID is not null)) or
           (@OLDASKLADDERID is null and @ASKLADDERID is not null) or (@OLDASKLADDERID is not null and @ASKLADDERID is null) or (@OLDASKLADDERID <> @ASKLADDERID)
          /* Clear the cache for this segment and all segments after it with the same record type */
          exec dbo.[USP_MKTSEGMENTATIONSEGMENT_CLEARCACHE] @ID, 1, 1;

        /* save the source code information */
        exec dbo.[USP_MKTSOURCECODEPART_SEGMENTATIONSEGMENT_GETITEMLIST3_UPDATEFROMXML] @ID, @ITEMLIST, @CHANGEAGENTID, @CURRENTDATE;

        /* business units */
        exec dbo.[USP_MKTSEGMENTATIONSEGMENTBUSINESSUNIT_GETBUSINESSUNITS_UPDATEFROMXML] @ID, @BUSINESSUNITS, @CHANGEAGENTID;  
      end
  end try

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

  return 0;