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_meta', :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,
	se.nome AS nome_empresa, 
	pe.nome AS atendente,
	i.codigo,
	i.denominacao,
	i.denominacao_reduzida,
	(CASE EXTRACT( DOW FROM mvt.data_movimento)
	WHEN 0 THEN (			
	SELECT f_obtem_parametro_inteiro(
		(select sp.id_parametro from sis_parametro as sp where position((i.denominacao_reduzida || ' Domingo') in sp.nome) > 0 limit 1 ),
	se.id_empresa, Null, 'N')
	)
	WHEN 1 THEN (			
	SELECT f_obtem_parametro_inteiro(
		(select sp.id_parametro from sis_parametro as sp where position((i.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
	se.id_empresa, Null, 'N')
	)
	WHEN 2 THEN (			
	SELECT f_obtem_parametro_inteiro(
		(select sp.id_parametro from sis_parametro as sp where position((i.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
	se.id_empresa, Null, 'N')
	)
	WHEN 3 THEN (			
	SELECT f_obtem_parametro_inteiro(
		(select sp.id_parametro from sis_parametro as sp where position((i.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
	se.id_empresa, Null, 'N')
	)
	WHEN 4 THEN (			
	SELECT f_obtem_parametro_inteiro(
		(select sp.id_parametro from sis_parametro as sp where position((i.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
	se.id_empresa, Null, 'N')
	)
	WHEN 5 THEN (			
	SELECT f_obtem_parametro_inteiro(
		(select sp.id_parametro from sis_parametro as sp where position((i.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
	se.id_empresa, Null, 'N')
	)
	WHEN 6 THEN (			
	SELECT f_obtem_parametro_inteiro(
		(select sp.id_parametro from sis_parametro as sp where position((i.denominacao_reduzida || ' Domingo') in sp.nome) > 0 limit 1 ),
	se.id_empresa, Null, 'N')
		)
	END) AS meta_litros,

	(			
	SELECT f_obtem_parametro_decimal(
		(select sp.id_parametro from sis_parametro as sp where position((i.denominacao_reduzida || ' Valor Premiação') in sp.nome) > 0 limit 1 ),
	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,

	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 mvt.data_movimento 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,
	(CASE EXTRACT( DOW FROM p.data)
		WHEN 0 THEN (			
		SELECT f_obtem_parametro_inteiro(
			(select sp.id_parametro from sis_parametro as sp where position((p.denominacao_reduzida || ' Domingo') in sp.nome) > 0 limit 1 ),
		mov.id_empresa, Null, 'N')
		)
		WHEN 1 THEN (			
		SELECT f_obtem_parametro_inteiro(
			(select sp.id_parametro from sis_parametro as sp where position((p.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
		mov.id_empresa, Null, 'N')
		)
		WHEN 2 THEN (			
		SELECT f_obtem_parametro_inteiro(
			(select sp.id_parametro from sis_parametro as sp where position((p.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
		mov.id_empresa, Null, 'N')
		)
		WHEN 3 THEN (			
		SELECT f_obtem_parametro_inteiro(
			(select sp.id_parametro from sis_parametro as sp where position((p.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
		mov.id_empresa, Null, 'N')
		)
		WHEN 4 THEN (			
		SELECT f_obtem_parametro_inteiro(
			(select sp.id_parametro from sis_parametro as sp where position((p.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
		mov.id_empresa, Null, 'N')
		)
		WHEN 5 THEN (			
		SELECT f_obtem_parametro_inteiro(
			(select sp.id_parametro from sis_parametro as sp where position((p.denominacao_reduzida || ' Segunda a Sexta') in sp.nome) > 0 limit 1 ),
		mov.id_empresa, Null, 'N')
		)
		WHEN 6 THEN (			
		SELECT f_obtem_parametro_inteiro(
			(select sp.id_parametro from sis_parametro as sp where position((p.denominacao_reduzida || ' Domingo') in sp.nome) > 0 limit 1 ),
		mov.id_empresa, Null, 'N')
			)
		END
	) AS meta_litros,

	(			
		SELECT f_obtem_parametro_decimal(
			(select sp.id_parametro from sis_parametro as sp where position((p.denominacao_reduzida || ' Valor Premiação') in sp.nome) > 0 limit 1 ),
		mov.id_empresa, Null, 'N')
	) as 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,

	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
)

SELECT * FROM movimento
UNION
SELECT * FROM sem_movimento
ORDER BY 9,1,3,4 




