public static Map<Serie, LocalDate> getVencimentosPorPeriodo(LocalDate inicio, LocalDate fim) { Map<Serie, LocalDate> vencimentos = new HashMap<Serie, LocalDate>(); while (inicio.isBefore(fim)) { Serie serieAtual = getSerieAtualPorData(inicio); LocalDate vencimento = serieAtual.getDataVencimento(inicio); if (vencimento.isAfter(fim)) break; vencimentos.put(serieAtual, vencimento); inicio = inicio.plusMonths(1).withDayOfMonth(1); } return vencimentos; }
public LocalDate getDataVencimento(LocalDate hojeFicticio) { LocalDate terceiraSegundaFeira = getTerceiraSegundaFeiraDesteMes(hojeFicticio); Serie serieAtual = getSerieAtualPorData(hojeFicticio, terceiraSegundaFeira); if (this.ordinal() == serieAtual.ordinal()) { // se for a mesma Serie, o vencimento é a proxima 3a segunda if (hojeFicticio.isBefore(terceiraSegundaFeira) || hojeFicticio.equals(terceiraSegundaFeira)) return terceiraSegundaFeira; // a 3a segunda deste mes ja passou, vamos para a do proximo mes return getTerceiraSegundaFeiraDesteMes(hojeFicticio.plusMonths(1)); } else if (this.ordinal() == (serieAtual.ordinal() + 1) % 12) { // se for a próxima Serie, o vencimento é // a 3a segunda-feira do mes que vem, caso a // 3a segunda-feira deste mes ainda nao tenha // passado. Caso ja tenha passado, sera a 3a // segunda-feira daqui a 2 meses. int meses = (hojeFicticio.isAfter(terceiraSegundaFeira)) ? 2 : 1; return getTerceiraSegundaFeiraDesteMes(hojeFicticio.plusMonths(meses)); } throw new IllegalArgumentException( "Serie nao vencera no mes atual ou no proximo para a data " + hojeFicticio); }
public static Serie getProximaSeriePorData(LocalDate data) { Serie atual = getSerieAtualPorData(data); return values()[(atual.ordinal() + 1) % 12]; }