Package: MonatlicherSerientermin
MonatlicherSerientermin
| name | instruction | branch | complexity | line | method | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| MonatlicherSerientermin(KalenderEintrag) | 
  | 
  | 
  | 
  | 
  | 
||||||||||||||||||||
| berechneKalenderEintraegeZumTag(LocalDate) | 
  | 
  | 
  | 
  | 
  | 
||||||||||||||||||||
| create(KalenderEintrag) | 
  | 
  | 
  | 
  | 
  | 
||||||||||||||||||||
Coverage
1: package zeit.serientermin;
2: 
3: import zeit.ZeitUtils;
4: import zeit.eintraege.KalenderEintrag;
5: import zeit.eintraege.Zeitraum;
6: 
7: import java.time.LocalDate;
8: import java.time.LocalDateTime;
9: import java.time.LocalTime;
10: import java.util.Collection;
11: import java.util.Collections;
12: 
13: /**
14:  * Klasse die einen monatlichen Serientermin repräsentiert.
15:  * D.h. der entsprechende Kalendereintrag wiederholt sich immer am gleichen Tag des jeweiligen Monats.
16:  * z.B. Kalendereintrag 10.04.2018 10:00Uhr - 10.04.2018 12:00 Uhr
17:  * wiederholt sich zur gleichen Zeit am 10.05.2018, 10.06.2018 etc.
18:  */
19: public final class MonatlicherSerientermin extends SerienTermin {
20: 
21:     public static final int MINIMALE_ANZAHL_TAGE_PRO_MONAT = 28;
22: 
23:     private MonatlicherSerientermin(final KalenderEintrag eintrag) {
24:         super(eintrag);
25:     }
26: 
27:     /**
28:      * @param eintrag Kalendereintrag, welcher Serienmäßig wiederholt werden soll.
29:      * @return einen Serientermin, der sich jeden Monat am gleichen Tag bis ins Unendliche wiederholt.
30:      */
31:     public static MonatlicherSerientermin create(final KalenderEintrag eintrag) {
32:•        if (eintrag.getVon().getDayOfMonth() > MonatlicherSerientermin.MINIMALE_ANZAHL_TAGE_PRO_MONAT) {
33:             throw new MonatlicherSerienterminNachDem28Exception(
34:                     String.format("Ein monatlicher Serientermin am %s liegt nach dem 28 und ist nicht erlaubt",
35:                             eintrag.getVon().getDayOfMonth()));
36:         }
37:         return new MonatlicherSerientermin(eintrag);
38:     }
39: 
40:     @Override
41:     protected Collection<KalenderEintrag> berechneKalenderEintraegeZumTag(final LocalDate tag) {
42:         LocalDate laufendesDatum = this.getEintrag().getVon().toLocalDate();
43:•        while (laufendesDatum.isBefore(tag) || laufendesDatum.equals(tag)) {
44:             final Zeitraum zeitraum = Zeitraum.create(
45:                     LocalDateTime.of(laufendesDatum, LocalTime.of(this.getEintrag().getVon().getHour(), this.getEintrag().getVon().getMinute())),
46:                     this.getEintrag().getDauer());
47: 
48:•            if (this.zeitraumAmTag(zeitraum, tag)) {
49:                 return Collections.singleton(this.getEintrag().accept(new CreatePassendenKalenderEintragMitZeitraumVisitor(zeitraum)));
50:             }
51: 
52:             laufendesDatum = ZeitUtils.verschiebeDatumUmEinenMonat(laufendesDatum);
53:         }
54:         return Collections.emptySet();
55:     }
56: }