WITH empresas AS (
	SELECT	id_empresa
	FROM	sis_empresa
	WHERE	id_empresa IN (:IdEmpresaMultSlc)  ),

ultima_venda AS (
	SELECT	v.id_cliente AS id_cliente,
		v.data_cupom AS ultima_data,
		v.total_venda AS ultimo_valor,
		se.nome AS ultima_empresa,
		se.id_empresa AS id_empresa
	FROM	venda_cf AS v
		INNER JOIN pessoa AS p ON (p.id_pessoa = v.id_cliente)
		INNER JOIN movimento_venda_terminal AS mvt ON (mvt.id_movimento_venda_terminal = v.id_movimento_venda_terminal)
		INNER JOIN sis_empresa AS se ON (se.id_empresa = mvt.id_empresa)
	WHERE	v.id_venda_cf IN (SELECT MAX(v.id_venda_cf)
				FROM	venda_cf AS v
					INNER JOIN recebimento_venda_cf AS rv ON (rv.id_venda_cf = v.id_venda_cf)
					INNER JOIN movimento_venda_terminal AS mvt ON (mvt.id_movimento_venda_terminal = v.id_movimento_venda_terminal)
					INNER JOIN empresas AS e ON (e.id_empresa = mvt.id_empresa)
				WHERE	mvt.data_movimento BETWEEN :DataInicial AND :DataFinal
				AND	DATE(v.data_cupom) BETWEEN :DataInicial AND :DataFinal
				AND	v.cancelada = 'N'
				AND	rv.cancelado = 'N'
				AND	EXISTS (SELECT 1 FROM forma_recebimento
						WHERE	id_forma_recebimento = rv.id_forma_recebimento
						AND	(:IdTipoRecebimento = -1 OR id_tipo_recebimento = :IdTipoRecebimento))
				GROUP BY (CASE WHEN (:AgruparVendaCliente = 1 OR :AgruparVendaCliente = 3) OR (SELECT COUNT(1) FROM empresas) = 1 THEN mvt.id_empresa ELSE 0 END),
					v.id_cliente)
	GROUP BY (CASE WHEN (:AgruparVendaCliente = 1 OR :AgruparVendaCliente = 3) OR (SELECT COUNT(1) FROM empresas) = 1 THEN se.nome ELSE 'TODAS' END),
		v.id_cliente,
		p.nome,
		v.data_cupom,
		v.total_venda,
		se.nome,
		se.id_empresa
	ORDER BY CASE WHEN :OrdenarVendaCliente = 1 THEN p.nome END, --cliente
		CASE WHEN :OrdenarVendaCliente = 2 THEN COUNT(v.id_cliente) END DESC, --qtd vendas
		CASE WHEN :OrdenarVendaCliente = 3 THEN SUM(v.total_venda) END DESC ) --total das vendas

SELECT	(CASE WHEN (:AgruparVendaCliente = 1 OR :AgruparVendaCliente = 3) OR (SELECT COUNT(1) FROM empresas) = 1 THEN r.nome_empresa ELSE 'TODAS' END) AS nome_empresa,
	r.cod_cliente,
	r.cliente,
	r.numero_vendas,
	SUM(r.total_venda_proporcional) AS total_venda,
	ROUND((SUM(r.total_venda_proporcional) / r.numero_vendas), 2) AS media,
	(CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultima_data ELSE NULL END) ELSE uv.ultima_data END) AS ultima_data,
	(CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultimo_valor ELSE 0 END) ELSE uv.ultimo_valor END) AS ultimo_valor,
	(CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultima_empresa ELSE 'N' END) ELSE uv.ultima_empresa END) AS ultima_empresa
FROM	(
	WITH numero_vendas AS (
		SELECT	r2.id_cliente,
			COUNT(r2.id_venda_cf) AS qtde_vendas
		FROM	(
			SELECT	DISTINCT v1.id_cliente,
				v1.id_venda_cf
			FROM	movimento_venda_terminal AS mvt1
				INNER JOIN venda_cf AS v1 ON (v1.id_movimento_venda_terminal = mvt1.id_movimento_venda_terminal)
				INNER JOIN recebimento_venda_cf AS rv1 ON (rv1.id_venda_cf = v1.id_venda_cf)
				INNER JOIN empresas AS e ON (e.id_empresa = mvt1.id_empresa)
			WHERE	mvt1.data_movimento BETWEEN :DataInicial AND :DataFinal
			AND	DATE(v1.data_cupom) BETWEEN :DataInicial AND :DataFinal
			AND	v1.cancelada = 'N'
			AND	EXISTS (SELECT 1 FROM forma_recebimento WHERE id_forma_recebimento = rv1.id_forma_recebimento AND ((:IdTipoRecebimento = -1) OR (id_tipo_recebimento = :IdTipoRecebimento)))
		) AS r2
		GROUP BY 1 )

	SELECT	em.id_empresa,
		em.nome AS nome_empresa,
		v.id_cliente,
		p.codigo AS cod_cliente,
		p.nome AS cliente,
		tr.denominacao AS tipo_pgto,
		(SELECT qtde_vendas FROM numero_vendas WHERE id_cliente = v.id_cliente) AS numero_vendas,
		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 - COALESCE(ct.valor, 0))) AS DECIMAL(12,4))) AS total_venda_proporcional
	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 sis_empresa AS em ON (em.id_empresa = mvt.id_empresa)
		INNER JOIN pessoa AS p ON (p.id_pessoa = v.id_cliente)
		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 empresas AS e ON (e.id_empresa = mvt.id_empresa)
		LEFT OUTER JOIN cheque_emitido AS ct ON (ct.id_venda_cf = v.id_venda_cf AND ct.tipo_cheque = 1)
	WHERE	mvt.data_movimento BETWEEN :DataInicial AND :DataFinal
	AND	DATE(v.data_cupom) BETWEEN :DataInicial AND :DataFinal
	AND	DATE(iv.data_venda) BETWEEN :DataInicial AND :DataFinal
	AND	v.cancelada = 'N'
	AND	iv.cancelado = 'N'
	AND	rv.cancelado = 'N'
	AND	EXISTS (SELECT 1 FROM forma_recebimento WHERE id_forma_recebimento = rv.id_forma_recebimento AND ((:IdTipoRecebimento = -1) OR (id_tipo_recebimento = :IdTipoRecebimento)))
	GROUP BY 1,2,3,4,5,6,7
) AS r
	INNER JOIN ultima_venda AS uv ON (uv.id_cliente = r.id_cliente)
WHERE	NOT (CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultima_data ELSE NULL END) ELSE uv.ultima_data END) IS NULL
AND	(CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultimo_valor ELSE 0 END) ELSE uv.ultimo_valor END) != 0
AND	(CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultima_empresa ELSE 'N' END) ELSE uv.ultima_empresa END) != 'N'
GROUP BY (CASE WHEN (:AgruparVendaCliente = 1 OR :AgruparVendaCliente = 3) OR (SELECT COUNT(1) FROM empresas) = 1 THEN r.nome_empresa ELSE 'TODAS' END),
	r.cod_cliente,
	r.cliente,
	r.numero_vendas,
	(CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultima_data ELSE NULL END) ELSE uv.ultima_data END),
	(CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultimo_valor ELSE 0 END) ELSE uv.ultimo_valor END),
	(CASE WHEN :AgruparVendaCliente = 1 THEN (CASE WHEN uv.id_empresa = r.id_empresa THEN uv.ultima_empresa ELSE 'N' END) ELSE uv.ultima_empresa END)
ORDER BY nome_empresa,
	CASE WHEN :OrdenarVendaCliente = 1 THEN r.cliente END, --cliente
	CASE WHEN :OrdenarVendaCliente = 2 THEN r.numero_vendas END DESC, --qtd vendas
	CASE WHEN :OrdenarVendaCliente = 3 THEN SUM(r.total_venda_proporcional) END DESC, --total das vendas
	CASE WHEN :OrdenarVendaCliente = 4 THEN r.cod_cliente END -- por codigo e total das vendas