added insuranceSum calculation missing breed, age factors and yearly premium

This commit is contained in:
2026-06-13 01:40:31 +02:00
commit f134397da7
9 changed files with 126 additions and 0 deletions
@@ -0,0 +1,15 @@
package com.pfefferminzia.petinsurance;
import java.time.LocalDate;
import com.pfefferminzia.petinsurance.animals.Dog;
import com.pfefferminzia.petinsurance.calculations.Calculations;
import com.pfefferminzia.petinsurance.tariffs.Tariff;
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(LocalDate.of(2020, 4, 14), "Husky");
Calculations calc = new Calculations();
System.out.println(calc.calculateInsuranceSum(dog, Tariff.OPTIMAL, LocalDate.of(2026, 1, 2)));
}
}
@@ -0,0 +1,10 @@
package com.pfefferminzia.petinsurance.animals;
import java.math.BigDecimal;
import java.time.LocalDate;
public sealed interface Animal permits Dog, Cat, SmallAnimal {
LocalDate birthday();
BigDecimal getBaseInsuranceSum();
}
@@ -0,0 +1,12 @@
package com.pfefferminzia.petinsurance.animals;
import java.math.BigDecimal;
import java.time.LocalDate;
public final record Cat(LocalDate birthday) implements Animal {
@Override
public BigDecimal getBaseInsuranceSum() {
return BigDecimal.valueOf(2000.0);
}
}
@@ -0,0 +1,12 @@
package com.pfefferminzia.petinsurance.animals;
import java.math.BigDecimal;
import java.time.LocalDate;
public final record Dog(LocalDate birthday, String breed) implements Animal {
@Override
public BigDecimal getBaseInsuranceSum() {
return BigDecimal.valueOf(2500.0);
}
}
@@ -0,0 +1,12 @@
package com.pfefferminzia.petinsurance.animals;
import java.math.BigDecimal;
import java.time.LocalDate;
public final record SmallAnimal(LocalDate birthday) implements Animal {
@Override
public BigDecimal getBaseInsuranceSum() {
return BigDecimal.valueOf(1000.0);
}
}
@@ -0,0 +1,19 @@
package com.pfefferminzia.petinsurance.calculations;
import java.math.BigDecimal;
import java.time.LocalDate;
import com.pfefferminzia.petinsurance.animals.Animal;
import com.pfefferminzia.petinsurance.tariffs.Tariff;
public class Calculations {
public BigDecimal calculateInsuranceSum(Animal animal, Tariff tariff,
LocalDate insuranceStartDate) {
TariffValidator validator = new TariffValidator(insuranceStartDate);
validator.checkTariffAvailability(tariff);
BigDecimal insuranceBaseSum = animal.getBaseInsuranceSum();
return insuranceBaseSum.multiply(tariff.getRate());
}
}
@@ -0,0 +1,21 @@
package com.pfefferminzia.petinsurance.calculations;
import java.time.LocalDate;
import com.pfefferminzia.petinsurance.exception.TariffNotAvailableException;
import com.pfefferminzia.petinsurance.tariffs.Tariff;
public class TariffValidator {
private LocalDate insuranceStartDate;
public TariffValidator(LocalDate insuranceStartDate) {
this.insuranceStartDate = insuranceStartDate;
}
public boolean checkTariffAvailability(Tariff tariff) {
if (insuranceStartDate.isBefore(LocalDate.of(2026, 7, 1)) && tariff == Tariff.PREMIUM) {
throw new TariffNotAvailableException(
"Die Premium Tarifvariante ist nicht vor dem 1. Juli 2026 verfügbar.");
}
return true;
}
}
@@ -0,0 +1,8 @@
package com.pfefferminzia.petinsurance.exception;
public class TariffNotAvailableException extends RuntimeException {
public TariffNotAvailableException(String message) {
super(message);
}
}
@@ -0,0 +1,17 @@
package com.pfefferminzia.petinsurance.tariffs;
import java.math.BigDecimal;
public enum Tariff {
KOMPAKT(BigDecimal.ONE), OPTIMAL(BigDecimal.valueOf(1.2)), PREMIUM(BigDecimal.valueOf(1.4));
private final BigDecimal rate;
private Tariff(BigDecimal rate) {
this.rate = rate;
}
public BigDecimal getRate() {
return rate;
}
}