USE [Ladaer2]
GO

/****** Object:  StoredProcedure [dbo].[sp_GetOrderRevenueStatisticsByDate]    Script Date: 03/02/2026 2:10:41 CH ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[sp_GetOrderRevenueStatisticsByDate]
    @StartDate DATE = NULL,
    @EndDate DATE = NULL,
    @SaleId INT = NULL,
    @PickupStartDate DATE = NULL,
    @PickupEndDate DATE = NULL,
    @DeliveryStartDate DATE = NULL,
    @DeliveryEndDate DATE = NULL
AS
BEGIN
    SET NOCOUNT ON;

    -- Nếu không truyền tham số, lấy tất cả dữ liệu
    IF @StartDate IS NULL
        SET @StartDate = '1900-01-01';

    IF @EndDate IS NULL
        SET @EndDate = '9999-12-31';

    -- Thống kê số lượng đơn hàng, doanh số và tiền thu hộ theo ngày tạo (chỉ đơn còn hiệu lực)
    -- Bao gồm: Tổng số đơn còn hiệu lực, số chờ lấy hàng, số đang lấy hàng, số lấy hàng thất bại, số đang trung chuyển, số đang giao hàng, số giao hàng thất bại, số giao hàng thành công, số đơn đã hủy
    -- Và tính thêm: Tổng doanh số, tổng tiền thu hộ cho từng trạng thái
    SELECT
        CAST(o.CreatedTime AS DATE) AS OrderDate,
        COUNT(CASE WHEN ops.Status <> 8 THEN 1 END) AS TotalOrders,

        -- Tổng doanh số và tiền thu hộ của tất cả đơn hàng trong ngày không bao gồm đơn hủy
SUM
(CASE WHEN ops.Status <> 8 THEN
(ISNULL
(fin.Fee, 0) + ISNULL
(fin.CodFee, 0) + ISNULL
(fin.PickupSubFee, 0) + ISNULL
(fin.DeliverySubFee, 0) - ISNULL
(fin.Discount, 0)) ELSE 0
END) AS TotalRevenue,
        -- Tiền thu hộ đơn đã hủy
        SUM
(CASE WHEN ops.Status <> 8 THEN ISNULL
(fin.CollectAmount, 0) ELSE 0
END) AS TotalCollectAmount,
        -- Đếm đơn chờ lấy hàng: Status = 1 và PhysicalStatus = 1
        COUNT(CASE WHEN ops.Status = 1 AND ops.PhysicalStatus = 1 THEN 1 END) AS WaitPickup,
        -- Doanh số đơn chờ lấy hàng
        SUM(CASE WHEN ops.Status = 1 AND ops.PhysicalStatus = 1 THEN (ISNULL(fin.Fee, 0) + ISNULL(fin.CodFee, 0) + ISNULL(fin.PickupSubFee, 0) + ISNULL(fin.DeliverySubFee, 0) - ISNULL(fin.Discount, 0)) ELSE 0 END) AS WaitPickupRevenue,
        -- Tiền thu hộ đơn chờ lấy hàng
        SUM(CASE WHEN ops.Status = 1 AND ops.PhysicalStatus = 1 THEN ISNULL(fin.CollectAmount, 0) ELSE 0 END) AS WaitPickupCollectAmount,

        -- Đếm đơn đang lấy hàng: Status = 1 và PhysicalStatus IN (11,12)
        COUNT(CASE WHEN ops.Status = 1 AND ops.PhysicalStatus IN (11, 12) THEN 1 END) AS Picking,
        -- Doanh số đơn đang lấy hàng
        SUM(CASE WHEN ops.Status = 1 AND ops.PhysicalStatus IN (11, 12) THEN (ISNULL(fin.Fee, 0) + ISNULL(fin.CodFee, 0) + ISNULL(fin.PickupSubFee, 0) + ISNULL(fin.DeliverySubFee, 0) - ISNULL(fin.Discount, 0)) ELSE 0 END) AS PickingRevenue,
        -- Tiền thu hộ đơn đang lấy hàng
        SUM(CASE WHEN ops.Status = 1 AND ops.PhysicalStatus IN (11, 12) THEN ISNULL(fin.CollectAmount, 0) ELSE 0 END) AS PickingCollectAmount,

        -- Đếm đơn đã lấy: Status = 3 và PhysicalStatus = 13
        COUNT(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 13 THEN 1 END) AS Picked,
        -- Doanh số đơn đã lấy
        SUM(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 13 THEN (ISNULL(fin.Fee, 0) + ISNULL(fin.CodFee, 0) + ISNULL(fin.PickupSubFee, 0) + ISNULL(fin.DeliverySubFee, 0) - ISNULL(fin.Discount, 0)) ELSE 0 END) AS PickedRevenue,
        -- Tiền thu hộ đơn đã lấy
        SUM(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 13 THEN ISNULL(fin.CollectAmount, 0) ELSE 0 END) AS PickedCollectAmount,

        -- Đếm đơn nhập kho: Status = 3 và PhysicalStatus = 20
        COUNT(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 20 THEN 1 END) AS InWarehouse,
        -- Doanh số đơn nhập kho
        SUM(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 20 THEN (ISNULL(fin.Fee, 0) + ISNULL(fin.CodFee, 0) + ISNULL(fin.PickupSubFee, 0) + ISNULL(fin.DeliverySubFee, 0) - ISNULL(fin.Discount, 0)) ELSE 0 END) AS InWarehouseRevenue,
        -- Tiền thu hộ đơn nhập kho
        SUM(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 20 THEN ISNULL(fin.CollectAmount, 0) ELSE 0 END) AS InWarehouseCollectAmount,

        -- Đếm đơn xuất kho: Status = 3 và PhysicalStatus = 30
        COUNT(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 30 THEN 1 END) AS OutWarehouse,
        -- Doanh số đơn xuất kho
        SUM(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 30 THEN (ISNULL(fin.Fee, 0) + ISNULL(fin.CodFee, 0) + ISNULL(fin.PickupSubFee, 0) + ISNULL(fin.DeliverySubFee, 0) - ISNULL(fin.Discount, 0)) ELSE 0 END) AS OutWarehouseRevenue,
        -- Tiền thu hộ đơn xuất kho
        SUM(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus = 30 THEN ISNULL(fin.CollectAmount, 0) ELSE 0 END) AS OutWarehouseCollectAmount,

        -- Đếm đơn đang giao hàng: Status = 3 và PhysicalStatus IN (51,53)
        COUNT(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus IN (51, 53) THEN 1 END) AS Delivering,
        -- Doanh số đơn đang giao hàng
        SUM(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus IN (51, 53) THEN (ISNULL(fin.Fee, 0) + ISNULL(fin.CodFee, 0) + ISNULL(fin.PickupSubFee, 0) + ISNULL(fin.DeliverySubFee, 0) - ISNULL(fin.Discount, 0)) ELSE 0 END) AS DeliveringRevenue,
        -- Tiền thu hộ đơn đang giao hàng
        SUM(CASE WHEN ops.Status = 3 AND ops.PhysicalStatus IN (51, 53) THEN ISNULL(fin.CollectAmount, 0) ELSE 0 END) AS DeliveringCollectAmount,

        -- Đếm đơn giao hàng thành công: Status = 55 và PhysicalStatus = 55
        COUNT(CASE WHEN ops.Status = 55 AND ops.PhysicalStatus = 55 THEN 1 END) AS Delivered,
        -- Doanh số đơn giao hàng thành công
        SUM(CASE WHEN ops.Status = 55 AND ops.PhysicalStatus = 55 THEN (ISNULL(fin.Fee, 0) + ISNULL(fin.CodFee, 0) + ISNULL(fin.PickupSubFee, 0) + ISNULL(fin.DeliverySubFee, 0) - ISNULL(fin.Discount, 0)) ELSE 0 END) AS DeliveredRevenue,
        -- Tiền thu hộ đơn giao hàng thành công
        SUM(CASE WHEN ops.Status = 55 AND ops.PhysicalStatus = 55 THEN ISNULL(fin.CollectAmount, 0) ELSE 0 END) AS DeliveredCollectAmount,

        -- Đếm đơn đã hủy: Status = 8
        COUNT(CASE WHEN ops.Status = 8 THEN 1 END) AS Cancelled,
        -- Doanh số đơn đã hủy
        SUM(CASE WHEN ops.Status = 8 THEN (ISNULL(fin.Fee, 0) + ISNULL(fin.CodFee, 0) + ISNULL(fin.PickupSubFee, 0) + ISNULL(fin.DeliverySubFee, 0) - ISNULL(fin.Discount, 0)) ELSE 0 END) AS CancelledRevenue,
        -- Tiền thu hộ đơn đã hủy
        SUM(CASE WHEN ops.Status = 8 THEN ISNULL(fin.CollectAmount, 0) ELSE 0 END) AS CancelledCollectAmount



    FROM [Order] o
        LEFT JOIN OrderOps ops ON o.Id = ops.Id
        LEFT JOIN OrderFin fin ON o.Id = fin.Id
        LEFT JOIN OrderTimeTrack ott ON o.Id = ott.Id
    WHERE o.CreatedTime IS NOT NULL
        AND o.IsDeleted = 0
        AND CAST(o.CreatedTime AS DATE) >= @StartDate
        AND CAST(o.CreatedTime AS DATE) <= @EndDate
        AND (@SaleId IS NULL OR o.SaleId = @SaleId)
        AND (@PickupStartDate IS NULL OR CAST(ott.PickupTime AS DATE) >= @PickupStartDate)
        AND (@PickupEndDate IS NULL OR CAST(ott.PickupTime AS DATE) <= @PickupEndDate)
        AND (@DeliveryStartDate IS NULL OR CAST(ott.DeliveryDate AS DATE) >= @DeliveryStartDate)
        AND (@DeliveryEndDate IS NULL OR CAST(ott.DeliveryDate AS DATE) <= @DeliveryEndDate)
    GROUP BY CAST(o.CreatedTime AS DATE)
    ORDER BY OrderDate DESC;
END
GO

