SELECT	r.empresa,
	r.denominacao_produto,
	r.data_movimento,
	SUM(r.quantidade) AS quantidade,
	SUM(r.total_bruto) AS total_bruto,
	SUM(r.desconto) AS desconto,
	SUM(r.acrescimo) AS acrescimo,
	SUM(r.custo) AS custo,
	r.tributacao,
	SUM(r.valor_tributacao) AS valor_tributacao,
	r.cfop,
	r.cst

-- Dados MVT - venda cupom fiscal
FROM	(
SELECT	e.nome AS empresa,
	(CASE WHEN (ivc.id_bico_combustivel IS NULL) THEN ('Produtos') ELSE ('Combustiveis') END) AS denominacao_produto,
	mvt.data_movimento AS data_movimento,
	ivc.quantidade,
	ivc.total_bruto,
	(ivc.desconto + ivc.desconto_automatico + ivc.desconto_rateado + ivc.desconto_ajuste_rateado + ivc.desconto_automatico_rateado + ivc.desconto_fidelidade_rateado) AS desconto,
	(ivc.acrescimo + ivc.acrescimo_automatico + ivc.acrescimo_rateado + ivc.acrescimo_ajuste_rateado + ivc.acrescimo_automatico_rateado) AS acrescimo,
	me.valor AS custo,
	tb.denominacao as tributacao,
	((ivc.total_bruto * tb.aliquota) / 100) AS valor_tributacao,
	cp.cfop as cfop,
	cs.codigo as cst

	
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)
	LEFT  JOIN movimento_estoque AS me ON (me.id_movimento_estoque = ivc.id_movimento_estoque)
	INNER JOIN item AS i ON (ivc.id_item = i.id_item)
	INNER JOIN categoria_item AS ci ON (i.id_categoria_item = ci.id_categoria_item)
	INNER JOIN unidade_medida AS um ON (i.id_unidade_medida = um.id_unidade_medida)
	INNER JOIN sis_empresa AS e ON (e.id_empresa = mvt.id_empresa)
	LEFT JOIN cfop as cp ON (cp.id_cfop = ivc.id_cfop)
	LEFT JOIN cst as cs ON (cs.id_cst = ivc.id_cst_icms)
	LEFT JOIN tipo_tributacao AS tb ON (tb.id_tipo_tributacao = ivc.id_tipo_tributacao)
	


WHERE	mvt.data_movimento BETWEEN :DataInicial AND :DataFinal
AND	mvt.id_empresa = :IdEmpresaObrigatorio
AND	(ivc.cancelado = 'N' AND vc.cancelada = 'N')

UNION ALL

-- Dados NFS
SELECT	se.nome AS empresa,
	(CASE WHEN (le.tipo = 1) THEN ('Produtos') ELSE ('Combustiveis') END) AS denominacao_produto,
	nfs.emissao AS data_movimento,
	infs.quantidade,
	(infs.total_item + infs.desconto) AS total_bruto,
	infs.desconto,
	0.00 AS acrescimo,
	me.valor AS custo,
	tb.denominacao as tributacao,
	(((infs.total_item + infs.desconto) * tb.aliquota) / 100) AS valor_tributacao,
	cp.cfop as cfop,
	cs.codigo as cst
	
FROM	nota_fiscal_saida AS nfs
	INNER JOIN item_nfs AS infs ON (infs.id_nota_fiscal_saida = nfs.id_nota_fiscal_saida)
	INNER JOIN sis_referencia_registro AS rr ON (rr.id_chave_registro_a = infs.id_item_nfs AND rr.tipo_referencia = 'ref_1101_0411_movimento_estoque_nfs')
	INNER JOIN movimento_estoque me ON (me.id_movimento_estoque = rr.id_chave_registro_b)
	INNER JOIN item AS i ON (i.id_item = infs.id_item)
	INNER JOIN categoria_item AS ci ON (i.id_categoria_item = ci.id_categoria_item)
	INNER JOIN unidade_medida um ON (i.id_unidade_medida = um.id_unidade_medida)
	INNER JOIN sis_empresa AS se ON (se.id_empresa = nfs.id_empresa)
	LEFT JOIN cfop as cp ON (cp.id_cfop = infs.id_cfop)
	LEFT JOIN cst as cs ON (cs.id_cst = infs.id_cst_icms)
	LEFT JOIN tipo_tributacao AS tb ON (tb.id_tipo_tributacao = infs.id_tipo_tributacao)
    LEFT JOIN local_estoque as le ON (infs.id_local_estoque = le.id_local_estoque)

WHERE	nfs.emissao BETWEEN :DataInicial AND :DataFinal
AND	nfs.id_empresa = :IdEmpresaObrigatorio
AND	nfs.situacao = 1 -- Confirmado
AND	EXISTS(SELECT 1 FROM cfop WHERE tipo_movimento_estoque != 4 AND gera_titulo_financeiro = 'S' AND id_tipo_movimento_estoque = 7 AND id_cfop = infs.id_cfop)

UNION ALL

-- Dados NF. Entrada
SELECT	se.nome AS empresa,
	(CASE WHEN (le.tipo = 1) THEN ('Produtos') ELSE ('Combustiveis') END) AS denominacao_produto,
	nfe.emissao AS data_movimento,
	(infe.quantidade * -1) AS quantidade,
	((infe.total_produto + infe.desconto) * -1) AS total_bruto,
	(infe.desconto * -1) AS desconto,
	0.00 AS acrescimo,
	(me.valor * -1) AS custo,
	tb.denominacao as tributacao,
	((((infe.total_produto + infe.desconto) * -1) * tb.aliquota) / 100) AS valor_tributacao,
	cp.cfop as cfop,
	cs.codigo as cst
	
FROM	nota_fiscal_entrada AS nfe
	INNER JOIN item_nfe AS infe ON (infe.id_nota_fiscal_entrada = nfe.id_nota_fiscal_entrada)
	INNER JOIN cfop ON (cfop.id_cfop = infe.id_cfop)
	INNER JOIN movimento_estoque me ON (me.id_movimento_estoque = infe.id_movimento_estoque)
	INNER JOIN item AS i ON (i.id_item = infe.id_item)
	INNER JOIN categoria_item AS ci ON (i.id_categoria_item = ci.id_categoria_item)
	INNER JOIN unidade_medida um ON (i.id_unidade_medida = um.id_unidade_medida)
	INNER JOIN sis_empresa AS se ON (se.id_empresa = nfe.id_empresa)
	LEFT JOIN cfop as cp ON (cp.id_cfop = infe.id_cfop)
	LEFT JOIN cst as cs ON (cs.id_cst = infe.id_cst_icms)
	LEFT JOIN tipo_tributacao AS tb ON (tb.id_tipo_tributacao = infe.id_tipo_tributacao)
    LEFT JOIN local_estoque as le ON (infe.id_local_estoque = le.id_local_estoque)

WHERE	nfe.emissao BETWEEN :DataInicial AND :DataFinal
AND	nfe.id_empresa = :IdEmpresaObrigatorio
AND	nfe.situacao = 1 -- Confirmado
AND	EXISTS(SELECT 1 FROM cfop WHERE tipo_movimento_estoque != 4 AND id_tipo_movimento_estoque = 3 AND id_cfop = infe.id_cfop)
	) AS r
GROUP BY r.empresa,
	r.denominacao_produto,
	r.data_movimento,
	r.tributacao,
	r.cfop,
	r.cst

ORDER BY r.data_movimento,
    r.cfop,
    r.cst,
    r.tributacao,
	r.denominacao_produto
	