[Resolvido]Ajuda com código de saldo conta corrente

Olá pessoal, estou com uma dificuldade impar e não estou conseguindo solucionar!
la vai!

public void calculaSaldo() { List<Pagamento> novaLista = new ArrayList<Pagamento>(); this.setDataFechamento(DataUtil.getCalendar(DataUtil.getPrimeiroDiaMes())); if (!pagamentos.isEmpty()) { for (Pagamento pagamento : pagamentos) { if (DataUtil.compararData(DataUtil.getDateTime(pagamento.getData_lancamento()), DataUtil.getDateTime(dataFechamento)) != -1) { novaLista.add(pagamento); System.out.println("pagamentos " + pagamento.getHistorico() + " " + DataUtil.toString(pagamento.getData_lancamento()) + " " + pagamento.getValor()); } } saldo = novaLista.get(0).getSaldo(); for (Pagamento p : novaLista) { if (!p.getConta().isCredito()) { p.setSaldo(saldo.subtract(p.getValor())); } else { p.setSaldo(saldo.add(p.getValor())); } } } }

tenho esse codigo em conta corrente, minha conta corrente so guarda saldo, data fechamento e uma lista de pagamentos. cada pagamento tem seu valor e o saldo atualizado. o problema é como calcular o saldo sem que ele fique calculando toda hora que eu clique em recalcular e como fazer para que ele calcule em ordem por data!

aguardo resposta

abraço

bom, vc pode fazer o seguinte:

1 - cria uma classe Pagamentos que vai ter uma lista de pagamentos.
2 - quando for adicionado um pagamento ai vc já soma

algo parecido com isto, mas vc pode melhorar

class Pagamentos{
       private BigDecimal total = new BigDecimal(0);
       private List<pagamento> lista = new ArrayList();

       public void addPagamento(Pagamento pagamento){
                  total.add(pagamento.getValor());
                  lista.add(pagamento);
       }

}

vc pode melhorar o código, mas seria uma boa dica;

Opa, entao…pensei nessa hipotese, mas na minha classe pagamento eu tenho que ter o saldo tmb atualizado.

Eu devo ao adicionar ou apagar um pagamento atualizar o saldo total e o saldo linear. vou postar aqui a minha estrutura da tabela. mais ou menos assim.

data valor saldo
01/10 10,00 10,00
02/10 -20,00 -10,00

entao se eu apagar o 20 devo atualizar os saldos pra frente, entende?

como poderia solucionar essa questao?

Porque você precisa ter o saldo atualizado em Pagamento ??? O máximo que podes fazer é ter o saldo pós-pagamento, mas fixo…

Você precisa verificar o Saldo atualizado, mas esse saldo atualizado não precisa estar em Pagamento…

Abs []

[quote=thiagocifani]Eu devo ao adicionar ou apagar um pagamento atualizar o saldo total e o saldo linear. vou postar aqui a minha estrutura da tabela. mais ou menos assim.

data valor saldo
01/10 10,00 10,00
02/10 -20,00 -10,00

entao se eu apagar o 20 devo atualizar os saldos pra frente, entende?

como poderia solucionar essa questao?[/quote]

Cara, podes criar uma tabela só pra conter o saldo atual… não sei se isso é válido, mas foi o que pensei aqui… e outra, você não apaga um Pagamento, Pagamento é Pagamento, o máximo que podes fazer é extornar, mas aí coloca um Status nesse cara pra dizer que ele foi extornado, devolve o valor e atualiza na tabela saldo_conta o campo único valor_saldo…

Abs []

[EDIT] - cara, foi mal… Não lembravas que estavas usando só classes, sem um BD… Sendo assim, podes criar uma nova Classe chamada SaldoConta, que vai ter uma conta e o valor a priori… sendo que essa conta é um Objeto do tipo ContaCorrente…

Abraços []

mais ou menos isso aqui que eu preciso!

ideias?

Queres um extrato de contas então… tem mais coisas que precisas pra ter um esquema igual a esse… tens que trabalhar con Ns entidades…

Cada um desse que está listado aí é um Pagamento… é isso ?? De onde vem essa Conta ?? é de onde é retirado o fundo ?? Essa descrição é inputada ou é a descrição fixa da Conta ?? Precisa gerar esse Número de Documento ??

Nussa tem muitas outras questões que precisas implementar cara…

Entao, eu tenho minha classe conta, minha classe pagamento, e minha classe conta corrente. Conta corrente tem uma lista de pagamentos e o saldo geral. Cada pagamento tem uma conta(credito ou debito) e o valor data lancamento e saldo corrente. As contas sao tipos de despesa/receita, mas o cliente acostumou com essa terminologia.

tenho essas entidades:

contaCorrente
Conta
Pagamento

no aguardo

Sempre que realizares um Pàgamento, vais referenciar uma Conta… O teu saldo atual deve estar na Conta então… Confere ??

Ao realizar o pagamento, vai lá e verifica se a conta possui Saldo para realizar aquele pagamento, se sim, efetua o pagamento, subtraindo esse valor do saldo atual… o valor que sobrar, guarda em um outro atributo da classe Pagamento chamado saldoAtualPrint, que nada mais é do que o Novo Saldo no momento em que o Pagamento foi realizado, na hora de listar, basta exibir esse cara… lembra que teu saldo atual não é variável… Ele é 1 só, já os saldos do momento do pagamento, esses sim, são guardados em históricos…

Bom, isso to me baseando do que entendi do teu problema, se não for isso, posta aí de novo…

[EDIT] - Me explicando melhor porque não eu ia entender o que eu quis dizer… rsrsrsrs

Tens na entidade ContaCorrente, um campo chamado saldoAtual. Esse cara será recalculado só uma vez, sempre que efetuares um pagamento, ou extornares um pagamento… Efetuou um pagamento ?? 2 coisas devem acontecer

1 - Subtrai o valor do Pagamento do Saldo atual (saldoAtual = saldoAtual - valorPagamento);

2 - Guarda esse novo valor em um campo de Pagamento chamado saldoAtualPrint [nome sugestivo];

Extornou um pagamento ?? Igual o anterior, só que ao invés de subtrair, vais somar é claro…

Lembra… teu saldo atual é único, ele não é calculado em nenhum outro momento.

Na hora de listar teus pagamentos, vai ficar simples, vais ter somente que exibir teu saldoAtualPrint da entidade Pagamento.

Acho que ficou mais simples 8)

certo! mas me diz uma coisa…cada pagamento tem uma data!

se eu tenho

                             valor        saldo

pagamento 1 - 10/10 R$ 10,00 R$ 10,00
pagamento 2 - 11/10 R$ 50,00 R$ 60,00
pagamento 3 - 09/10 R$ -10,00 R$ 50,00

se eu ordenar as datas e precisar atualizar o saldo print! essa eh minha dificuldade!

eu tenho os fechamentos dos caixas, o que é isso: Uma data que eu digo que fechei o caixa. Se o caixa foi fechado dia 01/10

no meu for ou while eu pegaria todos os pagamentos do dia 1 pra frente!

ai esta minha duvida, posso pegar o primeiro lançamento com data do dia 1, mas podem ser varios :S como saber se é o primeiro
e depois ordenado como eu vou, se apagar um pagamento atulizar o saldo de todos os pagamentos posteriores?

essa tela eh em delphi e funfa 100 porcento . mas nao entendi o codigo do cara =/

abraço

Resolvi isso criando dois comparadores, um para codigo e outro para data do pagamento. e fiz um for pra reorganizar os pagamentos independente da ordem que eles foram adicionados, ou seja, posso adicionar hoje um pagamento de 1 mes atrás que ele vai ordenar e somar na posição correta, pegando sempre a data do ultimo fechamento do caixa como referencia!

segue o codigo:


for (Pagamento pagamento : pagamentos) {
        }
        ComparadorPagamentoCodigo comCod = new ComparadorPagamentoCodigo();

        Collections.sort(pagamentos, comCod);

        ComparatorPagamento comparator = new ComparatorPagamento();

        Collections.sort(pagamentos, comparator); }

for (int i = 0; i < pagamentos.size(); i++) {
            if (i != 0) {
                Pagamento p1 = pagamentos.get(i);
                if (p1.getConta().isCredito()) {
                    p1.setSaldo(pagamentos.get(i - 1).getSaldo().add(pagamentos.get(i).getValor()));
                } else {
                    p1.setSaldo(pagamentos.get(i - 1).getSaldo().subtract(pagamentos.get(i).getValor()));
                }
            }

[code]public class ComparadorPagamentoCodigo implements Comparator {

public int compare(Pagamento p1, Pagamento p2) {
    return p1.getCodigo() > p2.getCodigo() ? 1 : 0; 
}

}[/code]

[code]public class ComparatorPagamento implements Comparator {

public int compare(Pagamento p1, Pagamento p2)
{
    return p1.getDataPagamento().compareTo(p2.getDataPagamento()); 
}

}[/code]