WITH
produtos AS
(
	--Traz somente produtos parametrizados em EMPRESA > PRE VENDA > Código Combustivel Meta
	SELECT 
		i.id_item,
		i.codigo,
		i.denominacao,
		i.denominacao_reduzida
	FROM item AS i
	WHERE position(i.codigo in f_obtem_parametro_alfanumerico('prevenda.código_combustivel_ticket_medio', :IdEmpresaObrigatorio, Null, 'N')) > 0 
),

produtos_e_periodo AS 
(	
		SELECT DISTINCT
		(date_trunc('day', dia):: date) as data, p.codigo, p.denominacao, p.denominacao_reduzida
		FROM generate_series
				( :DataInicial
				, :DataFinal
				, '1 day'::interval) as dia, produtos as p		
),	

movimento AS
(	
	SELECT  
		se.id_empresa AS id_empresa,
		se.nome AS nome_empresa, 
		pe.nome AS atendente,
		i.codigo,
		i.denominacao,
		i.denominacao_reduzida,
		(
			SELECT f_obtem_parametro_decimal(
			'prevenda.meta_valor_ticket_médio',
			se.id_empresa, Null, 'N')
		) AS meta_ticket_medio,
			
		(			
			SELECT f_obtem_parametro_decimal(
				'prevenda.ticket_médio_combustivel_valor_premiação',
			se.id_empresa, Null, 'N')
		) as valor_premiacao,
		
		mvt.data_movimento AS data_movimento,
		
		(CASE EXTRACT( DOW FROM mvt.data_movimento)
			WHEN 0 THEN 'DOM'
			WHEN 1 THEN 'SEG'
			WHEN 2 THEN 'TER'
			WHEN 3 THEN 'QUA'
			WHEN 4 THEN 'QUI'
			WHEN 5 THEN 'SEX'
			WHEN 6 THEN 'SAB'
		END) AS DiaSemana,
		
		
		COUNT(ivc.id_item) AS numero_vendas,
		--(SUM(ivc.total_item)/ COUNT(ivc.id_item)) as ticket_medio,
		SUM(ivc.quantidade) AS qtde_combustivel,
		SUM(ivc.total_item) AS total_combustivel
		--CAST(0 AS DECIMAL(12,2)) AS qtde_outros_produtos,
		--CAST(0 AS DECIMAL(12,2)) AS total_outros_produtos
	FROM	item_venda_cf AS ivc 
		INNER JOIN venda_cf AS vc ON (vc.id_venda_cf = ivc.id_venda_cf)
		INNER JOIN movimento_venda_terminal AS mvt ON (mvt.id_movimento_venda_terminal = vc.id_movimento_venda_terminal)
		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 sis_empresa AS se ON (se.id_empresa = mvt.id_empresa)
		INNER JOIN pessoa AS pe ON (pe.id_pessoa = ivc.id_atendente)   
 		
	WHERE	
	
	i.id_item in (select id_item from produtos)
	AND mvt.id_empresa = :IdEmpresaObrigatorio --ID Empresa
	AND	mvt.data_movimento IN (select data from produtos_e_periodo)
	AND	DATE(vc.data_cupom) IN (select data from produtos_e_periodo)
	AND	DATE(ivc.data_venda) IN (select data from produtos_e_periodo)
	AND	(:IdColaborador = -1 OR ivc.id_atendente = :IdColaborador)
	AND	(ivc.cancelado = 'N' AND vc.cancelada = 'N')
	--AND	ivc.id_bico_combustivel IS NOT NULL 
	GROUP BY 1,2,3,4,5,6,7,8,9,10
),

produtos_e_datas_sem_movimento AS
(
	SELECT 
	p.*
	FROM	
	produtos_e_periodo as p
	WHERE p.data not in (select mvt.data_movimento from movimento as mvt where mvt.codigo = p.codigo)
		
),

sem_movimento AS
(
	SELECT DISTINCT 
		mov.id_empresa,
		mov.nome_empresa, 
		mov.atendente,
		p.codigo,
		p.denominacao,
		p.denominacao_reduzida,
		mov.meta_ticket_medio,
		mov.valor_premiacao,
		
		p.data AS data_movimento,
		
		(CASE EXTRACT( DOW FROM p.data)
			WHEN 0 THEN 'DOM'
			WHEN 1 THEN 'SEG'
			WHEN 2 THEN 'TER'
			WHEN 3 THEN 'QUA'
			WHEN 4 THEN 'QUI'
			WHEN 5 THEN 'SEX'
			WHEN 6 THEN 'SAB'
		END) AS DiaSemana,
		
		
		0 AS numero_vendas,
		--CAST(0 AS DECIMAL(12,2)) as ticket_medio	
		CAST(0 AS DECIMAL(12,2)) AS qtde_combustivel,
		CAST(0 AS DECIMAL(12,2)) AS total_combustivel
		--CAST(0 AS DECIMAL(12,2)) AS qtde_outros_produtos,
		--CAST(0 AS DECIMAL(12,2)) AS total_outros_produtos
	FROM	movimento AS mov, produtos_e_datas_sem_movimento as p
),

resultado AS
(
	SELECT * FROM movimento
	UNION
	SELECT * FROM sem_movimento	
)

SELECT
	r.id_empresa,
	r.nome_empresa,
	r.atendente,
	r.meta_ticket_medio,
	r.valor_premiacao,
	r.data_movimento,
	r.DiaSemana,
	(CASE WHEN SUM(r.numero_vendas) > 0
		THEN SUM(r.total_combustivel) / SUM(r.numero_vendas)
		ELSE 0
	END) AS ticket_medio 

FROM
	resultado AS r
	GROUP BY 1, 2, 3, 4, 5, 6, 7
	ORDER BY 1,3,6