WITH notas_fiscais_num_min_max AS(

	SELECT
		nfs.id_empresa,
		mf.serie,
		mf.id_modelo_documento_fiscal,
		mf.codigo_modelo_documento,
		MIN(nfs.numero) AS num_min,
		MAX(nfs.numero) AS num_max
   	FROM nota_fiscal_saida AS nfs
	INNER JOIN modelo_documento_fiscal as mf on mf.id_modelo_documento_fiscal = nfs.id_modelo_documento_fiscal
	WHERE nfs.emissao BETWEEN :DataInicial - 30 AND :DataFinal + 30
	AND nfs.id_empresa IN (:IdEmpresaMultSlc)
	AND nfs.situacao IN (1, 2, 4) -- Situacao = Confirmado, Cancelado, Denegado
    AND nfs.numero_protocolo_nfe IS NOT NULL
    AND nfs.numero_protocolo_nfe != ''
	AND mf.codigo_modelo_documento IN ('55', '65') 
	AND nfs.emissao > CURRENT_DATE - 90
	GROUP BY 
		nfs.id_empresa,
		mf.serie,
		mf.codigo_modelo_documento,
		mf.id_modelo_documento_fiscal

    UNION ALL

    SELECT
		nfe.id_empresa,
		mf.serie,
		mf.id_modelo_documento_fiscal,
		mf.codigo_modelo_documento,
		MIN(nfe.numero) AS num_min,
		MAX(nfe.numero) AS num_max
	FROM nota_fiscal_entrada AS nfe
	INNER JOIN modelo_documento_fiscal AS mf ON (mf.id_modelo_documento_fiscal = nfe.id_modelo_documento_fiscal)
	WHERE nfe.emissao BETWEEN :DataInicial - 30 AND :DataFinal + 30 -- INFORMAR FILTRO DATA
	AND nfe.id_empresa IN (:IdEmpresaMultSlc)
	AND nfe.situacao IN (1, 2, 4) -- Situacao = Confirmado, Cancelado, Denegado
	AND mf.emissao_propria = 'S'
    AND nfe.numero_protocolo_nfe IS NOT NULL
    AND nfe.numero_protocolo_nfe != ''
	AND mf.codigo_modelo_documento IN ('55') 
	AND nfe.emissao > CURRENT_DATE - 120
    GROUP BY 
		nfe.id_empresa,
		mf.serie,
		mf.codigo_modelo_documento,
		mf.id_modelo_documento_fiscal

	ORDER BY  id_empresa, codigo_modelo_documento, serie


),

sequencia_notas_fiscais AS (

	SELECT
		nf.id_empresa,
		mf.id_modelo_documento_fiscal,
		mf.codigo_modelo_documento,
		mf.serie,
		generate_series(nf.num_min, nf.num_max, 1) AS numero
		
	FROM notas_fiscais_num_min_max AS nf
	INNER JOIN modelo_documento_fiscal as mf on mf.id_modelo_documento_fiscal = nf.id_modelo_documento_fiscal
	ORDER BY numero
),

notas_fiscais AS (

	SELECT 
		nfs.id_empresa,
		nfs.emissao,
        nfs.chave_acesso_nfe,
		nfs.numero,
		mf.id_modelo_documento_fiscal,
		mf.codigo_modelo_documento,
		mf.serie
	FROM nota_fiscal_saida AS nfs
	INNER JOIN modelo_documento_fiscal as mf on mf.id_modelo_documento_fiscal = nfs.id_modelo_documento_fiscal
    INNER JOIN sequencia_notas_fiscais AS snf ON snf.id_modelo_documento_fiscal = mf.id_modelo_documento_fiscal AND snf.id_empresa = nfs.id_empresa AND snf.numero = nfs.numero

	

	UNION ALL
	
	SELECT
		nfe.id_empresa,
		nfe.emissao,
        nfe.chave_acesso_nfe,
		nfe.numero,
		mf.id_modelo_documento_fiscal,
		mf.codigo_modelo_documento,
		mf.serie
	FROM nota_fiscal_entrada AS nfe
	INNER JOIN modelo_documento_fiscal AS mf ON (mf.id_modelo_documento_fiscal = nfe.id_modelo_documento_fiscal)
    INNER JOIN sequencia_notas_fiscais AS snf ON snf.id_modelo_documento_fiscal = mf.id_modelo_documento_fiscal AND snf.id_empresa = nfe.id_empresa AND snf.numero = nfe.numero


	ORDER BY  id_empresa, codigo_modelo_documento, serie,  emissao, numero, id_modelo_documento_fiscal
),



num_inutilizadas AS (

	SELECT
		nf.id_empresa,
        inu.numero_protocolo_inutilizacao,
		mf.id_modelo_documento_fiscal,
		mf.codigo_modelo_documento,
		mf.serie,
		generate_series(inu.numero_inicial, inu.numero_final, 1) AS numero
	FROM inutilizacao_dfe AS inu
	INNER JOIN modelo_documento_fiscal as mf on mf.id_modelo_documento_fiscal = inu.id_modelo_documento_fiscal
	INNER JOIN notas_fiscais_num_min_max AS nf ON nf.id_modelo_documento_fiscal =  inu.id_modelo_documento_fiscal
	WHERE (inu.numero_inicial >= nf.num_min and inu.numero_final <= nf.num_max)
),

union_unitilizadas_notas_fiscais AS (
	
	SELECT 
		id_empresa,
		id_modelo_documento_fiscal,
		codigo_modelo_documento,
		serie,
		numero
	FROM notas_fiscais
	UNION ALL
	SELECT 
		id_empresa,
		id_modelo_documento_fiscal,
		codigo_modelo_documento,
		serie,
		numero
	FROM num_inutilizadas
	GROUP BY
		id_empresa,
		id_modelo_documento_fiscal,
		codigo_modelo_documento,
		serie,
		numero
),



num_faltantes AS (

	SELECT
		se.nome,
		nf.id_empresa,
		nf.id_modelo_documento_fiscal,
		nf.codigo_modelo_documento,
		nf.serie,
		REPLACE(REPLACE(array_agg(nf.numero ORDER BY nf.numero)::TEXT,'{', ''), '}','') AS numero
		
	FROM sequencia_notas_fiscais AS nf
	INNER JOIN  sis_empresa as se on se.id_empresa = nf.id_empresa 
	LEFT JOIN union_unitilizadas_notas_fiscais AS r ON r.id_modelo_documento_fiscal = nf.id_modelo_documento_fiscal AND r.id_empresa = nf.id_empresa AND r.numero = nf.numero
	WHERE r.numero IS NULL
	GROUP BY 
		se.nome,
		nf.id_empresa,
		nf.id_modelo_documento_fiscal,
		nf.codigo_modelo_documento,
		nf.serie

)

select * from num_faltantes