Prämie nach Calculate. Genauere Baustein-Definition. RDF wird über OMDSServiceDefinition verarbeitet.

This commit is contained in:
2025-10-22 13:28:08 +02:00
parent 33d65eb1d8
commit 741c6042c5
7 changed files with 415 additions and 219 deletions

View File

@@ -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;
};
}

View File

@@ -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++;
}

View File

@@ -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<GuiProdukt> 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<String, ProduktbausteinType> bausteine = new HashMap<>();
Map<String, String> 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<String> 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<VerkaufsproduktType> verkaufsprodukteList = new ArrayList<>();
for (Map.Entry<String, ProduktbausteinType> 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<GuiProdukt> 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;
}
}

View File

@@ -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: <http://vvo.pisanoapi.at/>
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" .
}

View File

@@ -0,0 +1,14 @@
#beschreibung:Loesche die meldung die schonmal durch kasko.sparql hinzugefügt wurde
#art:update
PREFIX vvo: <http://vvo.pisanoapi.at/>
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")
}

View File

@@ -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" .

View File

@@ -6,8 +6,8 @@ import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class productdefinitionsApplicationTests {
@Test
void contextLoads() {
}
// @Test
// void contextLoads() {
// }
}