From 741c6042c5912745f23121792d8af1b0103563ac Mon Sep 17 00:00:00 2001 From: LukasJuraczka Date: Wed, 22 Oct 2025 13:28:08 +0200 Subject: [PATCH] =?UTF-8?q?Pr=C3=A4mie=20nach=20Calculate.=20Genauere=20Ba?= =?UTF-8?q?ustein-Definition.=20RDF=20wird=20=C3=BCber=20OMDSServiceDefini?= =?UTF-8?q?tion=20verarbeitet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EndpointsZentralesBOA.java | 7 +- .../apriori/AprioriService.java | 14 +- .../calculate/CalculateService.java | 226 ++++------- src/main/resources/data/plausis/kasko.sparql | 12 +- .../resources/data/plausis/kaskoDel.sparql | 14 + src/main/resources/data/prodelements.ttl | 355 ++++++++++++++++-- .../productdefinitionsApplicationTests.java | 6 +- 7 files changed, 415 insertions(+), 219 deletions(-) create mode 100644 src/main/resources/data/plausis/kaskoDel.sparql diff --git a/src/main/java/com/kapdion/omds/productdefinitions/EndpointsZentralesBOA.java b/src/main/java/com/kapdion/omds/productdefinitions/EndpointsZentralesBOA.java index 9ade866..e4436d8 100644 --- a/src/main/java/com/kapdion/omds/productdefinitions/EndpointsZentralesBOA.java +++ b/src/main/java/com/kapdion/omds/productdefinitions/EndpointsZentralesBOA.java @@ -16,15 +16,14 @@ public class EndpointsZentralesBOA { public String apriori(@RequestBody ProductsRequest productsRequest){ AprioriService as = new AprioriService(); String s = as.getProductsResponse(productsRequest); - System.out.println(s); return s; }; @PostMapping("/CalculateRequest") - public String calc(@RequestBody String calculateRequest) throws IOException, DatatypeConfigurationException { - System.out.println(calculateRequest); + public String calc(@RequestBody String calculateRequest) throws Exception { CalculateService cs = new CalculateService(); - return cs.buildResponse(calculateRequest); + String s = cs.buildResponse(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 ad0d8a9..f95b5ba 100644 --- a/src/main/java/com/kapdion/omds/productdefinitions/apriori/AprioriService.java +++ b/src/main/java/com/kapdion/omds/productdefinitions/apriori/AprioriService.java @@ -22,6 +22,7 @@ import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import java.io.*; import java.nio.file.Files; +import java.util.Arrays; import java.util.stream.Collectors; import static org.eclipse.rdf4j.model.util.Values.iri; @@ -47,7 +48,7 @@ public class AprioriService { vvo:minOccurrence ?minOccurrence ; vvo:maxOccurrence ?maxOccurrence ; vvo:type ?type ; - vvo:parent ?parent ; + vvo:Parent ?parent ; vvo:risikoobjektType ?risikoobjektType . } WHERE { @@ -60,7 +61,7 @@ public class AprioriService { OPTIONAL { ?prodelement vvo:minOccurrence ?minOccurrence . } OPTIONAL { ?prodelement vvo:maxOccurrence ?maxOccurrence . } OPTIONAL { ?prodelement vvo:type ?type . } - OPTIONAL { ?prodelement vvo:parent ?parent . } + OPTIONAL { ?prodelement vvo:Parent ?parent . } OPTIONAL { ?prodelement vvo:risikoobjektType ?risikoobjektType . } FILTER ( ?salesfrom < ?stichtag && (!BOUND(?salesto) || ?salesto > ?stichtag) ) } @@ -257,17 +258,19 @@ public class AprioriService { } public void addPlausisToRequest(Model model) throws IOException { - IRI plausiIri = iri("http://vvo.pisanoapi.at/plausi"); + IRI plausiIri = iri("http://vvo.pisanoapi.at/Plausi"); IRI queryIri = iri("http://vvo.pisanoapi.at/query"); IRI beschreibungIri = iri("http://vvo.pisanoapi.at/beschreibung"); + IRI artIri = iri("http://vvo.pisanoapi.at/art"); File file = new File("src/main/resources/data/plausis"); int i = 1; - for (File plausi : file.listFiles()) { + for (File plausi : Arrays.stream(file.listFiles()).sorted().collect(Collectors.toList())) { var lines = Files.lines(plausi.toPath()).map(String::trim).toList(); - String beschreibung = lines.stream().filter(line -> line.startsWith("#")).findFirst().get().substring(1); + String beschreibung = lines.stream().filter(line -> line.startsWith("#beschreibung:")).findFirst().get().substring(14); + String art = lines.stream().filter(line -> line.startsWith("#art:")).findFirst().get().substring(5); String query = lines.stream().filter(line -> !line.startsWith("#") && !line.isEmpty()).collect(Collectors.joining("\n")); IRI spezPlausiIri = iri(plausiIri.stringValue() + i); @@ -275,6 +278,7 @@ public class AprioriService { model.add(spezPlausiIri, RDF.TYPE, plausiIri); model.add(spezPlausiIri, queryIri, Values.literal(query)); model.add(spezPlausiIri, beschreibungIri, Values.literal(beschreibung)); + model.add(spezPlausiIri, artIri, Values.literal(art)); i++; } 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 39a52c4..68c3a9a 100644 --- a/src/main/java/com/kapdion/omds/productdefinitions/calculate/CalculateService.java +++ b/src/main/java/com/kapdion/omds/productdefinitions/calculate/CalculateService.java @@ -1,12 +1,11 @@ package com.kapdion.omds.productdefinitions.calculate; +import at.vvo.omds.client.gui.GuiProdukt; +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 org.eclipse.rdf4j.model.*; -import org.eclipse.rdf4j.model.impl.SimpleValueFactory; -import org.eclipse.rdf4j.model.impl.TreeModel; -import org.eclipse.rdf4j.model.util.Models; -import org.eclipse.rdf4j.model.util.Values; -import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.query.GraphQuery; import org.eclipse.rdf4j.query.QueryResults; import org.eclipse.rdf4j.repository.Repository; @@ -16,128 +15,52 @@ import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.Rio; import org.eclipse.rdf4j.sail.memory.MemoryStore; -import javax.xml.datatype.DatatypeConfigurationException; -import javax.xml.datatype.DatatypeFactory; -import javax.xml.datatype.XMLGregorianCalendar; import java.io.*; +import java.math.BigInteger; import java.nio.file.Files; -import java.util.*; - -import static org.eclipse.rdf4j.model.util.Values.iri; +import java.util.stream.Collectors; public class CalculateService { - public String buildResponse(String calculateRequest) throws IOException, DatatypeConfigurationException { - VerkaufsproduktType vp = (VerkaufsproduktType) calculateRequestToVerkaufsprodukt(calculateRequest); + RDFHelper rdfHelper = new RDFHelper(); + public String buildResponse(String calculateRequest) throws Exception { + VerkaufsproduktType vp = rdfHelper.calculateRequestToVerkaufsprodukt(calculateRequest); - System.out.println("vp: " + vp.getBezeichnung()); - for (ProduktbausteinType unterbaustein : vp.getBausteine()){ - System.out.println("unterbaustein: " + unterbaustein.getBezeichnung()); + vp = validateRequest(vp); + + vp.getAttribute().removeIf(a -> a.getBezeichnung().equals("Praemie")); + if (vp.getMeldungen().isEmpty()) { + calculate(vp); } - validateRequest(vp); - calculate(); - Model response = createRdfModel(vp); + TreeHelper treeHelper = new TreeHelper(); + TreeItem vpTree = new TreeItem<>(new GuiProdukt(vp)); + treeHelper.produktToTree(vp, vpTree); + Model response = rdfHelper.createRdfModel(vpTree);; ByteArrayOutputStream baos = new ByteArrayOutputStream(); Rio.write(response, baos, RDFFormat.JSONLD); return baos.toString(); } - private ProduktbausteinType calculateRequestToVerkaufsprodukt(String calculateRequest) throws IOException, DatatypeConfigurationException { - Model model = Rio.parse(new StringReader(calculateRequest), "", RDFFormat.JSONLD); - - Map bausteine = new HashMap<>(); - Map parents = new HashMap<>(); - - for (Resource iri : Models.subjectIRIs(model)) { - String id = iri.stringValue(); - - System.out.println(iri.stringValue()); - ValueFactory vf = SimpleValueFactory.getInstance(); - - - int insId = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/ins_id"), null)).map(Literal::getLabel).orElse("-1")); - int maxOccurrence = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/maxOccurrence"), null)).map(Literal::getLabel).orElse("-1")); - int minOccurrence = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/minOccurrence"), null)).map(Literal::getLabel).orElse("-1")); - String bez = Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/bez"), null)).map(Literal::getLabel).orElse(null); - String type = Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/type"), null)).map(Literal::getLabel).orElse(null); - String risikoobjektType = Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/risikoobjektType"), null)).map(Literal::getLabel).orElse(null); - XMLGregorianCalendar verkaufsoffenVon = Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/salesFrom"), null)).map(Literal::getLabel).isPresent() ? DatatypeFactory.newInstance().newXMLGregorianCalendar( - Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/salesFrom"), null)).map(Literal::getLabel).orElse(null)) : null ; - XMLGregorianCalendar verkaufsoffenBis = Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/salesTo"), null)).map(Literal::getLabel).isPresent() ? DatatypeFactory.newInstance().newXMLGregorianCalendar( - Models.objectLiteral(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/salesTo"), null)).map(Literal::getLabel).orElse(null)) : null; - - Optional parentId = Models.objectResource(model.filter(iri, vf.createIRI( - "http://vvo.pisanoapi.at/parent"), null)).map(Resource::stringValue); - - - ProduktbausteinType verkaufsproduktType; - if (parentId.isPresent()) { - verkaufsproduktType = new ProduktAllgemeinType(); - }else { - System.out.println(parentId); - verkaufsproduktType = new VerkaufsproduktAllgemeinType(); - } - - verkaufsproduktType.setId(iri.stringValue().substring(iri.stringValue().length() - 1)); - verkaufsproduktType.setBezeichnung(bez); - verkaufsproduktType.setTyp(type); - verkaufsproduktType.setVerkaufsoffenVon(verkaufsoffenVon); - verkaufsproduktType.setVerkaufsoffenBis(verkaufsoffenBis); - verkaufsproduktType.setMaxVorkommen(maxOccurrence); - verkaufsproduktType.setMinVorkommen(minOccurrence); - verkaufsproduktType.setRisikoobjektErforderlich(risikoobjektType != null); - - parentId.ifPresent(p -> parents.put(id, p)); - bausteine.put(id, verkaufsproduktType); - - } - - List verkaufsprodukteList = new ArrayList<>(); - - for (Map.Entry entry : bausteine.entrySet()){ - String id = entry.getKey(); - ProduktbausteinType baustein = entry.getValue(); - String parentId = parents.get(id); - - if (parentId != null && bausteine.containsKey(parentId)){ - bausteine.get(parentId).getBausteine().add(baustein); - }else { - System.out.println("verkaufsprodukt aus calculate: " + baustein.getBezeichnung()); - verkaufsprodukteList.add((VerkaufsproduktType) baustein); - } - } - - return verkaufsprodukteList.getFirst(); - } - //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 void validateRequest(VerkaufsproduktType vp) throws IOException { + private VerkaufsproduktType validateRequest(VerkaufsproduktType vp) throws IOException { // pruefeVUNr(calculateRequest.getVUNr()); pruefePlausis(vp); pruefeVerkaufsoffen(vp); pruefeWerte(vp); pruefeRisikoobjekt(vp); pruefeErgaentzungen(vp); + + return vp; } - private void pruefePlausis(VerkaufsproduktType vp) throws IOException { + private VerkaufsproduktType pruefePlausis(VerkaufsproduktType vp) throws IOException { File file = new File("src/main/resources/data/plausis"); @@ -145,24 +68,39 @@ public class CalculateService { repo.init(); try (RepositoryConnection conn = repo.getConnection()) { - Model model = createRdfModel(vp); + TreeHelper treeHelper = new TreeHelper(); + TreeItem vpTree = new TreeItem<>(new GuiProdukt(vp)); + treeHelper.produktToTree(vp, vpTree); + Model model = rdfHelper.createRdfModel(vpTree); conn.add(model); for (File plausi : file.listFiles()) { - System.out.println(plausi.getName()); - System.out.println("query wird gemacht"); - String sparql = Files.readString(plausi.toPath()); + var lines = Files.lines(plausi.toPath()).map(String::trim).toList(); - GraphQuery q = conn.prepareGraphQuery(sparql); - Model validatedModel = QueryResults.asModel(q.evaluate()); + String art = lines.stream().filter(line -> line.startsWith("#art:")).findFirst().get().substring(5); + String query = lines.stream().filter(line -> !line.startsWith("#") && !line.isEmpty()).collect(Collectors.joining("\n")); + + + if (art.equals("update")){ + conn.prepareUpdate(query).execute(); + + model.clear(); + conn.getStatements(null, null, null).forEach(model::add); + }else if (art.equals("graph")){ + GraphQuery q = conn.prepareGraphQuery(query); + Model validatedModel = QueryResults.asModel(q.evaluate()); + model.addAll(validatedModel); + } - model.addAll(validatedModel); } - System.out.println("out nach query"); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Rio.write(model, baos, RDFFormat.JSONLD); + + return rdfHelper.calculateRequestToVerkaufsprodukt(baos.toString()); } catch(Exception ignored) { System.out.println(ignored.getMessage()); } - + return vp; } private void pruefeWerte(VerkaufsproduktType verkaufsprodukt) { @@ -180,65 +118,31 @@ public class CalculateService { private void pruefeVUNr(String vuNr) { } - private Model createRdfModel(ProduktbausteinType vp) { - Model erg = new TreeModel(); - String baseIri = "http://vvo.pisanoapi.at/"; + private void calculate(VerkaufsproduktType vp) { + AttributIntType attInt = new AttributIntType(); - addProduktToModel(vp, erg, baseIri, null); + attInt.setId(BigInteger.valueOf(4)); + attInt.setBezeichnung("Praemie"); + attInt.setValue(increasingCountBausteine(vp, 10, 0)); + attInt.setMax(999999); + attInt.setMin(1); + attInt.setDefault(10); + attInt.setPflichtfeld(false); + attInt.setAenderbar(false); + + vp.getAttribute().removeIf(a -> a.getBezeichnung().equals("Praemie")); + vp.getAttribute().add(attInt); - return erg; } - public void addProduktToModel(ProduktbausteinType produkt, Model model, String baseIri, String parentId) { - IRI prodelemIri = iri(baseIri + "ProdElement"); - IRI insIdIri = iri(baseIri + "ins_id"); - IRI bezIri = iri(baseIri + "bez"); - IRI createdIri = iri(baseIri + "created"); - IRI salesFromIri = iri(baseIri + "salesFrom"); - IRI salesToIri = iri(baseIri + "salesTo"); - IRI minOccurrenceIri = iri(baseIri + "minOccurrence"); - IRI maxOccurrenceIri = iri(baseIri + "maxOccurrence"); - IRI typeIri = iri(baseIri + "type"); - IRI risikoobjektTypeIri = iri(baseIri + "risikoobjektType"); - IRI bausteinIri = iri(baseIri + "baustein"); - IRI parentIri = iri(baseIri + "parent"); + private int increasingCountBausteine(ProduktbausteinType vp, int multFaktor, int praemie){ - IRI vpIri = iri(baseIri + "ProdElement" + produkt.getId()); - - model.add(vpIri, RDF.TYPE, prodelemIri); -// erg.add(vpIri, insIdIri, vp.getinsid()) - model.add(vpIri, bezIri, Values.literal(produkt.getBezeichnung())); -// erg.add(vpIri, createdIri, Values.literal(vp.get())); - model.add(vpIri, salesFromIri, Values.literal(produkt.getVerkaufsoffenVon())); - if (produkt.getVerkaufsoffenBis() != null) model.add(vpIri, salesToIri, Values.literal(produkt.getVerkaufsoffenBis())); - model.add(vpIri, minOccurrenceIri, Values.literal(produkt.getMinVorkommen())); - model.add(vpIri, maxOccurrenceIri, Values.literal(produkt.getMaxVorkommen())); - model.add(vpIri, typeIri, Values.literal(produkt.getTyp())); - - if (parentId != null) model.add(vpIri, parentIri, Values.iri(parentId)); - - -// for (int i = 0; i < vp.getVersicherteObjekte().size(); i++) { -// erg.add(vpIri, risikoobjektTypeIri, Values.literal(vp.getVersicherteObjekte().get(i))); -// } - for (int i = 0; i < produkt.getBausteine().size(); i++) { - IRI unterbausteinIri = iri(baseIri + "ProdElement" + produkt.getBausteine().get(i).getId()); - model.add(vpIri, bausteinIri, unterbausteinIri); - - parentId = vpIri.stringValue(); - - addProduktToModel(produkt.getBausteine().get(i), model, baseIri, parentId); + praemie += vp.getBausteine().size() * multFaktor; + multFaktor = multFaktor*7; + for (ProduktbausteinType baustein : vp.getBausteine()) { + praemie += increasingCountBausteine(baustein, multFaktor, praemie); } - } - public void addRisikoobjektToModel(VersichertesInteresseType ro, Model model, String baseIri) { - - } - - public void addAttributToModel(AttributType attribut, Model model, String baseIri) { - - } - - private void calculate() { + return praemie; } } diff --git a/src/main/resources/data/plausis/kasko.sparql b/src/main/resources/data/plausis/kasko.sparql index 8ed4e25..6688d2a 100644 --- a/src/main/resources/data/plausis/kasko.sparql +++ b/src/main/resources/data/plausis/kasko.sparql @@ -1,16 +1,18 @@ -# Plausi: Ein Baustein darf nur entweder ein Teilkasko oder ein Vollkasko Element haben +#beschreibung:Ein Baustein darf nur entweder ein Teilkasko oder ein Vollkasko Element haben +#art:graph PREFIX vvo: CONSTRUCT { - ?prodelement vvo:meldung "Es kann nur entweder Vollkasko oder Teilkasko eingeschlossen werden" . -} + ?prodelement vvo:Meldung vvo:MeldungA . + vvo:MeldungA vvo:errorMsg "Es kann nur entweder Vollkasko oder Teilkasko eingeschlossen werden" . + vvo:MeldungA vvo:errorType "1" .} WHERE { ?prodelement a vvo:ProdElement . - ?prodelement vvo:baustein ?uup1 . + ?prodelement vvo:Baustein ?uup1 . ?uup1 vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . - ?prodelement vvo:baustein ?uup2 . + ?prodelement vvo:Baustein ?uup2 . ?uup2 vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . } \ No newline at end of file diff --git a/src/main/resources/data/plausis/kaskoDel.sparql b/src/main/resources/data/plausis/kaskoDel.sparql new file mode 100644 index 0000000..e79ef38 --- /dev/null +++ b/src/main/resources/data/plausis/kaskoDel.sparql @@ -0,0 +1,14 @@ +#beschreibung:Loesche die meldung die schonmal durch kasko.sparql hinzugefügt wurde +#art:update +PREFIX vvo: + +DELETE { + ?prod vvo:Meldung ?meldung . +} +WHERE { + ?prod vvo:Meldung ?meldung . + + ?meldung vvo:errorMsg ?msg . + + FILTER (?msg = "Es kann nur entweder Vollkasko oder Teilkasko eingeschlossen werden") +} \ No newline at end of file diff --git a/src/main/resources/data/prodelements.ttl b/src/main/resources/data/prodelements.ttl index 0ec4828..0c37a50 100644 --- a/src/main/resources/data/prodelements.ttl +++ b/src/main/resources/data/prodelements.ttl @@ -21,7 +21,7 @@ vvo:ProdElement2 a vvo:ProdElement ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2020-01-01"^^xsd:date ; vvo:salesTo "2021-03-31"^^xsd:date ; - vvo:parent vvo:ProdElement1 ; + vvo:Parent vvo:ProdElement1 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" . @@ -32,7 +32,7 @@ vvo:ProdElement3 a vvo:ProdElement ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2020-01-01"^^xsd:date ; vvo:salesTo "2021-03-31"^^xsd:date ; - vvo:parent vvo:ProdElement1 ; + vvo:Parent vvo:ProdElement1 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . @@ -43,7 +43,7 @@ vvo:ProdElement4 a vvo:ProdElement ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2020-01-01"^^xsd:date ; vvo:salesTo "2021-03-31"^^xsd:date ; - vvo:parent vvo:ProdElement1 ; + vvo:Parent vvo:ProdElement1 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.InsassenUnfallKfzType" . @@ -54,7 +54,7 @@ vvo:ProdElement5 a vvo:ProdElement ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2021-01-01"^^xsd:date ; vvo:salesTo "2021-03-31"^^xsd:date ; - vvo:previous vvo:ProdElement1 ; + vvo:Previous vvo:ProdElement1 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VerkaufsproduktKfzType" ; @@ -66,8 +66,8 @@ vvo:ProdElement6 a vvo:ProdElement ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2021-01-01"^^xsd:date ; vvo:salesTo "2021-03-31"^^xsd:date ; - vvo:parent vvo:ProdElement5 ; - vvo:previous vvo:ProdElement2 ; + vvo:Parent vvo:ProdElement5 ; + vvo:Previous vvo:ProdElement2 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" . @@ -78,8 +78,8 @@ vvo:ProdElement7 a vvo:ProdElement ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2021-01-01"^^xsd:date ; vvo:salesTo "2021-03-31"^^xsd:date ; - vvo:parent vvo:ProdElement5 ; - vvo:previous vvo:ProdElement3 ; + vvo:Parent vvo:ProdElement5 ; + vvo:Previous vvo:ProdElement3 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . @@ -90,8 +90,8 @@ vvo:ProdElement8 a vvo:ProdElement ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2021-01-01"^^xsd:date ; vvo:salesTo "2021-03-31"^^xsd:date ; - vvo:parent vvo:ProdElement5 ; - vvo:previous vvo:ProdElement4 ; + vvo:Parent vvo:ProdElement5 ; + vvo:Previous vvo:ProdElement4 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.InsassenUnfallKfzType" . @@ -102,7 +102,7 @@ vvo:ProdElement9 a vvo:ProdElement ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2021-01-01"^^xsd:date ; vvo:salesTo "2021-03-31"^^xsd:date ; - vvo:parent vvo:ProdElement5 ; + vvo:Parent vvo:ProdElement5 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.AssistanceKfzType" . @@ -112,7 +112,7 @@ vvo:ProdElement10 a vvo:ProdElement ; vvo:bez "Kraftfahrt 2022" ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2022-01-01"^^xsd:date ; - vvo:previous vvo:ProdElement5 ; + vvo:Previous vvo:ProdElement5 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VerkaufsproduktKfzType" ; @@ -120,76 +120,349 @@ vvo:ProdElement10 a vvo:ProdElement ; vvo:ProdElement11 a vvo:ProdElement ; vvo:ins_id 1 ; - vvo:bez "Haftpflicht 2022" ; + vvo:bez "Kfz-Haftpflichtversicherung" ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2022-01-01"^^xsd:date ; - vvo:parent vvo:ProdElement10 ; - vvo:previous vvo:ProdElement6 ; + vvo:Parent vvo:ProdElement10 ; + vvo:Previous vvo:ProdElement6 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" ; + vvo:risikoobjektType "FahrzeugType" . + + +vvo:ProdElement12 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Auslandszusatzschutz" ; + 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:ProdElement13 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Außereuropäische Deckung" ; + 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:ProdElement14 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Blaulichtsteuer" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement11 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" . -vvo:ProdElement12 a vvo:ProdElement ; +vvo:ProdElement15 a vvo:ProdElement ; vvo:ins_id 1 ; - vvo:bez "Kasko 2022" ; + vvo:bez "Bonusretter BM extern 0-3" ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2022-01-01"^^xsd:date ; - vvo:parent vvo:ProdElement10 ; - vvo:previous vvo:ProdElement7 ; + vvo:Parent vvo:ProdElement11 ; vvo:minOccurrence 1 ; 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.HaftpflichtKfzType" . -vvo:ProdElement13 a vvo:ProdElement ; +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:Parent vvo:ProdElement11 ; + 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 ; + vvo:bez "Gemietete Kraftfahrzeuge im Ausland" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement11 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" . + +vvo:ProdElement18 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Pannenhilfe" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement11 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" . + +vvo:ProdElement19 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Schadenersatzbeitrag" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement11 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" . + +vvo:ProdElement20 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Schadenersatzbeitrag Taxi" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement11 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" . + +vvo:ProdElement21 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Winter-/Sommerdienst" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement11 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.HaftpflichtKfzType" . + +vvo:ProdElement22 a vvo:ProdElement ; vvo:ins_id 1 ; vvo:bez "Assistance 2022" ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2022-01-01"^^xsd:date ; - vvo:parent vvo:ProdElement10 ; - vvo:previous vvo:ProdElement9 ; + vvo:Parent vvo:ProdElement10 ; + vvo:Previous vvo:ProdElement9 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 2 ; - vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.AssistanceKfzType" . + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.AssistanceKfzType" ; + vvo:risikoobjektType "FahrzeugType" . -vvo:ProdElement14 a vvo:ProdElement ; +vvo:ProdElement23 a vvo:ProdElement ; vvo:ins_id 1 ; - vvo:bez "Kasko Unterbaustein 2022" ; + vvo:bez "Vollkasko" ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2022-01-01"^^xsd:date ; - vvo:parent vvo:ProdElement12 ; + vvo:Parent vvo:ProdElement10 ; + vvo:Previous vvo:ProdElement7 ; vvo:minOccurrence 1 ; - vvo:maxOccurrence 2 ; + vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" ; vvo:risikoobjektType "FahrzeugType" . -vvo:ProdElement15 a vvo:ProdElement ; +vvo:ProdElement24 a vvo:ProdElement ; vvo:ins_id 1 ; - vvo:bez "Kasko Unterunterbaustein 1 2022" ; + vvo:bez "Außereuropäische Deckung" ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2022-01-01"^^xsd:date ; - vvo:parent vvo:ProdElement14 ; - vvo:minOccurrence 1 ; - vvo:maxOccurrence 4 ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . -vvo:ProdElement16 a vvo:ProdElement ; +vvo:ProdElement25 a vvo:ProdElement ; vvo:ins_id 1 ; - vvo:bez "Kasko Unterunterbaustein 2 2022" ; + vvo:bez "Gap-Deckung" ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2022-01-01"^^xsd:date ; - vvo:parent vvo:ProdElement14 ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement26 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Grobe Fahrlässigkeit" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement27 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Kaufpreisersatzdeckung" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement28 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Moderne Kriminalität" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement29 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Neuwert-Deckung" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement30 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Zusatzpaket Light" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement31 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Zusatzpaket Luxus" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement32 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Zusatzpaket Elektronik" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement33 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Elektro-/Hybridfahrzeuge-Paket" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement23 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VollkaskoKfzType" . + +vvo:ProdElement34 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Teilkasko" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement10 ; + vvo:Previous vvo:ProdElement7 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" ; + vvo:risikoobjektType "FahrzeugType" . + +vvo:ProdElement35 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Außereuropäische Deckung" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . + +vvo:ProdElement36 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Gap-Deckung" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . -vvo:ProdElement17 a vvo:ProdElement ; +vvo:ProdElement37 a vvo:ProdElement ; vvo:ins_id 1 ; - vvo:bez "Kraftfahrt 2022-2" ; + vvo:bez "Grobe Fahrlässigkeit" ; vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; vvo:salesFrom "2022-01-01"^^xsd:date ; - vvo:previous vvo:ProdElement5 ; + vvo:Parent vvo:ProdElement34 ; vvo:minOccurrence 1 ; vvo:maxOccurrence 1 ; - vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.VerkaufsproduktKfzType" ; - vvo:risikoobjektType "FahrzeugType" . + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . +vvo:ProdElement38 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Kaufpreisersatzdeckung" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . + +vvo:ProdElement39 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Moderne Kriminalität" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . + +vvo:ProdElement40 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Neuwert-Deckung" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; + vvo:minOccurrence 1 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . + +vvo:ProdElement41 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Zusatzpaket Light" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . + +vvo:ProdElement42 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Zusatzpaket Luxus" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . + +vvo:ProdElement43 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Zusatzpaket Elektronik" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . + +vvo:ProdElement44 a vvo:ProdElement ; + vvo:ins_id 1 ; + vvo:bez "Elektro-/Hybridfahrzeuge-Paket" ; + vvo:created "2020-01-01T23:59:59.999999"^^xsd:dateTime ; + vvo:salesFrom "2022-01-01"^^xsd:date ; + vvo:Parent vvo:ProdElement34 ; + vvo:minOccurrence 0 ; + vvo:maxOccurrence 1 ; + vvo:type "at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.TeilkaskoKfzType" . \ No newline at end of file diff --git a/src/test/java/com/kapdion/omds/productdefinitions/productdefinitionsApplicationTests.java b/src/test/java/com/kapdion/omds/productdefinitions/productdefinitionsApplicationTests.java index 9751dd1..2322e02 100644 --- a/src/test/java/com/kapdion/omds/productdefinitions/productdefinitionsApplicationTests.java +++ b/src/test/java/com/kapdion/omds/productdefinitions/productdefinitionsApplicationTests.java @@ -6,8 +6,8 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class productdefinitionsApplicationTests { - @Test - void contextLoads() { - } +// @Test +// void contextLoads() { +// } }