IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'dbo.[CP_Cbtes_Lotes_Facturar]') 
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE dbo.[CP_Cbtes_Lotes_Facturar] 
END
GO


CREATE PROCEDURE [dbo].[CP_Cbtes_Lotes_Facturar]
	@pLote				VARCHAR(29),
	@pFecha				DATETIME,
	@pDescripcion		VARCHAR(50),
	@pId_Lote_Tipo		SMALLINT,
	@pFecha_Desde		DATETIME,
	@pFecha_Hasta		DATETIME,
	@pId_Tipo_Cont      INT,
	@pId_Usuario		INT,
	@pFiltrarTarjeta    Tinyint,
	@pFiltrarCliente    Tinyint,
	@pFiltrarCondPago   Tinyint,
	@pFiltrarTipoCbte   Tinyint,
	@pFiltrarCantCont   INT,
	@pRefacturar        INT,
	@pIncl_Cbtes_Cero   Tinyint

AS 

SET NOCOUNT ON

/*Declaracion Variables Locales*/


DECLARE @pFlagUsarTrans			TINYINT
DECLARE @pModoDebug				TINYINT
DECLARE @pId_Contrato			INT
DECLARE @pFecha_QA				DATETIME
DECLARE @pFecha_Venc			DATETIME
DECLARE	@pId_Tiempo             CHAR(3)


DECLARE @Mensaje			VARCHAR(100)
		,@UltError			INT
		,@Id_Trans			INT
		,@Id_Cliente		INT
		,@Importe			DECIMAL(16,2)
		,@Email_Cob			VARCHAR(256)
		,@Id_Trans_Rec		INT
		,@CursorOpen        INT


DECLARE @Sql		VARCHAR(MAX)
DECLARE @SqlSaldo	VARCHAR(MAX)
DECLARE @SqlSelect	VARCHAR(MAX)
DECLARE @SqlFrom	VARCHAR(MAX)
DECLARE @SqlWhere	VARCHAR(MAX)
DECLARE @SqlGroup	VARCHAR(MAX)

DECLARE @Id_Contrato INT
DECLARE @Id_Tiempo CHAR(3)
DECLARE @Flag_Agru_Cli_Ref TINYINT

DECLARE @pJson		VARCHAR(8000)

SET @pFlagUsarTrans	= 0		/*Con 1 Tira error*/
SET @pModoDebug		= 0
SET @pFecha_QA		= @pFecha_Desde
SET @pFecha_Venc	= @pFecha_Hasta

BEGIN TRY

	  SELECT @Flag_Agru_Cli_Ref = Flag_Agru_Cli_Ref FROM Contratos_Tipos WHERE Id_Tipo_Con = @pId_Tipo_Cont

	  CREATE TABLE #CONTRATOS_PROCESAR  (
				ID_CONTRATO INT,
				ID_TIEMPO CHAR(3) )


	  DECLARE @Respuesta Table (
					ErrorNumber		INT,
					ErrorSeverity	INT,
					ErrorState		INT,
					ErrorProcedure  VARCHAR(1000),
					ErrorLine		INT,
					ErrorMessage	VARCHAR(1000)
					)

		SET @SqlSelect = 'SELECT O.ID_CONTRATO,ISNULL(O.ID_TIEMPO,'''')'

		IF @pFiltrarCantCont > 0 
		   SET @SqlSelect = 'SELECT TOP ' + CAST(@pFiltrarCantCont AS VARCHAR(10)) + '  O.ID_CONTRATO,ISNULL(O.ID_TIEMPO,'''')'

		SET @SqlFrom = 'FROM Contratos O,Clientes C'

		SET @SqlWhere = '  WHERE O.Id_Tipo_Con = ' + CAST(@pId_Tipo_Cont AS VARCHAR(10)) + '
							 AND O.Id_Cliente = C.Id_Cliente 
							 AND C.Activo = 1  AND O.Activo = 1
							 AND ( O.Fecha_Hasta >= '''+ CONVERT(VARCHAR(8),@pFecha_Desde+1,112) +'''
								 OR O.Fecha_Hasta IS NULL)
 							 AND O.Fecha_Desde < '''+ CONVERT(VARCHAR(8),@pFecha_Hasta+1,112) +'''
							 AND (O.Fecha_Cob_Hasta < '''+ CONVERT(VARCHAR(8),@pFecha_Hasta+1,112) +'''
								 OR O.Fecha_Cob_Hasta IS NULL)
							 AND EXISTS (SELECT P.Id_Contrato FROM Contratos_Prod P WHERE P.Id_Contrato = O.Id_Contrato 
											   AND ISNULL(P.Flag_Facturable,0) <> 0 )'


		 IF	@Flag_Agru_Cli_Ref <> 0 
    		SET @SqlWhere = RTRIM(LTRIM(@SqlWhere)) + ' AND ISNULL(C.Id_Cliente_Ref,0) = 0'

		 IF	@pFiltrarCondPago <> 0 
    		SET @SqlWhere = RTRIM(LTRIM(@SqlWhere)) + ' AND C.Id_Cond_Pago IN (SELECT CP.PTR FROM TagFile_ CP WHERE CP.USR = ' + CAST(@pId_Usuario AS VARCHAR(10)) + ' AND CP.TBL = 150)'
 
		 IF	@pFiltrarTipoCbte <> 0 
			SET @SqlWhere = RTRIM(LTRIM(@SqlWhere)) + ' AND O.Id_tipo_cbte IN (SELECT CT.POS FROM TagFilePos_ CT WHERE CT.USR = ' + CAST(@pId_Usuario AS VARCHAR(10)) + ' AND CT.TBL = 120)'

		 IF	@pFiltrarCliente <> 0 
			SET @SqlWhere = RTRIM(LTRIM(@SqlWhere)) + ' AND C.ID_CLIENTE IN (SELECT CP.PTR FROM TagFile_ CP WHERE CP.USR = ' + CAST(@pId_Usuario AS VARCHAR(10)) + ' AND CP.TBL = 400)'

		 IF	@pFiltrarTarjeta <> 0 
	 		SET @SqlWhere = RTRIM(LTRIM(@SqlWhere)) + ' AND ( ISNULL(O.Id_Tarjeta,'') IN (SELECT TAR.POS FROM TagFilePos_ TAR WHERE TAR.USR = ' + CAST(@pId_Usuario AS VARCHAR(10)) + ' AND TAR.TBL = 210)
															OR ISNULL(C.Id_Tarjeta,'') IN (SELECT TAR.POS FROM TagFilePos_ TAR WHERE TAR.USR = ' + CAST(@pId_Usuario AS VARCHAR(10)) + ' AND TAR.TBL = 210) )'

     

		SET  @SqlGroup	= 'ORDER BY O.ID_CLIENTE'

		SET @Sql = @SqlSelect +' '+ @SqlFrom + ' ' + @SqlWhere + ' ' + @SqlGroup
		PRINT @Sql

	
		INSERT INTO Cbtes_Lotes (Lote,Fecha,Descripcion,Id_Lote_Tipo,Flag_enProceso,Fecha_Inicio,Fecha_Desde,Fecha_Hasta,Observacion,Id_Tipo_Con)
			VALUES (@pLote,@pFecha,@pDescripcion,@pId_Lote_Tipo,1,GETDATE(),@pFecha_Desde,@pFecha_Hasta,@Sql,@pId_Tipo_Cont)

	

		INSERT INTO #CONTRATOS_PROCESAR
		   EXEC(@sql)

		DECLARE Cur_Facturar_Contratos CURSOR FOR
				   SELECT Id_Contrato,Id_Tiempo FROM #CONTRATOS_PROCESAR 

		OPEN Cur_Facturar_Contratos 
		FETCH NEXT FROM Cur_Facturar_Contratos INTO @Id_Contrato,@Id_Tiempo
		WHILE @@FETCH_STATUS=0
		BEGIN
			set @pId_Contrato = @Id_Contrato
			set @pId_Tiempo   = @Id_Tiempo

			SET @pJson =	'{' +
							dbo.CF_Json_ParsearVariable('FlagUsarTrans', @pFlagUsarTrans, 'TINYINT') + ',' +
							dbo.CF_Json_ParsearVariable('ModoDebug', @pModoDebug, 'TINYINT') + ',' +
							dbo.CF_Json_ParsearVariable('Omitir_Resultado_OK', 1, 'TINYINT') + ',' +		
							dbo.CF_Json_ParsearVariable('Refacturar', @pRefacturar, 'TINYINT') + ',' +
							dbo.CF_Json_ParsearVariable('Incl_Cbtes_Cero', @pIncl_Cbtes_Cero, 'TINYINT') + ',' +
						    dbo.CF_Json_ParsearVariable('Id_Tiempo', @pId_Tiempo, 'CHAR(3)') + ',' +
							dbo.CF_Json_ParsearVariable('Id_Contrato', @pId_Contrato, 'INT') + ',' +
							dbo.CF_Json_ParsearVariable('Id_Usuario', @pId_Usuario, 'SMALLINT') + ',' +
							dbo.CF_Json_ParsearVariable('Fecha', @pFecha, 'DATETIME') + ',' +
							dbo.CF_Json_ParsearVariable('Lote', @pLote, 'VARCHAR(20)') + ',' +
							dbo.CF_Json_ParsearVariable('Fecha_QA', @pFecha_QA, 'DATETIME') + ',' +
							dbo.CF_Json_ParsearVariable('Fecha_Venc', @pFecha_Venc, 'DATETIME') + ',' +
							dbo.CF_Json_ParsearVariable('Fecha_Rem_Desde', @pFecha_QA, 'DATETIME') + ',' +
							dbo.CF_Json_ParsearVariable('Fecha_Rem_Hasta', @pFecha_Venc, 'DATETIME') +
							'}'


			    EXEC @UltError = CPJ_Contrato_Facturar @pJson

	            IF @UltError <> 0 RAISERROR ('Error when calling CPJ_Contrato_Facturar ', 16,  1 ) 

 			FETCH NEXT FROM Cur_Facturar_Contratos INTO @Id_Contrato,@Id_Tiempo
		END
		CLOSE Cur_Facturar_Contratos
		DEALLOCATE Cur_Facturar_Contratos

		DROP TABLE #CONTRATOS_PROCESAR

		UPDATE Cbtes_Lotes SET	Cantidad = (SELECT COUNT(*) FROM Cbtes WHERE Lote = @pLote) ,
								Importe =  (SELECT SUM(Imp_Total) FROM Cbtes WHERE Lote = @pLote),
								Fecha_Finalizacion = GETDATE(),
								Flag_enProceso = 0
				WHERE Lote = @pLote

		SET @Mensaje = (SELECT DATEDIFF(s,Fecha_Inicio,Fecha_Finalizacion) FROM CBTES_LOTES WHERE LOTE = @pLote)

		SELECT	 0				AS ErrorNumber 
				,0				AS ErrorSeverity  
				,0				AS ErrorState 
				,0				AS ErrorProcedure  
				,0				AS ErrorLine		
				,@Mensaje		AS ErrorMessage

END TRY  


BEGIN CATCH  
    IF EXISTS(SELECT * FROM @RESPUESTA)
	   SELECT * FROM @RESPUESTA
	    
    EXECUTE usp_GetErrorInfo
	
	UPDATE Cbtes_Lotes SET	Cantidad = (SELECT COUNT(*) FROM Cbtes WHERE Lote = @pLote) ,
							Importe =  (SELECT SUM(Imp_Total) FROM Cbtes WHERE Lote = @pLote),
							Fecha_Finalizacion = GETDATE(),
							Flag_enProceso = 0
			WHERE Lote = @pLote

			IF (SELECT CURSOR_STATUS('global','Cur_Facturar_Contratos') ) = -1
			   DEALLOCATE curContratoGenerarCbtes_ItemsXRemitosPropiosTr		 

			IF (SELECT CURSOR_STATUS('global','Cur_Facturar_Contratos') ) = 1
			BEGIN
			   CLOSE Cur_Facturar_Contratos
			   DEALLOCATE Cur_Facturar_Contratos		 
			END


	RETURN 9999
END CATCH

RETURN 0



-- EXEC CP_Cbtes_Lotes_Facturar 'V9uD705taY4','20201201','FUNDOES P6RtBA VDUu079a8bYY4',1,'20201201','20201231',20,-1,0,0,0,0,0,1

