UFN_RESERVATION_HAVEQUANTITIESCHANGED

Determines if any attendee, resource, or staffing resource quantities passed in through xml are different than those in the reservation tables.

Return

Return Type
bit

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@ORDER xml IN

Definition

Copy


create function dbo.UFN_RESERVATION_HAVEQUANTITIESCHANGED
(
    @ID uniqueidentifier,
    @ORDER xml
)
returns bit
as begin
    declare @ITINERARIES xml;
    declare @RESOURCES xml;
    declare @STAFFRESOURCES xml;

    set @ITINERARIES = @ORDER.query('/ORDERS/ITEM/ITINERARIES');

    if @ITINERARIES.exist('/ITINERARIES') = 1 and exists (
        select
            ITINERARYID,
            PRICETYPECODEID,
            QUANTITY
        from (
            select distinct
                ITINERARY.ID as ITINERARYID,
                PRICETYPECODEID as PRICETYPECODEID,
                QUANTITY as QUANTITY
            from
                dbo.ITINERARY
            inner join
                dbo.ITINERARYATTENDEE on ITINERARY.ID = ITINERARYATTENDEE.ITINERARYID
            where
                RESERVATIONID = @ID

            union all

            select distinct
                T.itineraries.value('(ITINERARYID)[1]', 'uniqueidentifier') as ITINERARYID,
                T.itineraries.value('(PRICETYPECODEID)[1]', 'uniqueidentifier') as PRICETYPECODEID,
                T.itineraries.value('(QUANTITY)[1]', 'integer') as QUANTITY
            from
                @ITINERARIES.nodes('/ITINERARIES/ITEM') T(itineraries)
            where
                T.itineraries.value('(QUANTITY)[1]', 'integer') > 0
        ) [ITINERARIES]
        group by
            ITINERARYID,
            PRICETYPECODEID,
            QUANTITY
        having
            count(*) = 1
    )
        return 1;

    set @RESOURCES = @ORDER.query('/ORDERS/ITEM/RESOURCES');

    if @RESOURCES.exist('/RESOURCES') = 1 and exists (
        select
            ID,
            ITINERARYID,
            ITINERARYITEMID,
            QUANTITYNEEDED,
            RESOURCEID
        from (
            -- All itinerary resources

            select distinct
                ITINERARYRESOURCE.ID AS ID,
                ITINERARY.ID as ITINERARYID,
                null as ITINERARYITEMID,
                ITINERARYRESOURCE.QUANTITYNEEDED,
                ITINERARYRESOURCE.RESOURCEID
            from
                dbo.ITINERARYRESOURCE
            inner join
                dbo.ITINERARY on ITINERARYRESOURCE.ITINERARYID = ITINERARY.ID
            where 
                ITINERARY.RESERVATIONID = @ID

            union all

            -- All itinerary item resources

            select distinct
                ITINERARYITEMRESOURCE.ID AS ID,
                ITINERARY.ID as ITINERARYID,
                ITINERARYITEM.ID as ITINERARYITEMID,
                ITINERARYITEMRESOURCE.QUANTITYNEEDED,
                ITINERARYITEMRESOURCE.RESOURCEID
            from
                dbo.ITINERARYITEMRESOURCE
            inner join
                dbo.ITINERARYITEM on ITINERARYITEMRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
            inner join
                dbo.ITINERARY on ITINERARYITEM.ITINERARYID = ITINERARY.ID
            where 
                ITINERARY.RESERVATIONID = @ID and
                ITINERARYITEM.ITEMTYPECODE <> 3

            union all

            select distinct
                T.resources.value('(ID)[1]', 'uniqueidentifier') as ID,
                T.resources.value('(ITINERARYID)[1]', 'uniqueidentifier') as ITINERARYID,
                T.resources.value('(ITINERARYITEMID)[1]', 'uniqueidentifier') as ITINERARYITEMID,
                T.resources.value('(QUANTITYNEEDED)[1]', 'int') as QUANTITYNEEDED,
                T.resources.value('(RESOURCEID)[1]', 'uniqueidentifier') as RESOURCEID
            from
                @RESOURCES.nodes('/RESOURCES/ITEM') T(resources)
            where
                T.resources.value('(QUANTITYNEEDED)[1]', 'int') > 0
        ) [RESOURCES]
        group by
            ID,
            ITINERARYID,
            ITINERARYITEMID,
            QUANTITYNEEDED,
            RESOURCEID
        having
            count(*) = 1
    )
        return 1;

    set @STAFFRESOURCES = @ORDER.query('/ORDERS/ITEM/STAFFRESOURCES');

    if @STAFFRESOURCES.exist('/STAFFRESOURCES') = 1 and exists (
        select
            ID,
            ITINERARYID,
            ITINERARYITEMID,
            QUANTITYNEEDED,
            VOLUNTEERTYPEID
        from
        (
            select 
                ITINERARYSTAFFRESOURCE.ID AS ID,
                ITINERARY.ID as ITINERARYID,
                null as ITINERARYITEMID,
                ITINERARYSTAFFRESOURCE.QUANTITYNEEDED,
                ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID
            from
                dbo.ITINERARYSTAFFRESOURCE
            inner join
                dbo.ITINERARY on ITINERARYSTAFFRESOURCE.ITINERARYID = ITINERARY.ID
            where 
                ITINERARY.RESERVATIONID = @ID

            union all

            select 
                ITINERARYITEMSTAFFRESOURCE.ID AS ID,
                ITINERARY.ID as ITINERARYID,
                ITINERARYITEM.ID as ITINERARYITEMID,
                ITINERARYITEMSTAFFRESOURCE.QUANTITYNEEDED,
                ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID
            from
                dbo.ITINERARYITEMSTAFFRESOURCE
            inner join
                dbo.ITINERARYITEM on ITINERARYITEMSTAFFRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
            inner join
                dbo.ITINERARY on ITINERARYITEM.ITINERARYID = ITINERARY.ID
            where 
                ITINERARY.RESERVATIONID = @ID and 
                ITINERARYITEM.ITEMTYPECODE <> 3

            union all

            select
                T.staffresources.value('(ID)[1]', 'uniqueidentifier') as ID,
                T.staffresources.value('(ITINERARYID)[1]', 'uniqueidentifier') as ITINERARYID,
                T.staffresources.value('(ITINERARYITEMID)[1]', 'uniqueidentifier') as ITINERARYITEMID,
                T.staffresources.value('(QUANTITYNEEDED)[1]', 'int') as QUANTITYNEEDED,
                T.staffresources.value('(VOLUNTEERTYPEID)[1]', 'uniqueidentifier') as VOLUNTEERTYPEID
            from
                @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(staffresources)
            where
                T.staffresources.value('(QUANTITYNEEDED)[1]', 'int') > 0
        ) [STAFFRESOURCES]
        group by
            ID,
            ITINERARYID,
            ITINERARYITEMID,
            QUANTITYNEEDED,
            VOLUNTEERTYPEID
        having
            count(*) = 1
    )
        return 1;

    return 0;
end