--- IdEmpresaMultSlc, DataInicial, DataFinal
WITH  variacao_estoque as (
    
	SELECT  
		r.id_empresa,
		r.tipo_produto,
		r.nome_empresa,
		r.data_movimento,
        SUM(valor_total) AS total_variacao_estoque
  FROM  (
    
    SELECT  me.id_empresa,
			(CASE WHEN UPPER(ci.denominacao) like '%COMBUSTIVEIS%' THEN 'COMBUSTIVEIS' ELSE 'PRODUTOS' END) as tipo_produto,
			se.nome AS nome_empresa,
			me.data_movimento,
        COALESCE(SUM(me.valor * (POSITION(CAST('1' AS CHAR) IN CAST(tme.entrada_saida AS CHAR(1))) * 2 - 1)), 0) AS valor_total
    FROM  movimento_estoque AS me
	  INNER JOIN item as i ON (i.id_item = me.id_item)
	  INNER JOIN categoria_item as ci ON (i.id_categoria_item = ci.id_categoria_item)
      INNER JOIN tipo_movimento_estoque AS tme ON (tme.id_tipo_movimento_estoque = me.id_tipo_movimento_estoque)
	  INNER JOIN sis_empresa as se on se.id_empresa = me.id_empresa
    WHERE me.data_movimento BETWEEN :DataInicial AND :DataFinal
    AND me.id_empresa IN (:IdEmpresaMultSlc)
    AND tme.movimento_automatico = 'N'
    AND :ImprimirVaricaoEstoque = 'S'
	GROUP BY me.id_empresa, se.nome, me.data_movimento, ci.denominacao


    UNION ALL
    
    
    SELECT  me.id_empresa,
			(CASE WHEN UPPER(ci.denominacao) like '%COMBUSTIVEIS%' THEN 'COMBUSTIVEIS' ELSE 'PRODUTOS' END) as tipo_produto,
			se.nome AS nome_empresa,
			me.data_movimento,
        COALESCE(SUM(me.valor * (POSITION(CAST('1' AS CHAR) IN CAST(tme.entrada_saida AS CHAR(1))) * 2 - 1)), 0) AS valor_total
    FROM  medicao_tanque_lmc AS mtl
      INNER JOIN movimento_lmc AS ml ON (ml.id_movimento_lmc = mtl.id_movimento_lmc)
      INNER JOIN lmc AS lmc ON (lmc.id_lmc = ml.id_lmc)
      INNER JOIN movimento_estoque AS me ON (me.id_movimento_estoque = mtl.id_movimento_estoque)
	  INNER JOIN item as i ON (i.id_item = me.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 = me.id_empresa
      INNER JOIN tipo_movimento_estoque AS tme ON (tme.id_tipo_movimento_estoque = me.id_tipo_movimento_estoque)
    WHERE ml.data_movimento BETWEEN :DataInicial AND :DataFinal
    AND :ImprimirVaricaoEstoque = 'S'
    AND lmc.id_empresa IN (:IdEmpresaMultSlc)
	  GROUP BY me.id_empresa, se.nome, me.data_movimento, ci.denominacao
	 ) as r 
	 GROUP BY r.id_empresa, r.nome_empresa, r.data_movimento,r.tipo_produto
),

titulo_receber_pagar_temp AS (

    SELECT
		tf.id_titulo_financeiro,
		se.id_empresa,
		cf.denominacao AS nome_conta_financeira,
		tf.situacao,
		se.codigo AS codigo_empresa,
		se.nome AS nome_empresa,
		p.codigo AS codigo_credor_devedor,
		p.nome AS credor_devedor,
		tf.pagar_receber,
		tf.numero_titulo,
		mf.observacao,
		tf.numero_parcela,
		tf.data_emissao,
		tf.data_vencimento,
		tf.data_liquidacao,
		tf.id_conta_liquidacao,
		tf.valor_titulo,
		tf.valor_taxa_administracao,
		tf.tarifa_transacao,
        tf.acrescimo_financeiro,
        tf.juros_cobranca,
        tf.multa_cobranca,
        tf.desconto_financeiro,
        tf.desconto_cobranca,
        tf.retencao_tributaria,
		(tf.acrescimo_financeiro + tf.juros_cobranca + tf.multa_cobranca) AS acrescimo,
		(tf.desconto_financeiro + tf.desconto_cobranca + tf.retencao_tributaria) AS desconto,
        
        (tf.valor_liquidado
        +(tf.desconto_financeiro + tf.desconto_cobranca + tf.retencao_tributaria)
        - (tf.acrescimo_financeiro + tf.juros_cobranca + tf.multa_cobranca))  AS valor_liquidado,

		tf.valor_principal,
		tf.valor_liquidado AS valor_liquidado_movimento,
		tf.natureza_titulo AS natureza_titulo_codigo,
		tf.id_movimento_liquidacao,
		tdr.denominacao AS denominacao_tipo,
		tdr.classificacao_despesa_receita,

		cdr.id_categoria_despesa_receita,
		cdr.denominacao AS denominacao_categoria,
		tdr.id_tipo_despesa_receita

	FROM	titulo_financeiro AS tf 
		LEFT JOIN pessoa AS p ON (tf.id_credor_devedor = p.id_pessoa)
		LEFT JOIN tipo_cobranca AS tc ON (tc.id_tipo_cobranca = tf.id_tipo_cobranca)
		LEFT JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
		LEFT JOIN conta_financeira AS cf ON (cf.id_conta_financeira = tf.id_conta_liquidacao)
		LEFT JOIN movimento_financeiro AS mf ON (mf.id_movimento_financeiro = tf.id_movimento_liquidacao)
		LEFT JOIN tipo_movimento_financeiro AS tmf ON (tmf.id_tipo_movimento_financeiro = mf.id_tipo_movimento_financeiro)
		LEFT JOIN especie_financeira AS ef ON (ef.id_especie_financeira = mf.id_especie_financeira)
		
		LEFT JOIN parcela_despesa_receita AS pdr ON (pdr.id_titulo_financeiro = tf.id_titulo_financeiro)
		LEFT JOIN despesa_receita AS dr ON (dr.id_despesa_receita = pdr.id_despesa_receita)
		LEFT JOIN tipo_despesa_receita AS tdr ON (dr.id_tipo_despesa_receita = tdr.id_tipo_despesa_receita)
		LEFT 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 tf.pagar_receber IN (1,2) -- AND tf.natureza_titulo NOT IN (101)
		AND tf.situacao IN (2,3, 10)

    UNION ALL

    SELECT 
        
		tf.id_titulo_financeiro,
		se.id_empresa,
		cf.denominacao AS nome_conta_financeira,
		tf.situacao,
		se.codigo AS codigo_empresa,
		se.nome AS nome_empresa,
		p.codigo AS codigo_credor_devedor,
		p.nome AS credor_devedor,
		tf.pagar_receber,
		tf.numero_titulo,
		mf.observacao,
		tf.numero_parcela,
		tf.data_emissao,
		tf.data_vencimento,
		tf.data_liquidacao,
		tf.id_conta_liquidacao,
		tf.valor_titulo,
		tf.valor_taxa_administracao,
		tf.tarifa_transacao,
    0 AS acrescimo_financeiro,
    0 AS juros_cobranca,
    0 AS multa_cobranca,
    0 AS desconto_financeiro,
    0 AS desconto_cobranca,
    0 AS retencao_tributaria,
    ROUND( (tf.acrescimo_financeiro + tf.juros_cobranca + tf.multa_cobranca)
    * COALESCE(infe.total_produto / NULLIF(nfe.total_produto, 0), 
      (tf.acrescimo_financeiro + tf.juros_cobranca + tf.multa_cobranca)
    ), 2) AS acrescimo,

    ROUND( (tf.desconto_financeiro + tf.desconto_cobranca + tf.retencao_tributaria)
    * COALESCE(infe.total_produto / NULLIF(nfe.total_produto, 0),   
    (tf.desconto_financeiro + tf.desconto_cobranca + tf.retencao_tributaria)
    ), 2) AS desconto,

    ROUND( (tf.valor_liquidado
        +(tf.desconto_financeiro + tf.desconto_cobranca + tf.retencao_tributaria)
        - (tf.acrescimo_financeiro + tf.juros_cobranca + tf.multa_cobranca))
    * COALESCE(infe.total_produto / NULLIF(nfe.total_produto, 0), 
     (tf.valor_liquidado
        +(tf.desconto_financeiro + tf.desconto_cobranca + tf.retencao_tributaria)
        - (tf.acrescimo_financeiro + tf.juros_cobranca + tf.multa_cobranca))
    ), 2) AS valor_liquidado,
    
		tf.valor_principal,
		tf.valor_liquidado AS valor_liquidado_movimento,
		tf.natureza_titulo AS natureza_titulo_codigo,
		tf.id_movimento_liquidacao,
		tdr.denominacao AS denominacao_tipo,
		tdr.classificacao_despesa_receita,

		cdr.id_categoria_despesa_receita,
		cdr.denominacao AS denominacao_categoria,
		tdr.id_tipo_despesa_receita
		
	FROM titulo_financeiro AS tf 
		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 = tf.id_conta_liquidacao)
		INNER JOIN movimento_financeiro AS mf ON (mf.id_movimento_financeiro = tf.id_movimento_liquidacao)	
		INNER JOIN pessoa AS p ON (p.id_pessoa = tf.id_credor_devedor)
		INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
	WHERE tf.id_empresa IN (:IdEmpresaMultSlc)
		AND tf.data_liquidacao BETWEEN :DataInicial AND :DataFinal
		AND tf.situacao IN (2,3, 10)

),

tmp_despesas AS (

  SELECT 
    r.id_empresa,
    r.nome_empresa,
    r.data_despesa_receita,
    r.denominacao,
    r.valor_despesa,
    r.classificacao_despesa_receita,
    r.denominacao_categoria
  FROM  (
               
    
    --Liquidação de Despesas a Prazo
    SELECT  
        tf.id_empresa,
        tf.nome_empresa,  
        tf.data_liquidacao AS data_despesa_receita,
        tf.denominacao_tipo AS denominacao,
        tf.valor_liquidado  AS valor_despesa,
        tf.classificacao_despesa_receita,
        tf.denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf 
    WHERE  tf.pagar_receber = 1 AND tf.id_tipo_despesa_receita IS NOT NULL

    UNION ALL

    --CONTAS A PAGAR
    SELECT  
        tf.id_empresa,
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        SUM(tf.acrescimo_financeiro) AS valor_despesa,
        3 AS classificacao_despesa_receita,
        'OUTRAS DESPESAS' AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
      INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -1)
    WHERE tf.pagar_receber = 1
    AND tf.situacao IN (2, 3)
    AND tf.acrescimo_financeiro > 0
    GROUP BY 1,2,3,4
    
    UNION ALL
    
    SELECT
        tf.id_empresa,  
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        SUM(tf.juros_cobranca) AS valor_despesa,
        3 AS classificacao_despesa_receita,
        'OUTRAS DESPESAS' AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
      INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -2)
    WHERE tf.pagar_receber = 1
    AND tf.situacao IN (2, 3)
    AND tf.juros_cobranca > 0
    GROUP BY 1,2,3,4

    UNION ALL

    SELECT 
        tf.id_empresa, 
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        SUM(tf.multa_cobranca) AS valor_despesa,
        3 AS classificacao_despesa_receita,
        'OUTRAS DESPESAS' AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
      INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -3)
    WHERE tf.pagar_receber = 1
    AND tf.situacao IN (2, 3)
    AND tf.multa_cobranca > 0
    GROUP BY 1,2,3,4

    UNION ALL
    
    --CONTAS A RECEBER
    SELECT 
        tf.id_empresa, 
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        SUM(tf.desconto_financeiro) AS valor_despesa,
        3 AS classificacao_despesa_receita,
        'OUTRAS DESPESAS' AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
      INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -4)
    WHERE tf.pagar_receber = 2
    AND tf.situacao IN (2, 3)
    AND tf.desconto_financeiro > 0
    GROUP BY 1,2,3,4


    UNION ALL
    
    SELECT  
        tf.id_empresa, 
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        SUM(tf.desconto_cobranca) AS valor_despesa,
        3 AS classificacao_despesa_receita,
        'OUTRAS DESPESAS' AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
      INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -5)
    WHERE tf.pagar_receber = 2
    AND tf.situacao IN (2, 3)
    AND tf.desconto_cobranca > 0
    GROUP BY 1,2,3,4


    UNION ALL

    --CARTÕES DE CRÉDITO
    SELECT  
        tf.id_empresa, 
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        SUM(tf.valor_taxa_administracao) AS valor_despesa,
        3 AS classificacao_despesa_receita,
        'OUTRAS DESPESAS' AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
      INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -6)
    WHERE tf.pagar_receber = 2
    AND tf.situacao IN (2, 3)
    AND tf.valor_taxa_administracao > 0
    GROUP BY 1,2,3,4

    UNION ALL

    SELECT 
        tf.id_empresa,  
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        SUM(tf.tarifa_transacao) AS valor_despesa,
        3 AS classificacao_despesa_receita,
        'OUTRAS DESPESAS' AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
      INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -7)
    WHERE tf.pagar_receber = 2
    AND tf.situacao IN (2, 3)
    AND tf.tarifa_transacao > 0
    GROUP BY 1,2,3,4
    
    UNION ALL

    SELECT
        tf.id_empresa,   
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        SUM(tf.retencao_tributaria) AS valor_despesa,
        3 AS classificacao_despesa_receita,
        'OUTRAS DESPESAS' AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
      INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
      INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -8)
    WHERE tf.pagar_receber = 2
    AND tf.situacao IN (2, 3)
    AND tf.retencao_tributaria > 0
    GROUP BY 1,2,3,4 
    ) AS r
),

tmp_receitas AS (

  SELECT  
    r.id_empresa, 
    r.nome_empresa,
    r.data_despesa_receita,
    r.denominacao,
    r.denominacao_categoria,
    r.valor_receita,
    r.classificacao_despesa_receita
  FROM
  (
 
  --Liquidação de Receita a Prazo
  SELECT 
    tf.id_empresa,
    tf.nome_empresa,
    tf.data_liquidacao AS data_despesa_receita,
    tf.denominacao_tipo AS denominacao,
    tf.valor_liquidado AS valor_receita,
    tf.classificacao_despesa_receita,
    tf.denominacao_categoria
  FROM  titulo_receber_pagar_temp AS tf
  WHERE tf.pagar_receber = 2 AND tf.id_tipo_despesa_receita IS NOT NULL
    AND (tf.id_tipo_despesa_receita <> 29169284) -- RECEITA QUE NÃO DEVERÁ CONSTAR  
  
  UNION ALL

 -- Acréscimo Financeiro Recebido
  SELECT 
    tf.id_empresa,
    tf.nome_empresa,
    tf.data_liquidacao AS data_despesa_receita,
    tdr.denominacao AS denominacao,
    tf.acrescimo_financeiro AS valor_receita,
    tdr.classificacao_despesa_receita,
    cdr.denominacao AS denominacao_categoria
  FROM  titulo_receber_pagar_temp AS tf
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -1000)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)
  WHERE tf.pagar_receber = 2
  AND tf.acrescimo_financeiro > 0

    UNION ALL

 -- JURO DE COBRANÇA RECEBIDO
  SELECT 
    tf.id_empresa,
    tf.nome_empresa,
    tf.data_liquidacao AS data_despesa_receita,
    tdr.denominacao AS denominacao,
    tf.juros_cobranca AS valor_receita,
    tdr.classificacao_despesa_receita,
    cdr.denominacao AS denominacao_categoria
  FROM  titulo_receber_pagar_temp AS tf
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -2000)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)
  WHERE tf.pagar_receber = 2
  AND tf.juros_cobranca > 0

  UNION ALL

  -- MULTA DE COBRANÇA RECEBIDA
  SELECT 
    tf.id_empresa,
    tf.nome_empresa,
    tf.data_liquidacao AS data_despesa_receita,
    tdr.denominacao AS denominacao,
    tf.multa_cobranca AS valor_receita,
    tdr.classificacao_despesa_receita,
    cdr.denominacao AS denominacao_categoria
  FROM  titulo_receber_pagar_temp AS tf
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -3000)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)
  WHERE tf.pagar_receber = 2
  AND tf.multa_cobranca > 0

  UNION ALL

  --RETENÇÃO TRIBUTARIA ACRESCIDA
  SELECT 
    tf.id_empresa, 
    tf.nome_empresa,
    tf.data_liquidacao AS data_despesa_receita,
    tdr.denominacao AS denominacao,
    tf.retencao_tributaria AS valor_receita,
    tdr.classificacao_despesa_receita,
    cdr.denominacao AS denominacao_categoria
  FROM  titulo_receber_pagar_temp AS tf
    INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
    INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -8000)
    INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)
  WHERE tf.pagar_receber = 1
  AND tf.retencao_tributaria > 0
  ) AS r
),

receitas_descontos_financeiros AS (
    -- DESCONTO FINANCEIRO RECEBIDO
    SELECT
        tf.id_empresa, 
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        tf.desconto_financeiro AS valor_receita,
        tdr.classificacao_despesa_receita,
        cdr.denominacao AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
        INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
        INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -4000)
        INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)
    WHERE tf.pagar_receber = 1
    AND tf.desconto_financeiro > 0

    UNION ALL

    --DESCONTO DE COBRANÇA RECEBIDO
    SELECT
        tf.id_empresa, 
        tf.nome_empresa,
        tf.data_liquidacao AS data_despesa_receita,
        tdr.denominacao AS denominacao,
        tf.desconto_cobranca AS valor_receita,
        tdr.classificacao_despesa_receita,
        cdr.denominacao AS denominacao_categoria
    FROM  titulo_receber_pagar_temp AS tf
        INNER JOIN sis_empresa AS se ON (se.id_empresa = tf.id_empresa)
        INNER JOIN tipo_despesa_receita AS tdr ON (tdr.id_tipo_despesa_receita = -5000)
        INNER JOIN categoria_despesa_receita AS cdr ON (cdr.id_categoria_despesa_receita = tdr.id_categoria_despesa_receita)
    WHERE tf.pagar_receber = 1
    AND tf.desconto_cobranca > 0
),

tmp_resumo_mensal_receitas_vendas AS (

    
    SELECT  
        r.id_empresa,
        r.empresa,
        'Operação Vendas' as classificacao_despesa_receita,
        r.denominacao_item,
        0 AS qtde_abastecimento,
        SUM(r.quantidade) AS litragem,
        sum(r.desconto) as desconto,
        CAST(0 AS DECIMAL(12,3)) AS suprimentos,
        SUM(r.valor_venda_combustivel) AS valor_venda_combustivel,
        CAST(0 AS DECIMAL(12,2)) AS valor_venda_produto,
        SUM(r.custo) AS custo_combustivel,
        CAST(0 AS DECIMAL(12,2)) AS custo_produto,
        CAST(CAST('' AS TEXT) AS VARCHAR(100)) AS denominacao_despesa,
        CAST(0 AS DECIMAL(12,2)) AS valor_despesa,
        CAST(0 AS DECIMAL(12,2)) AS valor_receita,
        CAST(0 AS DECIMAL(12,2)) AS valor_retirada,
        CAST(0 AS DECIMAL(12,2)) AS valor_investimento,
        CAST(0 AS DECIMAL(12,3)) AS valor_variacao_estoque,
        'OPERAÇÃO VENDAS' AS denominacao_categoria,
        0 AS valor_receita_suprimento,
        0 AS aplicacoes_rendimentos,
        0 AS desconto_financeiros
    FROM  (
        SELECT  
            se.id_empresa,
            se.nome AS empresa,
            (CASE WHEN iv.id_bico_combustivel IS NOT NULL THEN i.denominacao ELSE 'Outros Produtos' END) AS denominacao_item,
            mvt.data_movimento AS data,
            (CASE WHEN iv.id_bico_combustivel IS NOT NULL
				THEN iv.quantidade ELSE 0 END) AS quantidade,
            (CASE WHEN iv.id_bico_combustivel IS NOT NULL
				THEN  ROUND((iv.preco_original * iv.quantidade), 2) + (
                                CASE WHEN ROUND((iv.preco_original * iv.quantidade), 2) < iv.total_item THEN iv.total_item - ROUND((iv.preco_original * iv.quantidade), 2) ELSE 0 END
                ) ELSE
                 (iv.total_item - iv.desconto_rateado + iv.acrescimo_rateado - iv.desconto_ajuste_rateado + iv.acrescimo_ajuste_rateado - iv.desconto_automatico_rateado + iv.acrescimo_automatico_rateado - iv.desconto_fidelidade_rateado) 
            END) AS valor_venda_combustivel,
            me.valor AS custo,

            (CASE WHEN ROUND((iv.preco_original * iv.quantidade), 2) > iv.total_item THEN ROUND((iv.preco_original * iv.quantidade), 2) - iv.total_item ELSE 0 END) AS desconto
        FROM  movimento_venda_terminal AS mvt
        INNER JOIN venda_cf AS v ON (v.id_movimento_venda_terminal = mvt.id_movimento_venda_terminal)
        INNER JOIN item_venda_cf AS iv ON (iv.id_venda_cf = v.id_venda_cf)
        INNER JOIN movimento_estoque AS me ON (me.id_movimento_estoque = iv.id_movimento_estoque)
        INNER JOIN sis_empresa AS se ON (se.id_empresa = mvt.id_empresa)
        INNER JOIN item AS i ON (i.id_item = iv.id_item)
        WHERE mvt.id_empresa IN (:IdEmpresaMultSlc)
        AND mvt.data_movimento BETWEEN :DataInicial AND :DataFinal
        AND v.cancelada = 'N'
        AND iv.cancelado = 'N'
        -- AND iv.id_bico_combustivel IS NOT NULL
        --AND iv.id_item IN (SELECT id_item_tanque FROM local_estoque_temp WHERE id_item_tanque IS NOT NULL)

        UNION ALL

        SELECT  
        
            se.id_empresa,
            se.nome AS empresa,
            (CASE WHEN infs.id_item IN (SELECT id_local_estoque FROM local_estoque WHERE tipo = 2)
			THEN i.denominacao ELSE 'Outros Produtos' END) AS denominacao_item,
            nfs.emissao AS data,
            (CASE WHEN infs.id_item IN (SELECT id_local_estoque FROM local_estoque WHERE tipo = 2)
				THEN infs.quantidade ELSE 0 END) AS quantidade,
            infs.total_item AS valor_venda_combustivel,
            me.valor AS custo,
            CAST(0 AS DECIMAL(12,3)) AS desconto
        FROM  nota_fiscal_saida AS nfs
        INNER JOIN item_nfs AS infs ON (infs.id_nota_fiscal_saida = nfs.id_nota_fiscal_saida)
        INNER JOIN sis_referencia_registro AS rr ON (rr.id_chave_registro_a = infs.id_item_nfs AND rr.tipo_referencia = 'ref_1101_0411_movimento_estoque_nfs')
        INNER JOIN movimento_estoque AS me ON (me.id_movimento_estoque = rr.id_chave_registro_b)
        INNER JOIN item AS i ON (i.id_item = infs.id_item)
        INNER JOIN sis_empresa AS se ON (se.id_empresa = nfs.id_empresa)
        WHERE nfs.id_empresa IN (:IdEmpresaMultSlc)
        AND nfs.emissao BETWEEN :DataInicial AND :DataFinal
        AND nfs.situacao = 1 
        AND EXISTS(SELECT 1 FROM cfop WHERE tipo_movimento_estoque != 4 AND gera_titulo_financeiro = 'S' AND id_tipo_movimento_estoque = 7 AND id_cfop = infs.id_cfop)
        --AND infs.id_local_estoque IN (SELECT id_local_estoque FROM local_estoque WHERE tipo = 2)

        UNION ALL

        SELECT  
            se.id_empresa,
            se.nome AS nome_empresa,
            (CASE WHEN infe.id_item IN (SELECT id_local_estoque FROM local_estoque WHERE tipo = 2)
			THEN i.denominacao ELSE 'Outros Produtos' END) AS denominacao_item,
            nfe.emissao AS data,
            (CASE WHEN infe.id_item IN (SELECT id_local_estoque FROM local_estoque WHERE tipo = 2)
				THEN infe.quantidade * -1 ELSE 0 END) AS quantidade,
            (infe.total_produto * -1) AS valor_venda_combustivel,
            (me.valor * -1) AS custo,
            CAST(0 AS DECIMAL(12,3)) AS desconto
        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 movimento_estoque AS me ON (me.id_movimento_estoque = infe.id_movimento_estoque)
        INNER JOIN item AS i ON (i.id_item = infe.id_item)
        INNER JOIN sis_empresa AS se ON (se.id_empresa = nfe.id_empresa)
        WHERE nfe.id_empresa IN (:IdEmpresaMultSlc)
        AND nfe.emissao BETWEEN :DataInicial AND :DataFinal
        AND nfe.situacao = 1 
        AND EXISTS(SELECT 1 FROM cfop WHERE tipo_movimento_estoque != 4 AND id_tipo_movimento_estoque = 3 AND id_cfop = infe.id_cfop)
        --AND infe.id_local_estoque IN (SELECT id_local_estoque FROM local_estoque WHERE tipo = 2)
    ) AS r
    GROUP BY 
        r.id_empresa,
        r.empresa,
        r.denominacao_item,
        classificacao_despesa_receita

    UNION ALL

    
    SELECT  
        id_empresa,
        nome_empresa as empresa,
        (CASE WHEN classificacao_despesa_receita =1 THEN '1.Operacional'
            WHEN classificacao_despesa_receita =2 THEN '3.Administrativa'
            WHEN classificacao_despesa_receita =3 THEN '1.x.Financeira'
            WHEN classificacao_despesa_receita =5 THEN '5.Investimentos'
            WHEN classificacao_despesa_receita =6 THEN '6.Retiradas'
            WHEN classificacao_despesa_receita =7 THEN '2.Não Operacional'
            ELSE 'Outras Classificação'
    END) as classificacao_despesa_receita,
        CAST('' AS TEXT) AS denominacao_item,
        CAST(0 AS INTEGER) AS abastecimentos,
        CAST(0 AS DECIMAL(12,3)) AS litragem,
        CAST(0 AS DECIMAL(12,3)) AS desconto,
        CAST(0 AS DECIMAL(12,3)) AS suprimentos,
        CAST(0 AS DECIMAL(12,2)) AS valor_venda_combustivel,
        CAST(0 AS DECIMAL(12,2)) AS valor_venda_produto,
        CAST(0 AS DECIMAL(12,2)) AS custo_combustivel,
        CAST(0 AS DECIMAL(12,2)) AS custo_produto,
        denominacao AS denominacao_receita,
        CAST(0 AS DECIMAL(12,2)) AS valor_despesa,
        valor_receita AS valor_receita,
        CAST(0 AS DECIMAL(12,2)) AS valor_retirada,
        CAST(0 AS DECIMAL(12,2)) AS valor_investimento,
        CAST(0 AS DECIMAL(12,3)) AS valor_variacao_estoque,
        denominacao_categoria ,
        0 AS valor_receita_suprimento,
        0 AS aplicacoes_rendimentos,
        0 AS desconto_financeiros
    FROM  tmp_receitas
    
    UNION ALL
    
    SELECT  
        id_empresa,
        nome_empresa as empresa,
        'Operação Vendas' as classificacao_despesa_receita,
        '' as denominacao_item,
        0 AS qtde_abastecimento,
        0 AS litragem,
        0 as desconto,
        0 AS suprimentos,
        0 AS valor_venda_combustivel,
        0 AS valor_venda_produto,
        0 AS custo_combustivel,
        0 AS custo_produto,
        '' AS denominacao_despesa,
        0 AS valor_despesa,
        0 AS valor_receita,
        0 AS valor_retirada,
        0 AS valor_investimento,
        0 AS valor_variacao_estoque,
        '' AS denominacao_categoria,
        0 AS valor_receita_suprimento,
        0 AS aplicacoes_rendimentos,
        SUM(valor_receita) AS desconto_financeiros
    FROM receitas_descontos_financeiros 
    GROUP BY id_empresa, nome_empresa
  
),

tmp_resumo_mensal_despesas AS (
    
        
    SELECT  
        id_empresa,
        nome_empresa as empresa,
        (CASE WHEN classificacao_despesa_receita =1 THEN '1.Operacional'
            WHEN classificacao_despesa_receita =2 THEN '3.Administrativa'
            WHEN classificacao_despesa_receita =3 THEN '1.x.Financeira'
            WHEN classificacao_despesa_receita =5 THEN '5.Investimentos'
            WHEN classificacao_despesa_receita =6 THEN '6.Retiradas'
            WHEN classificacao_despesa_receita =7 THEN '2.Não Operacional'
            ELSE 'Outras Classificação'
    END) as classificacao_despesa_receita,
        CAST('' AS TEXT) AS denominacao_item,
        CAST(0 AS INTEGER) AS abastecimentos,
        CAST(0 AS DECIMAL(12,3)) AS litragem,
        CAST(0 AS DECIMAL(12,3)) AS desconto,
        CAST(0 AS DECIMAL(12,3)) AS suprimentos,
        CAST(0 AS DECIMAL(12,2)) AS valor_venda_combustivel,
        CAST(0 AS DECIMAL(12,2)) AS valor_venda_produto,
        CAST(0 AS DECIMAL(12,2)) AS custo_combustivel,
        CAST(0 AS DECIMAL(12,2)) AS custo_produto,
        denominacao AS denominacao_despesa,
        valor_despesa AS valor_despesa,
        CAST(0 AS DECIMAL(12,2)) AS valor_receita,
        CAST(0 AS DECIMAL(12,2)) AS valor_retirada,
        CAST(0 AS DECIMAL(12,2)) AS valor_investimento,
        CAST(0 AS DECIMAL(12,3)) AS valor_variacao_estoque,
        denominacao_categoria AS denominacao_categoria,
        0 AS valor_receita_suprimento,
        0 AS aplicacoes_rendimentos,
        0 AS desconto_financeiros
    FROM  tmp_despesas
    
    UNION ALL
    
    SELECT  
        id_empresa,
        nome_empresa as empresa,
        'Variação Estoque' as classificacao_despesa_receita,
        '' as denominacao_item,
        0 AS qtde_abastecimento,
        0 AS litragem,
        0 as desconto,
        0 AS suprimentos,
        0 AS valor_venda_combustivel,
        0 AS valor_venda_produto,
        0 AS custo_combustivel,
        0 AS custo_produto,
        '' AS denominacao_despesa,
        0 AS valor_despesa,
        0 AS valor_receita,
        0 AS valor_retirada,
        0 AS valor_investimento,
        SUM(total_variacao_estoque) AS valor_variacao_estoque,
        tipo_produto AS denominacao_categoria,
        0 AS valor_receita_suprimento,
        0 AS aplicacoes_rendimentos,
        0 AS desconto_financeiros
    FROM variacao_estoque 
    GROUP BY id_empresa, nome_empresa,denominacao_categoria
  
),


RESULTADO AS (
    SELECT 
        empresa,
        'Operação Vendas' as classificacao_despesa_receita,
        CAST(1000 AS INTEGER) AS ordenacao,
        CAST('VENDAS / RECEITAS' AS TEXT) AS cabecalho,
        CAST('LITRAGEM / GALONAGEM' AS TEXT) AS sub_cabecalho,
        SUM(litragem) AS informacao_anual
    FROM  tmp_resumo_mensal_receitas_vendas 
    WHERE valor_venda_produto = 0 AND valor_venda_combustivel > 0 
    GROUP BY 1,2,3,4,5

    UNION ALL

    SELECT 
        empresa,
        'Operação Vendas' as classificacao_despesa_receita,
        CAST(1001 AS INTEGER) AS ordenacao,
        CAST('VENDAS / RECEITAS' AS TEXT) AS cabecalho,
        CAST('TOTAL VENDAS EM R$ ORIGINAL' AS TEXT) AS sub_cabecalho,
        SUM((valor_venda_combustivel + valor_venda_produto)) AS informacao_anual
    FROM  tmp_resumo_mensal_receitas_vendas 
    GROUP BY 1,2,3,4,5
    HAVING  SUM(valor_venda_combustivel + valor_venda_produto) != 0

    UNION ALL

    SELECT  
        empresa,
        'Operação Vendas' as classificacao_despesa_receita,
        CAST(1002 AS INTEGER) AS ordenacao,
        CAST('VENDAS / RECEITAS' AS TEXT) AS cabecalho,
        CAST('LUCRO BRUTO + DESCONTOS FORNECEDORES' AS TEXT) AS sub_cabecalho,
        SUM((valor_venda_combustivel + valor_venda_produto + desconto_financeiros) - (custo_combustivel + custo_produto)) AS informacao_anual
    FROM  tmp_resumo_mensal_receitas_vendas 
    GROUP BY 1,2,3,4,5
    HAVING  SUM((valor_venda_combustivel + valor_venda_produto + desconto_financeiros) - (custo_combustivel + custo_produto)) != 0

    UNION ALL

    -- INICIO -- DESCONTO E SUPRIMENTOS
    SELECT  
        empresa,
        'Operação Vendas' as classificacao_despesa_receita,
        CAST(1003 AS INTEGER) AS ordenacao,
        CAST('VENDAS / RECEITAS' AS TEXT) AS cabecalho,
        CAST('DESCONTOS A CLIENTES' AS TEXT) AS sub_cabecalho,
        SUM(desconto) AS informacao_anual
    FROM  tmp_resumo_mensal_receitas_vendas 
    GROUP BY 1,2,3,4,5

    UNION ALL

    SELECT  
        empresa,
        'Operação Vendas' as classificacao_despesa_receita,
        CAST(1004 AS INTEGER) AS ordenacao,
        CAST('VENDAS / RECEITAS' AS TEXT) AS cabecalho, -- RECEITAS
        denominacao_categoria AS sub_cabecalho,
        SUM(valor_receita) AS informacao_anual
    FROM  tmp_resumo_mensal_receitas_vendas 
    GROUP BY 1,2,3,4,5
    HAVING  SUM(valor_receita) != 0


    UNION ALL


    SELECT  
        empresa,
        'Operação Vendas' as classificacao_despesa_receita,
        CAST(1005 AS INTEGER) AS ordenacao,
        CAST('VENDAS / RECEITAS' AS TEXT) AS cabecalho,
        CAST('LUCRO BRUTO TOTAL' AS TEXT) AS sub_cabecalho,
        SUM((valor_venda_combustivel + valor_venda_produto + desconto_financeiros + valor_receita) - (custo_combustivel + custo_produto + desconto)) AS informacao_anual
    FROM  tmp_resumo_mensal_receitas_vendas 
    GROUP BY 1,2,3,4,5
    HAVING   SUM((valor_venda_combustivel + valor_venda_produto + desconto_financeiros + valor_receita) - (custo_combustivel + custo_produto + desconto)) != 0


    UNION ALL


    SELECT  
        empresa,
        '1.Operacional' AS classificacao_despesa_receita,
        CAST(2000 AS INTEGER) AS ordenacao,
        CAST('DESPESAS OPERACIONAL' AS TEXT) AS cabecalho,
        classificacao_despesa_receita AS sub_cabecalho,
        SUM(valor_despesa) AS informacao_anual
    FROM  tmp_resumo_mensal_despesas 
    WHERE valor_despesa > 0  AND classificacao_despesa_receita in ('1.Operacional', '1.x.Financeira')
    GROUP BY 1,2,3,4,5
    HAVING  SUM(valor_despesa) != 0

    UNION ALL


    -- INICIO LUCRO OPERACIONAL E LUCRO ANTES DA RECEITA

    SELECT  
        r.empresa,
        CAST('1.Operacional' AS TEXT) AS classificacao_despesa_receita,
        CAST(2001 AS INTEGER) AS ordenacao,
        CAST('RESULTADO OPERACIONAL' AS TEXT) AS cabecalho,
        'TOTAL - LUCRO OPERACIONAL' AS sub_cabecalho,
        SUM((r.valor_venda_combustivel + r.valor_venda_produto + r.desconto_financeiros + r.valor_receita) - (r.custo_combustivel + r.custo_produto + r.desconto + r.valor_despesa))  AS informacao_anual
    FROM  (
        SELECT * FROM tmp_resumo_mensal_receitas_vendas 
        UNION ALL
        SELECT * FROM tmp_resumo_mensal_despesas WHERE classificacao_despesa_receita in ('1.Operacional', '1.x.Financeira')
    )  as r
    
    GROUP BY 1,2,3,4,5
    HAVING  SUM((r.valor_venda_combustivel + r.valor_venda_produto + r.desconto_financeiros + r.valor_receita) - (r.custo_combustivel + r.custo_produto + r.desconto + r.valor_despesa)) != 0

    UNION ALL

     SELECT  
        empresa,
        'Nao Operacional' AS classificacao_despesa_receita,
        CAST(2002 AS INTEGER) AS ordenacao,
        CAST('DESPESAS NÃO OPERACIONAL' AS TEXT) AS cabecalho,
        denominacao_categoria AS sub_cabecalho,
        SUM(valor_despesa) AS informacao_anual
    FROM  tmp_resumo_mensal_despesas 
    WHERE valor_despesa > 0  AND classificacao_despesa_receita in ('3.Administrativa', '5.Investimentos', '6.Retiradas', '2.Não Operacional', 'Outras Classificação')
    GROUP BY 1,2,3,4,5
    HAVING  SUM(valor_despesa) != 0


    UNION ALL

    SELECT  
        r.empresa,
        CAST('Nao Operacional' AS TEXT) AS classificacao_despesa_receita,
        CAST(2003 AS INTEGER) AS ordenacao,
        CAST('DESPESAS NÃO OPERACIONAL' AS TEXT) AS cabecalho,
        'TOTAL - DESPESA NÃO OPERACIONAL' AS sub_cabecalho,
        SUM((r.valor_despesa))  AS informacao_anual
    FROM  (
        SELECT * FROM tmp_resumo_mensal_receitas_vendas 
        UNION ALL
        SELECT * FROM tmp_resumo_mensal_despesas WHERE classificacao_despesa_receita in ('3.Administrativa', '5.Investimentos', '6.Retiradas', '2.Não Operacional', 'Outras Classificação')
    )  as r
    GROUP BY 1,2,3,4,5
    HAVING SUM((r.valor_despesa)) != 0

    UNION ALL

    SELECT 
        empresa,
        'V.E.' AS classificacao_despesa_receita,
        CAST(3000 AS INTEGER) AS ordenacao,
        CAST('R.VARIAÇÃO' AS TEXT) AS cabecalho,
        denominacao_categoria AS sub_cabecalho,
        SUM(valor_variacao_estoque) AS informacao_anual
    FROM  tmp_resumo_mensal_despesas 
    GROUP BY 1,2,3,4,5
    HAVING  SUM(valor_variacao_estoque) != 0

    UNION ALL

    SELECT  
        r.empresa,
        CAST('TOTAL' AS TEXT) AS classificacao_despesa_receita,
        CAST(4000 AS INTEGER) AS ordenacao,
        CAST('TOTALIZAÇÃO' AS TEXT) AS cabecalho,
        CAST('LUCRO LIQUIDO' AS TEXT) AS sub_cabecalho,
        SUM((r.valor_venda_combustivel + r.valor_venda_produto + r.valor_receita + r.valor_variacao_estoque + r.desconto_financeiros) - (r.custo_combustivel + r.custo_produto + r.desconto + r.valor_despesa))  AS informacao_anual
    FROM  (
        SELECT * FROM tmp_resumo_mensal_receitas_vendas 
        UNION ALL
        SELECT * FROM tmp_resumo_mensal_despesas
    )  as r
    GROUP BY 1,2,3,4,5
    HAVING  SUM((r.valor_venda_combustivel + r.valor_venda_produto + r.valor_receita + r.valor_variacao_estoque + r.desconto_financeiros) - (r.custo_combustivel + r.custo_produto + r.desconto + r.valor_despesa))  != 0


    ORDER BY ordenacao, sub_cabecalho DESC
)

SELECT * FROM RESULTADO