WITH sub_contrato_credito_cliente AS (
	SELECT COALESCE((SELECT	f.lista_id_cliente_grupo_economico
		FROM    f_obtem_dados_credito_cliente(ARRAY[CAST(-1 AS BIGINT)], CAST(NULL AS BIGINT), CAST(1  AS BIGINT), FALSE) f        
		GROUP BY
			f.lista_id_cliente_grupo_economico)
	, ARRAY[CAST(-1 AS BIGINT)]) lista_id_cliente
)
, sub_titulo_financeiro AS (
    SELECT
        cli.id_cliente
        , tf.id_empresa
        , COALESCE(SUM(tf.valor_principal - (tf.desconto_cobranca + tf.desconto_financeiro + tf.valor_taxa_administracao + tf.tarifa_transacao + tf.retencao_tributaria) + (tf.acrescimo_financeiro + tf.juros_cobranca + tf.multa_cobranca)) FILTER (WHERE tf.natureza_titulo IN (201,221) AND tf.situacao IN (1, 9)), 0) total_nota_prazo_aberto
    FROM    cliente AS cli
        INNER JOIN titulo_financeiro AS tf ON (cli.id_cliente = tf.id_credor_devedor)
    WHERE   TRUE
       AND	(cli.id_cliente in (select id_cliente from  venda_cf where DATE(data_cupom) <= CURRENT_DATE))

    AND	((tf.natureza_titulo IN (106, 117, 204, 205, 201)) 
        OR (tf.natureza_titulo = 221 AND EXISTS (SELECT 1 FROM titulo_financeiro tff WHERE tff.id_titulo_filho = tf.id_titulo_financeiro AND tff.natureza_titulo IN (221,201) ))
    )
    AND tf.situacao IN (1, 5, 9) 
    AND NOT EXISTS (SELECT 1 
                        FROM titulo_financeiro AS tfr
                        INNER JOIN sis_referencia_registro AS srr ON(srr.id_chave_registro_a = tf.id_titulo_financeiro AND tipo_referencia = 'ref_titulo_financeiro_id_titulo_financeiro_adiantamento_recebido_cobranca_bancaria')
                        WHERE  tfr.id_titulo_financeiro = srr.id_chave_registro_b
                        AND tfr.situacao IN(1))
    GROUP BY
	cli.id_cliente
	, tf.id_empresa
)
 , sub_titulo_financeiro_global AS (
	SELECT	s.id_cliente
		, SUM(s.total_nota_prazo_aberto) total_nota_prazo_aberto
	FROM	sub_titulo_financeiro s
	GROUP BY
		s.id_cliente
)
, sub_contrato_credito AS (
	SELECT	f.limite_credito
		, f.titulo_situacao
		, f.fim_validade
		, f.situacao
		, f.id_tipo_recebimento
		, f.limite_credito_tipo_recebimento
		, f.lista_id_empresa
		, f.lista_id_cliente_grupo_economico
		, f.grupo_economico
	FROM    f_obtem_dados_credito_cliente((SELECT ARRAY_AGG(c.id_cliente) FROM cliente c), CAST(NULL AS BIGINT), CAST(1  AS BIGINT), TRUE) f
    WHERE	f.id_tipo_recebimento IN (2 , 3 , 6 )
    GROUP BY
		f.limite_credito
		, f.titulo_situacao
		, f.fim_validade
		, f.situacao
		, f.id_tipo_recebimento
		, f.limite_credito_tipo_recebimento
		, f.lista_id_empresa
		, f.lista_id_cliente_grupo_economico
		, f.grupo_economico
)
SELECT	COALESCE(se.nome, 'Todas') empresa
    , COALESCE(cc.grupo_economico, '') grupo_economico
    , cli.id_cliente
    , pes.codigo || ' - ' || pes.nome cliente
    , pes.fantasia_codinome fantasia
    , COALESCE(cc.titulo_situacao, 'SEM CONTRATO DE CREDITO') situacao_credito
    , cli.sobrepoe_parametros_classe
    , cc.fim_validade vencimento_credito
    , COALESCE(cc.limite_credito, 0.00) limite_cliente
    , COALESCE(SUM(cc.limite_credito_tipo_recebimento) FILTER (WHERE cc.id_tipo_recebimento = 6), 0.00) limite_nota_prazo_tr_cliente
    , COALESCE(SUM(cc.total_nota_prazo_aberto), SUM(stfg.total_nota_prazo_aberto), 0.00) total_nota_prazo_aberto
FROM    cliente AS cli
    INNER JOIN pessoa AS pes ON (pes.id_pessoa = cli.id_cliente)
    LEFT JOIN LATERAL (SELECT scc.limite_credito
            , scc.titulo_situacao
            , scc.fim_validade
            , scc.situacao
            , scc.id_tipo_recebimento
            , scc.limite_credito_tipo_recebimento
            , scc.lista_id_empresa
            , scc.lista_id_cliente_grupo_economico
            , scc.grupo_economico
            , COALESCE((CASE WHEN scc.lista_id_empresa = '{NULL}' THEN tfg.total_nota_prazo_aberto ELSE tf.total_nota_prazo_aberto END), 0.00) total_nota_prazo_aberto
        FROM    sub_contrato_credito scc
		LEFT JOIN LATERAL (SELECT COALESCE(SUM(s.total_nota_prazo_aberto) FILTER (WHERE scc.id_tipo_recebimento = 6), 0) total_nota_prazo_aberto
			FROM	sub_titulo_financeiro_global s
			WHERE	s.id_cliente = ANY (scc.lista_id_cliente_grupo_economico)
			AND	scc.lista_id_empresa = '{NULL}') tfg ON (TRUE)
		LEFT JOIN LATERAL (SELECT COALESCE(SUM(s.total_nota_prazo_aberto) FILTER (WHERE scc.id_tipo_recebimento = 6), 0) total_nota_prazo_aberto
			FROM	sub_titulo_financeiro s
			WHERE	s.id_cliente = ANY (scc.lista_id_cliente_grupo_economico)
			AND	s.id_empresa = ANY (scc.lista_id_empresa)) tf ON (TRUE)		
		WHERE	cli.id_cliente = ANY (scc.lista_id_cliente_grupo_economico)) cc ON (TRUE)
   LEFT JOIN sub_titulo_financeiro_global stfg ON (stfg.id_cliente = cli.id_cliente)
   LEFT JOIN sis_empresa se ON (se.id_empresa = ANY (cc.lista_id_empresa))
WHERE	TRUE
AND	(cli.id_cliente in (select id_cliente from  venda_cf where DATE(data_cupom) <= CURRENT_DATE))

GROUP BY
    se.nome
    , cc.grupo_economico
    , cli.id_cliente
    , pes.codigo
    , pes.nome
    , pes.fantasia_codinome
    , cc.titulo_situacao
    , cli.sobrepoe_parametros_classe
    , cc.fim_validade
    , cc.limite_credito;