UFN_RESERVATION_GETRESOURCESSTRING

Returns a string containing resource information including resource names, quantity, and price.

Return

Return Type
nvarchar(max)

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN

Definition

Copy


            CREATE function dbo.UFN_RESERVATION_GETRESOURCESSTRING(@ID uniqueidentifier)
            returns nvarchar(max)
            as begin
                declare @RESOURCESTABLE table
                (
                    RESOURCEID uniqueidentifier,
                    DESCRIPTION nvarchar(255),
                    ITINERARYITEMID uniqueidentifier,
                    QUANTITY int,
                    PRICINGSTRUCTURECODE tinyint,
                    PRICE money,
                    TOTALPRICE money,
                    NUMBEROFHOURS decimal(20, 2)
                );

                insert into @RESOURCESTABLE
                (
                    RESOURCEID,
                    DESCRIPTION,
                    ITINERARYITEMID,
                    QUANTITY,
                    PRICINGSTRUCTURECODE,
                    PRICE,
                    TOTALPRICE,
                    NUMBEROFHOURS
                )
                select
                    RESOURCES.RESOURCEID,
                    RESOURCES.DESCRIPTION,
                    RESOURCES.ITINERARYITEMID,
                    case RESOURCES.QUANTITYNEEDED
                        when 0 then  -- Per ticket resource

                            case
                                when RESOURCES.NUMBEROFHOURS > 0 then
                                    -- If this is an hourly resource, divide to get quantity needed per hour

                                    SALESORDERITEM.QUANTITY / RESOURCES.NUMBEROFHOURS
                                else
                                    SALESORDERITEM.QUANTITY
                            end
                        else
                            RESOURCES.QUANTITYNEEDED
                    end as [QUANTITY],
                    SALESORDERITEM.PRICINGSTRUCTURECODE,
                    SALESORDERITEM.PRICE,
                    SALESORDERITEM.TOTAL as [TOTALPRICE],
                    RESOURCES.NUMBEROFHOURS
                from (
                    select
                        ITINERARYRESOURCE.RESOURCEID,
                        SALESORDERITEMITINERARYRESOURCE.SALESORDERITEMID,
                        dbo.UFN_RESOURCE_GETNAME(ITINERARYRESOURCE.RESOURCEID) as [DESCRIPTION],
                        null as [ITINERARYITEMID],
                        ITINERARYRESOURCE.QUANTITYNEEDED,
                        case ITINERARYRESOURCE.PRICINGSTRUCTURECODE
                            when 2 then
                                datediff(minute, dbo.UFN_ITINERARY_STARTDATETIME(ITINERARYRESOURCE.ITINERARYID), dbo.UFN_ITINERARY_ENDDATETIME(ITINERARYRESOURCE.ITINERARYID)) / 60.0
                            else
                                null
                        end as [NUMBEROFHOURS]
                    from
                        dbo.SALESORDERITEMITINERARYRESOURCE
                    inner join
                        dbo.ITINERARYRESOURCE on SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID = ITINERARYRESOURCE.ID

                    union all

                    select
                        ITINERARYITEMRESOURCE.RESOURCEID,
                        SALESORDERITEMITINERARYITEMRESOURCE.SALESORDERITEMID,
                        dbo.UFN_RESOURCE_GETNAME(ITINERARYITEMRESOURCE.RESOURCEID) as [DESCRIPTION],
                        ITINERARYITEMRESOURCE.ITINERARYITEMID,
                        ITINERARYITEMRESOURCE.QUANTITYNEEDED,
                        case ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE
                            when 2 then
                                datediff(minute, ITINERARYITEM.STARTDATETIME, ITINERARYITEM.ENDDATETIME) / 60.0
                            else
                                null
                        end as [NUMBEROFHOURS]
                    from
                        dbo.SALESORDERITEMITINERARYITEMRESOURCE
                    inner join
                        dbo.ITINERARYITEMRESOURCE on SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID = ITINERARYITEMRESOURCE.ID
                    inner join
                        dbo.ITINERARYITEM on ITINERARYITEMRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID

                    union all

                    select
                        ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID as [RESOURCEID],
                        SALESORDERITEMITINERARYSTAFFRESOURCE.SALESORDERITEMID,
                        dbo.UFN_VOLUNTEERTYPE_GETDESCRIPTION(ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID) as [DESCRIPTION],
                        null as [ITINERARYITEMID],
                        ITINERARYSTAFFRESOURCE.QUANTITYNEEDED,
                        case ITINERARYSTAFFRESOURCE.PRICINGSTRUCTURECODE
                            when 2 then
                                datediff(minute, dbo.UFN_ITINERARY_STARTDATETIME(ITINERARYSTAFFRESOURCE.ITINERARYID), dbo.UFN_ITINERARY_ENDDATETIME(ITINERARYSTAFFRESOURCE.ITINERARYID)) / 60.0
                            else
                                null
                        end as [NUMBEROFHOURS]
                    from
                        dbo.SALESORDERITEMITINERARYSTAFFRESOURCE
                    inner join
                        dbo.ITINERARYSTAFFRESOURCE on SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID = ITINERARYSTAFFRESOURCE.ID

                    union all

                    select
                        ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID as [RESOURCEID],
                        SALESORDERITEMITINERARYITEMSTAFFRESOURCE.SALESORDERITEMID,
                        dbo.UFN_VOLUNTEERTYPE_GETDESCRIPTION(ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID) as [DESCRIPTION],
                        ITINERARYITEMSTAFFRESOURCE.ITINERARYITEMID,
                        ITINERARYITEMSTAFFRESOURCE.QUANTITYNEEDED,
                        case ITINERARYITEMSTAFFRESOURCE.PRICINGSTRUCTURECODE
                            when 2 then
                                datediff(minute, ITINERARYITEM.STARTDATETIME, ITINERARYITEM.ENDDATETIME) / 60.0
                            else
                                null
                        end as [NUMBEROFHOURS]
                    from
                        dbo.SALESORDERITEMITINERARYITEMSTAFFRESOURCE
                    inner join
                        dbo.ITINERARYITEMSTAFFRESOURCE on SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID = ITINERARYITEMSTAFFRESOURCE.ID
                    inner join
                        dbo.ITINERARYITEM on ITINERARYITEMSTAFFRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
                ) as [RESOURCES]
                inner join
                    dbo.SALESORDERITEM on RESOURCES.SALESORDERITEMID = SALESORDERITEM.ID
                where
                    SALESORDERITEM.SALESORDERID = @ID;

                declare @GROUPEDRESOURCESTABLE table
                (
                    DESCRIPTION nvarchar(255),
                    QUANTITY int,
                    PRICINGSTRUCTURECODE tinyint,
                    PRICE money,
                    TOTALPRICE money,
                    NUMBEROFHOURS decimal(20, 2)
                );

                insert into @GROUPEDRESOURCESTABLE
                (
                    DESCRIPTION,
                    QUANTITY,
                    PRICINGSTRUCTURECODE,
                    PRICE,
                    TOTALPRICE
                )
                select
                    DESCRIPTION,
                    sum(QUANTITY),
                    PRICINGSTRUCTURECODE,
                    PRICE,
                    sum(TOTALPRICE)
                from
                    @RESOURCESTABLE
                where
                    NUMBEROFHOURS is null
                group by
                    RESOURCEID,
                    DESCRIPTION,
                    PRICINGSTRUCTURECODE,
                    PRICE;

                insert into @GROUPEDRESOURCESTABLE
                (
                    DESCRIPTION,
                    QUANTITY,
                    PRICINGSTRUCTURECODE,
                    PRICE,
                    TOTALPRICE,
                    NUMBEROFHOURS
                )
                select
                    case
                        when ITINERARYITEMID is null then
                            DESCRIPTION
                        else
                            DESCRIPTION + ' - ' + dbo.UFN_ITINERARYITEM_GETNAME(ITINERARYITEMID)
                    end,
                    QUANTITY,
                    PRICINGSTRUCTURECODE,
                    PRICE,
                    TOTALPRICE,
                    NUMBEROFHOURS
                from
                    @RESOURCESTABLE
                where
                    NUMBEROFHOURS is not null;

                declare @RESOURCES nvarchar(max);
                declare @RESOURCEDESCRIPTION nvarchar(100);
                declare @QUANTITY int;
                declare @PRICINGSTRUCTURECODE tinyint;
                declare @PRICE money;
                declare @TOTALPRICE money;
                declare @NUMBEROFHOURS decimal(20, 2);
                declare @CRLF char(2);

                set @CRLF = char(13) + char(10);

                set @RESOURCES = '';

                declare RESOURCES_CURSOR cursor local fast_forward for
                select
                    DESCRIPTION,
                    QUANTITY,
                    PRICINGSTRUCTURECODE,
                    PRICE,
                    TOTALPRICE,
                    NUMBEROFHOURS
                from
                    @GROUPEDRESOURCESTABLE
                order by
                    DESCRIPTION;

                open RESOURCES_CURSOR;

                fetch next from RESOURCES_CURSOR
                into @RESOURCEDESCRIPTION, @QUANTITY, @PRICINGSTRUCTURECODE, @PRICE, @TOTALPRICE, @NUMBEROFHOURS;

                while @@FETCH_STATUS = 0
                begin
                    if len(@RESOURCES) > 0
                        set @RESOURCES = @RESOURCES + @CRLF;

                    set @RESOURCES = @RESOURCES + @RESOURCEDESCRIPTION + ' ? ' + cast(@QUANTITY as nvarchar(50));

                    if @NUMBEROFHOURS > 0
                    begin
                        set @RESOURCES = @RESOURCES + ' for ' + cast(@NUMBEROFHOURS as nvarchar(50)) + ' hour';

                        if @NUMBEROFHOURS <> 1
                            set @RESOURCES = @RESOURCES + 's';

                        if @TOTALPRICE > 0
                        begin
                            if @PRICINGSTRUCTURECODE = 0
                                set @RESOURCES = @RESOURCES + ' @ ' + cast(@PRICE as nvarchar(50)) + ' / hour:  ' + cast(@TOTALPRICE as nvarchar(50));
                            else if @PRICINGSTRUCTURECODE = 2
                                set @RESOURCES = @RESOURCES + ':  ' + cast(@TOTALPRICE as nvarchar(50));
                        end
                    end
                    else if @TOTALPRICE > 0
                    begin
                        if @PRICINGSTRUCTURECODE = 0
                            set @RESOURCES = @RESOURCES + ' @ ' + cast(@PRICE as nvarchar(50)) + ':  ' + cast(@TOTALPRICE as nvarchar(50));
                        else if @PRICINGSTRUCTURECODE = 2
                            set @RESOURCES = @RESOURCES + ':  ' + cast(@TOTALPRICE as nvarchar(50));
                    end

                    fetch next from RESOURCES_CURSOR
                    into @RESOURCEDESCRIPTION, @QUANTITY, @PRICINGSTRUCTURECODE, @PRICE, @TOTALPRICE, @NUMBEROFHOURS;
                end

                close RESOURCES_CURSOR;
                deallocate RESOURCES_CURSOR;

                return @RESOURCES;
            end