USP_FAFREGISTRANTBENEFIT_CALCULATE
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@NUMBERPROCESSED | int | INOUT | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CURRENTDATE | datetime | IN |
Definition
Copy
CREATE procedure dbo.USP_FAFREGISTRANTBENEFIT_CALCULATE
(
@NUMBERPROCESSED integer = 0 output,
@CHANGEAGENTID uniqueidentifier = null,
@CURRENTDATE datetime = null
)
as
begin
set nocount on;
set @NUMBERPROCESSED = 0;
if @CURRENTDATE is null
set @CURRENTDATE = GETDATE();
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @EXECUTIONDATE datetime
-- This will come from SCHEDULE
set @EXECUTIONDATE = ( select coalesce(max(DATECHANGED),'1/1/1977') from [FAFREGISTRANTBENEFITSUMMARY] )
-- This will come from SCHEDULE
-- Every night incentives get recreated, can't use audit table to keep track
--delete [FAFREGISTRANTBENEFITSUMMARY] where [BENEFITTYPE] = 1
create table #BenefitData
(
REGISTRANTID uniqueidentifier,
BENEFITID uniqueidentifier ,
BENEFITTYPECODE int,
CONSTITUENTID uniqueidentifier,
EVENTID uniqueidentifier
)
insert into #BenefitData
select
regb.REGISTRANTID,
ben.ID [BENEFITID],
regb.[BENEFITTYPECODE],
r.[CONSTITUENTID],
r.[EVENTID]
from REGISTRANTBENEFIT regb (nolock)
inner join Benefit ben (nolock)
on ben.[ID] = regb.[BENEFITID]
inner join [REGISTRANT] r (nolock)
on r.[ID] = regb.[REGISTRANTID]
where regb.BENEFITTYPECODE in (0) and
( regb.[DATECHANGED] > @EXECUTIONDATE or
ben.[DATECHANGED] > @EXECUTIONDATE )
union
select
regb.REGISTRANTID,
ben.ID [BENEFITID],
regb.[BENEFITTYPECODE],
r.[CONSTITUENTID],
r.[EVENTID]
from REGISTRANTBENEFIT regb (nolock)
inner join Benefit ben (nolock)
on ben.[ID] = regb.[BENEFITID]
inner join [REGISTRANT] r (nolock)
on r.[ID] = regb.[REGISTRANTID]
where regb.BENEFITTYPECODE in (1)
create index IX_I on #BenefitData ( REGISTRANTID, BENEFITID )
create table #BenefitSummary
(
REGISTRANTID uniqueidentifier,
EVENTID uniqueidentifier,
CONSTITUENTID uniqueidentifier,
BENEFITNAME nvarchar(200) collate DATABASE_DEFAULT,
TOTALVALUE money,
BENEFITID uniqueidentifier,
BENEFITS nvarchar(800) collate DATABASE_DEFAULT,
DATECHANGED datetime,
DATEADDED datetime,
ADDEDBYID uniqueidentifier,
CHANGEDBYID uniqueidentifier,
BENEFITTYPE int
)
insert into #BenefitSummary
select
r.[ID] [REGISTRANTID],
r.[EVENTID],
r.[CONSTITUENTID],
b.[NAME] [BENEFITNAME],
rb.[TOTALVALUE],
b.[ID] [BENEFITID],
B.[NAME] + ' (' +
coalesce( CAST ( stuff (
(
select ',' + rbex.[BENEFITPREFERENCE]
from [REGISTRANTBENEFITEXTENSION] rbex
where rbex.[BENEFITID] = rb.[BENEFITID] and rbex.REGISTRANTID = rb.REGISTRANTID
for xml path('')
),1,1,'') as nvarchar(500)),'') + ')' as BENEFITS,
@CURRENTDATE [DATECHANGED],
@CURRENTDATE [DATEADDED],
@CHANGEAGENTID [ADDEDBYID],
@CHANGEAGENTID [CHANGEDBYID] ,
bd.BENEFITTYPECODE
from [REGISTRANT] r (nolock)
inner join [REGISTRANTBENEFIT] rb (nolock)
on r.[ID] = rb.[REGISTRANTID]
inner join [BENEFIT] b (nolock)
on b.[ID] = rb.[BENEFITID]
inner join #BenefitData bd
on bd.registrantid = rb.REGISTRANTID and bd.benefitid = rb.BENEFITID and bd.benefittypecode = rb.benefittypecode
where rb.BENEFITTYPECODE in (0,1)
create index IX_BENETIFDATA_REGISTRANTIDBENEFITID on #BenefitData ( REGISTRANTID, BENEFITID )
/*
delete [FAFREGISTRANTBENEFITSUMMARY]
from [FAFREGISTRANTBENEFITSUMMARY] f
join #BenefitSummary b
on f.[CONSTITUENTID] = b.[CONSTITUENTID] and f.[EVENTID] = b.[EVENTID] and f.[BENEFITTYPE] = b.[BENEFITTYPE]
*/
create table #FAFREGISTRANTBENEFITSUMMARY_STAGE
(
[EVENTID] [uniqueidentifier],
[CONSTITUENTID] [uniqueidentifier] ,
[BENEFITS] [nvarchar](500) collate DATABASE_DEFAULT,
[BENEFITTYPE] [int],
[TOTALVALUE] [money] ,
[ADDEDBYID] [uniqueidentifier],
[CHANGEDBYID] [uniqueidentifier]
)
insert into #FAFREGISTRANTBENEFITSUMMARY_STAGE
( [EVENTID], [CONSTITUENTID], [TOTALVALUE],[BENEFITTYPE],[BENEFITS],[ADDEDBYID],[CHANGEDBYID])
select
summary.[EVENTID],
summary.[CONSTITUENTID] ,
sum(summary.totalvalue) [TOTALVALUE],
summary.[BENEFITTYPE],
coalesce( CAST ( stuff (
(
select ',' + replace( rbex.[BENEFITS], '()', '')
from #BenefitSummary rbex
where rbex.[CONSTITUENTID] = summary.[CONSTITUENTID] and rbex.[EVENTID] = summary.[EVENTID] and rbex.BENEFITTYPE = summary.BENEFITTYPE
for xml path('')
),1,1,'') as nvarchar(500)),'') as BENEFITS,
--@CURRENTDATE [DATECHANGED],
--@CURRENTDATE [DATEADDED],
@CHANGEAGENTID [ADDEDBYID],
@CHANGEAGENTID [CHANGEDBYID]
from #BenefitSummary summary
group by summary.[EVENTID], summary.[CONSTITUENTID] ,summary.[BENEFITTYPE] ;
update fs
set
fs.[TOTALVALUE] = 0,
fs.[BENEFITS] = ''
from [FAFREGISTRANTBENEFITSUMMARY] fs
left join #FAFREGISTRANTBENEFITSUMMARY_STAGE fss
on fs.CONSTITUENTID = fss.CONSTITUENTID and fs.EVENTID =fss.EVENTID and fs.BENEFITTYPE = fss.BENEFITTYPE
where fss.CONSTITUENTID is null
and fs.BENEFITTYPE = 1
and (fs.[TOTALVALUE] <> 0 and fs.BENEFITS <> '' )
insert into [FAFREGISTRANTBENEFITSUMMARY] (EVENTID, CONSTITUENTID, TOTALVALUE, BENEFITTYPE, BENEFITS, DATECHANGED, DATEADDED, ADDEDBYID , CHANGEDBYID )
select
s.[EVENTID],
s.[CONSTITUENTID],
s.[TOTALVALUE],
s.[BENEFITTYPE],
s.BENEFITS,
@CURRENTDATE [DATECHANGED],
@CURRENTDATE [DATEADDED],
@CHANGEAGENTID [ADDEDBYID],
@CHANGEAGENTID [CHANGEDBYID]
from #FAFREGISTRANTBENEFITSUMMARY_STAGE s
left join [FAFREGISTRANTBENEFITSUMMARY] t
on t.[EVENTID] = s.[EVENTID] and t.[BENEFITTYPE] = s.[BENEFITTYPE] and t.[CONSTITUENTID] = s.[CONSTITUENTID]
where t.[CONSTITUENTID] is null
merge [FAFREGISTRANTBENEFITSUMMARY] as t
using
(
select
summary.[EVENTID],
summary.[CONSTITUENTID] ,
summary.[TOTALVALUE],
summary.[BENEFITTYPE],
summary.BENEFITS,
@CURRENTDATE [DATECHANGED],
@CURRENTDATE [DATEADDED],
@CHANGEAGENTID [ADDEDBYID],
@CHANGEAGENTID [CHANGEDBYID]
from #FAFREGISTRANTBENEFITSUMMARY_STAGE summary
) as s
on ( t.[EVENTID] = s.[EVENTID] and t.[BENEFITTYPE] = s.[BENEFITTYPE] and t.[CONSTITUENTID] = s.[CONSTITUENTID] )
/* when not matched by target
then insert
(
[EVENTID],
[CONSTITUENTID],
[TOTALVALUE],
[BENEFITTYPE],
[BENEFITS],
[DATECHANGED],
[DATEADDED],
[ADDEDBYID],
[CHANGEDBYID]
)
values
(
s.[EVENTID],
s.[CONSTITUENTID],
s.[TOTALVALUE],
s.[BENEFITTYPE],
s.[BENEFITS],
s.[DATECHANGED],
s.[DATEADDED],
s.[ADDEDBYID],
s.[CHANGEDBYID]
) */
when matched
then update
set
t.[TOTALVALUE] = s.[TOTALVALUE],
t.[BENEFITS] = s.[BENEFITS],
t.[DATECHANGED] = s.[DATECHANGED],
t.[CHANGEDBYID] = s.[CHANGEDBYID];
select @NUMBERPROCESSED=COUNT(*) from dbo.FAFREGISTRANTBENEFITSUMMARY (nolock)
where DATECHANGED = @CURRENTDATE
set @NUMBERPROCESSED = isnull(@NUMBERPROCESSED, 0)
drop table #BenefitData
drop table #BenefitSummary
drop table #FAFREGISTRANTBENEFITSUMMARY_STAGE
end