USE [Ladaer2]
GO

/****** Object:  StoredProcedure [dbo].[sp_GetFuelRefillReportByDate]    Script Date: 08/02/2026 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      System
-- Create date: 2026-02-08
-- Description: Báo cáo chi tiết đổ dầu theo ngày, lái xe và xe
--              Dùng để xuất Excel với nhóm theo ngày
-- =============================================
CREATE PROCEDURE [dbo].[sp_GetFuelRefillReportByDate]
    @StartDate DATE = NULL,
    @EndDate DATE = NULL,
    @DriverIds NVARCHAR(MAX) = NULL,
    @TruckIds NVARCHAR(MAX) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    -- Nếu không truyền tham số ngày, lấy 30 ngày gần nhất
    IF @StartDate IS NULL
        SET @StartDate = DATEADD(DAY, -30, GETDATE());

    IF @EndDate IS NULL
        SET @EndDate = GETDATE();

    -- Báo cáo chi tiết đổ dầu theo ngày, lái xe và xe
    SELECT
        CAST(fr.RefillTime AS DATE) AS RefillDate,
        fr.DriverId,
        u.UserName AS DriverUserName,
        ISNULL(u.FullName, u.UserName) AS DriverFullName,
        fr.TruckId,
        t.LicensePlate AS TruckPlate,
        ISNULL(t.Brand + ' ' + t.Model, t.LicensePlate) AS TruckName,
        
        -- Số km chạy: Tổng của DistanceKm
        SUM(fr.DistanceKm) AS TotalDistanceKm,
        
        -- Số lít đổ dầu thực tế: Tổng của ActualLiters
        SUM(fr.ActualLiters) AS TotalActualLiters,
        
        -- Số tiền đổ dầu thực tế: Tổng của Amount
        SUM(fr.Amount) AS TotalActualAmount,
        
        -- Số lít dầu khoán: Tổng của QuotaLiters
        SUM(fr.QuotaLiters) AS TotalQuotaLiters,
        
        -- Số tiền đổ dầu khoán: Tổng của QuotaLiters * UnitPrice
        SUM(fr.QuotaLiters * fr.UnitPrice) AS TotalQuotaAmount,
        
        -- Số tiền thu nhập dầu: Tổng của (QuotaLiters - ActualLiters) * UnitPrice
        SUM((fr.QuotaLiters - fr.ActualLiters) * fr.UnitPrice) AS TotalFuelIncome

    FROM FuelRefills fr
        INNER JOIN [User] u ON fr.DriverId = u.Id
        INNER JOIN Trucks t ON fr.TruckId = t.Id
    WHERE fr.IsDeleted = 0
        AND CAST(fr.RefillTime AS DATE) >= @StartDate
        AND CAST(fr.RefillTime AS DATE) <= @EndDate
        -- Lọc theo danh sách lái xe (nếu có)
        AND (@DriverIds IS NULL OR fr.DriverId IN (
            SELECT CAST(value AS INT) FROM STRING_SPLIT(@DriverIds, ',')
        ))
        -- Lọc theo danh sách xe (nếu có)
        AND (@TruckIds IS NULL OR fr.TruckId IN (
            SELECT CAST(value AS INT) FROM STRING_SPLIT(@TruckIds, ',')
        ))
    GROUP BY CAST(fr.RefillTime AS DATE), fr.DriverId, u.UserName, u.FullName, fr.TruckId, t.LicensePlate, t.Brand, t.Model
    ORDER BY RefillDate ASC, DriverFullName, t.LicensePlate;
END
GO
