USP_REPORT_DASHBOARD_SALES_BYDATE

Parameters

Parameter Parameter Type Mode Description
@STARTDATE datetime IN
@ENDDATE datetime IN
@ALLDATES bit IN

Definition

Copy

create procedure dbo.USP_REPORT_DASHBOARD_SALES_BYDATE
(
    @STARTDATE datetime = null,
    @ENDDATE datetime = null,
    @ALLDATES bit
)
as
    set nocount on;

    declare @MINDATE datetime                
    declare @SALESDATETABLE table (
        TransactionDate date,
        TotalSales money
    )

    -- Checking TRANSACTIONDATE for null so that the index will perform a seek.

    -- Removed check for STATUSCODE since the earliest TRANSACTIONDATE should be a complete order

    -- and including STATUSCODE would require a key lookup.

    select @MINDATE = min(SALESORDER.TRANSACTIONDATE) from dbo.SALESORDER where SALESORDER.TRANSACTIONDATE is not null;

    set @MINDATE = coalesce(@MINDATE, getdate())

    if @ALLDATES = 1 begin                                
        set @STARTDATE = @MINDATE
        set @ENDDATE = getdate()
    end

    set @STARTDATE = coalesce(@STARTDATE, @MINDATE)
    set @ENDDATE = coalesce(@ENDDATE, getdate())

    if @STARTDATE > @ENDDATE
        set @STARTDATE = @ENDDATE                            

    set @STARTDATE = cast(@STARTDATE as date)
    set @ENDDATE = dbo.UFN_DATE_GETLATESTTIME(@ENDDATE)

    insert into @SALESDATETABLE 
    select
        DATES.[DATE] as TransactionDate,
        0 TotalSales
    from
        dbo.UFN_CALENDARDATES(@STARTDATE, @ENDDATE, 1) DATES

    update @SALESDATETABLE set
        TotalSales = SALES.Amount
    from 
        @SALESDATETABLE SALESDATETABLE
    inner join (
        --total sales                

        select 
            cast(SALES.TRANSACTIONDATE as date) as TransactionDate,
            sum(SALES.AMOUNT) - sum(coalesce(SALESORDERITEMITEMDISCOUNT.AMOUNT, 0)) as Amount
        from (
            select 
                SALESORDER.TRANSACTIONDATE,
                case
                    when SALESORDERITEM.TYPECODE = 5 then
                        -SALESORDERITEM.TOTAL
                    else
                        SALESORDERITEM.TOTAL 
                end as AMOUNT,
                SALESORDERITEM.ID
            from
                dbo.SALESORDER
            inner join
                dbo.SALESORDERITEM on SALESORDER.ID = SALESORDERITEM.SALESORDERID
            where
                SALESORDER.TRANSACTIONDATE between @STARTDATE and @ENDDATE and
                SALESORDERITEM.TYPECODE <> 4 and  -- Tax

                SALESORDER.STATUSCODE = 1  -- Complete

        ) as SALES
        left outer join
            dbo.SALESORDERITEMITEMDISCOUNT on SALES.ID = SALESORDERITEMITEMDISCOUNT.SALESORDERITEMID                                    
        group by
            cast(SALES.TRANSACTIONDATE as date)
    ) as SALES on SALESDATETABLE.TransactionDate = SALES.TransactionDate;

    --total refunds

    update @SALESDATETABLE set
        TotalSales = TotalSales - REFUND.Amount
    from 
        @SALESDATETABLE SALESDATETABLE
    inner join (
        select
            REFUND.TRANSACTIONDATE as TransactionDate, 
            sum(REFUND.AMOUNT) as Amount
        from (
            select
                FT.CALCULATEDDATE as TransactionDate,
                ((LI.QUANTITY * LI.UNITVALUE) - EXT.DISCOUNTS) as AMOUNT                            
            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
            where
                FT.CALCULATEDDATE between @STARTDATE and @ENDDATE and
                EXT.TYPECODE <> 4  -- Tax

                and FT.TYPECODE = 23  -- Refund

        ) as REFUND
        group by
            REFUND.TRANSACTIONDATE
    ) as REFUND on SALESDATETABLE.TransactionDate = REFUND.TransactionDate

    select 
        TransactionDate, 
        TotalSales Amount
    from @SALESDATETABLE
    order by            
        TransactionDate

    return 0;