--Hash:C75EDF8B9A09855AB334EB518FAB6843

-- 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 = 963)
BEGIN
    PRINT N'Scripts_963.sql: la version 963 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 < 963
)
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)

GO
/*
 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
PRINT N'Dropping Index [dbo].[Audit_Automotores].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Automotores'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Automotores];


GO
PRINT N'Dropping Index [dbo].[Audit_Clientes].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Clientes'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Clientes];


GO
PRINT N'Dropping Index [dbo].[Audit_ClientesProspectos].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_ClientesProspectos'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_ClientesProspectos];


GO
PRINT N'Dropping Index [dbo].[Audit_Cuentas].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Cuentas'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Cuentas];


GO
PRINT N'Dropping Index [dbo].[Audit_Encabezados].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Encabezados'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Encabezados];


GO
PRINT N'Dropping Index [dbo].[Audit_Encabezados_Cont].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Encabezados_Cont'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Encabezados_Cont];


GO
PRINT N'Dropping Index [dbo].[Audit_Encabezados_Mov].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Encabezados_Mov'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Encabezados_Mov];


GO
PRINT N'Dropping Index [dbo].[Audit_Inventarios].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Inventarios'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Inventarios];


GO
PRINT N'Dropping Index [dbo].[Audit_Mantenimientos_Registros].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Mantenimientos_Registros'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Mantenimientos_Registros];


GO
PRINT N'Dropping Index [dbo].[Audit_Tickets].[IX_EsProcesado]...';


GO
IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Tickets'))
    DROP INDEX [IX_EsProcesado] ON [dbo].[Audit_Tickets];


GO
PRINT N'Creating Index [dbo].[Audit_Automotores].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Automotores'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Automotores]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_Automotor]);


GO
PRINT N'Creating Index [dbo].[Audit_Clientes].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Clientes'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Clientes]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_Cli]);


GO
PRINT N'Creating Index [dbo].[Audit_ClientesProspectos].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_ClientesProspectos'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_ClientesProspectos]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_ClientePros]);


GO
PRINT N'Creating Index [dbo].[Audit_Cuentas].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Cuentas'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Cuentas]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_Cuentas]);


GO
PRINT N'Creating Index [dbo].[Audit_Encabezados].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Encabezados'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Encabezados]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit]);


GO
PRINT N'Creating Index [dbo].[Audit_Encabezados_Cont].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Encabezados_Cont'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Encabezados_Cont]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_EncabCont]);


GO
PRINT N'Creating Index [dbo].[Audit_Encabezados_Mov].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Encabezados_Mov'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Encabezados_Mov]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_EncabMov]);


GO
PRINT N'Creating Index [dbo].[Audit_Inventarios].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Inventarios'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Inventarios]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_Inv]);


GO
PRINT N'Creating Index [dbo].[Audit_Mantenimientos_Registros].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Mantenimientos_Registros'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Mantenimientos_Registros]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_MantReg]);


GO
PRINT N'Creating Index [dbo].[Audit_Tickets].[IX_EsProcesado]...';


GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_EsProcesado' AND object_id = OBJECT_ID(N'dbo.Audit_Tickets'))
    CREATE NONCLUSTERED INDEX [IX_EsProcesado]
        ON [dbo].[Audit_Tickets]([Sist_EsProcesado] ASC)
        INCLUDE([IdAudit_Ticket]);


GO
PRINT N'Altering Procedure [dbo].[ActualizarAudit]...';
IF OBJECT_ID(N'dbo.ActualizarAudit', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE [dbo].[ActualizarAudit] AS BEGIN SET NOCOUNT ON; RETURN 0; END');

GO
ALTER PROCEDURE [dbo].[ActualizarAudit]

@Exito INT = 0 output

AS
BEGIN

	declare @rows INT = 0
	declare @batchSize INT = 500
	declare @minutesExpire INT = 1440
	declare @done bit = 0
	declare @lastRunDate DATETIME
	declare @lastRunString nvarchar(20)
	declare @difInMinutes INT

	--Proceso de bloqueo para evitar que se ejecute mas de 1 vez
	--//
	declare @nomProceso varchar(100) = 'ActualizarAudit'

	declare @Lock int
    exec @Lock = sp_getapplock @Resource = @nomProceso,
                               @LockMode = 'Exclusive',
							   @LockTimeout = '5000',
							   @LockOwner = 'Session'
    -- already locked by another process
	if (@Lock < 0)
	begin
		set @Exito = 1
		return;
	end
	--//

	if not exists(select * from Parametros where CodParametro = -30)
		INSERT INTO dbo.Parametros (CodParametro, NomParametro, ValParametro, Descripcion, Grupo, EsActivo, IdTipoControl)
		VALUES (-30, N'Calculo Auditoria', CONVERT(VARCHAR(20), DATEADD(minute ,-1*(@minutesExpire+60), GETDATE()), 120), N'Calculo Auditoria', N'Documentos', 1, 1)

	select @lastRunString =ValParametro from Parametros where CodParametro = -30

	set @lastRunDate = CONVERT(DATETIME, @lastRunString, 120)
	set @difInMinutes = DATEDIFF(minute, @lastRunDate, GETDATE())

	--sale del proceso si no ha pasado mas de @minutesExpire desde la ultima ejecucion
	--//
	if ( @difInMinutes < @minutesExpire)
	begin
		set @Exito = 1
		exec sp_releaseapplock @Resource = @nomProceso,
							   @LockOwner = 'Session'
		return;
	end
	--//

	--tabla temporal para mejorar rendimiento
	DECLARE @TempAudit TABLE (Id INT PRIMARY KEY);

	BEGIN TRY

	--Auditoria Encabezados	
	--//
	select @rows = count(*) from dbo.Audit_Encabezados where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit
		FROM Audit_Encabezados
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Encabezados
		SET AdNomEmpresa=emp.EmpresaNombre,
		AdNomCliente1= cli.Identificacion+'-'+cli.Nombre1+COALESCE(cli.Nombre2,'')+' '+COALESCE(cli.Apellido1,'')+' '+COALESCE(cli.Apellido2,''),
		AdNomCliente1_Dir=CliDir.Direccion,
		AdNomCliente2=cli2.Identificacion+'-'+cli2.Nombre1+' '+COALESCE(cli2.Nombre2,'')+' '+COALESCE(cli2.Apellido1,'')+' '+COALESCE(cli2.Apellido2,''),
		AdNomClienteVend=cliVend.Identificacion+'-'+cliVend.Nombre1+' '+COALESCE(cliVend.Nombre2,'')+' '+COALESCE(cliVend.Apellido1,'')+' '+COALESCE(cliVend.Apellido2,''),
		AdNomMoneda=mon.NomMoneda1,
		AdNomFormaPago= form.NomFormaPago,
		AdNomAutomotor=Autom.Modelo,
		AdNomContacto=con.Nombres,
		AdNomDocumento=doc.NomDocumento,
		Sist_EsProcesado=1,
		AdNomEstado=Estado.NomEstado,
		AdNomClienteProp=cliProp.Identificacion+'-'+cliProp.Nombre1+' '+COALESCE(cliProp.Nombre2,'')+' '+COALESCE(cliProp.Apellido1,'')+' '+COALESCE(cliProp.Apellido2,''),
		AdNomInmueble=inmueble.Direccion,
		AdNomSucursal=sucursal.NomSucursal,
		AdNomMesa=NomMesa,
		AdNomClienteVend2=clivend2.Identificacion+'-'+clivend2.Nombre1+' '+COALESCE(clivend2.Nombre2,'')+' '+COALESCE(clivend2.Apellido1,'')+' '+COALESCE(clivend2.Apellido2,''),
		AdNomEstadoMesa=EstadoMes.NomEstado
		FROM dbo.Audit_Encabezados AS auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit = temp.Id LEFT JOIN dbo.Clientes as cli 
		ON auditoria.IdCliente1 = cli.IdCliente LEFT JOIN dbo.Clientes as cli2
		ON auditoria.IdCliente2 = cli2.IdCliente LEFT JOIN dbo.Clientes as cliVend
		ON auditoria.IdClienteVend = cliVend.IdCliente LEFT JOIN Empresas as emp
		ON auditoria.IdEmpresa = emp.IdEmpresa LEFT JOIN Clientes_Direcciones as CliDir
		ON auditoria.IdCliente1_IdDir=CliDir.IdClienteDir LEFT JOIN dbo.Monedas AS mon
		ON auditoria.IdMoneda = mon.IdMoneda LEFT JOIN dbo.FormasPago as form
		ON auditoria.IdFormaPago=form.IdFormaPago LEFT JOIN dbo.Reparacion_Automotores as Autom
		ON auditoria.IdAutomotor = Autom.IdAutomotor LEFT JOIN dbo.Clientes_Contactos AS con
		ON auditoria.IdContacto = con.IdContacto INNER JOIN dbo.Documentos as doc
		ON auditoria.IdDocumento=doc.IdDocumento LEFT JOIN dbo.Encabezados_Estados AS Estado
		ON auditoria.IdEstado=Estado.IdEstado LEFT JOIN dbo.Clientes as cliProp
		ON auditoria.IdClienteProp=cliProp.IdCliente LEFT JOIN dbo.PH_Inmuebles inmueble
		ON auditoria.IdInmueble=inmueble.IdInmueble  LEFT JOIN dbo.Sucursales sucursal
		ON auditoria.IdSucursal=sucursal.IdSucursal  LEFT JOIN dbo.Encabezados_Mesas Mesa
		ON auditoria.IdMesa=Mesa.IdMesa LEFT JOIN dbo.Clientes as clivend2
		ON auditoria.IdClienteVend2=clivend2.IdCliente LEFT JOIN dbo.Encabezados_Estados AS EstadoMes
		ON auditoria.IdEstadoMesa=EstadoMes.IdEstado
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//

	--Auditoria Encabezados Mov
	--//
	select @rows = count(*) from dbo.Audit_Encabezados_Mov where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_EncabMov
		FROM Audit_Encabezados_Mov
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Encabezados_Mov
		SET AdNomCliente= cli.Identificacion+'-'+cli.Nombre1+' '+COALESCE(cli.Nombre2,'')+' '+COALESCE(cli.Apellido1,'')+' '+COALESCE(cli.Apellido2,''),
		AdNomInventario=inv.CodInventario+'-'+inv.NomInventario,
		AdNomBodega= bod.NomBodega,
		AdNomLote=lot.CodLote+'-'+lot.NomLote,
		AdNomUnidad=uni.NomUnidad,
		AdNomCentroCosto=cent.NomCentroCosto,
		AdNomEncabMov2=inv2.CodInventario+'-'+inv2.NomInventario,
		Sist_EsProcesado=1,
		AdNomInmueble=inmueble.Direccion,
		AdNomEmpleado=Emple.Identificacion+'-'+Emple.Nombre1+' '+COALESCE(Emple.Nombre2,'')+' '+COALESCE(Emple.Apellido1,'')+' '+COALESCE(Emple.Apellido2,''),
		AdNomEncabMov3=inv3.CodInventario+'-'+inv3.NomInventario,
		AdNomMoneda=moneda.NomMoneda1,
		AdNomUnidad1=uni1.NomUnidad,
		AdNomVendedor=Vend.Identificacion+'-'+Vend.Nombre1+' '+COALESCE(Vend.Nombre2,'')+' '+COALESCE(Vend.Apellido1,'')+' '+COALESCE(Vend.Apellido2,''),
		AdNomRutaEncMov=ProProc.NomProceso+'-'+CAST(EncaRutPro.Orden AS nvarchar(20))+' '+'('+CAST(EncaRutPro.IdEncabMov AS nvarchar(20))+')'
		FROM dbo.Audit_Encabezados_Mov AS auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_EncabMov = temp.Id LEFT JOIN dbo.Clientes as cli 
		ON auditoria.IdCliente = cli.IdCliente LEFT JOIN dbo.Inventarios as inv
		ON auditoria.IdInventario=inv.IdInventario LEFT JOIN dbo.Inventarios_Bodegas AS bod
		ON auditoria.IdBodega = bod.IdBodega LEFT JOIN dbo.Inventarios_Lotes as lot
		ON auditoria.IdLote=lot.IdLote LEFT JOIN dbo.Inventarios_Unidades as uni
		ON auditoria.IdUnidad = uni.IdUnidad LEFT JOIN dbo.CentroCostos AS cent
		ON auditoria.IdCentroCosto = cent.IdCentroCosto LEFT JOIN dbo.Encabezados_Mov  AS encMov
		ON auditoria.IdEncabMov2=encMov.IdEncabMov LEFT JOIN dbo.Inventarios as inv2
		ON auditoria.IdInventario=inv2.IdInventario  LEFT JOIN dbo.PH_Inmuebles inmueble
		ON auditoria.IdInmueble=inmueble.IdInmueble   LEFT JOIN dbo.Clientes as Emple
		ON auditoria.IdEmpleado=Emple.IdCliente LEFT JOIN dbo.Encabezados_Mov  AS encMov3
		ON auditoria.IdEncabMov3=encMov.IdEncabMov LEFT JOIN dbo.Inventarios as inv3
		ON auditoria.IdInventario=inv3.IdInventario LEFT JOIN dbo.Monedas moneda
		ON auditoria.IdMoneda=moneda.IdMoneda LEFT JOIN dbo.Inventarios_Unidades as uni1
		ON auditoria.IdUnidad1 = uni1.IdUnidad LEFT JOIN dbo.Clientes as Vend
		ON auditoria.IdVendedor=Vend.IdCliente LEFT JOIN dbo.Encabezados_Mov_RutasProduccion as EncaRutPro
		ON auditoria.IdRutaEncMov=EncaRutPro.IdRutaEncMov LEFT JOIN dbo.Produccion_Procesos as ProProc
		ON EncaRutPro.IdProceso=ProProc.IdProceso
		where auditoria.Sist_EsProcesado=0
		
		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//

	--Auditoria Encabezados Cont
	--//
	select @rows = count(*) from dbo.Audit_Encabezados_Cont where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_EncabCont
		FROM Audit_Encabezados_Cont
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Encabezados_Cont
		SET AdNomCliente= cli.Identificacion+'-'+cli.Nombre1+' '+COALESCE(cli.Nombre2,'')+' '+COALESCE(cli.Apellido1,'')+' '+COALESCE(cli.Apellido2,''),
		AdNomCuenta=cuen.CodCuenta+'-'+cuen.NomCuenta,
		AdNomClienteBanco=cli2.Identificacion+'-'+cli2.Nombre1+' '+COALESCE(cli2.Nombre2,'')+' '+COALESCE(cli2.Apellido1,'')+' '+COALESCE(cli2.Apellido2,''),
		AdNomCentroCosto=cent.NomCentroCosto,
		AdNomAbonaDoc=abonaDoc.Descripcion,
		AdNomAbonaCheque=abonaCheq.Descripcion,
		Sist_EsProcesado=1,
		AdNomEmpleado=Emple.Identificacion+'-'+Emple.Nombre1+' '+COALESCE(Emple.Nombre2,'')+' '+COALESCE(Emple.Apellido1,'')+' '+COALESCE(Emple.Apellido2,''),
		AdNomInmueble=inmueble.Direccion,
		AdNomMoneda=moneda.NomMoneda1,
		AdNomAbonaDocDet=abonaDocDet.Descripcion
		FROM dbo.Audit_Encabezados_Cont AS auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_EncabCont = temp.Id LEFT JOIN dbo.Clientes as cli 
		ON auditoria.IdCliente = cli.IdCliente LEFT JOIN dbo.Cuentas as cuen
		ON auditoria.IdCuenta= cuen.IdCuenta LEFT JOIN dbo.Clientes as cli2
		ON auditoria.IdClienteBanco = cli2.IdCliente LEFT JOIN dbo.CentroCostos AS cent
		ON auditoria.IdCentroCosto = cent.IdCentroCosto LEFT JOIN VIdAbonaDoc_02 AS abonaDoc
		ON auditoria.IdAbonaDoc=abonaDoc.IdEncabCont LEFT JOIN dbo.VIdAbonaCheque_02 AS abonaCheq
		ON auditoria.IdAbonaCheque=abonaCheq.IdEncabCont  LEFT JOIN dbo.Clientes as Emple
		ON auditoria.IdEmpleado=Emple.IdCliente  LEFT JOIN dbo.PH_Inmuebles inmueble
		ON auditoria.IdInmueble=inmueble.IdInmueble  LEFT JOIN dbo.Monedas moneda
		ON auditoria.IdMoneda=moneda.IdMoneda LEFT JOIN dbo.VIdAbonaDoc_02 AS abonaDocDet
		ON auditoria.IdAbonaDocDet=abonaDocDet.IdEncabCont
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//
	
	--AuditoriA Clientes
	--//
	select @rows = count(*) from dbo.Audit_Clientes where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_Cli
		FROM Audit_Clientes
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Clientes
		SET AdNomTipoIdent=NomTipoIdent,AdNomCiudad=NomCiudad,AdNomTipoRegimen=NomTipoRegimen,
		AdNomVendedor=cli.Identificacion+'-'+cli.Nombre1+' '+COALESCE(cli.Nombre2,'')+' '+COALESCE(cli.Apellido1,'')+' '+COALESCE(cli.Apellido2,''),
		AdNomAgrup1=NomAgrup1,AdNomAgrup2=NomAgrup2,AdNomAgrup3=NomAgrup3,AdNomZona1=NomZona1,AdNomZona2=NomZona2,AdNomZona3=NomZona3,AdNomLista=NomLista,AdNomPais=NomPais1,
		Sist_EsProcesado=1,AdNomActividad=NomActividad,AdNomRiesgo=NomRiesgo,AdNomCuentaCree=NomCuenta
		from dbo.Audit_Clientes auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_Cli = temp.Id left join dbo.Clientes_TiposIdent Ident
		on auditoria.IdTipoIdent=Ident.IdTipoIdent left join dbo.Ciudades Ciu
		on auditoria.IdCiudad=Ciu.IdCiudad left join dbo.Clientes_TiposRegimen tipoReg
		on auditoria.IdTipoRegimen=tipoReg.IdTipoRegimen left join dbo.Clientes cli
		on auditoria.IdCliVendedor=cli.IdCliente left join dbo.Clientes_Agrup1 agrup1
		on auditoria.IdAgrup1=agrup1.IdAgrup1 left join dbo.Clientes_Agrup2 agrup2
		on auditoria.IdAgrup2=agrup2.IdAgrup2 left join dbo.Clientes_Agrup3 agrup3
		on auditoria.IdAgrup3=agrup3.IdAgrup3 left join dbo.Clientes_Zona1 Zona1
		on auditoria.IdZona1=Zona1.IdZona1 left join dbo.Clientes_Zona2 Zona2
		on auditoria.IdZona2=Zona2.IdZona2 left join dbo.Clientes_Zona3 Zona3
		on auditoria.IdZona3=Zona3.IdZona3 left join dbo.Inventarios_Listas List
		on auditoria.IdLista=List.IdLista left join dbo.Paises Pais
		on auditoria.IdPais=Pais.IdPais left join Empresas_ActividadesEcon Act
		on auditoria.IdActividad=Act.IdActividad left join dbo.IFRS_Riesgos_Deterioro Riesgo
		on auditoria.IdRiesgo=Riesgo.IdRiesgo left join dbo.Cuentas cuenta
		on auditoria.IdCuentaCree=cuenta.IdCuenta
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//

	--Auditoria Productos
	--//
	select @rows = count(*) from dbo.Audit_Inventarios where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_Inv
		FROM Audit_Inventarios
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Inventarios
		SET AdNomUnidad=unidad.NomUnidad,AdNomAgrup1=agrup1.NomAgrup1,AdNomAgrup2=agrup2.NomAgrup2,AdNomContab=NomContab,
		AdNomTipoInv=NomTipoInven,AdNomContCosto=NomContCosto,
		Sist_EsProcesado=1,AdNomRecursoPOS=Recurs.Descripcion,AdNomClasifImpto=Clasif.NomClasifImpto,
		AdNomUnidad1=unidad1.NomUnidad,AdNomProdAgrup1=ProAgp1.NomAgrup1,AdNomProdAgrup2=ProAgp2.NomAgrup2
		from dbo.Audit_Inventarios auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_Inv = temp.Id left join dbo.Inventarios_Unidades unidad
		on auditoria.IdUnidad=unidad.IdUnidad left join dbo.Inventarios_Agrup1 agrup1
		on auditoria.IdAgrup1=agrup1.IdAgrup1 left join dbo.Inventarios_Agrup2 agrup2
		on auditoria.IdAgrup2=agrup2.IdAgrup2 left join dbo.Contabilizaciones contab
		on auditoria.IdContab=contab.IdContab left join  dbo.Inventarios_Tipos invTipo
		on auditoria.IdTipoInv=invTipo.IdInvenTipo left join  dbo.Contabilizaciones_Costos conCosto
		on auditoria.IdContCosto=conCosto.IdContCosto left join dbo.Inventarios_DocRecursos  Recurs
		on auditoria.IdRecursoPOS=Recurs.IdRecurso  left join dbo.Inventarios_ClasifImpto  Clasif
		on auditoria.IdClasifImpto=Clasif.IdClasifImpto left join dbo.Inventarios_Unidades unidad1
		on auditoria.IdUnidad1=unidad1.IdUnidad left join dbo.Produccion_Agrup1 ProAgp1
		on auditoria.IdProdAgrup1=ProAgp1.IdAgrup1 left join dbo.Produccion_Agrup2 ProAgp2
		on auditoria.IdProdAgrup2=ProAgp2.IdAgrup2
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION; 
	end
	--//

	--Auditoria Cuentas
	--//
	select @rows = count(*) from dbo.Audit_Cuentas where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_Cuentas
		FROM Audit_Cuentas
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Cuentas
		SET AdNomCuentaTipo=NomCuentaTipo,AdNomClasif=NomClasif,AdNomGrupoCuenta=NomGrupoCuenta,AdNomTipoPuc=NomTipoPuc,
		Sist_EsProcesado=1
		from dbo.Audit_Cuentas auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_Cuentas = temp.Id left join dbo.Cuentas_Tipos cuenTipo
		on auditoria.IdCuentaTipo=cuenTipo.IdCuentaTipo left join dbo.Cuentas_Clasificacion clasif
		on auditoria.IdClasif=clasif.IdClasif left join dbo.Cuentas_Grupos grupo
		on auditoria.IdGrupoCuenta=grupo.IdGrupoCuenta left join dbo.Cuentas_TiposPuc tipoPuc
		on auditoria.IdTipoPuc=tipoPuc.IdTipoPuc
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//
		
	--Auditoria Prospectos
	--//
	select @rows = count(*) from dbo.Audit_ClientesProspectos where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_ClientePros
		FROM Audit_ClientesProspectos
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_ClientesProspectos
		set AdNomcliente1= cli.Identificacion+'-'+cli.Nombre1+' '+COALESCE(cli.Nombre2,'')+' '+COALESCE(cli.Apellido1,'')+' '+COALESCE(cli.Apellido2,''),
		AdNomCiudad=ci.NomCiudad, AdNomEstado=cliprosest.NomEstado, AdNomGrupo=cliprosgrup.NomGrupo, AdNomMedio=cliprosmedios.NomMedio,AdNomProducto=cliprospro.NomProducto,
		AdNomClienteConv=cliconv.Identificacion+'-'+cliconv.Nombre1+' '+COALESCE(cliconv.Nombre2,'')+' '+COALESCE(cliconv.Apellido1,'')+' '+COALESCE(cliconv.Apellido2,''),
		Sist_EsProcesado=1,AdNomUsuario=Usu.NomUsuario,AdNomProductoComp=propComp.NomProductoComp,
		AdNomcliente2 = cli2.IdCliente
		from dbo.Audit_ClientesProspectos auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_ClientePros = temp.Id left join dbo.Clientes cli
		on auditoria.IdCliente1=cli.IdCliente left join dbo.Ciudades ci
		on auditoria.IdCiudad=ci.IdCiudad left join dbo.Clientes_Prospectos_Estados cliprosest
		on auditoria.IdEstado=cliprosest.IdEstado left join dbo.Clientes_Prospectos_Grupos cliprosgrup
		on auditoria.IdGrupo=cliprosgrup.IdGrupo left join dbo.Clientes_Prospectos_Medios cliprosmedios
		on auditoria.IdMedio=cliprosmedios.IdMedio left join dbo.Clientes_Prospectos_Productos cliprospro
		on auditoria.IdProducto=cliprospro.IdProducto left join dbo.Clientes cliconv
		on auditoria.IdClienteConv=cliconv.IdCliente left join dbo.Usuarios Usu
		on auditoria.IdUsuario=Usu.IdUsuario left join dbo.Clientes_Prospectos_Productos_Comp propComp
		on auditoria.IdProductoComp=propComp.IdProductoComp left join dbo.Clientes cli2
		on auditoria.IdCliente2=cli2.IdCliente
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//

	--Auditoria Automotores
	--//
	select @rows = count(*) from dbo.Audit_Automotores where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_Automotor
		FROM Audit_Automotores
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Automotores
		SET AdNomMarca=NomMarca,AdNomAgrup=NomAgrup,AdNomUnidad=NomUnidad,AdNomServicio=NomInventario,
		AdNomCliente= cli.Identificacion+'-'+cli.Nombre1+' '+COALESCE(cli.Nombre2,'')+' '+COALESCE(cli.Apellido1,'')+' '+COALESCE(cli.Apellido2,''),
		Sist_EsProcesado=1
		from [dbo].[Audit_Automotores] auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_Automotor = temp.Id left join [dbo].[Reparacion_Marcas] Marca
		on auditoria.IdMarca=Marca.IdMarca left join [dbo].[Reparacion_Automotores_Agrup] Agrup
		on auditoria.IdAgrup=Agrup.IdAgrup left join [dbo].[Inventarios_Unidades] Uni
		on auditoria.IdUnidad=Uni.IdUnidad left join [dbo].[Inventarios] Inv
		on auditoria.IdServicio=Inv.IdInventario left join dbo.Clientes cli
		on auditoria.IdCliente=cli.IdCliente
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//

	--Mantenimientos Registros
	--//
	select @rows = count(*) from dbo.Audit_Mantenimientos_Registros where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_MantReg
		FROM Audit_Mantenimientos_Registros
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Mantenimientos_Registros
		SET AdNomTipoMant=NomTipoMant,AdNomAutomotor=NomAutomotor,AdNomUnidad=NomUnidad,
		Sist_EsProcesado=1
		from [dbo].[Audit_Mantenimientos_Registros] auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_MantReg = temp.Id left join [dbo].[Reparacion_Automotores_Mant_Tipos] tipo
		on auditoria.IdTipoMant=tipo.IdTipoMant left join [dbo].[Reparacion_Automotores] autom
		on auditoria.IdAutomotor=autom.IdAutomotor left join [dbo].[Inventarios_Unidades] Uni
		on auditoria.IdUnidad=Uni.IdUnidad
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//
	
	--Auditoria Tickets
	--//
	select @rows = count(*) from dbo.Audit_Tickets where Sist_EsProcesado=0
	set @done = 0
	while (@done = 0 AND @rows > 0)
	begin
		DELETE from @TempAudit

		INSERT INTO @TempAudit (Id)
		SELECT TOP (@batchSize) IdAudit_Ticket
		FROM Audit_Tickets
		WHERE Sist_EsProcesado = 0

		--iniciar transaccion
		BEGIN TRANSACTION;

		UPDATE TOP (@batchSize) dbo.Audit_Tickets
		SET AdNomCliente=cli.Identificacion+'-'+cli.Nombre1+' '+COALESCE(cli.Nombre2,'')+' '+COALESCE(cli.Apellido1,'')+' '+COALESCE(cli.Apellido2,''),
		AdNomAgrup1=agrup1.NomAgrup1,AdNomAgrup2=agrup2.NomAgrup2, AdNomEstado=NomEstado,
		AdNomResponsable=cli2.Identificacion+'-'+cli2.Nombre1+' '+COALESCE(cli2.Nombre2,'')+' '+COALESCE(cli2.Apellido1,'')+' '+COALESCE(cli2.Apellido2,''),
		Sist_EsProcesado=1
		from [dbo].[Audit_Tickets] as auditoria JOIN @TempAudit AS temp ON auditoria.IdAudit_Ticket = temp.Id inner join 
		Clientes as cli on auditoria.IdCliente=cli.IdCliente left join
		[dbo].[Tickets_Agrup1] as agrup1 on auditoria.IdAgrup1=agrup1.IdAgrup1 left join
		[dbo].[Tickets_Agrup2] as agrup2 on auditoria.IdAgrup2=agrup2.IdAgrup2 inner join
		[dbo].[Tickets_Estados] as Estado on auditoria.IdEstado= Estado.IdEstado inner join 
		Clientes as cli2 on auditoria.IdResponsable=cli2.IdCliente
		where auditoria.Sist_EsProcesado=0

		if @@rowcount < @batchSize SET @done = 1;

		--ir haciendo commit a la bd
		COMMIT TRANSACTION;
	end
	--//

	--Actualizar con la fecha del final de la actualizacion
	--//
	update Parametros set ValParametro = CONVERT(VARCHAR(20), GETDATE(), 120) where CodParametro = -30
	--//
	
	exec sp_releaseapplock @Resource = @nomProceso, @LockOwner = 'Session'
	SET @Exito = 1;
	RETURN;

	END TRY
    
	BEGIN CATCH
		-- Verificar si hay una transacción abierta y hacer commit
		IF @@TRANCOUNT > 0
		BEGIN
			ROLLBACK TRANSACTION;
		END

		set @Exito = 0
		exec sp_releaseapplock @Resource = @nomProceso, @LockOwner = 'Session'
	END CATCH;
	
	--actua como un finally en caso que se detenga
	IF @@TRANCOUNT > 0
	BEGIN
		ROLLBACK TRANSACTION;
	END

END
GO
PRINT N'Altering Procedure [dbo].[GetEstadoCuentaFechaCorte]...';
IF OBJECT_ID(N'dbo.GetEstadoCuentaFechaCorte', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE [dbo].[GetEstadoCuentaFechaCorte] AS BEGIN SET NOCOUNT ON; RETURN 0; END');

GO
ALTER PROCEDURE GetEstadoCuentaFechaCorte 
	@FechaFin NVARCHAR(10) = '',
	@IdCliente INT = NULL,
    @CuentaIni NVARCHAR(100)=NULL,
	@CuentaFin NVARCHAR(100)=NULL,
	@IdCuentaTipos NVARCHAR(100),
	@IdEmpresas NVARCHAR(1000) = '',
	@IdVendedor INT = NULL,
	@IdSucursal INT = NULL,
	@IdCentroCosto INT = NULL,
    @EsNotGAAP BIT = NULL,
    @EsIFRS BIT = NULL,
	@FechaIniR NVARCHAR(10) = NULL,
	@FechaFinR NVARCHAR(10) =NULL,
	@esPagos BIT=0,
	@IdDir INT = NULL


AS

BEGIN

DECLARE

@FechaFinT DATETIME,
@DataPar NVARCHAR(200),
@FechaIniRT DATETIME=null,
@FechaFinRT DATETIME=null,
@EsMostrarPagos int=0,
@PorVencerCol1Ini INT, @PorVencerCol1Fin INT, @PorVencerCol2Ini INT, @PorVencerCol2Fin INT, @PorVencerCol3Ini INT, @PorVencerCol3Fin INT, @PorVencerCol4Ini INT,@PorVencerCol4Fin INT,@PorVencerCol5Ini INT,@PorVencerCol5Fin INT,@PorVencerCol6Ini INT,@PorVencerCol6Fin INT,
@VencidaCol1Ini INT,@VencidaCol1Fin INT,@VencidaCol2Ini INT,@VencidaCol2Fin INT,@VencidaCol3Ini INT,@VencidaCol3Fin INT,@VencidaCol4Ini INT,@VencidaCol4Fin INT,@VencidaCol5Ini INT,@VencidaCol5Fin INT,@VencidaCol6Ini INT,@VencidaCol6Fin INT

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

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

if @FechaIniR is not null
SET @FechaIniRT = CAST(CONVERT(DATETIME, @FechaIniR, 103) + ' 00:00:00' AS DATETIME)

if @FechaFinR is not null
SET @FechaFinRT = CAST(CONVERT(DATETIME, @FechaFinR, 103) + ' 23:59:59' AS DATETIME)

if @esPagos<>0
set @EsMostrarPagos=null

/* Por Vencer Columna 1 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 31
IF @DataPar IS NULL
	SET @DataPar = '0,30'

SET @PorVencerCol1Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2) AS INT)
SET @PorVencerCol1Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT)
/* ------------------------------------------- */

/* Por Vencer Columna 2 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 32
IF @DataPar IS NULL
	SET @DataPar = '31,60'

SET @PorVencerCol2Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT)
SET @PorVencerCol2Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT)
/* ------------------------------------------- */

/* Por Vencer Columna 3 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 33
IF @DataPar IS NULL
	SET @DataPar = '61,90'

SET @PorVencerCol3Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT)
SET @PorVencerCol3Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT)
/* ------------------------------------------- */

/* Por Vencer Columna 4 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 34
IF @DataPar IS NULL
	SET @DataPar = '91,180'

SET @PorVencerCol4Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT)
SET @PorVencerCol4Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT)
/* ------------------------------------------- */

/* Por Vencer Columna 5 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 35
IF @DataPar IS NULL
	SET @DataPar = '181,360'

SET @PorVencerCol5Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT)
SET @PorVencerCol5Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT)
/* ------------------------------------------- */

/* Por Vencer Columna 6 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 36
IF @DataPar IS NULL
	SET @DataPar = '360,999999'

SET @PorVencerCol6Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT)
SET @PorVencerCol6Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT)
/* ------------------------------------------- */


/* Vencida Columna 1 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 21
IF @DataPar IS NULL
	SET @DataPar = '0,30'

SET @VencidaCol1Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2) AS INT) * -1
SET @VencidaCol1Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT) * -1
/* ------------------------------------------- */

/* Vencida Columna 2 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 22
IF @DataPar IS NULL
	SET @DataPar = '31,60'

SET @VencidaCol2Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT) * -1
SET @VencidaCol2Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT) * -1
/* ------------------------------------------- */

/* Vencida Columna 3 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 23
IF @DataPar IS NULL
	SET @DataPar = '61,90'

SET @VencidaCol3Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT) * -1
SET @VencidaCol3Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT) * -1
/* ------------------------------------------- */

/* Vencida Columna 4 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 24
IF @DataPar IS NULL
	SET @DataPar = '91,180'

SET @VencidaCol4Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT) * -1
SET @VencidaCol4Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT) * -1
/* ------------------------------------------- */

/* Vencida Columna 5 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 25
IF @DataPar IS NULL
	SET @DataPar = '181,360'

SET @VencidaCol5Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT) * -1
SET @VencidaCol5Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT) * -1
/* ------------------------------------------- */

/* Vencida Columna 6 */
/* ------------------------------------------- */
SET @DataPar = NULL
SELECT @DataPar = ValParametro FROM PARAMETROS WHERE CodParametro = 26
IF @DataPar IS NULL
	SET @DataPar = '360,999999'

SET @VencidaCol6Ini = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 2)  AS INT) * -1
SET @VencidaCol6Fin = CAST(PARSENAME(REPLACE(@DataPar, ',', '.'), 1) AS INT) * -1
/* ------------------------------------------- */


SELECT 
q1.CodCuenta, 
q1.NomCuenta, 
q1.IdCuentaTipo, 
q1.Tipo, 
q1.IdAbonaDoc, 
q1.IdCliente, 
q1.Saldo, 
q1.Vence,
q1.Dias,
q1.Nombres, 
q1.Apellidos, 
q1.NomCompleto,
q1.CodDocumento, 
q1.Fecha,
q1.IdPrefijo, 
q1.NumDocumento,
q1.NumDocumentoExt,
q1.IdEncab,
q1.IdDocumento,
q1.NomZona1,
LTRIM(RTRIM(q1.DescripNum +  ' ' + q1.DescripNum2)) AS DescripNum,
CASE WHEN q1.Dias BETWEEN @PorVencerCol1Ini AND @PorVencerCol1Fin THEN q1.Saldo ELSE 0 END PorVencerCol1,
CASE WHEN q1.Dias BETWEEN @PorVencerCol2Ini AND @PorVencerCol2Fin THEN q1.Saldo ELSE 0 END PorVencerCol2,
CASE WHEN q1.Dias BETWEEN @PorVencerCol3Ini AND @PorVencerCol3Fin THEN q1.Saldo ELSE 0 END PorVencerCol3,
CASE WHEN q1.Dias BETWEEN @PorVencerCol4Ini AND @PorVencerCol4Fin THEN q1.Saldo ELSE 0 END PorVencerCol4,
CASE WHEN q1.Dias BETWEEN @PorVencerCol5Ini AND @PorVencerCol5Fin THEN q1.Saldo ELSE 0 END PorVencerCol5,
CASE WHEN q1.Dias BETWEEN @PorVencerCol6Ini AND @PorVencerCol6Fin THEN q1.Saldo ELSE 0 END PorVencerCol6,
CASE WHEN q1.Dias BETWEEN @VencidaCol1Ini AND @VencidaCol1Fin THEN q1.Saldo ELSE 0 END VencidaCol1,
CASE WHEN q1.Dias BETWEEN @VencidaCol2Ini AND @VencidaCol2Fin THEN q1.Saldo ELSE 0 END VencidaCol2,
CASE WHEN q1.Dias BETWEEN @VencidaCol3Ini AND @VencidaCol3Fin THEN q1.Saldo ELSE 0 END VencidaCol3,
CASE WHEN q1.Dias BETWEEN @VencidaCol4Ini AND @VencidaCol4Fin THEN q1.Saldo ELSE 0 END VencidaCol4,
CASE WHEN q1.Dias BETWEEN @VencidaCol5Ini AND @VencidaCol5Fin THEN q1.Saldo ELSE 0 END VencidaCol5,
CASE WHEN q1.Dias BETWEEN @VencidaCol6Ini AND @VencidaCol6Fin THEN q1.Saldo ELSE 0 END VencidaCol6,
q1.SaldoExt,
q1.ValorTRM,
q1.NomMoneda1,
CASE WHEN q1.Dias BETWEEN @PorVencerCol1Ini AND @PorVencerCol1Fin THEN q1.SaldoExt ELSE 0 END PorVencerCol1Ext,
CASE WHEN q1.Dias BETWEEN @PorVencerCol2Ini AND @PorVencerCol2Fin THEN q1.SaldoExt ELSE 0 END PorVencerCol2Ext,
CASE WHEN q1.Dias BETWEEN @PorVencerCol3Ini AND @PorVencerCol3Fin THEN q1.SaldoExt ELSE 0 END PorVencerCol3Ext,
CASE WHEN q1.Dias BETWEEN @PorVencerCol4Ini AND @PorVencerCol4Fin THEN q1.SaldoExt ELSE 0 END PorVencerCol4Ext,
CASE WHEN q1.Dias BETWEEN @PorVencerCol5Ini AND @PorVencerCol5Fin THEN q1.SaldoExt ELSE 0 END PorVencerCol5Ext,
CASE WHEN q1.Dias BETWEEN @PorVencerCol6Ini AND @PorVencerCol6Fin THEN q1.SaldoExt ELSE 0 END PorVencerCol6Ext,
CASE WHEN q1.Dias BETWEEN @VencidaCol1Ini AND @VencidaCol1Fin THEN q1.SaldoExt ELSE 0 END VencidaCol1Ext,
CASE WHEN q1.Dias BETWEEN @VencidaCol2Ini AND @VencidaCol2Fin THEN q1.SaldoExt ELSE 0 END VencidaCol2Ext,
CASE WHEN q1.Dias BETWEEN @VencidaCol3Ini AND @VencidaCol3Fin THEN q1.SaldoExt ELSE 0 END VencidaCol3Ext,
CASE WHEN q1.Dias BETWEEN @VencidaCol4Ini AND @VencidaCol4Fin THEN q1.SaldoExt ELSE 0 END VencidaCol4Ext,
CASE WHEN q1.Dias BETWEEN @VencidaCol5Ini AND @VencidaCol5Fin THEN q1.SaldoExt ELSE 0 END VencidaCol5Ext,
CASE WHEN q1.Dias BETWEEN @VencidaCol6Ini AND @VencidaCol6Fin THEN q1.SaldoExt ELSE 0 END VencidaCol6Ext,
CreditoDet,DebitoDet, DebitoDet-CreditoDet AS SaldoDet,
NomAgrup1,NomAgrup2,NomAgrup3,
Direccion,Telefonos,Celular,NomCiudad,EMail,[Intereses],[DocReferencia],Identificacion,
TasaMoraParteSuperior,TasaMoraParteInferior,Saldo*((TasaMoraParteSuperior/TasaMoraParteInferior)/100)*Dias as TarifaMora,
DirDocCompleta,Nota,
q1.NomCompletoVend,
q1.IdentificacionVend,
q1.SaldoIni,
q1.SaldoIniExt

FROM
(
	SELECT 
	Cta.CodCuenta, 
	Cta.NomCuenta, 
	Cta.IdCuentaTipo, 
	CASE WHEN IdCuentaTipo = 1 THEN 'COBRAR' ELSE 'PAGAR' END AS Tipo, 
	Saldos.IdAbonaDoc, 
	Saldos.IdCliente, 
	Saldos.Saldo, 
	Saldos.Vence as Vence,
	DATEDIFF(day,Saldos.Vence,@FechaFinT) AS Dias,
	Cli.Nombres, 
	Cli.Apellidos, 
	LTRIM(RTRIM(Cli.Apellidos + ' ' + Cli.Nombres)) AS NomCompleto,
	Doc.CodDocumento, 
	Enc.Fecha,
	Enc.IdPrefijo, 
	Enc.NumDocumento,
	Enc.NumDocumentoExt, 
	Enc.IdEncab,
	Doc.IdDocumento,
	LTRIM(RTRIM(Doc.CodDocumento + ' ' + COALESCE (Enc.IdPrefijo, ''))) + ' ' + CAST(Enc.NumDocumento AS NVARCHAR(200)) AS DescripNum,
	CASE WHEN Enc.IdDocumento = 17 THEN Enc_C.Nota ELSE '' END AS DescripNum2,
	NomZona1,
	Saldos.SaldoExt,
	Enc_C.ValorTRM,
	Mon.NomMoneda1,
	Enc_CDet.Credito as CreditoDet,
	Enc_CDet.Debito as DebitoDet,
	NomAgrup1,NomAgrup2,NomAgrup3,
	dir.Direccion,dir.Telefonos,dir.Celular,dir.NomCiudad,dir.EMail,det.[Intereses],Enc_C.[DocReferencia],Cli.Identificacion,
	Cli.TasaMoraParteSuperior,Cli.TasaMoraParteInferior,
	cast(coalesce(dirDoc.Nota,'') as nvarchar(20))+'-'+ coalesce(dirDoc.NomCiudad,'') +'-'+ dirDoc.Direccion as DirDocCompleta,
	Enc.Nota,
    LTRIM(RTRIM(CliV.Apellidos + ' ' + CliV.Nombres)) AS NomCompletoVend,
	CliV.Identificacion as IdentificacionVend,
	(Enc_C.Debito - Enc_C.Credito) AS SaldoIni,
	(Enc_C.CreditoExt-Enc_C.DebitoExt) AS SaldoIniExt
	FROM
	(
		SELECT EncCont.IdAbonaDoc, EncCont1.IdCliente, cast(EncCont1.Vence as date) AS Vence, EncCont1.IdCentroCosto, SUM(EncCont.Debito - EncCont.Credito) AS Saldo,
		SUM( EncCont.CreditoExt-EncCont.DebitoExt) AS SaldoExt
		FROM   
		dbo.Encabezados_Cont AS EncCont INNER JOIN
        dbo.Encabezados_Cont AS EncCont1 ON EncCont.IdAbonaDoc = EncCont1.IdEncabCont INNER JOIN
        dbo.Cuentas AS Cta ON EncCont.IdCuenta = Cta.IdCuenta INNER JOIN
        dbo.Encabezados AS Enc ON EncCont.IdEncab = Enc.IdEncab INNER JOIN
        dbo.Cuentas_Tipos ON Cta.IdCuentaTipo = dbo.Cuentas_Tipos.IdCuentaTipo INNER JOIN
        dbo.Cuentas_Clases ON dbo.Cuentas_Tipos.IdClase = dbo.Cuentas_Clases.IdClase INNER JOIN
        dbo.Encabezados AS Enc2 ON EncCont1.IdEncab = Enc2.IdEncab
		INNER JOIN (select number from iter$simple_intlist_to_tbl(@IdCuentaTipos)) T1 on T1.number=Cta.IdCuentaTipo
		INNER JOIN (select number from iter$simple_intlist_to_tbl(@IdEmpresas)) T2 on T2.number=Enc.IdEmpresa
		WHERE
		Cta.CodCuenta Between coalesce(@CuentaIni,Cta.CodCuenta) And coalesce(@CuentaFin,Cta.CodCuenta) AND
		Enc.EsAnulado = 0 AND
		Enc2.EsAnulado = 0 AND
		EncCont.EsNotGAAP=coalesce(@EsNotGAAP,EncCont.EsNotGAAP) and EncCont.EsIFRS=coalesce(@EsIFRS, EncCont.EsIFRS) and 
		Enc.Fecha < @FechaFinT
	    GROUP BY EncCont.IdAbonaDoc, EncCont1.IdCliente, cast(EncCont1.Vence as date), EncCont1.IdCentroCosto
		HAVING (SUM(EncCont.Credito - EncCont.Debito) <> coalesce(@EsMostrarPagos,SUM(EncCont.Credito - EncCont.Debito)+1))
	) Saldos
	INNER JOIN
	dbo.Encabezados_Cont AS Enc_C ON Saldos.IdAbonaDoc = Enc_C.IdEncabCont INNER JOIN
	dbo.Cuentas AS Cta ON Enc_C.IdCuenta = Cta.IdCuenta INNER JOIN
	dbo.VClientes2 AS Cli ON Saldos.IdCliente = Cli.IdCliente INNER JOIN
	dbo.Encabezados AS Enc ON Enc_C.IdEncab = Enc.IdEncab INNER JOIN
	dbo.Documentos AS Doc ON Enc.IdDocumento = Doc.IdDocumento LEFT JOIN
	dbo.VClientes2 AS CliV ON Enc.IdClienteVend = CliV.IdCliente LEFT JOIN
	dbo.Clientes_Zona1 zon1 ON Cli.IdZona1=zon1.IdZona1 LEFT JOIN
	dbo.Monedas as Mon on Enc_C.IdMoneda=Mon.IdMoneda  LEFT JOIN
	dbo.Encabezados_Cont AS Enc_CDet ON Saldos.IdAbonaDoc = Enc_CDet.IdAbonaDocDet LEFT JOIN
	[dbo].[Clientes_Agrup1] agrup1 ON Cli.IdAgrup1=agrup1.IdAgrup1 LEFT JOIN
	[dbo].[Clientes_Agrup2] agrup2 ON Cli.IdAgrup2=agrup2.IdAgrup2 LEFT JOIN
	[dbo].[Clientes_Agrup3] agrup3 ON Cli.IdAgrup3=agrup3.IdAgrup3 LEFT JOIN
    [dbo].[VClientesDir] dir ON Cli.IdCliente=dir.IdCliente LEFT JOIN
    [dbo].[VClientesDir_DetFin] dirDoc ON Enc.IdCliente1_IdDir=dirDoc.IdClienteDir LEFT JOIN
	[dbo].[IFRS_Intervalos_Deterioro] det ON coalesce(Cli.IdRiesgo,-1)=coalesce(det.IdRiesgo,-1)
	and coalesce(DATEDIFF(day,Saldos.Vence,@FechaFinT),-100) between det.DiasIni and det.DiasFin
	WHERE
	(@IdCliente is null OR Saldos.IdCliente=@IdCliente)AND 
	(@IdVendedor is null OR Enc.IdClienteVend=@IdVendedor)AND 
	(@IdSucursal is null OR Enc.IdSucursal=@IdSucursal)AND 
	(@IdCentroCosto is null OR Enc_C.IdCentroCosto=@IdCentroCosto)AND 
     Enc.Fecha between COALESCE(@FechaIniRT,Enc.Fecha) and  COALESCE(@FechaFinRT,Enc.Fecha) and
	(@IdDir is null OR Enc.IdCliente1_IdDir=@IdDir) 
)
q1
OPTION(RECOMPILE)
END
GO

GO
PRINT N'Update complete.';

--Actualizar datos de la version
IF NOT EXISTS (SELECT 1 FROM dbo.ZiurVersiones WHERE NumVersion = 963)
BEGIN
    INSERT INTO dbo.ZiurVersiones (IdVersion, NumVersion, Descripcion)
    VALUES (373, 963, 'Mejora auditoria e inclusion campo en cxc');
END
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
