-- Saldo de Estoque Atual
WITH RECURSIVE niveis(id_categoria_item, id_categoria_item_pai) AS (
	SELECT	id_categoria_item,
		id_categoria_item_pai,
		1 AS nivel
	FROM	categoria_item
	WHERE	id_categoria_item IN (:IdCategoriaItemMultSlc)
	UNION ALL
	SELECT	ci.id_categoria_item,
		ci.id_categoria_item_pai,
		nv.nivel +1
	FROM	categoria_item AS ci
		INNER JOIN niveis AS nv ON (nv.id_categoria_item = ci.id_categoria_item_pai))
SELECT	
	se.nome AS empresa,
	i.id_categoria_item,
	ci.denominacao AS denominacao_categoria,
	i.codigo AS codigo_item,
	i.denominacao AS denominacao_item,
	u.sigla,
	ie.preco AS preco_venda,
	ie.localizacao,
	ie.estoque_seguranca AS estoque_seguranca,
	DATE(ie.ultima_compra) AS data_ultima_compra,
	ie.ultimo_custo,
	(SELECT	MAX(pes.nome)
	FROM	item_nfe AS infe
		INNER JOIN nota_fiscal_entrada AS nfe ON (nfe.id_nota_fiscal_entrada = infe.id_nota_fiscal_entrada)
		INNER JOIN pessoa AS pes ON (pes.id_pessoa = nfe.id_fornecedor)
	WHERE	infe.id_item = i.id_item
	AND	nfe.entrada = (SELECT MAX(b.entrada) FROM item_nfe AS a
					INNER JOIN nota_fiscal_entrada AS b ON (b.id_nota_fiscal_entrada = a.id_nota_fiscal_entrada)
				WHERE	a.id_item = i.id_item)) AS ultimo_fornecedor,
	(ie.preco - ie.ultimo_custo) AS margem,
	COALESCE(SUM(rme.quantidade_entrada - rme.quantidade_saida), 0) AS saldo_quantidade,
	COALESCE(SUM(rme.valor_entrada - rme.valor_saida), 0) AS saldo_valor
FROM	resumo_movimento_estoque AS rme
	INNER JOIN local_estoque AS le ON (le.id_local_estoque = rme.id_local_estoque)
	INNER JOIN item AS i ON (i.id_item = rme.id_item)
	INNER JOIN unidade_medida AS u ON (u.id_unidade_medida = i.id_unidade_medida)
	INNER JOIN categoria_item AS ci ON (ci.id_categoria_item = i.id_categoria_item)
	INNER JOIN item_empresa AS ie ON (ie.id_item = i.id_item AND ie.id_empresa = le.id_empresa)
	INNER JOIN sis_empresa AS se ON (se.id_empresa = le.id_empresa)
WHERE	le.id_empresa IN (:IdEmpresaMultSlc)
AND	i.tipo_item = 1
AND	ci.id_categoria_item IN (SELECT id_categoria_item FROM niveis)
AND	((:OpcoesRelatorioEstoque = 1 AND (saldo_quantidade = 0 OR saldo_quantidade <> 0))
	OR (:OpcoesRelatorioEstoque = 2 AND saldo_quantidade <> 0)
	OR (:OpcoesRelatorioEstoque = 3 AND saldo_quantidade = 0)
	OR (:OpcoesRelatorioEstoque = 4 AND saldo_quantidade < 0))
AND	((:RegistroAtivo = 1 AND (ie.registro_ativo = 'S' AND i.registro_ativo = 'S'))
	OR (:RegistroAtivo = 2 AND (ie.registro_ativo = 'N' OR i.registro_ativo = 'N'))
	OR :RegistroAtivo = 3)
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12

UNION ALL

SELECT	
	se.nome AS empresa,
	i.id_categoria_item,
	ci.denominacao AS denominacao_categoria,
	i.codigo AS codigo_item,
	i.denominacao AS denominacao_item,
	u.sigla,
	ie.preco AS preco_venda,
	ie.localizacao,
	ie.estoque_seguranca AS estoque_seguranca,
	DATE(ie.ultima_compra) AS data_ultima_compra,
	ie.ultimo_custo,
	(SELECT	MAX(pes.nome)
	FROM	item_nfe AS infe
		INNER JOIN nota_fiscal_entrada AS nfe ON (nfe.id_nota_fiscal_entrada = infe.id_nota_fiscal_entrada)
		INNER JOIN pessoa AS pes ON (pes.id_pessoa = nfe.id_fornecedor)
	WHERE	infe.id_item = i.id_item
	AND	nfe.entrada = (SELECT MAX(b.entrada) FROM item_nfe AS a
					INNER JOIN nota_fiscal_entrada AS b ON (b.id_nota_fiscal_entrada = a.id_nota_fiscal_entrada)
				WHERE	a.id_item = i.id_item)) AS ultimo_fornecedor,
	(ie.preco - ie.ultimo_custo) AS margem,
	0 AS saldo_quantidade,
	0 AS saldo_valor
FROM	item AS i
	INNER JOIN unidade_medida AS u ON (u.id_unidade_medida = i.id_unidade_medida)
	INNER JOIN categoria_item AS ci ON (ci.id_categoria_item = i.id_categoria_item)
	INNER JOIN item_empresa AS ie ON (ie.id_item = i.id_item)
	INNER JOIN sis_empresa AS se ON (se.id_empresa = ie.id_empresa)
WHERE	ie.id_empresa IN (:IdEmpresaMultSlc)
AND	i.tipo_item = 1
AND	ci.id_categoria_item IN (SELECT id_categoria_item FROM niveis)
AND	NOT EXISTS (SELECT 1 FROM resumo_movimento_estoque AS rme
			INNER JOIN local_estoque AS le ON (le.id_local_estoque = rme.id_local_estoque)
		WHERE	rme.id_item = ie.id_item AND le.id_empresa = ie.id_empresa)
AND	((:OpcoesRelatorioEstoque = 1 AND (saldo_quantidade = 0 OR saldo_quantidade <> 0))
	OR (:OpcoesRelatorioEstoque = 3 AND saldo_quantidade = 0))
AND	((:RegistroAtivo = 1 AND (ie.registro_ativo = 'S' AND i.registro_ativo = 'S'))
	OR (:RegistroAtivo = 2 AND (ie.registro_ativo = 'N' OR i.registro_ativo = 'N'))
	OR :RegistroAtivo = 3)
ORDER BY empresa, denominacao_categoria,
	denominacao_item