DELIMITER $$

CREATE PROCEDURE `GetRepGerenciaTipoTiempo`(
    IN `p_month` INT,
    IN `p_year` INT
)
BEGIN
    DECLARE `start_date` DATE;
    DECLARE `end_date` DATE;

    -- Calcular las fechas de inicio y fin del rango
    -- Si el mes es enero (1), la fecha de inicio debe ser 21 de diciembre del año anterior
    IF p_month = 1 THEN
        SET `start_date` = STR_TO_DATE(CONCAT(p_year - 1, '-12-21'), '%Y-%m-%d');
        SET `end_date` = STR_TO_DATE(CONCAT(p_year, '-01-20'), '%Y-%m-%d');
    ELSE
        -- Para otros meses, el inicio es el 21 del mes anterior
        SET `start_date` = STR_TO_DATE(CONCAT(p_year, '-', LPAD(p_month - 1, 2, '0'), '-21'), '%Y-%m-%d');
        SET `end_date` = STR_TO_DATE(CONCAT(p_year, '-', LPAD(p_month, 2, '0'), '-20'), '%Y-%m-%d');
    END IF;

    -- Ejecutar la consulta con el rango calculado
    SELECT 
        cdt_timecontroling.timecontrollings.id AS id,
        cdt_timecontroling.centro_costos_sap.id AS centroCostoSap,
        centro_costos_sap.codigo AS codigoCentroCostoSap,
        cdt_timecontroling.centro_costos_sap.nombre AS nombreCentroCostoSap,
        cdt_timecontroling.timecontrollings.tipoTiempo AS tipoTiempo,
        cdt_timecontroling.tipo_tiempos.nombre AS nombreTipoTiempo,
        ROUND(SUM(cdt_timecontroling.timecontrollings.horas), 2) AS horas,
        cdt_timecontroling.tipo_tiempos.color AS color,
        cdt_timecontroling.timecontrollings.createdAt AS createdAt,
        cdt_timecontroling.timecontrollings.updatedAt AS updatedAt
    FROM 
        cdt_timecontroling.timecontrollings
    JOIN 
        cdt_timecontroling.tipo_tiempos ON cdt_timecontroling.timecontrollings.tipoTiempo = cdt_timecontroling.tipo_tiempos.id
    JOIN 
        cdt_timecontroling.centro_costos_sap ON cdt_timecontroling.timecontrollings.centroCostoSap = cdt_timecontroling.centro_costos_sap.id
    JOIN 
        cdt_timecontroling.usuarios ON cdt_timecontroling.timecontrollings.usuario = cdt_timecontroling.usuarios.id
    WHERE 
        cdt_timecontroling.timecontrollings.fecha >= `start_date`
        AND cdt_timecontroling.timecontrollings.fecha <= `end_date`
    GROUP BY 
        cdt_timecontroling.centro_costos_sap.id,
        cdt_timecontroling.timecontrollings.tipoTiempo;

END$$

DELIMITER ;


-- reporte gerencia centro costo

DELIMITER $$

CREATE PROCEDURE GetRepGerenciaCentroCostoSap(
    IN p_month INT,
    IN p_year INT
)
BEGIN
    DECLARE start_date DATE;
    DECLARE end_date DATE;

    -- Calcular las fechas de inicio y fin del rango
    -- Si el mes es enero (1), la fecha de inicio debe ser 21 de diciembre del año anterior
    IF p_month = 1 THEN
        SET `start_date` = STR_TO_DATE(CONCAT(p_year - 1, '-12-21'), '%Y-%m-%d');
        SET `end_date` = STR_TO_DATE(CONCAT(p_year, '-01-20'), '%Y-%m-%d');
    ELSE
        -- Para otros meses, el inicio es el 21 del mes anterior
        SET `start_date` = STR_TO_DATE(CONCAT(p_year, '-', LPAD(p_month - 1, 2, '0'), '-21'), '%Y-%m-%d');
        SET `end_date` = STR_TO_DATE(CONCAT(p_year, '-', LPAD(p_month, 2, '0'), '-20'), '%Y-%m-%d');
    END IF;

    -- Consulta para obtener los datos dentro del rango calculado
    SELECT 
        timecontrollings.id AS id,
        timecontrollings.centroCostoSap AS `centroCostoSap`,
        centro_costos_sap.nombre AS `nombreCentroCostoSap`,
        centro_costos_sap.codigo AS `codigo`,
        ROUND(SUM(cdt_timecontroling.timecontrollings.horas), 2) AS `horas`,
        centro_costos_sap.color AS `color`,
        MONTH(cdt_timecontroling.timecontrollings.fecha) AS `mes`,
        YEAR(cdt_timecontroling.timecontrollings.fecha) AS `year`,
        cdt_timecontroling.timecontrollings.createdAt AS `createdAt`,
        cdt_timecontroling.timecontrollings.updatedAt AS `updatedAt`
    FROM timecontrollings 
    INNER JOIN centro_costos_sap ON timecontrollings.centroCostoSap = centro_costos_sap.id
    INNER JOIN usuarios ON timecontrollings.usuario = usuarios.id
    WHERE timecontrollings.fecha >= start_date
    AND timecontrollings.fecha <= end_date
    GROUP BY timecontrollings.centroCostoSap;
END$$

DELIMITER ;


DELIMITER $$

CREATE PROCEDURE GetRepGerenciaUsuarioCentroCostoSap(
    IN p_month INT,
    IN p_year INT
)
BEGIN
    DECLARE start_date DATE;
    DECLARE end_date DATE;

    -- Calcular las fechas de inicio y fin del rango
    -- Si el mes es enero (1), la fecha de inicio debe ser 21 de diciembre del año anterior
    IF p_month = 1 THEN
        SET `start_date` = STR_TO_DATE(CONCAT(p_year - 1, '-12-21'), '%Y-%m-%d');
        SET `end_date` = STR_TO_DATE(CONCAT(p_year, '-01-20'), '%Y-%m-%d');
    ELSE
        -- Para otros meses, el inicio es el 21 del mes anterior
        SET `start_date` = STR_TO_DATE(CONCAT(p_year, '-', LPAD(p_month - 1, 2, '0'), '-21'), '%Y-%m-%d');
        SET `end_date` = STR_TO_DATE(CONCAT(p_year, '-', LPAD(p_month, 2, '0'), '-20'), '%Y-%m-%d');
    END IF;

    -- Consulta para obtener los datos dentro del rango calculado
    SELECT 
        timecontrollings.id AS id,
        timecontrollings.centroCostoSap AS `centroCostoSap`,
        centro_costos_sap.nombre AS `nombreCentroCostoSap`,
        centro_costos_sap.codigo AS `codigo`,
        timecontrollings.usuario,
        usuarios.nombre as nombreUsuario,
        ROUND(SUM(cdt_timecontroling.timecontrollings.horas), 2) AS `horas`,
        centro_costos_sap.color AS `color`,
        MONTH(cdt_timecontroling.timecontrollings.fecha) AS `mes`,
        YEAR(cdt_timecontroling.timecontrollings.fecha) AS `year`,
        cdt_timecontroling.timecontrollings.createdAt AS `createdAt`,
        cdt_timecontroling.timecontrollings.updatedAt AS `updatedAt`
    FROM timecontrollings 
    INNER JOIN centro_costos_sap ON timecontrollings.centroCostoSap = centro_costos_sap.id
    INNER JOIN usuarios ON timecontrollings.usuario = usuarios.id
    WHERE timecontrollings.fecha >= start_date
    AND timecontrollings.fecha <= end_date
    GROUP BY timecontrollings.centroCostoSap,
    timecontrollings.usuario;
END$$

DELIMITER ;


DELIMITER $$

CREATE PROCEDURE GetRepGerenciaProyectoSap(
    IN p_month INT,
    IN p_year INT
)
BEGIN
    DECLARE start_date DATE;
    DECLARE end_date DATE;

    -- Calcular las fechas de inicio y fin del rango
    -- Si el mes es enero (1), la fecha de inicio debe ser 21 de diciembre del año anterior
    IF p_month = 1 THEN
        SET start_date = STR_TO_DATE(CONCAT(p_year - 1, '-12-21'), '%Y-%m-%d');
        SET end_date = STR_TO_DATE(CONCAT(p_year, '-01-20'), '%Y-%m-%d');
    ELSE
        -- Para otros meses, el inicio es el 21 del mes anterior
        SET start_date = STR_TO_DATE(CONCAT(p_year, '-', LPAD(p_month - 1, 2, '0'), '-21'), '%Y-%m-%d');
        SET end_date = STR_TO_DATE(CONCAT(p_year, '-', LPAD(p_month, 2, '0'), '-20'), '%Y-%m-%d');
    END IF;

    -- Consulta para obtener los datos dentro del rango calculado
    SELECT 
        timecontrollings.id AS id,
        proyectos_sap.id AS proyectoSap,
        proyectos_sap.codigo AS codigoProyectoSap,
        proyectos_sap.descripcion AS nombreProyectoSap,
        timecontrollings.centroCostoSap AS centroCostoSap,
        centro_costos_sap.nombre AS nombreCentroCostoSap,
        centro_costos_sap.codigo AS codigo,
        ROUND(SUM(cdt_timecontroling.timecontrollings.horas), 2) AS horas,
        centro_costos_sap.color AS color,
        MONTH(cdt_timecontroling.timecontrollings.fecha) AS mes,
        YEAR(cdt_timecontroling.timecontrollings.fecha) AS year,
        cdt_timecontroling.timecontrollings.createdAt AS createdAt,
        cdt_timecontroling.timecontrollings.updatedAt AS updatedAt
    FROM timecontrollings
    INNER JOIN centro_costos_sap ON timecontrollings.centroCostoSap = centro_costos_sap.id
    INNER JOIN usuarios ON timecontrollings.usuario = usuarios.id
    INNER JOIN proyectos_sap ON timecontrollings.proyectoSap = proyectos_sap.id
    WHERE timecontrollings.fecha >= start_date
    AND timecontrollings.fecha <= end_date
    GROUP BY timecontrollings.proyectoSap;

END$$

DELIMITER ;
