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
-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á