Analysis Pattern: Lançamento Diferencial (Difference Adjustment)

O que é

Detalhes de funcionamento

Quando deve ser usado

Código exemplo

public class Ajuste extends EventoContabil {
...
private List eventosNovos = new ArrayList();
private List eventosVelhos = new ArrayList();
public Ajuste(
Calendar quandoOcorreu,
Calendar quandoObservado,
Subject subject) {
super(null, quandoOcorreu, quandoObservado, subject);
}
public void addNovo(EventoContabil arg) {
eventosNovos.add(arg);
}
public void addVelho(EventoContabil arg) {
if (arg.jaFoiAjustado())
throw new IllegalArgumentException(
"Nao pode criar " + this +"." + arg + "ja esta ajustado");
eventosVelhos.add(arg);
arg.setEventoSubstituto(this);
}
}
class Testador {
...
//eventos originais
eventoDeConsumo =
new Consumo(
Unit.KWH.valor(50),
criaCalendar(2003, 10, 1),
criaCalendar(2003, 10, 15),
cam);
listaEventos.add(eventoDeConsumo);
Consumo consumo2 = new Consumo(...);
listaEventos.add(consumo2);
Consumo consumo3 = new Consumo(...);
listaEventos.add(consumo3);
listaEventos.processa();
//eventos substitutos
Calendar dataAjuste = criaCalendar(2004, 1, 12);
Consumo novo1 = new Consumo(...);
Consumo novo2 = new Consumo(...);
Consumo novo3 = new Consumo(...);
Ajuste ajuste = new Ajuste(dataAjuste, dataAjuste, cam);
ajuste.addVelho(eventoDeConsumo);
ajuste.addVelho(consumo2);
ajuste.addVelho(consumo3);
ajuste.addNovo(novo1);
ajuste.addNovo(novo2);
ajuste.addNovo(novo3);
listaEventos.add(ajuste);
listaEventos.processa();
}
class Ajuste {
...
private java.util.Map contasSalvas;
public void processa() {
assert(!foiProcessado); //Nao pode processar um evento duas vezes
ajustar();
marcaComoProcessado();
}
void ajustar() {
xerocaContas();
reverteEventosVelhos();
processaSubstitutos();
commit();
eventosSecundarios = new ArrayList();
eventosSecundarios.addAll(eventosVelhos);
}
public void xerocaContas() {
contasSalvas = getCliente().getContas();
getCliente().setContas(copyContas(contasSalvas));
}
void reverteEventosVelhos() {
Iterator it = eventosVelhos.iterator();
while (it.hasNext()) {
EventoContabil each = (EventoContabil) it.next();
each.reverse();
}
}
void processaSubstitutos() {
EventoContabil[] list =
(EventoContabil[]) eventosNovos.toArray(new EventoContabil[0]);
for (int i = 0; i < list.length; i++) {
list[i].processa();
}
}
public void commit() {
TipoConta[] tipos == TipoConta.tipos();
for (int i = 0; i < tipos.length; i++) {
ajustaConta(tipos[i]);
}
restauraConta();
}
public void ajustaConta(TipoConta tipo) {
Conta contaCorrigida = getCliente().contaPara(tipo);
Conta contaOriginal = (Conta) getContasSalvas().get(tipo);
Money diferenca =
contaCorrigida.saldo().subtract(contaOriginal.saldo());
Lancamento resultado = new Lancamento(diferenca, hoje());
contaOriginal.addLancamento(resultado);
lancamentoResultantes.add(resultado);
}
public void restauraConta() {
getCliente().setContas(contasSalvas);
}
}

programa