Problema de paginação de contabilidade de entrada dupla
Existe um problema muito sério nos sistemas de contabilidade de dupla entrada com paginação, acho que é comum, mas ainda não encontrei nenhuma solução para o meu problema.
Você pode usar este link para ler sobre osistemas simples de contabilidade de dupla entrada assim como o que eu fiz comLaravel eAngularJS.
Neste sistema, o resultado esperado (por exemplo) é algo como isto:
ID In Out Balance
1 100.00 0.00 100.00
2 10.00 0.00 110.00
3 0.00 70.00 40.00
4 5.00 0.00 45.00
5 0.00 60.00 -15.00
6 20.00 0.00 5.00
É muito fácil rastrear o saldo dentro de uma função cumulativa, se você estava mostrando todas as transações em uma página, o saldo da última transação é o saldo atual no final do dia.
Por exemplo, para um intervalo específico de datas$fromDate
->$toDate
, gostamos de:
$balanceYesterday = DB::table('journal')->where('date', '<', $fromDate)
->join('transactions','transactions.journal_id','journal.id')->where('transactions.type', "=", 0) /* 0 means the account of the company */
->select(DB::raw('SUM(amount) as total_balance'))
->first()->total_balance;
Agora temos saldo de ontem, dependemos dele para calcular o saldo depois disso em um loop cumulativo até o final do processo, atingindo$toDate
;
$currentBalance = $currentBalance + $currentTransaction->amount;
$currentTransactionBalance = $currentBalance;
Agora, o verdadeiro problema começa quando você tem uma grande quantidade de transações e precisa paginá-las$journal = $journal->paginate(100);
, digamos 100 transações por página, o sistema funcionará conforme o esperado para a primeira página, pois já podemos calcular o$balanceYesterday
e depende dele para calcular o novo saldo após cada transação até o final das 100 transações na primeira página.
A próxima página terá o problema que ele não sabe qual foi o último saldo da transação anterior na primeira página e, portanto, começará novamente a partir de$balanceYesterday
, fazendo com que a tabela inteira tenha cálculos incorretos.
O que fiz primeiro para corrigir foi transferir a última transaçãoamount
(no front-end) para a página seguinte como parâmetro e use-o como valor inicial para calcular novamente, e essa foi a melhor solução que eu tinha, pois estava usando apenas<< ANTERIOR ePRÓXIMO >> botões, por isso foi muito fácil corrigi-lo assim.
Ultimamente, descobri que essa solução alternativa não funcionará se eu tiver uma paginação com números de página, como o usuário gostaria de percorrer páginas para explorar o diário, agora é impossível saber o último saldo em uma página específica e o O sistema mostrará cálculos incorretos.
O que estou tentando fazer está encontrando uma maneira decalcular o saldo em uma transação específica, caso tenha sido um crédito ou débito, estou procurando uma maneira de saber quanto foi o saldo após uma transação específica ser feita em uma data específica, NÃO QUERO ADICIONAR UMA NOVA COLUNA DE SALDO E SALVAR O SALDO DENTRO ELE, O USUÁRIO ESTÁ FAZENDO MUITAS MODIFICAÇÕES E EDITA AS TRANSAÇÕES DE tempos em tempos, e isso quebrará tudo, pois uma pequena modificação de quantidade afetará todos os saldos depois dela, NÃO POSSO depender dos IDs das transações em nenhum método, porque as transações pode ter datas aleatórias diferentes, portanto, não haverá pedido por ID, mas poderá haver pedidos por outros campos, como data ou proprietário da conta ou tipo ou qualquer outra coisa.
Venho coçando a cabeça há cerca de 4 meses, pesquisei on-line e não encontrei soluções. Espero que, depois dessa longa explicação, meu problema esteja claro e que alguém possa me ajudar com uma solução, por favor ..
Obrigado.