1

Como modelar lançamentos fixos e parcelados em um app de finanças pessoais?

Estou construindo um app de finanças pessoais do zero — back em Node com PostgreSQL, front em Nuxt. O projeto já tem cadastro de contas, categorias, lançamentos e transferências funcionando. Agora preciso implementar o que considero a feature mais importante pra mim como usuário: lançamentos fixos e parcelados.

Sabe aquela conta de internet que vence todo mês, ou aquela compra que você parcelou em 10x? É exatamente isso.

Depois de pesquisar bastante, cheguei nessa modelagem:

Uma tabela recurrences que guarda a regra da recorrência — tipo (fixo ou parcelado), frequência, total de parcelas quando aplicável, e se ainda está ativa. A tabela de movimentações existente ganharia apenas uma FK recurrence_id, nula pra lançamentos avulsos.

Alguém já passou por isso, poderia me ajudar?

Carregando publicação patrocinada...
1

Você precisa separar o que é recorrente e o que é parcelado, tentar tratar como uma coisa do mesmo tipo vai fazer você ficar criando vários "ifs" para fazer os fluxos funcionarem.

Pagamento parcelado
No pagamento parcelado você pode criar uma entidade que representa essa compra, e uma lista de parcelas, cada uma com um vencimento para um mês diferente.

A entidade compra é importante, pois caso o usuário cancele o registro você pode percorrer a lista de parcelas e cancelá-las também, ou até mesmo fazer um cálculo da porcentagem paga daquela compra no decorrer do tempo.

Pagamento recorrente
Aqui você ainda tem dois tipos de pagamento recorrente: valor fixo como internet, streamings etc, e valor variável como água, luz, gás...

Para o valor fixo é fácil, você cria uma entidade que representa esse pagamento com o dia do mês que ele deve ser pago, assim sempre que for exibir os pagamentos do mês, o registro vai estar lá no dia específico, mas sem ter o lançamento registrado de fato, apenas quando o usuário confirmar o pagamento.

Sobre o de valor variável, você pode usar a mesma estrutura e apresentar um valor médio ou um valor aproximado com base no último lançamento. Na hora que o usuário confirmar o pagamento você solicita o valor pago.