USP_REPORT_DEFAULTITEMIZEDRECEIPT

Parameters

Parameter Parameter Type Mode Description
@ORDERID uniqueidentifier IN

Definition

Copy

create procedure [dbo].[USP_REPORT_DEFAULTITEMIZEDRECEIPT]
(
    @ORDERID uniqueidentifier
)
as
    set nocount on;
    set transaction isolation level read uncommitted;

    --            0 - Ticket

    --            1 - Combination

    --            2 - Event Registration

    --            3 - Membership

    --            4 - Merchandise

    --            5 - Flat Rate (Reservation)

    --            6 - Facility

    --          7 - Equipment/Supply Resources

    --            8 - Staff Resources

    --            9 - Donation

    --            10 - Discounts

    --            11 - Fee

    --            12 - Tax



    declare @CURRENTDATE date;
    set @CURRENTDATE = getdate();

    --tickets

    select                                                                        
        0 ORDERITEMTYPE,
        0 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        case when [EVENT].ID is null then
            PROGRAM.ID
        else
            [EVENT].ID 
        end as ITEMID,
        case when [EVENT].ID is null then
            PROGRAM.NAME
        else
            case when [EVENT].STARTTIME = '' then
                [EVENT].NAME + ' ' + replace(convert(nvarchar, [EVENT].STARTDATE, 107), ',','')
            else
                [EVENT].NAME + ' ' + cast([EVENT].[STARTDATETIME] as nvarchar) 
            end
        end as ORDERITEMDESCRIPTION,
        cast(cast(SALESORDERITEM.QUANTITY as integer) as nvarchar) + ' ' + PRICETYPECODE.DESCRIPTION + ' @ ' + cast(SALESORDERITEM.PRICE as nvarchar) SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,
        case when [EVENT].ID is null then
            @CURRENTDATE
        else
            [EVENT].[STARTDATETIME]
        end    as ORDERITEMSORTFIELD1,
        case when [EVENT].ID is null then
            PROGRAM.NAME
        else
            [EVENT].NAME 
        end
        ORDERITEMSORTFIELD2,
        PRICETYPECODE.DESCRIPTION SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDERITEM 
    inner join dbo.SALESORDERITEMTICKET on
        SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
    inner join dbo.PRICETYPECODE on
        SALESORDERITEMTICKET.PRICETYPECODEID = PRICETYPECODE.ID
    left outer join dbo.SALESORDERITEMTICKETCOMBINATION on 
        SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
    left outer join dbo.[EVENT] on
        SALESORDERITEMTICKET.EVENTID = [EVENT].ID
    left outer join dbo.PROGRAM on
        SALESORDERITEMTICKET.PROGRAMID = PROGRAM.ID
    where SALESORDERITEM.SALESORDERID = @ORDERID 
        and SALESORDERITEMTICKETCOMBINATION.ID is null
        and SALESORDERITEM.PRICINGSTRUCTURECODE <> 1

    union all
    --item discounts tickets

    select
        0 ORDERITEMTYPE,
        10 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        DISCOUNT.ID ITEMID,
        case when [EVENT].ID is null then
            PROGRAM.NAME
        else
            case when [EVENT].STARTTIME = '' then
                [EVENT].NAME + ' ' + replace(convert(nvarchar, [EVENT].STARTDATE, 107), ',','')
            else
                [EVENT].NAME + ' ' + cast([EVENT].[STARTDATETIME] as nvarchar) 
            end
        end
        ORDERITEMDESCRIPTION,
        '     ' + DISCOUNT.NAME SUBORDERITEMDESCRIPTION,
        -1 * SALESORDERITEMITEMDISCOUNT.AMOUNT ORDERITEMTOTAL,                            
        case when [EVENT].ID is null then
            @CURRENTDATE
        else
            [EVENT].[STARTDATETIME] 
        end as ORDERITEMSORTFIELD1,
        case when [EVENT].ID is null then
            PROGRAM.NAME
        else
            [EVENT].NAME 
        end as ORDERITEMSORTFIELD2,
        PRICETYPECODE.DESCRIPTION SUBORDERITEMSORTFIELD1,
        DISCOUNT.NAME SUBORDERITEMSORTFIELD2                            
    from dbo.SALESORDERITEM 
    inner join dbo.SALESORDERITEMTICKET on
        SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
    inner join dbo.PRICETYPECODE on
        SALESORDERITEMTICKET.PRICETYPECODEID = PRICETYPECODE.ID
    inner join dbo.SALESORDERITEMITEMDISCOUNT on
        SALESORDERITEM.ID = SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID
    inner join dbo.DISCOUNT on
        SALESORDERITEMITEMDISCOUNT.DISCOUNTID = DISCOUNT.ID
    left outer join dbo.[EVENT] on
        SALESORDERITEMTICKET.EVENTID = [EVENT].ID
    left outer join dbo.PROGRAM on
        SALESORDERITEMTICKET.PROGRAMID = PROGRAM.ID                                    
    where SALESORDERITEM.SALESORDERID = @ORDERID

    union all

    -- flat rate

    select                                                                        
        5 ORDERITEMTYPE,
        5 SUBORDERITEMTYPE,
        @ORDERID ORDERITEMID,
        @ORDERID ITEMID,
        'Reservation' ORDERITEMDESCRIPTION,
        RATESCALE.NAME SUBORDERITEMDESCRIPTION,                            
        ( -- the original rate scale price amount gets updated in RESERVATIONRATESCALEPRICE

          --  if additional tickets are involved.

            select RATESCALEPRICE.AMOUNT 
            from dbo.RATESCALEPRICE 
            where RATESCALE.ID = RATESCALEPRICE.RATESCALEID 
                and RATESCALEPRICE.GROUPMINIMUM = RESERVATIONRATESCALEPRICE.GROUPMINIMUM
                and RATESCALEPRICE.GROUPMAXIMUM = RESERVATIONRATESCALEPRICE.GROUPMAXIMUM
        )
        ORDERITEMTOTAL,
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        '' SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from dbo.RESERVATION
    inner join dbo.RESERVATIONRATESCALE    on 
        RESERVATIONRATESCALE.ID = RESERVATION.ID
    inner join dbo.RESERVATIONRATESCALEPRICE on 
        RESERVATIONRATESCALEPRICE.RESERVATIONRATESCALEID = RESERVATIONRATESCALE.ID
    inner join dbo.RATESCALE on 
        RATESCALE.ID = RESERVATIONRATESCALE.RATESCALEID
    where RESERVATION.ID = @ORDERID 
        and RESERVATION.PRICINGCODE = 1    
        and RESERVATIONRATESCALEPRICE.INUSE = 1

    union all

    -- extra flat rate items

    select                                                                        
        5 ORDERITEMTYPE,
        5 SUBORDERITEMTYPE,
        @ORDERID ORDERITEMID,
        ADDITIONALTICKETS.ID ITEMID,
        'Reservation' ORDERITEMDESCRIPTION,
        ADDITIONALTICKETS.NAME SUBORDERITEMDESCRIPTION,                            
        ADDITIONALTICKETS.QUANTITY * ADDITIONALTICKETS.PRICE ORDERITEMTOTAL,
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        '' SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from 
    (
        select
            newid() as ID,
            EFRP.QUANTITY as [QUANTITY],
            cast(EFRP.QUANTITY  as nvarchar) + ' ' + PRICETYPECODE.DESCRIPTION + ' @ ' + cast(SALESORDERITEM.PRICE  as nvarchar) as [NAME],
            SALESORDERITEM.PRICE as PRICE,
            PRICETYPECODE.ID as PRICETYPEID
        from dbo.[SALESORDERITEM]
        inner join dbo.[SALESORDERITEMTICKET] on [SALESORDERITEM].[ID] = [SALESORDERITEMTICKET].[ID]
        inner join dbo.[PRICETYPECODE] on [SALESORDERITEMTICKET].[PRICETYPECODEID] = [PRICETYPECODE].[ID]
        left join dbo.[EVENT] on [SALESORDERITEMTICKET].[EVENTID] = [EVENT].[ID]
        left join dbo.[PROGRAM] on [SALESORDERITEMTICKET].[PROGRAMID] = [PROGRAM].[ID]
        inner join 
        (
            select
                ITINERARYITEM.EVENTID,
                ITINERARYITEM.PROGRAMID,
                EFR.PRICETYPEID,
                sum(EFR.QUANTITY) as QUANTITY
            from dbo.UFN_RESERVATION_GETEXTRAFLATRATEPEOPLE(@ORDERID) as EFR
            inner join ITINERARYITEM on 
                ITINERARYITEM.ITINERARYID = EFR.ITINERARYID
            where (ITINERARYITEM.PROGRAMID is not null or ITINERARYITEM.EVENTID is not null)
            group by ITINERARYITEM.EVENTID, ITINERARYITEM.PROGRAMID, EFR.PRICETYPEID    
        ) as EFRP  on PRICETYPECODE.ID = EFRP.PRICETYPEID and (EVENT.ID = EFRP.EVENTID or PROGRAM.ID = EFRP.PROGRAMID)
        where [SALESORDERITEM].[PRICINGSTRUCTURECODE] = 1
            and [SALESORDERITEM].[SALESORDERID] = @ORDERID
    ) as ADDITIONALTICKETS

    union all
    --item fees

    select
        0 ORDERITEMTYPE,
        11 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        FEE.ID ITEMID,
        case when [EVENT].ID is null then
            PROGRAM.NAME
        else
            case when [EVENT].STARTTIME = '' then
                [EVENT].NAME + ' ' + replace(convert(nvarchar, [EVENT].STARTDATE, 107), ',','')
            else
                [EVENT].NAME + ' ' + cast([EVENT].[STARTDATETIME] as nvarchar) 
            end
        end as ORDERITEMDESCRIPTION,
        '     ' + FEE.NAME SUBORDERITEMDESCRIPTION,
        FEEPARENT.TOTAL ORDERITEMTOTAL,                            
        case when [EVENT].ID is null then
            @CURRENTDATE
        else
            [EVENT].[STARTDATETIME] 
        end as ORDERITEMSORTFIELD1,
        case when [EVENT].ID is null then
            PROGRAM.NAME
        else
            [EVENT].NAME 
        end as ORDERITEMSORTFIELD2,
        PRICETYPECODE.DESCRIPTION SUBORDERITEMSORTFIELD1,
        FEE.NAME SUBORDERITEMSORTFIELD2
    from dbo.SALESORDER
    inner join dbo.SALESORDERITEM on
        SALESORDER.ID = SALESORDERITEM.SALESORDERID
    inner join dbo.SALESORDERITEMTICKET on
        SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
    inner join dbo.PRICETYPECODE on
        SALESORDERITEMTICKET.PRICETYPECODEID = PRICETYPECODE.ID
    inner join dbo.SALESORDERITEMFEE on
        SALESORDERITEM.ID = SALESORDERITEMFEE.SALESORDERITEMID
    inner join dbo.FEE on
        SALESORDERITEMFEE.FEEID = FEE.ID
    inner join SALESORDERITEM FEEPARENT on
        SALESORDERITEMFEE.ID = FEEPARENT.ID
    left outer join dbo.[EVENT] on
        SALESORDERITEMTICKET.EVENTID = [EVENT].ID
    left outer join dbo.PROGRAM on
        SALESORDERITEMTICKET.PROGRAMID = PROGRAM.ID
    -- exclude fees for combo items

    left outer join dbo.SALESORDERITEMTICKETCOMBINATION on
        SALESORDERITEMTICKETCOMBINATION.ID = SALESORDERITEM.ID
    where
        SALESORDER.ID = @ORDERID
        and SALESORDERITEMTICKETCOMBINATION.ID is null
        and FEEPARENT.PRICINGSTRUCTURECODE <> 1  -- Flat rate


    union all
    --combinations

    select 
        ORDERITEMTYPE, 
        SUBORDERITEMTYPE, 
        ORDERITEMID, 
        ITEMID, 
        ORDERITEMDESCRIPTION, 
        SUBORDERITEMDESCRIPTION, 
        ORDERITEMTOTAL,
        ORDERITEMSORTFIELD1, 
        ORDERITEMSORTFIELD2, 
        SUBORDERITEMSORTFIELD1, 
        SUBORDERITEMSORTFIELD2                        
    from dbo.UFN_SALESORDER_GETCOMBINATIONITEMSFORDEFAULTITEMIZEDRECEIPT(@ORDERID)

    union all
    --event registrations        

    select    
        2 ORDERITEMTYPE,
        1 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        EVENTPRICE.ID ITEMID,
        case when [EVENT].STARTTIME = '' then
            [EVENT].NAME + ' ' + replace(convert(nvarchar, [EVENT].STARTDATE, 107), ',','')
        else
            [EVENT].NAME + ' ' + cast([EVENT].[STARTDATETIME] as nvarchar) 
        end
        ORDERITEMDESCRIPTION,
        cast(SALESORDERITEMEVENTREGISTRANTREGISTRATION.QUANTITY as nvarchar) + ' ' + EVENTPRICE.NAME + ' @ ' + cast(EVENTPRICE.AMOUNT as nvarchar) SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        [EVENT].[STARTDATETIME] ORDERITEMSORTFIELD1,
        [EVENT].NAME ORDERITEMSORTFIELD2,
        '' SUBORDERITEMSORTFIELD1,
        --EVENTPRICE.NAME SUBORDERITEMSORTFIELD1,

        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDERITEM 
    inner join dbo.SALESORDERITEMEVENTREGISTRATION on
        SALESORDERITEM.ID = SALESORDERITEMEVENTREGISTRATION.ID
    inner join dbo.SALESORDERITEMEVENTREGISTRANTREGISTRATION on
        SALESORDERITEMEVENTREGISTRATION.ID = SALESORDERITEMEVENTREGISTRANTREGISTRATION.SALESORDERITEMEVENTREGISTRATIONID
    inner join dbo.EVENTPRICE on
        SALESORDERITEMEVENTREGISTRANTREGISTRATION.EVENTPRICEID = EVENTPRICE.ID                                
    inner join dbo.REGISTRANT on
        SALESORDERITEMEVENTREGISTRATION.REGISTRANTID = REGISTRANT.ID
    inner join dbo.[EVENT] on
        REGISTRANT.EVENTID = [EVENT].ID
    inner join dbo.REGISTRANTREGISTRATION on
        REGISTRANT.ID = REGISTRANTREGISTRATION.REGISTRANTID    and
        SALESORDERITEMEVENTREGISTRANTREGISTRATION.EVENTPRICEID = REGISTRANTREGISTRATION.EVENTPRICEID
    where SALESORDERITEM.SALESORDERID = @ORDERID

    union all
    --event registration payment information

    select distinct
        2 ORDERITEMTYPE,
        2 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        [EVENT].ID ITEMID,
        case when [EVENT].STARTTIME = '' then
            [EVENT].NAME + ' ' + replace(convert(nvarchar, [EVENT].STARTDATE, 107), ',','')
        else
            [EVENT].NAME + ' ' + cast([EVENT].[STARTDATETIME] as nvarchar) 
        end as ORDERITEMDESCRIPTION,
        '     ' + 
        case when RR.AMOUNT = 0 and EVENTPRICE.AMOUNT > 0 then
            'Fee waived'
        when EVENTBALANCE.BALANCE = 0 then
            'Payment in full'
        when EVENTBALANCE.BALANCE > 0 then
            'Partial payment'
        end as SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        [EVENT].[STARTDATETIME] ORDERITEMSORTFIELD1,
        [EVENT].NAME ORDERITEMSORTFIELD2,
        '' SUBORDERITEMSORTFIELD1,
        --EVENTPRICE.NAME SUBORDERITEMSORTFIELD1,

        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDERITEM
    inner join dbo.SALESORDERITEMEVENTREGISTRATION on
        SALESORDERITEM.ID = SALESORDERITEMEVENTREGISTRATION.ID
    inner join dbo.SALESORDERITEMEVENTREGISTRANTREGISTRATION on
        SALESORDERITEMEVENTREGISTRATION.ID = SALESORDERITEMEVENTREGISTRANTREGISTRATION.SALESORDERITEMEVENTREGISTRATIONID
    inner join dbo.EVENTPRICE on
        SALESORDERITEMEVENTREGISTRANTREGISTRATION.EVENTPRICEID = EVENTPRICE.ID                                
    inner join dbo.REGISTRANT on
        SALESORDERITEMEVENTREGISTRATION.REGISTRANTID = REGISTRANT.ID
    inner join dbo.[EVENT] on
        REGISTRANT.EVENTID = [EVENT].ID
    inner join (select REGISTRANTID, sum(AMOUNT) AMOUNT from dbo.REGISTRANTREGISTRATION group by REGISTRANTID) RR on
        REGISTRANT.ID = RR.REGISTRANTID                            
    inner join dbo.UFN_GETUNPAIDPATRONEVENTREGISTRATIONS(null,@ORDERID, null, 0) EVENTBALANCE on
        REGISTRANT.ID = EVENTBALANCE.REGISTRANTID
    where SALESORDERID = @ORDERID

    union all
    --event registration balance due

    select distinct    
        2 ORDERITEMTYPE,
        3 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        REGISTRANT.ID ITEMID,
        case when [EVENT].STARTTIME = '' then
            [EVENT].NAME + ' ' + replace(convert(nvarchar, [EVENT].STARTDATE, 107), ',','')
        else
            [EVENT].NAME + ' ' + cast([EVENT].[STARTDATETIME] as nvarchar) 
        end as ORDERITEMDESCRIPTION,
        '     Balance due ' + CAST(EVENTBALANCE.BALANCE as nvarchar)
        SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        [EVENT].[STARTDATETIME] ORDERITEMSORTFIELD1,
        [EVENT].NAME ORDERITEMSORTFIELD2,
        '' SUBORDERITEMSORTFIELD1,
        --EVENTPRICE.NAME SUBORDERITEMSORTFIELD1,

        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDERITEM
    inner join dbo.SALESORDERITEMEVENTREGISTRATION on
        SALESORDERITEM.ID = SALESORDERITEMEVENTREGISTRATION.ID
    inner join dbo.SALESORDERITEMEVENTREGISTRANTREGISTRATION on
        SALESORDERITEMEVENTREGISTRATION.ID = SALESORDERITEMEVENTREGISTRANTREGISTRATION.SALESORDERITEMEVENTREGISTRATIONID
    inner join dbo.EVENTPRICE on
        SALESORDERITEMEVENTREGISTRANTREGISTRATION.EVENTPRICEID = EVENTPRICE.ID
    inner join dbo.REGISTRANT on
        SALESORDERITEMEVENTREGISTRATION.REGISTRANTID = REGISTRANT.ID
    inner join dbo.[EVENT] on
        REGISTRANT.EVENTID = [EVENT].ID
    inner join dbo.UFN_GETUNPAIDPATRONEVENTREGISTRATIONS(null, @ORDERID, null, 0) EVENTBALANCE on
        REGISTRANT.ID = EVENTBALANCE.REGISTRANTID                                
    where SALESORDERID = @ORDERID and
        EVENTBALANCE.BALANCE > 0

    union all
    --memberships

    select
        3 ORDERITEMTYPE,
        3 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        MEMBERSHIPPROGRAM.ID ITEMID,
        MEMBERSHIPPROGRAM.NAME ORDERITEMDESCRIPTION,
        cast(cast(SALESORDERITEM.QUANTITY as integer) as nvarchar) + ' ' + MEMBERSHIPLEVEL.NAME + ' @ ' + cast(SALESORDERITEM.PRICE as nvarchar) SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        MEMBERSHIPPROGRAM.NAME ORDERITEMSORTFIELD2,
        cast(SALESORDERITEM.ID as nvarchar(36)) SUBORDERITEMSORTFIELD1,
        MEMBERSHIPLEVEL.NAME SUBORDERITEMSORTFIELD2
    from dbo.SALESORDER 
    inner join SALESORDERITEM on
        SALESORDER.ID = SALESORDERITEM.SALESORDERID                        
    inner join dbo.SALESORDERITEMMEMBERSHIP on
        SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIP.ID
    inner join dbo.MEMBERSHIPPROGRAM on
        SALESORDERITEMMEMBERSHIP.MEMBERSHIPPROGRAMID = MEMBERSHIPPROGRAM.ID
    inner join dbo.MEMBERSHIPLEVEL on
        SALESORDERITEMMEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    where SALESORDER.ID = @ORDERID

    union all
    --membership add-ons

    select
        3 ORDERITEMTYPE,
        5 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        MEMBERSHIPPROGRAM.ID ITEMID,
        MEMBERSHIPPROGRAM.NAME ORDERITEMDESCRIPTION,
        cast(cast(SALESORDERITEM.QUANTITY as integer) as nvarchar) + ' ' + ADDON.NAME + ' @ ' + cast(SALESORDERITEM.PRICE as nvarchar) SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        MEMBERSHIPPROGRAM.NAME ORDERITEMSORTFIELD2,
        cast(SALESORDERITEMMEMBERSHIP.ID as nvarchar(36)) SUBORDERITEMSORTFIELD1,
        ADDON.NAME SUBORDERITEMSORTFIELD2
    from dbo.SALESORDER 
    inner join SALESORDERITEM on
        SALESORDER.ID = SALESORDERITEM.SALESORDERID                        
    inner join dbo.SALESORDERITEMMEMBERSHIPADDON on
        SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIPADDON.ID
    inner join dbo.SALESORDERITEMMEMBERSHIP on 
        SALESORDERITEMMEMBERSHIPADDON.SALESORDERITEMMEMBERSHIPID = SALESORDERITEMMEMBERSHIP.ID
    inner join dbo.MEMBERSHIPPROGRAM on
        SALESORDERITEMMEMBERSHIP.MEMBERSHIPPROGRAMID = MEMBERSHIPPROGRAM.ID
    inner join dbo.ADDON on
        SALESORDERITEMMEMBERSHIPADDON.ADDONID = ADDON.ID
    where SALESORDER.ID = @ORDERID

    union all
    --applied tickets to membership

    select
        3 ORDERITEMTYPE,
        10 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        SALESORDERITEMMEMBERSHIPITEMPROMOTION.ID ITEMID,
        MEMBERSHIPPROGRAM.NAME ORDERITEMDESCRIPTION,
        '     ' + SALESORDERITEMMEMBERSHIPITEMPROMOTION.PROMOTIONNAME SUBORDERITEMDESCRIPTION,                            
        -1 * SALESORDERITEMMEMBERSHIPITEMPROMOTION.AMOUNT ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        MEMBERSHIPPROGRAM.NAME ORDERITEMSORTFIELD2,
        cast(SALESORDERITEM.ID as nvarchar(36))  SUBORDERITEMSORTFIELD1,
        SALESORDERITEMMEMBERSHIPITEMPROMOTION.PROMOTIONNAME SUBORDERITEMSORTFIELD2
    from dbo.SALESORDERITEM
    inner join dbo.SALESORDERITEMMEMBERSHIP on
        SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIP.ID
    inner join dbo.MEMBERSHIPPROGRAM on
        SALESORDERITEMMEMBERSHIP.MEMBERSHIPPROGRAMID = MEMBERSHIPPROGRAM.ID
    inner join dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION on
        SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID
    where SALESORDERID = @ORDERID

    union all
    --merchandise

    select
        4 ORDERITEMTYPE,
        4 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        MERCHANDISEPRODUCTINSTANCE.ID ITEMID,
        MERCHANDISEPRODUCTINSTANCE.BARCODE + ' ' + SALESORDERITEM.DESCRIPTION ORDERITEMDESCRIPTION,
        cast(cast(SALESORDERITEM.QUANTITY as integer) as nvarchar) + ' @ ' + cast(SALESORDERITEM.PRICE as nvarchar) SUBORDERITEMDESCRIPTION,                                           
        --'Merchandise' ORDERITEMDESCRIPTION,

        --SALESORDERITEM.DESCRIPTION + ' ' + MERCHANDISEPRODUCTINSTANCE.BARCODE SUBORDERITEMDESCRIPTION,                            

        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        SALESORDERITEM.DESCRIPTION SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDERITEM                            
    inner join dbo.SALESORDERITEMMERCHANDISE on
        SALESORDERITEM.ID = SALESORDERITEMMERCHANDISE.ID
    inner join dbo.MERCHANDISEPRODUCTINSTANCE on
        SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISEPRODUCTINSTANCE.ID
    inner join dbo.MERCHANDISEPRODUCT on
        MERCHANDISEPRODUCTINSTANCE.MERCHANDISEPRODUCTID = MERCHANDISEPRODUCT.ID
    where SALESORDERID = @ORDERID

    union all
    -- item discount merchandise

    select
        4 ORDERITEMTYPE,
        10 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        DISCOUNT.ID ITEMID,
        MERCHANDISEPRODUCTINSTANCE.BARCODE + ' ' + SALESORDERITEM.DESCRIPTION ORDERITEMDESCRIPTION,
        '     ' + DISCOUNT.NAME SUBORDERITEMDESCRIPTION,
        -1 * SALESORDERITEMITEMDISCOUNT.AMOUNT ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        SALESORDERITEM.DESCRIPTION SUBORDERITEMSORTFIELD1,
        DISCOUNT.NAME SUBORDERITEMSORTFIELD2                            
    from dbo.SALESORDERITEM
    inner join dbo.SALESORDERITEMMERCHANDISE on
        SALESORDERITEM.ID = SALESORDERITEMMERCHANDISE.ID
    inner join dbo.SALESORDERITEMITEMDISCOUNT on
        SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID = SALESORDERITEM.ID
    inner join dbo.DISCOUNT on 
        SALESORDERITEMITEMDISCOUNT.DISCOUNTID = DISCOUNT.ID
    inner join dbo.MERCHANDISEPRODUCTINSTANCE on
        SALESORDERITEMMERCHANDISE.MERCHANDISEPRODUCTINSTANCEID = MERCHANDISEPRODUCTINSTANCE.ID
    inner join dbo.MERCHANDISEPRODUCT on
        MERCHANDISEPRODUCTINSTANCE.MERCHANDISEPRODUCTID = MERCHANDISEPRODUCT.ID
    where SALESORDERID = @ORDERID         

    union all
    -- facilities

    select
        6 ORDERITEMTYPE,
        6 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        EVENTLOCATION.ID ITEMID,
        'Facilities' ORDERITEMDESCRIPTION,
        EVENTLOCATION.NAME SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        EVENTLOCATION.NAME SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDERITEM 
    inner join dbo.SALESORDERITEMFACILITY on
        SALESORDERITEM.ID = SALESORDERITEMFACILITY.ID
    inner join dbo.EVENTLOCATION on
        SALESORDERITEMFACILITY.EVENTLOCATIONID = EVENTLOCATION.ID
    where SALESORDERID = @ORDERID        

    union all

    -- staff resources

    select
        7 ORDERITEMTYPE,
        7 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        RESOURCES.ITID ITEMID,
        'Staff' ORDERITEMDESCRIPTION,
        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

                        cast(cast(SALESORDERITEM.QUANTITY / RESOURCES.NUMBEROFHOURS as float) as nvarchar)
                    else
                        cast(cast(SALESORDERITEM.QUANTITY as float) as nvarchar)
                end
            else
                cast (RESOURCES.QUANTITYNEEDED as nvarchar)
        end + ' ' + RESOURCES.DESCRIPTION + ' ' + 
        case when RESOURCES.PRICINGSTRUCTURECODE <> 2 then ' @ ' + cast(SALESORDERITEM.PRICE as nvarchar)
        else ''
        end
        SUBORDERITEMDESCRIPTION,                            
        case when (RESOURCES.PRICINGSTRUCTURECODE = 2) then null else SALESORDERITEM.TOTAL end as ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        SALESORDERITEM.DESCRIPTION SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from (
        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
                    0
            end as [NUMBEROFHOURS],
            SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID as [ITID],
            ITINERARYSTAFFRESOURCE.PRICINGSTRUCTURECODE
        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
                    0
            end as [NUMBEROFHOURS],
            SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID as [ITID],
            ITINERARYITEMSTAFFRESOURCE.PRICINGSTRUCTURECODE
        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 = @ORDERID and 
        SALESORDERITEM.PRICINGSTRUCTURECODE <> 1

    union all
    -- Staff resources per hour


    select
        7 ORDERITEMTYPE,
        8 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        SALESORDERITEM.ID ITEMID,
        'Staff' ORDERITEMDESCRIPTION,
        cast(cast (RESOURCES.NUMBEROFHOURS as float) as nvarchar) + ' hour' + 
            case when RESOURCES.NUMBEROFHOURS > 1 
                then 's' 
            else 
                '' 
            end +
         ' @ ' + cast(SALESORDERITEM.PRICE as nvarchar) SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL as ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        SALESORDERITEM.DESCRIPTION SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from (
        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
                    0
            end as [NUMBEROFHOURS],
            SALESORDERITEMITINERARYSTAFFRESOURCE.ITINERARYSTAFFRESOURCEID as [ITID],
            ITINERARYSTAFFRESOURCE.PRICINGSTRUCTURECODE
        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
                    0
            end as [NUMBEROFHOURS],
            SALESORDERITEMITINERARYITEMSTAFFRESOURCE.ITINERARYITEMSTAFFRESOURCEID as [ITID],
            ITINERARYITEMSTAFFRESOURCE.PRICINGSTRUCTURECODE
        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 = @ORDERID and
        RESOURCES.PRICINGSTRUCTURECODE = 2 and
        SALESORDERITEM.PRICINGSTRUCTURECODE <> 1


    union all    
    -- Supply/equipment resources


    select
        8 ORDERITEMTYPE,
        8 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        RESOURCES.ITID ITEMID,
        'Resources' ORDERITEMDESCRIPTION,
        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

                        cast(cast(SALESORDERITEM.QUANTITY / RESOURCES.NUMBEROFHOURS as float) as nvarchar)
                    else
                        cast(cast(SALESORDERITEM.QUANTITY as float) as nvarchar)
                end
            else
                cast (RESOURCES.QUANTITYNEEDED as nvarchar)
        end + ' ' + RESOURCES.DESCRIPTION + ' ' + 
        case when RESOURCES.PRICINGSTRUCTURECODE <> 2 then ' @ ' + cast(SALESORDERITEM.PRICE as nvarchar)
        else ''
        end
        SUBORDERITEMDESCRIPTION,                            
        case when (RESOURCES.PRICINGSTRUCTURECODE = 2) then null else SALESORDERITEM.TOTAL end as ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        SALESORDERITEM.DESCRIPTION SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    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
                    0
            end as [NUMBEROFHOURS],
            SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID as [ITID],
            ITINERARYRESOURCE.PRICINGSTRUCTURECODE                                
        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
                    0
            end as [NUMBEROFHOURS],
            SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID as [ITID],
            ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE                        
        from
            dbo.SALESORDERITEMITINERARYITEMRESOURCE
        inner join
            dbo.ITINERARYITEMRESOURCE on SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID = ITINERARYITEMRESOURCE.ID
        inner join
            dbo.ITINERARYITEM on ITINERARYITEMRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
    ) as [RESOURCES]
    inner join
        dbo.SALESORDERITEM on RESOURCES.SALESORDERITEMID = SALESORDERITEM.ID
    where
        SALESORDERITEM.SALESORDERID = @ORDERID
        and SALESORDERITEM.PRICINGSTRUCTURECODE <> 1

    union all    
    -- Supply/equipment resources per hour


    select
        8 ORDERITEMTYPE,
        9 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        SALESORDERITEM.ID ITEMID,
        'Resources' ORDERITEMDESCRIPTION,
        cast(cast (RESOURCES.NUMBEROFHOURS as float) as nvarchar) + ' hour' + 
            case when RESOURCES.NUMBEROFHOURS > 1 
                then 's' 
            else 
                '' 
            end +
         ' @ ' + cast(SALESORDERITEM.PRICE as nvarchar) SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL as ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        SALESORDERITEM.DESCRIPTION SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    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
                    0
            end as [NUMBEROFHOURS],
            SALESORDERITEMITINERARYRESOURCE.ITINERARYRESOURCEID as [ITID],
            ITINERARYRESOURCE.PRICINGSTRUCTURECODE                                
        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
                    0
            end as [NUMBEROFHOURS],
            SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID as [ITID],
            ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE                        
        from
            dbo.SALESORDERITEMITINERARYITEMRESOURCE
        inner join
            dbo.ITINERARYITEMRESOURCE on SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID = ITINERARYITEMRESOURCE.ID
        inner join
            dbo.ITINERARYITEM on ITINERARYITEMRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
    ) as [RESOURCES]
    inner join
        dbo.SALESORDERITEM on RESOURCES.SALESORDERITEMID = SALESORDERITEM.ID
    where
        SALESORDERITEM.SALESORDERID = @ORDERID
        and RESOURCES.PRICINGSTRUCTURECODE = 2
        and SALESORDERITEM.PRICINGSTRUCTURECODE <> 1                    

    union all

    --donations

    select
        9 ORDERITEMTYPE,
        9 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        DESIGNATION.ID ITEMID,
        'Donations' ORDERITEMDESCRIPTION,
        DESIGNATIONLEVEL.NAME SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        DESIGNATIONLEVEL.NAME SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDER 
    inner join SALESORDERITEM on
        SALESORDER.ID = SALESORDERITEM.SALESORDERID                                
    inner join dbo.SALESORDERITEMDONATION on
        SALESORDERITEM.ID = SALESORDERITEMDONATION.ID
    inner join dbo.DESIGNATION on
        SALESORDERITEMDONATION.DESIGNATIONID = DESIGNATION.ID
    inner join dbo.DESIGNATIONLEVEL on
        DESIGNATION.DESIGNATIONLEVEL1ID = DESIGNATIONLEVEL.ID
    where SALESORDER.ID = @ORDERID

    union all
    --order discounts                        

    select
        10 ORDERITEMTYPE,
        10 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        coalesce(DISCOUNT.ID, SALESORDERADJUSTABLEDISCOUNT.ID) ITEMID,
        'Discounts' ORDERITEMDESCRIPTION,
        SALESORDERITEMORDERDISCOUNT.DISCOUNTNAME SUBORDERITEMDESCRIPTION,                            
        -1 * SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        SALESORDERITEMORDERDISCOUNT.DISCOUNTNAME SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDER 
    inner join SALESORDERITEM on
        SALESORDER.ID = SALESORDERITEM.SALESORDERID                                
    inner join dbo.SALESORDERITEMORDERDISCOUNT on
        SALESORDERITEM.ID = SALESORDERITEMORDERDISCOUNT.ID
    left outer join dbo.DISCOUNT on
        SALESORDERITEMORDERDISCOUNT.ISADJUSTABLEDISCOUNT = 0 and
        SALESORDERITEMORDERDISCOUNT.DISCOUNTID = DISCOUNT.ID
    left outer join dbo.SALESORDERADJUSTABLEDISCOUNT on
        SALESORDERITEMORDERDISCOUNT.ISADJUSTABLEDISCOUNT = 1 and
        SALESORDERITEM.SALESORDERID = SALESORDERADJUSTABLEDISCOUNT.SALESORDERID
    where SALESORDER.ID = @ORDERID    

    union all
    --order fees                        

    select
        11 ORDERITEMTYPE,
        11 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        FEE.ID ITEMID,
        'Fees' ORDERITEMDESCRIPTION,
        FEE.NAME SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        FEE.NAME SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDER 
    inner join SALESORDERITEM on
        SALESORDER.ID = SALESORDERITEM.SALESORDERID                                
    inner join dbo.SALESORDERITEMFEE on
        SALESORDERITEM.ID = SALESORDERITEMFEE.ID
    inner join dbo.FEE on
        SALESORDERITEMFEE.FEEID = FEE.ID
    where SALESORDER.ID = @ORDERID and
        SALESORDERITEMFEE.SALESORDERITEMID is null and
        SALESORDERITEM.PRICINGSTRUCTURECODE <> 1


    union all
    --taxes                        

    select distinct
        12 ORDERITEMTYPE,
        12 SUBORDERITEMTYPE,
        SALESORDERITEM.ID ORDERITEMID,
        TAX.ID ITEMID,
        'Taxes' ORDERITEMDESCRIPTION,
        TAX.NAME SUBORDERITEMDESCRIPTION,                            
        SALESORDERITEM.TOTAL ORDERITEMTOTAL,                            
        '' ORDERITEMSORTFIELD1,
        '' ORDERITEMSORTFIELD2,
        TAX.NAME SUBORDERITEMSORTFIELD1,
        '' SUBORDERITEMSORTFIELD2
    from dbo.SALESORDER 
    inner join SALESORDERITEM on
        SALESORDER.ID = SALESORDERITEM.SALESORDERID                                
    inner join dbo.SALESORDERITEMTAX on
        SALESORDERITEM.ID = SALESORDERITEMTAX.TAXITEMID
    inner join dbo.TAX on
        SALESORDERITEMTAX.TAXID = TAX.ID
    where SALESORDER.ID = @ORDERID
    order by ORDERITEMTYPE, ORDERITEMSORTFIELD1, ORDERITEMSORTFIELD2, SUBORDERITEMSORTFIELD1, SUBORDERITEMTYPE, SUBORDERITEMSORTFIELD2

    return 0;