-- Despesas Pagas no Período por Tipo/Cliente-Geral
SELECT  r.nome_empresa,
  r.tipo_despesa,
  r.nome,
  r.data_despesa_receita,
  r.numero_documento,
  r.observacao,
  r.valor_despesa_receita,
  r.data_aprovacao,
  r.nome_lancamento
FROM
(
               
WITH RECURSIVE tmp_pagamento_titulos(id_titulo_raiz, 
      id_titulo_financeiro, 
      id_titulo_filho, 
      id_titulo_pai, 
      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.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.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,
      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 (
          SELECT DISTINCT pdr.id_titulo_financeiro
          FROM  despesa_receita AS dr
            INNER JOIN parcela_despesa_receita AS pdr ON (pdr.id_despesa_receita = dr.id_despesa_receita)
            INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = dr.id_tipo_despesa_receita)
          WHERE dr.id_empresa IN (:IdEmpresaMultSlc)
          AND dr.data_despesa_receita <= :DataFinal
          AND tdr.despesa_receita = 1
          AND dr.situacao IN (2,3)
          AND dr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
                                                                                           
          UNION ALL

          SELECT DISTINCT pnfe.id_titulo_financeiro
          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 parcela_nfe AS pnfe ON (pnfe.id_nota_fiscal_entrada = nfe.id_nota_fiscal_entrada)
            INNER JOIN despesa_receita AS dr ON (dr.id_despesa_receita = infe.id_despesa)
          WHERE nfe.id_empresa IN (:IdEmpresaMultSlc)
          AND nfe.entrada <= :DataFinal
          AND nfe.situacao = 1
          AND dr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
                                                                                           
        ) AS tmp_titulos ON (tmp_titulos.id_titulo_financeiro = tf.id_titulo_financeiro)
    UNION ALL
    SELECT  t.id_titulo_raiz,
      tf.id_titulo_financeiro,
      tf.id_titulo_filho,
      tf.id_titulo_pai,   
      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.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,
      tmp_pagamento_titulos as t
    WHERE (tf.id_titulo_financeiro = t.id_titulo_filho OR tf.id_titulo_pai = t.id_titulo_financeiro)
    )
  
  --Despesas Parceladas
  SELECT  se.nome AS nome_empresa,
    tf.id_titulo_financeiro AS id_despesa_receita,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tpt.data_liquidacao AS data_despesa_receita, 
    tdr.denominacao AS tipo_despesa,
    dr.observacao,
    tpt.valor_amortizado_recalculado AS valor_despesa_receita,
    DATE(dr.data_aprovacao) AS data_aprovacao,
    us.nome AS nome_lancamento
  FROM  tmp_pagamento_titulos AS tpt
      INNER JOIN titulo_financeiro AS tf ON (tf.id_titulo_financeiro = tpt.id_titulo_raiz)
      INNER JOIN parcela_despesa_receita AS pdr ON (pdr.id_titulo_financeiro = tf.id_titulo_financeiro)
      INNER JOIN despesa_receita AS dr ON (dr.id_despesa_receita = pdr.id_despesa_receita)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = dr.id_tipo_despesa_receita)
      INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)
      INNER JOIN sis_empresa AS se ON (se.id_empresa = dr.id_empresa)
      INNER JOIN pessoa AS pes ON (pes.id_pessoa = dr.id_pessoa)
      LEFT OUTER JOIN sis_usuario AS us ON(us.id_usuario = dr.id_usuario_aprovador)
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tpt.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  
  UNION ALL
  
  -- DESPESAS POR NOTA FISCAL DE ENTRADA
  SELECT  r.nome_empresa,
    r.id_titulo_financeiro,
    r.numero_documento,
    r.nome,
    r.data_despesa_receita,
    r.tipo_despesa,
    r.observacao,
    r.valor_despesa_receita,
    CAST(NULL AS DATE) AS data_aprovacao,
    '' AS nome_aprovador
  FROM  (
    SELECT  se.nome AS nome_empresa,
      tf.id_titulo_financeiro,
      tf.numero_titulo AS numero_documento,
      p.nome,
      tpt.data_liquidacao AS data_despesa_receita,
      tdr.denominacao AS tipo_despesa,
      tf.observacao,
      ROUND(tpt.valor_amortizado_recalculado * COALESCE(infe.total_produto / NULLIF(nfe.total_produto, 0), infe.total_produto), 2) AS valor_despesa_receita
    FROM  tmp_pagamento_titulos AS tpt
    INNER JOIN titulo_financeiro AS tf ON (tf.id_titulo_financeiro = tpt.id_titulo_raiz)
    INNER JOIN parcela_nfe AS pnfe ON (pnfe.id_titulo_financeiro = tf.id_titulo_financeiro)
    INNER JOIN nota_fiscal_entrada AS nfe ON (nfe.id_nota_fiscal_entrada = pnfe.id_nota_fiscal_entrada)
    INNER JOIN item_nfe AS infe ON (infe.id_nota_fiscal_entrada = nfe.id_nota_fiscal_entrada)
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = infe.id_tipo_despesa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)
    INNER JOIN conta_financeira AS cf ON (cf.id_conta_financeira = tpt.id_conta_liquidacao)
    INNER JOIN pessoa AS p ON (p.id_pessoa = nfe.id_fornecedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = nfe.id_empresa)
    LEFT OUTER JOIN sis_usuario AS ul ON(ul.id_usuario = nfe.id_usuario_lancamento)
    WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
    AND tpt.data_liquidacao BETWEEN :DataInicial AND :DataFinal
    AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
    AND (:IdCredorDevedorNaoObrigatorio = -1 OR p.id_pessoa = :IdCredorDevedorNaoObrigatorio)) AS r
  
  UNION ALL
  
  --Acréscimo Financeiro Pago
  SELECT  se.nome AS nome_empresa,
    6 AS id_titulo_financeiro,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tf.data_liquidacao,
    tdr.denominacao AS tipo_despesa,
    CAST('' AS TEXT) AS observacao,
    SUM(tf.acrescimo_financeiro) AS total_despesa,
    CAST(NULL AS TIMESTAMP) AS data_aprovacao,
    CAST(NULL AS VARCHAR(50)) AS nome
  FROM  titulo_financeiro AS tf
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -1)
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = tf.id_credor_devedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)  
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND tf.pagar_receber = 1
  AND tf.situacao IN (2,3)
  AND (tf.acrescimo_financeiro) > 0
  GROUP BY se.nome, tf.data_liquidacao, pes.nome, tf.numero_titulo, tdr.denominacao

  UNION ALL
  
  --Juros de Cobrança Pago
  SELECT  se.nome AS nome_empresa,
    4 AS id_titulo_financeiro,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tf.data_liquidacao,
    tdr.denominacao AS tipo_despesa,
    CAST('' AS TEXT) AS observacao,
    SUM(tf.juros_cobranca) AS total_despesa,
    CAST(NULL AS TIMESTAMP) AS data_aprovacao,
    CAST(NULL AS VARCHAR(50)) AS nome
  FROM  titulo_financeiro AS tf
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -2)
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = tf.id_credor_devedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)  
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND tf.pagar_receber = 1
  AND tf.situacao IN (2,3)
  AND (tf.juros_cobranca) > 0
  GROUP BY se.nome, tf.data_liquidacao, pes.nome, tf.numero_titulo, tdr.denominacao

  UNION ALL
  
  --Multa de Cobrança Paga
  SELECT  se.nome AS nome_empresa,
    5 AS id_titulo_financeiro,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tf.data_liquidacao,
    tdr.denominacao AS tipo_despesa,
    CAST('' AS TEXT) AS observacao,
    SUM(tf.multa_cobranca) AS total_despesa,
    CAST(NULL AS TIMESTAMP) AS data_aprovacao,
    CAST(NULL AS VARCHAR(50)) AS nome
  FROM  titulo_financeiro AS tf
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -3)
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = tf.id_credor_devedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)  
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND tf.pagar_receber = 1
  AND tf.situacao IN (2,3)
  AND (tf.multa_cobranca) > 0
  GROUP BY se.nome, tf.data_liquidacao, pes.nome, tf.numero_titulo, tdr.denominacao

  UNION ALL
  
  --Desconto Financeiro Concedido
  SELECT  se.nome AS nome_empresa,
    2 AS id_titulo_financeiro,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tf.data_liquidacao,
    tdr.denominacao AS tipo_despesa,
    CAST('' AS TEXT) AS observacao,
    SUM(tf.desconto_financeiro) AS total_despesa,
    CAST(NULL AS TIMESTAMP) AS data_aprovacao,
    CAST(NULL AS VARCHAR(50)) AS nome
  FROM  titulo_financeiro AS tf
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -4)
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = tf.id_credor_devedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)  
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND tf.pagar_receber = 2
  AND tf.situacao IN (2,3)
  AND (tf.desconto_financeiro) > 0
  GROUP BY se.nome, tf.data_liquidacao, pes.nome, tf.numero_titulo, tdr.denominacao

  UNION ALL
  
  --Desconto Cobrança Concedido
  SELECT  se.nome AS nome_empresa,
    1 AS id_titulo_financeiro,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tf.data_liquidacao,
    tdr.denominacao AS tipo_despesa,
    CAST('' AS TEXT) AS observacao,
    SUM(tf.desconto_cobranca) AS total_despesa,
    CAST(NULL AS TIMESTAMP) AS data_aprovacao,
    CAST(NULL AS VARCHAR(50)) AS nome
  FROM  titulo_financeiro AS tf
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -5)
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = tf.id_credor_devedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)  
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND tf.pagar_receber = 2
  AND tf.situacao IN (2,3)
  AND (tf.desconto_cobranca) > 0
  GROUP BY se.nome, tf.data_liquidacao, pes.nome, tf.numero_titulo, tdr.denominacao
  
  UNION ALL
  
  --Taxa de Administração Paga
  SELECT  se.nome AS nome_empresa,
    7 AS id_titulo_financeiro,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tf.data_liquidacao,
    tdr.denominacao AS tipo_despesa,
    CAST('' AS TEXT) AS observacao,
    SUM(tf.valor_taxa_administracao) AS total_despesa,
    CAST(NULL AS TIMESTAMP) AS data_aprovacao,
    CAST(NULL AS VARCHAR(50)) AS nome
  FROM  titulo_financeiro AS tf
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -6)
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = tf.id_credor_devedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)  
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND tf.pagar_receber = 2
  AND tf.situacao IN (2,3)
  AND (tf.valor_taxa_administracao) > 0
  GROUP BY se.nome, tf.data_liquidacao, pes.nome, tf.numero_titulo, tdr.denominacao
  
  UNION ALL
  
  --Tarifa de Transação Paga
  SELECT  se.nome AS nome_empresa,
    8 AS id_titulo_financeiro,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tf.data_liquidacao,
    tdr.denominacao AS tipo_despesa,
    CAST('' AS TEXT) AS observacao,
    SUM(tf.tarifa_transacao) AS total_despesa,
    CAST(NULL AS TIMESTAMP) AS data_aprovacao,
    CAST(NULL AS VARCHAR(50)) AS nome
  FROM  titulo_financeiro AS tf
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -7)
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = tf.id_credor_devedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)  
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND tf.pagar_receber = 2
  AND tf.situacao IN (2,3)
  AND (tf.tarifa_transacao) > 0
  GROUP BY se.nome, tf.data_liquidacao, pes.nome, tf.numero_titulo, tdr.denominacao
  
  UNION ALL
  
  --Retenção Tributária Descontada
  SELECT  se.nome AS nome_empresa,
    3 AS id_titulo_financeiro,
    tf.numero_titulo AS numero_documento,
    pes.nome,
    tf.data_liquidacao,
    tdr.denominacao AS tipo_despesa,
    CAST('' AS TEXT) AS observacao, 
    SUM(tf.retencao_tributaria) AS total_despesa,
    CAST(NULL AS TIMESTAMP) AS data_aprovacao,
    CAST(NULL AS VARCHAR(50)) AS nome
  FROM  titulo_financeiro AS tf
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -8)
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = tf.id_credor_devedor)
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)  
  WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
  AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
  AND (:IdCredorDevedorNaoObrigatorio = -1 OR pes.id_pessoa = :IdCredorDevedorNaoObrigatorio)
  AND tdr.id_tipo_despesa_receita IN (:IdTipoDespesaEspecificoMultEsc)
  AND tf.pagar_receber = 2
  AND tf.situacao IN (2,3)
  AND (tf.retencao_tributaria) > 0
  GROUP BY se.nome, tf.data_liquidacao, pes.nome, tf.numero_titulo, tdr.denominacao)AS r
ORDER BY r.tipo_despesa,
  r.nome,
  r.data_despesa_receita