UFN_CONFLICTCHECK_GETCONFLICTINFOFROMITEMS

Returns all conflict information from the items in conflict provided.

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@CONFLICTITEMS xml IN

Definition

Copy


        CREATE function dbo.UFN_CONFLICTCHECK_GETCONFLICTINFOFROMITEMS
        (
            @CONFLICTITEMS xml
        )
        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


            declare @LOCATIONCONFLICTITEMS table
            (
                EVENTID uniqueidentifier,
                ITINERARYITEMID uniqueidentifier,
                LOCATIONID uniqueidentifier
            )
            insert into @LOCATIONCONFLICTITEMS
            select 
                T.c.value('(EVENTID)[1]','uniqueidentifier'),
                T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier'),
                T.c.value('(LOCATIONID)[1]','uniqueidentifier')
            from @CONFLICTITEMS.nodes('/CONFLICTITEMS/ITEM') T(c)
            where
                T.c.value('(LOCATIONID)[1]','uniqueidentifier') is not null and
                T.c.value('(LOCATIONID)[1]','uniqueidentifier') <> '00000000-0000-0000-0000-000000000000'

            declare @RESOURCECONFLICTITEMS table
            (
                EVENTID uniqueidentifier,
                ITINERARYITEMID uniqueidentifier,
                ITINERARYID uniqueidentifier,
                RESOURCEID uniqueidentifier,
                QUANTITYNEEDED int
            )

            insert into @RESOURCECONFLICTITEMS
            select 
                T.c.value('(EVENTID)[1]','uniqueidentifier'),
                T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier'),
                T.c.value('(ITINERARYID)[1]','uniqueidentifier'),
                T.c.value('(RESOURCEID)[1]','uniqueidentifier'),
                T.c.value('(QUANTITYNEEDED)[1]','int')
            from @CONFLICTITEMS.nodes('/CONFLICTITEMS/ITEM') T(c)
            where
                T.c.value('(RESOURCEID)[1]','uniqueidentifier') is not null and
                T.c.value('(RESOURCEID)[1]','uniqueidentifier') <> '00000000-0000-0000-0000-000000000000'

            declare @STAFFRESOURCECONFLICTITEMS table
            (
                EVENTID uniqueidentifier,
                ITINERARYITEMID uniqueidentifier,
                ITINERARYID uniqueidentifier,
                VOLUNTEERTYPEID uniqueidentifier,
                QUANTITYNEEDED int
            )

            insert into @STAFFRESOURCECONFLICTITEMS
            select 
                T.c.value('(EVENTID)[1]','uniqueidentifier'),
                T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier'),
                T.c.value('(ITINERARYID)[1]','uniqueidentifier'),
                T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier'),
                T.c.value('(QUANTITYNEEDED)[1]','int')
            from @CONFLICTITEMS.nodes('/CONFLICTITEMS/ITEM') T(c)
            where
                T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier') is not null and
                T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier') <> '00000000-0000-0000-0000-000000000000'

            -- 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 @LOCATIONCONFLICTITEMS as LOCATIONCONFLICT on 
                EVENT.ID = LOCATIONCONFLICT.EVENTID
            left outer join @RESOURCECONFLICTITEMS as RESOURCECONFLICT on
                EVENT.ID = RESOURCECONFLICT.EVENTID
            left outer join @STAFFRESOURCECONFLICTITEMS 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
            )

            -- 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
            inner join dbo.SALESORDER on
                SALESORDER.ID = ITINERARY.RESERVATIONID
            left outer join @LOCATIONCONFLICTITEMS as LOCATIONCONFLICT on 
                ITINERARYITEM.ID = LOCATIONCONFLICT.ITINERARYITEMID
            left outer join @RESOURCECONFLICTITEMS as RESOURCECONFLICT on
                ITINERARYITEM.ID = RESOURCECONFLICT.ITINERARYITEMID
            left outer join @STAFFRESOURCECONFLICTITEMS 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
            SALESORDER.STATUSCODE <> 5

            -- 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
            inner join dbo.SALESORDER on
                SALESORDER.ID = ITINERARY.RESERVATIONID
            left outer join @RESOURCECONFLICTITEMS as RESOURCECONFLICT on
                ITINERARY.ID = RESOURCECONFLICT.ITINERARYID
            left outer join @STAFFRESOURCECONFLICTITEMS as STAFFRESOURCECONFLICT on 
                ITINERARY.ID = STAFFRESOURCECONFLICT.ITINERARYID
            where 
            (
                RESOURCECONFLICT.ITINERARYID is not null or 
                STAFFRESOURCECONFLICT.ITINERARYID is not null
            ) and
            SALESORDER.STATUSCODE <> 5


            -- 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,
                dbo.UDA_BUILDLIST(RESOURCE.NAME + ': ' + cast(EVENTINFOTEMP.RESOURCEINCONFLICTQUANTITY as nvarchar)),
                dbo.UDA_BUILDLIST(VOLUNTEERTYPE.NAME + ': ' + cast(EVENTINFOTEMP.STAFFRESOURCEINCONFLICTQUANTITY as nvarchar)),
                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 
                DISTINCTRESOURCESINCONFLICT = 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 
                DISTINCTSTAFFRESOURCESINCONFLICT = 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