--Hash:92E9DAE9310D9AB7487F24A938A2F611
SET XACT_ABORT ON
BEGIN TRANSACTION;

GO

SET DATEFORMAT mdy;

--Validar que no existan scripts que no se hayan ejecutado
--//
IF EXISTS
(
	SELECT a.NumVersion + 1 AS HuecoInicio
	FROM ZiurVersiones a
	LEFT JOIN ZiurVersiones b ON a.NumVersion + 1 = b.NumVersion
	WHERE a.NumVersion>830 AND b.NumVersion IS NULL
	AND a.NumVersion + 1 < 930
)
RAISERROR('Error : hay un script que no se ejecuto , debe ejecutarlo manualmente.', 20, -1) with log
--//

--Colocar contenido de script diferencial aqui (Ziur.Database.publish.sql)

/*
 Plantilla de script anterior a la implementación							
--------------------------------------------------------------------------------------
 Este archivo contiene instrucciones de SQL que se ejecutarán antes del script de compilación	
 Use la sintaxis de SQLCMD para incluir un archivo en el script anterior a la implementación			
 Ejemplo:      :r .\miArchivo.sql								
 Use la sintaxis de SQLCMD para hacer referencia a una variable en el script anterior a la implementación		
 Ejemplo:      :setvar TableName miTabla							
               SELECT * FROM [$(TableName)]					
--------------------------------------------------------------------------------------
*/
GO

GO
PRINT N'Altering Procedure [dbo].[GetCalcularDiasLiquidados]...';


GO
ALTER PROCEDURE GetCalcularDiasLiquidados

@FechaIni DATE,
@FechaFin DATE,
@IdContrato NVARCHAR(MAX),
@DiasNomina NUMERIC(28,6)

AS
BEGIN

DECLARE

@FechaIniPeriodo DATE,
@FechaFinPeriodo DATE

SET @FechaIniPeriodo = DATEADD(DAY, 1, EOMONTH(@FechaIni, -1))
SET @FechaFinPeriodo = EOMONTH(@FechaFin)

;WITH tmpDaysLiquidated(IdCliente, IdContrato, LiquidatedDays, Descripcion) --Dias que ya fueron liquidados
AS
(
	SELECT s.IdCliente, s.IdContrato,
	CASE WHEN s.tDifContDias > 0 THEN @DiasNomina ELSE s.EstaEnRango * tDifContrato1 END tDifContrato,
	CASE WHEN s.tDifContDias <= 0 THEN 'Dias Contrato:' + CONVERT(NVARCHAR(20),s.EstaEnRango * tDifContrato1) + ' (' + CONVERT(NVARCHAR(20), s.FechaIni, 103) + '-' + CONVERT(NVARCHAR(20), s.tFin, 103) +')' ELSE NULL END AS Descripcion
	FROM 
	(
		SELECT 
		t.*,
		--Esta logica se debe mantener sincronizada con la funcion getDaysBetweenStartAndEnd()
		--en la clase BaseControlLiquidarNominaForm del proyecto Ziur.UI.Win
		CASE WHEN DAY(tInicio) = 16 AND tFin = @FechaFinPeriodo AND (MONTH(tInicio) = MONTH(tFin))
		THEN 15
		ELSE CASE WHEN DAY(tInicio) = 1 AND tFin = @FechaFinPeriodo AND (MONTH(tInicio) = MONTH(tFin))
		THEN 30
		ELSE DATEDIFF(DAY, tInicio, tFin) + 1 END END tDifContrato1,
		CASE WHEN DAY(tInicio) = 16 AND tFin = @FechaFinPeriodo AND (MONTH(tInicio) = MONTH(tFin)) 
		THEN 15
		ELSE CASE WHEN DAY(tInicio) = 1 AND tFin = @FechaFinPeriodo AND (MONTH(tInicio) = MONTH(tFin)) 
		THEN 30
		ELSE DATEDIFF(DAY, tInicio, tFin) + 1 - @DiasNomina END END tDifContDias
		--
		FROM 
		(
			SELECT 
			u.*,
			CASE WHEN u.tFin1<@FechaFin THEN u.tFin1 ELSE @FechaFin END AS tFin,
			CASE WHEN @FechaIni <= tFin1 and FechaIni <= @FechaFin THEN 1 ELSE 0 END as EstaEnRango
			FROM
			(
				SELECT 
				IdCliente, 
				IdContrato,
				FechaIni,
				FechaFin,
				CASE WHEN FechaIni>@FechaIni THEN FechaIni ELSE @FechaIni END AS tInicio, 
				COALESCE(FechaRetiro,FechaFin,@FechaFin) AS tFin1
				FROM Nomina_Contratos cont
				WHERE cont.IdContrato IN (SELECT number FROM iter$simple_intlist_to_tbl(@IdContrato))
			) u
		) t
	) s


	UNION ALL

	--Dias Novedades
	SELECT q3.IdCliente, q3.IdContrato, -1*SUM(q3.Cantidad) AS Cantidad,
	(
		CASE WHEN SUM(q3.Cantidad) = 0 THEN NULL
		ELSE ('Novedades: ' + FORMAT(SUM(q3.Cantidad), '##,##')) END
	) AS Descripcion
	FROM
	(
		SELECT cont.IdCliente, cont.IdContrato, 
		(
			(DATEDIFF(DD, NoMo.FechaIniVac, NoMo.FechaFinVac) + 1) -
			CASE WHEN @FechaFin < NoMo.FechaIniVac OR @FechaIni > NoMo.FechaFinVac THEN (DATEDIFF(DD, NoMo.FechaIniVac, NoMo.FechaFinVac) + 1)
			ELSE
				( CASE WHEN @FechaIni > NoMo.FechaIniVac THEN DATEDIFF(DD, NoMo.FechaIniVac, @FechaIni) ELSE 0 END +
				CASE WHEN @FechaFin < NoMo.FechaFinVac THEN DATEDIFF(DD, @FechaFin, NoMo.FechaFinVac) ELSE 0 END )
			END
		) AS Cantidad
		FROM Nomina_Contratos cont
		INNER JOIN Nomina_Movimientos NoMo ON NoMo.IdContrato = cont.IdContrato
		INNER JOIN Nomina_Items NoIt ON NoIt.IdItem = NoMo.IdItem
		INNER JOIN Encabezados Enc ON  Enc.IdEncab = NoMo.IdEncab
		WHERE cont.IdContrato IN (SELECT number FROM iter$simple_intlist_to_tbl(@IdContrato)) 
		AND FechaFinVac >= @FechaIniPeriodo AND FechaFinVac <= @FechaFinPeriodo
		AND NoIt.FactorProv = 1
		AND NoIt.IdClasif = 1
		AND Enc.EsAnulado = 0 
	) AS q3
	GROUP BY q3.IdCliente, q3.IdContrato

	UNION ALL

	--Dias Laborados
	SELECT q4.IdCliente, q4.IdContrato, -1*SUM(q4.Cantidad) AS Cantidad,
	(
		CASE WHEN SUM(q4.Cantidad) = 0 THEN NULL
		ELSE ('Dias Sueldo: ' + FORMAT(SUM(q4.Cantidad), '##,##')) END
	) AS Descripcion
	FROM 
	(	
		SELECT enc.IdEncab, cont.IdCliente, cont.IdContrato,  
		(
			Cantidad -
			CASE WHEN enc.FechaIni > @FechaFin OR enc.FechaFin < @FechaIni THEN Cantidad
			ELSE
				( CASE WHEN enc.FechaIni <= @FechaIni THEN (DATEDIFF(DD, enc.FechaIni, @FechaIni)) ELSE 0 END +
				CASE WHEN enc.FechaFin >= @FechaFin THEN (DATEDIFF(DD, @FechaFin, enc.FechaFin)) ELSE 0 END )
			END
		) AS Cantidad
		FROM Nomina_Contratos cont
		INNER JOIN Nomina_Movimientos NoMo ON NoMo.IdContrato = cont.IdContrato
		INNER JOIN Encabezados enc ON enc.IdEncab = NoMo.IdEncab
		WHERE cont.IdContrato IN (SELECT number FROM iter$simple_intlist_to_tbl(@IdContrato))
		AND enc.FechaIni >= @FechaIniPeriodo AND enc.FechaFin <= @FechaFinPeriodo
		AND NoMo.IdItem = 101
		AND enc.EsAnulado = 0
	) AS q4
	GROUP BY q4.IdCliente, q4.IdContrato
)

--Consulta Final
SELECT 
Cont.IdCliente, 
Cont.IdContrato,	
SUM(LiquidatedDays) AS LiquidatedDays,
(
	STUFF
	(	
		(
			SELECT Descripcion + ',' 
			FROM tmpDaysLiquidated tmpDL
			WHERE tmpDL.IdContrato = Cont.IdContrato
			AND tmpDL.IdCliente = Cont.IdCliente
			FOR XML PATH ('')
		), 1, 0, ''
	) 
) AS Descripcion
FROM Nomina_Contratos Cont
LEFT JOIN tmpDaysLiquidated tmp ON tmp.IdContrato = Cont.IdContrato
WHERE Cont.IdContrato IN (SELECT number FROM iter$simple_intlist_to_tbl(@IdContrato))
GROUP BY Cont.IdCliente, Cont.IdContrato

END
GO
	/*
	Plantilla de script posterior a la implementación							
	--------------------------------------------------------------------------------------
	 Este archivo contiene instrucciones de SQL que se anexarán al script de compilación.		
	 Use la sintaxis de SQLCMD para incluir un archivo en el script posterior a la implementación.			
	 Ejemplo:      :r .\miArchivo.sql								
	 Use la sintaxis de SQLCMD para hacer referencia a una variable en el script posterior a la implementación.		
	 Ejemplo:      :setvar TableName miTabla							
				   SELECT * FROM [$(TableName)]					
	--------------------------------------------------------------------------------------
	*/
GO

GO
PRINT N'Update complete.';


GO

--Actualizar datos de la version
INSERT INTO ZiurVersiones (IdVersion, NumVersion, Descripcion)
VALUES (340,930,'Actualizacion de GetCalcularDiasLiquidados')
GO

COMMIT
GO
