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
	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)
)
, sub_saldo_estoque AS (
	WITH sub_rme AS (
		SELECT	DISTINCT 
			le.id_empresa 
			, rme.id_item 
			, rme.id_local_estoque 
		FROM	resumo_movimento_estoque rme 
			INNER JOIN local_estoque le ON (le.id_local_estoque = rme.id_local_estoque)
			INNER JOIN item AS i ON (rme.id_item = i.id_item)
		WHERE	rme.ano_mes <= CAST(TO_CHAR(CAST(:DataFinal AS DATE), 'YYYYMM') AS BIGINT)
		AND	le.id_empresa = :IdEmpresaObrigatorio
		AND i.id_categoria_item IN (SELECT id_categoria_item FROM niveis)
	)
	SELECT 
		r.id_empresa
		, r.id_item
		, SUM(se.rsaldoquantidade) saldo_quantidade
		, SUM(se.rsaldovalor) saldo_valor
	FROM	sub_rme r
		INNER JOIN LATERAL (SELECT * FROM F_OBTEM_SALDO_ESTOQUE(r.id_item, r.id_local_estoque, DATE(CAST(:DataFinal AS DATE)))) se ON (TRUE)
	GROUP BY
		r.id_empresa
		, r.id_item
	UNION ALL 
	SELECT
		ie.id_empresa 
		, ie.id_item 
		, 0.00 saldo_quantidade
		, 0.00 saldo_valor
	FROM item AS i
	INNER JOIN item_empresa AS ie ON(ie.id_item = i.id_item AND ie.id_empresa = :IdEmpresaObrigatorio )
	LEFT JOIN sub_rme r ON (r.id_empresa = ie.id_empresa AND r.id_item = ie.id_item)
	WHERE i.id_categoria_item IN (SELECT id_categoria_item FROM niveis)
	AND	r.id_empresa IS NULL
)

SELECT
	sse.id_empresa
	, se.codigo codigo_empresa
	, se.nome nome_empresa
	, i.codigo
	, i.denominacao
	, sse.saldo_quantidade
	, sse.saldo_valor
FROM	sub_saldo_estoque sse
	INNER JOIN sis_empresa se ON (se.id_empresa = sse.id_empresa)
	INNER JOIN item_empresa ie ON (ie.id_empresa = sse.id_empresa AND ie.id_item = sse.id_item)
	INNER JOIN item i ON (i.id_item = sse.id_item)
	INNER JOIN categoria_item ci ON (ci.id_categoria_item = i.id_categoria_item)
	INNER JOIN unidade_medida um ON (um.id_unidade_medida = i.id_unidade_medida)
	LEFT JOIN codigo_fiscal cf ON (cf.id_codigo_fiscal = i.id_codigo_fiscal AND cf.tipo = 1)
WHERE	i.id_categoria_item = 399
AND sse.saldo_quantidade > 0
AND	((1 = 1 AND (i.registro_ativo = 'S' AND ie.registro_ativo = 'S')) 
	OR	(1 = 2 AND (i.registro_ativo = 'N' OR ie.registro_ativo = 'N')) 
	OR	(1 = 3)
) 
AND	((1 = 1)
	OR (1 = 2 AND sse.saldo_quantidade != 0) 
	OR (1 = 3 AND sse.saldo_quantidade = 0) 
	OR (1 = 4 AND sse.saldo_quantidade < 0)
)
GROUP BY 
    sse.id_empresa
	, se.codigo
	, se.nome
    , ci.id_categoria_item
    , i.denominacao
    , i.codigo
    , i.denominacao
    , sse.saldo_quantidade
	, sse.saldo_valor
ORDER BY 
	se.nome
    , i.codigo
	, i.denominacao;