diff --git a/.gitea/workflows/build-deploy.yaml b/.gitea/workflows/build-deploy.yaml
new file mode 100644
index 0000000..88fb74e
--- /dev/null
+++ b/.gitea/workflows/build-deploy.yaml
@@ -0,0 +1,16 @@
+name: Productdefinitions Build & Deploy
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ deploy:
+ runs-on: self-hosted
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v3
+
+ - name: Build and Run
+ run: |
+ docker compose up -d --build
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..9b7b6bd
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,19 @@
+FROM maven:3.9-eclipse-temurin-21 AS build
+WORKDIR /productdefinitions
+
+RUN git clone -b feature/Produkte --single-branch https://bitbucket.org/omds/omdsservicedefinitions.git /tmp/lib \
+ && cd /tmp/lib/OMDSServiceDefinition \
+ && mvn clean install -DskipTests
+
+COPY . .
+
+RUN mvn clean package -DskipTests
+
+FROM eclipse-temurin:21-jre-alpine
+WORKDIR /productdefinitions
+COPY --from=build /productdefinitions/target/*.jar productdefinitions.jar
+
+EXPOSE 8080
+ENTRYPOINT ["java", "-jar", "productdefinitions.jar"]
+
+
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..3a01bea
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,9 @@
+services:
+ productdefinitions-service:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: productdefinitions_container
+ ports:
+ - "8080:8080"
+ restart: always
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index bdebaf5..0666f87 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
productdefinitions
0.0.1-SNAPSHOT
- war
+ jar
productdefinitions
productdefinitions
@@ -31,6 +31,12 @@
at.vvo.omds
OMDSServiceDefinition
${omds.version}
+
+
+ org.springframework.boot
+ spring-boot-restclient
+
+
diff --git a/src/main/java/com/kapdion/omds/productdefinitions/EndpointsZentralesBOA.java b/src/main/java/com/kapdion/omds/productdefinitions/EndpointsZentralesBOA.java
index e4436d8..9991441 100644
--- a/src/main/java/com/kapdion/omds/productdefinitions/EndpointsZentralesBOA.java
+++ b/src/main/java/com/kapdion/omds/productdefinitions/EndpointsZentralesBOA.java
@@ -4,18 +4,24 @@ import at.vvo.omds.types.omds3.r2025_05.common.ProductsRequest;
import com.kapdion.omds.productdefinitions.apriori.AprioriService;
import com.kapdion.omds.productdefinitions.calculate.CalculateService;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.xml.datatype.DatatypeConfigurationException;
import java.io.IOException;
+@Slf4j
@RestController
+
public class EndpointsZentralesBOA {
@PostMapping("/ProductsRequest")
public String apriori(@RequestBody ProductsRequest productsRequest){
AprioriService as = new AprioriService();
String s = as.getProductsResponse(productsRequest);
+ System.out.println("-----------------------");
+ System.out.println("Products request: " + s);
+
return s;
};
@@ -23,6 +29,8 @@ public class EndpointsZentralesBOA {
public String calc(@RequestBody String calculateRequest) throws Exception {
CalculateService cs = new CalculateService();
String s = cs.buildResponse(calculateRequest);
+ System.out.println("-----------------------");
+ System.out.println("Calculate request: " + calculateRequest);
return s;
};
diff --git a/src/main/java/com/kapdion/omds/productdefinitions/apriori/AprioriService.java b/src/main/java/com/kapdion/omds/productdefinitions/apriori/AprioriService.java
index f95b5ba..68d0c59 100644
--- a/src/main/java/com/kapdion/omds/productdefinitions/apriori/AprioriService.java
+++ b/src/main/java/com/kapdion/omds/productdefinitions/apriori/AprioriService.java
@@ -49,7 +49,8 @@ public class AprioriService {
vvo:maxOccurrence ?maxOccurrence ;
vvo:type ?type ;
vvo:Parent ?parent ;
- vvo:risikoobjektType ?risikoobjektType .
+ vvo:risikoobjektType ?risikoobjektType ;
+ vvo:praemienfaktor ?praemie
}
WHERE {
?prodelement a vvo:ProdElement .
@@ -63,6 +64,7 @@ public class AprioriService {
OPTIONAL { ?prodelement vvo:type ?type . }
OPTIONAL { ?prodelement vvo:Parent ?parent . }
OPTIONAL { ?prodelement vvo:risikoobjektType ?risikoobjektType . }
+ OPTIONAL { ?prodelement vvo:praemienfaktor ?praemie . }
FILTER ( ?salesfrom < ?stichtag && (!BOUND(?salesto) || ?salesto > ?stichtag) )
}
diff --git a/src/main/java/com/kapdion/omds/productdefinitions/calculate/Bundesland.java b/src/main/java/com/kapdion/omds/productdefinitions/calculate/Bundesland.java
new file mode 100644
index 0000000..22e6613
--- /dev/null
+++ b/src/main/java/com/kapdion/omds/productdefinitions/calculate/Bundesland.java
@@ -0,0 +1,5 @@
+package com.kapdion.omds.productdefinitions.calculate;
+
+public enum Bundesland {
+ Niederoesterreich, Wien, Burgenland, Oberoesterreich, Tirol, Salzburg, Steiermark, Kaernten, Vorarlberg, Unbekannt
+}
diff --git a/src/main/java/com/kapdion/omds/productdefinitions/calculate/CalculateService.java b/src/main/java/com/kapdion/omds/productdefinitions/calculate/CalculateService.java
index 68c3a9a..ef6e219 100644
--- a/src/main/java/com/kapdion/omds/productdefinitions/calculate/CalculateService.java
+++ b/src/main/java/com/kapdion/omds/productdefinitions/calculate/CalculateService.java
@@ -5,6 +5,7 @@ import at.vvo.omds.client.gui.RDFHelper;
import at.vvo.omds.client.gui.TreeHelper;
import at.vvo.omds.types.omds3.r2025_05.common.*;
import javafx.scene.control.TreeItem;
+import lombok.extern.slf4j.Slf4j;
import org.eclipse.rdf4j.model.*;
import org.eclipse.rdf4j.query.GraphQuery;
import org.eclipse.rdf4j.query.QueryResults;
@@ -14,13 +15,22 @@ import org.eclipse.rdf4j.repository.sail.SailRepository;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.Rio;
import org.eclipse.rdf4j.sail.memory.MemoryStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.*;
+import java.math.BigDecimal;
import java.math.BigInteger;
+import java.math.RoundingMode;
import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
import java.util.stream.Collectors;
+
public class CalculateService {
+ Logger log = LoggerFactory.getLogger(CalculateService.class);
RDFHelper rdfHelper = new RDFHelper();
public String buildResponse(String calculateRequest) throws Exception {
VerkaufsproduktType vp = rdfHelper.calculateRequestToVerkaufsprodukt(calculateRequest);
@@ -43,12 +53,6 @@ public class CalculateService {
return baos.toString();
}
- //Prüfen, ob sie zu den Werten im Verkaufsprodukt passen.
- //Prüfe VuNr exestiert
- //Prüfe Verkaufsprodukt verkaufsoffen
- //Prüfe auf risikoobjekt fehler
- //Wenn Unterbausteine angegeben sind, dann prüfen, ob sie a priori zulässig sind.
- //Ergänzen fehlender Bausteine
private VerkaufsproduktType validateRequest(VerkaufsproduktType vp) throws IOException {
// pruefeVUNr(calculateRequest.getVUNr());
pruefePlausis(vp);
@@ -119,14 +123,40 @@ public class CalculateService {
}
private void calculate(VerkaufsproduktType vp) {
- AttributIntType attInt = new AttributIntType();
+ AttributDezimalType attInt = new AttributDezimalType();
+
+ BigDecimal jahresNettoPraemie;
+ BigDecimal jahresNettoPraemieKasko = new BigDecimal(0);
+ BigDecimal jahresNettoPraemieHp = new BigDecimal(0);
+
+ for (ProduktbausteinType baustein : vp.getBausteine()) {
+ if (baustein.getTyp().toLowerCase().contains("haftpflicht")) {
+ BigDecimal tmp = calculateHp(baustein);
+ if (tmp.compareTo(BigDecimal.valueOf(0)) < 1) {
+ addMeldungToProdukt(vp, "Fehler bei der Berechnung der Prämie für KFZ-Haftpflicht", 1);
+ System.out.println(vp.getBezeichnung());
+ }else {
+ jahresNettoPraemieHp = jahresNettoPraemieHp.add(tmp);
+ }
+ }else if (baustein.getTyp().toLowerCase().contains("kasko")) {
+ BigDecimal tmp = calculateKasko(baustein);
+
+ if (tmp.compareTo(BigDecimal.valueOf(0)) < 1) {
+ addMeldungToProdukt(vp, "Fehler bei der Berechnung der Prämie für Kasko", 1);
+ }else {
+ jahresNettoPraemieHp = jahresNettoPraemieHp.add(tmp);
+ }
+ }
+ }
+
+ jahresNettoPraemie = jahresNettoPraemieHp.add(jahresNettoPraemieKasko);
attInt.setId(BigInteger.valueOf(4));
attInt.setBezeichnung("Praemie");
- attInt.setValue(increasingCountBausteine(vp, 10, 0));
- attInt.setMax(999999);
- attInt.setMin(1);
- attInt.setDefault(10);
+ attInt.setValue(jahresNettoPraemie.setScale(2, RoundingMode.HALF_UP));
+ attInt.setMax(BigDecimal.valueOf(999999));
+ attInt.setMin(BigDecimal.valueOf(1));
+ attInt.setDefault(BigDecimal.valueOf(10));
attInt.setPflichtfeld(false);
attInt.setAenderbar(false);
@@ -135,14 +165,273 @@ public class CalculateService {
}
- private int increasingCountBausteine(ProduktbausteinType vp, int multFaktor, int praemie){
+ private Bundesland getBundeslandFromKennzeichen(String kennzeichen) {
+ kennzeichen = kennzeichen.toUpperCase().trim().substring(0, kennzeichen.indexOf("-"));
- praemie += vp.getBausteine().size() * multFaktor;
- multFaktor = multFaktor*7;
- for (ProduktbausteinType baustein : vp.getBausteine()) {
- praemie += increasingCountBausteine(baustein, multFaktor, praemie);
+ HashMap< String, Bundesland> kennzeichenMap = new HashMap<>();
+
+ kennzeichenMap.put("AM", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("BL", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("BN", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("GD", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("GF", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("HL", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("HO", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("KG", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("KO", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("KR", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("KS", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("LF", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("MD", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("ME", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("MI", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("NK", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("P", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("PL", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("SB", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("SW", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("TU", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("WB", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("WN", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("WT", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("WY", Bundesland.Niederoesterreich);
+ kennzeichenMap.put("ZT", Bundesland.Niederoesterreich);
+
+ kennzeichenMap.put("BR", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("EF", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("FR", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("GM", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("GR", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("KI", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("L", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("LL", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("PE", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("RI", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("RO", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("SD", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("SE", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("SR", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("UU", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("VB", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("WE", Bundesland.Oberoesterreich);
+ kennzeichenMap.put("WL", Bundesland.Oberoesterreich);
+
+ kennzeichenMap.put("W", Bundesland.Wien);
+
+ kennzeichenMap.put("BA", Bundesland.Steiermark);
+ kennzeichenMap.put("BM", Bundesland.Steiermark);
+ kennzeichenMap.put("DL", Bundesland.Steiermark);
+ kennzeichenMap.put("G", Bundesland.Steiermark);
+ kennzeichenMap.put("GB", Bundesland.Steiermark);
+ kennzeichenMap.put("GU", Bundesland.Steiermark);
+ kennzeichenMap.put("HF", Bundesland.Steiermark);
+ kennzeichenMap.put("LB", Bundesland.Steiermark);
+ kennzeichenMap.put("LE", Bundesland.Steiermark);
+ kennzeichenMap.put("LI", Bundesland.Steiermark);
+ kennzeichenMap.put("LN", Bundesland.Steiermark);
+ kennzeichenMap.put("MT", Bundesland.Steiermark);
+ kennzeichenMap.put("MU", Bundesland.Steiermark);
+ kennzeichenMap.put("SO", Bundesland.Steiermark);
+ kennzeichenMap.put("VO", Bundesland.Steiermark);
+ kennzeichenMap.put("WZ", Bundesland.Steiermark);
+
+ kennzeichenMap.put("I", Bundesland.Tirol);
+ kennzeichenMap.put("IL", Bundesland.Tirol);
+ kennzeichenMap.put("IM", Bundesland.Tirol);
+ kennzeichenMap.put("KB", Bundesland.Tirol);
+ kennzeichenMap.put("KU", Bundesland.Tirol);
+ kennzeichenMap.put("LA", Bundesland.Tirol);
+ kennzeichenMap.put("LZ", Bundesland.Tirol);
+ kennzeichenMap.put("RE", Bundesland.Tirol);
+ kennzeichenMap.put("SZ", Bundesland.Tirol);
+
+ kennzeichenMap.put("HA", Bundesland.Salzburg);
+ kennzeichenMap.put("JO", Bundesland.Salzburg);
+ kennzeichenMap.put("S", Bundesland.Salzburg);
+ kennzeichenMap.put("SL", Bundesland.Salzburg);
+ kennzeichenMap.put("TA", Bundesland.Salzburg);
+ kennzeichenMap.put("ZE", Bundesland.Salzburg);
+
+ kennzeichenMap.put("FE", Bundesland.Kaernten);
+ kennzeichenMap.put("HE", Bundesland.Kaernten);
+ kennzeichenMap.put("K", Bundesland.Kaernten);
+ kennzeichenMap.put("KL", Bundesland.Kaernten);
+ kennzeichenMap.put("SP", Bundesland.Kaernten);
+ kennzeichenMap.put("SV", Bundesland.Kaernten);
+ kennzeichenMap.put("VI", Bundesland.Kaernten);
+ kennzeichenMap.put("VK", Bundesland.Kaernten);
+ kennzeichenMap.put("VL", Bundesland.Kaernten);
+ kennzeichenMap.put("WO", Bundesland.Kaernten);
+
+ kennzeichenMap.put("B", Bundesland.Vorarlberg);
+ kennzeichenMap.put("BZ", Bundesland.Vorarlberg);
+ kennzeichenMap.put("DO", Bundesland.Vorarlberg);
+ kennzeichenMap.put("FK", Bundesland.Vorarlberg);
+
+ kennzeichenMap.put("E", Bundesland.Burgenland);
+ kennzeichenMap.put("EU", Bundesland.Burgenland);
+ kennzeichenMap.put("GS", Bundesland.Burgenland);
+ kennzeichenMap.put("JE", Bundesland.Burgenland);
+ kennzeichenMap.put("MA", Bundesland.Burgenland);
+ kennzeichenMap.put("ND", Bundesland.Burgenland);
+ kennzeichenMap.put("OP", Bundesland.Burgenland);
+ kennzeichenMap.put("OW", Bundesland.Burgenland);
+
+ return kennzeichenMap.getOrDefault(kennzeichen, Bundesland.Unbekannt);
+ }
+
+ private BigDecimal getBundeslandMultiplikator(Bundesland bundesland) {
+ return switch (bundesland) {
+ case Niederoesterreich -> BigDecimal.valueOf(1.1);
+ case Oberoesterreich -> BigDecimal.valueOf(1.09);
+ case Wien -> BigDecimal.valueOf(1.08);
+ case Steiermark -> BigDecimal.valueOf(1.07);
+ case Tirol -> BigDecimal.valueOf(1.06);
+ case Salzburg -> BigDecimal.valueOf(1.05);
+ case Kaernten -> BigDecimal.valueOf(1.04);
+ case Vorarlberg -> BigDecimal.valueOf(1.03);
+ case Burgenland -> BigDecimal.valueOf(1.02);
+ case Unbekannt -> BigDecimal.valueOf(2);
+ };
+ }
+
+ private BigDecimal calculateHp(ProduktbausteinType vp) {
+ log.atDebug().log("----- calculateHp -----");
+ //a ... Versicherungssumme
+ BigDecimal a = ((AttributDezimalType)(vp.getAttribute().stream().filter(at -> at.getBezeichnung()
+ .equalsIgnoreCase("versicherungssumme")).toList().getFirst())).getValue();
+ //b ... Leistung des Fahrzeuges
+ int b = 0;
+
+ //c ... Bundesland multiplikator
+ BigDecimal c = BigDecimal.valueOf(0);
+
+ for (VersichertesInteresseType fa : vp.getVersicherteObjekte()){
+
+ int tempB = ((FahrzeugType)fa).getLeistung();
+ BigDecimal tempC = getBundeslandMultiplikator(getBundeslandFromKennzeichen(((FahrzeugType)fa).getPolKennz()));
+ if (tempB > b && tempC.compareTo(c) >= 0){
+ b = tempB;
+ c = tempC;
+ }
+ }
+
+ log.atDebug().log("Eingangsvariablen: ");
+ log.atDebug().log("a: " + a);
+ log.atDebug().log("b: " + b);
+ log.atDebug().log("c: " + c);
+ log.atDebug().log("");
+
+ if (a != null && b != 0 && !c.equals(BigDecimal.valueOf(0))) {
+ BigDecimal normA = (a.subtract(BigDecimal.valueOf(10000000)))
+ .divide(BigDecimal.valueOf(20000000), 10, RoundingMode.HALF_UP);
+ BigDecimal normB = (BigDecimal.valueOf(b).subtract(BigDecimal.valueOf(50)))
+ .divide(BigDecimal.valueOf(1350), 10, RoundingMode.HALF_UP);
+ BigDecimal normC = (c.subtract(BigDecimal.valueOf(1.01)))
+ .divide(BigDecimal.valueOf(0.09), 10, RoundingMode.HALF_UP);
+
+ BigDecimal gewichtungA = BigDecimal.valueOf(1.2);
+ BigDecimal gewichtungB = BigDecimal.valueOf(1.2);
+ BigDecimal gewichtungC = BigDecimal.valueOf(1);
+
+ log.atDebug().log("Normierte Variablen: ");
+ log.atDebug().log("normA: " + normA + " mit gewichtungA: " + gewichtungA);
+ log.atDebug().log("normB: " + normB + " mit gewichtungB: " + gewichtungB);
+ log.atDebug().log("normC: " + normC + " mit gewichtungC: " + gewichtungC);
+
+
+ BigDecimal x = (normA.multiply(gewichtungA))
+ .add((normB.multiply(gewichtungB)))
+ .add((normC.multiply(gewichtungC)))
+ .add(BigDecimal.valueOf(-1.5));
+
+ log.atDebug().log("500 + 100 * tanh(x)");
+ log.atDebug().log("x: " + x);
+
+
+ //500 als mittelwert
+ //+- 100 also Jahresnettor Prämie muss zwischen 400 und 600 liegen
+ BigDecimal erg = BigDecimal.valueOf(500)
+ .add(BigDecimal.valueOf(100).multiply(BigDecimal.valueOf(Math.tanh(x.doubleValue()))));
+ log.atDebug().log("Ergebnis: " + erg);
+ return erg;
+ }
+
+ return new BigDecimal(-1);
+ }
+
+ private BigDecimal calculateKasko(ProduktbausteinType vp) {
+ log.atDebug().log("----- calculateKasko -----");
+
+ BigDecimal praemie;
+
+ List anschaffungspreise = new ArrayList<>();
+ for (VersichertesInteresseType fa : vp.getVersicherteObjekte()) {
+ if (fa instanceof FahrzeugType) {
+ if (((FahrzeugType) fa).getListenpreis() == null) {
+ addMeldungToProdukt(vp, "Kein Listenpreis vorhanden für fahrzeug " + ((FahrzeugType) fa).getHandelsbez(), 1);
+ return new BigDecimal(-1);
+ }
+ if (((FahrzeugType) fa).getSonderausstattung() != null) {
+ anschaffungspreise.add(((FahrzeugType) fa).getListenpreis().add(((FahrzeugType) fa).getSonderausstattung()));
+ }else {
+ anschaffungspreise.add(((FahrzeugType) fa).getListenpreis());
+ }
+ log.atDebug().log("Anschaffungspreis: " + ((FahrzeugType) fa).getListenpreis().add(((FahrzeugType) fa).getSonderausstattung()));
+ }
+ }
+
+ anschaffungspreise.sort(BigDecimal::compareTo);
+
+ if (anschaffungspreise.isEmpty()) {
+ addMeldungToProdukt(vp, "Es muss ein Fahrzeug vorhanden sein", 1);
+ return new BigDecimal(-1);
+ }
+ praemie = anschaffungspreise.getLast().multiply(BigDecimal.valueOf(0.042));
+ log.atDebug().log("Prämie Teuerstes Fahrzeug: " + praemie);
+
+
+ for (int i = 0; i < anschaffungspreise.size()-1; i++) {
+ praemie = praemie.add(anschaffungspreise.get(i)
+ .multiply(BigDecimal.valueOf(0.042)).multiply(BigDecimal.valueOf(0.3)));
+
+ log.atDebug().log("Prämie Fahrzeug " + (i+2) + ": " + anschaffungspreise.get(i)
+ .multiply(BigDecimal.valueOf(0.042)).multiply(BigDecimal.valueOf(0.3)));
+ }
+
+ List praemienfaktoren = new ArrayList<>();
+ getPraemienfaktoren(vp, praemienfaktoren);
+
+ for (String pf : praemienfaktoren){
+ BigDecimal value = new BigDecimal(pf.substring(pf.indexOf(" ") + 1));
+ if (pf.contains("mult")) {
+ praemie = praemie.multiply(value);
+
+ log.atDebug().log("Prämie multipliziert mit " + value);
+ }else if (pf.contains("add")){
+ praemie = praemie.add(value);
+
+ log.atDebug().log("Prämie addirt mit " + value);
+ }
}
return praemie;
}
+
+ private void addMeldungToProdukt(ProduktbausteinType produktbaustein, String meldung, int errorType) {
+ ServiceFault sf = new ServiceFault();
+ sf.setErrorType(BigInteger.valueOf(errorType));
+ sf.setErrorMsg(meldung);
+
+ produktbaustein.getMeldungen().add(sf);
+ }
+
+ private void getPraemienfaktoren(ProduktbausteinType vp, List praemienfaktoren) {
+ if (vp.getPraemienfaktor() != null){
+ praemienfaktoren.add(vp.getPraemienfaktor());
+ }
+ for (ProduktbausteinType baustein : vp.getBausteine()) {
+ getPraemienfaktoren(baustein, praemienfaktoren);
+ }
+ }
}
diff --git a/src/main/resources/data/Attribute.ttl b/src/main/resources/data/Attribute.ttl
index 45cfefe..1be0cac 100644
--- a/src/main/resources/data/Attribute.ttl
+++ b/src/main/resources/data/Attribute.ttl
@@ -31,8 +31,9 @@ vvo:ElemDecimal1 a vvo:ElemDecimal ;
vvo:bez "Versicherungssumme" ;
vvo:ProdElement vvo:ProdElement11 ;
vvo:required "true"^^xsd:boolean ;
- vvo:max "10000"^^xsd:decimal ;
- vvo:min "10"^^xsd:decimal .
+ vvo:max "40000000"^^xsd:decimal ;
+ vvo:min "10000000"^^xsd:decimal ;
+ vvo:default "10000000"^^xsd:decimal .
vvo:ElemDecimal2 a vvo:ElemDecimal ;
vvo:bez "Selbstbehalt" ;
diff --git a/src/main/resources/data/prodelements.ttl b/src/main/resources/data/prodelements.ttl
index 0c37a50..680b165 100644
--- a/src/main/resources/data/prodelements.ttl
+++ b/src/main/resources/data/prodelements.ttl
@@ -172,14 +172,14 @@ vvo:ProdElement15 a vvo:ProdElement ;
vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" .
vvo:ProdElement16 a vvo:ProdElement ;
- vvo:ins_id 1 ;
- vvo:bez "Freiwillige Zusatzversicherung (GGBG)" ;
- vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ;
- vvo:salesFrom "2022-01-01"^^xsd:date ;
+ vvo:ins_id 1 ;
+ vvo:bez "Freiwillige Zusatzversicherung (GGBG)" ;
+ vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ;
+ vvo:salesFrom "2022-01-01"^^xsd:date ;
vvo:Parent vvo:ProdElement11 ;
- vvo:minOccurrence 0 ;
- vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" .
+ vvo:minOccurrence 0 ;
+ vvo:maxOccurrence 1 ;
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" .
vvo:ProdElement17 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -263,7 +263,8 @@ vvo:ProdElement24 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement23 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" ;
+ vvo:praemienfaktor "add 100" .
vvo:ProdElement25 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -323,7 +324,8 @@ vvo:ProdElement30 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement23 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" ;
+ vvo:praemienfaktor "mult 1.02" .
vvo:ProdElement31 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -333,7 +335,8 @@ vvo:ProdElement31 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement23 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" ;
+ vvo:praemienfaktor "mult 1.04" .
vvo:ProdElement32 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -343,7 +346,8 @@ vvo:ProdElement32 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement23 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" ;
+ vvo:praemienfaktor "mult 1.03" .
vvo:ProdElement33 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -353,7 +357,8 @@ vvo:ProdElement33 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement23 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" ;
+ vvo:praemienfaktor "add 250" .
vvo:ProdElement34 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -362,8 +367,8 @@ vvo:ProdElement34 a vvo:ProdElement ;
vvo:salesFrom "2022-01-01"^^xsd:date ;
vvo:Parent vvo:ProdElement10 ;
vvo:Previous vvo:ProdElement7 ;
- vvo:minOccurrence 1 ;
- vvo:maxOccurrence 1 ;
+ vvo:minOccurrence 0 ;
+ vvo:maxOccurrence 3 ;
vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" ;
vvo:risikoobjektType "FahrzeugType" .
@@ -375,7 +380,8 @@ vvo:ProdElement35 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement34 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" ;
+ vvo:praemienfaktor "add 100" .
vvo:ProdElement36 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -435,7 +441,8 @@ vvo:ProdElement41 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement34 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" ;
+ vvo:praemienfaktor "mult 1.02" .
vvo:ProdElement42 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -445,7 +452,8 @@ vvo:ProdElement42 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement34 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" ;
+ vvo:praemienfaktor "mult 1.04" .
vvo:ProdElement43 a vvo:ProdElement ;
vvo:ins_id 1 ;
@@ -455,7 +463,8 @@ vvo:ProdElement43 a vvo:ProdElement ;
vvo:Parent vvo:ProdElement34 ;
vvo:minOccurrence 0 ;
vvo:maxOccurrence 1 ;
- vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" .
+ vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" ;
+ vvo:praemienfaktor "mult 1.03" .
vvo:ProdElement44 a vvo:ProdElement ;
vvo:ins_id 1 ;