--Hash:1D65E1FFC19B244A9EAF0248F990D1B3

-- 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 = 985)
BEGIN
    PRINT N'Scripts_985.sql: la version 985 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 < 985
)
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'Modificando Tabla [dbo].[Empresas]...';


GO
IF OBJECT_ID(N'dbo.Empresas', N'U') IS NOT NULL
AND COL_LENGTH(N'dbo.Empresas', N'SubActividad') IS NULL
BEGIN
    ALTER TABLE [dbo].[Empresas]
        ADD [SubActividad] SMALLINT NULL;
END


GO
PRINT N'Creando Desencadenador [dbo].[TRG_NominaNumeracion]...';


GO
IF OBJECT_ID(N'dbo.TRG_NominaNumeracion', N'TR') IS NOT NULL
    DROP TRIGGER dbo.TRG_NominaNumeracion;
GO
CREATE TRIGGER TRG_NominaNumeracion
ON [dbo].[Nomina_NE_Encabezados]
AFTER INSERT
AS
BEGIN
	--Evita que SQL Server devuelva mensajes como “(1 row(s) affected)”. Mejora de rendimiento
	SET NOCOUNT ON;

	--Declara variables 
	DECLARE @IdNomina INT,
			@IdEmp INT,
			@Pref NVARCHAR(10),
			@NumActual INT,
			@NumNuevo INT;

	--inserted es una tabla virtual que contendra los datos recien insertados
	--Cursor recorre cada fila en caso de haber insertado varias filas a la vez
	DECLARE cur CURSOR LOCAL FOR
		SELECT IdNomina, IdEmpresa, IdPrefijo, NumDocumento
		FROM inserted;
	
	--abre el cursor  y carga la primera fila en las variables creadas
	OPEN cur;
	FETCH NEXT FROM cur INTO @IdNomina, @IdEmp, @Pref, @NumActual;

	--Bucle 
	--@@FETCH_STATUS = 0 -> Recorre las filas incertadas 
	WHILE @@FETCH_STATUS = 0
	BEGIN
	--aplica condicion cuando el numero de documento sea 0
		IF @NumActual = 0
		BEGIN
			--Selecciona el numero max encontrado en NumDocumento si es 0 le sumara 1
			--Guarda el numero maximo en @NumNuevo
			SELECT @NumNuevo = COALESCE(MAX(NumDocumento), 0) + 1
			FROM Nomina_NE_Encabezados
			--Filtra por la la empresa y prefijo asignando '' al prefijo si viene vacio
			WHERE IdEmpresa = @IdEmp
				AND COALESCE(IdPrefijo, '') = COALESCE(@Pref, '');
			  
			--Actualizara la tabla asignando el numdocumento filtrado por la nomina
			UPDATE Nomina_NE_Encabezados
			SET NumDocumento = @NumNuevo
			WHERE IdNomina = @IdNomina;
		END
		--Sigue con el siguiente registro o fila del cursor
		FETCH NEXT FROM cur INTO @IdNomina, @IdEmp, @Pref, @NumActual;
	END

	--Cierra consulta del cursor
	--DEALLOCATE Libera la memoria usada por el cursor
	CLOSE cur;
	DEALLOCATE cur;

END
GO
PRINT N'Actualizando Vista [dbo].[VClientes]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_00]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP_00]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VCruces_Origen]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VCruces_TodosDocs]...';


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


GO
PRINT N'Actualizando Vista [dbo].[vLibroAuxiliar_Mov]...';


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


GO
PRINT N'Actualizando Vista [dbo].[vLibroAuxiliar_Saldos_02]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VNomina_NE_Encabezados]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VNominaContratos]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VHistoriaClinica_Datos]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VHistoriaClinica_Email]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VNominaCorte]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc____TotPorCuentas_00]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP____TotPorCuentas_00]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VCostoPromedio_Cruces]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VCruces_Agrup]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VProduccion]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc____TotPorCuentas_Fin]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP____TotPorCuentas_Fin]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VEncabezadosMov]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VMovimientosFactElectronica]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VEncabezados]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_01]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP_01]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VEncabezadosCont_Det]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VEncabezadosMov_Det]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc____TotRetes_Fin]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_01_01]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP____TotRetes_Fin]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP_01_01]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VCierresDocsCont]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VCierresDocs]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_02]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP_02]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_03]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP_03]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_Fin]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VContabDoc_FP_Fin]...';


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


GO
PRINT N'Actualizando Vista [dbo].[VEncabezadoFactElectronica]...';


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


GO
PRINT N'Modificando Procedimiento [dbo].[GetPagoSeguridadSocial]...';

IF OBJECT_ID(N'dbo.GetPagoSeguridadSocial', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE dbo.GetPagoSeguridadSocial AS BEGIN SET NOCOUNT ON; RETURN 0; END');


GO
ALTER PROCEDURE [dbo].[GetPagoSeguridadSocial]

@IdEmpresa INT,
@FechaIni NVARCHAR(10) = '',
@FechaFin NVARCHAR(10) = '',
@IdCentroCosto INT = NULL

AS
BEGIN

DECLARE
@FechaIniT DATETIME,
@FechaFinT DATETIME,
@salarioMin NUMERIC(28,6)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SET NOCOUNT ON;	

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

-- Salario Mínimo
SET @salarioMin=(SELECT top(1) Valor FROM dbo.Nomina_Valores WHERE IdTipo=1 AND EsActivo=1)

;WITH tmpIBC(IdEncab, IdContrato, IdCliente, IdCentroCosto, 
IBC_SALUD_EMPRESA, 
IBC_SALUD_EMPLEADO, 
NUM_DIAS_SALUD_EMPRESA, NUM_DIAS_SALUD_EMPLEADO, 
VALOR_SALUD_EMPRESA, 
VALOR_SALUD_EMPLEADO, 
IBC_PENSION, 
NUM_DIAS_PENSION, 
VALOR_PENSION_EMPRESA, 
VALOR_PENSION_EMPLEADO, 
IBC_RIESGOS, 
NUM_DIAS_RIESGOS, 
VALOR_RIESGOS, 
IBC_CCF, 
NUM_DIAS_CCF, 
VALOR_CCF, APV_AFIL, AVP_APORT,
AVP,
INTEGRAL, 
APORT_FONDO_SOLID,IdItem,IdItem1,
FechaIni,FechaFin,Cantidad
)
AS
( 
	SELECT  nomMov1.IdEncab, nomMov1.IdContrato, nomMov1.IdCliente, nomMov1.IdCentroCosto,
	CASE WHEN nomMov.iditem = 201 THEN nomMov1.Cantidad * nomMov1.ValorUnit / nomMov1.ValorUnitInferior ELSE 0 END AS IBC_SALUD_EMPRESA, 
	CASE WHEN nomMov.iditem = 202 THEN nomMov1.Cantidad * nomMov1.ValorUnit / nomMov1.ValorUnitInferior ELSE 0 END AS IBC_SALUD_EMPLEADO, 
	CASE WHEN nomMov.iditem = 201 AND idclasif = 1 AND nomMov1.iditem <> 221 THEN nomMov1.cantidad ELSE 0 END AS NUM_DIAS_SALUD_EMPRESA, 
	CASE WHEN nomMov.iditem = 202 AND idclasif = 1 AND nomMov1.iditem <> 221 THEN nomMov1.cantidad ELSE 0 END AS NUM_DIAS_SALUD_EMPLEADO, 
	CASE WHEN nomMov.iditem = 201 THEN nomMov.ValorUnit ELSE 0 END AS VALOR_SALUD_EMPRESA, 
	CASE WHEN nomMov.iditem = 202 THEN nomMov.ValorUnit ELSE 0 END AS VALOR_SALUD_EMPLEADO, 
	CASE WHEN nomMov.iditem = 203 THEN nomMov1.Cantidad * nomMov1.ValorUnit / nomMov1.ValorUnitInferior ELSE 0 END AS IBC_PENSION, 
	CASE WHEN nomMov.iditem = 203 AND idclasif = 1 AND nomMov1.iditem <> 221 THEN nomMov1.cantidad ELSE 0 END AS NUM_DIAS_PENSION, 
	CASE WHEN nomMov.iditem = 203 THEN nomMov.ValorUnit ELSE 0 END AS VALOR_PENSION_EMPRESA, 
	CASE WHEN nomMov.iditem = 204 THEN nomMov.ValorUnit ELSE 0 END AS VALOR_PENSION_EMPLEADO, 
	CASE WHEN nomMov.iditem = 200 THEN nomMov1.Cantidad * nomMov1.ValorUnit / nomMov1.ValorUnitInferior ELSE 0 END AS IBC_RIESGOS, 
	CASE WHEN nomMov.iditem = 200 AND idclasif = 1 AND nomMov1.iditem <> 221 THEN nomMov1.cantidad ELSE 0 END AS NUM_DIAS_RIESGOS, 
	CASE WHEN nomMov.iditem = 200 THEN nomMov.ValorUnit ELSE 0 END AS VALOR_RIESGOS, 
	CASE WHEN nomMov.iditem = 205 OR nomMov1.iditem = 221 THEN nomMov1.Cantidad * nomMov1.ValorUnit / nomMov1.ValorUnitInferior ELSE 0 END AS IBC_CCF, 
	CASE WHEN nomMov.iditem = 205 AND idclasif = 1 AND nomMov1.iditem <> 221 THEN nomMov1.cantidad ELSE 0 END AS NUM_DIAS_CCF, 
	CASE WHEN nomMov.iditem = 205 THEN nomMov.ValorUnit ELSE 0 END AS VALOR_CCF, 
	CASE WHEN nomMov.iditem = 223 OR nomMov1.iditem = 223 THEN nomMov.ValorUnit ELSE 0 END AS APV_AFIL, 
	CASE WHEN nomMov.iditem = 224 OR nomMov1.iditem = 224 THEN nomMov.ValorUnit ELSE 0 END AS AVP_APORT,
	CASE WHEN nomMov.iditem = 223 OR nomMov1.iditem = 223 OR nomMov1.iditem = 224 OR nomMov.iditem = 224 THEN 1 ELSE 0 END AS AVP,
	CASE WHEN nomMov1.iditem = 100 THEN 1 ELSE 0 END AS INTEGRAL, 
	CASE WHEN nomMov1.iditem = 199 THEN nomMov1.ValorUnit ELSE 0 END AS APORT_FONDO_SOLID, 
	nomMov.IdItem, 
	nomMov1.IdItem,
	nomMov1.FechaIniVac,
	nomMov1.FechaFinVac,
	nomMov1.Cantidad as Cantidad

	FROM dbo.Nomina_Movimientos AS nomMov INNER JOIN
	dbo.Encabezados AS enc ON nomMov.IdEncab = enc.IdEncab RIGHT OUTER JOIN
	dbo.Nomina_Movimientos AS nomMov1 ON nomMov.IdEncabNomMovBase = nomMov1.IdEncabNomMov INNER JOIN
	dbo.Nomina_Items AS item ON nomMov1.IdItem = item.IdItem
),

tmpIBC1
(IdEncab, IdContrato, IdCliente, IdCentroCosto, 
IBC_SALUD_EMPRESA, 
IBC_SALUD_EMPLEADO, 
NUM_DIAS_SALUD_EMPRESA, NUM_DIAS_SALUD_EMPLEADO, 
VALOR_SALUD_EMPRESA, 
VALOR_SALUD_EMPLEADO, 
IBC_PENSION, 
NUM_DIAS_PENSION, 
VALOR_PENSION_EMPRESA, 
VALOR_PENSION_EMPLEADO, 
IBC_RIESGOS, 
NUM_DIAS_RIESGOS, 
VALOR_RIESGOS, 
IBC_CCF, 
NUM_DIAS_CCF, 
VALOR_CCF, APV_AFIL, AVP_APORT,
AVP,
INTEGRAL, 
APORT_FONDO_SOLID,IdItem,IdItem1,
FechaIni,FechaFin,Cantidad,
IRP,FechaIniIRP,FechaFinIRP,
IGE,FechaIniIGE, FechaFinIGE,
LMA,FechaIniLMA,FechaFinLMA,
VAC,FechaIniVAC,FechaFinVAC,
SLN,FechaIniSLN, FechaFinSLN,
TipoRow1
)
as
(
	select 
	qBase.*,
	0 as IRP,Null as FechaIniIRP,Null as FechaFinIRP,
	0 as IGE,Null as FechaIniIGE,Null as FechaFinIGE,
	0 as LMA,Null as FechaIniLMA,Null as FechaFinLMA,
	'' as VAC,Null as FechaIniVAC,Null as FechaFinVAC,
	0 as SLN,Null as FechaIniSLN,Null as FechaFinSLN,
	1 as TipoRow1
	from tmpIBC as qBase
	where qBase.IdItem1 not in(225,112,222,226,220,219,218)

	union all

	select
	qBase.*,
	qBase.Cantidad AS IRP, FechaIni as FechaIniIRP,FechaFin as FechaFinIRP,
	0 as IGE,Null as FechaIniIGE,Null as FechaFinIGE,
	0 as LMA,Null as FechaIniLMA,Null as FechaFinLMA,
	'' as VAC,Null as FechaIniVAC,Null as FechaFinVAC,
	0 as SLN,Null as FechaIniSLN,Null as FechaFinSLN,
	2 as TipoRow1
	from tmpIBC as qBase
	where qBase.IdItem1 in(225)

	union all

	select
	qBase.*,
	0 as IRP,Null as FechaIniIRP,Null as FechaFinIRP,
	1 as IGE,FechaIni as FechaIniIGE,FechaFin as FechaFinIGE,
	0 as LMA,Null as FechaIniLMA,Null as FechaFinLMA,
	'' as VAC,Null as FechaIniVAC,Null as FechaFinVAC,
	0 as SLN,Null as FechaIniSLN,Null as FechaFinSLN,
	3 as TipoRow1
	from tmpIBC as qBase
	where qBase.IdItem1 in(112)

	union all

	select
	qBase.*,
	0 as IRP,Null as FechaIniIRP,Null as FechaFinIRP,
	0 as IGE,Null as FechaIniIGE,Null as FechaFinIGE,
	1 as LMA,FechaIni as FechaIniLMA,FechaFin as FechaFinLMA,
	'' as VAC,Null as FechaIniVAC,Null as FechaFinVAC,
	0 as SLN,Null as FechaIniSLN,Null as FechaFinSLN,
	4 as TipoRow1
	from tmpIBC as qBase
	where qBase.IdItem1 in(222,226)

	union all

	select
	qBase.*,
	0 as IRP,Null as FechaIniIRP,Null as FechaFinIRP,
	0 as IGE,Null as FechaIniIGE,Null as FechaFinIGE,
	0 as LMA,Null as FechaIniLMA,Null as FechaFinLMA,
	case when IdItem1=218 THEN 'L' ELSE 'X' END as VAC,FechaIni as FechaIniVAC,FechaFin as FechaFinVAC,
	0 as SLN,Null as FechaIniSLN,null as FechaFinSLN,
	5 as TipoRow1
	from tmpIBC as qBase
	where qBase.IdItem1 in(220,218)

	union all

	select
	qBase.*,
	0 as IRP,Null as FechaIniIRP,Null as FechaFinIRP,
	0 as IGE,Null as FechaIniIGE,Null as FechaFinIGE,
	0 as LMA,Null as FechaIniLMA,Null as FechaFinLMA,
	'' as VAC,Null as FechaIniVAC,Null as FechaFinVAC,
	1 as SLN,FechaIni as FechaIniSLN,FechaFin as FechaFinSLN,
	6 as TipoRow1
	from tmpIBC as qBase
	where qBase.IdItem1 in(219)
),


tmpIBCFin(
 IdEncab, IdCliente, IdContrato, IdCentroCosto, VALOR_SALUD, VALOR_PENSION, IBC_RIESGOS, IBC_SALUD, 
                        IBC_PENSION,NUM_DIAS_SALUD, NUM_DIAS_PENSION, 
                        NUM_DIAS_RIESGOS, VALOR_RIESGOS, IBC_CCF, NUM_DIAS_CCF, VALOR_CCF, APV_AFIL, AVP_APORT, IRP, IGE, LMA, VAC, AVP, INTEGRAL, APORT_FONDO_SOLID, SLN,
						FechaIniIRP,FechaFinIRP,FechaIniIGE, FechaFinIGE,FechaIniLMA,FechaFinLMA,FechaIniVAC,FechaFinVAC,FechaIniSLN, FechaFinSLN,TipoRow1
)
as
(
	SELECT      IdEncab, IdCliente, IdContrato, IdCentroCosto, VALOR_SALUD, VALOR_PENSION, 
				CASE WHEN IBC_RIESGOS = 0 AND TipoRow1 != 1 THEN IBC_PENSION ELSE IBC_RIESGOS END AS IBC_RIESGOS, 
				CASE WHEN IBC_SALUD = 0 AND TipoRow1 != 1 THEN IBC_PENSION ELSE IBC_SALUD END AS IBC_SALUD, 
				CASE WHEN IBC_PENSION = 0 AND TipoRow1 != 1 THEN IBC_SALUD ELSE IBC_PENSION END AS IBC_PENSION, 
				CASE WHEN NUM_DIAS_SALUD = 0 AND TipoRow1 != 1 THEN Cantidad ELSE NUM_DIAS_SALUD END AS NUM_DIAS_SALUD, 
				CASE WHEN NUM_DIAS_PENSION = 0 AND TipoRow1 != 1 THEN Cantidad ELSE NUM_DIAS_PENSION END AS NUM_DIAS_PENSION, 
				CASE WHEN NUM_DIAS_RIESGOS = 0 AND TipoRow1 != 1 THEN Cantidad ELSE NUM_DIAS_RIESGOS END AS NUM_DIAS_RIESGOS, VALOR_RIESGOS, 
				CASE WHEN IBC_CCF = 0 AND TipoRow1 != 1 THEN IBC_PENSION ELSE IBC_CCF END AS IBC_CCF, 
				CASE WHEN NUM_DIAS_CCF = 0 AND TipoRow1 != 1 THEN Cantidad ELSE NUM_DIAS_CCF END AS NUM_DIAS_CCF, 
				VALOR_CCF, APV_AFIL, AVP_APORT, IRP, IGE, LMA, VAC, AVP, INTEGRAL, APORT_FONDO_SOLID, SLN,
				FechaIniIRP,FechaFinIRP,FechaIniIGE, FechaFinIGE,FechaIniLMA,FechaFinLMA,FechaIniVAC,FechaFinVAC,FechaIniSLN, FechaFinSLN,TipoRow1
	FROM
	(
		SELECT      IdEncab, IdCliente, IdContrato, IdCentroCosto, CASE WHEN IBC_SALUD_EMPRESA = 0 THEN IBC_SALUD_EMPLEADO ELSE IBC_SALUD_EMPRESA END AS IBC_SALUD, 
					CASE WHEN NUM_DIAS_SALUD_EMPRESA = 0 THEN NUM_DIAS_SALUD_EMPLEADO ELSE NUM_DIAS_SALUD_EMPRESA END AS NUM_DIAS_SALUD, VALOR_SALUD, IBC_PENSION, 
					NUM_DIAS_PENSION, VALOR_PENSION, IBC_RIESGOS, NUM_DIAS_RIESGOS, VALOR_RIESGOS, IBC_CCF, NUM_DIAS_CCF, VALOR_CCF, APV_AFIL, AVP_APORT, IRP, IGE, LMA, VAC, AVP, 
					INTEGRAL, APORT_FONDO_SOLID, SLN, Cantidad, FechaIniIRP,FechaFinIRP,FechaIniIGE, FechaFinIGE,FechaIniLMA,FechaFinLMA,FechaIniVAC,FechaFinVAC,FechaIniSLN, FechaFinSLN,TipoRow1
		FROM 
		(
			SELECT      IdEncab, IdCliente, MAX(IdContrato) AS IdContrato, MAX(IdCentroCosto) AS IdCentroCosto, SUM(IBC_SALUD_EMPRESA) AS IBC_SALUD_EMPRESA, SUM(IBC_SALUD_EMPLEADO) AS IBC_SALUD_EMPLEADO, 
						SUM(NUM_DIAS_SALUD_EMPRESA) AS NUM_DIAS_SALUD_EMPRESA, SUM(NUM_DIAS_SALUD_EMPLEADO) AS NUM_DIAS_SALUD_EMPLEADO, SUM(VALOR_SALUD_EMPRESA) 
						+ SUM(VALOR_SALUD_EMPLEADO) AS VALOR_SALUD, SUM(IBC_PENSION) AS IBC_PENSION, SUM(NUM_DIAS_PENSION) AS NUM_DIAS_PENSION, SUM(VALOR_PENSION_EMPRESA) 
						+ SUM(VALOR_PENSION_EMPLEADO) AS VALOR_PENSION, SUM(IBC_RIESGOS) AS IBC_RIESGOS, SUM(NUM_DIAS_RIESGOS) AS NUM_DIAS_RIESGOS, SUM(VALOR_RIESGOS) 
						AS VALOR_RIESGOS, SUM(IBC_CCF) AS IBC_CCF, SUM(NUM_DIAS_CCF) AS NUM_DIAS_CCF, SUM(VALOR_CCF) AS VALOR_CCF, SUM(APV_AFIL) AS APV_AFIL, SUM(AVP_APORT) 
						AS AVP_APORT, SUM(IRP) AS IRP, MAX(IGE) AS IGE, MAX(LMA) AS LMA, MAX(VAC) AS VAC, MAX(AVP) AS AVP, MAX(INTEGRAL) AS INTEGRAL, MAX(APORT_FONDO_SOLID) 
						AS APORT_FONDO_SOLID, MAX(SLN) AS SLN, MAX(Cantidad) AS Cantidad,
						FechaIniIRP,FechaFinIRP,FechaIniIGE, FechaFinIGE,FechaIniLMA,FechaFinLMA,FechaIniVAC,FechaFinVAC,FechaIniSLN, FechaFinSLN,TipoRow1
			FROM tmpIBC1
			GROUP BY IdEncab, IdCliente,TipoRow1,FechaIniIRP,FechaFinIRP,FechaIniIGE, FechaFinIGE,FechaIniLMA,FechaFinLMA,FechaIniVAC,FechaFinVAC,FechaIniSLN,FechaFinSLN
		)AS q
	)AS q1
)

--Consulta Final

select ROW_NUMBER() OVER(PARTITION BY q.IdCliente ORDER BY q.IdContrato asc) AS Row, q.IdCliente,tipo.CodMiPlanilla as NomTipoIdent,cli.Identificacion,coalesce(vnom.IdTipoCot,1)TipoCot,
coalesce(vnom.IdSubTipoCot,0)SubTipoCot,case when vnom.IdTipoExt=1 then cast(1 as bit) else cast(0 as bit) end Extranjero,
case when vnom.IdTipoExt=2 then cast(1 as bit) else cast(0 as bit) end Col_Ext, 
cast(apellido1 as varchar(max)) collate SQL_Latin1_General_Cp1251_CS_AS as Apellido1, 
cast(Apellido2 as varchar(max)) collate SQL_Latin1_General_Cp1251_CS_AS as Apellido2,
cast(Nombre1 as varchar(max)) collate SQL_Latin1_General_Cp1251_CS_AS as Nombre1,
cast(Nombre2 as varchar(max)) collate SQL_Latin1_General_Cp1251_CS_AS as Nombre2,
case when vnom.FechaIni between @FechaIniT and @FechaFinT and ROW_NUMBER() OVER(PARTITION BY q.IdCliente ORDER BY q.IdContrato asc)=1 then cast(1 as bit) else cast(0 as bit) end ING,
case when vnom.FechaRetiro between @FechaIniT and @FechaFinT and ROW_NUMBER() OVER(PARTITION BY q.IdCliente ORDER BY q.IdContrato asc)=1 then cast(1 as bit) else cast(0 as bit) end RET,
cast(0 as bit) TDE,cast(0 as bit) TAE,cast(0 as bit) TDP, cast(0 as bit) TAP, cast(0 as bit) VSP,
cast(0 as bit) VTE, cast(0 as bit) VST, 
cast(SLN as bit)SLN,
cast(q.IGE as bit)IGE, 
cast(q.LMA as bit)LMA, 
VAC,
cast(q.AVP as bit)AVP,
cast(0 as bit)VCT, 
q.IRP,
CASE WHEN IBC_PENSION > 0 THEN CodAFP ELSE '' END AS COD_AFP,
'' COD_AFP_TRANS,CodEPS AS COD_EPS,
'' COD_EPS_TRANS,CodCCF AS COD_CCF, NUM_DIAS_PENSION,NUM_DIAS_SALUD,NUM_DIAS_RIESGOS,NUM_DIAS_CCF, vnom.SueldoIni SALARIO_BASICO,q.INTEGRAL,
IBC_PENSION,IBC_SALUD,IBC_RIESGOS,IBC_CCF,TARIFA_AFP, q.APV_AFIL,q.AVP_APORT,CAST (NULL  AS NUMERIC(28,6)) VALOR_NO_RETE,CAST (0 AS NUMERIC(28,6)) UPC_ADIC,
CASE WHEN SLN=1 AND (q.EsExoneradoAportes=1 or VNom.EsExoneradoAportes = 1) THEN 0 ELSE TARIFA_EPS END TARIFA_EPS,
CASE WHEN TipoRow1!=1 THEN 0 ELSE vnom.ARPTarifa END TARIFA_RIESGO,
TARIFA_CCF,TARIFA_SENA,TARIFA_ICBF, CAST(0 AS  NUMERIC(28,6)) TARIFA_ESAP,CAST(0 AS NUMERIC(28,6)) TARIFA_MISNIS,
CEILING(q.VALOR_RIESGOS/100)*100 AS COTIZACION_RIESGOS,ceiling(q.VALOR_CCF/100)*100 AS COTIZACION_CAJA, ceiling(VALOR_PENSION/100)*100 AporteObligatorioAFP,
round(APORT_FONDO_SOLID/2,-2)APORT_FONDO_SOLID,round(APORT_FONDO_SOLID/2,-2)APORT_FONDO_SUBCUENTA,
ceiling(VALOR_SALUD/100)*100 AporteObligatorioSalud, '' as NumIncap, 0 as ValorIncap,'' as NumMat, 0 as ValorMat, 0 as CodigoCT,round((IBC_CCF*TARIFA_SENA/100),-2)VALOR_SENA,
round((IBC_CCF*TARIFA_ICBF/100),-2)VALOR_ICBF, cast(0 AS  numeric(28,6)) VALOR_ESAP,cast(0 AS numeric(28,6)) VALOR_MISNIS,[IdDptoCaja]Dpto,[CodMunicipioCaja]Municipio,
case when (q.EsExoneradoAportes=1 or VNom.EsExoneradoAportes = 1) then 'S' else 'N' end  Exonerado,CodTarifa,
case when vnom.FechaIni between @FechaIniT and @FechaFinT then vnom.FechaIni else null end FechaIng,
case when vnom.FechaRetiro between @FechaIniT and @FechaFinT then FechaRetiro else null end FechaRet,
null as FechaVsp,FechaIniSLN,FechaFinSLN,FechaIniIGE, FechaFinIGE,FechaIniLMA,FechaFinLMA,FechaIniVAC,FechaFinVAC,
null as FechaIniVCT ,null as FechaFinVCT,FechaIniIRP,FechaFinIRP, IBC_CCF IBC_Diferente_CCF,NUM_DIAS_SALUD*8 as HorasLabor, VNom.PreTipoSalario,
CC.NomCentroCosto,
--codigo CIIU Formateado    
COALESCE(RIGHT('0000' + CAST(Emp.EmpresaIdActivEconPrinc AS VARCHAR(6)), 4), '0000') +  
COALESCE(RIGHT('00' + CAST(Emp.SubActividad AS VARCHAR(2)), 2), '01') AS CodCIIU


from
(
	select vIBC.IdCliente,vIBC.IdContrato as IdContrato,
	case when SUM(vIBC.IBC_SALUD)> @salarioMin OR SLN =1 then ceiling(SUM(vIBC.IBC_SALUD))  else ceiling(SUM(vIBC.IBC_SALUD))  end IBC_SALUD, 
	SUM(vIBC.NUM_DIAS_SALUD)NUM_DIAS_SALUD,SUM(vIBC.VALOR_SALUD)VALOR_SALUD,
	case when SUM(vIBC.IBC_PENSION) > @salarioMin OR SLN =1 then ceiling(SUM(vIBC.IBC_PENSION)) else ceiling(SUM(vIBC.IBC_PENSION)) end IBC_PENSION,
	SUM(vIBC.NUM_DIAS_PENSION)NUM_DIAS_PENSION,SUM(vIBC.VALOR_PENSION)VALOR_PENSION,
	case when SUM(vIBC.IBC_RIESGOS) > @salarioMin  OR TipoRow1 !=1then ceiling(SUM(vIBC.IBC_RIESGOS)) else  ceiling(SUM(vIBC.IBC_RIESGOS)) end  IBC_RIESGOS,
	SUM(vIBC.NUM_DIAS_RIESGOS)NUM_DIAS_RIESGOS,SUM(vIBC.VALOR_RIESGOS)VALOR_RIESGOS,
	case when SUM(vIBC.IBC_CCF) > @salarioMin   OR TipoRow1 !=1 then  ceiling(SUM(vIBC.IBC_CCF)) else ceiling(SUM(vIBC.IBC_CCF)) end IBC_CCF,
	SUM(vIBC.NUM_DIAS_CCF)NUM_DIAS_CCF,SUM(vIBC.VALOR_CCF)VALOR_CCF,	
	SUM(vIBC.APV_AFIL)APV_AFIL,SUM(vIBC.AVP_APORT)AVP_APORT,SUM(vIBC.IRP)IRP,max(IGE)IGE,max(LMA)LMA,max(VAC)VAC,max(AVP)AVP,max(INTEGRAL)INTEGRAL,SLN,
	max(nomTar.TARIFA_EPS)TARIFA_EPS,max(nomTar.TARIFA_AFP)TARIFA_AFP,
	case when SLN =1 then 0 else max(nomTar.TARIFA_CCF)end TARIFA_CCF,
	max(nomTar.TARIFA_SENA)TARIFA_SENA,max(nomTar.TARIFA_ICBF)TARIFA_ICBF,
	SUM(vIBC.APORT_FONDO_SOLID)APORT_FONDO_SOLID,
	Emp.EsExoneradoAportes, FechaIniIRP,FechaFinIRP,FechaIniIGE, FechaFinIGE,FechaIniLMA,FechaFinLMA,FechaIniVAC,FechaFinVAC,FechaIniSLN, FechaFinSLN,TipoRow1,
	MAX(vIBC.IdCentroCosto) AS IdCentroCosto
	from tmpIBCFin vIBC inner join [dbo].[Encabezados] enc
	on vIBC.IdEncab=enc.IdEncab left join [dbo].[VNominaTarifas] nomTar on vIBC.IdEncab=nomTar.IdEncab and vIBC.IdContrato=nomTar.IdContrato
	inner join Empresas Emp on emp.IdEmpresa=enc.IdEmpresa
	WHERE
	enc.IdEmpresa=@IdEmpresa and FechaIni between @FechaIniT and @FechaFinT 
	AND (@IdCentroCosto IS NULL OR vIBC.IdCentroCosto = @IdCentroCosto)
	group by  vIBC.IdCliente,vIBC.IdContrato,SLN,Emp.EsExoneradoAportes,TipoRow1, FechaIniIRP,FechaFinIRP,FechaIniIGE, FechaFinIGE,FechaIniLMA,FechaFinLMA,FechaIniVAC,FechaFinVAC,FechaIniSLN, FechaFinSLN

) as q inner join VClientes2 cli on q.IdCliente=cli.IdCliente
inner join VNominaContratos VNom on VNom.IdContrato=q.IdContrato
inner join [dbo].[Clientes_TiposIdent] tipo on tipo.IdTipoIdent=cli.IdTipoIdent 
left join [dbo].[Clientes_ArpTarifas] arpTarifa on arpTarifa.IdTarifa=VNom.IdArpTarifa
LEFT JOIN CentroCostos CC ON q.IdCentroCosto = CC.IdCentroCosto
--
INNER JOIN Empresas Emp ON Emp.IdEmpresa = @IdEmpresa
order by q.IdContrato

END
GO
PRINT N'Modificando Procedimiento [dbo].[GenerarDocumentos]...';

IF OBJECT_ID(N'dbo.GenerarDocumentos', N'P') IS NULL
    EXEC(N'CREATE PROCEDURE dbo.GenerarDocumentos AS BEGIN SET NOCOUNT ON; RETURN 0; END');


GO
ALTER PROCEDURE GenerarDocumentos
    @IdDoc INT,
    @TipoImplementacion INT, -- 0=GenerarDoc, 1=GenerarEquiv
    @PrefijoSelec NVARCHAR(10) = NULL,
    @IdEncabNew INT OUTPUT,
    @Exito INT = 0 OUTPUT,
    @MensajeError NVARCHAR(200) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY

        IF @TipoImplementacion IS NULL
			SET @TipoImplementacion = 0;

        DECLARE @IdEncab INT;
        DECLARE @XML XML;
        DECLARE @NumeroFacturaFull VARCHAR(50);
        DECLARE @NumeroFactura VARCHAR(50);
        DECLARE @FechaFactura DATE;
        DECLARE @ValorTotal DECIMAL(18,2);
        DECLARE @Mensaje VARCHAR(500);
        DECLARE @TipoDocSincro  INT;
		DECLARE @Prefijo VARCHAR (10);
        
        -- Variables para datos del XML
        DECLARE @NitProveedor VARCHAR(50);
        DECLARE @NombreProveedor VARCHAR(200);
        DECLARE @CodigoMoneda VARCHAR(10);
        DECLARE @IdDocumento INT;
        DECLARE @TipoDocumento VARCHAR(10);
        DECLARE @UnidadMedida VARCHAR(10);
        DECLARE @TipoIdentProveedor VARCHAR(10);
        DECLARE @IdCreditNote INT;

        -- Variables para dirección del cliente
        DECLARE @DireccionCliente VARCHAR(500);
        DECLARE @TelefonoCliente VARCHAR(50);
        DECLARE @EmailCliente VARCHAR(100);
        DECLARE @IdCiudadCliente VARCHAR(20);
        DECLARE @IdFormaPago VARCHAR(10);
        DECLARE @PlazoCliente INT;
        DECLARE @Vence DATE;
        
        -- Variables para cálculos
        DECLARE @Cantidad DECIMAL(18,6);
        DECLARE @BaseImpuesto DECIMAL(18,2);
        DECLARE @ValorImpuesto DECIMAL(18,2);
        DECLARE @ValorIva DECIMAL(18,2);
        DECLARE @ValorINC DECIMAL(18,2);
		DECLARE @ValorIBUA DECIMAL(18,2);
        DECLARE @ValorICUI DECIMAL (18,2);
		DECLARE @ValorICL DECIMAL (18,2);
		DECLARE @ValorADV DECIMAL (18,2);
		DECLARE @ValorIC DECIMAL (18,2);
        DECLARE @TipoImpuestoSaludable INT;
        DECLARE @SubTotal DECIMAL(18,2);
        DECLARE @DescuentoTotal DECIMAL(18,2);
        DECLARE @FactorDescuento DECIMAL(18,6);

        -- Variables para datos del XML
        DECLARE @NitEmpresa VARCHAR(50);
        DECLARE @CiudadBodega VARCHAR(50);
        DECLARE @CodigoCiudad VARCHAR(10);

        DECLARE @IdTipoIdent INT;
        DECLARE @TaxLevelCode VARCHAR(200);
        DECLARE @IdTipoRegimen INT;
        DECLARE @RespoTributaria VARCHAR(10);

        --Logica para Nómina Electrónica, se finaliza cuando un cliente lo solicite, NO ELIMINAR
        -- Variables para Totales de Nómina
        --DECLARE @TipoContrato INT;
        --DECLARE @TotalDevengados DECIMAL(18,2);
        --DECLARE @TotalDeducciones DECIMAL(18,2);
        --DECLARE @TotalComprobante DECIMAL(18,2);
        --DECLARE @FechaliquidacionIni DATE;
        --DECLARE @FechaliquidacionFin DATE;

        ---- Variables para Conceptos de Devengados
        --DECLARE @DiasTrabajados INT;
        --DECLARE @SueldoTrabajado DECIMAL(18,2);
        --DECLARE @AuxilioTransporte DECIMAL(18,2);
        --DECLARE @PagoVacaciones DECIMAL(18,2);
        --DECLARE @PagoPrimas DECIMAL(18,2);
        --DECLARE @PagoCesantias DECIMAL(18,2);
        --DECLARE @InteresesCesantias DECIMAL(18,2);

        ---- Variables para Conceptos de Deducciones
        --DECLARE @DeduccionSalud DECIMAL(18,2);
        --DECLARE @DeduccionPension DECIMAL(18,2);
        --DECLARE @DeduccionFondoSol DECIMAL(18,2);
        --DECLARE @RetencionFuente DECIMAL(18,2);

        -- Obtenemos el XML
        SELECT @XML = CAST(PR.Recurso AS XML)
        FROM dbo.DocElectronicos DE 
        INNER JOIN dbo.DocElectronicos_DocRecursos DR ON DE.IdDoc = DR.IdDoc 
        INNER JOIN dbo.Parametros_Recursos PR ON DR.IdRecurso = PR.IdRecurso
        WHERE DE.IdDoc = @IdDoc
        AND DR.IdTipo = 0;

        IF @XML IS NULL
        BEGIN
            RAISERROR('No se encontró el documento XML para el ID especificado.', 16, 1);
            RETURN;
        END;

        SELECT @TipoDocSincro = TipoDocSincro FROM DocElectronicos WHERE IdDoc=@IdDoc;

        -- Extraemos todos los datos relevantes del XML
        WITH XMLNAMESPACES (
            'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2' as inv,
            'urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2' as cn,
            'urn:oasis:names:specification:ubl:schema:xsd:DebitNote-2' as dn,
            'dian:gov:co:facturaelectronica:NominaIndividual' as ni,
            'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2' as cbc,
            'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2' as cac,
			'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2' AS ext,
			'dian:gov:co:facturaelectronica:Structures-2-1' AS sts
        )
        SELECT 
            -- Datos básicos del documento
            @NumeroFactura = COALESCE(
                @XML.value('(/inv:Invoice/cbc:ID)[1]', 'varchar(50)'),
                @XML.value('(/cn:CreditNote/cbc:ID)[1]', 'varchar(50)'),
                @XML.value('(/dn:DebitNote/cbc:ID)[1]', 'varchar(50)')
                --@XML.value('(/ni:NominaIndividual/ni:NumeroSecuenciaXML)[1]/@Consecutivo', 'varchar(50)')
            ),
			@Prefijo = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme/cbc:ID)[1]', 'varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme/cbc:ID)[1]', 'varchar(10)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme/cbc:ID)[1]', 'varchar(10)')
                --@XML.value('(/ni:NominaIndividual/ni:NumeroSecuenciaXML)[1]/@Prefijo', 'varchar(10)')
            ),
            @FechaFactura  = COALESCE(
                @XML.value('(/inv:Invoice/cbc:IssueDate)[1]', 'date'),
                @XML.value('(/cn:CreditNote/cbc:IssueDate)[1]', 'date'),
                @XML.value('(/dn:DebitNote/cbc:IssueDate)[1]', 'date')
                --@XML.value('(/ni:NominaIndividual/ni:FechasPagos/ni:FechaPago)[1]', 'date')
            ),
            @TipoDocumento = COALESCE(
                @XML.value('(/inv:Invoice/cbc:InvoiceTypeCode)[1]', 'varchar(10)'),
                @XML.value('(/cn:CreditNote/cbc:CreditNoteTypeCode)[1]', 'varchar(10)'),
                @XML.value('(/dn:DebitNote/cbc:DebitNoteTypeCode)[1]', 'varchar(10)')
            ),
            @CodigoMoneda  = COALESCE(
                @XML.value('(/inv:Invoice/cbc:DocumentCurrencyCode)[1]', 'varchar(10)'),
                @XML.value('(/cn:CreditNote/cbc:DocumentCurrencyCode)[1]', 'varchar(10)'),
                @XML.value('(/dn:DebitNote/cbc:DocumentCurrencyCode)[1]', 'varchar(10)')
            ),
            @NitEmpresa = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)')
                --@XML.value('(/ni:NominaIndividual/ni:Empleador)[1]/@NIT', 'varchar(50)')
            ),
            @CiudadBodega = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName)[1]','varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName)[1]','varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName)[1]','varchar(50)')
            ),
            @CodigoCiudad = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(10)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(10)')
            ),
            @NitProveedor = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)')
                --@XML.value('(/ni:NominaIndividual/ni:Trabajador)[1]/@NumeroDocumento', 'varchar(50)')
            ),
            @NombreProveedor = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name)[1]','varchar(200)'),
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName)[1]','varchar(200)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName)[1]','varchar(200)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name)[1]','varchar(200)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName)[1]','varchar(200)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name)[1]','varchar(200)')
                --LTRIM(RTRIM(
                --    CONCAT(
                --        @XML.value('(/ni:NominaIndividual/ni:Trabajador)[1]/@PrimerNombre', 'varchar(100)'), ' ',
                --        @XML.value('(/ni:NominaIndividual/ni:Trabajador)[1]/@OtrosNombres', 'varchar(100)'), ' ',
                --        @XML.value('(/ni:NominaIndividual/ni:Trabajador)[1]/@PrimerApellido', 'varchar(100)'), ' ',
                --        @XML.value('(/ni:NominaIndividual/ni:Trabajador)[1]/@SegundoApellido', 'varchar(100)')
                --    )
                --))
            ),
            @TipoIdentProveedor = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]','varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]','varchar(10)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]','varchar(10)')
            ),
            @UnidadMedida = COALESCE(
                @XML.value('(/inv:Invoice/cac:InvoiceLine/cbc:InvoicedQuantity/@unitCode)[1]','varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:CreditNoteLine/cbc:CreditedQuantity/@unitCode)[1]','varchar(10)'),
                @XML.value('(/dn:DebitNote/cac:DebitNoteLine/cbc:DebitedQuantity/@unitCode)[1]','varchar(10)')
            ),
            @DireccionCliente = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line)[1]','varchar(500)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line)[1]','varchar(500)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line)[1]','varchar(500)')
            ),
            @TelefonoCliente = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:Telephone)[1]','varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:Telephone)[1]','varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:Telephone)[1]','varchar(50)')
            ),
            @EmailCliente = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:ElectronicMail)[1]','varchar(100)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:ElectronicMail)[1]','varchar(100)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:ElectronicMail)[1]','varchar(100)')
            ),
            @IdCiudadCliente = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(20)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(20)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(20)')
            ),
            @IdFormaPago = COALESCE(
                @XML.value('(/inv:Invoice/cac:PaymentMeans/cbc:ID)[1]','varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:PaymentMeans/cbc:ID)[1]','varchar(10)'),
                @XML.value('(/dn:DebitNote/cac:PaymentMeans/cbc:ID)[1]','varchar(10)')
            ),
            @Cantidad = COALESCE(
                @XML.value('(/inv:Invoice/cac:InvoiceLine/cbc:InvoicedQuantity)[1]','decimal(18,6)'),
                @XML.value('(/cn:CreditNote/cac:CreditNoteLine/cbc:CreditedQuantity)[1]','decimal(18,6)'),
                @XML.value('(/dn:DebitNote/cac:DebitNoteLine/cbc:DebitedQuantity)[1]','decimal(18,6)')
            ),
            @BaseImpuesto = COALESCE(
                @XML.value('(/inv:Invoice/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount)[1]','decimal(18,2)'),
                @XML.value('(/cn:CreditNote/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount)[1]','decimal(18,2)'),
                @XML.value('(/dn:DebitNote/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount)[1]','decimal(18,2)')
            ),
            @ValorImpuesto = COALESCE(
                @XML.value('(/inv:Invoice/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount)[1]','decimal(18,2)'),
                @XML.value('(/cn:CreditNote/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount)[1]','decimal(18,2)'),
                @XML.value('(/dn:DebitNote/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount)[1]','decimal(18,2)')
            ),
            @SubTotal = COALESCE(
                @XML.value('(/inv:Invoice/cac:LegalMonetaryTotal/cbc:LineExtensionAmount)[1]','decimal(18,2)'),
                @XML.value('(/cn:CreditNote/cac:LegalMonetaryTotal/cbc:LineExtensionAmount)[1]','decimal(18,2)'),
                @XML.value('(/dn:DebitNote/cac:LegalMonetaryTotal/cbc:LineExtensionAmount)[1]','decimal(18,2)')
            ),
            @DescuentoTotal = COALESCE(
                @XML.value('(/inv:Invoice/cac:LegalMonetaryTotal/cbc:AllowanceTotalAmount)[1]','decimal(18,2)'),
                @XML.value('(/cn:CreditNote/cac:LegalMonetaryTotal/cbc:AllowanceTotalAmount)[1]','decimal(18,2)'),
                @XML.value('(/dn:DebitNote/cac:LegalMonetaryTotal/cbc:AllowanceTotalAmount)[1]','decimal(18,2)')
            ),
            @ValorTotal = COALESCE(
                @XML.value('(/inv:Invoice/cac:LegalMonetaryTotal/cbc:PayableAmount)[1]','decimal(18,2)'),
                @XML.value('(/cn:CreditNote/cac:LegalMonetaryTotal/cbc:PayableAmount)[1]','decimal(18,2)'),
                @XML.value('(/dn:DebitNote/cac:RequestedMonetaryTotal/cbc:PayableAmount)[1]','decimal(18,2)')
            ),
            @IdTipoIdent = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]', 'int'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]', 'int'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]', 'int')
            ),
            @TaxLevelCode = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode)[1]', 'varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode)[1]', 'varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode)[1]', 'varchar(50)')
            ),
            @RespoTributaria = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID)[1]', 'varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID)[1]', 'varchar(10)')
            ),
            @IdCreditNote = @XML.value('(/dn:DebitNote/cbc:CustomizationID)[1]','int'),
            
            --Datos para Nómina Electrónica
            --@TotalDevengados = ISNULL(@XML.value('(/ni:NominaIndividual/ni:DevengadosTotal)[1]', 'decimal(18,2)'), 0),
            --@TotalDeducciones = ISNULL(@XML.value('(/ni:NominaIndividual/ni:DeduccionesTotal)[1]', 'decimal(18,2)'), 0),
            --@TotalComprobante = ISNULL(@XML.value('(/ni:NominaIndividual/ni:ComprobanteTotal)[1]', 'decimal(18,2)'), 0),
            --@TipoContrato = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Trabajador)[1]/@TipoContrato', 'int'), 0),
            --@DiasTrabajados = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Devengados/ni:Basico)[1]/@DiasTrabajados', 'int'), 0),
            --@FechaliquidacionIni = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Periodo)[1]/@FechaLiquidacionInicio', 'date'), NULL),
            --@FechaLiquidacionFin = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Periodo)[1]/@FechaLiquidacionFin', 'date'), NULL),

            --@SueldoTrabajado = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Devengados/ni:Basico)[1]/@SueldoTrabajado', 'decimal(18,2)'), 0),
            --@AuxilioTransporte = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Devengados/ni:Transporte)[1]/@AuxilioTransporte', 'decimal(18,2)'), 0),
            --@PagoVacaciones = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Devengados/ni:Vacaciones/ni:VacacionesComunes)[1]/@Pago', 'decimal(18,2)'), 0),
            --@PagoPrimas = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Devengados/ni:Primas)[1]/@Pago', 'decimal(18,2)'), 0),
            --@PagoCesantias = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Devengados/ni:Cesantias)[1]/@Pago', 'decimal(18,2)'), 0),
            --@InteresesCesantias = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Devengados/ni:Cesantias)[1]/@PagoIntereses', 'decimal(18,2)'), 0),

            --@DeduccionSalud = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Deducciones/ni:Salud)[1]/@Deduccion', 'decimal(18,2)'), 0),
            --@DeduccionPension = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Deducciones/ni:FondoPension)[1]/@Deduccion', 'decimal(18,2)'), 0),
            --@DeduccionFondoSol = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Deducciones/ni:FondoSolidaridadPensional)[1]/@DeduccionFSP', 'decimal(18,2)'), 0),
            --@RetencionFuente = ISNULL(@XML.value('(/ni:NominaIndividual/ni:Deducciones/ni:RetencionFuente)[1]', 'decimal(18,2)'), 0),


            @IdTipoRegimen =
            CASE
                WHEN @IdTipoIdent = 42 THEN 9 -- Tercero del Exterior
                WHEN @IdTipoIdent = 13 AND @TaxLevelCode LIKE '%O-15%' THEN 10 -- Gran Contribuyente Persona Natural
                WHEN @IdTipoIdent = 13 AND @TaxLevelCode = 'R-99-PN' THEN 6 -- Persona Natural No Responsable de IVA
                WHEN @IdTipoIdent = 13 THEN 2 -- Persona Natural Responsable de IVA
                WHEN @IdTipoIdent = 31 AND @TaxLevelCode LIKE '%O-15%' THEN 4 -- Gran Contribuyente
                WHEN @IdTipoIdent = 31 THEN 3 -- Persona Jurídica
                ELSE 6
            END

		IF @TipoDocSincro=1 AND @TipoDocumento NOT IN ( '05','95')
		BEGIN

		WITH XMLNAMESPACES (
            'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2' as inv,
            'urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2' as cn,
            'urn:oasis:names:specification:ubl:schema:xsd:DebitNote-2' as dn,
            'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2' as cbc,
            'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2' as cac
        )
        SELECT        
			@NitEmpresa = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)')
            ),
            @CiudadBodega = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName)[1]','varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName)[1]','varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName)[1]','varchar(50)')
            ),
            @CodigoCiudad = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(10)'),
                @XML.value('(/dn:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(10)')
            ),
            @NitProveedor = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID)[1]','varchar(50)')
            ),
            @NombreProveedor = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name)[1]','varchar(200)'),
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName)[1]','varchar(200)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName)[1]','varchar(200)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name)[1]','varchar(200)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName)[1]','varchar(200)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name)[1]','varchar(200)')
            ),
            @TipoIdentProveedor = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]','varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]','varchar(10)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID/@schemeName)[1]','varchar(10)')
            ),
            @DireccionCliente = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line)[1]','varchar(500)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line)[1]','varchar(500)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line)[1]','varchar(500)')
            ),
            @TelefonoCliente = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:Telephone)[1]','varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:Telephone)[1]','varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:Telephone)[1]','varchar(50)')
            ),
            @EmailCliente = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:ElectronicMail)[1]','varchar(100)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:ElectronicMail)[1]','varchar(100)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:ElectronicMail)[1]','varchar(100)')
            ),
            @IdCiudadCliente = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(20)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(20)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID)[1]','varchar(20)')
            ),
            @TaxLevelCode = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode)[1]', 'varchar(50)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode)[1]', 'varchar(50)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode)[1]', 'varchar(50)')
            ),
            @RespoTributaria = COALESCE(
                @XML.value('(/inv:Invoice/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID)[1]', 'varchar(10)'),
                @XML.value('(/cn:CreditNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID)[1]', 'varchar(10)'),
                @XML.value('(/dn:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID)[1]', 'varchar(10)')
            )
		END;

        SET @TipoDocumento = COALESCE(@TipoDocumento,'');
        
        IF @IdCreditNote IN (30,32)
        BEGIN
            SET @TipoDocumento = '92'; -- Nota Débito
        END;

        SELECT @IdDocumento = CASE 
            WHEN @TipoDocumento IN ('01','92') THEN 1 --FV y ND se convierten a FC
            WHEN @TipoDocumento = '91' THEN 15 -- NC se convierte a ND
            WHEN @TipoDocumento = '05' THEN 2 -- Doc Soporte convierte a FV
            WHEN @TipoDocumento = '95' THEN 15 -- Nota ajuste doc soporte a NC
            WHEN @TipoDocumento IN ('25','20','50','32','35','40','27','60', '45') THEN 1 -- Documentos POS se convierten a FC
            WHEN @TipoDocumento = '94' THEN 16 -- Nota de ajuste credito para docs equivalentes a ND
            ELSE NULL -- o algún valor por defecto si lo necesitas
        END
        

        SET @NumeroFacturaFull = (CASE WHEN @TipoDocumento = '01' THEN '' ELSE @TipoDocumento + '-' END) + @NumeroFactura;

        IF @TipoImplementacion = 0
        BEGIN
            -- Validamos que solo se puedan procesar facturas(01), Peajes(40; Sin probar) y notas crédito(91)
            IF @TipoDocSincro=0
            BEGIN
                IF @TipoDocumento NOT IN ('01','40','91','92', '05', '95','94','25','20','50','32','35','27','60', '45')
                BEGIN
                    RAISERROR('No se pueden procesar documentos que no sean ''Factura electrónica'' o ''Doc cobro peajes'' o ''Nota Crédito'' o ''Nota Débito'' o ''Documentos POS''.', 16, 1);
                    RETURN;
                END;

                -- Validamos que el documento no exista
                --//
                IF EXISTS (SELECT 1 FROM Encabezados WHERE NumDocumentoExt = @NumeroFacturaFull)
                BEGIN
                    RAISERROR('El documento %s ya existe en el sistema !', 16, 1, @NumeroFacturaFull);
                    RETURN;
                END;
                --//
            END;
            ELSE --Esto es para DOCUMENTO ENVIADO para generar distintos documentos
            BEGIN
                DECLARE @IdPrefijo VARCHAR(10);

                IF @Prefijo IS NOT NULL AND @Prefijo <> ''
                BEGIN
                    SELECT @IdPrefijo = IdPrefijo FROM Prefijos WHERE NomPrefijo = @Prefijo;

                    IF @IdPrefijo IS NULL
                    BEGIN
                        RAISERROR('El prefijo "%s" no existe en el sistema, debe crearlo!', 16, 1, @Prefijo);
                        RETURN;
                    END;
                END;

                SELECT @IdDocumento = CASE  
                    WHEN @TipoDocumento IN ('01') THEN 2  --FV se convierte a FV
                    WHEN @TipoDocumento = '91' THEN 15 -- NC se convierte a NC
                    WHEN @TipoDocumento = '92' THEN 16 -- ND se convierte a ND
                    WHEN @TipoDocumento = '05' THEN 44 -- Doc Soporte convierte a Doc Soporte
                    WHEN @TipoDocumento = '95' THEN 16 -- Nota ajuste doc soporte a ND
                    WHEN @TipoDocumento = '94' THEN 15 -- Nota de ajuste credito para docs equivalentes a NC
                    WHEN @TipoDocumento IN ('25','20','50','32','35','40','27','60', '45') THEN 46 -- Documentos POS se convierten a FV POS
                    ELSE NULL -- o algún valor por defecto si lo necesitas
                END 
                IF @TipoDocumento NOT IN ('01','91', '92', '05', '95','94', '25','20','50','32','35','40','27','60', '45')
                BEGIN
                    RAISERROR('No se pueden procesar documentos que no sean ''Factura electrónica'' o "Nota Crédito" o "Nota Debito" o "Documentos POS".', 16, 1);
                    RETURN;
                END;
            END;
            
            -- Validamos que tengamos los datos mínimos necesarios
            IF @NumeroFactura IS NULL OR @FechaFactura IS NULL OR @ValorTotal IS NULL OR @NitProveedor IS NULL
            BEGIN
                RAISERROR('No se pudieron extraer todos los datos necesarios de la factura.', 16, 1);
                RETURN;
            END;

            --Se inicia aqui la transaccion para que se haga el insert de DocElectronicos_Equivalencias
            BEGIN TRANSACTION;

            -- Buscamos o creamos el proveedor si no existe
            DECLARE @IdCliente INT;
            SELECT TOP 1 @IdCliente = IdCliente FROM Clientes WHERE Identificacion = @NitProveedor;

            -- Si el cliente no existe, lo creamos junto con su dirección
            IF @IdCliente IS NULL
            BEGIN
                -- Calculamos el DV
                DECLARE @DVCliente VARCHAR(2) = NULL;
                IF @TipoIdentProveedor=31
                    SET @DVCliente = dbo.GetDigitoVerificacion(@NitProveedor);

                -- Insertamos el cliente
                INSERT INTO Clientes (
                    Identificacion,
                    Nombre1,
                    EsActivo,
                    IdTipoIdent,
                    DVCliente,
                    IdCiudad,
                    IdTipoRegimen,
                    TarifaIca,
                    CupoCreditoPlazo,
                    ComisionTiene,
                    IdPais,
                    FechaCreacion,
                    FechaUltModificacion
                )
                VALUES (
                    @NitProveedor,
                    @NombreProveedor,
                    1,
                    @IdTipoIdent,
                    @DVCliente,
                    @IdCiudadCliente,
                    @IdTipoRegimen,
                    NULL,
                    NULL,
                    NULL,
                    48,
                    GETDATE(),
                    GETDATE()
                );
            
                SET @IdCliente = SCOPE_IDENTITY();

                -- Obtenemos el IdTipoDir mínimo
                DECLARE @IdTipoDir INT;
                SELECT @IdTipoDir = MIN(IdTipoDir) FROM Clientes_TiposDireccion;

                -- Insertamos la dirección del cliente
                INSERT INTO Clientes_Direcciones (
                    IdCliente,
                    IdTipoDir,
                    Direccion,
                    DireccionFormato1,
                    DireccionFormato2,
                    Telefonos,
                    Celular,
                    Email,
                    IdCiudad,
                    Nota,
                    EsDirPrincipal,
                    Subdivision,
                    CodigoPostal
                )
                VALUES (
                    @IdCliente,
                    @IdTipoDir,
                    @DireccionCliente,
                    @DireccionCliente,
                    @DireccionCliente,
                    @TelefonoCliente,
                    @TelefonoCliente,
                    @EmailCliente,
                    @IdCiudadCliente,
                    NULL,
                    1,
                    NULL,
                    @CodigoCiudad
                );

                -- Insertamos las asociaciones del cliente
                INSERT INTO Clientes_Asociacion (IdCliente, IdTipo) VALUES (@IdCliente, 5);
                INSERT INTO Clientes_Asociacion (IdCliente, IdTipo) VALUES (@IdCliente, 8);

                --Insertamos las Responsabilidades Fiscales
                INSERT INTO Clientes_ResponFiscal (IdCliente, IdResFiscal)
				SELECT 
					@IdCliente,
					RF.IdResFiscal
				FROM [iter$charlist_to_tbl](@TaxLevelCode, ';') AS C
				INNER JOIN FacturacionElectronica_ResponsabilidadFiscal RF
					ON RF.CodResFiscal = LTRIM(RTRIM(C.str));

                --Insertamos la responsabilidad tributaria
                DECLARE @IdResponsabilidadTributaria INT;
                SELECT @IdResponsabilidadTributaria = IdTipo FROM Impuestos_Tipos WHERE CodTipo = @RespoTributaria
                INSERT INTO Clientes_Tributos (IdCliente, IdTipo) VALUES (@IdCliente,@IdResponsabilidadTributaria);

            END;

            -- Obtenemos el IdClienteDir principal
            DECLARE @IdClienteDir INT;
            SELECT @IdClienteDir = MAX(idclientedir) 
            FROM Clientes_Direcciones 
            WHERE EsDirPrincipal = 1 AND IdCliente = @IdCliente;

            -- Obtenemos el plazo del cliente
            SELECT @PlazoCliente = ISNULL(CupoCreditoPlazo, 0) 
            FROM Clientes 
            WHERE IdCliente = @IdCliente;

            -- Buscamos el ID de la moneda
            DECLARE @IdMoneda INT;
            IF @CodigoMoneda = 'COP'
                SET @IdMoneda = 1; -- Asumimos que 1 es el ID para COP
            ELSE
            BEGIN
                SELECT TOP 1 @IdMoneda = IdMoneda
                FROM Monedas
                WHERE Abrev = @CodigoMoneda
                OR NomMoneda1 = @CodigoMoneda;

                IF @IdMoneda IS NULL
                    SET @IdMoneda = 1; -- Default a COP si no se encuentra
            END;


            -- Buscamos la empresa por su NIT
            DECLARE @IdEmpresa INT;
            SELECT TOP 1 @IdEmpresa = IdEmpresa
            FROM Empresas
            WHERE EmpresaNit = @NitEmpresa;

            IF @IdEmpresa IS NULL
            BEGIN
                RAISERROR('No se encontró la empresa con NIT: %s', 16, 1, @NitEmpresa);
                RETURN;
            END;

            IF @TipoDocSincro=1
            BEGIN

				SET @NumeroFactura = SUBSTRING(@NumeroFactura, LEN(@Prefijo) + 1, LEN(@NumeroFactura));

				DECLARE @EsAnulado BIT;
				SELECT @EsAnulado = CAST(ISNULL((SELECT TOP 1 ValParametro FROM Parametros WHERE CodParametro = 46), '1' ) AS BIT );

				IF EXISTS (
					SELECT 1
					FROM Encabezados
					WHERE IdEmpresa = @IdEmpresa
						AND NumDocumento = @NumeroFactura
						AND IdDocumento = @IdDocumento
						AND IdPrefijo = @IdPrefijo
						AND ((@EsAnulado = 1 AND EsAnulado = 0) OR (@EsAnulado = 0))
						AND IdEncab <> 0
				)
				BEGIN
					RAISERROR('El documento %s ya existe en el sistema!', 16, 1, @NumeroFactura);
					RETURN;
				END;
            END;

            -- Bodega principal predterminada
            DECLARE @IdBodega INT = 1; -- Valor por defecto
            SET @Vence = DATEADD(day, @PlazoCliente, @FechaFactura)

			IF @TipoDocSincro=0 --Documentos Recibidos
			BEGIN

            SET @PrefijoSelec = NULLIF(@PrefijoSelec, '');
            
            -- Insertar en Encabezados
            INSERT INTO Encabezados 
            (
                IdEmpresa,
                IdDocumento,
                IdPrefijo,
                NumDocumentoExt,
                Fecha,
                IdCliente1,
                IdCliente1_IdDir,
                IdMoneda,
                ValorTRM,
                ValorPago,
                Nota,
                IdFormaPago,
                Vence,
                FechaCreacion,
                FechaUltModificacion
            )
            VALUES (
                @IdEmpresa,
                @IdDocumento,
                @PrefijoSelec,
                @NumeroFacturaFull,
                @FechaFactura,
                @IdCliente,
                @IdClienteDir,
                @IdMoneda,
                0,                  -- ValorTRM siempre 0
                0,
                'Importado automáticamente',
                @IdFormaPago,
                @Vence,
                GETDATE(),
                GETDATE()
            );
			END;
			ELSE -- Documentos Enviados
			BEGIN 

			INSERT INTO Encabezados 
            (
                IdEmpresa,
                IdDocumento,
                NumDocumento,
                NumDocumentoExt,
				IdPrefijo,
                Fecha,
                IdCliente1,
                IdCliente1_IdDir,
                IdMoneda,
                ValorTRM,
                ValorPago,
                Nota,
                IdFormaPago,
                Vence,
                FechaCreacion,
                FechaUltModificacion
            )
            VALUES (
                @IdEmpresa,
                @IdDocumento,
                @NumeroFactura,
                @NumeroFacturaFull,
				@IdPrefijo,
                @FechaFactura,
                @IdCliente,
                @IdClienteDir,
                @IdMoneda,
                0,                  -- ValorTRM siempre 0
                0,
                'Importado automáticamente',
                @IdFormaPago,
                @Vence,
                GETDATE(),
                GETDATE()
            );
			END;

            SET @IdEncab = SCOPE_IDENTITY();
        
        END; -- Fin If TipoImplementacion = 0

        --*************************************************************************
		--ITERAR ITEMS
        DECLARE @TotalItems INT
        DECLARE @Index INT = 1
        DECLARE @IdInventario INT;
        DECLARE @IdUnidad INT = 1; -- Valor por defecto
        DECLARE @CodInventario VARCHAR(50);
        DECLARE @CodInventario2 VARCHAR(50);
        DECLARE @CodInventario3 VARCHAR(50);
        DECLARE @NomInventario VARCHAR(500);
        DECLARE @ValorUnitario NUMERIC(18,2);

        --Equivalencias
        DECLARE @EqSenFind                 BIT;
        DECLARE @EqIdEquiv                 INT;
        DECLARE @EqIdInventario            INT;
        DECLARE @EqIdTipoInv               INT;
        DECLARE @EqIdContab               INT;
        DECLARE @EqCodInventario_Pref      NVARCHAR(50);     

        -- Crear tabla temporal para los ítems
		CREATE TABLE #ItemsXML (
			RowNum INT PRIMARY KEY,
			CodInventario VARCHAR(20),
			CodInventario2 VARCHAR(20),
			CodInventario3 VARCHAR(20),
			NomInventario VARCHAR(500),
			Cantidad DECIMAL(18,2),
			ValorTotal DECIMAL(18,2),
			ValorUnitario NUMERIC(18,2),
			ValorIva DECIMAL(18,2),
			ValorINC DECIMAL(18,2),
			ValorIC DECIMAL(18,2),
			ValorIBUA DECIMAL(18,2),
			ValorICUI DECIMAL(18,2),
			ValorICL DECIMAL(18,2),
			ValorADV DECIMAL(18,2),
			FactorDescuento DECIMAL(18,2)
		);

		-- Extraer todos los ítems del XML en bloque
		WITH XMLNAMESPACES (
			'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2' AS cac,
			'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2' AS cbc
		)
		INSERT INTO #ItemsXML
		SELECT
			ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum,
			X.value('(cbc:ID)[1]', 'varchar(20)'),
			X.value('(cac:Item/cac:SellersItemIdentification/cbc:ID)[1]', 'varchar(20)'),
			X.value('(cac:Item/cac:StandardItemIdentification/cbc:ID)[1]', 'varchar(20)'),
			X.value('(cac:Item/cbc:Description)[1]', 'varchar(500)'),
			COALESCE(
				X.value('(cbc:InvoicedQuantity)[1]', 'decimal(18,2)'),
				X.value('(cbc:CreditedQuantity)[1]', 'decimal(18,2)'),
                X.value('(cbc:DebitedQuantity )[1]', 'decimal(18,2)')
			),
			X.value('(cbc:LineExtensionAmount)[1]', 'decimal(18,2)'),
			X.value('(cac:Price/cbc:PriceAmount)[1]', 'numeric(18,2)'),
			X.value('(cac:TaxTotal/cac:TaxSubtotal[cac:TaxCategory/cac:TaxScheme/cbc:ID="01"]/cac:TaxCategory/cbc:Percent)[1]', 'decimal(18,2)'), --Valor IVA
			X.value('(cac:TaxTotal/cac:TaxSubtotal[cac:TaxCategory/cac:TaxScheme/cbc:ID="04"]/cbc:TaxAmount)[1]', 'decimal(18,2)'), --Valor INC
			X.value('(cac:TaxTotal/cac:TaxSubtotal[cac:TaxCategory/cac:TaxScheme/cbc:ID="02"]/cbc:TaxAmount)[1]', 'decimal(18,2)'), --Valor IC
			X.value('(cac:TaxTotal/cac:TaxSubtotal[cac:TaxCategory/cac:TaxScheme/cbc:ID="34"]/cbc:TaxAmount)[1]', 'decimal(18,2)'), --Valor IBUA
			X.value('(cac:TaxTotal/cac:TaxSubtotal[cac:TaxCategory/cac:TaxScheme/cbc:ID="35"]/cac:TaxCategory/cbc:Percent)[1]', 'decimal(18,2)'), --Valor ICUI
			X.value('(cac:TaxTotal/cac:TaxSubtotal[cac:TaxCategory/cac:TaxScheme/cbc:ID="32"]/cbc:TaxAmount)[1]', 'decimal(18,2)'), --Valor ICL
			X.value('(cac:TaxTotal/cac:TaxSubtotal[cac:TaxCategory/cac:TaxScheme/cbc:ID="36"]/cbc:TaxAmount)[1]', 'decimal(18,2)'), --Valor ADV
			X.value('(cac:AllowanceCharge/cbc:MultiplierFactorNumeric)[1]', 'decimal(18,2)')
		FROM @XML.nodes('/*[local-name()="Invoice" or local-name()="CreditNote" or local-name()="DebitNote"]/cac:*[local-name()="InvoiceLine" or local-name()="CreditNoteLine" or local-name()="DebitNoteLine"]') AS T(X);


        SET @TotalItems = (SELECT COUNT(*) FROM #ItemsXML);

 
        -- Bucle para procesar cada uno
        WHILE @Index <= @TotalItems
        BEGIN
            -- Inicializar
            SET @EqSenFind                 = 0;
            SET @EqIdEquiv                 = NULL;
            SET @EqIdInventario            = NULL;
            SET @EqIdTipoInv               = NULL;
            SET @EqIdContab                = NULL;
            SET @EqCodInventario_Pref      = NULL;
            SET @IdInventario              = NULL;

           SELECT
                @CodInventario  = COALESCE(CodInventario3, CodInventario2, CodInventario),
                @NomInventario  = NomInventario,
                @Cantidad       = Cantidad,
                @ValorTotal     = ValorTotal,
                @ValorUnitario  = ValorUnitario,
                @ValorIva       = ISNULL(ValorIva, 0),
                @ValorINC       = ISNULL(ValorINC, 0),
                @ValorIC        = ISNULL(ValorIC, 0),
                @ValorIBUA      = ISNULL(ValorIBUA, 0),
                @ValorICUI      = ISNULL(ValorICUI, 0),
                @ValorICL       = ISNULL(ValorICL, 0),
                @ValorADV       = ISNULL(ValorADV, 0),
                @FactorDescuento = ISNULL(FactorDescuento, 0)
            FROM #ItemsXML
            WHERE RowNum = @Index;

                SET @ValorINC = COALESCE(@ValorINC, @ValorIC, 0);
				SET @ValorIC = COALESCE(@ValorIC, 0);
                SET @ValorIBUA = COALESCE(@ValorIBUA, 0);
                SET @ValorICUI = COALESCE(@ValorICUI, 0);
				SET @ValorICL = COALESCE(@ValorICL, 0);
				SET @ValorADV = COALESCE(@ValorADV, 0);
				SET @ValorINC = @ValorINC+@ValorICL+@ValorADV;
                SET @TipoImpuestoSaludable = 0; --0 = Impuesto ICUI, 1 = Impuesto IBUA
                IF @ValorIBUA > 0
                    SET @TipoImpuestoSaludable = 1;

            -- Revisa si tiene el codigo personalizado o uno generico
            SET @CodInventario = COALESCE(@CodInventario3,@CodInventario2, @CodInventario);
            SET @ValorIva = COALESCE(@ValorIva, 0);
            SET @FactorDescuento = COALESCE(@FactorDescuento, 0);

            IF @TipoImplementacion = 0
                BEGIN
                --Caso Equivalencias NomInventario
                --//
                IF (@EqSenFind=0)
                BEGIN
                    SELECT @EqIdEquiv = IdEquiv , @EqIdInventario = IdInventario,  @EqIdTipoInv = IdTipoInv, @EqIdContab= IdContab, @EqCodInventario_Pref = CodInventario_Pref
                    FROM DocElectronicos_Equivalencias 
                    WHERE 
                    (IdTipoIdent = @IdTipoIdent AND Identificacion=@NitProveedor) AND 
                    (NomInventario_Operador IS NOT NULL AND NomInventario IS NOT NULL) AND 
                    (
                        (NomInventario_Operador = 0 AND @NomInventario = NomInventario ) OR
                        (NomInventario_Operador = 1 AND @NomInventario LIKE '%' + NomInventario + '%') OR
                        (NomInventario_Operador = 2 AND @NomInventario LIKE NomInventario + '%') OR
                        (NomInventario_Operador = 3 AND @NomInventario LIKE '%' + NomInventario)
                    ) AND
                    (ValorIva = @ValorIva OR ValorIva IS NULL)
                    ORDER BY CASE WHEN ValorIva = @ValorIva THEN 1 WHEN ValorIva IS NULL THEN 2 END;

                    IF @EqIdEquiv IS NOT NULL
                        SET @EqSenFind = 1
                END
                --//

                --Caso Equivalencias CodInventario
                --//
                IF (@EqSenFind=0)
                BEGIN
                    SELECT @EqIdEquiv = IdEquiv , @EqIdInventario = IdInventario,  @EqIdTipoInv = IdTipoInv, @EqIdContab= IdContab, @EqCodInventario_Pref = CodInventario_Pref
                    FROM DocElectronicos_Equivalencias 
                    WHERE 
                    (IdTipoIdent = @IdTipoIdent AND Identificacion=@NitProveedor) AND 
                    (CodInventario_Operador IS NOT NULL AND CodInventario IS NOT NULL) AND 
                    (
                        (CodInventario_Operador = 0 AND @CodInventario = CodInventario ) OR
                        (CodInventario_Operador = 1 AND @CodInventario LIKE '%' + CodInventario + '%') OR
                        (CodInventario_Operador = 2 AND @CodInventario LIKE CodInventario + '%') OR
                        (CodInventario_Operador = 3 AND @CodInventario LIKE '%' + CodInventario)
                    ) AND
                    (ValorIva = @ValorIva OR ValorIva IS NULL)
                    ORDER BY CASE WHEN ValorIva = @ValorIva THEN 1 WHEN ValorIva IS NULL THEN 2 END;
                
                    IF @EqIdEquiv IS NOT NULL
                        SET @EqSenFind = 1
                END
                --//
            
                --Caso Equivalencias General por TipoIdent y Proveedor
                --//
                IF (@EqSenFind=0)
                BEGIN
                    SELECT TOP 1 @EqIdEquiv = IdEquiv , @EqIdInventario = IdInventario,  @EqIdTipoInv = IdTipoInv, @EqIdContab= IdContab, @EqCodInventario_Pref = CodInventario_Pref
                    FROM DocElectronicos_Equivalencias 
                    WHERE 
                    (IdTipoIdent = @IdTipoIdent AND Identificacion=@NitProveedor) AND
                    (ValorIva = @ValorIva OR ValorIva IS NULL)
                    ORDER BY CASE WHEN ValorIva = @ValorIva THEN 1 WHEN ValorIva IS NULL THEN 2 END;

                    IF @EqIdEquiv IS NOT NULL
                        SET @EqSenFind = 1
                END
                --//

                --Caso Equivalencias General
                --//
                IF (@EqSenFind=0)
                BEGIN
                    SELECT TOP 1 @EqIdEquiv = IdEquiv , @EqIdInventario = IdInventario,  @EqIdTipoInv = IdTipoInv, @EqIdContab= IdContab, @EqCodInventario_Pref = CodInventario_Pref
                    FROM DocElectronicos_Equivalencias 
                    WHERE 
                    (ValorIva = @ValorIva OR ValorIva IS NULL)
                    ORDER BY CASE WHEN ValorIva = @ValorIva THEN 1 WHEN ValorIva IS NULL THEN 2 END;

                    IF @EqIdEquiv IS NOT NULL
                        SET @EqSenFind = 1
                END
                --//

                IF (@EqSenFind =0)
                BEGIN
                    DECLARE @NomTipoIdent NVARCHAR(100);
                    SELECT @NomTipoIdent = NomTipoIdent FROM Clientes_TiposIdent WHERE IdTipoIdent = @IdTipoIdent;

                    DECLARE @strValorIVA NVARCHAR(200) = CAST(@ValorIva AS NVARCHAR(200));
                    RAISERROR('Doc %s : No se encontró equivalencia con TipoIdent: %s, Número: %s, Inventario: %s, ValorIva: %s', 16, 1, @NumeroFacturaFull, @NomTipoIdent, @NitProveedor, @CodInventario, @strValorIVA);
                    RETURN;
                END;

                --Obtener el id del inventario
                --//
                DECLARE @CodInventarioFull NVARCHAR(50);
                DECLARE @tIdTipoInv INT = NULL;

                SET @CodInventarioFull = COALESCE(@EqCodInventario_Pref, '') + @CodInventario;

                IF (@EqIdInventario IS NULL)
                BEGIN
                    SELECT TOP 1 @IdInventario = IdInventario, @tIdTipoInv = IdTipoInv FROM Inventarios WHERE CodInventario = @CodInventarioFull;


                    DECLARE @TipoInvMovCSV varchar(200);
                    SELECT @TipoInvMovCSV = REPLACE(ISNULL(TipoInvMov,''),' ','')
                    FROM dbo.Documentos
                    WHERE IdDocumento = @IdDocumento;

                    -- Obtener nombre del tipo actual
					DECLARE @NomTipoInvActual VARCHAR(100);
					SELECT @NomTipoInvActual = NomTipoInven
					FROM Inventarios_Tipos
					WHERE IdInvenTipo = @tIdTipoInv;

					-- Obtener nombres permitidos
					DECLARE @NombresPermitidos VARCHAR(MAX);
					SELECT @NombresPermitidos = COALESCE(@NombresPermitidos + ', ', '') + IT.NomTipoInven
					FROM Inventarios_Tipos IT
					INNER JOIN [iter$charlist_to_tbl](@TipoInvMovCSV, ',') AS Split
						ON IT.IdInvenTipo = TRY_CAST(Split.str AS INT);

                    --Validar el tipo de inventario permitido de manera dinámica
                    --//
                    IF (@IdInventario IS NOT NULL)
                       AND CHARINDEX(',' + CAST(@tIdTipoInv AS varchar(10)) + ',', ',' + @TipoInvMovCSV + ',') = 0
                    BEGIN
                        RAISERROR(
							'Documento %s: El tipo de inventario "%s" no está permitido para este documento. Tipos permitidos: %s.',
							16, 1,
							@NumeroFacturaFull,
							@NomTipoInvActual,
							@NombresPermitidos
						);
                        RETURN;
                    END
                    --//

                    --Validar si toca crear un producto y no tiene una contabilizacion definida
                    --//
                    IF (@IdInventario IS NULL) AND (@EqIdContab IS NULL)
                    BEGIN
                        RAISERROR('Doc %s : No existe una contabilización definida, para la creación del producto %s', 16, 1, @NumeroFacturaFull, @CodInventarioFull);
                        RETURN;
                    END
                    --//

                    IF @IdInventario IS NULL
                    BEGIN
                        -- Aquí deberíamos insertar el nuevo producto
                        INSERT INTO Inventarios 
                        (
                            CodInventario,
                            NomInventario,
                            EsActivo,
                            CantMaxima,
                            CantMinima, 
                            PuntoReorden,
                            IdUnidad,
                            ValorIva,
							TipoImptoConsumo,
                            ValorImptoConsumo,
                            ImptoSaludableTipo,
                            IdTipoInv,
                            IdContab,
                            ValorUtilidadEst,
                            TipoVentaKit,
                            FechaCreacion,
                            FechaUltModificacion
                        )
                        VALUES (
                            @CodInventarioFull,
                            @NomInventario,
                            1,
                            NULL,
                            NULL,
                            NULL,
                            1,
                            @ValorIva,
							1,
                            @ValorINC/@Cantidad,
                            @TipoImpuestoSaludable,
                            COALESCE(@EqIdTipoInv,1),
                            @EqIdContab,
                            NULL,
                            NULL,
                            GETDATE(),
                            GETDATE()
                        );
            
                        SET @IdInventario = SCOPE_IDENTITY();
                    END;
                END;
                ELSE
                BEGIN
                    SET @IdInventario = @EqIdInventario;
                END;
                --//

                --Verificar si el producto tiene contabilizacion
                --//
                DECLARE @tIdContab INT = NULL
                SELECT @tIdContab = IdContab from Inventarios where IdInventario = @IdInventario
                IF (@tIdContab IS NULL)
                BEGIN
                    RAISERROR('Doc %s : No se encontró una contabilización para el inventario : %s', 16, 1, @NumeroFacturaFull, @CodInventarioFull);
                    RETURN;
                END
                --//
                
                -- Insertar movimiento inventario
                INSERT INTO Encabezados_Mov 
				    (
					    IdEncab,
					    IdInventario,
					    IdBodega,
					    IdLote,
					    Cantidad,
					    CantidadFisica,
					    IdUnidad,
					    FactorCantidad,
					    FactorMovim,
					    ValorUnitario,
					    ValorUnitarioExt,
					    ValorIva,
						TipoImptoConsumo,
					    ValorImptoConsumo,
					    ImptoSaludableValor,
					    ImptoSaludableTipo,
					    TotalMov,
					    IdCliente,
					    IdMoneda,
					    Nota,
					    Vence,
					    IdCentroCosto,
					    Dcto,
					    FechaCreacion,
					    FechaUltModificacion
				    )
				    VALUES (
					    @IdEncab,
					    @IdInventario,     -- Ya era dinámico
					    @IdBodega,         -- Ahora dinámico basado en la ubicación
					    NULL,              -- IdLote
					    @Cantidad,         -- Ya era dinámico
					    NULL,              -- CantidadFisica
					    @IdUnidad,         -- Ya era dinámico
					    1,         -- Ya era dinámico
					    1,                 -- FactorMovim
					    @ValorUnitario,    -- Ya era dinámico
					    NULL,              -- ValorUnitarioExt
					    @ValorIva, -- Ya era dinámico
						1,
					    @ValorINC/@Cantidad,          -- ValorImptoConsumo
					    CASE WHEN @TipoImpuestoSaludable = 0 THEN @ValorICUI ELSE @ValorIBUA/@Cantidad END,
					    @TipoImpuestoSaludable,
					    NULL,       -- Ya era dinámico
					    @IdCliente,        -- Ya era dinámico
					    1,
					    'Factura XML: ' + @NumeroFacturaFull + ' - ' + @NomInventario,
					    @Vence,              -- Vence
					    NULL,              -- IdCentroCosto
					    @FactorDescuento,   -- Ya era dinámico
					    GETDATE(),
					    GETDATE()
				    );
                END -- Fin If TipoImplementacion = 0
                ELSE
                BEGIN
			        -- 3) Insertar equivalencia 
			        INSERT INTO DocElectronicos_Equivalencias (
				        IdTipoIdent, 
				        Identificacion, 
				        NombreCompleto,
				        NomInventario_Operador, 
				        NomInventario,
				        CodInventario_Operador, 
				        CodInventario,
				        ValorIva, 
                        ValorConsumo,
						TipoSaludable,
				        IdInventario, 
				        IdTipoInv, 
				        IdContab, 
				        CodInventario_Pref
			        )
			        SELECT
				        @IdTipoIdent, 
				        @NitProveedor, 
				        @NombreProveedor,
				        0, 
				        @NomInventario,
				        0, 
				        @CodInventario,
				        @ValorIva, 
                        @ValorINC,
                        CASE 
                            WHEN @ValorICUI > 0 THEN 0 -- Impuesto ICUI
                            WHEN @ValorIbua > 0 THEN 1 -- Impuesto IBUA
                            ELSE NULL
                        END,
				        NULL, 
				        NULL, 
				        NULL, 
				        NULL
			        WHERE NOT EXISTS (
				        SELECT 1
				        FROM DocElectronicos_Equivalencias e
				        WHERE ISNULL(LTRIM(RTRIM(e.Identificacion)),'') = ISNULL(LTRIM(RTRIM(@NitProveedor)),'')
				          AND ISNULL(LTRIM(RTRIM(e.CodInventario)),'') = ISNULL(LTRIM(RTRIM(@CodInventario)),'')
                          AND ISNULL(LTRIM(RTRIM(e.NomInventario)),'') = ISNULL(LTRIM(RTRIM(@NomInventario)),'')
			        );

                END; -- Fin Else TipoImplementacion = 1
                SET @Index = @Index + 1
            END

            IF @TipoImplementacion = 0
            BEGIN
                -- Retornamos el ID del encabezado creado
                SELECT @IdEncab as IdEncabezado;
                SET @IdEncabNew = @IdEncab;

                --Contabilizar Documento
                --//
                EXEC [dbo].[ContabilizarDoc] @IdEncab = @IdEncab, @Exito = @Exito OUTPUT, @InfoUsuario = N'0,--BASEDATOS--';
                --//

                COMMIT TRANSACTION;

                -- Si todo sale bien, establecemos el éxito
                --//
                SET @Exito = 1
                SET @MensajeError = FORMATMESSAGE(N'Documento ''%s'', procesado correctamente', @NumeroFacturaFull);
                RETURN
            END
            ELSE
            BEGIN
             -- Si todo sale bien, establecemos el éxito
                --//
                SET @Exito = 1
                SET @MensajeError = FORMATMESSAGE(N'Equivalencia del Documento ''%s'', copiada correctamente', @NumeroFacturaFull);
                RETURN
                --//
            END;
            --//
    END TRY
    BEGIN CATCH
        --si hay error hace rollback de la transacción
        IF XACT_STATE() <> 0    
            ROLLBACK TRANSACTION;

        -- Si hay error, enviamos el msg de error
        --//
        DECLARE @ErrorMsg NVARCHAR(4000) = ERROR_MESSAGE();
        SET @Exito = 0
        SET @MensajeError = @ErrorMsg;
        --//
    END CATCH;
END;
GO
PRINT N'Actualizando Función [dbo].[ufnContabilizacion_FormasPago]...';


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


GO
PRINT N'Actualizando Función [dbo].[ufnContabilizacion_Normal]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GenerarImptos]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[ActualizarAudit]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[ContabilizarDoc_Validar]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetArqueoCaja]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetComisiones]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetConsecutivosFaltantes]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetDocsDiferencias]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetEstadoCuenta]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetImptoRetenciones]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetInformeUGPP]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetInvKardexPorLote]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetKardexInventario]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetKardexInventarioPorAgrupaciones]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetLibroAuxiliar]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetMediosMagneticos]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetVEncabezados]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[Ziur_CrearClienteDeSistema]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[ContabilizarDoc]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[CalcularCostoVenta]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetDocsSinCruzar]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetVentasAgrupadoPorCliVend]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetDocumentosCierre]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetLibroDiario]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetNominaElectronica_ZiurOne]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetNominaItemsProgramados]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[ComisionesPorDoc]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetVacaciones]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GenerarCrucesCont]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetActivosFijosDet]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetInformeRIPS]...';


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


GO
PRINT N'Actualizando Procedimiento [dbo].[GetMovimientosFactElec]...';


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


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'Actualización completada.';


GO
--Actualizar datos de la version

IF NOT EXISTS (SELECT 1 FROM dbo.ZiurVersiones WHERE NumVersion = 985)
BEGIN
    INSERT INTO dbo.ZiurVersiones (IdVersion, NumVersion, Descripcion)
    VALUES (395, 985, 'Autonumeracion nomina,Col subactividad tabla Empresas, CodCiiu en SPGetPagoSeguridadSocial.');
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
