Analysis Pattern: Estorno (Reversal Adjustment)

O que é

Detalhes de funcionamento

Quando deve ser usado

Código exemplo

class Testador {
...
public void setUp() {
configClienteNormal();
configClienteBaixaRenda();
eventoConsumo =
new Consumo(
Unit.KWH.valor(50),
criaCalendar(2003, 10, 1),
criaCalendar(2003, 10, 1),
cam);
listaLancamentos.add(eventoConsumo);
listaLancamentos.processa();
}
public void testAjuste() {
Consumo ajuste1 =
new Consumo(
Unit.KWH.valor(70),
criaCalendar(2003, 10, 1),
criaCalendar(2003, 10, 15),
eventoConsumo);
listaLancamentos.add(ajuste1);
listaLancamentos.processa();
assertEquals(
Money.reais(700),
cam.saldoDe(TipoLancamento.CONSUMO_BASICO));
assertEquals(Money.reais(38.5), cam.saldoDe(TipoLancamento.IMPOSTO));
}
}
class EventoContabil {
...
private EventoContabil eventoAjustado, eventoDeSubstituicao;
EventoContabil(
TipoEvento tipo,
Calendar quandoOcorreu,
Calendar quandoObservado,
EventoContabil eventoAjustado) {
if (eventoAjustado.foiAjustado())
throw new IllegalArgumentException(
"O " + eventoAjustado + " ja foi ajustado ");
this.tipo = tipo;
this.quandoOcorreu = quandoOcorreu;
this.quandoObservado = quandoObservado;
this.eventoAjustado = eventoAjustado;
eventoAjustado.eventoDeSubstituicao = this;
}
protected boolean foiAjustado() {
return (eventoDeSubstituicao != null);
}
}
class EventoContabil {
...
public void processa() {
assert(!foiProcessado); //Nao pode processar um evento duas vezes
if (eventoAjustado != null)
eventoAjustado.reverte();
achaRegra().processa(this);
foiProcessado = true;
}
void reverte() {
Collection lancamentos = new HashSet(getLancamentosResultantes());
Iterator it = lancamentos.iterator();
while (it.hasNext()) {
Lancamento umLancamento = (Lancamento) it.next();
Lancamento lancamentoParaReverter =
new Lancamento(
umLancamento.getValor().inverte(),
quandoObservado,
umLancamento.getTipo());
getCliente().addLancamento(lancamentoParaReverter);
this.addLancamentoResultante(lancamentoParaReverter);
}
reverteEventosSecundarios();
}
private void reverteEventosSecundarios() {
Iterator it = getEventosSecundarios().iterator();
while (it.hasNext()) {
EventoContabil umEvento = (EventoContabil) it.next();
umEvento.reverte();
}
}
}

programa