-- Extrato de Vendas por Cliente
SELECT  e.nome AS empresa,
    p.codigo,
	v.id_cliente,
    p.nome,
	UPPER(TRIM(REPLACE(REPLACE((CASE 
					WHEN (vc.placa <> '') THEN vc.placa 
					WHEN (TRIM(v.placa) <> '') THEN v.placa
					ELSE 'Placa Não Informada' END), '-', ''), ' ', ''))) AS placa_veiculo,
	COALESCE(vc.denominacao,'') as nome_veiculo,
	v.data_cupom,
    v.numero_cupom,
    it.codigo AS codigo_item,
    it.denominacao AS denominacao_item,
    ivc.preco,
    SUM(ivc.quantidade) AS quantidade,
    SUM (ivc.total_item - (ivc.desconto_rateado + ivc.desconto_ajuste_rateado + ivc.desconto_automatico_rateado + ivc.desconto_fidelidade_rateado)
            + (ivc.acrescimo_rateado + ivc.acrescimo_ajuste_rateado + ivc.acrescimo_automatico_rateado)) AS total_item,
    COALESCE(v.odometro, 0.000) as odometro,
	
	
	(
	
		select COALESCE(v2.odometro, 0.000) from venda_cf AS v2
		INNER JOIN item_venda_cf AS ivc2 ON (ivc2.id_venda_cf = v2.id_venda_cf)
		LEFT OUTER JOIN veiculo_cliente AS vc2 ON (vc2.id_veiculo_cliente = v2.id_veiculo_cliente)

		WHERE v2.id_cliente = v.id_cliente
		
		AND CASE WHEN (vc.placa <> '') THEN vc.placa = vc2.placa
			WHEN  (TRIM(v.placa) <> '') THEN TRIM(v.placa) = TRIM(v2.placa)
			END
			
		AND v2.cancelada = 'N'
		AND ivc2.cancelado = 'N'
		AND v2.data_cupom > v.data_cupom
		ORDER BY v2.data_cupom
		LIMIT 1 
	
	
	) as Odometro_Posterior,
	
	
    case when mc.nome is null then v.motorista else mc.nome end  AS motorista
FROM    movimento_venda_terminal AS mv
    INNER JOIN venda_cf AS v ON (v.id_movimento_venda_terminal = mv.id_movimento_venda_terminal)
    INNER JOIN item_venda_cf AS ivc ON (ivc.id_venda_cf = v.id_venda_cf)
    INNER JOIN item AS it ON (it.id_item = ivc.id_item)
    INNER JOIN pessoa AS p ON (p.id_pessoa = v.id_cliente)
    INNER JOIN cliente AS cli ON (cli.id_cliente = p.id_pessoa)
    INNER JOIN sis_empresa AS e ON (e.id_empresa = mv.id_empresa)
    LEFT OUTER JOIN veiculo_cliente AS vc ON (vc.id_veiculo_cliente = v.id_veiculo_cliente)
    LEFT OUTER JOIN motorista_cliente AS mc ON (mc.id_motorista_cliente = v.id_motorista_cliente)
WHERE   
 mv.data_movimento BETWEEN :DataInicial AND :DataFinal
AND (:IdClienteNaoObrigatorio = -1 OR v.id_cliente = :IdClienteNaoObrigatorio)
AND	(:IdMotorista = -1 OR v.id_motorista_cliente = :IdMotorista)
AND	(:IdCombustivel = -1 OR it.id_item = :IdCombustivel)
AND	(regexp_replace(:PlacaVeiculo, '[^a-zA-Z0-9]', '', 'g') = '' OR (regexp_replace(vc.placa, '[^a-zA-Z0-9]', '', 'g') ~* regexp_replace(:PlacaVeiculo, '[^a-zA-Z0-9]', '', 'g') OR regexp_replace(v.placa, '[^a-zA-Z0-9]', '', 'g') ~* regexp_replace(:PlacaVeiculo, '[^a-zA-Z0-9]', '', 'g')))
AND v.cancelada = 'N'
AND ivc.cancelado = 'N'
GROUP BY 
e.nome,
v.id_cliente,
p.codigo,
p.nome,
vc.placa,
v.placa,
vc.denominacao,
v.data_cupom,
v.numero_cupom,
it.codigo,
it.denominacao,
ivc.preco,
v.odometro,
mc.nome,
v.motorista
ORDER BY 
    p.nome,
    placa_veiculo,
    v.data_cupom,  
    odometro,
    e.nome