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 nome_empresa,
	p.codigo,
	p.nome as cliente,
	CAST(EXTRACT('MONTH' FROM DATE(mvt.data_movimento)) AS INTEGER) AS mes,
	olvm.titulo AS mes_extenso,	
	ci.denominacao AS categoria_produto,
	fr.id_tipo_recebimento,
	tr.denominacao as tipo_recebimento,	
	fr.denominacao as forma_recebimento,
	SUM(iv.quantidade) AS quantidade,
	SUM(iv.total_bruto) AS total_bruto,	
	SUM(CAST((((iv.total_item - (iv.desconto_rateado + iv.desconto_ajuste_rateado + iv.desconto_automatico_rateado + iv.desconto_fidelidade_rateado)
		+ (iv.acrescimo_rateado + iv.acrescimo_ajuste_rateado + iv.acrescimo_automatico_rateado)) / v.total_venda)
		* (rv.valor_recebido - rv.valor_troco)) AS DECIMAL(12,4))) AS total_venda
FROM	movimento_venda_terminal AS mvt
	INNER JOIN venda_cf AS v ON (v.id_movimento_venda_terminal = mvt.id_movimento_venda_terminal)
	INNER JOIN item_venda_cf AS iv ON (iv.id_venda_cf = v.id_venda_cf)
	INNER JOIN item AS i ON (iv.id_item = i.id_item)
	INNER JOIN categoria_item AS ci ON (i.id_categoria_item = ci.id_categoria_item)
	INNER JOIN recebimento_venda_cf AS rv ON (rv.id_venda_cf = v.id_venda_cf)
	INNER JOIN forma_recebimento AS fr ON (fr.id_forma_recebimento = rv.id_forma_recebimento)
	INNER JOIN tipo_recebimento AS tr ON (tr.id_tipo_recebimento = fr.id_tipo_recebimento)
	INNER JOIN sis_empresa AS se ON (se.id_empresa = mvt.id_empresa)
	INNER JOIN sis_opcao_lista_valor AS olvm ON (olvm.id = CAST(EXTRACT('MONTH' FROM DATE(mvt.data_movimento)) AS INTEGER) AND olvm.id_lista_valor = 'D38107374B244A3BB0635F096A5E30A9')
	INNER JOIN pessoa AS p ON (p.id_pessoa = v.id_cliente)
	
WHERE mvt.id_empresa = :IdEmpresaObrigatorio	
AND	CAST(EXTRACT('YEAR' FROM DATE(mvt.data_movimento)) AS INTEGER) = :Ano
AND	CAST(EXTRACT('YEAR' FROM DATE(v.data_cupom)) AS INTEGER) = :Ano
AND	CAST(EXTRACT('YEAR' FROM DATE(iv.data_venda)) AS INTEGER) = :Ano
AND	mvt.id_empresa = :IdEmpresaObrigatorio
AND	ci.id_categoria_item IN (SELECT id_categoria_item FROM niveis)
AND	(:IdClienteNaoObrigatorio = -1 OR v.id_cliente = :IdClienteNaoObrigatorio)
AND	v.cancelada = 'N'
AND	iv.cancelado = 'N'
AND	rv.cancelado = 'N'

AND	(CASE WHEN (:IdTipoRecebimento < 1 AND :IdFormaRecebimento < 1) THEN
		(fr.id_tipo_recebimento in (4,5)) ELSE ((:IdTipoRecebimento = -1 OR fr.id_tipo_recebimento = :IdTipoRecebimento) AND (:IdFormaRecebimento = -1 OR fr.id_forma_recebimento = :IdFormaRecebimento)) 
	END)

GROUP BY 1,2,3,4,5,6,7,8,9		
ORDER BY 1,2,3,4,5,6,7,8,9