IF OBJECT_ID('dbo.P_NAO_SANEADOS_PAGINADO') IS NOT NULL
    DROP PROCEDURE dbo.P_NAO_SANEADOS_PAGINADO;
GO

CREATE PROCEDURE dbo.P_NAO_SANEADOS_PAGINADO
(
    @DtIni DATE,
    @DtFim DATE,
    @FiltroProduto VARCHAR(200) = NULL,
    @UF 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;

    ------------------------------------------------------------
    -- TABELA TEMPORÁRIA FINAL (COLUNAS DO FLEX)
    ------------------------------------------------------------
    CREATE TABLE #DADOS
    (
        RN INT NOT NULL,
        DTHR_CAD DATETIME,
        UF CHAR(2),
        CD_PROD INT,
        EAN_ENVIADO VARCHAR(50),
        DS_PROD VARCHAR(200),
        NR_NCM VARCHAR(20),
        ALIQ_ICMS DECIMAL(10,2),
        TIPO_TRIBUTACAO_PIS_COFINS VARCHAR(20),
        DS_CONF_TRIB VARCHAR(200),
        LISTA_PROD VARCHAR(30),
        NR_CEST VARCHAR(20),
        CD_REGIAO_FISCAL INT,
        NM_REGIAO_FISCAL VARCHAR(100),
        MENSAGEM VARCHAR(4000)
    );

    ------------------------------------------------------------
    -- CARGA ÚNICA
    ------------------------------------------------------------
    INSERT INTO #DADOS
    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,

        COALESCE(EAN.CD_BARRA, CAST(GEP.CD_PROD AS VARCHAR(50))) AS EAN_ENVIADO,

        EP.DS_PROD,
        EP.NR_NCM,
        ICMS.ALIQ_ICMS,

        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,

        CONVERT(VARCHAR, CONF.CD_CTR) + ' - ' + TCG.DS_CONF_TRIB,

        CASE EP.LISTA_PROD
            WHEN 0 THEN '0 - POSITIVA'
            WHEN 1 THEN '1 - NEGATIVA'
            WHEN 2 THEN '2 - NEUTRA'
            WHEN 3 THEN '3 - NÃO USA LISTA'
        END,

        EP.NR_CEST,
        RC.CD_REGIAO_FISCAL,
        RF.NM_REGIAO_FISCAL,
        ERRO.MENSAGEM
    FROM GT_ENVIO_EMITENTE GE
    INNER JOIN GT_ENVIO_EMITENTE_ERRO ERRO
        ON ERRO.CD_CTR = GE.CD_CTR
    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 PRC_REGIAO_FISCAL RF
        ON RF.CD_REGIAO_FISCAL = RC.CD_REGIAO_FISCAL
    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 EST_PROD EP
        ON EP.CD_EMP = GEP.CD_EMP
       AND EP.CD_PROD = GEP.CD_PROD
    LEFT JOIN GT_RETORNO_CABECALHO_GRUPOS_PRODUTOS_EAN EAN
        ON EAN.CD_CTR_GRP_PROD = GEP.CD_CTR_ENVIO
    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
    WHERE CONVERT(DATE, GE.DTHR_CAD) BETWEEN @DtIni AND @DtFim
      AND (@UF IS NULL OR UF_DEST.CD_UF = @UF)
      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 + '%'
          );

    CREATE CLUSTERED INDEX IX_DADOS_RN ON #DADOS (RN);

    ------------------------------------------------------------
    -- 1º RECORDSET ? TOTAL
    ------------------------------------------------------------
    SELECT COUNT(1) AS TOTAL FROM #DADOS;

    ------------------------------------------------------------
    -- 2º RECORDSET ? PÁGINA
    ------------------------------------------------------------
    SELECT
        DTHR_CAD, UF, CD_PROD, EAN_ENVIADO, DS_PROD, NR_NCM,
        ALIQ_ICMS, TIPO_TRIBUTACAO_PIS_COFINS, DS_CONF_TRIB,
        LISTA_PROD, NR_CEST, CD_REGIAO_FISCAL, NM_REGIAO_FISCAL, MENSAGEM
    FROM #DADOS
    WHERE RN BETWEEN @Inicio AND @Fim
    ORDER BY RN;
END;
GO
