Analysis Pattern: Conta (Account)
O que é
- Junta lançamentos contábeis relacionados e provê dados
de sumário

- Contas surgem com freqüência em sistemas financeiros
- Contas bancárias
- Contas para custos de um projeto
- Plano de contas de uma empresa
- etc.
- Podemos pensar sobre contas de várias formas
- Uma conta é um repositório de lançamentos
- Ao criar um lançamento, ele é colocado numa conta
- A conta provê informação sumarizada, tal como
um saldo
- Uma conta mantém o histórico de algum valor numérico
- Você não quer saber apenas o valor atual mas o valor
em qualquer momento do passado
- Você quer saber de todas as mudanças que ocorreram
ao valor
- Uma conta é uma forma de fatorar os elementos de um lançamento
- É um nível de indireção entre um lançamento
e seus descritores

- Contas nem sempre tratam de dinheiro
- Pense, por exemplo, num controle de estoque
- Cada tipo de material sendo estocado corresponde a uma conta
Detalhes de funcionamento
- Há dois aspectos importantes de contas:
- Guardar uma coleção de lançamentos
- Prover informação de sumário sobre os lançamentos
- Devido à grande quantidade de lançamentos, deve-se freqüentemente
otimizar a forma de calcular a informação de sumário
- Exemplo, para calcular o saldo, pode-se guardar o saldo atual e "andar
para trás" nos lançamentos para obter saldos de datas
passadas
- Depois de um certo tempo, pode ser necessário remover lançamentos
muito antigos e substitui-los por lançamentos fictícios agregados
para diminuir o número total de lançamentos
- Claro que, desta forma, perde-se a possibilidade de obter detalhes sobre
os períodos de tempo envolvidos
Quando deve ser usado
- Use o padrão "Conta" quando precisa de uma visão
histórica de mudanças a um valor
- Se precisar apenas de saldos históricos e não das mudanças,
pode-se usar o padrão "Temporal Property"
- Use o padrão "Conta" se estiver usando o padrão
"Lançamento" e precisar de uma forma de juntar lançamento
relacionados por descritores comuns
- No fim das contas (trocadilho ...), se o Domain Expert envolvido no projeto
usar a noção de Conta, é provável que o padrão
Conta seja útil
Código exemplo
- A lógica de implementação é simples
class Conta {
...
private Collection lancamentos = new HashSet();
private Moeda moeda;
void addLancamento(Money valor, Calendar date) {
assert(moeda.equals(valor.Moeda()));
lancamentos.add(new Lancamento(valor, data));
}
Money saldo(FaixaData periodo) {
Money resultado = new Money(0, moeda);
Iterator it = lancamentos.iterator();
while (it.hasNext()) {
Lancamento umLancamento = (Lancamento) it.next();
if (periodo.includes(umLancamento.data()))
resultado = resultado.add(umLancamento.valor());
}
return resultado;
}
Money saldo(Calendar data) {
return saldo(FaixaData.ate(data));
}
Money saldo() {
return saldo(hoje());
}
Money depositos(FaixaData periodo) {
Money resultado = new Money(0, moeda);
Iterator it = lancamentos.iterator();
while (it.hasNext()) {
Lancamento umLancamento = (Lancamento) it.next();
if (periodo.includes(umLancamento.data())
&& umLancamento.valor().isPositivo())
resultado = resultado.add(umLancamento.valor());
}
return resultado;
}
Money saques(FaixaData periodo) {
Money resultado = new Money(0, moeda);
Iterator it = lancamentos.iterator();
while (it.hasNext()) {
Lancamento umLancamento = (Lancamento) it.next();
if (periodo.includes(umLancamento.data())
&& umLancamento.valor().isNegativo())
resultado = resultado.add(umLancamento.valor());
}
return resultado;
}
}
Hierarquia de contas
- Empresas criam "planos de contas" em que contas são agrupadas
em contas de mais alto nível
- Isso ajuda o pessoal financeiro a ter melhor visão da situação
- Exemplo:
- Uma superconta "Despesas" pode ter várias subcontas
para diversos tipos de despesas, e assim recursivamente
- Um plano de contas completo pode ter centenas de contas
- Geralmente, lançamentos só são feitos em contas-folha
- Contas de mais alto nível "herdam" os lançamentos
dos filhos de forma que uma conta não-folha pode ser tratada como uma
conta normal, com sumários, saldo, etc.
- Só não há geralmente lançamento feito diretamente
em tais contas
programa