USP_MKTSEGMENTATIONSEGMENT_CACHEADDRESSES
Caches the addresses for a marketing effort segment.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSEGMENTATIONSEGMENT_CACHEADDRESSES]
(
@SEGMENTID uniqueidentifier
)
as
set nocount on;
declare @SEGMENTATIONID uniqueidentifier;
declare @RECORDSOURCEID uniqueidentifier;
declare @MAILINGTYPECODE tinyint;
declare @SEGMENTTYPECODE tinyint;
declare @CHANNELCODE tinyint;
declare @USEADDRESSPROCESSING bit;
declare @ADDRESSPROCESSINGOPTIONID uniqueidentifier;
declare @ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE tinyint;
declare @ADDRESSPROCESSINGOPTIONSEASONALASOFDATE datetime;
declare @APPEALID nvarchar(36);
declare @SQL nvarchar(max);
declare @TABLENAME nvarchar(128);
declare @MAILTYPECODE tinyint;
declare @GLOBALTEMPSEGMENTCONSTITUENTTABLE nvarchar(128);
declare @ORGMAILINGPREFERENCE tinyint;
declare @ORGCONTACTALSOINDACTION tinyint;
begin try
select
@SEGMENTATIONID = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
@RECORDSOURCEID = [MKTSEGMENT].[QUERYVIEWCATALOGID],
@MAILINGTYPECODE = [MKTSEGMENTATION].[MAILINGTYPECODE],
@SEGMENTTYPECODE = [MKTSEGMENT].[SEGMENTTYPECODE],
@CHANNELCODE = [MKTPACKAGE].[CHANNELCODE],
@USEADDRESSPROCESSING = case when [MKTSEGMENTATIONSEGMENT].[OVERRIDEADDRESSPROCESSING] = 1 then [MKTSEGMENTATIONSEGMENT].[USEADDRESSPROCESSING] else [MKTSEGMENTATION].[USEADDRESSPROCESSING] end,
@ADDRESSPROCESSINGOPTIONID = case when [MKTSEGMENTATIONSEGMENT].[OVERRIDEADDRESSPROCESSING] = 1 then [MKTSEGMENTATIONSEGMENT].[ADDRESSPROCESSINGOPTIONID] else [MKTSEGMENTATION].[ADDRESSPROCESSINGOPTIONID] end,
@ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE = case when [MKTSEGMENTATIONSEGMENT].[OVERRIDEADDRESSPROCESSING] = 1 then [MKTSEGMENTATIONSEGMENT].[ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE] else [MKTSEGMENTATION].[ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE] end,
@ADDRESSPROCESSINGOPTIONSEASONALASOFDATE = case when [MKTSEGMENTATIONSEGMENT].[OVERRIDEADDRESSPROCESSING] = 1 then [MKTSEGMENTATIONSEGMENT].[ADDRESSPROCESSINGOPTIONSEASONALASOFDATE] else [MKTSEGMENTATION].[ADDRESSPROCESSINGOPTIONSEASONALASOFDATE] end,
@APPEALID = coalesce(convert(nvarchar(36), [APPEALMAILING].[APPEALID]), [MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID]),
@MAILTYPECODE = dbo.[UFN_MKTSEGMENTATION_GETMAILPREFERENCEMAILTYPECODE]([MKTSEGMENTATION].[ID])
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
left join dbo.[APPEALMAILING] on [APPEALMAILING].[ID] = [MKTSEGMENTATION].[ID]
left join dbo.[MKTSEGMENTATIONACTIVATE] on [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID] = [MKTSEGMENTATION].[ID] and [MKTSEGMENTATIONACTIVATE].[RECORDSOURCEID] = [MKTSEGMENT].[QUERYVIEWCATALOGID]
where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID;
if dbo.[UFN_MKTRECORDSOURCE_VALIDFORBBEC](@RECORDSOURCEID) = 1 --BBEC only
and (
(@MAILINGTYPECODE = 0 and @SEGMENTTYPECODE = 1) --Direct/appeal based mailings - we intentionally do not want to include other mailing types or list segments (acknowledgments is handled in its own process and for membership/sponsorship we don't want to exclude people from the counts based on an invalid address or comm prefs).
or
(@MAILINGTYPECODE = 5 and @SEGMENTTYPECODE = 3) --Altru acknowledgements/reminders - we have to call this out separately because they are not really "appeal" mailings like the rest
)
and @CHANNELCODE = 0 --Mail - not Email
and @USEADDRESSPROCESSING = 1
and @ADDRESSPROCESSINGOPTIONID is not null
begin
--Validate that none of the temp tables used in this stored procedure exist already...
if object_id('tempdb..#TEMP_ADDRESSPROCESS_ADDRESSES') is not null
raiserror('The temp table #TEMP_ADDRESSPROCESS_ADDRESSES is used by this stored procedure but it already exists in this session. Please make sure the temp table does not exist before calling this stored procedure.', 13, 1);
set @GLOBALTEMPSEGMENTCONSTITUENTTABLE = '##TEMP_SEGMENT_CONSTITUENT_' + replace(cast(@SEGMENTID as nvarchar(36)), '-', '_');
set @TABLENAME = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEADDRESSES_MAKETABLENAME](@SEGMENTATIONID);
exec dbo.[USP_MKTSEGMENTATIONSEGMENTCACHEADDRESSES_CREATETABLE] @SEGMENTATIONID;
if len(ltrim(rtrim(@APPEALID))) = 0
set @APPEALID = null;
select
@ORGMAILINGPREFERENCE = [ORGMAILINGPREFERENCE],
@ORGCONTACTALSOINDACTION = [ORGCONTACTALSOINDACTION]
from dbo.[ADDRESSPROCESSINGOPTION]
where [ID] = @ADDRESSPROCESSINGOPTIONID;
if @ADDRESSPROCESSINGOPTIONSEASONALASOFDATETYPECODE = 0 -- consider seasonal dates as of today
set @ADDRESSPROCESSINGOPTIONSEASONALASOFDATE = dbo.[UFN_DATE_GETLATESTTIME](getdate());
else
set @ADDRESSPROCESSINGOPTIONSEASONALASOFDATE = dbo.[UFN_DATE_GETLATESTTIME](@ADDRESSPROCESSINGOPTIONSEASONALASOFDATE);
--Put the addresses into a temp table since we have to get them from a stored procedure...
create table #TEMP_ADDRESSPROCESS_ADDRESSES (
[CONSTITUENTID] uniqueidentifier not null,
[ADDRESSID] uniqueidentifier,
[CONTACTID] uniqueidentifier,
[POSITION] nvarchar(100) collate database_default,
[HOUSEHOLDID] uniqueidentifier,
[RETURNEDASHOUSEHOLDMEMBER] bit not null,
[GROUPCONTACTID] uniqueidentifier
);
exec dbo.[USP_ADDRESSPROCESS_ADDRESSES]
@ADDRESSPROCESSINGOPTIONID = @ADDRESSPROCESSINGOPTIONID,
@MAILTYPE = @MAILTYPECODE,
@PARAMETERSETID = @APPEALID, --always set to appealID so we exclude people with specific mail preferences
@DATE = @ADDRESSPROCESSINGOPTIONSEASONALASOFDATE,
@INCLUDEHOUSEHOLDPROCESSING = 0,
@CONSTITUENTIDSETTABLENAME = @GLOBALTEMPSEGMENTCONSTITUENTTABLE,
@CONSTITUENTIDSETJOINCOLUMNNAME = 'ID',
@IGNORECHANNELPREFERENCEFORSUPPRESSION = 0,
@IGNOREADDRESSSUPPRESSION = 0;
--Depending on the address processing options, we may need to remove some records from the results...
if @ORGMAILINGPREFERENCE = 0 --Mail to contacts at the organization
begin
if @ORGCONTACTALSOINDACTION = 0 --Mail to contact only
delete from #TEMP_ADDRESSPROCESS_ADDRESSES
where [CONSTITUENTID] in (select [CONTACTID] from #TEMP_ADDRESSPROCESS_ADDRESSES where [CONTACTID] is not null);
else if @ORGCONTACTALSOINDACTION = 1 -- Mail to individual only
delete from #TEMP_ADDRESSPROCESS_ADDRESSES
where [CONTACTID] in (select [CONSTITUENTID] from #TEMP_ADDRESSPROCESS_ADDRESSES);
end
--Insert the final addresses into the cache table...
set @SQL = 'insert into dbo.[' + @TABLENAME + '] ([SEGMENTID], [CONSTITUENTID], [ADDRESSID], [CONTACTID])' + char(13) +
' select' + char(13) +
' @SEGMENTID as [SEGMENTID],' + char(13) +
' [ADDRESSES].[CONSTITUENTID],' + char(13) +
' [ADDRESSES].[ADDRESSID],' + char(13) +
' [ADDRESSES].[CONTACTID]' + char(13) +
' from ' + @GLOBALTEMPSEGMENTCONSTITUENTTABLE + ' as [CONSTITUENTS]' + char(13) +
' inner join #TEMP_ADDRESSPROCESS_ADDRESSES as [ADDRESSES] on [ADDRESSES].[CONSTITUENTID] = [CONSTITUENTS].[ID]';
exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier', @SEGMENTID = @SEGMENTID;
--Drop the temp tables...
drop table #TEMP_ADDRESSPROCESS_ADDRESSES;
end
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
if object_id('tempdb..#TEMP_ADDRESSPROCESS_ADDRESSES') is not null
drop table #TEMP_ADDRESSPROCESS_ADDRESSES;
return 1;
end catch
return 0;