
WITH numero_vendas AS (
	SELECT	mvt1.id_empresa,
		rv1.id_forma_recebimento,
		COUNT(1) AS qtde_vendas
	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)
	WHERE	mvt1.id_empresa IN (:IdEmpresaMultSlc)
	AND	mvt1.data_movimento BETWEEN :DataInicial AND :DataFinal
	AND	v1.cancelada = 'N'
	AND	rv1.cancelado = 'N'
	GROUP BY 1,2 ),

recebimento_total AS (	SELECT vcf.id_venda_cf,
					SUM(rv.valor_troco) AS total_troco,
							SUM(rv.valor_recebido) AS valor_recebimento_total
							FROM	movimento_venda_terminal AS mvt
							INNER JOIN venda_cf AS vcf ON (vcf.id_movimento_venda_terminal = mvt.id_movimento_venda_terminal)
							INNER JOIN recebimento_venda_cf AS rv ON (rv.id_venda_cf = vcf.id_venda_cf)
							INNER JOIN forma_recebimento AS fr ON (fr.id_forma_recebimento = rv.id_forma_recebimento)
					WHERE	mvt.id_empresa IN (:IdEmpresaMultSlc)
	AND	mvt.data_movimento BETWEEN :DataInicial AND :DataFinal
	AND	vcf.cancelada = 'N'
	AND	rv.cancelado = 'N'
	GROUP BY 1),
	
total_cheque_troco AS (	SELECT vcf.id_venda_cf,
					SUM(COALESCE(ct.valor, 0)) AS valor_troco_cheque
							FROM	movimento_venda_terminal AS mvt
							INNER JOIN venda_cf AS vcf ON (vcf.id_movimento_venda_terminal = mvt.id_movimento_venda_terminal)
							INNER JOIN cheque_emitido AS ct ON (ct.id_venda_cf = vcf.id_venda_cf AND ct.tipo_cheque = 1)
					WHERE	mvt.id_empresa IN (:IdEmpresaMultSlc)
	AND	mvt.data_movimento BETWEEN :DataInicial AND :DataFinal
	AND	vcf.cancelada = 'N'
	AND	ct.valor != 0
	GROUP BY 1)

SELECT	em.nome AS nome_empresa,
	tr.denominacao AS tipo_pgto,
	fr.denominacao AS forma_pgto,
	(SELECT qtde_vendas FROM numero_vendas AS nv WHERE nv.id_forma_recebimento = fr.id_forma_recebimento AND nv.id_empresa = mvt.id_empresa) AS numero_vendas,
	CAST(ROUND(SUM(CASE WHEN rv.valor_recebido <> 0 THEN(((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))
		ELSE 0.00 END),2) AS DECIMAL(12,4)) AS total_venda_proporcional,
	CAST(ROUND(SUM(CASE WHEN rv.valor_recebido <> 0 THEN(((((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))/ rv.valor_recebido))
		ELSE 0.00 END),2) AS DECIMAL(12,4)) AS total_troco,
	CAST(ROUND(SUM(CASE WHEN rv.valor_recebido <> 0 THEN((((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)) - ((((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)) / rv.valor_recebido))
		ELSE 0.00 END),2) AS DECIMAL(12,4)) AS total_liquido
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 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 recebimento_total AS rt ON (rt.id_venda_cf = v.id_venda_cf)
	LEFT OUTER JOIN total_cheque_troco AS tct ON (tct.id_venda_cf = v.id_venda_cf)
WHERE	mvt.id_empresa IN (:IdEmpresaMultSlc)
AND	mvt.data_movimento BETWEEN :DataInicial AND :DataFinal
AND	v.cancelada = 'N'
AND	iv.cancelado = 'N'
AND	rv.cancelado = 'N'
GROUP BY em.nome,
	fr.id_forma_recebimento,
	mvt.id_empresa,
	tr.denominacao,
	fr.denominacao
ORDER BY em.nome,
	tr.denominacao,
	fr.denominacao,
	numero_vendas DESC