--Hash:8A2BC301252E43FC32F7E0DF82EAA8BD

-- Bloqueo exclusivo por base de datos
--//
SET NOCOUNT ON;

DECLARE @__ZiurDbScriptLockResource NVARCHAR(200) = N'ZiurSoft:DbScriptLock:' + CAST(DB_ID() AS NVARCHAR(20));
DECLARE @__ZiurDbScriptLockResult INT;
EXEC @__ZiurDbScriptLockResult = sp_getapplock
    @Resource = @__ZiurDbScriptLockResource,
    @LockMode = N'Exclusive',
    @LockOwner = N'Session',
    @LockTimeout = 600000; -- 10 min

IF (@__ZiurDbScriptLockResult < 0)
BEGIN
    RAISERROR(N'No se pudo obtener el bloqueo exclusivo de actualizacion para esta base de datos.', 16, 1);
    SET NOEXEC ON;
END

/* Idempotencia a nivel de script: si la version ya existe, no ejecutar nada. */
IF EXISTS (SELECT 1 FROM dbo.ZiurVersiones WHERE NumVersion = 946)
BEGIN
    PRINT N'Scripts_946.sql: la version 946 ya esta aplicada. Se omite ejecucion.';
    EXEC sp_releaseapplock @Resource = @__ZiurDbScriptLockResource, @LockOwner = N'Session';
    SET NOEXEC ON;
END

SET XACT_ABORT ON;
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 < 946
)
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].[CalcularCostoPromedio]...';


GO

IF OBJECT_ID(N'dbo.CalcularCostoPromedio', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE dbo.CalcularCostoPromedio AS RETURN 0;');
GO
ALTER PROCEDURE [dbo].[CalcularCostoPromedio]
@FechaFin NVARCHAR(10) = '',
	@IdInventario INT = 0,
	@EsTodo BIT=1
As
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON;

DECLARE 

@FechaFinT DATETIME,
@IdEncabMov INT,
@tCantConFactor NUMERIC(28,6),
@tFactorCosto INT,
@tFactorInv INT,
@tConsecutivo INT,
@tValorUnit NUMERIC(24,8),
@tDcto NUMERIC(28,6),
@tMov2 NUMERIC(28,6),
@tAcumCant NUMERIC(28,6),
@tAcumCostoPromNew NUMERIC(28,6),
@tAcumCosto NUMERIC(28,6),
@tAcumCostoPromOld NUMERIC(28,6),
@tFechaCorte DATETIME,
@IdEncabMovLast INT,
@tCostoAdicional NUMERIC(28,6),
@tOrden INT



--Fecha fin corte
SET @FechaFinT = CAST(CONVERT(DATETIME, @FechaFin, 103) + ' 23:59:59' AS DATETIME)

--Obtener registro ultimo corte
select top(1) @tFechaCorte=FechaCorteFin,@tAcumCant=CantAcum,@tAcumCosto=CostoAcum,@tAcumCostoPromOld=CostoProm,@tOrden=Orden
from dbo.Encabezados_Mov_CostoProm_Historicos hist inner join dbo.Encabezados_Mov mov
on hist.IdEncabMov=mov.IdEncabMov
where IdInventario=@IdInventario and FechaCorteFin<@FechaFinT 
order by FechaCorteFin desc

set @tFechaCorte=dateadd(second,1,@tFechaCorte)

--Eliminar los movimientos que no deben estar los que no sean productos y esten anulados y que no afecten inventario
--//
DELETE FROM Encabezados_Mov_CostoProm 
FROM    
dbo.Encabezados AS Enc INNER JOIN
dbo.Encabezados_Mov AS EncMov ON Enc.IdEncab = EncMov.IdEncab INNER JOIN
dbo.Encabezados_Mov_CostoProm AS EncMovCP ON EncMov.IdEncabMov = EncMovCP.IdEncabMov INNER JOIN
dbo.Inventarios AS Inv ON EncMov.IdInventario = Inv.IdInventario INNER JOIN
dbo.Documentos AS Doc ON Enc.IdDocumento = Doc.IdDocumento
WHERE 
(Enc.EsAnulado = 1 OR Doc.FactorInventario = 0 OR EncMov.FactorMovim = 0 OR Inv.IdTipoInv <> 1 ) AND EncMov.IdInventario = @IdInventario
and Fecha between coalesce(@tFechaCorte,Fecha) and @FechaFinT
--//


--Eliminar los movimientos historicos eliminados que no afectan el nuevo costeo
delete from [dbo].[Encabezados_Mov_CostoProm_Eliminados]
where Fecha between coalesce(@tFechaCorte,Fecha) and @FechaFinT

--Insertar en la tabla de costo promedio los movimientos
--//
INSERT INTO Encabezados_Mov_CostoProm (IdEncabMov, CostoProm, CantAcum, CostoAcum)
SELECT EncMov.IdEncabMov, 0, 0, 0
FROM
dbo.Encabezados AS Enc INNER JOIN
dbo.Encabezados_Mov AS EncMov ON Enc.IdEncab = EncMov.IdEncab INNER JOIN
dbo.Inventarios AS Inv ON EncMov.IdInventario = Inv.IdInventario INNER JOIN
dbo.Documentos AS Doc ON Enc.IdDocumento = Doc.IdDocumento
WHERE 
Enc.EsAnulado = 0 AND Doc.FactorInventario <> 0 AND EncMov.FactorMovim <> 0 AND Inv.IdTipoInv = 1 AND  Inv.IdInventario = @IdInventario AND
EncMov.IdEncabMov NOT IN(SELECT EncMov_Costo.IdEncabMov FROM dbo.Encabezados_Mov AS EncMov INNER JOIN dbo.Encabezados_Mov_CostoProm AS EncMov_Costo ON EncMov.IdEncabMov = EncMov_Costo.IdEncabMov WHERE EncMov.IdInventario = @IdInventario)
and Fecha between coalesce(@tFechaCorte,Fecha) and @FechaFinT
--//

  
SET @tAcumCant = coalesce(@tAcumCant,0)
SET @tAcumCosto = coalesce(@tAcumCosto,0)
SET @tConsecutivo = 0
SET @tAcumCostoPromOld = coalesce(@tAcumCostoPromOld,0)
SET @tConsecutivo = coalesce(@tOrden,0)

DECLARE CostoProm CURSOR FOR
SELECT EncMov.IdEncabMov, Doc.FactorCostoPromedio * EncMov.FactorCostoPromedio, EncMov.Cantidad * EncMov.FactorCantidad * EncMov.FactorMovim * Doc.FactorInventario AS CantConFactor,EncMov.ValorUnitario,(EncMov.ValorUnitario*EncMov.Cantidad*EncMov.Dcto/100)as Dcto,
Doc.FactorInventario,
CASE WHEN CostoPromTipo=1 THEN (CostoPromValor * EncMov.Cantidad * EncMov.FactorCantidad * Doc.FactorInventario) ELSE CostoPromValor END  AS TotCostoPromValor
FROM
dbo.Encabezados AS Enc INNER JOIN
dbo.Encabezados_Mov AS EncMov ON Enc.IdEncab = EncMov.IdEncab INNER JOIN
dbo.Inventarios AS Inv ON EncMov.IdInventario = Inv.IdInventario INNER JOIN
dbo.Documentos AS Doc ON Enc.IdDocumento = Doc.IdDocumento
WHERE Enc.EsAnulado = 0 AND Doc.FactorInventario <> 0 AND EncMov.FactorMovim <> 0 AND Inv.IdTipoInv = 1 AND Inv.IdInventario = @IdInventario
and Fecha between coalesce(@tFechaCorte,Fecha) and @FechaFinT
ORDER BY Cast(Enc.Fecha as date), (Doc.FactorInventario  * EncMov.FactorMovim) DESC, EncMov.IdEncabMov ASC

OPEN CostoProm

FETCH NEXT FROM CostoProm INTO @IdEncabMov, @tFactorCosto, @tCantConFactor, @tValorUnit, @tDcto,@tFactorInv,@tCostoAdicional


WHILE @@FETCH_STATUS = 0
BEGIN
    SET @tConsecutivo = @tConsecutivo + 1;

    UPDATE Encabezados_Mov_CostoProm SET Orden = @tConsecutivo WHERE IdEncabMov = @IdEncabMov

	IF @tFactorCosto = 1
		SET @tMov2 = (@tValorUnit * @tCantConFactor) - (case when @tCantConFactor>=0 then 1 else -1 end * @tDcto) + coalesce(@tCostoAdicional,0)
	ELSE
		SET @tMov2 = @tAcumCostoPromOld * @tCantConFactor

	SET @tAcumCant = @tAcumCant + @tCantConFactor 
	SET @tAcumCosto = @tAcumCosto + @tMov2
	
	IF @tFactorCosto = 1 AND @tAcumCant <> 0
		SET @tAcumCostoPromNew = @tAcumCosto / @tAcumCant
	ELSE
		SET @tAcumCostoPromNew = @tAcumCostoPromOld

	UPDATE Encabezados_Mov_CostoProm 
	SET
	CostoProm = COALESCE(@tAcumCostoPromNew,0),
	CantAcum = @tAcumCant,
	CostoAcum = @tAcumCosto
	WHERE IdEncabMov = @IdEncabMov

	SET @tAcumCostoPromOld = @tAcumCostoPromNew
	set @IdEncabMovLast=@IdEncabMov
	

	FETCH NEXT FROM CostoProm INTO @IdEncabMov, @tFactorCosto, @tCantConFactor, @tValorUnit,@tDcto,@tFactorInv,@tCostoAdicional
END

CLOSE CostoProm
DEALLOCATE CostoProm

--Update campos auditoria
update Encabezados_Mov_CostoProm
set H_IdInventario=IdInventario,H_Cantidad=Cantidad,H_FactorCantidad=FactorCantidad,H_FactorMovim=FactorMovim,
H_ValorUnitario=ValorUnitario,H_Dcto=Dcto,H_CostoPromValor=CostoPromValor,H_EsAnulado=EsAnulado,H_CostoPromTipo=CostoPromTipo
from
(
SELECT prom.IdEncabMov,IdInventario,Cantidad,FactorCantidad,FactorMovim,ValorUnitario,Dcto,CostoPromValor,EsAnulado,CostoPromTipo
from dbo.Encabezados_Mov_CostoProm as prom inner join dbo.Encabezados_Mov as mov
on prom.IdEncabMov=mov.IdEncabMov inner join Encabezados enc on
mov.IdEncab=enc.IdEncab inner join Documentos doc  on enc.IdDocumento=doc.IdDocumento
WHERE mov.IdInventario = @IdInventario and Fecha between coalesce(@tFechaCorte,Fecha) and @FechaFinT
)as q1
WHERE Encabezados_Mov_CostoProm.IdEncabMov=q1.IdEncabMov


if(@IdEncabMov is not null)
begin
--Eliminar historico si ya existe
delete from dbo.Encabezados_Mov_CostoProm_Historicos
where FechaCorteFin=@FechaFinT and
IdEncabMov in (select IdEncabMov from dbo.Encabezados_Mov where IdInventario=@IdInventario)
or IdEncabMov=@IdEncabMovLast

--Insertar movimiento historico
INSERT INTO dbo.Encabezados_Mov_CostoProm_Historicos (IdEncabMov, CostoProm, CantAcum, CostoAcum,FechaCorteFin,FechaCorteIni,EsTodo,Orden)
values(@IdEncabMovLast,COALESCE(@tAcumCostoPromNew,0),@tAcumCant,@tAcumCosto,@FechaFinT,@tFechaCorte,@EsTodo,@tConsecutivo)
end


END
GO
PRINT N'Altering Procedure [dbo].[CalcularCostoPromedioGeneral]...';


GO


IF OBJECT_ID(N'CalcularCostoPromedioGeneral', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE CalcularCostoPromedioGeneral AS RETURN 0;');
GO
ALTER PROCEDURE CalcularCostoPromedioGeneral
	@FechaFin NVARCHAR(10) = '',
	@IdInvent int=null,
	@EsTodo BIT=1
AS

BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON;

DECLARE

@IdInventarioT INT,
@FechaFinT DATETIME,
@tCountReg INT=0,
@RegAcum INT,
@tValorTot INT

SET @FechaFinT = CAST(CONVERT(DATETIME, @FechaFin, 103) + ' 23:59:59' AS DATETIME)

--Eliminar los movimientos que no deben estar los que no sean productos y esten anulados y que no afecten inventario
--//
DELETE FROM [Encabezados_Mov_CostoProm_Historicos]
FROM    
dbo.Encabezados AS Enc INNER JOIN
dbo.Encabezados_Mov AS EncMov ON Enc.IdEncab = EncMov.IdEncab INNER JOIN
dbo.[Encabezados_Mov_CostoProm_Historicos] AS EncMovCPHis ON EncMov.IdEncabMov = EncMovCPHis.IdEncabMov INNER JOIN
dbo.Inventarios AS Inv ON EncMov.IdInventario = Inv.IdInventario INNER JOIN
dbo.Documentos AS Doc ON Enc.IdDocumento = Doc.IdDocumento
WHERE
Enc.EsAnulado = 1 OR Doc.FactorInventario = 0 OR EncMov.FactorMovim = 0 OR Inv.IdTipoInv <> 1
and EncMov.IdInventario= COALESCE(@IdInvent,EncMov.IdInventario)

DELETE FROM Encabezados_Mov_CostoProm
FROM    
dbo.Encabezados AS Enc INNER JOIN
dbo.Encabezados_Mov AS EncMov ON Enc.IdEncab = EncMov.IdEncab INNER JOIN
dbo.Encabezados_Mov_CostoProm AS EncMovCP ON EncMov.IdEncabMov = EncMovCP.IdEncabMov INNER JOIN
dbo.Inventarios AS Inv ON EncMov.IdInventario = Inv.IdInventario INNER JOIN
dbo.Documentos AS Doc ON Enc.IdDocumento = Doc.IdDocumento
WHERE
Enc.EsAnulado = 1 OR Doc.FactorInventario = 0 OR EncMov.FactorMovim = 0 OR Inv.IdTipoInv <> 1
and EncMov.IdInventario= COALESCE(@IdInvent,EncMov.IdInventario)
--//


--Insertar parametro de seguimiento
delete from dbo.Parametros
where CodParametro=-10

INSERT INTO dbo.Parametros (CodParametro, NomParametro, ValParametro, Descripcion, Grupo, EsActivo, IdTipoControl)
  VALUES (-10, N'Costo Prom en Proceso', N'0,'+CONVERT(VARCHAR(20), GETDATE(), 120), N'Costo Promedio en Proceso', N'Documentos', 1, 1)

select @tCountReg=COUNT(*)
from
(SELECT DISTINCT Inv.IdInventario
FROM Inventarios as Inv 
INNER JOIN Encabezados_Mov as EncMov ON inv.IdInventario = EncMov.IdInventario
INNER JOIN Encabezados as Enc ON EncMov.IdEncab = Enc.IdEncab
INNER JOIN dbo.Documentos AS Doc ON Enc.IdDocumento = Doc.IdDocumento
WHERE 
Enc.EsAnulado = 0 AND 
Doc.FactorInventario <> 0 AND 
EncMov.FactorMovim <> 0 AND
Inv.IdTipoInv = 1 AND 
Enc.Fecha <= @FechaFinT
and EncMov.IdInventario= COALESCE(@IdInvent,EncMov.IdInventario)
 )as q 
  
SET @RegAcum=0

DECLARE curCostoProm CURSOR FOR
SELECT DISTINCT Inv.IdInventario
FROM Inventarios as Inv 
INNER JOIN Encabezados_Mov as EncMov ON inv.IdInventario = EncMov.IdInventario
INNER JOIN Encabezados as Enc ON EncMov.IdEncab = Enc.IdEncab
INNER JOIN dbo.Documentos AS Doc ON Enc.IdDocumento = Doc.IdDocumento
WHERE 
Enc.EsAnulado = 0 AND 
Doc.FactorInventario <> 0 AND 
EncMov.FactorMovim <> 0 AND
Inv.IdTipoInv = 1 AND 
Enc.Fecha <= @FechaFinT
and EncMov.IdInventario= COALESCE(@IdInvent,EncMov.IdInventario)

OPEN curCostoProm

FETCH FROM curCostoProm INTO @IdInventarioT

WHILE @@FETCH_STATUS = 0
BEGIN
	EXEC dbo.CalcularCostoPromedio @FechaFin = @FechaFin, @IdInventario = @IdInventarioT,@EsTodo=@EsTodo
	
	--Calculo parametro de seguimiento
	set @RegAcum=@RegAcum+1
	set @tValorTot=(@RegAcum *100/@tCountReg)
	update dbo.Parametros
	set ValParametro=(cast(@tValorTot as nvarchar(20))+','+CONVERT(VARCHAR(20), GETDATE(), 120))
	where CodParametro=-10
	
	FETCH NEXT FROM curCostoProm INTO @IdInventarioT
	
	
END
CLOSE curCostoProm
DEALLOCATE curCostoProm

delete from dbo.Parametros
where CodParametro=-10

END
GO
PRINT N'Altering Procedure [dbo].[GetNominaHorasExtra]...';


GO
IF OBJECT_ID(N'dbo.GetNominaHorasExtra', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE dbo.GetNominaHorasExtra AS RETURN 0;');
GO
ALTER PROCEDURE [dbo].[GetNominaHorasExtra]

@IdEncab INT,
@IdCliente INT

AS
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

--SELECT 
--'' as ClienteNombre,
--'' as ClienteIdent,
--IdCliente, ValorUnitario as ValorBase, ValorUnitario as VlrHora,ValorUnitario as HED,ValorUnitario as HEN,ValorUnitario as RN,
--ValorUnitario as RDF,ValorUnitario as HEDD,ValorUnitario as HEND,ValorUnitario as HD
--From Encabezados_Mov

--RETURN;

declare @hMes INT
 		
Select @hMes = CAST(ValParametro AS INT)
From Parametros Where CodParametro = 47

IF COALESCE(@hMes,0) = 0 
 SET @hMes = 240
     
SELECT 
COALESCE(cli.Nombre1 + ' ','') + COALESCE(cli.Apellido1 + ' ','') as ClienteNombre,
cliTiId.NomTipoIdent + ' ' + CAST(cli.Identificacion as NVARCHAR(100)) + CASE WHEN COALESCE(cli.DVCliente, '-1') = '-1' THEN '' ELSE '-' + cli.DVCliente END as ClienteIdent,cliEmp.IdCentroCosto,
q1.*
FROM
(
SELECT 
 IdCliente, 
 SUM(ValorBase) as ValorBase,
 SUM(VlrHora) as VlrHora,
 SUM(HED) as HED, SUM(HED_Total) as HED_Total,
 SUM(HEN) as HEN, SUM(HEN_Total) as HEN_Total,
 SUM(RN) as RN, SUM(RN_Total) as RN_Total,
 SUM(RDF) as RDF, SUM(RDF_Total) as RDF_Total,
 SUM(HEDD) as HEDD, SUM(HEDD_Total) as HEDD_Total,
 SUM(HEND) as HEND, SUM(HEND_Total) as HEND_Total,
 SUM(HD) as HD, SUM(HD_Total) as HD_Total,
 SUM(HE1) as HE1, SUM(HE1_Total) as HE1_Total,
 SUM(HE2) as HE2, SUM(HE2_Total) as HE2_Total,
 SUM(HE3) as HE3, SUM(HE3_Total) as HE3_Total,
 SUM(HE4) as HE4, SUM(HE4_Total) as HE4_Total,
 SUM(HE5) as HE5, SUM(HE5_Total) as HE5_Total,
 SUM(HE6) as HE6, SUM(HE6_Total) as HE6_Total,
 SUM(HE7) as HE7, SUM(HE7_Total) as HE7_Total,
 SUM(HE8) as HE8, SUM(HE8_Total) as HE8_Total,
 SUM(HED_Total) + SUM(HEN_Total) + SUM(RN_Total) + SUM(RDF_Total) + SUM(HEDD_Total) + SUM(HEND_Total) + SUM(HD_Total)+ SUM(HE1_Total)+ SUM(HE2_Total)+ SUM(HE3_Total)+ SUM(HE4_Total) + SUM(HE5_Total)+ SUM(HE6_Total)+ SUM(HE7_Total)+ SUM(HE8_Total)as Totales
 FROM
 (
  SELECT 
   nomM.IdCliente,
   CASE WHEN nomI.IdItem in (100,101,102)  THEN COALESCE(nomM.ValorBase,0) ELSE 0 END as ValorBase,
   CASE WHEN nomI.IdItem in (100,101,102)  THEN COALESCE(nomM.ValorBase,0) / CAST(@hMes as FLOAT) ELSE 0 END as VlrHora,
   nomI.AbrevItem, 
   nomM.Cantidad,
   nomI.AbrevItem + '_Total' as abrev_Tot,
   COALESCE(nomM.Cantidad,0) * (COALESCE(nomM.ValorUnit,0) / COALESCE(nomM.ValorUnitInferior,1)) as Totales
  FROM 
   Nomina_Movimientos nomM LEFT JOIN Nomina_Items nomI ON
   nomM.IdItem = nomI.IdItem and nomI.IdClasif in (1,2)
  WHERE
   IdEncab = @IdEncab 
  UNION ALL 
  SELECT 
   nomM.IdCliente, 0, 0,
   nomI.AbrevItem, 0,nomI.AbrevItem + '_Total' as abrev_Tot, 0
  FROM 
   Nomina_Movimientos nomM CROSS JOIN Nomina_Items nomI
  WHERE
   IdEncab = @IdEncab and
   nomI.IdClasif = 2
  ) q
 PIVOT
 (
  SUM(Cantidad)
  FOR AbrevItem IN 
   ([HED],[HEN],[RN],[RDF],[HEDD],[HEND],[HD],[HE1],[HE2],[HE3],[HE4],[HE5],[HE6],[HE7],[HE8])
 ) as _pvtTable
 PIVOT
 (
  SUM(Totales)
  FOR Abrev_Tot IN
   ([HED_Total],[HEN_Total],[RN_Total],[RDF_Total],[HEDD_Total],[HEND_Total],[HD_Total],[HE1_Total],[HE2_Total],[HE3_Total],[HE4_Total],[HE5_Total],[HE6_Total],[HE7_Total],[HE8_Total])
 ) as pvtTable
 GROUP BY IdCliente
) q1 INNER JOIN Clientes cli ON
  q1.IdCliente = cli.IdCliente INNER JOIN Clientes_TiposIdent cliTiId ON
  cli.IdTipoIdent = cliTiId.IdTipoIdent INNER JOIN dbo.Clientes_Empleados AS cliEmp
  ON cliEmp.IdCliente=q1.IdCliente
  

END
GO
PRINT N'Altering Procedure [dbo].[GetNominaItemsProgramados]...';


GO

IF OBJECT_ID(N'dbo.GetNominaItemsProgramados', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE dbo.GetNominaItemsProgramados AS RETURN 0;');
GO
ALTER PROCEDURE [dbo].[GetNominaItemsProgramados]

--@IdContratos nvarchar(500) = '',
@IdContrato INT,
@FechaIni NVARCHAR(10) = '',
@FechaFin NVARCHAR(10) = '',
@EsSinFiltro Bit=0

AS
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

DECLARE
@FechaIniT DATETIME,
@FechaFinT DATETIME

SET @FechaIniT = CAST(CONVERT(DATETIME, @FechaIni, 103) + ' 00:00:00' AS DATETIME)
SET @FechaFinT = CAST(CONVERT(DATETIME, @FechaFin, 103) + ' 23:59:59' AS DATETIME)

IF @EsSinFiltro=0


SELECT IdProg,IdContrato,Empleado,NomItem,coalesce(ValorMaximo,0)ValorMaximo,ValorUnit,ValorPago,Saldo,
case when IdTipo = 0 then 'Dev/Deduccion' else 'Retefte' end Tipo,IdItem,IdCliente,SueldoIni,FechaIni,IdClasif,IdRipDiagnostico,IdCentroCosto
from
(
select prog.IdProg,prog.IdContrato,IdentiEmpleado+'-'+NombreEmpleado as Empleado,NomItem,prog.ValorMaximo,prog.ValorUnit,prog.IdTipo,prog.IdItem,cont.IdCliente,ISNULL(sum(mov.ValorUnit/mov.ValorUnitInferior*mov.Cantidad),0) as ValorPago,

CASE WHEN prog.IdItem IN (112,225,248)  THEN  ISNULL(prog.ValorMaximo,ISNULL(sum(mov.Cantidad),0))-ISNULL(sum(mov.Cantidad),0)
ELSE ISNULL(prog.ValorMaximo,ISNULL(sum(mov.ValorUnit/mov.ValorUnitInferior*mov.Cantidad),0) )-ISNULL(sum(mov.ValorUnit/mov.ValorUnitInferior*mov.Cantidad),0) END as Saldo,MAX(SueldoIni)SueldoIni,
max(prog.FechaIni)FechaIni,max(IdClasif)IdClasif,max(prog.IdRipDiagnostico)IdRipDiagnostico,max(cont.IdCentroCosto)IdCentroCosto

from [dbo].[Nomina_ItemsProgramados] prog left join 
Nomina_Movimientos mov on prog.IdProg=mov.IdProg left join 
VNominaContratos cont on prog.IdContrato=cont.IdContrato left join 
Nomina_Items item on prog.IdItem=item.IdItem
where--prog.IdContrato=@IdContrato and
(ISNULL(prog.fechaIni,@FechaIniT) between @FechaIniT and @FechaFinT OR ISNULL(prog.fechaFin,@FechaFinT) between @FechaIniT and @FechaFinT OR (ISNULL(prog.fechaIni,@FechaIniT)<=@FechaIniT AND ISNULL(prog.fechafin,@FechaFinT)>=@FechaFinT))
group by prog.IdProg,prog.IdContrato,IdentiEmpleado+'-'+NombreEmpleado,NomItem,prog.ValorMaximo,prog.ValorUnit,prog.IdTipo,prog.IdItem,cont.IdCliente
)as q
where ValorMaximo is null OR ValorMaximo=0 OR Saldo>0

ELSE

SELECT IdProg,IdContrato,Empleado,NomItem,coalesce(ValorMaximo,0)ValorMaximo,ValorUnit,ValorPago,Saldo,
case when IdTipo = 0 then 'Dev/Deduccion' else 'Retefte' end Tipo,IdItem,IdCliente,SueldoIni,FechaIni,IdClasif,IdRipDiagnostico,IdCentroCosto
from
(
select prog.IdProg,prog.IdContrato,IdentiEmpleado+'-'+NombreEmpleado as Empleado,NomItem,prog.ValorMaximo,prog.ValorUnit,prog.IdTipo,prog.IdItem,cont.IdCliente,ISNULL(sum(mov.ValorUnit/mov.ValorUnitInferior*mov.Cantidad),0) as ValorPago,

CASE WHEN prog.IdItem IN (112,225,248)  THEN  ISNULL(prog.ValorMaximo,ISNULL(sum(mov.Cantidad),0))-ISNULL(sum(mov.Cantidad),0)
ELSE ISNULL(prog.ValorMaximo,ISNULL(sum(mov.ValorUnit/mov.ValorUnitInferior*mov.Cantidad),0) )-ISNULL(sum(mov.ValorUnit/mov.ValorUnitInferior*mov.Cantidad),0) END as Saldo,MAX(SueldoIni)SueldoIni,
max(prog.FechaIni)FechaIni,max(IdClasif)IdClasif,max(prog.IdRipDiagnostico)IdRipDiagnostico,max(cont.IdCentroCosto)IdCentroCosto

from [dbo].[Nomina_ItemsProgramados] prog left join 
Nomina_Movimientos mov on prog.IdProg=mov.IdProg left join 
VNominaContratos cont on prog.IdContrato=cont.IdContrato left join 
Nomina_Items item on prog.IdItem=item.IdItem
group by prog.IdProg,prog.IdContrato,IdentiEmpleado+'-'+NombreEmpleado,NomItem,prog.ValorMaximo,prog.ValorUnit,prog.IdTipo,prog.IdItem,cont.IdCliente
)as q


END
GO
PRINT N'Altering Procedure [dbo].[GetPermisosUsuarios]...';


GO
IF OBJECT_ID(N'dbo.GetPermisosUsuarios', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE dbo.GetPermisosUsuarios AS RETURN 0;');
GO
ALTER PROCEDURE [dbo].[GetPermisosUsuarios]
	@IdUsuario int,
	@InfoUsuario NVARCHAR(100)
AS
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

DECLARE 
	@IdVersiones NVARCHAR(200),
	@IdModulos NVARCHAR(200)

	exec CrearContextoUsuario @InfoUsuario

	set @IdVersiones= (SELECT nstr FROM (SELECT ROW_NUMBER() OVER (ORDER BY listpos) AS numb, nstr from iter$charlist_to_tbl(@InfoUsuario,default))AS TABLA WHERE numb =3)
	set @IdModulos= (SELECT nstr FROM (SELECT ROW_NUMBER() OVER (ORDER BY listpos) AS numb, nstr from iter$charlist_to_tbl(@InfoUsuario,default))AS TABLA WHERE numb = 4)

	;with permVer
	as
	(
	   select * from [ufnPermisosPorVersion](@IdVersiones,@IdModulos)
	)

	select VPPU.IdInterface,
		case  max(cast(coalesce(~VPPV.EsConsultarDenegar,0) as int))
		when 0 then 0
		else
		case  max(cast(VPPU.EsConsultarDenegar as int))
			when 1 then 0
			else
			max(cast(VPPU.EsConsultar as int))
		End
		End as Consultar,

		case  max(cast(coalesce(~VPPV.EsEliminarDenegar,0) as int))
		when 0 then 0
		else
		case max(cast(VPPU.EsEliminarDenegar as int))
			when 1 then 0 
			else
			max(cast(VPPU.EsEliminar as int))
		End
		End as Eliminar,
		
		case  max(cast(coalesce(~VPPV.EsActualizarDenegar,0) as int))
		when 0 then 0
		else
		case max(cast(VPPU.EsActualizarDenegar as int))
			when 1 then 0
			else
			max(cast(VPPU.EsActualizar as int))
		End
		End as Actualizar,
		
		case  max(cast(coalesce(~VPPV.EsInsertarDenegar,0) as int))
		when 0 then 0
		else	
		case max(cast(VPPU.EsInsertarDenegar as int))
			when 1 then 0
			else
			max(cast(VPPU.EsInsertar as int))
			End
		End as Insertar,

	    max(cast(VPPU.EsPorUsuario as int)) EsPorUsuario,
		IdInterfaceParent,
		NomInterface,

		case  max(cast(coalesce(~VPPV.EsConsultarDenegar,0) as int))
		when 0 then 1 else 0 end esPorVersion

	 from VPermisosPorUsuarios VPPU
	 LEFT JOIN permVer VPPV ON VPPU.IdInterface = VPPV.IdInterface
     where  VPPU.IdUsuario = @IdUsuario or VPPU.IdUsuario in (select IdRol from Usuarios_RolesPertenece where IdUsuario=@IdUsuario)
	 group by VPPU.IdInterface, VPPU.IdInterfaceParent,NomInterface
	 order by VPPU.IdInterface
END
GO
PRINT N'Refreshing Procedure [dbo].[CostoPromHistoDeleteALL]...';


GO
EXECUTE sp_refreshsqlmodule N'[dbo].[CostoPromHistoDeleteALL]';


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.';


--Actualizar datos de la version
IF NOT EXISTS (SELECT 1 FROM dbo.ZiurVersiones WHERE NumVersion = 946)
BEGIN
INSERT INTO ZiurVersiones (IdVersion, NumVersion, Descripcion)
VALUES (356, 946, 'Mejoras en bloqueo de tablas por concurrencia')
END
GO
GO
/* Liberar bloqueo exclusivo por base de datos */
DECLARE @__ZiurDbScriptLockResourceEnd NVARCHAR(200) = N'ZiurSoft:DbScriptLock:' + CAST(DB_ID() AS NVARCHAR(20));
EXEC sp_releaseapplock
    @Resource = @__ZiurDbScriptLockResourceEnd,
    @LockOwner = N'Session';
GO
