WITH RECURSIVE tmp_pagamento_titulos(
    id_titulo_raiz, --ID PARA FAZER O RELACIONAMENTO MASTER DETAIL
    id_titulo_financeiro, 
    id_titulo_filho, 
    id_titulo_pai, 
	id_natureza_titulo,
	natureza_titulo,
	data_emissao,
	data_vencimento,
	numero_titulo,
    valor_titulo, 
    situacao, 
    data_liquidacao, 
    id_conta_liquidacao,
    juros_cobranca, 
    multa_cobranca, 
    desconto_cobranca, 
    retencao_tributaria, 
    valor_liquidado, 
    valor_ajuste,
    valor_recebido,
    valor_amortizado,
    valor_residual,
    valor_titulo_recalculado,
    valor_amortizado_recalculado,
    valor_residual_recalculado) AS 
    (
        SELECT  
            tf.id_titulo_financeiro AS id_titulo_raiz,
            tf.id_titulo_financeiro,
            tf.id_titulo_filho,
            tf.id_titulo_pai,  
			tf.natureza_titulo as id_natureza_titulo,
			ovl1.titulo AS natureza_titulo,
			tf.data_emissao,
			tf.data_vencimento,
			tf.numero_titulo,
            tf.valor_titulo,
            tf.situacao,
            tf.data_liquidacao,
            tf.id_conta_liquidacao,
            tf.juros_cobranca,
            tf.multa_cobranca,
            tf.desconto_cobranca,
            tf.retencao_tributaria,
            tf.valor_liquidado,
            (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria) AS valor_ajuste,
            CAST((CASE WHEN tf.situacao IN (2, 3) THEN tf.valor_liquidado ELSE 0 END) AS DECIMAL(12,2)) AS valor_recebido,
            CAST((CASE WHEN tf.situacao IN (2, 3) THEN tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria) ELSE 0 END) AS DECIMAL(12,2)) AS valor_amortizado,
            CAST((CASE WHEN tf.situacao IN (2, 3) THEN tf.valor_titulo - (tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria)) ELSE tf.valor_titulo END) AS DECIMAL(12,2)) AS valor_residual,
            tf.valor_titulo AS valor_titulo_recalculado,
            CAST((CASE WHEN tf.situacao IN (2, 3) THEN tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria) ELSE 0.00 END) AS DECIMAL(12,2)) AS valor_amortizado_recalculado,
            CAST((CASE WHEN tf.situacao IN (2, 3) THEN tf.valor_titulo - (tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria)) ELSE tf.valor_titulo END) AS DECIMAL(12,2)) AS valor_residual_recalculado
        FROM  titulo_financeiro tf
			INNER JOIN sis_opcao_lista_valor AS ovl1 ON (ovl1.id = tf.natureza_titulo AND ovl1.id_lista_valor = 'C043EFC0EDD5414995003170978F8878')
        WHERE tf.tipo_titulo = 3 AND tf.id_empresa = :IdEmpresaObrigatorio AND tf.data_emissao BETWEEN :DataInicialEmissao AND :DataFinalEmissao
		AND	(:IdCredorDevedorNaoObrigatorio = -1 OR tf.id_credor_devedor = :IdCredorDevedorNaoObrigatorio) -- INFORMAR NESTE CAMPO A CONDIÇÃO DO SQL

        UNION ALL

        SELECT  
            t.id_titulo_raiz, --ID PARA FAZER O RELACIONAMENTO MASTER DETAIL
            tf.id_titulo_financeiro,
            tf.id_titulo_filho,
            tf.id_titulo_pai,
			tf.natureza_titulo as id_natureza_titulo,
			ovl1.titulo AS natureza_titulo,	
			tf.data_emissao,
			tf.data_vencimento,
			tf.numero_titulo,
            tf.valor_titulo,
            tf.situacao,
            tf.data_liquidacao,
            tf.id_conta_liquidacao,
            tf.juros_cobranca,
            tf.multa_cobranca,
            tf.desconto_cobranca,
            tf.retencao_tributaria,
            tf.valor_liquidado, --tf.situacao = 2, 3 - Liquidado Parcialmente, 8 - Desmembrado 
            (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria) AS valor_ajuste,
            CAST((CASE WHEN tf.situacao IN (2, 3) THEN tf.valor_liquidado ELSE 0.00 END) AS DECIMAL(12,2)) AS valor_recebido,
            CAST((CASE WHEN tf.situacao IN (2, 3) THEN tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria) ELSE 0.00 END) AS DECIMAL(12,2)) AS valor_amortizado,
            CAST((CASE WHEN tf.situacao IN (2, 3) THEN tf.valor_titulo - (tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria)) ELSE tf.valor_titulo END) AS DECIMAL(12,2)) AS valor_residual,
            CAST(
                (CASE WHEN t.situacao = 8 
                THEN COALESCE((tf.valor_titulo * t.valor_residual_recalculado) / NULLIF(t.valor_residual, 0), (tf.valor_titulo * t.valor_residual_recalculado)) 
                ELSE t.valor_residual_recalculado END) AS DECIMAL(12,2)
            ) AS valor_titulo_recalculado,
            CAST(
                (CASE WHEN tf.situacao IN (2, 3) 
                THEN (CASE WHEN t.situacao = 8 
                    THEN COALESCE(((tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria)) * (t.valor_residual_recalculado / NULLIF(t.valor_residual, 0))), (tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria))) 
                    ELSE COALESCE((((tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria)) / NULLIF(tf.valor_titulo, 0)) * t.valor_residual_recalculado), (tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria))) END) 
                ELSE 0.00 END) AS DECIMAL(12,2)
            ) AS valor_amortizado_recalculado,
            CAST(
                (CASE WHEN tf.situacao IN (2, 3) 
                THEN (CASE WHEN t.situacao = 8 
                    THEN COALESCE(((tf.valor_titulo - (tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria))) * (t.valor_residual_recalculado / NULLIF(t.valor_residual, 0))), (tf.valor_titulo - (tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria))))
                    ELSE (t.valor_residual_recalculado - COALESCE((((tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria)) / NULLIF(tf.valor_titulo, 0)) * t.valor_residual_recalculado), (tf.valor_liquidado - (tf.juros_cobranca + tf.multa_cobranca - tf.desconto_cobranca - tf.retencao_tributaria)))) END)
                ELSE (CASE WHEN t.situacao = 8 
                    THEN COALESCE((tf.valor_titulo * t.valor_residual_recalculado) / NULLIF(t.valor_residual, 0), (tf.valor_titulo * t.valor_residual_recalculado)) 
                    ELSE t.valor_residual_recalculado END) END) AS DECIMAL(12,2)
            ) AS valor_residual_recalculado

        FROM  titulo_financeiro as tf
		INNER JOIN sis_opcao_lista_valor AS ovl1 ON (ovl1.id = tf.natureza_titulo AND ovl1.id_lista_valor = 'C043EFC0EDD5414995003170978F8878'),
        tmp_pagamento_titulos as t
		
        WHERE (tf.id_titulo_financeiro = t.id_titulo_filho OR tf.id_titulo_pai = t.id_titulo_financeiro)
)
 
-- Produtos
SELECT	

    tf.id_titulo_filho, --ID PARA FAZER O RELACIONAMENTO MASTER DETAIL
	CASE WHEN(vc.numero_cupom != 0) THEN CAST(vc.numero_cupom AS TEXT) ELSE tf.numero_titulo END AS numero_cupom,
	CASE WHEN (vc.data_cupom != NULL) THEN DATE(vc.data_cupom) ELSE tf.data_emissao END AS data_cupom,
	it.codigo AS codigo_item,
	CASE WHEN(COALESCE(it.denominacao, r.produto) != '' AND COALESCE(it.denominacao, r.produto) IS NOT NULL) THEN COALESCE(it.denominacao, r.produto) ELSE 'TÍTULO GERADO MANUALMENTE' END denominacao,
	COALESCE(iv.sequencia_item, r.seq_item) AS sequencia_item,
	um.sigla AS sigla_unidade,
	COALESCE(vc.placa, r.placa) AS placa_veiculo,
	iv.preco,
	COALESCE(SUM(ROUND((iv.quantidade * ((rv.valor_recebido - rv.valor_troco) / vc.total_venda)), 3)), r.quantidade) AS quantidade,
	COALESCE(SUM(ROUND((iv.total_item * ((rv.valor_recebido - rv.valor_troco) / vc.total_venda)), 3)), r.total_item) AS total_item,
	SUM(ROUND((((iv.total_bruto) - (iv.desconto + iv.desconto_automatico) + (iv.acrescimo + iv.acrescimo_automatico)) * ((rv.valor_recebido - rv.valor_troco) / vc.total_venda)), 3)) AS total_bruto,
	SUM(ROUND((iv.quantidade * iv.preco_original * ((rv.valor_recebido - rv.valor_troco) / vc.total_venda)), 3)) AS total_original,
	COALESCE(SUM(ROUND((((iv.total_item - (iv.desconto_rateado + iv.desconto_ajuste_rateado + iv.desconto_automatico_rateado + iv.desconto_fidelidade_rateado + iv.desconto_financeiro) +
		(iv.acrescimo_rateado + iv.acrescimo_ajuste_rateado + iv.acrescimo_automatico_rateado + iv.acrescimo_financeiro))) * ((rv.valor_recebido - rv.valor_troco) / vc.total_venda)), 3)), SUM(tf.valor_titulo)) AS total_negociado,
	CASE WHEN(iv.sequencia_item = 1) THEN rv.valor_troco END AS valor_troco,
	SUM(ROUND((((iv.desconto + iv.desconto_automatico + iv.desconto_rateado + iv.desconto_ajuste_rateado + iv.desconto_automatico_rateado + iv.desconto_fidelidade_rateado + iv.desconto_financeiro)) * ((rv.valor_recebido - rv.valor_troco) / vc.total_venda)), 3)) AS desconto,
	SUM(ROUND((((iv.acrescimo + iv.acrescimo_automatico + iv.acrescimo_rateado + iv.acrescimo_ajuste_rateado + iv.acrescimo_automatico_rateado + iv.acrescimo_financeiro)) * ((rv.valor_recebido - rv.valor_troco) / vc.total_venda)), 3)) AS acrescimo
FROM	titulo_financeiro AS tf
	LEFT OUTER JOIN parcela_recebimento_venda_cf AS pr ON (pr.id_titulo_financeiro = tf.id_titulo_financeiro)
	LEFT OUTER JOIN recebimento_venda_cf AS rv ON (rv.id_recebimento_venda_cf = pr.id_recebimento_venda_cf AND rv.cancelado = 'N')
	LEFT OUTER JOIN venda_cf AS vc ON (vc.id_venda_cf = rv.id_venda_cf AND vc.cancelada = 'N')
	LEFT OUTER JOIN item_venda_cf AS iv ON (iv.id_venda_cf = vc.id_venda_cf AND iv.cancelado = 'N')
	LEFT OUTER JOIN item AS it ON (it.id_item = iv.id_item)
	LEFT OUTER JOIN unidade_medida AS um ON (um.id_unidade_medida = it.id_unidade_medida)
    LEFT JOIN LATERAL(
        SELECT 
            split_part(r.part1,'|', 1) AS id_fatura,
            split_part(r.part1,'|', 2) AS placa,
            CAST(split_part(r.part2,'|', 2) AS BIGINT) AS seq_item,
            split_part(r.part2,'|', 3) AS produto,
            CAST(split_part(r.part2,'|', 4) AS DECIMAL(12,2)) AS quantidade,
            CAST(split_part(r.part2,'|', 5) AS DECIMAL(12,2)) AS total_item,
            CAST(split_part(r.part2,'|', 6) AS DECIMAL(12,2)) AS total_cabecalho
        FROM (
            SELECT 
                t.y AS part1,
                unnest(string_to_array(t.m, '$')) AS part2
            FROM (
                SELECT  
                split_part(tf.observacao,'@', 1) AS y,
                split_part(tf.observacao,'@', 2) AS m
            ) AS t
        ) AS r
    ) AS r ON TRUE
WHERE	tf.id_titulo_filho IN (SELECT id_titulo_financeiro
		FROM	titulo_financeiro AS tf
		WHERE	id_empresa = :IdEmpresaObrigatorio
		AND	data_emissao BETWEEN :DataInicialEmissao AND :DataFinalEmissao
		AND	(:IdCredorDevedorNaoObrigatorio = -1 OR tf.id_credor_devedor = :IdCredorDevedorNaoObrigatorio)		
		AND	tf.natureza_titulo IN (201, 209, 213, 220) -- Venda a Prazo, Receita, Vale Frete e Vale Motorista
		AND	situacao IN (1, 2, 3, 10) -- Aberto, Liquidado, Liquidado Parcialmente, Liquidado por Troca de Título
		AND	tipo_titulo = 3 -- Membramento
		AND	CASE WHEN (:ImprimirFaturasLiquidadas = 'S') 
			THEN (:ImprimirFaturasLiquidadas = 'S') 
			ELSE tf.id_titulo_financeiro NOT IN (select tpt.id_titulo_raiz from tmp_pagamento_titulos as tpt where tpt.situacao  = 2)
			END
			
		AND	CASE WHEN (:SomenteFaturasVencidas = 'N') 
			THEN (:SomenteFaturasVencidas = 'N') 
			ELSE CASE WHEN tf.situacao = 3
					THEN (select date(tpt.data_vencimento) from tmp_pagamento_titulos as tpt where tpt.id_titulo_raiz = tf.id_titulo_financeiro order by tpt.data_vencimento desc limit 1) <= current_date
					ELSE date(tf.data_vencimento) <= current_date 
					END
			END		
		) 
GROUP BY tf.id_titulo_filho, vc.numero_cupom, tf.numero_titulo, vc.data_cupom, tf.data_emissao, 
	it.codigo, it.denominacao, r.produto, iv.sequencia_item, r.seq_item, um.sigla, vc.placa, r.placa,
	iv.preco, r.quantidade, r.total_item, rv.valor_troco