--Hash:64180BD20D2933EB7759E86CE75F60E5

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

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


GO
/*
Ayuda rápida:
Este procedimiento solo ejecuta la depuración y no devuelve conjuntos de registros.
El resultado se consulta por los parámetros OUTPUT:
- @Exito = 1: toda la ejecución terminó bien.
- @Exito = 0: ocurrió un error y se hizo rollback total.
@IdDocumentos:
- CSV de IdDocumento.
- NULL o vacío: no elimina documentos.
- Si se envía, exige @InfoUsuario.
@GruposEliminar:
- CSV de códigos de grupos globales.
- NULL o vacío: no elimina grupos globales.
- Se pueden combinar varios códigos en la misma llamada.
Grupos de eliminación total:
1: ConciliacionBanc_Encabezados
2: Inventarios_ActivosFijos_MovContable
3: Nomina_NE_Encabezados
4: Radian_Encabezados
5: Encabezados_Mov_CostoProm
6: Auditoría documental (Audit_Encabezados, Audit_Encabezados_Cont, Audit_Encabezados_Mov)
Ejemplos:
- Solo documentos:
  EXEC dbo.DatabaseDeleteAll
  	@IdDocumentos = N'1,2,17',
  	@InfoUsuario = N'1,DEPURACION',
  	@Exito = @Exito OUTPUT,
  	@Codigo = @Codigo OUTPUT,
  	@Error = @Error OUTPUT
- Solo grupos globales:
  EXEC dbo.DatabaseDeleteAll
  	@GruposEliminar = N'1,5,6',
  	@Exito = @Exito OUTPUT,
  	@Codigo = @Codigo OUTPUT,
  	@Error = @Error OUTPUT
- Documentos + grupos:
  EXEC dbo.DatabaseDeleteAll
  	@IdDocumentos = N'2',
  	@GruposEliminar = N'5',
  	@InfoUsuario = N'1,DEPURACION',
  	@Exito = @Exito OUTPUT,
  	@Codigo = @Codigo OUTPUT,
  	@Error = @Error OUTPUT
*/
ALTER PROCEDURE [dbo].[DatabaseDeleteAll]
	@IdDocumentos NVARCHAR(MAX) = NULL,
	@GruposEliminar NVARCHAR(MAX) = NULL,
	@InfoUsuario NVARCHAR(100) = NULL,
	@Exito INT = 0 OUTPUT,
	@Codigo INT = 0 OUTPUT,
	@Error NVARCHAR(4000) = NULL OUTPUT
AS
BEGIN
	SET NOCOUNT ON
	SET XACT_ABORT ON
	DECLARE
		@TieneDocumentos BIT,
		@TieneGrupos BIT,
		@ContextoAnterior VARBINARY(128),
		@ContextoCosto BINARY(128),
		@ResultadoLock INT,
		@LockTomado BIT
	SET @Exito = 0
	SET @Codigo = 0
	SET @Error = NULL
	SET @LockTomado = 0
	SET @TieneDocumentos = CASE WHEN NULLIF(LTRIM(RTRIM(COALESCE(@IdDocumentos, N''))), N'') IS NULL THEN 0 ELSE 1 END
	SET @TieneGrupos = CASE WHEN NULLIF(LTRIM(RTRIM(COALESCE(@GruposEliminar, N''))), N'') IS NULL THEN 0 ELSE 1 END
	SET @ContextoCosto = CAST(N'1' AS BINARY(128))
	SET @ContextoAnterior = COALESCE(CONTEXT_INFO(), 0x)
	CREATE TABLE #Documentos
	(
		IdDocumento INT NOT NULL PRIMARY KEY
	)
	CREATE TABLE #GruposEliminar
	(
		CodigoGrupo INT NOT NULL PRIMARY KEY
	)
	IF @TieneGrupos = 1
	BEGIN
		BEGIN TRY
			INSERT INTO #GruposEliminar (CodigoGrupo)
			SELECT DISTINCT number
			FROM dbo.iter$simple_intlist_to_tbl(@GruposEliminar)
		END TRY
		BEGIN CATCH
			SET @Codigo = ERROR_NUMBER()
			SET @Error = N'La lista @GruposEliminar contiene un valor inválido. ' + ERROR_MESSAGE()
			RETURN
		END CATCH
		IF EXISTS (SELECT 1 FROM #GruposEliminar WHERE CodigoGrupo NOT BETWEEN 1 AND 6)
		BEGIN
			SET @Codigo = 50008
			SET @Error = N'@GruposEliminar solo admite los códigos 1, 2, 3, 4, 5 y 6.'
			RETURN
		END
	END
	IF @TieneDocumentos = 1
	BEGIN
		BEGIN TRY
			INSERT INTO #Documentos (IdDocumento)
			SELECT DISTINCT number
			FROM dbo.iter$simple_intlist_to_tbl(@IdDocumentos)
		END TRY
		BEGIN CATCH
			SET @Codigo = ERROR_NUMBER()
			SET @Error = N'La lista @IdDocumentos contiene un valor inválido. ' + ERROR_MESSAGE()
			RETURN
		END CATCH
		IF NOT EXISTS (SELECT 1 FROM #Documentos)
		BEGIN
			SET @Codigo = 50002
			SET @Error = N'Debe indicar al menos un IdDocumento válido.'
			RETURN
		END
		IF EXISTS
		(
			SELECT 1
			FROM #Documentos AS Sel
			LEFT JOIN dbo.Documentos AS Doc ON Doc.IdDocumento = Sel.IdDocumento
			WHERE Doc.IdDocumento IS NULL
		)
		BEGIN
			SET @Codigo = 50003
			SET @Error = N'Uno o más IdDocumento no existen en dbo.Documentos.'
			RETURN
		END
	END
	IF @TieneDocumentos = 0
		AND NOT EXISTS (SELECT 1 FROM #GruposEliminar)
	BEGIN
		SET @Codigo = 50004
		SET @Error = N'Debe indicar @IdDocumentos o activar al menos un grupo de eliminación.'
		RETURN
	END
	IF @TieneDocumentos = 1 AND NULLIF(LTRIM(RTRIM(COALESCE(@InfoUsuario, N''))), N'') IS NULL
	BEGIN
		SET @Codigo = 50006
		SET @Error = N'@InfoUsuario es obligatorio cuando se eliminan documentos.'
		RETURN
	END
	EXEC @ResultadoLock = sys.sp_getapplock
		@Resource = N'DatabaseDeleteAll',
		@LockMode = N'Exclusive',
		@LockOwner = N'Session',
		@LockTimeout = 0
	IF @ResultadoLock >= 0
		SET @LockTomado = 1
	IF @ResultadoLock < 0
	BEGIN
		SET @Codigo = 50007
		SET @Error = N'Ya existe otra depuración de datos transaccionales en ejecución.'
		RETURN
	END
	BEGIN TRY
		BEGIN TRAN
		-- Grupo 1: ConciliacionBanc_Encabezados
		IF EXISTS (SELECT 1 FROM #GruposEliminar WHERE CodigoGrupo = 1)
		BEGIN
			-- Se desagrupan referencias sobrevivientes antes del borrado masivo para evitar vínculos colgantes.
			UPDATE dbo.ConciliacionBanc_MovContable
			SET IdAgrup = NULL
			WHERE IdAgrup IS NOT NULL
			UPDATE dbo.ConciliacionBanc_MovExtracto
			SET IdAgrup = NULL
			WHERE IdAgrup IS NOT NULL
			DELETE FROM dbo.ConciliacionBanc_Cruces
			DELETE FROM dbo.ConciliacionBanc_MovContable
			DELETE FROM dbo.ConciliacionBanc_MovExtracto
			DELETE FROM dbo.ConciliacionBanc_Configuracion
			DELETE FROM dbo.ConciliacionBanc_Comodines
			DELETE FROM dbo.ConciliacionBanc_Encabezados
		END
		-- Grupo 2: Inventarios_ActivosFijos_MovContable
		IF EXISTS (SELECT 1 FROM #GruposEliminar WHERE CodigoGrupo = 2)
		BEGIN
			-- Se desagrupan referencias sobrevivientes antes del borrado masivo para evitar vínculos colgantes.
			UPDATE dbo.Inventarios_ActivosFijos_MovContable
			SET IdAgrup = NULL
			WHERE IdAgrup IS NOT NULL
			DELETE FROM dbo.Inventarios_ActivosFijos_Cruces
			DELETE FROM dbo.Inventarios_ActivosFijos_MovContable
		END
		-- Grupo 3: Nomina_NE_Encabezados
		IF EXISTS (SELECT 1 FROM #GruposEliminar WHERE CodigoGrupo = 3)
		BEGIN
			UPDATE dbo.Nomina_NE_Detalles
			SET IdDetalleRel = NULL
			WHERE IdDetalleRel IS NOT NULL
			DELETE FROM dbo.Nomina_NE_Detalles
			DELETE FROM dbo.Nomina_NE_Encabezados
		END
		-- Grupo 4: Radian_Encabezados
		IF EXISTS (SELECT 1 FROM #GruposEliminar WHERE CodigoGrupo = 4)
		BEGIN
			DELETE FROM dbo.Radian_Encabezados
		END
		-- Grupo 5: Encabezados_Mov_CostoProm
		IF EXISTS (SELECT 1 FROM #GruposEliminar WHERE CodigoGrupo = 5)
		BEGIN
			-- TRG_AuditCosto usa CONTEXT_INFO; se marca temporalmente esta sesión para permitir la limpieza completa.
			SET CONTEXT_INFO @ContextoCosto
			DELETE FROM dbo.Encabezados_Mov_CostoProm_Historicos
			DELETE FROM dbo.Encabezados_Mov_CostoProm
			DELETE FROM dbo.Encabezados_Mov_CostoProm_Eliminados
			SET CONTEXT_INFO @ContextoAnterior
		END
		-- Grupo 6: Auditoria documental
		IF EXISTS (SELECT 1 FROM #GruposEliminar WHERE CodigoGrupo = 6)
		BEGIN
			DELETE FROM dbo.Audit_Encabezados_Mov
			DELETE FROM dbo.Audit_Encabezados_Cont
			DELETE FROM dbo.Audit_Encabezados
		END
		IF @TieneDocumentos = 1
		BEGIN
			CREATE TABLE #EncabezadosObjetivo
			(
				IdEncab INT NOT NULL PRIMARY KEY,
				IdDocumento INT NOT NULL
			)
			CREATE TABLE #EncabezadosAuditoria
			(
				IdEncab INT NOT NULL PRIMARY KEY
			)
			CREATE TABLE #MovimientosObjetivo
			(
				IdEncabMov INT NOT NULL PRIMARY KEY,
				IdEncab INT NOT NULL
			)
			CREATE TABLE #MovimientosAuditoria
			(
				IdEncabMov INT NOT NULL PRIMARY KEY
			)
			CREATE TABLE #ContablesObjetivo
			(
				IdEncabCont INT NOT NULL PRIMARY KEY,
				IdEncab INT NOT NULL
			)
			CREATE TABLE #RutasObjetivo
			(
				IdRutaEncMov INT NOT NULL PRIMARY KEY
			)
			CREATE TABLE #NominaMovimientosObjetivo
			(
				IdEncabNomMov INT NOT NULL PRIMARY KEY
			)
			CREATE TABLE #ConciliacionMovimientosObjetivo
			(
				IdMovCont INT NOT NULL PRIMARY KEY
			)
			CREATE TABLE #ActivosMovimientosObjetivo
			(
				IdMovCont INT NOT NULL PRIMARY KEY
			)
			EXEC dbo.CrearContextoUsuario @InfoUsuario
			INSERT INTO #EncabezadosObjetivo (IdEncab, IdDocumento)
			SELECT Enc.IdEncab, Enc.IdDocumento
			FROM dbo.Encabezados AS Enc WITH (UPDLOCK, HOLDLOCK)
			INNER JOIN #Documentos AS Doc ON Doc.IdDocumento = Enc.IdDocumento
			INSERT INTO #EncabezadosAuditoria (IdEncab)
			SELECT IdEncab
			FROM #EncabezadosObjetivo
			INSERT INTO #EncabezadosAuditoria (IdEncab)
			SELECT DISTINCT Aud.IdEncab
			FROM dbo.Audit_Encabezados AS Aud
			INNER JOIN #Documentos AS Doc ON Doc.IdDocumento = Aud.IdDocumento
			WHERE NOT EXISTS
			(
				SELECT 1
				FROM #EncabezadosAuditoria AS Existente
				WHERE Existente.IdEncab = Aud.IdEncab
			)
			INSERT INTO #MovimientosObjetivo (IdEncabMov, IdEncab)
			SELECT Mov.IdEncabMov, Mov.IdEncab
			FROM dbo.Encabezados_Mov AS Mov
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Mov.IdEncab
			INSERT INTO #MovimientosAuditoria (IdEncabMov)
			SELECT IdEncabMov
			FROM #MovimientosObjetivo
			INSERT INTO #MovimientosAuditoria (IdEncabMov)
			SELECT DISTINCT Aud.IdEncabMov
			FROM dbo.Audit_Encabezados_Mov AS Aud
			INNER JOIN #EncabezadosAuditoria AS Enc ON Enc.IdEncab = Aud.IdEncab
			WHERE NOT EXISTS
			(
				SELECT 1
				FROM #MovimientosAuditoria AS Existente
				WHERE Existente.IdEncabMov = Aud.IdEncabMov
			)
			INSERT INTO #ContablesObjetivo (IdEncabCont, IdEncab)
			SELECT Cont.IdEncabCont, Cont.IdEncab
			FROM dbo.Encabezados_Cont AS Cont
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Cont.IdEncab
			INSERT INTO #RutasObjetivo (IdRutaEncMov)
			SELECT Ruta.IdRutaEncMov
			FROM dbo.Encabezados_Mov_RutasProduccion AS Ruta
			INNER JOIN #MovimientosObjetivo AS Mov ON Mov.IdEncabMov = Ruta.IdEncabMov
			INSERT INTO #NominaMovimientosObjetivo (IdEncabNomMov)
			SELECT Nom.IdEncabNomMov
			FROM dbo.Nomina_Movimientos AS Nom
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Nom.IdEncab
			INSERT INTO #ConciliacionMovimientosObjetivo (IdMovCont)
			SELECT DISTINCT Mov.IdMovCont
			FROM dbo.ConciliacionBanc_MovContable AS Mov
			INNER JOIN #ContablesObjetivo AS Cont ON Cont.IdEncabCont = Mov.IdEncabCont
			INSERT INTO #ActivosMovimientosObjetivo (IdMovCont)
			SELECT DISTINCT Mov.IdMovCont
			FROM dbo.Inventarios_ActivosFijos_MovContable AS Mov
			INNER JOIN #ContablesObjetivo AS Cont ON Cont.IdEncabCont = Mov.IdEncabCont
			UPDATE Mov
			SET IdEncabMov2 = NULL
			FROM dbo.Encabezados_Mov AS Mov
			INNER JOIN #MovimientosObjetivo AS Ref ON Ref.IdEncabMov = Mov.IdEncabMov2
			WHERE NOT EXISTS
			(
				SELECT 1
				FROM #MovimientosObjetivo AS Eliminar
				WHERE Eliminar.IdEncabMov = Mov.IdEncabMov
			)
			UPDATE Mov
			SET
				ValorUnitario = CASE
					WHEN EncRef.IdDocumento <> 45 AND Mov.ValorUnitarioOriginal IS NOT NULL THEN Mov.ValorUnitarioOriginal
					ELSE Mov.ValorUnitario
				END,
				ValorUnitarioOriginal = CASE WHEN EncRef.IdDocumento <> 45 THEN NULL ELSE Mov.ValorUnitarioOriginal END,
				IdEncabMov3 = NULL
			FROM dbo.Encabezados_Mov AS Mov
			INNER JOIN #MovimientosObjetivo AS Ref ON Ref.IdEncabMov = Mov.IdEncabMov3
			INNER JOIN #EncabezadosObjetivo AS EncRef ON EncRef.IdEncab = Ref.IdEncab
			WHERE NOT EXISTS
			(
				SELECT 1
				FROM #MovimientosObjetivo AS Eliminar
				WHERE Eliminar.IdEncabMov = Mov.IdEncabMov
			)
			UPDATE Mov
			SET IdRutaEncMov = NULL
			FROM dbo.Encabezados_Mov AS Mov
			INNER JOIN #RutasObjetivo AS Ruta ON Ruta.IdRutaEncMov = Mov.IdRutaEncMov
			UPDATE Cont
			SET IdEncabMov = NULL
			FROM dbo.Encabezados_Cont AS Cont
			INNER JOIN #MovimientosObjetivo AS Mov ON Mov.IdEncabMov = Cont.IdEncabMov
			WHERE NOT EXISTS
			(
				SELECT 1
				FROM #ContablesObjetivo AS Eliminar
				WHERE Eliminar.IdEncabCont = Cont.IdEncabCont
			)
			UPDATE Cont
			SET
				IdAbonaDoc = CASE WHEN Doc.IdEncabCont IS NOT NULL THEN NULL ELSE Cont.IdAbonaDoc END,
				IdAbonaDif = CASE WHEN Dif.IdEncabCont IS NOT NULL THEN NULL ELSE Cont.IdAbonaDif END,
				IdAbonaCheque = CASE WHEN Cheque.IdEncabCont IS NOT NULL THEN NULL ELSE Cont.IdAbonaCheque END,
				IdAbonaDocDet = CASE WHEN Det.IdEncabCont IS NOT NULL THEN NULL ELSE Cont.IdAbonaDocDet END,
				IdEncabContAgrup = CASE WHEN Agrup.IdEncabCont IS NOT NULL THEN NULL ELSE Cont.IdEncabContAgrup END
			FROM dbo.Encabezados_Cont AS Cont
			LEFT JOIN #ContablesObjetivo AS Doc ON Doc.IdEncabCont = Cont.IdAbonaDoc
			LEFT JOIN #ContablesObjetivo AS Dif ON Dif.IdEncabCont = Cont.IdAbonaDif
			LEFT JOIN #ContablesObjetivo AS Cheque ON Cheque.IdEncabCont = Cont.IdAbonaCheque
			LEFT JOIN #ContablesObjetivo AS Det ON Det.IdEncabCont = Cont.IdAbonaDocDet
			LEFT JOIN #ContablesObjetivo AS Agrup ON Agrup.IdEncabCont = Cont.IdEncabContAgrup
			WHERE (Doc.IdEncabCont IS NOT NULL OR Dif.IdEncabCont IS NOT NULL OR Cheque.IdEncabCont IS NOT NULL OR Det.IdEncabCont IS NOT NULL OR Agrup.IdEncabCont IS NOT NULL)
				AND NOT EXISTS
				(
					SELECT 1
					FROM #ContablesObjetivo AS Eliminar
					WHERE Eliminar.IdEncabCont = Cont.IdEncabCont
				)
			UPDATE Nom
			SET IdEncabNomMovBase = NULL
			FROM dbo.Nomina_Movimientos AS Nom
			INNER JOIN #NominaMovimientosObjetivo AS Ref ON Ref.IdEncabNomMov = Nom.IdEncabNomMovBase
			WHERE NOT EXISTS
			(
				SELECT 1
				FROM #NominaMovimientosObjetivo AS Eliminar
				WHERE Eliminar.IdEncabNomMov = Nom.IdEncabNomMov
			)
			UPDATE Mov
			SET IdAgrup = NULL
			FROM dbo.ConciliacionBanc_MovContable AS Mov
			INNER JOIN #ConciliacionMovimientosObjetivo AS Ref ON Ref.IdMovCont = Mov.IdAgrup
			WHERE NOT EXISTS
			(
				SELECT 1
				FROM #ConciliacionMovimientosObjetivo AS Eliminar
				WHERE Eliminar.IdMovCont = Mov.IdMovCont
			)
			DELETE Cruce
			FROM dbo.ConciliacionBanc_Cruces AS Cruce
			INNER JOIN #ConciliacionMovimientosObjetivo AS Mov ON Mov.IdMovCont = Cruce.IdMovCont
			DELETE Mov
			FROM dbo.ConciliacionBanc_MovContable AS Mov
			INNER JOIN #ConciliacionMovimientosObjetivo AS Eliminar ON Eliminar.IdMovCont = Mov.IdMovCont
			UPDATE Mov
			SET IdAgrup = NULL
			FROM dbo.Inventarios_ActivosFijos_MovContable AS Mov
			INNER JOIN #ActivosMovimientosObjetivo AS Ref ON Ref.IdMovCont = Mov.IdAgrup
			WHERE NOT EXISTS
			(
				SELECT 1
				FROM #ActivosMovimientosObjetivo AS Eliminar
				WHERE Eliminar.IdMovCont = Mov.IdMovCont
			)
			DELETE Cruce
			FROM dbo.Inventarios_ActivosFijos_Cruces AS Cruce
			INNER JOIN #ActivosMovimientosObjetivo AS Mov ON Mov.IdMovCont = Cruce.IdMovCont
			DELETE Mov
			FROM dbo.Inventarios_ActivosFijos_MovContable AS Mov
			INNER JOIN #ActivosMovimientosObjetivo AS Eliminar ON Eliminar.IdMovCont = Mov.IdMovCont
			UPDATE Doc
			SET IdEncab = NULL
			FROM dbo.DocElectronicos AS Doc
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Doc.IdEncab
			UPDATE Rec
			SET IdEncab = NULL
			FROM dbo.Clientes_Prospectos_DocRecursos AS Rec
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Rec.IdEncab
			UPDATE Rip
			SET IdEncabMov = NULL
			FROM dbo.Rips_Encabezados AS Rip
			INNER JOIN #MovimientosObjetivo AS Mov ON Mov.IdEncabMov = Rip.IdEncabMov
			DELETE Cierre
			FROM dbo.Encabezados_Cierres_Docs_Cont AS Cierre
			INNER JOIN #ContablesObjetivo AS Cont ON Cont.IdEncabCont = Cierre.IdEncabCont
			DELETE Especial
			FROM dbo.Encabezados_ContEspecial AS Especial
			INNER JOIN #ContablesObjetivo AS Cont ON Cont.IdEncabCont = Especial.IdEncabCont
			DELETE Medio
			FROM dbo.MediosMag_IncluirMovContables AS Medio
			INNER JOIN #ContablesObjetivo AS Cont ON Cont.IdEncabCont = Medio.IdEncabCont
			DELETE Cont
			FROM dbo.Encabezados_Cont AS Cont
			INNER JOIN #ContablesObjetivo AS Eliminar ON Eliminar.IdEncabCont = Cont.IdEncabCont
			DELETE Cruce
			FROM dbo.Encabezados_Mov_Cruces AS Cruce
			WHERE EXISTS
			(
				SELECT 1
				FROM #MovimientosObjetivo AS Mov
				WHERE Mov.IdEncabMov = Cruce.IdEncabMov1 OR Mov.IdEncabMov = Cruce.IdEncabMov2
			)
			DELETE Historico
			FROM dbo.Encabezados_Mov_CostoProm_Historicos AS Historico
			INNER JOIN #MovimientosObjetivo AS Mov ON Mov.IdEncabMov = Historico.IdEncabMov
			DELETE Costo
			FROM dbo.Encabezados_Mov_CostoProm AS Costo
			INNER JOIN #MovimientosObjetivo AS Mov ON Mov.IdEncabMov = Costo.IdEncabMov
			DELETE Especial
			FROM dbo.Encabezados_MovEspecial AS Especial
			INNER JOIN #MovimientosObjetivo AS Mov ON Mov.IdEncabMov = Especial.IdEncabMov
			DELETE Cierre
			FROM dbo.Encabezados_Cierres_Docs AS Cierre
			INNER JOIN #MovimientosObjetivo AS Mov ON Mov.IdEncabMov = Cierre.IdEncabMov
			DELETE Ruta
			FROM dbo.Encabezados_Mov_RutasProduccion AS Ruta
			INNER JOIN #RutasObjetivo AS Eliminar ON Eliminar.IdRutaEncMov = Ruta.IdRutaEncMov
			DELETE Mov
			FROM dbo.Encabezados_Mov AS Mov
			INNER JOIN #MovimientosObjetivo AS Eliminar ON Eliminar.IdEncabMov = Mov.IdEncabMov
			DELETE Nom
			FROM dbo.Nomina_Movimientos AS Nom
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Nom.IdEncab
			DELETE Nota
			FROM dbo.Nomina_Notas AS Nota
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Nota.IdEncab
			DELETE Rete
			FROM dbo.Nomina_Retefuente AS Rete
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Rete.IdEncab
			DELETE Aporte
			FROM dbo.Encabezados_Aportes_Fijos AS Aporte
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Aporte.IdEncab
			DELETE Cliente
			FROM dbo.Encabezados_Clientes AS Cliente
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Cliente.IdEncab
			DELETE Recurso
			FROM dbo.Encabezados_DocRecursos AS Recurso
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Recurso.IdEncab
			DELETE Pago
			FROM dbo.Encabezados_PagoDet AS Pago
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Pago.IdEncab
			DELETE Especial
			FROM dbo.EncabezadosEspecial AS Especial
			INNER JOIN #EncabezadosObjetivo AS Enc ON Enc.IdEncab = Especial.IdEncab
			DELETE Llave
			FROM dbo.Encabezados_Llaves AS Llave
			WHERE Llave.IdDocumento IN (SELECT IdDocumento FROM #Documentos)
				OR Llave.IdEncab IN (SELECT IdEncab FROM #EncabezadosAuditoria)
			DELETE Vence
			FROM dbo.Encabezados_Vencimientos AS Vence
			INNER JOIN #EncabezadosAuditoria AS Enc ON Enc.IdEncab = Vence.IdEncab
			DELETE Enc
			FROM dbo.Encabezados AS Enc
			INNER JOIN #EncabezadosObjetivo AS Eliminar ON Eliminar.IdEncab = Enc.IdEncab
			DELETE Eliminado
			FROM dbo.Encabezados_Mov_CostoProm_Eliminados AS Eliminado
			INNER JOIN #MovimientosAuditoria AS Mov ON Mov.IdEncabMov = Eliminado.IdEncabMov
			DELETE AuditMov
			FROM dbo.Audit_Encabezados_Mov AS AuditMov
			INNER JOIN #EncabezadosAuditoria AS Enc ON Enc.IdEncab = AuditMov.IdEncab
			DELETE AuditCont
			FROM dbo.Audit_Encabezados_Cont AS AuditCont
			INNER JOIN #EncabezadosAuditoria AS Enc ON Enc.IdEncab = AuditCont.IdEncab
			DELETE AuditEnc
			FROM dbo.Audit_Encabezados AS AuditEnc
			WHERE AuditEnc.IdDocumento IN (SELECT IdDocumento FROM #Documentos)
				OR AuditEnc.IdEncab IN (SELECT IdEncab FROM #EncabezadosAuditoria)
		END
		COMMIT TRAN
		SET @Exito = 1
		SET @Codigo = 0
		SET @Error = NULL
	END TRY
	BEGIN CATCH
		IF XACT_STATE() <> 0 ROLLBACK TRAN
		SET CONTEXT_INFO @ContextoAnterior
		SET @Exito = 0
		SET @Codigo = ERROR_NUMBER()
		SET @Error = ERROR_MESSAGE()
	END CATCH
	IF @LockTomado = 1
		EXEC sys.sp_releaseapplock
			@Resource = N'DatabaseDeleteAll',
			@LockOwner = N'Session'
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)]					
	--------------------------------------------------------------------------------------
	*/

IF NOT EXISTS (SELECT 1 FROM dbo.Permisos_Interfaces WHERE IdInterface = 668)
    INSERT INTO dbo.Permisos_Interfaces (IdInterface, NomInterface, EsActivo, NomClase, EsSistema, VideoURL, IdInterfaceParent, EsAuditInsert, EsAuditDelete, EsAuditUpdate)
    VALUES (668, N'Eliminar Datos', 1, N'EliminarDatos', 0, NULL, 668, 0, 0, 0);
GO

IF (NOT EXISTS(SELECT * FROM Menu WHERE IdMenu = 911392))
	INSERT INTO [dbo].[Menu] ([IdMenu],[NumPantalla],[NomMenu],[EsGrupo],[IdMenuPadre],[Orden],[AyudaTexto],[Opcion],[NomForm],[IdImageNormal],[IdImageMouseOver],[IdImageMouseDown],[IdImageMouseDrag],[IdInterface],[EsActivo],[xxxRevisado])
	VALUES (911392,1,'Eliminar Datos',1,10035,1,'Eliminar Datos',1,'EliminarDatos',11104,11104,11104,11104,668,0,0)
GO

IF (NOT EXISTS(SELECT * FROM Permisos_InterfacesPorUsuario WHERE IdInterface = 668))
BEGIN
	INSERT INTO dbo.Permisos_InterfacesPorUsuario (IdUsuario, IdInterface, EsConsultar, EsInsertar, EsActualizar, EsEliminar, EsConsultarDenegar, EsInsertarDenegar, EsActualizarDenegar, EsEliminarDenegar)
	VALUES (2,668,1,1,1,1,0,0,0,0)

	INSERT INTO dbo.Permisos_InterfacesPorUsuario (IdUsuario, IdInterface, EsConsultar, EsInsertar, EsActualizar, EsEliminar, EsConsultarDenegar, EsInsertarDenegar, EsActualizarDenegar, EsEliminarDenegar)
	VALUES (22,668,1,1,1,1,0,0,0,0)

	INSERT INTO dbo.Permisos_InterfacesPorUsuario (IdUsuario, IdInterface, EsConsultar, EsInsertar, EsActualizar, EsEliminar, EsConsultarDenegar, EsInsertarDenegar, EsActualizarDenegar, EsEliminarDenegar)
	VALUES (-103,668,1,1,1,1,0,0,0,0)

	INSERT INTO dbo.Permisos_InterfacesPorUsuario (IdUsuario, IdInterface, EsConsultar, EsInsertar, EsActualizar, EsEliminar, EsConsultarDenegar, EsInsertarDenegar, EsActualizarDenegar, EsEliminarDenegar)
	VALUES (-104,668,1,1,1,1,0,0,0,0)

	INSERT INTO dbo.Permisos_InterfacesPorUsuario (IdUsuario, IdInterface, EsConsultar, EsInsertar, EsActualizar, EsEliminar, EsConsultarDenegar, EsInsertarDenegar, EsActualizarDenegar, EsEliminarDenegar)
	VALUES (-105,668,1,1,1,1,0,0,0,0)

	INSERT INTO dbo.Permisos_InterfacesPorUsuario (IdUsuario, IdInterface, EsConsultar, EsInsertar, EsActualizar, EsEliminar, EsConsultarDenegar, EsInsertarDenegar, EsActualizarDenegar, EsEliminarDenegar)
	VALUES (-106,668,1,1,1,1,0,0,0,0)

	INSERT INTO dbo.Permisos_InterfacesPorUsuario (IdUsuario, IdInterface, EsConsultar, EsInsertar, EsActualizar, EsEliminar, EsConsultarDenegar, EsInsertarDenegar, EsActualizarDenegar, EsEliminarDenegar)
	VALUES (-107,668,1,1,1,1,0,0,0,0)
END

GO

GO
PRINT N'Update complete.';


GO



--Actualizar datos de la version

IF NOT EXISTS (SELECT 1 FROM dbo.ZiurVersiones WHERE NumVersion = 994)
BEGIN
    INSERT INTO dbo.ZiurVersiones (IdVersion, NumVersion, Descripcion)
    VALUES (404, 994, 'Eliminar Datos Tablas');
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
