IF OBJECT_ID('P_SANEADOS_PAGINADO') IS NOT NULL
	DROP PROCEDURE P_SANEADOS_PAGINADO
GO

CREATE PROCEDURE dbo.P_SANEADOS_PAGINADO (
	@DtIni DATE
	,@DtFim DATE
	,@FiltroProduto VARCHAR(200) = NULL
	,@UF INT = NULL
	,@CdCarac INT = NULL
	,@RegiaoFiscal INT = NULL
	,@Pagina INT = 1
	,@TamPagina INT = 50
	)
AS
BEGIN
	SET NOCOUNT ON;

	DECLARE @Inicio INT = ((@Pagina - 1) * @TamPagina) + 1;
	DECLARE @Fim INT = @Pagina * @TamPagina;

	CREATE TABLE #TMP_SANEADOS (
		RN INT
		,DTHR_CAD DATETIME
		,UF CHAR(2)
		,CD_PROD INT
		,DS_PROD VARCHAR(200)
		,CD_BARRA VARCHAR(50)
		,NR_NCM VARCHAR(20)
		,NR_NCM_IMENDES VARCHAR(20)
		,ALIQ_ICMS DECIMAL(10, 2)
		,ALIQ_ICMS_IMENDES DECIMAL(10, 2)
		,TIPO_TRIBUTACAO_PIS_COFINS VARCHAR(20)
		,CST_PIS_COFINS_IMENDES VARCHAR(2)
		,DS_CONF_TRIB VARCHAR(200)
		,CD_REGIAO_FISCAL INT
		);

	INSERT INTO #TMP_SANEADOS
	SELECT ROW_NUMBER() OVER (
			ORDER BY CONVERT(DATE, GE.DTHR_CAD)
				,UF_DEST.UF
				,GEP.CD_PROD
			) AS RN
		,GE.DTHR_CAD
		,UF_DEST.UF
		,GEP.CD_PROD
		,EP.DS_PROD
		,EAN.CD_BARRA
		,EP.NR_NCM
		,GRP.NR_NCM AS NR_NCM_IMENDES
		,ICMS.ALIQ_ICMS
		,CASE 
			WHEN UF_ORIG.CD_UF = UF_DEST.CD_UF
				THEN CARAC.ALIQ_ICMS_INTERNA
			ELSE CARAC.ALIQ_ICMS_INTER_EST
			END AS ALIQ_ICMS_IMENDES
		,CASE EP.TIPO_TRIBUTACAO_PIS_COFINS
			WHEN 0
				THEN 'Deb/Cred'
			WHEN 1
				THEN 'Isento'
			WHEN 2
				THEN 'Mono'
			WHEN 3
				THEN 'T. Aliq Zero'
			END
		,CASE 
			WHEN LEFT(CARAC.CFOP, 1) IN (
					1
					,2
					,3
					)
				THEN RIGHT('0' + CONVERT(VARCHAR, PC.CST_ENT), 2)
			WHEN LEFT(CARAC.CFOP, 1) IN (
					5
					,6
					,7
					)
				THEN RIGHT('0' + CONVERT(VARCHAR, PC.CST_SAI), 2)
			END
		,CONVERT(VARCHAR, CONF.CD_CTR) + ' - ' + TCG.DS_CONF_TRIB
		,RC.CD_REGIAO_FISCAL
	FROM GT_ENVIO_EMITENTE GE
	INNER JOIN GT_ENVIO_EMITENTE_GT_RETORNO_CABECALHO LNK ON LNK.CD_CTR_ENVIO = GE.CD_CTR
	INNER JOIN GT_RETORNO_CABECALHO RC ON RC.CD_CTR = LNK.CD_CTR_RETORNO
	INNER JOIN GT_ENVIO_PERFIL_DEST PD ON PD.CD_CTR_ENVIO = GE.CD_CTR
	INNER JOIN GT_ENVIO_PERFIL_DEST_UF PDF ON PDF.CD_CTR_ENVIO = PD.CD_CTR_ENVIO
	INNER JOIN GLB_UF UF_DEST ON UF_DEST.UF = PDF.UF
	INNER JOIN GT_ENVIO_PRODUTOS GEP ON GEP.CD_CTR_ENVIO = PDF.CD_CTR_ENVIO
	INNER JOIN GT_RETORNO_CABECALHO_GRUPOS_PRODUTOS GRP ON GRP.CD_CTR_RETORNO = RC.CD_CTR
	INNER JOIN GT_RETORNO_CABECALHO_GRUPOS_PRODUTOS_EAN EAN ON EAN.CD_CTR_GRP_PROD = GRP.CD_CTR
	INNER JOIN GT_RETORNO_CABECALHO_GRUPOS_PRODUTOS_REGRA REG ON REG.CD_CTR_GRP_PROD = GRP.CD_CTR
	INNER JOIN GT_RETORNO_CABECALHO_GRUPOS_PRODUTOS_REGRA_UF REGUF ON REGUF.CD_CTR_REGRA = REG.CD_CTR
	INNER JOIN GT_RETORNO_CABECALHO_GRUPOS_PRODUTOS_REGRA_UF_CARAC CARAC ON CARAC.CD_CTR_REGRA_UF = REGUF.CD_CTR
	INNER JOIN EST_PROD EP ON EP.CD_EMP = GRP.CD_EMP
		AND EP.CD_PROD = GRP.CD_PROD
	INNER JOIN (
		SELECT CD_EMP
			,MAX(CD_CTR) CD_CTR
			,NR_NCM
		FROM EST_TRIB_CONF_GRP_NCM
		GROUP BY CD_EMP
			,NR_NCM
		) CONF ON CONF.CD_EMP = EP.CD_EMP
		AND CONF.NR_NCM = EP.NR_NCM
	INNER JOIN EST_TRIB_CONF_GRP TCG ON TCG.CD_EMP = CONF.CD_EMP
		AND TCG.CD_CTR = CONF.CD_CTR
	INNER JOIN GLB_UF UF_ORIG ON UF_ORIG.UF = GE.UF
	INNER JOIN EST_TRIB_ALIQ_ICMS ICMS ON ICMS.UF_ORIG = UF_ORIG.UF
		AND ICMS.UF_DEST = UF_DEST.UF
	INNER JOIN GT_RETORNO_CABECALHO_GRUPOS_PRODUTOS_PISCOFINS PC ON PC.CD_CTR_GRP_PROD = GRP.CD_CTR
	LEFT JOIN GT_ENVIO_EMITENTE_ERRO ERRO ON ERRO.CD_CTR = GE.CD_CTR
	WHERE CONVERT(DATE, GE.DTHR_CAD) BETWEEN @DtIni
			AND @DtFim
		AND ERRO.CD_CTR IS NULL
		AND (
			@UF IS NULL
			OR UF_DEST.CD_UF = @UF
			)
		AND (
			@CdCarac IS NULL
			OR CARAC.CD_CARAC = @CdCarac
			)
		AND (
			@RegiaoFiscal IS NULL
			OR RC.CD_REGIAO_FISCAL = @RegiaoFiscal
			)
		AND (
			@FiltroProduto IS NULL
			OR (
				ISNUMERIC(@FiltroProduto) = 1
				AND (
					(
						LEN(@FiltroProduto) > 12
						AND EAN.CD_BARRA = @FiltroProduto
						)
					OR (
						LEN(@FiltroProduto) <= 12
						AND GEP.CD_PROD = CONVERT(INT, @FiltroProduto)
						)
					)
				)
			OR EP.DS_PROD LIKE '%' + @FiltroProduto + '%'
			);

	--------------------------------------------------------------------
	-- 1º RECORDSET → TOTAL
	--------------------------------------------------------------------
	SELECT COUNT(1) AS TOTAL
	FROM #TMP_SANEADOS;

	--------------------------------------------------------------------
	-- 2º RECORDSET → PÁGINA
	--------------------------------------------------------------------
	SELECT *
	FROM #TMP_SANEADOS
	WHERE RN BETWEEN @Inicio
			AND @Fim
	ORDER BY RN;
END;
GO


