commit f134397da76af9b28043b6c0567f7c926ea9f8d9 Author: kasun Date: Sat Jun 13 01:40:31 2026 +0200 added insuranceSum calculation missing breed, age factors and yearly premium diff --git a/src/main/java/com/pfefferminzia/petinsurance/Main.java b/src/main/java/com/pfefferminzia/petinsurance/Main.java new file mode 100644 index 0000000..acee530 --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/Main.java @@ -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))); + + } +} diff --git a/src/main/java/com/pfefferminzia/petinsurance/animals/Animal.java b/src/main/java/com/pfefferminzia/petinsurance/animals/Animal.java new file mode 100644 index 0000000..0cecd2a --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/animals/Animal.java @@ -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(); +} diff --git a/src/main/java/com/pfefferminzia/petinsurance/animals/Cat.java b/src/main/java/com/pfefferminzia/petinsurance/animals/Cat.java new file mode 100644 index 0000000..921a439 --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/animals/Cat.java @@ -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); + } +} diff --git a/src/main/java/com/pfefferminzia/petinsurance/animals/Dog.java b/src/main/java/com/pfefferminzia/petinsurance/animals/Dog.java new file mode 100644 index 0000000..2ed94b6 --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/animals/Dog.java @@ -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); + } +} diff --git a/src/main/java/com/pfefferminzia/petinsurance/animals/SmallAnimal.java b/src/main/java/com/pfefferminzia/petinsurance/animals/SmallAnimal.java new file mode 100644 index 0000000..9e9fc89 --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/animals/SmallAnimal.java @@ -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); + } +} diff --git a/src/main/java/com/pfefferminzia/petinsurance/calculations/Calculations.java b/src/main/java/com/pfefferminzia/petinsurance/calculations/Calculations.java new file mode 100644 index 0000000..c83ba69 --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/calculations/Calculations.java @@ -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()); + } +} diff --git a/src/main/java/com/pfefferminzia/petinsurance/calculations/TariffValidator.java b/src/main/java/com/pfefferminzia/petinsurance/calculations/TariffValidator.java new file mode 100644 index 0000000..4fb3ac5 --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/calculations/TariffValidator.java @@ -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; + } +} diff --git a/src/main/java/com/pfefferminzia/petinsurance/exception/TariffNotAvailableException.java b/src/main/java/com/pfefferminzia/petinsurance/exception/TariffNotAvailableException.java new file mode 100644 index 0000000..f95f4b8 --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/exception/TariffNotAvailableException.java @@ -0,0 +1,8 @@ +package com.pfefferminzia.petinsurance.exception; + +public class TariffNotAvailableException extends RuntimeException { + + public TariffNotAvailableException(String message) { + super(message); + } +} diff --git a/src/main/java/com/pfefferminzia/petinsurance/tariffs/Tariff.java b/src/main/java/com/pfefferminzia/petinsurance/tariffs/Tariff.java new file mode 100644 index 0000000..2cc954b --- /dev/null +++ b/src/main/java/com/pfefferminzia/petinsurance/tariffs/Tariff.java @@ -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; + } +}