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 = :IdCategoriaItem
	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 nome_empresa,
	vc.id_cliente,
	p.codigo AS codigo_cliente,
	p.nome AS nome_cliente,
	ci.denominacao AS categoria,	
	ivc.id_item,
	i.denominacao AS descr_produto,
	SUM(ivc.quantidade) as quantidade,
	SUM(ivc.total_item - (ivc.desconto_rateado + ivc.desconto_ajuste_rateado + ivc.desconto_automatico_rateado + ivc.desconto_fidelidade_rateado)
		+ (ivc.acrescimo_rateado + ivc.acrescimo_ajuste_rateado + ivc.acrescimo_automatico_rateado)) AS total_item_negociado
	
FROM	movimento_venda_terminal AS mvt
	INNER JOIN venda_cf AS vc ON (vc.id_movimento_venda_terminal = mvt.id_movimento_venda_terminal)
	INNER JOIN item_venda_cf AS ivc ON (ivc.id_venda_cf = vc.id_venda_cf)
	INNER JOIN pessoa AS p ON (vc.id_cliente = p.id_pessoa)
	INNER JOIN item AS i ON (ivc.id_item = i.id_item)
	INNER JOIN categoria_item AS ci ON (ci.id_categoria_item = i.id_categoria_item)
	INNER JOIN unidade_medida AS um ON (um.id_unidade_medida = i.id_unidade_medida)
	INNER JOIN sis_empresa AS se ON (se.id_empresa = mvt.id_empresa)
WHERE	mvt.id_empresa in (:IdEmpresaMultSlc)
AND	mvt.data_movimento BETWEEN :DataInicial AND :DataFinal
AND	DATE(vc.data_cupom) BETWEEN :DataInicial AND :DataFinal
AND	DATE(ivc.data_venda) BETWEEN :DataInicial AND :DataFinal
AND	(:IdCliente = -1 OR vc.id_cliente = :IdCliente)
AND	(:IdCategoriaItem = -1 OR ci.id_categoria_item IN (SELECT id_categoria_item FROM niveis))
AND	(:IdItemNaoObrigatorio = -1 OR i.id_item = :IdItemNaoObrigatorio)
AND	vc.cancelada = 'N'
AND	ivc.cancelado = 'N'

GROUP BY
	se.nome,
	vc.id_cliente,
	p.codigo ,
	p.nome ,
	ci.denominacao ,	
	ivc.id_item,
	i.denominacao 