USP_SPONSORSHIPDELETE_UPDATESPONSORDATERANGE
Updates a sponsor's constituencies following the deletion of a sponsorship.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@CONSTITUENTID | uniqueidentifier | IN | |
@SPONSORTYPECODE | tinyint | IN | |
@STARTDATE | date | IN | |
@ENDDATE | date | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CURRENTDATE | datetime | IN |
Definition
Copy
create procedure dbo.USP_SPONSORSHIPDELETE_UPDATESPONSORDATERANGE (
@CONSTITUENTID uniqueidentifier,
@SPONSORTYPECODE tinyint,
@STARTDATE date,
@ENDDATE date,
@CHANGEAGENTID uniqueidentifier,
@CURRENTDATE datetime
)
as
begin
declare @SDR_ID uniqueidentifier;
declare @SDR_DATEFROM datetime;
declare @SDR_DATETO datetime;
declare @ACTIVE_COUNT smallint;
declare @COUNT smallint;
declare @FIRSTSTARTDATE datetime;
declare @LASTENDDATE datetime;
select @SDR_ID = ID,
@SDR_DATEFROM = DATEFROM,
@SDR_DATETO = DATETO
from dbo.SPONSORDATERANGE
where CONSTITUENTID = @CONSTITUENTID
and @STARTDATE >= DATEFROM
and (DATETO is null or @ENDDATE <= DATETO)
and SPONSORTYPECODE = @SPONSORTYPECODE;
select
@ACTIVE_COUNT = sum(case STATUSCODE when 1 then 1 else 0 end),
@COUNT = count(*),
@FIRSTSTARTDATE = min(STARTDATE),
@LASTENDDATE = max(ENDDATE)
from dbo.V_QUERY_FINANCIALSPONSORSHIPDATERANGE
where CONSTITUENTID = @CONSTITUENTID
and SPONSORTYPECODE = @SPONSORTYPECODE
and STARTDATE >= @SDR_DATEFROM
and (@SDR_DATETO is null or ENDDATE <= @SDR_DATETO)
if @COUNT = 0
-- no more sponsorships in range, delete constituency
exec dbo.USP_SPONSORDATERANGE_DELETEBYID_WITHCHANGEAGENTID @SDR_ID, @CHANGEAGENTID
else
begin
-- if the deleted one was the first sponsorship in the range, fix the start date
if @SDR_DATEFROM <> @FIRSTSTARTDATE
update dbo.SPONSORDATERANGE
set DATEFROM = @FIRSTSTARTDATE,
DATECHANGED = @CURRENTDATE,
CHANGEDBYID = @CHANGEAGENTID
where ID = @SDR_ID
declare @NEW_SDR_STARTDATE datetime
declare @WORKING_SDR_ID uniqueidentifier;
set @WORKING_SDR_ID = @SDR_ID;
-- this cursor will find sponsorships which do not overlap w/ a prior
-- sponsorship in the date range
-- these necessitate closing the current date range and starting a new one
declare SPONSORSHIP_CURSOR cursor local fast_forward for
select NEWSDR.STARTDATE
from dbo.V_QUERY_FINANCIALSPONSORSHIPDATERANGE NEWSDR
where NEWSDR.CONSTITUENTID = @CONSTITUENTID
and NEWSDR.SPONSORTYPECODE = @SPONSORTYPECODE
and NEWSDR.STARTDATE > @FIRSTSTARTDATE
and (@SDR_DATETO is null or NEWSDR.STARTDATE <= @SDR_DATETO)
and not exists(select 'x'
from dbo.V_QUERY_FINANCIALSPONSORSHIPDATERANGE PRIOR
where PRIOR.CONSTITUENTID = @CONSTITUENTID
and PRIOR.SPONSORTYPECODE = @SPONSORTYPECODE
and PRIOR.STARTDATE < NEWSDR.STARTDATE
and (PRIOR.ENDDATE >= NEWSDR.STARTDATE or PRIOR.ENDDATE is null))
order by NEWSDR.STARTDATE;
open SPONSORSHIP_CURSOR;
fetch next from SPONSORSHIP_CURSOR into @NEW_SDR_STARTDATE;
while (@@FETCH_STATUS = 0)
begin
declare @NEW_SDR_ENDDATE datetime;
-- find the end date for the prior date range
select @NEW_SDR_ENDDATE = max(ENDDATE)
from dbo.V_QUERY_FINANCIALSPONSORSHIPDATERANGE
where CONSTITUENTID = @CONSTITUENTID
and SPONSORTYPECODE = @SPONSORTYPECODE
and STARTDATE < @NEW_SDR_STARTDATE;
-- this error is not expected, and likely indicates a logic error
if @NEW_SDR_ENDDATE is null
begin
raiserror('BBERR_NONEWENDDATEFOUND', 13, 1);
return 1
end
update dbo.SPONSORDATERANGE
set DATETO = @NEW_SDR_ENDDATE,
DATECHANGED = @CURRENTDATE,
CHANGEDBYID = @CHANGEAGENTID
where ID = @WORKING_SDR_ID;
set @WORKING_SDR_ID = newid();
-- create a new date range, the next iteration will put an end date on it
insert into dbo.SPONSORDATERANGE
(
ID,
CONSTITUENTID,
SPONSORTYPECODE,
DATEFROM,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
values
(
@WORKING_SDR_ID,
@CONSTITUENTID,
@SPONSORTYPECODE,
@NEW_SDR_STARTDATE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
)
fetch next from SPONSORSHIP_CURSOR into @NEW_SDR_STARTDATE;
end
close SPONSORSHIP_CURSOR;
deallocate SPONSORSHIP_CURSOR;
-- if there are other active sponsorships, then the last SDR is fine w/ no end date
-- otherwise must set the enddate for that one too
if @ACTIVE_COUNT = 0
begin
update dbo.SPONSORDATERANGE
set DATETO = @LASTENDDATE,
DATECHANGED = @CURRENTDATE,
CHANGEDBYID = @CHANGEAGENTID
where ID = @WORKING_SDR_ID;
end
end
end