USE [Ladaer2]
GO

/****** Object:  StoredProcedure [dbo].[sp_GetFuelRefillReportByDriverAndTruck]    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 lái xe và xe
--              Dùng để lấy chi tiết từng xe mà lái xe đã chạy
-- =============================================
CREATE PROCEDURE [dbo].[sp_GetFuelRefillReportByDriverAndTruck]
    @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 tất cả dữ liệu
    IF @StartDate IS NULL
        SET @StartDate = '1900-01-01';

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

    -- Báo cáo chi tiết đổ dầu theo lái xe và xe
    SELECT
        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 fr.DriverId, u.UserName, u.FullName, fr.TruckId, t.LicensePlate, t.Brand, t.Model
    ORDER BY DriverFullName, t.LicensePlate;
END
GO
