Estou criando software de contabilidade. Preciso aplicar a contabilidade de dupla entrada. Eu tenho o problema clássico de uma linha por transação versus duas linhas.
Vamos dar um exemplo e ver como isso seria implementado nos dois cenários.
Considere conta Cash
e conta Rent
. Quando pago meu aluguel mensal, transfiro US $ 100 da minha Cash
conta para mim Rent
.
Uma linha por transação
Em um sistema de uma linha, essa transação seria armazenada como:
transações
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Duas linhas por transação
Em um sistema de duas linhas, eu teria que espelhar o mesmo registro de transação para criar um registro oposto que, ao somar os dois, obteria saldo zero.
transações
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | type | account | amount
1 | 1 | credit | Cash | 100.00
2 | 1 | debit | Rent | 100.00
O problema
Antes de mais, gostaria de observar: a razão pela qual tenho as tabelas transactions
e transaction_records
(em vez de uma tabela) é poder lidar com transações divididas (um caso em que transfiro US $ 100 da Cash
conta para duas ou mais contas diferentes).
No começo, tentei implementar isso com uma linha por transação, mas é difícil calcular o saldo da conta e recuperar os dados.
Estou inclinado para o segundo cenário; no entanto, também tem alguns problemas:
- Como atualizo um único registro? Supondo que cometi um erro e, em vez de gravar US $ 100 pelo meu aluguel, registrei US $ 10. Agora tenho 2
transaction_records
- um para crédito e outro para débito, ambos com valor de US $ 10. - Agora faço minha reconciliação e quero corrigir esse erro de digitação. Como eu consertaria isso no banco de dados? Não conheço a conexão entre registros e, no caso de uma divisão, uma transação pode ter mais de 2 registros. A única solução que encontrei é adicionar alguns
ref_id
para cada par de registros que os identificarão exclusivamente como sendo os "lados opostos um do outro" dentro de um contexto específicotx_id
.
Qual abordagem é melhor / mais simples?
Para simplificar minha pergunta: quero representar um movimento de fundos da conta A para a conta B. Os dois cenários que forneci são projetos válidos para armazenar essa transação. Como também apontei, os dois têm vantagens e desvantagens (primeiro: mais fácil de salvar, mais difícil de recuperar; segundo, o oposto).
Eles podem ter outros prós / contras que não vejo no momento, por isso peço uma opinião de pessoas mais experientes.