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 (:IdCategoriaItemMultEsc)
	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 razao,
	i.id_categoria_item,
	ci.denominacao AS denominacao_categoria,
	i.codigo AS codigo_item,
	i.denominacao AS denominacao_item,
	ie.localizacao,
	u.sigla,
	ie.preco AS preco_venda,
	COALESCE(le.denominacao, 'Local de Estoque Não Definido') AS denominacao_local,
	COALESCE(f.rsaldoquantidade,0) AS saldo_quantidade,
	COALESCE(ee.estoque_exposicao,0) AS quantidade_exposicao,
	COALESCE(f.rsaldovalor, 0) AS saldo_valor
FROM estoque_exposicao AS ee

INNER JOIN local_estoque as le ON (ee.id_local_estoque = le.id_local_estoque)
INNER JOIN item AS i ON (i.id_item = ee.id_item)
INNER JOIN LATERAL (SELECT * FROM f_obtem_saldo_estoque(i.id_item, ee.id_local_estoque, CURRENT_DATE)) f ON TRUE
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	ci.id_categoria_item IN (SELECT id_categoria_item FROM niveis)
AND	(:LocalEstoqueNO = -1 OR ee.id_local_estoque = :LocalEstoqueNO)
AND	i.tipo_item = 1
AND	ie.registro_ativo = 'S' 
AND 	i.registro_ativo = 'S'
AND le.id_empresa = :__ID_EMPRESA

ORDER BY 
	se.codigo,
	denominacao_local,
	ci.denominacao,
	i.denominacao