USP_DATALIST_SALESCOMPARISONREPORT

Returns list of sales revenue from two periods of time.

Parameters

Parameter Parameter Type Mode Description
@THISFROMDATE datetime IN This period start date
@THISTODATE datetime IN This period end date
@LASTFROMDATE datetime IN Last period start date
@LASTTODATE datetime IN Last period end date
@SALESMETHODID uniqueidentifier IN Sales method
@ITEMTYPECODE tinyint IN Item type

Definition

Copy


CREATE procedure dbo.USP_DATALIST_SALESCOMPARISONREPORT
(
    @THISFROMDATE datetime = null,
    @THISTODATE datetime = null,
    @LASTFROMDATE datetime = null,
    @LASTTODATE datetime = null,
    @SALESMETHODID uniqueidentifier = null,
    @ITEMTYPECODE tinyint = null
)
as
    set nocount on;

    set @THISFROMDATE = cast(@THISFROMDATE as date)
    set @THISTODATE = dbo.UFN_DATE_GETLATESTTIME(@THISTODATE)
    set @LASTFROMDATE = cast(@LASTFROMDATE as date)
    set @LASTTODATE = dbo.UFN_DATE_GETLATESTTIME(@LASTTODATE)

    declare @SALESMETHODTYPECODE tinyint = null;
    select @SALESMETHODTYPECODE = [TYPECODE]
    from dbo.[SALESMETHOD]
    where [ID] = @SALESMETHODID;

    --This Period Sales Item Totals

    declare @THISPERIODSALESORDERTOTALS table (
        TOTAL money,
        QUANTITY decimal(20,0),
        PROGRAMID uniqueidentifier,
        MEMBERSHIPPROGRAMID uniqueidentifier,
        DESIGNATIONID uniqueidentifier,
        REGISTRANTEVENTID uniqueidentifier,
        RESOURCEID uniqueidentifier,
        VOLUNTEERTYPEID uniqueidentifier,
        ITEMDISCOUNTS money,
        LOCATIONID uniqueidentifier,
        MERCHANDISEDEPARTMENTID uniqueidentifier,
        ADDONID uniqueidentifier
    )

    insert into @THISPERIODSALESORDERTOTALS
    select 
        sum([SALESORDERITEM].[TOTAL]) - case [SALESORDERITEM].[TYPECODE]
                                            when 1 then
                                                sum(SALESORDERITEMMEMBERSHIPITEMPROMOTIONS.AMOUNT)
                                            else
                                                sum(SALESORDERITEMITEMDISCOUNTS.AMOUNT)
                                        end,
        case [SALESORDERITEM].[TYPECODE]
            when 6 then count(distinct [REGISTRANT].[ID])
            else sum([SALESORDERITEM].[QUANTITY])
        end,
        coalesce([SALESORDERITEMTICKET].[PROGRAMID], [EVENT].[PROGRAMID]) as [PROGRAMID],
        [SALESORDERITEMMEMBERSHIP].[MEMBERSHIPPROGRAMID],
        [SALESORDERITEMDONATION].[DESIGNATIONID],
        [REGISTRANT].[EVENTID] as [REGISTRANTEVENTID],
        coalesce(ITINERARYRESOURCE.RESOURCEID, ITINERARYITEMRESOURCE.RESOURCEID) as [RESOURCEID],
        coalesce(ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID, ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID) as [VOLUNTEERTYPEID],
        case [SALESORDERITEM].[TYPECODE]
            when 1 then
                sum(SALESORDERITEMMEMBERSHIPITEMPROMOTIONS.AMOUNT)
            else
                sum(SALESORDERITEMITEMDISCOUNTS.AMOUNT)
        end as [ITEMDISCOUNTS],
        [SALESORDERITEMFACILITY].[EVENTLOCATIONID] as [LOCATIONID],
        [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID] as [MERCHANDISEDEPARTMENTID],
        SALESORDERITEMMEMBERSHIPADDON.ADDONID as ADDONID
    from
        dbo.UFN_SALESORDER_BETWEENDATES(@THISFROMDATE, @THISTODATE) as FILTEREDSALESORDERS
    inner join
        dbo.SALESORDER on SALESORDER.ID = FILTEREDSALESORDERS.ID
    inner join dbo.[SALESORDERITEM]
        on [SALESORDER].[ID] = [SALESORDERITEM].[SALESORDERID]
    left join dbo.[SALESORDERITEMTICKET]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMTICKET].[ID]
    left join dbo.[EVENT]
        on [SALESORDERITEMTICKET].[EVENTID] = [EVENT].[ID]
    left join dbo.[SALESORDERITEMMEMBERSHIP]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMMEMBERSHIP].[ID]
    left join dbo.[SALESORDERITEMDONATION]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMDONATION].[ID]
    left join dbo.[SALESORDERITEMEVENTREGISTRATION]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]

    left join dbo.[SALESORDERITEMITINERARYRESOURCE]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYRESOURCE].[SALESORDERITEMID]
    left join dbo.[ITINERARYRESOURCE]
         on [SALESORDERITEMITINERARYRESOURCE].[ITINERARYRESOURCEID] = [ITINERARYRESOURCE].[ID]

    left join dbo.[SALESORDERITEMITINERARYITEMRESOURCE]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYITEMRESOURCE].[SALESORDERITEMID]
    left join dbo.[ITINERARYITEMRESOURCE]
         on [SALESORDERITEMITINERARYITEMRESOURCE].[ITINERARYITEMRESOURCEID] = [ITINERARYITEMRESOURCE].[ID]

    left join dbo.[SALESORDERITEMITINERARYSTAFFRESOURCE]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYSTAFFRESOURCE].[SALESORDERITEMID]
    left join dbo.[ITINERARYSTAFFRESOURCE]
         on [SALESORDERITEMITINERARYSTAFFRESOURCE].[ITINERARYSTAFFRESOURCEID] = [ITINERARYSTAFFRESOURCE].[ID]

    left join dbo.[SALESORDERITEMITINERARYITEMSTAFFRESOURCE]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYITEMSTAFFRESOURCE].[SALESORDERITEMID]
    left join dbo.[ITINERARYITEMSTAFFRESOURCE]
         on [SALESORDERITEMITINERARYITEMSTAFFRESOURCE].[ITINERARYITEMSTAFFRESOURCEID] = [ITINERARYITEMSTAFFRESOURCE].[ID]

    left join dbo.[REGISTRANT]
        on [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANT].[ID]

    left join dbo.[SALESORDERITEMFACILITY]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMFACILITY].[ID]

    left join dbo.[SALESORDERITEMMERCHANDISE]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMMERCHANDISE].[ID]

    left join dbo.SALESORDERITEMMEMBERSHIPADDON
        on SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIPADDON.ID

    outer apply (
        select isnull(sum(SALESORDERITEMITEMDISCOUNT.AMOUNT), 0) as AMOUNT
        from dbo.SALESORDERITEMITEMDISCOUNT
        where SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID = SALESORDERITEM.ID
    ) as SALESORDERITEMITEMDISCOUNTS

    outer apply (
        select isnull(sum(SALESORDERITEMMEMBERSHIPITEMPROMOTION.AMOUNT), 0) as AMOUNT
        from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
        where SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID = SALESORDERITEM.ID
    ) as SALESORDERITEMMEMBERSHIPITEMPROMOTIONS

    where
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        [SALESORDER].[STATUSCODE] = 1 and 
        (
            (
                [SALESORDERITEM].[TYPECODE] = @ITEMTYPECODE or
                ([SALESORDERITEM].[TYPECODE] = 9 and @ITEMTYPECODE = 8) or 
                ([SALESORDERITEM].[TYPECODE] = 11 and @ITEMTYPECODE = 10) or 
                @ITEMTYPECODE is null
            ) and 
            [SALESORDERITEM].[TYPECODE] in (0,1,2,6,7,8,9,10,11,14,16)
        )
    group by 
        [SALESORDERITEM].[TYPECODE],
        coalesce([SALESORDERITEMTICKET].[PROGRAMID], [EVENT].[PROGRAMID]),
        [SALESORDERITEMMEMBERSHIP].[MEMBERSHIPPROGRAMID],
        [SALESORDERITEMDONATION].[DESIGNATIONID],
        coalesce(ITINERARYRESOURCE.RESOURCEID, ITINERARYITEMRESOURCE.RESOURCEID),
        coalesce(ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID, ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID),
        [REGISTRANT].[EVENTID],
        [REGISTRANT].[ID],
        [SALESORDERITEMFACILITY].[EVENTLOCATIONID],
        [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID],
        SALESORDERITEMMEMBERSHIPADDON.ADDONID
    option (recompile);

    --This Period Sales Order Discounts

    declare @THISPERIODORDERDISCOUNTS table (
        TOTAL money,
        PROGRAMID uniqueidentifier,
        MERCHANDISEDEPARTMENTID uniqueidentifier,
        TYPECODE tinyint
    )

    --This Period Sales Order Discount Refunds

    declare @THISPERIODORDERDISCOUNTREFUNDS table (
        TOTAL money,
        PROGRAMID uniqueidentifier,
        MERCHANDISEDEPARTMENTID uniqueidentifier,
        TYPECODE tinyint
    )

    if @ITEMTYPECODE in(0,14) or @ITEMTYPECODE is null begin
        insert into @THISPERIODORDERDISCOUNTS
        select
            sum(SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT),
            SALESORDERITEMTICKET.PROGRAMID,
            SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID,
            case
                when SALESORDERITEMTICKET.PROGRAMID is not null then
                    0
                else
                    1
            end
        from
            dbo.SALESORDERITEMORDERDISCOUNTDETAIL
        inner join
            dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID
        inner join
            dbo.UFN_SALESORDER_BETWEENDATES(@THISFROMDATE, @THISTODATE) as FILTEREDSALESORDERS on FILTEREDSALESORDERS.ID = SALESORDERITEM.SALESORDERID
        inner join
            dbo.SALESORDER on SALESORDER.ID = SALESORDERITEM.SALESORDERID
        left outer join
            dbo.SALESORDERITEMTICKET on SALESORDERITEMTICKET.ID = SALESORDERITEM.ID
        left outer join
            dbo.SALESORDERITEMMERCHANDISE on SALESORDERITEMMERCHANDISE.ID = SALESORDERITEM.ID
        where
            (SALESORDER.SALESMETHODTYPECODE = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null)
            and SALESORDER.STATUSCODE = 1
            and (@ITEMTYPECODE is null or SALESORDERITEM.TYPECODE = @ITEMTYPECODE)
        group by
            SALESORDERITEMTICKET.PROGRAMID, SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID
        option (recompile);

        insert into @THISPERIODORDERDISCOUNTREFUNDS
        select
            -sum(SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT),
            SALESORDERITEMTICKET.PROGRAMID,
            SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID,
            case
                when SALESORDERITEMTICKET.PROGRAMID is not null then
                    0
                else
                    1
            end
        from
            dbo.FINANCIALTRANSACTION as FT
        inner join
            dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
        inner join
            dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
        inner join
            dbo.SALESORDERITEMORDERDISCOUNTDETAIL on SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID = EXT.SALESORDERITEMID
        inner join
            dbo.SALESORDERITEM on SALESORDERITEM.ID = EXT.SALESORDERITEMID
        inner join
            dbo.SALESORDER on SALESORDER.ID = SALESORDERITEM.SALESORDERID
        left outer join
            dbo.SALESORDERITEMTICKET on SALESORDERITEMTICKET.ID = EXT.SALESORDERITEMID
        left outer join
            dbo.SALESORDERITEMMERCHANDISE on SALESORDERITEMMERCHANDISE.ID = EXT.SALESORDERITEMID
        where
            (SALESORDER.SALESMETHODTYPECODE = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null)
            and FT.CALCULATEDDATE between @THISFROMDATE and @THISTODATE
            and FT.TYPECODE = 23  -- Refund

            and SALESORDER.STATUSCODE = 1
            and (@ITEMTYPECODE is null or SALESORDERITEM.TYPECODE = @ITEMTYPECODE)
        group by
            SALESORDERITEMTICKET.PROGRAMID, SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID
        option (recompile);
    end

    --Last Period Sales Program Totals

    declare @LASTPERIODSALESORDERTOTALS table (
        TOTAL money,
        QUANTITY decimal(20,0),
        PROGRAMID uniqueidentifier,
        MEMBERSHIPPROGRAMID uniqueidentifier,
        DESIGNATIONID uniqueidentifier,
        REGISTRANTEVENTID uniqueidentifier,
        RESOURCEID uniqueidentifier,
        VOLUNTEERTYPEID uniqueidentifier,
        ITEMDISCOUNTS money,
        LOCATIONID uniqueidentifier,
        MERCHANDISEDEPARTMENTID uniqueidentifier,
        ADDONID uniqueidentifier
    )

    insert into @LASTPERIODSALESORDERTOTALS
    select 
        sum([SALESORDERITEM].[TOTAL]) - case [SALESORDERITEM].[TYPECODE]
                                            when 1 then
                                                sum(SALESORDERITEMMEMBERSHIPITEMPROMOTIONS.AMOUNT)
                                            else
                                                sum(SALESORDERITEMITEMDISCOUNTS.AMOUNT)
                                        end,
        case [SALESORDERITEM].[TYPECODE]
            when 6 then count(distinct [REGISTRANT].[ID])
            else sum([SALESORDERITEM].[QUANTITY])
        end,
        coalesce([SALESORDERITEMTICKET].[PROGRAMID], [EVENT].[PROGRAMID]) as [PROGRAMID],
        [SALESORDERITEMMEMBERSHIP].[MEMBERSHIPPROGRAMID],
        [SALESORDERITEMDONATION].[DESIGNATIONID],
        [REGISTRANT].[EVENTID] as [REGISTRANTEVENTID],
        coalesce(ITINERARYRESOURCE.RESOURCEID, ITINERARYITEMRESOURCE.RESOURCEID) as [RESOURCEID],
        coalesce(ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID, ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID) as [VOLUNTEERTYPEID],
        case [SALESORDERITEM].[TYPECODE]
            when 1 then
                sum(SALESORDERITEMMEMBERSHIPITEMPROMOTIONS.AMOUNT)
            else
                sum(SALESORDERITEMITEMDISCOUNTS.AMOUNT)
        end as [ITEMDISCOUNTS],
        [SALESORDERITEMFACILITY].[EVENTLOCATIONID] as [LOCATIONID],
        [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID] as [MERCHANDISEDEPARTMENTID],
        SALESORDERITEMMEMBERSHIPADDON.ADDONID as ADDONID
    from
        dbo.UFN_SALESORDER_BETWEENDATES(@LASTFROMDATE, @LASTTODATE) as FILTEREDSALESORDERS
    inner join
        dbo.SALESORDER on SALESORDER.ID = FILTEREDSALESORDERS.ID
    inner join dbo.[SALESORDERITEM]
        on [SALESORDER].[ID] = [SALESORDERITEM].[SALESORDERID]
    left join dbo.[SALESORDERITEMTICKET]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMTICKET].[ID]
    left join dbo.[EVENT]
        on [SALESORDERITEMTICKET].[EVENTID] = [EVENT].[ID]
    left join dbo.[SALESORDERITEMMEMBERSHIP]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMMEMBERSHIP].[ID]
    left join dbo.[SALESORDERITEMDONATION]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMDONATION].[ID]
    left join dbo.[SALESORDERITEMEVENTREGISTRATION]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]

    left join dbo.[SALESORDERITEMITINERARYRESOURCE]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYRESOURCE].[SALESORDERITEMID]
    left join dbo.[ITINERARYRESOURCE]
         on [SALESORDERITEMITINERARYRESOURCE].[ITINERARYRESOURCEID] = [ITINERARYRESOURCE].[ID]

    left join dbo.[SALESORDERITEMITINERARYITEMRESOURCE]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYITEMRESOURCE].[SALESORDERITEMID]
    left join dbo.[ITINERARYITEMRESOURCE]
         on [SALESORDERITEMITINERARYITEMRESOURCE].[ITINERARYITEMRESOURCEID] = [ITINERARYITEMRESOURCE].[ID]

    left join dbo.[SALESORDERITEMITINERARYSTAFFRESOURCE]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYSTAFFRESOURCE].[SALESORDERITEMID]
    left join dbo.[ITINERARYSTAFFRESOURCE]
         on [SALESORDERITEMITINERARYSTAFFRESOURCE].[ITINERARYSTAFFRESOURCEID] = [ITINERARYSTAFFRESOURCE].[ID]

    left join dbo.[SALESORDERITEMITINERARYITEMSTAFFRESOURCE]
         on [SALESORDERITEM].[ID] = [SALESORDERITEMITINERARYITEMSTAFFRESOURCE].[SALESORDERITEMID]
    left join dbo.[ITINERARYITEMSTAFFRESOURCE]
         on [SALESORDERITEMITINERARYITEMSTAFFRESOURCE].[ITINERARYITEMSTAFFRESOURCEID] = [ITINERARYITEMSTAFFRESOURCE].[ID]

    left join dbo.[REGISTRANT]
        on [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANT].[ID]

    left join dbo.[SALESORDERITEMFACILITY]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMFACILITY].[ID]

    left join dbo.[SALESORDERITEMMERCHANDISE]
        on [SALESORDERITEM].[ID] = [SALESORDERITEMMERCHANDISE].[ID]

    left join dbo.SALESORDERITEMMEMBERSHIPADDON
        on SALESORDERITEM.ID = SALESORDERITEMMEMBERSHIPADDON.ID

    outer apply (
        select isnull(sum(SALESORDERITEMITEMDISCOUNT.AMOUNT), 0) as AMOUNT
        from dbo.SALESORDERITEMITEMDISCOUNT
        where SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID = SALESORDERITEM.ID
    ) as SALESORDERITEMITEMDISCOUNTS

    outer apply (
        select isnull(sum(SALESORDERITEMMEMBERSHIPITEMPROMOTION.AMOUNT), 0) as AMOUNT
        from dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
        where SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID = SALESORDERITEM.ID
    ) as SALESORDERITEMMEMBERSHIPITEMPROMOTIONS

    where
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        [SALESORDER].[STATUSCODE] = 1 and 
        (
            (
                [SALESORDERITEM].[TYPECODE] = @ITEMTYPECODE or
                ([SALESORDERITEM].[TYPECODE] = 9 and @ITEMTYPECODE = 8) or 
                ([SALESORDERITEM].[TYPECODE] = 11 and @ITEMTYPECODE = 10) or 
                @ITEMTYPECODE is null
            ) and 
            [SALESORDERITEM].[TYPECODE] in (0,1,2,6,7,8,9,10,11,14,16)
        )
    group by 
        [SALESORDERITEM].[TYPECODE],
        coalesce([SALESORDERITEMTICKET].[PROGRAMID], [EVENT].[PROGRAMID]),
        [SALESORDERITEMMEMBERSHIP].[MEMBERSHIPPROGRAMID],
        [SALESORDERITEMDONATION].[DESIGNATIONID],
        coalesce(ITINERARYRESOURCE.RESOURCEID, ITINERARYITEMRESOURCE.RESOURCEID),
        coalesce(ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID, ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID),
        [REGISTRANT].[EVENTID],
        [REGISTRANT].[ID],
        [SALESORDERITEMFACILITY].[EVENTLOCATIONID],
        [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID],
        SALESORDERITEMMEMBERSHIPADDON.ADDONID
    option (recompile);

    --Last Period Sales Order Discounts

    declare @LASTPERIODORDERDISCOUNTS table (
        TOTAL money,
        PROGRAMID uniqueidentifier,
        MERCHANDISEDEPARTMENTID uniqueidentifier,
        TYPECODE tinyint
    )

    --Last Period Sales Order Discount Refunds

    declare @LASTPERIODORDERDISCOUNTREFUNDS table (
        TOTAL money,
        PROGRAMID uniqueidentifier,
        MERCHANDISEDEPARTMENTID uniqueidentifier,
        TYPECODE tinyint
    )

    if @ITEMTYPECODE in(0,14) or @ITEMTYPECODE is null begin    
        insert into @LASTPERIODORDERDISCOUNTS
        select
            sum(SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT),
            SALESORDERITEMTICKET.PROGRAMID,
            SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID,
            case
                when SALESORDERITEMTICKET.PROGRAMID is not null then
                    0
                else
                    1
            end
        from
            dbo.SALESORDERITEMORDERDISCOUNTDETAIL
        inner join
            dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID
        inner join
            dbo.UFN_SALESORDER_BETWEENDATES(@LASTFROMDATE, @LASTTODATE) as FILTEREDSALESORDERS on FILTEREDSALESORDERS.ID = SALESORDERITEM.SALESORDERID
        inner join
            dbo.SALESORDER on SALESORDER.ID = SALESORDERITEM.SALESORDERID
        left outer join
            dbo.SALESORDERITEMTICKET on SALESORDERITEMTICKET.ID = SALESORDERITEM.ID
        left outer join
            dbo.SALESORDERITEMMERCHANDISE on SALESORDERITEMMERCHANDISE.ID = SALESORDERITEM.ID
        where
            (SALESORDER.SALESMETHODTYPECODE = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null)
            and SALESORDER.STATUSCODE = 1
            and (@ITEMTYPECODE is null or SALESORDERITEM.TYPECODE = @ITEMTYPECODE)
        group by
            SALESORDERITEMTICKET.PROGRAMID, SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID
        option (recompile);

        insert into @LASTPERIODORDERDISCOUNTREFUNDS
        select
            -sum(SALESORDERITEMORDERDISCOUNTDETAIL.AMOUNT),
            SALESORDERITEMTICKET.PROGRAMID,
            SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID,
            case
                when SALESORDERITEMTICKET.PROGRAMID is not null then
                    0
                else
                    1
            end
        from
            dbo.FINANCIALTRANSACTION as FT
        inner join
            dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
        inner join
            dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
        inner join
            dbo.SALESORDERITEMORDERDISCOUNTDETAIL on SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID = EXT.SALESORDERITEMID
        inner join
            dbo.SALESORDERITEM on SALESORDERITEM.ID = EXT.SALESORDERITEMID
        inner join
            dbo.SALESORDER on SALESORDER.ID = SALESORDERITEM.SALESORDERID
        left outer join
            dbo.SALESORDERITEMTICKET on SALESORDERITEMTICKET.ID = EXT.SALESORDERITEMID
        left outer join
            dbo.SALESORDERITEMMERCHANDISE on SALESORDERITEMMERCHANDISE.ID = EXT.SALESORDERITEMID
        where
            (SALESORDER.SALESMETHODTYPECODE = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null)
            and FT.CALCULATEDDATE between @LASTFROMDATE and @LASTTODATE
            and FT.TYPECODE = 23  -- Refund

            and SALESORDER.STATUSCODE = 1
            and (@ITEMTYPECODE is null or SALESORDERITEM.TYPECODE = @ITEMTYPECODE)
        group by
            SALESORDERITEMTICKET.PROGRAMID, SALESORDERITEMMERCHANDISE.MERCHANDISEDEPARTMENTID
        option (recompile);                
    end

    --This Period Tickets

    select 
        0 as [SALESORDERITEMTYPE],
        [PROGRAM].[NAME] as [PROGRAMNAME],
        coalesce([PROGRAMCATEGORYCODE].[DESCRIPTION],'') as [PROGRAMCATEGORY],
        coalesce([THISPERIODSOT].[TOTAL],0) as [THISPERIODTOTAL],
        coalesce([THISPERIODSOT].[QUANTITY],0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as [THISPERIODSOT]
    inner join dbo.[PROGRAM]
        on [THISPERIODSOT].[PROGRAMID] = [PROGRAM].[ID]
    left join dbo.[PROGRAMCATEGORYCODE]
        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]

    --This Period Ticket Order Discounts

    union all
    select 
        0 as [SALESORDERITEMTYPE],
        [PROGRAM].[NAME] as [PROGRAMNAME],
        coalesce([PROGRAMCATEGORYCODE].[DESCRIPTION],'') as [PROGRAMCATEGORY],
        -[THISPERIODOD].[TOTAL] as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODORDERDISCOUNTS as [THISPERIODOD]
    inner join dbo.[PROGRAM]
        on [THISPERIODOD].[PROGRAMID] = [PROGRAM].[ID]
    left join dbo.[PROGRAMCATEGORYCODE]
        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
    where THISPERIODOD.TYPECODE = 0

    --This ticket refunds/exchanges

    union all
    select 
        0 as [SALESORDERITEMTYPE],
        [PROGRAM].[NAME] as [PROGRAMNAME],
        coalesce([PROGRAMCATEGORYCODE].[DESCRIPTION],'') as [PROGRAMCATEGORY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [THISPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    inner join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    inner join
        dbo.[SALESORDERITEMTICKET] on [SALESORDERITEMTICKET].[ID] = EXT.SALESORDERITEMID
    inner join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    inner join
        dbo.[PROGRAM] on [SALESORDERITEMTICKET].[PROGRAMID] = [PROGRAM].[ID]
    left join dbo.[PROGRAMCATEGORYCODE]
        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
    where
        (@ITEMTYPECODE = 0 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @THISFROMDATE and @THISTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [PROGRAM].[NAME],
        [PROGRAMCATEGORYCODE].[DESCRIPTION]

    --This Period Ticket Order Discount Refunds

    union all
    select 
        0 as [SALESORDERITEMTYPE],
        [PROGRAM].[NAME] as [PROGRAMNAME],
        coalesce([PROGRAMCATEGORYCODE].[DESCRIPTION],'') as [PROGRAMCATEGORY],
        -[THISPERIODODR].[TOTAL] as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODORDERDISCOUNTREFUNDS as [THISPERIODODR]
    inner join dbo.[PROGRAM]
        on [THISPERIODODR].[PROGRAMID] = [PROGRAM].[ID]
    left join dbo.[PROGRAMCATEGORYCODE]
        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
    where THISPERIODODR.TYPECODE = 0                    

    --Last Period Tickets

    union all
    select 
        0 as [SALESORDERITEMTYPE],
        [PROGRAM].[NAME] as [PROGRAMNAME],
        coalesce([PROGRAMCATEGORYCODE].[DESCRIPTION],'') as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        coalesce([LASTPERIODSOT].[TOTAL],0) as [LASTPERIODTOTAL],
        coalesce([LASTPERIODSOT].[QUANTITY],0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODSALESORDERTOTALS as [LASTPERIODSOT]
    inner join dbo.[PROGRAM]
        on     [LASTPERIODSOT].[PROGRAMID] = [PROGRAM].[ID]
    left join dbo.[PROGRAMCATEGORYCODE]
        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]

    --Last Period Ticket Order Discounts

    union all
    select 
        0 as [SALESORDERITEMTYPE],
        [PROGRAM].[NAME] as [PROGRAMNAME],
        coalesce([PROGRAMCATEGORYCODE].[DESCRIPTION],'') as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -[LASTPERIODOD].[TOTAL] as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODORDERDISCOUNTS as [LASTPERIODOD]
    inner join dbo.[PROGRAM]
        on [LASTPERIODOD].[PROGRAMID] = [PROGRAM].[ID]
    left join dbo.[PROGRAMCATEGORYCODE]
        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
    where LASTPERIODOD.TYPECODE = 0

    --Last Period Ticket Order Discount Refunds

    union all
    select 
        0 as [SALESORDERITEMTYPE],
        [PROGRAM].[NAME] as [PROGRAMNAME],
        coalesce([PROGRAMCATEGORYCODE].[DESCRIPTION],'') as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -[LASTPERIODODR].[TOTAL] as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODORDERDISCOUNTREFUNDS as [LASTPERIODODR]
    inner join dbo.[PROGRAM]
        on [LASTPERIODODR].[PROGRAMID] = [PROGRAM].[ID]
    left join dbo.[PROGRAMCATEGORYCODE]
        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
    where LASTPERIODODR.TYPECODE = 0

    --Last ticket refunds/exchanges

    union all
    select 
        0 as [SALESORDERITEMTYPE],
        [PROGRAM].[NAME] as [PROGRAMNAME],
        coalesce([PROGRAMCATEGORYCODE].[DESCRIPTION],'') as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [LASTPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    inner join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    inner join
        dbo.[SALESORDERITEMTICKET] on [SALESORDERITEMTICKET].[ID] = EXT.SALESORDERITEMID
    inner join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    inner join dbo.[PROGRAM]
        on [SALESORDERITEMTICKET].[PROGRAMID] = [PROGRAM].[ID]
    left join dbo.[PROGRAMCATEGORYCODE]
        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
    where
        (@ITEMTYPECODE = 0 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @LASTFROMDATE and @LASTTODATE and
        FT.TYPECODE = 23  -- Refunds

    group by
        [PROGRAM].[NAME],
        [PROGRAMCATEGORYCODE].[DESCRIPTION]

    --This Period Event Registrations

    union all
    select
        1 as [SALESORDERITEMTYPE],
        [EVENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        coalesce([THISPERIODSOT].[TOTAL],0) as [THISPERIODTOTAL],
        coalesce([THISPERIODSOT].[QUANTITY],0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as [THISPERIODSOT]
    inner join dbo.[EVENT]
        on [THISPERIODSOT].[REGISTRANTEVENTID] = [EVENT].[ID]

    --This Period Event Registration refunds/exchanges

    union all
    select 
        1 as [SALESORDERITEMTYPE],
        [REFUNDS].[PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        -sum([REFUNDS].[THISPERIODTOTAL]) [THISPERIODTOTAL],
        -sum([REFUNDS].[REFUNDED]) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from (
        select
            [REGISTRANTREFUNDS].[PROGRAMNAME],
            sum([REGISTRANTREFUNDS].[THISPERIODTOTAL]) as [THISPERIODTOTAL],

            --When the amount in sales refunds for this registration (summing refunds prior to the last refund

            --by the currently selected sales method) is greater than or equal to the amount in sales payments (summing payments

            --prior to the end date selected in the filter), then the registration is considered refunded.

            case when
                    select
                        coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0)
                    from
                        dbo.FINANCIALTRANSACTION as FT
                    inner join
                        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
                    inner join
                        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
                    inner join
                        dbo.[CREDITITEMEVENTREGISTRATION] on [CREDITITEMEVENTREGISTRATION].[ID] = LI.ID
                    where 
                        FT.TYPECODE = 23  -- Refund

                        and FT.CALCULATEDDATE <= [REGISTRANTREFUNDS].[LASTREFUNDDATE]
                        and [CREDITITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANTREFUNDS].[REGISTRANTID]
                ) >= (
                    select
                        coalesce(sum([SALESORDERITEM].[TOTAL]),0)
                    from
                        dbo.UFN_SALESORDER_BETWEENDATES(null, @THISTODATE) as FILTEREDSALESORDERS
                    inner join
                        dbo.SALESORDER on SALESORDER.ID = FILTEREDSALESORDERS.ID
                    inner join
                        dbo.[SALESORDERITEM] on [SALESORDER].[ID] = [SALESORDERITEM].[SALESORDERID]
                    inner join
                        dbo.[SALESORDERITEMEVENTREGISTRATION] on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
                    where 
                        [SALESORDER].[STATUSCODE] = 1 and
                        [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANTREFUNDS].[REGISTRANTID]
                ) then 1
                else 0
            end as [REFUNDED]
        from (
            select 
                [EVENT].[NAME] as [PROGRAMNAME],
                coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [THISPERIODTOTAL],
                [REGISTRANT].[ID] as [REGISTRANTID],
                cast(max(FT.DATE) as datetime) as [LASTREFUNDDATE]
            from
                dbo.FINANCIALTRANSACTION as FT
            inner join
                dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
            inner join
                dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
            inner join
                dbo.[CREDITITEMEVENTREGISTRATION] on [CREDITITEMEVENTREGISTRATION].[ID] = LI.ID
            inner join
                dbo.[REGISTRANT] on [CREDITITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANT].[ID]
            inner join
                dbo.[EVENT] on [REGISTRANT].[EVENTID] = [EVENT].[ID]
            left join
                dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
            left join dbo.[SALESORDER]
                on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
            where
                (@ITEMTYPECODE = 6 or @ITEMTYPECODE is null) and
                ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
                FT.CALCULATEDDATE between @THISFROMDATE and @THISTODATE and
                FT.TYPECODE = 23  -- Refund

            group by
                [EVENT].[NAME],
                [REGISTRANT].[ID]
        ) as [REGISTRANTREFUNDS]
        group by 
            [REGISTRANTREFUNDS].[REGISTRANTID],
            [REGISTRANTREFUNDS].[PROGRAMNAME],
            [REGISTRANTREFUNDS].[LASTREFUNDDATE]
    ) as [REFUNDS]
    group by [REFUNDS].[PROGRAMNAME]

    --Last Period Event Registrations

    union all
    select
        1 as [SALESORDERITEMTYPE],
        [EVENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        coalesce([LASTPERIODSOT].[TOTAL],0) as [LASTPERIODTOTAL],
        coalesce([LASTPERIODSOT].[QUANTITY],0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODSALESORDERTOTALS as [LASTPERIODSOT]
    inner join dbo.[EVENT]
        on [LASTPERIODSOT].[REGISTRANTEVENTID] = [EVENT].[ID]

    --Last Period Event Registration refunds/exchanges

    union all
    select 
        1 as [SALESORDERITEMTYPE],
        [REFUNDS].[PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -sum([REFUNDS].[THISPERIODTOTAL]) as [LASTPERIODTOTAL],
        -sum([REFUNDS].[REFUNDED]) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from (
        select
            [REGISTRANTREFUNDS].[PROGRAMNAME],
            sum([REGISTRANTREFUNDS].[THISPERIODTOTAL]) as [THISPERIODTOTAL],

            --When the amount in sales refunds for this registration (summing refunds prior to the last refund

            --by the currently selected sales method) is greater than or equal to the amount in sales payments (summing payments

            --prior to the end date selected in the filter), then the registration is considered refunded.

            case when
                    select
                        coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0)
                    from
                        dbo.FINANCIALTRANSACTION as FT
                    inner join
                        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
                    inner join
                        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
                    inner join
                        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
                    inner join
                        dbo.[CREDITITEMEVENTREGISTRATION] on [CREDITITEMEVENTREGISTRATION].[ID] = LI.ID
                    where 
                        FT.TYPECODE = 23  -- Refund

                        and FT.CALCULATEDDATE <= [REGISTRANTREFUNDS].[LASTREFUNDDATE]
                        and [CREDITITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANTREFUNDS].[REGISTRANTID]
                ) >= (
                    select
                        coalesce(sum([SALESORDERITEM].[TOTAL]),0)
                    from
                        dbo.UFN_SALESORDER_BETWEENDATES(null, @LASTTODATE) as FILTEREDSALESORDERS
                    inner join
                        dbo.[SALESORDER] on SALESORDER.ID = FILTEREDSALESORDERS.ID
                    inner join
                        dbo.[SALESORDERITEM] on [SALESORDER].[ID] = [SALESORDERITEM].[SALESORDERID]
                    inner join
                        dbo.[SALESORDERITEMEVENTREGISTRATION] on [SALESORDERITEM].[ID] = [SALESORDERITEMEVENTREGISTRATION].[ID]
                    where 
                        [SALESORDER].[STATUSCODE] = 1 and
                        [SALESORDERITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANTREFUNDS].[REGISTRANTID]
                ) then 1
                else 0
            end as [REFUNDED]
        from (
            select 
                [EVENT].[NAME] as [PROGRAMNAME],
                coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [THISPERIODTOTAL],
                [REGISTRANT].[ID] as [REGISTRANTID],
                cast(max(FT.DATE) as datetime) as [LASTREFUNDDATE]
            from
                dbo.FINANCIALTRANSACTION as FT
            inner join
                dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
            inner join
                dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
            inner join
                dbo.[CREDITITEMEVENTREGISTRATION] on [CREDITITEMEVENTREGISTRATION].[ID] = LI.ID
            inner join
                dbo.[REGISTRANT] on [CREDITITEMEVENTREGISTRATION].[REGISTRANTID] = [REGISTRANT].[ID]
            inner join
                dbo.[EVENT] on [REGISTRANT].[EVENTID] = [EVENT].[ID]
            left join
                dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
            left join
                dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
            where
                (@ITEMTYPECODE = 6 or @ITEMTYPECODE is null) and
                ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
                FT.CALCULATEDDATE between @LASTFROMDATE and @LASTTODATE and
                FT.TYPECODE = 23  -- REfund

            group by
                [EVENT].[NAME],
                [REGISTRANT].[ID]
        ) as [REGISTRANTREFUNDS]
        group by 
            [REGISTRANTREFUNDS].[REGISTRANTID],
            [REGISTRANTREFUNDS].[PROGRAMNAME],
            [REGISTRANTREFUNDS].[LASTREFUNDDATE]
    ) as [REFUNDS]
    group by [REFUNDS].[PROGRAMNAME]

    --This Period Memberships

    union all
    select
        2 as [SALESORDERITEMTYPE],
        [MEMBERSHIPPROGRAM].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        coalesce([THISPERIODSOT].[TOTAL],0) as [THISPERIODTOTAL],
        coalesce([THISPERIODSOT].[QUANTITY],0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as [THISPERIODSOT]
    inner join dbo.[MEMBERSHIPPROGRAM]
        on [THISPERIODSOT].[MEMBERSHIPPROGRAMID] = [MEMBERSHIPPROGRAM].[ID]

    --This period membership add-ons

    union all
    select
        16 as SALESORDERITEMTYPE,
        ADDON.NAME as PROGRAMNAME,
        '' as PROGRAMCATEGORY,
        coalesce(THISPERIODSOT.TOTAL,0) as THISPERIODTOTAL,
        coalesce(THISPERIODSOT.QUANTITY,0) as THISPERIODQUANTITY,
        0 as LASTPERIODTOTAL,
        0 as LASTPERIODQUANTITY,
        null as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as THISPERIODSOT
    inner join dbo.ADDON
        on ADDON.ID = THISPERIODSOT.ADDONID

    --This Period Membership refunds/exchanges

    union all
    select 
        2 as [SALESORDERITEMTYPE],
        [MEMBERSHIPPROGRAM].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [THISPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    inner join
        dbo.[CREDITITEMMEMBERSHIP] on [CREDITITEMMEMBERSHIP].[ID] = LI.ID
    left join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    left join
        dbo.[SALESORDERITEMMEMBERSHIP] on [SALESORDERITEM].[ID] = [SALESORDERITEMMEMBERSHIP].[ID]
    left join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    inner join
        dbo.[MEMBERSHIPPROGRAM] on [CREDITITEMMEMBERSHIP].[MEMBERSHIPPROGRAMID] = [MEMBERSHIPPROGRAM].[ID]
    where
        (@ITEMTYPECODE = 1 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @THISFROMDATE and @THISTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [MEMBERSHIPPROGRAM].[NAME]

    --This Period Membership add-ons refunds/exchanges

    union all
    select 
        16 as [SALESORDERITEMTYPE],
        [ADDON].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [THISPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],                    
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    inner join
        dbo.MEMBERSHIPADDON on MEMBERSHIPADDON.REVENUESPLITID = LI.SOURCELINEITEMID
    inner join
        dbo.ADDON on ADDON.ID = MEMBERSHIPADDON.ADDONID
    left join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    left join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    where
        (@ITEMTYPECODE = 16 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @THISFROMDATE and @THISTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [ADDON].[NAME]                    

    --Last Period Memberships

    union all
    select
        2 as [SALESORDERITEMTYPE],
        [MEMBERSHIPPROGRAM].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        coalesce([LASTPERIODSOT].[TOTAL],0) as [LASTPERIODTOTAL],
        coalesce([LASTPERIODSOT].[QUANTITY],0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODSALESORDERTOTALS as [LASTPERIODSOT]
    inner join dbo.[MEMBERSHIPPROGRAM]
        on [LASTPERIODSOT].[MEMBERSHIPPROGRAMID] = [MEMBERSHIPPROGRAM].[ID]

    --Last period membership add-ons

    union all
    select
        16 as SALESORDERITEMTYPE,
        ADDON.NAME as PROGRAMNAME,
        '' as PROGRAMCATEGORY,
        0 as THISPERIODTOTAL,
        0 as THISPERIODQUANTITY,
        coalesce(LASTPERIODSOT.TOTAL,0) as LASTPERIODTOTAL,
        coalesce(LASTPERIODSOT.QUANTITY,0) as LASTPERIODQUANTITY,
        null as RESOURCECATEGORY
    from @LASTPERIODSALESORDERTOTALS as LASTPERIODSOT
    inner join dbo.ADDON
        on ADDON.ID = LASTPERIODSOT.ADDONID

    --Last Period Membership refunds/exchanges

    union all
    select 
        2 as [SALESORDERITEMTYPE],
        [MEMBERSHIPPROGRAM].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [LASTPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    inner join
        dbo.[CREDITITEMMEMBERSHIP] on [CREDITITEMMEMBERSHIP].[ID] = LI.ID
    left join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    left join
        dbo.[SALESORDERITEMMEMBERSHIP] on [SALESORDERITEM].[ID] = [SALESORDERITEMMEMBERSHIP].[ID]
    left join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    inner join
        dbo.[MEMBERSHIPPROGRAM] on [CREDITITEMMEMBERSHIP].[MEMBERSHIPPROGRAMID] = [MEMBERSHIPPROGRAM].[ID]
    where
        (@ITEMTYPECODE = 1 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @LASTFROMDATE and @LASTTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [MEMBERSHIPPROGRAM].[NAME]

    --Last Period Membership add-ons refunds/exchanges

    union all
    select 
        16 as [SALESORDERITEMTYPE],
        [ADDON].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [LASTPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    inner join
        dbo.MEMBERSHIPADDON on MEMBERSHIPADDON.REVENUESPLITID = LI.SOURCELINEITEMID
    inner join
        dbo.ADDON on ADDON.ID = MEMBERSHIPADDON.ADDONID
    left join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    left join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    where
        (@ITEMTYPECODE = 16 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @LASTFROMDATE and @LASTTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [ADDON].[NAME]

    --This Period Resources (for the purposes of this report, combine itinerary and itinerary item resources)

    union all
    select
        8 as [SALESORDERITEMTYPE],
        RESOURCE.NAME as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        coalesce([THISPERIODSOT].[TOTAL],0) as [THISPERIODTOTAL],
        coalesce([THISPERIODSOT].[QUANTITY],0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        RESOURCECATEGORYCODE.DESCRIPTION as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as [THISPERIODSOT]
        inner join dbo.RESOURCE on [THISPERIODSOT].RESOURCEID = RESOURCE.ID
        left join RESOURCECATEGORYCODE on RESOURCE.RESOURCECATEGORYCODEID = RESOURCECATEGORYCODE.ID

    --Last Period Resources (for the purposes of this report, combine itinerary and itinerary item resources)

    union all
    select
        8 as [SALESORDERITEMTYPE],
        RESOURCE.NAME as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        coalesce([LASTPERIODSOT].[TOTAL],0) as [LASTPERIODTOTAL],
        coalesce([LASTPERIODSOT].[QUANTITY],0) as [LASTPERIODQUANTITY],
        RESOURCECATEGORYCODE.DESCRIPTION as RESOURCECATEGORY
    from @LASTPERIODSALESORDERTOTALS as [LASTPERIODSOT]
        inner join dbo.RESOURCE on [LASTPERIODSOT].RESOURCEID = RESOURCE.ID
        left join RESOURCECATEGORYCODE on RESOURCE.RESOURCECATEGORYCODEID = RESOURCECATEGORYCODE.ID

    --This Period Staffing Resources (for the purposes of this report, combine itinerary and itinerary item resources)

    union all
    select
        10 as [SALESORDERITEMTYPE],
        VOLUNTEERTYPE.NAME as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        coalesce([THISPERIODSOT].[TOTAL],0) as [THISPERIODTOTAL],
        coalesce([THISPERIODSOT].[QUANTITY],0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as [THISPERIODSOT]
        inner join dbo.VOLUNTEERTYPE on [THISPERIODSOT].VOLUNTEERTYPEID = VOLUNTEERTYPE.ID

    --Last Period Staffing Resources (for the purposes of this report, combine itinerary and itinerary item resources)

    union all
    select
        10 as [SALESORDERITEMTYPE],
        VOLUNTEERTYPE.NAME as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        coalesce([LASTPERIODSOT].[TOTAL],0) as [LASTPERIODTOTAL],
        coalesce([LASTPERIODSOT].[QUANTITY],0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODSALESORDERTOTALS as [LASTPERIODSOT]
        inner join dbo.VOLUNTEERTYPE on [LASTPERIODSOT].VOLUNTEERTYPEID = VOLUNTEERTYPE.ID

    --This Period Donations

    union all
    select
        3 as [SALESORDERITEMTYPE],
        [DESIGNATION].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        coalesce([THISPERIODSOT].[TOTAL],0) as [THISPERIODTOTAL],
        coalesce([THISPERIODSOT].[QUANTITY],0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as [THISPERIODSOT]
    inner join dbo.[DESIGNATION]
        on [THISPERIODSOT].[DESIGNATIONID] = [DESIGNATION].[ID]

    --This Period Donation Refunds

    union all
    select 
        3 as [SALESORDERITEMTYPE],
        [DESIGNATION].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [THISPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    inner join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    inner join
        dbo.[SALESORDERITEMDONATION] on [SALESORDERITEM].[ID] = [SALESORDERITEMDONATION].[ID]
    left join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    inner join
        dbo.[DESIGNATION] on [SALESORDERITEMDONATION].DESIGNATIONID = [DESIGNATION].ID
    where
        (@ITEMTYPECODE = 2 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @THISFROMDATE and @THISTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [DESIGNATION].[NAME]

    --Last Period Donations

    union all
    select
        3 as [SALESORDERITEMTYPE],
        [DESIGNATION].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        coalesce([LASTPERIODSOT].[TOTAL],0) as [LASTPERIODTOTAL],
        coalesce([LASTPERIODSOT].[QUANTITY],0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from  @LASTPERIODSALESORDERTOTALS as [LASTPERIODSOT]
    inner join dbo.[DESIGNATION]
        on [LASTPERIODSOT].[DESIGNATIONID] = [DESIGNATION].[ID]

    --Last Period Donation Refunds

    union all
    select 
        3 as [SALESORDERITEMTYPE],
        [DESIGNATION].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [LASTPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    inner join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    inner join
        dbo.[SALESORDERITEMDONATION] on [SALESORDERITEM].[ID] = [SALESORDERITEMDONATION].[ID]
    left join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    inner join
        dbo.[DESIGNATION] on [SALESORDERITEMDONATION].DESIGNATIONID = [DESIGNATION].ID
    where
        (@ITEMTYPECODE = 2 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @LASTFROMDATE and @LASTTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [DESIGNATION].[NAME]

    --This Period Facility Rentals

    union all
    select
        7 as [SALESORDERITEMTYPE],
        [EVENTLOCATION].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        coalesce([THISPERIODSOT].[TOTAL],0) as [THISPERIODTOTAL],
        coalesce([THISPERIODSOT].[QUANTITY],0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as [THISPERIODSOT]
    inner join dbo.[EVENTLOCATION]
        on [THISPERIODSOT].[LOCATIONID] = [EVENTLOCATION].[ID]

    --Last Period Facility Rentals

    union all
    select
        7 as [SALESORDERITEMTYPE],
        [EVENTLOCATION].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        coalesce([LASTPERIODSOT].[TOTAL],0) as [LASTPERIODTOTAL],
        coalesce([LASTPERIODSOT].[QUANTITY],0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from  @LASTPERIODSALESORDERTOTALS as [LASTPERIODSOT]
    inner join dbo.[EVENTLOCATION]
        on [LASTPERIODSOT].[LOCATIONID] = [EVENTLOCATION].[ID]

    union all
    -- This period merchandise sales

    select
        14 as [SALESORDERITEMTYPE],
        [MERCHANDISEDEPARTMENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        coalesce([THISPERIODSOT].[TOTAL],0) as [THISPERIODTOTAL],
        coalesce([THISPERIODSOT].[QUANTITY],0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODSALESORDERTOTALS as [THISPERIODSOT]
    inner join dbo.[MERCHANDISEDEPARTMENT] 
        on [MERCHANDISEDEPARTMENT].[ID] = [THISPERIODSOT].[MERCHANDISEDEPARTMENTID]

    --This Period Merchandise Order Discounts

    union all
    select 
        14 as [SALESORDERITEMTYPE],
        [MERCHANDISEDEPARTMENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        -[THISPERIODOD].[TOTAL] as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODORDERDISCOUNTS as [THISPERIODOD]
    inner join dbo.[MERCHANDISEDEPARTMENT]
        on [THISPERIODOD].[MERCHANDISEDEPARTMENTID] = [MERCHANDISEDEPARTMENT].[ID]
    where THISPERIODOD.TYPECODE = 1                    

    --This Period Merchandise Order Discount Refunds

    union all
    select 
        14 as [SALESORDERITEMTYPE],
        [MERCHANDISEDEPARTMENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        -[THISPERIODODR].[TOTAL] as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @THISPERIODORDERDISCOUNTREFUNDS as [THISPERIODODR]
    inner join dbo.[MERCHANDISEDEPARTMENT]
        on [THISPERIODODR].[MERCHANDISEDEPARTMENTID] = [MERCHANDISEDEPARTMENT].[ID]
    where THISPERIODODR.TYPECODE = 1                        

    union all
    -- This period merchandise refunds

    select 
        14 as [SALESORDERITEMTYPE],
        [MERCHANDISEDEPARTMENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [THISPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [THISPERIODQUANTITY],
        0 as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    left join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    left join
        dbo.[SALESORDERITEMMERCHANDISE] on [SALESORDERITEM].[ID] = [SALESORDERITEMMERCHANDISE].[ID]
    left join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    inner join
        dbo.[MERCHANDISEDEPARTMENT] on [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID] = [MERCHANDISEDEPARTMENT].[ID]
    where
        (@ITEMTYPECODE = 14 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @THISFROMDATE and @THISTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [MERCHANDISEDEPARTMENT].[NAME]

    union all
    -- Last period merchandise sales

    select
        14 as [SALESORDERITEMTYPE],
        [MERCHANDISEDEPARTMENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        coalesce([LASTPERIODSOT].[TOTAL],0) as [LASTPERIODTOTAL],
        coalesce([LASTPERIODSOT].[QUANTITY],0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODSALESORDERTOTALS as [LASTPERIODSOT]
    inner join dbo.[MERCHANDISEDEPARTMENT] 
        on [MERCHANDISEDEPARTMENT].[ID] = [LASTPERIODSOT].[MERCHANDISEDEPARTMENTID]

    --Last Period Merchandise Order Discounts

    union all
    select 
        14 as [SALESORDERITEMTYPE],
        [MERCHANDISEDEPARTMENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -[LASTPERIODOD].[TOTAL] as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODORDERDISCOUNTS as [LASTPERIODOD]
    inner join dbo.[MERCHANDISEDEPARTMENT]
        on [LASTPERIODOD].[MERCHANDISEDEPARTMENTID] = [MERCHANDISEDEPARTMENT].[ID]
    where LASTPERIODOD.TYPECODE = 1        

    --Last Period Merchandise Order Discount Refunds

    union all
    select 
        14 as [SALESORDERITEMTYPE],
        [MERCHANDISEDEPARTMENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -[LASTPERIODODR].[TOTAL] as [LASTPERIODTOTAL],
        0 as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from @LASTPERIODORDERDISCOUNTREFUNDS as [LASTPERIODODR]
    inner join dbo.[MERCHANDISEDEPARTMENT]
        on [LASTPERIODODR].[MERCHANDISEDEPARTMENTID] = [MERCHANDISEDEPARTMENT].[ID]
    where LASTPERIODODR.TYPECODE = 1        

    union all
    -- Last period merchandise refunds

    select 
        14 as [SALESORDERITEMTYPE],
        [MERCHANDISEDEPARTMENT].[NAME] as [PROGRAMNAME],
        '' as [PROGRAMCATEGORY],
        0 as [THISPERIODTOTAL],
        0 as [THISPERIODQUANTITY],
        -coalesce(sum((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS),0) as [LASTPERIODTOTAL],
        -coalesce(sum(LI.QUANTITY),0) as [LASTPERIODQUANTITY],
        null as RESOURCECATEGORY
    from
        dbo.FINANCIALTRANSACTION as FT
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEM as LI on LI.FINANCIALTRANSACTIONID = FT.ID
    inner join
        dbo.CREDITITEM_EXT as EXT on EXT.ID = LI.ID
    left join
        dbo.[SALESORDERITEM] on [SALESORDERITEM].[ID] = EXT.SALESORDERITEMID
    left join
        dbo.[SALESORDERITEMMERCHANDISE] on [SALESORDERITEM].[ID] = [SALESORDERITEMMERCHANDISE].[ID]
    left join
        dbo.[SALESORDER] on [SALESORDERITEM].[SALESORDERID] = [SALESORDER].[ID]
    inner join
        dbo.[MERCHANDISEDEPARTMENT] on [SALESORDERITEMMERCHANDISE].[MERCHANDISEDEPARTMENTID] = [MERCHANDISEDEPARTMENT].[ID]
    where
        (@ITEMTYPECODE = 14 or @ITEMTYPECODE is null) and
        ([SALESORDER].[SALESMETHODTYPECODE] = @SALESMETHODTYPECODE or @SALESMETHODTYPECODE is null) and
        FT.CALCULATEDDATE between @LASTFROMDATE and @LASTTODATE and
        FT.TYPECODE = 23  -- Refund

    group by
        [MERCHANDISEDEPARTMENT].[NAME]

    order by
        [SALESORDERITEMTYPE] ASC,
        [PROGRAMCATEGORY] ASC,
        [RESOURCECATEGORY] ASC,
        [PROGRAMNAME] ASC
    option (recompile);

    return 0;