UFN_EVENTCONFLICT_GETEVENTINFO
Gets conflict information for all events in conflict with the supplied information.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@START | datetime | IN | |
@END | datetime | IN | |
@LOCATIONS | xml | IN | |
@RESOURCES | xml | IN | |
@STAFFRESOURCES | xml | IN | |
@IGNORERECORDID | uniqueidentifier | IN | |
@IGNORESUBRECORDID | uniqueidentifier | IN | |
@IGNORESUPERRECORDID | uniqueidentifier | IN | |
@OFFSETRESOURCES | xml | IN | |
@OFFSETSTAFFRESOURCES | xml | IN |
Definition
Copy
CREATE function dbo.UFN_EVENTCONFLICT_GETEVENTINFO
(
@START datetime,
@END datetime,
@LOCATIONS xml,
@RESOURCES xml,
@STAFFRESOURCES xml,
@IGNORERECORDID uniqueidentifier = null,
@IGNORESUBRECORDID uniqueidentifier = null,
@IGNORESUPERRECORDID uniqueidentifier = null,
@OFFSETRESOURCES xml = null,
@OFFSETSTAFFRESOURCES xml = null
)
returns @EVENTINFO table
(
RECORDID uniqueidentifier,
PAGEID uniqueidentifier,
PROGRAMID uniqueidentifier,
NAME nvarchar(100),
STARTDATE datetime,
ENDDATE datetime,
STARTTIME UDT_HOURMINUTE,
ENDTIME UDT_HOURMINUTE,
TIMESPANDISPLAY nvarchar(25),
LOCATIONS nvarchar(500),
RESOURCES nvarchar(500),
STAFFRESOURCES nvarchar(500),
ISLOCATIONCONFLICT bit,
ISRESOURCECONFLICT bit,
ISSTAFFRESOURCECONFLICT bit,
SUBRECORDID uniqueidentifier,
LOCATIONSINCONFLICT nvarchar(500),
RESOURCESINCONFLICT nvarchar(500),
STAFFRESOURCESINCONFLICT nvarchar(500),
RECORDTYPE tinyint,
DISTINCTLOCATIONSINCONFLICT nvarchar(500),
DISTINCTRESOURCESINCONFLICT nvarchar(500),
DISTINCTSTAFFRESOURCESINCONFLICT nvarchar(500)
)
as begin
declare @EVENTINFOTEMP table
(
RECORDID uniqueidentifier,
PAGEID uniqueidentifier,
PROGRAMID uniqueidentifier,
NAME nvarchar(100),
STARTDATE datetime,
ENDDATE datetime,
STARTTIME UDT_HOURMINUTE,
ENDTIME UDT_HOURMINUTE,
TIMESPANDISPLAY nvarchar(25),
LOCATIONS nvarchar(500),
RESOURCES nvarchar(500),
STAFFRESOURCES nvarchar(500),
ISLOCATIONCONFLICT bit,
ISRESOURCECONFLICT bit,
ISSTAFFRESOURCECONFLICT bit,
SUBRECORDID uniqueidentifier,
LOCATIONINCONFLICT uniqueidentifier,
RESOURCEINCONFLICT uniqueidentifier,
RESOURCEINCONFLICTQUANTITY int,
STAFFRESOURCEINCONFLICT uniqueidentifier,
STAFFRESOURCEINCONFLICTQUANTITY int,
RECORDTYPE tinyint
)
-- First load the items in a non-distinct manner so that we can get the distinct resource and location conflicts later
-- Handle events first
insert into @EVENTINFOTEMP
(
RECORDID,
PAGEID,
PROGRAMID,
NAME,
STARTDATE,
ENDDATE,
STARTTIME,
ENDTIME,
TIMESPANDISPLAY,
LOCATIONS,
RESOURCES,
STAFFRESOURCES,
ISLOCATIONCONFLICT,
ISRESOURCECONFLICT,
ISSTAFFRESOURCECONFLICT,
LOCATIONINCONFLICT,
RESOURCEINCONFLICT,
RESOURCEINCONFLICTQUANTITY,
STAFFRESOURCEINCONFLICT,
STAFFRESOURCEINCONFLICTQUANTITY,
RECORDTYPE
)
select distinct
EVENT.ID,
case when PROGRAMID is null then '9988B807-97B2-434C-8BE1-BBEE6B944B2C' else 'C113696F-8318-4B14-B6DA-54DEE3077995' end,
EVENT.PROGRAMID,
EVENT.NAME,
EVENT.STARTDATE,
EVENT.ENDDATE,
EVENT.STARTTIME,
EVENT.ENDTIME,
dbo.UFN_HOURMINUTE_DISPLAYTIME(EVENT.STARTTIME) + ' - ' + dbo.UFN_HOURMINUTE_DISPLAYTIME(EVENT.ENDTIME),
coalesce(dbo.UFN_EVENT_GETLOCATIONNAME(EVENT.ID), ''),
coalesce(dbo.UFN_EVENTRESOURCE_GETRESOURCESTRING(EVENT.ID), ''),
coalesce(dbo.UFN_EVENTSTAFFRESOURCE_GETSTAFFRESOURCESTRING(EVENT.ID), ''),
case when LOCATIONCONFLICT.EVENTID is null then 0 else 1 end,
case when RESOURCECONFLICT.EVENTID is null then 0 else 1 end,
case when STAFFRESOURCECONFLICT.EVENTID is null then 0 else 1 end,
LOCATIONCONFLICT.LOCATIONID,
RESOURCECONFLICT.RESOURCEID,
RESOURCECONFLICT.QUANTITYNEEDED,
STAFFRESOURCECONFLICT.VOLUNTEERTYPEID,
STAFFRESOURCECONFLICT.QUANTITYNEEDED,
0
from dbo.EVENT
left outer join dbo.UFN_EVENTCONFLICT_GETLOCATIONCONFLICTDETAILS(@START, @END, @LOCATIONS, @IGNORERECORDID, @IGNORESUBRECORDID, @IGNORESUPERRECORDID, 1, 0) as LOCATIONCONFLICT on
EVENT.ID = LOCATIONCONFLICT.EVENTID
left outer join dbo.UFN_EVENTCONFLICT_GETRESOURCECONFLICTDETAILS(@START, @END, @RESOURCES, @IGNORERECORDID, @IGNORESUBRECORDID, @IGNORESUPERRECORDID, 1, 0, 0, @OFFSETRESOURCES) as RESOURCECONFLICT on
EVENT.ID = RESOURCECONFLICT.EVENTID
left outer join dbo.UFN_EVENTCONFLICT_GETSTAFFRESOURCECONFLICTDETAILS(@START, @END, @STAFFRESOURCES, @IGNORERECORDID, @IGNORESUBRECORDID, @IGNORESUPERRECORDID, 1, 0, 0, @OFFSETSTAFFRESOURCES) as STAFFRESOURCECONFLICT on
EVENT.ID = STAFFRESOURCECONFLICT.EVENTID
where
(
LOCATIONCONFLICT.EVENTID is not null or
RESOURCECONFLICT.EVENTID is not null or
STAFFRESOURCECONFLICT.EVENTID is not null
) and
(
(
@START >= EVENT.STARTDATETIME and
@START < EVENT.ENDDATETIME
) or
(
@END > EVENT.STARTDATETIME and
@END <= EVENT.ENDDATETIME
) or
(
@START < EVENT.STARTDATETIME and
@END > EVENT.ENDDATETIME
)
)
-- Handle itinerary items
insert into @EVENTINFOTEMP
(
RECORDID,
PAGEID,
PROGRAMID,
NAME,
STARTDATE,
ENDDATE,
STARTTIME,
ENDTIME,
TIMESPANDISPLAY,
LOCATIONS,
RESOURCES,
STAFFRESOURCES,
ISLOCATIONCONFLICT,
ISRESOURCECONFLICT,
ISSTAFFRESOURCECONFLICT,
SUBRECORDID,
LOCATIONINCONFLICT,
RESOURCEINCONFLICT,
RESOURCEINCONFLICTQUANTITY,
STAFFRESOURCEINCONFLICT,
STAFFRESOURCEINCONFLICTQUANTITY,
RECORDTYPE
)
select distinct
ITINERARY.ID,
'7cc8e595-84d1-401c-b4f9-05a0361afde2',
ITINERARYITEM.PROGRAMID,
ITINERARY.NAME + ' - ' + ITINERARYITEM.NAME,
ITINERARYITEM.STARTDATE,
ITINERARYITEM.ENDDATE,
ITINERARYITEM.STARTTIME,
ITINERARYITEM.ENDTIME,
dbo.UFN_HOURMINUTE_DISPLAYTIME(ITINERARYITEM.STARTTIME) + ' - ' + dbo.UFN_HOURMINUTE_DISPLAYTIME(ITINERARYITEM.ENDTIME),
coalesce(EVENTLOCATION.NAME, ''),
coalesce(dbo.UFN_ITINERARYITEMRESOURCE_GETRESOURCESTRING(ITINERARYITEM.ID), ''),
coalesce(dbo.UFN_ITINERARYITEMSTAFFRESOURCE_GETSTAFFRESOURCESTRING(ITINERARYITEM.ID), ''),
case when LOCATIONCONFLICT.ITINERARYITEMID is null then 0 else 1 end,
case when RESOURCECONFLICT.ITINERARYITEMID is null then 0 else 1 end,
case when STAFFRESOURCECONFLICT.ITINERARYITEMID is null then 0 else 1 end,
ITINERARYITEM.ID,
LOCATIONCONFLICT.LOCATIONID,
RESOURCECONFLICT.RESOURCEID,
RESOURCECONFLICT.QUANTITYNEEDED,
STAFFRESOURCECONFLICT.VOLUNTEERTYPEID,
STAFFRESOURCECONFLICT.QUANTITYNEEDED,
1
from dbo.ITINERARYITEM
inner join dbo.ITINERARY on
ITINERARYITEM.ITINERARYID = ITINERARY.ID
left outer join dbo.UFN_EVENTCONFLICT_GETLOCATIONCONFLICTDETAILS(@START, @END, @LOCATIONS, @IGNORERECORDID, @IGNORESUBRECORDID, @IGNORESUPERRECORDID, 0, 1) as LOCATIONCONFLICT on
ITINERARYITEM.ID = LOCATIONCONFLICT.ITINERARYITEMID
left outer join dbo.UFN_EVENTCONFLICT_GETRESOURCECONFLICTDETAILS(@START, @END, @RESOURCES, @IGNORERECORDID, @IGNORESUBRECORDID, @IGNORESUPERRECORDID, 0, 1, 0, @OFFSETRESOURCES) as RESOURCECONFLICT on
ITINERARYITEM.ID = RESOURCECONFLICT.ITINERARYITEMID
left outer join dbo.UFN_EVENTCONFLICT_GETSTAFFRESOURCECONFLICTDETAILS(@START, @END, @STAFFRESOURCES, @IGNORERECORDID, @IGNORESUBRECORDID, @IGNORESUPERRECORDID, 0, 1, 0, @OFFSETSTAFFRESOURCES) as STAFFRESOURCECONFLICT on
ITINERARYITEM.ID = STAFFRESOURCECONFLICT.ITINERARYITEMID
left outer join dbo.EVENTLOCATION on
ITINERARYITEM.EVENTLOCATIONID = EVENTLOCATION.ID
where
(
LOCATIONCONFLICT.ITINERARYITEMID is not null or
RESOURCECONFLICT.ITINERARYITEMID is not null or
STAFFRESOURCECONFLICT.ITINERARYITEMID is not null
) and
(
(
@START >= ITINERARYITEM.STARTDATETIME and
@START < ITINERARYITEM.ENDDATETIME
) or
(
@END > ITINERARYITEM.STARTDATETIME and
@END <= ITINERARYITEM.ENDDATETIME
) or
(
@START < ITINERARYITEM.STARTDATETIME and
@END > ITINERARYITEM.ENDDATETIME
)
)
-- Handle itineraries
insert into @EVENTINFOTEMP
(
RECORDID,
PAGEID,
PROGRAMID,
NAME,
STARTDATE,
ENDDATE,
STARTTIME,
ENDTIME,
TIMESPANDISPLAY,
LOCATIONS,
RESOURCES,
STAFFRESOURCES,
ISLOCATIONCONFLICT,
ISRESOURCECONFLICT,
ISSTAFFRESOURCECONFLICT,
LOCATIONINCONFLICT,
RESOURCEINCONFLICT,
RESOURCEINCONFLICTQUANTITY,
STAFFRESOURCEINCONFLICT,
STAFFRESOURCEINCONFLICTQUANTITY,
RECORDTYPE
)
select distinct
ITINERARY.ID,
'7cc8e595-84d1-401c-b4f9-05a0361afde2',
null,
ITINERARY.NAME,
ITINERARY.STARTDATETIME,
ITINERARY.ENDDATETIME,
dbo.UFN_HOURMINUTE_GETFROMDATE(ITINERARY.STARTDATETIME),
dbo.UFN_HOURMINUTE_GETFROMDATE(ITINERARY.ENDDATETIME),
dbo.UFN_HOURMINUTE_DISPLAYTIME(dbo.UFN_HOURMINUTE_GETFROMDATE(ITINERARY.STARTDATETIME)) + ' - ' + dbo.UFN_HOURMINUTE_DISPLAYTIME(dbo.UFN_HOURMINUTE_GETFROMDATE(ITINERARY.ENDDATETIME)),
'',
dbo.UFN_ITINERARYRESOURCE_GETRESOURCESTRING(ITINERARY.ID),
dbo.UFN_ITINERARYSTAFFRESOURCE_GETSTAFFRESOURCESTRING(ITINERARY.ID),
0,
case when RESOURCECONFLICT.ITINERARYID is null then 0 else 1 end,
case when STAFFRESOURCECONFLICT.ITINERARYID is null then 0 else 1 end,
null,
RESOURCECONFLICT.RESOURCEID,
RESOURCECONFLICT.QUANTITYNEEDED,
STAFFRESOURCECONFLICT.VOLUNTEERTYPEID,
STAFFRESOURCECONFLICT.QUANTITYNEEDED,
2
from dbo.ITINERARY
left outer join dbo.UFN_EVENTCONFLICT_GETRESOURCECONFLICTDETAILS(@START, @END, @RESOURCES, @IGNORERECORDID, @IGNORESUBRECORDID, @IGNORESUPERRECORDID, 0, 0, 1, @OFFSETRESOURCES) as RESOURCECONFLICT on
ITINERARY.ID = RESOURCECONFLICT.ITINERARYID
left outer join dbo.UFN_EVENTCONFLICT_GETSTAFFRESOURCECONFLICTDETAILS(@START, @END, @STAFFRESOURCES, @IGNORERECORDID, @IGNORESUBRECORDID, @IGNORESUPERRECORDID, 0, 0, 1, @OFFSETSTAFFRESOURCES) as STAFFRESOURCECONFLICT on
ITINERARY.ID = STAFFRESOURCECONFLICT.ITINERARYID
where
(
RESOURCECONFLICT.ITINERARYID is not null or
STAFFRESOURCECONFLICT.ITINERARYID is not null
) and
(
(@START >= ITINERARY.STARTDATETIME and @START < ITINERARY.ENDDATETIME) or
(@END > ITINERARY.STARTDATETIME and @END <= ITINERARY.ENDDATETIME) or
(@START < ITINERARY.STARTDATETIME and @END > ITINERARY.ENDDATETIME)
)
-- Now we need to get the distinct information about events in conflict
insert into @EVENTINFO
(
RECORDID,
PAGEID,
PROGRAMID,
NAME,
STARTDATE,
ENDDATE,
STARTTIME,
ENDTIME,
TIMESPANDISPLAY,
LOCATIONS,
RESOURCES,
STAFFRESOURCES,
ISLOCATIONCONFLICT,
ISRESOURCECONFLICT,
ISSTAFFRESOURCECONFLICT,
LOCATIONSINCONFLICT,
RESOURCESINCONFLICT,
STAFFRESOURCESINCONFLICT,
RECORDTYPE
)
select
EVENTINFOTEMP.RECORDID,
EVENTINFOTEMP.PAGEID,
EVENTINFOTEMP.PROGRAMID,
EVENTINFOTEMP.NAME,
EVENTINFOTEMP.STARTDATE,
EVENTINFOTEMP.ENDDATE,
EVENTINFOTEMP.STARTTIME,
EVENTINFOTEMP.ENDTIME,
EVENTINFOTEMP.TIMESPANDISPLAY,
EVENTINFOTEMP.LOCATIONS,
EVENTINFOTEMP.RESOURCES,
EVENTINFOTEMP.STAFFRESOURCES,
EVENTINFOTEMP.ISLOCATIONCONFLICT,
EVENTINFOTEMP.ISRESOURCECONFLICT,
EVENTINFOTEMP.ISSTAFFRESOURCECONFLICT,
dbo.UDA_BUILDLIST(distinct EVENTLOCATION.NAME),
dbo.UDA_BUILDLIST(distinct RESOURCE.NAME + ': ' + cast(EVENTINFOTEMP.RESOURCEINCONFLICTQUANTITY as nvarchar)),
dbo.UDA_BUILDLIST(distinct VOLUNTEERTYPE.NAME + ': ' + cast(EVENTINFOTEMP.STAFFRESOURCEINCONFLICTQUANTITY as nvarchar)),
RECORDTYPE
from @EVENTINFOTEMP as EVENTINFOTEMP
left outer join dbo.EVENTLOCATION on
EVENTLOCATION.ID = EVENTINFOTEMP.LOCATIONINCONFLICT
left outer join dbo.RESOURCE on
RESOURCE.ID = EVENTINFOTEMP.RESOURCEINCONFLICT
left outer join dbo.VOLUNTEERTYPE on
VOLUNTEERTYPE.ID = EVENTINFOTEMP.STAFFRESOURCEINCONFLICT
group by EVENTINFOTEMP.RECORDID, EVENTINFOTEMP.PAGEID, EVENTINFOTEMP.PROGRAMID, EVENTINFOTEMP.NAME, EVENTINFOTEMP.STARTDATE, EVENTINFOTEMP.ENDDATE, EVENTINFOTEMP.STARTTIME, EVENTINFOTEMP.ENDTIME, EVENTINFOTEMP.TIMESPANDISPLAY, EVENTINFOTEMP.LOCATIONS, EVENTINFOTEMP.RESOURCES, EVENTINFOTEMP.STAFFRESOURCES, EVENTINFOTEMP.ISLOCATIONCONFLICT, EVENTINFOTEMP.ISRESOURCECONFLICT, EVENTINFOTEMP.ISSTAFFRESOURCECONFLICT, EVENTINFOTEMP.RECORDTYPE
-- Now get the distinct information about locations and resources in conflict.
-- This is silly (since we are returning the same data for every row) but its either this or conflict detection runs twice.
-- First locations
update @EVENTINFO set
DISTINCTLOCATIONSINCONFLICT = LOCATIONSINCONFLICTTABLE.LOCATIONSINCONFLICT
from
(
select dbo.UDA_BUILDLIST(distinct EVENTLOCATION.NAME) as LOCATIONSINCONFLICT
from @EVENTINFOTEMP as EVENTINFOTEMP
inner join dbo.EVENTLOCATION on
EVENTINFOTEMP.LOCATIONINCONFLICT = EVENTLOCATION.ID
) as LOCATIONSINCONFLICTTABLE
-- Next resources
update @EVENTINFO set
DISTINCTSTAFFRESOURCESINCONFLICT = RESOURCESINCONFLICTTABLE.RESOURCESINCONFLICT
from
(
select dbo.UDA_BUILDLIST(distinct RESOURCE.NAME + ': ' + cast(EVENTINFOTEMP.RESOURCEINCONFLICTQUANTITY as nvarchar)) as RESOURCESINCONFLICT
from @EVENTINFOTEMP as EVENTINFOTEMP
inner join dbo.RESOURCE on EVENTINFOTEMP.RESOURCEINCONFLICT = RESOURCE.ID
) as RESOURCESINCONFLICTTABLE
-- Next staff resources
update @EVENTINFO set
DISTINCTRESOURCESINCONFLICT = STAFFRESOURCESINCONFLICTTABLE.STAFFRESOURCESINCONFLICT
from
(
select dbo.UDA_BUILDLIST(distinct VOLUNTEERTYPE.NAME + ': ' + cast(EVENTINFOTEMP.STAFFRESOURCEINCONFLICTQUANTITY as nvarchar)) as STAFFRESOURCESINCONFLICT
from @EVENTINFOTEMP as EVENTINFOTEMP
inner join dbo.VOLUNTEERTYPE on EVENTINFOTEMP.STAFFRESOURCEINCONFLICT = VOLUNTEERTYPE.ID
) as STAFFRESOURCESINCONFLICTTABLE
return;
end