Analysis Pattern: Lançamento (Accounting Entry)
O que é
- Um lançamento é uma alocação de uma quantidade
de dinheiro para alguma finalidade

- Exemplo 1:
- Saco R$100,00 da minha conta corrente na terça-feira. Isso seria
representado por um lançamento com valor R$100,00, data terça-feira,
e com descritor igual à minha conta corrente
- Exemplo 2:
- Uma empresa contratada gasta R$300,00 em suprimentos elétricos
para trabalhar na minha casa no sábado. Isso seria representado
por um lançamento com data sábado, valor R$300,00 e com
descritores:
- O projeto de reforma de minha casa; e
- A categoria de custos de material elétrico
- Exemplo 3:
- Dez barris de chopp Antártica são entegues ao bar Big
Mix. Isso seria representado por um lançamento com valor 10, e
com descritores:
- Chopp Antártica; e
- Big Mix
- Sistemas contábeis lidam com dinheiro, sua classificação
e seus fluxos: de onde vem, para que é usado, etc.
Detalhes de funcionamento
- Lançamentos são normalmente registrados em Contas
(ver adiante)
- Por enquanto, pense numa conta como um possível descritor para um
lançamento
- Freqüentemente, Eventos e Lançamentos são relacionados
- Faz sentido perguntar quais datas de Evento são importantes
- Faz sentido também perguntar se lançamentos devem ser
imutáveis
- Às vezes são imutáveis;
- Às vezes, lançamentos podem ser alterados quando ainda
estão no estado "aberto"
- Outras regras podem se aplicar às alterações
possíveis
- No design (isto é, o modelo de software), cada descritor será
uma classe diferente associada ao lançamento
- No exemplo 2, acima, podemos ter um descritor Projeto e outro CategoriaDeCusto
Quando deve ser usado
- Lançamentos devem ser usados quando você precisa registrar
alterações a uma quantidade numérica
- A quantidade é freqüentemente dinheiro, mas pode ser outra
coisa
Código exemplo
- Na sua forma mais simples, Lançamento só armazena dados (não
tem comportamento)
interface Lancamento {
Lancamento novoLancamento(CategoriaCusto catCusto, Projeto projeto, Money valor, Calendar data);
categoriaCusto getCategoriaCusto();
Projeto getProjeto();
Money getValor();
Calendar getDataLancamento();
}
- Lançamentos podem, às vezes, ser imutáveis, pelo menos
após fechar o lançamento. Veja abaixo:
void setCategoriaCusto (CategoriaCusto cat){
if (isAberto()) {
categoriaCusto = cat;
} else {
throw new LancamentoImutavelException();
}
}
Ligação com Eventos
-
Se você usar os padrões Evento e Lançamento, então
será freqüente relacionar os dois
-
Isso é feito para implementar um "audit trail" para que
se possa perguntar: "Por que esse lançamento foi feito?"
- Saberemos que lançamentos foram feitos devido a cada evento
- Veremos à frente que esses relacionamentos serão importantes
também para o padrão Estorno
Podemos agora passar para a próxima entidade importante: a Regra
de Lançamento ...
programa