USP_DATALIST_PAYMENT_BYSALESMETHOD

View payments by sales method trends over time.

Parameters

Parameter Parameter Type Mode Description
@DATETYPE tinyint IN Revenue for
@FROMDATE datetime IN From
@TODATE datetime IN To
@METHOD1NAME nvarchar(25) INOUT Source
@METHOD2NAME nvarchar(25) INOUT Source
@METHOD3NAME nvarchar(25) INOUT Source
@METHOD4NAME nvarchar(25) INOUT Source
@METHOD5NAME nvarchar(25) INOUT Source

Definition

Copy


CREATE procedure dbo.USP_DATALIST_PAYMENT_BYSALESMETHOD
(
    @DATETYPE tinyint = null
    ,@FROMDATE datetime = null
    ,@TODATE datetime = null
    ,@METHOD1NAME nvarchar(25) = null output
    ,@METHOD2NAME nvarchar(25) = null output
    ,@METHOD3NAME nvarchar(25) = null output
    ,@METHOD4NAME nvarchar(25) = null output
    ,@METHOD5NAME nvarchar(25) = null output
)
as
begin
    declare @INSERTSTARTDATE bit = 0;
    declare @INSERTENDDATE bit = 0;

    if @FROMDATE is not null and @TODATE is not null and cast(@FROMDATE as date) = cast(@TODATE as date)
    begin
        set @FROMDATE = DATEADD(day, -1, @FROMDATE)
        set @TODATE = DATEADD(day, 1, @TODATE)
    end
    if @FROMDATE is not null
    begin
        set @FROMDATE = dbo.UFN_DATE_GETEARLIESTTIME(@FROMDATE);
        set @INSERTSTARTDATE = 1
    end
    if @TODATE is not null
    begin
        set @TODATE = dbo.UFN_DATE_GETLATESTTIME(@TODATE);
        set @INSERTENDDATE = 1
    end

    declare @Data TABLE ([DATE] date, METHOD1AMOUNT money, METHOD2AMOUNT money, METHOD3AMOUNT money, METHOD4AMOUNT money, METHOD5AMOUNT money)
    declare @temp TABLE ([DATE] date, AMOUNT money, METHOD nvarchar(25), METHODCODE integer)

    insert into @temp([DATE], AMOUNT, METHOD, METHODCODE)
    select T.[DATE], SUM(T.TRANSACTIONAMOUNT), T.METHOD, DENSE_RANK() over (order by T.METHOD asc)
    from (
        select FT.CALCULATEDDATE as [DATE], SUM(FT.TRANSACTIONAMOUNT) [TRANSACTIONAMOUNT], 'Back Office' [METHOD]
        from dbo.FINANCIALTRANSACTION as FT
        left join dbo.SALESORDERPAYMENT SP on SP.PAYMENTID = FT.ID and FT.TYPECODE = 0
        left join dbo.REVENUESPLIT RS on RS.REVENUEID = FT.ID and FT.TYPECODE = 0 and RS.APPLICATIONCODE = 2
        left join dbo.RESERVATIONSECURITYDEPOSITPAYMENT RP on FT.ID = RP.PAYMENTID
        where
            FT.DELETEDON is null
            and FT.TYPECODE in (0, 1)
            and SP.ID is null and RS.ID is null and RP.ID is null
            and ((@FROMDATE is null or FT.CALCULATEDDATE >= @FROMDATE) and (@TODATE is null or FT.CALCULATEDDATE <= @TODATE))
        group by FT.CALCULATEDDATE

        union all

        select cast(S.TRANSACTIONDATE as date), SUM(S.AMOUNT), S.SALESMETHODTYPE [METHOD]
        from dbo.SALESORDER S
        where ((@FROMDATE is null or S.TRANSACTIONDATE >= @FROMDATE) and (@TODATE is null or S.TRANSACTIONDATE <= @TODATE))
            and S.TRANSACTIONDATE is not null
        group by cast(S.TRANSACTIONDATE as date), S.SALESMETHODTYPE

        union all

        select FT.CALCULATEDDATE, -SUM(CP.AMOUNT), isnull(CHILDSALESORDER.SALESMETHODTYPE, EXTSALESORDER.SALESMETHODTYPE) [METHOD]
        from dbo.CREDITPAYMENT CP
        inner join dbo.FINANCIALTRANSACTION as FT on FT.ID = CP.CREDITID
        inner join dbo.CREDIT_EXT as EXT on EXT.ID = FT.ID
        left outer join dbo.SALESORDER as CHILDSALESORDER on CHILDSALESORDER.REVENUEID = FT.PARENTID
        left outer join dbo.SALESORDER as EXTSALESORDER on EXTSALESORDER.ID = EXT.SALESORDERID
        where ((@FROMDATE is null or FT.CALCULATEDDATE >= @FROMDATE) and (@TODATE is null or FT.CALCULATEDDATE <= @TODATE))
        group by FT.CALCULATEDDATE, isnull(CHILDSALESORDER.SALESMETHODTYPE, EXTSALESORDER.SALESMETHODTYPE)

        union all

        select FT.CALCULATEDDATE, SUM(FT.TRANSACTIONAMOUNT) [TRANSACTIONAMOUNT], S.SALESMETHODTYPE [METHOD]
        from dbo.FINANCIALTRANSACTION as FT
        inner join dbo.RESERVATIONSECURITYDEPOSITPAYMENT RP on FT.ID = RP.PAYMENTID
        inner join dbo.SALESORDER S on S.ID = RP.RESERVATIONID
        where
            FT.DELETEDON is null
            and FT.TYPECODE = 0
            and ((@FROMDATE is null or FT.CALCULATEDDATE >= @FROMDATE) and (@TODATE is null or FT.CALCULATEDDATE <= @TODATE))
        group by FT.CALCULATEDDATE, S.SALESMETHODTYPE) T
    group by T.[DATE], T.METHOD
    option (recompile);

    insert into @Data
    select  pvt.[DATE], pvt.[1] [METHOD1AMOUNT], pvt.[2] [METHOD2AMOUNT], pvt.[3] [METHOD3AMOUNT], pvt.[4] [METHOD4AMOUNT], pvt.[5] [METHOD5AMOUNT]
    from (
        select T.[DATE], T.METHODCODE, T.AMOUNT
        from @temp T
    ) T
    pivot (
        SUM(AMOUNT) for METHODCODE in ([1], [2], [3], [4], [5])
    ) pvt

    select top 1 @METHOD1NAME = T.METHOD from @temp T where T.METHODCODE = 1
    select top 1 @METHOD2NAME = T.METHOD from @temp T where T.METHODCODE = 2
    select top 1 @METHOD3NAME = T.METHOD from @temp T where T.METHODCODE = 3
    select top 1 @METHOD4NAME = T.METHOD from @temp T where T.METHODCODE = 4
    select top 1 @METHOD5NAME = T.METHOD from @temp T where T.METHODCODE = 5

    update @Data set
        METHOD1AMOUNT = case when @METHOD1NAME is not null then isnull(METHOD1AMOUNT, 0) end
        ,METHOD2AMOUNT = case when @METHOD2NAME is not null then isnull(METHOD2AMOUNT, 0) end
        ,METHOD3AMOUNT = case when @METHOD3NAME is not null then isnull(METHOD3AMOUNT, 0) end
        ,METHOD4AMOUNT = case when @METHOD4NAME is not null then isnull(METHOD4AMOUNT, 0) end
        ,METHOD5AMOUNT = case when @METHOD5NAME is not null then isnull(METHOD5AMOUNT, 0) end;

    if @INSERTENDDATE = 1
        if not exists(select 1 from @Data where [DATE] = convert(varchar, @TODATE, 111))
            insert into @Data([DATE], METHOD1AMOUNT, METHOD2AMOUNT, METHOD3AMOUNT, METHOD4AMOUNT, METHOD5AMOUNT)
            values (convert(varchar, @TODATE, 111)
                ,case when @METHOD1NAME is not null then 0 else null end
                ,case when @METHOD2NAME is not null then 0 else null end
                ,case when @METHOD3NAME is not null then 0 else null end
                ,case when @METHOD4NAME is not null then 0 else null end
                ,case when @METHOD5NAME is not null then 0 else null end);
    if @INSERTSTARTDATE = 1
        if not exists(select 1 from @Data where [DATE] = @FROMDATE)
            insert into @Data([DATE], METHOD1AMOUNT, METHOD2AMOUNT, METHOD3AMOUNT, METHOD4AMOUNT, METHOD5AMOUNT)
            values (@FROMDATE
                ,case when @METHOD1NAME is not null then 0 else null end
                ,case when @METHOD2NAME is not null then 0 else null end
                ,case when @METHOD3NAME is not null then 0 else null end
                ,case when @METHOD4NAME is not null then 0 else null end
                ,case when @METHOD5NAME is not null then 0 else null end);

    if @INSERTSTARTDATE = 1 and @INSERTENDDATE = 1
    begin
        with DateRange([DATE]) as
        (
            select @FROMDATE [DATE]
            union all
            select DATEADD(day, 1, [DATE]) [DATE]
            from DateRange
            where [DATE] < convert(varchar, @TODATE, 111)
        )
        insert into @Data([DATE]
                , METHOD1AMOUNT
                , METHOD2AMOUNT
                , METHOD3AMOUNT
                , METHOD4AMOUNT
                , METHOD5AMOUNT)
            select T.[DATE]
                ,case when @METHOD1NAME is not null then 0 else null end
                ,case when @METHOD2NAME is not null then 0 else null end
                ,case when @METHOD3NAME is not null then 0 else null end
                ,case when @METHOD4NAME is not null then 0 else null end
                ,case when @METHOD5NAME is not null then 0 else null end
            from DateRange T
            where T.[DATE] not in (select [DATE] from @Data)
            OPTION (MAXRECURSION 7000);
    end

    select * from @Data
    order by [DATE];
end