Ir para conteúdo
Fórum Script Brasil
  • 0

Fluxo de Caixa com Valor Mínimo


Carlos Moretto

Pergunta

Fala galera!

Estou com um desafio a algum tempo e ainda não encontrei uma solução que funcione. 

Fiz um select para gerar um fluxo de caixa projetado com base em data, saldo inicial, despesas e receitas. A parte de alto soma para fazer o saldo já está concluída, fiz com CTE. 

O objetivo do relatório de fluxo de caixa e projetar quanto vou precisar aportar (entrada de dinheiro no fluxo) em um determinado dia. A entrada seria para o caixa nunca ficar negativo ou ter um valor mínimo (valor parametrizado). A ideia é que seja possível visualizar o valor exato do aporte necessário diariamente. Exemplo

image.png.2f5bcfc5a2c4aadb669d2f6a47370cf4.png

-Na parte verde são as informações que já consegui trazer com o SELECT

-Na parte azul é o que preciso calcular. Observando o dia 21/9/2023 se nota que o valor necessário para manter o caixa zerado (mínimo) é de 22.951,42 e não de 25.000 (conforme o resultado do dia), sendo assim não é simplesmente olhar se o resultado for negativo e apresentar o valor exato.

Segue o SELECT usado:

with empresa_centro as ({{#4484}}), 
saldo_inicial as (
    select
        sum(financial_transactions.amount) as saldo_inicial_contas
    from financial_transactions
        join deposit_accounts on (deposit_accounts.id=financial_transactions.deposit_account_id and financial_transactions.parent_id is null)
        join entities on (entities.id= deposit_accounts.entity_id)
    where occurred_at <= current_date-1 [[ and {{filtro_empresa}} ]]
),
transacoes as (
select
    financial_accounts.due_date as data_vencimento,
    sum(case when financial_accounts.type = 'ReceivableAccount' then financial_accounts.amount else 0 end) as receita,
    sum(case when financial_accounts.type <> 'ReceivableAccount' then -financial_accounts.amount else 0 end) as despesa,
    sum(case when financial_accounts.type = 'ReceivableAccount' then financial_accounts.amount else -financial_accounts.amount end) as resultado
from financial_accounts
    inner join entities on (entities.id=financial_accounts.entity_id)
    inner join empresa_centro on (empresa_centro.empresa_id=entities.id)
 where true
    and {{filtro_empresa}}
    and (case when financial_accounts.type = 'ReceivableAccount' then financial_accounts.sale_account_id is not null else true end)
    and financial_accounts.due_date between current_date and (date_trunc('month', current_date) + interval '1 month') - interval '1 day'
group by financial_accounts.due_date)

select 
    transacoes.data_vencimento,
    transacoes.receita,
    transacoes.despesa,
    transacoes.resultado,
    (CASE WHEN ROW_NUMBER() OVER (ORDER BY transacoes.data_vencimento asc) = 1 THEN (select saldo_inicial_contas from saldo_inicial) ELSE null END) as saldo_inicial,
    (select saldo_inicial_contas from saldo_inicial) + sum(transacoes.resultado) over (order by transacoes.data_vencimento asc) as saldo_acumulado
from transacoes
order by transacoes.data_vencimento asc

 

Estou usando o metabase para isso e não é possível usar variáveis, function, procedures e triggers. O que é uma pena. Tenho apenas usuário de leitura no banco é isso não vai mudar conforme o compliance do meu cliente. Alguém consegue me dar uma luz? 

Agradeço desde já

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Veja que no dia 20 o resultado do acumulado é o resultado do acumulado do dia anterior, somando a receita atual menos a despesa atual. O resultado negativo de 19642,42 deveria ter um aporte mínimo de valor correspondente, como não foi aportado o novo saldo ficou negativo influenciando a movimentação do dia seguinte. Isso gerou a diferença. O seu código está correto. A movimentação é que precisa ser auditada.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...