result = excelUtils.create(customer, List.of(questionnaire));
+
+ assertTrue(result.isPresent());
+ }
+
+ // --- create: each sheet gets same customer data ---
+
+ @Test
+ void create_multipleSheets_eachSheetHasCustomerData() throws IOException {
+ QuestionnaireCustomer customer = createCustomer("Hartmann AG", "C-100", "München", "80331");
+ Questionnaire q1 = createQuestionnaire(new Date(), "Q1");
+ Questionnaire q2 = createQuestionnaire(new Date(), "Q2");
+
+ byte[] bytes = excelUtils.create(customer, List.of(q1, q2)).orElseThrow();
+
+ try (XSSFWorkbook workbook = new XSSFWorkbook(new ByteArrayInputStream(bytes))) {
+ for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
+ XSSFSheet sheet = workbook.getSheetAt(i);
+ assertEquals("Hartmann AG", sheet.getRow(0).getCell(0).getStringCellValue());
+ assertEquals("C-100", sheet.getRow(1).getCell(0).getStringCellValue());
+ }
+ }
+ }
+
+ @Test
+ void create_multipleSheets_eachSheetHasQuestionData() throws IOException {
+ QuestionnaireCustomer customer = createCustomer("Test", "C-001", "Berlin", "10115");
+ Questionnaire q1 = createQuestionnaire(new Date(), null);
+ Questionnaire q2 = createQuestionnaire(new Date(), null);
+
+ byte[] bytes = excelUtils.create(customer, List.of(q1, q2)).orElseThrow();
+
+ try (XSSFWorkbook workbook = new XSSFWorkbook(new ByteArrayInputStream(bytes))) {
+ for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
+ XSSFRow row = workbook.getSheetAt(i).getRow(7);
+ assertNotNull(row);
+ }
+ }
+ }
+
+ // --- helpers ---
+
+ private QuestionnaireCustomer createCustomer(String name, String number, String city, String zip) {
+ return new QuestionnaireCustomer.Builder()
+ .name(name)
+ .customerNumber(number)
+ .city(city)
+ .zip(zip)
+ .build();
+ }
+
+ private Questionnaire createQuestionnaire(Date date, String questions) {
+ return new Questionnaire.Builder()
+ .questionnaireDate(date)
+ .questions(QuestionnaireJsonParserTest.testJson1)
+ .build();
+ }
+
+ public void writeToFile(final byte[] content, final String fileName) {
+ File file = new File("target/test/output/");
+ file.mkdirs();
+ try (FileOutputStream out = new FileOutputStream(new File(file, fileName))) {
+
+ IOUtils.write(content, out);
+ } catch (Exception e) {
+ LOG.error("Error saveing pdf file", e);
+ }
+ }
+}
diff --git a/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/ImageUtilTest.java b/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/ImageUtilTest.java
index 952843c..c747967 100644
--- a/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/ImageUtilTest.java
+++ b/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/ImageUtilTest.java
@@ -332,7 +332,7 @@ class ImageUtilTest {
@Test
void getExifOrientation_invalidBytes_returns1() {
- byte[] garbage = new byte[]{0x00, 0x01, 0x02, 0x03};
+ byte[] garbage = new byte[] { 0x00, 0x01, 0x02, 0x03 };
int orientation = imageUtil.getExifOrientation(garbage);
@@ -364,7 +364,7 @@ class ImageUtilTest {
// --- EXIF orientation with resize ---
@Test
- void getImage_size2_rotatedImage_usesEffectiveWidthForResizeDecision() throws IOException {
+ void getImage_size2_rotatedImage_usesEffectiveWidthForResizeDecision() {
// A tall image (600x800) with no EXIF won't be resized since width (600) < 1200
String base64 = createTestImageBase64(600, 800);
byte[] original = Base64.getDecoder().decode(base64);
diff --git a/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/QuestionnaireJsonParserTest.java b/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/QuestionnaireJsonParserTest.java
new file mode 100644
index 0000000..8a7f5b6
--- /dev/null
+++ b/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/QuestionnaireJsonParserTest.java
@@ -0,0 +1,349 @@
+package marketing.heyday.hartmann.fotodocumentation.core.utils;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ *
+ * Copyright: Copyright (c) 2024
+ * Company: heyday Marketing GmbH
+ * @author Patrick Verboom
+ * @version 1.0
+ *
+ * created: 20 Feb 2026
+ */
+
+public class QuestionnaireJsonParserTest {
+
+
+ @Test
+ public void testJson1() {
+ var parser = new QuestionnaireJsonParser();
+ boolean retVal = parser.parse(testJson1);
+ assertTrue(retVal);
+ var questions = parser.getQuestions();
+ assertEquals(10, questions.size());
+ }
+
+
+ public static final String testJson1 = """
+[
+ {
+ "id": "question1",
+ "title": "",
+ "order": 1,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Nicht-kaufender Kunde",
+ "selected": true
+ },
+ {
+ "id": "answer2",
+ "answer": "Bestandskunde",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question2",
+ "title": "Haben Sie Rezeptpatienten(GKV) für Inko?",
+ "order": 2,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer1",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question3",
+ "title": "Warum nicht?",
+ "order": 3,
+ "type": "multiplChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Lagergründe",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Wirtschaftlichkeitsgründe",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Administrativer Aufwand",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Personeller Aufwand",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question4",
+ "title": "Haben Sie Privatrezeptpatienten für inko?",
+ "order": 4,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question5",
+ "title": "Wie viele Patienten versorgen Sie regelmäßig? (Privat) un GKV",
+ "order": 5,
+ "type": "number",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": 47,
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question6",
+ "title": "Mit welchem Herstellern arbeiten Sie zusammen?",
+ "order": 6,
+ "type": "multiplChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "TZMO",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Ontex",
+ "selected": true
+ },
+ {
+ "id": "answer5",
+ "answer": "Param",
+ "selected": false
+ },
+ {
+ "id": "answer6",
+ "answer": "Andere",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question7",
+ "title": "Was sind Ihre Gründe für die Zusammenarbeit?",
+ "order": 7,
+ "type": "matrix",
+ "data":
+ {
+ "questions":
+ [
+ {
+ "id": "subq1",
+ "title": "Preis",
+ "order": 1,
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": true
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq2",
+ "title": "Einkaufskondition",
+ "order": 2,
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq3",
+ "title": "Qualität",
+ "order": 3,
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": true
+ }
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "id": "question8",
+ "title": "Beziehen Sie Produkte direkt oder über den Großhandel?",
+ "order": 8,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "primär direkt",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "primär Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "ptimär teils. Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "unterschiedlich",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question9",
+ "title": "Gründe für Bezug?",
+ "order": 10,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Umsatzziel mit Händler",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Warenverfügbarkeit/ Liefergeschwindigkeit und Frequent",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Einkaufskondition",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question10",
+ "title": "Weiter/Kommentare Hinweise?",
+ "order": 11,
+ "type": "freeText",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Kommentar eintragen",
+ "selected": true
+ }
+ ]
+ }
+ }
+]
+""";
+}
diff --git a/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/QuestionnaireUploadJsonParserTest.java b/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/QuestionnaireUploadJsonParserTest.java
new file mode 100644
index 0000000..e093ced
--- /dev/null
+++ b/hartmann-foto-documentation-app/src/test/java/marketing/heyday/hartmann/fotodocumentation/core/utils/QuestionnaireUploadJsonParserTest.java
@@ -0,0 +1,270 @@
+package marketing.heyday.hartmann.fotodocumentation.core.utils;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.Optional;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ *
+ * Copyright: Copyright (c) 2024
+ * Company: heyday Marketing GmbH
+ * @author Patrick Verboom
+ * @version 1.0
+ *
+ * created: 20 Feb 2026
+ */
+class QuestionnaireUploadJsonParserTest {
+
+ // --- builder: successful parsing ---
+
+ @Test
+ void builder_validJson_returnsPresent() {
+ String json = createValidJson();
+
+ Optional result = QuestionnaireUploadJsonParser.builder(json);
+
+ assertTrue(result.isPresent());
+ }
+
+ @Test
+ void builder_validJson_parsesUsername() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertEquals("verboomp", parser.username());
+ }
+
+ @Test
+ void builder_validJson_parsesPharmacyName() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertEquals("Müller Apotheke", parser.pharmacyName());
+ }
+
+ @Test
+ void builder_validJson_parsesCustomerNumber() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertEquals("1234", parser.customerNumber());
+ }
+
+ @Test
+ void builder_validJson_parsesDate() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertNotNull(parser.date());
+ }
+
+ @Test
+ void builder_validJson_parsesComment() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertEquals("Some long text", parser.comment());
+ }
+
+ @Test
+ void builder_validJson_parsesCity() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertEquals("Hannover", parser.city());
+ }
+
+ @Test
+ void builder_validJson_parsesZip() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertEquals("12345", parser.zip());
+ }
+
+ @Test
+ void builder_validJson_parsesQuestionnaireAsJsonString() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertNotNull(parser.questionnair());
+ assertTrue(parser.questionnair().contains("question1"));
+ assertTrue(parser.questionnair().contains("singleChoice"));
+ }
+
+ @Test
+ void builder_validJson_questionnaireContainsAnswers() {
+ String json = createValidJson();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertTrue(parser.questionnair().contains("answer1"));
+ assertTrue(parser.questionnair().contains("Ja"));
+ }
+
+ // --- builder: multiple questions ---
+
+ @Test
+ void builder_multipleQuestions_allQuestionsInOutput() {
+ String json = createJsonWithMultipleQuestions();
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertTrue(parser.questionnair().contains("question1"));
+ assertTrue(parser.questionnair().contains("question2"));
+ }
+
+ // --- builder: invalid input ---
+
+ @Test
+ void builder_invalidJson_returnsEmpty() {
+ String json = "not valid json";
+
+ Optional result = QuestionnaireUploadJsonParser.builder(json);
+
+ assertTrue(result.isEmpty());
+ }
+
+ @Test
+ void builder_emptyObject_returnsEmpty() {
+ String json = "{}";
+
+ Optional result = QuestionnaireUploadJsonParser.builder(json);
+
+ assertTrue(result.isEmpty());
+ }
+
+ @Test
+ void builder_missingRequiredField_returnsEmpty() {
+ String json = """
+ {
+ "username": "verboomp",
+ "pharmacyName": "Test"
+ }""";
+
+ Optional result = QuestionnaireUploadJsonParser.builder(json);
+
+ assertTrue(result.isEmpty());
+ }
+
+ @Test
+ void builder_invalidDateFormat_returnsEmpty() {
+ String json = """
+ {
+ "username": "verboomp",
+ "pharmacyName": "Test",
+ "customerNumber": "1234",
+ "date": "not-a-date",
+ "comment": "test",
+ "city": "Berlin",
+ "zip": "10115",
+ "questionnaire": [{"id": "q1", "title": "Q", "order": 1, "type": "freeText", "data": {"answers": []}}]
+ }""";
+
+ Optional result = QuestionnaireUploadJsonParser.builder(json);
+
+ assertTrue(result.isEmpty());
+ }
+
+ // --- builder: special characters ---
+
+ @Test
+ void builder_unicodeCharacters_parsedCorrectly() {
+ String json = createJsonWithValues("user1", "Löwen Apotheke", "5678", "Köln", "50667");
+
+ QuestionnaireUploadJsonParser parser = QuestionnaireUploadJsonParser.builder(json).orElseThrow();
+
+ assertEquals("Löwen Apotheke", parser.pharmacyName());
+ assertEquals("Köln", parser.city());
+ }
+
+ // --- helpers ---
+
+ private String createValidJson() {
+ return """
+ {
+ "username": "verboomp",
+ "pharmacyName": "Müller Apotheke",
+ "customerNumber": "1234",
+ "date": "2026-01-20T11:06:00+01:00",
+ "comment": "Some long text",
+ "city": "Hannover",
+ "zip": "12345",
+ "questionnaire": [
+ {
+ "id": "question1",
+ "title": "Kundentyp",
+ "order": 1,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {"id": "answer1", "answer": "Ja", "selected": true},
+ {"id": "answer2", "answer": "Nein", "selected": false}
+ ]
+ }
+ }
+ ]
+ }""";
+ }
+
+ private String createJsonWithMultipleQuestions() {
+ return """
+ {
+ "username": "verboomp",
+ "pharmacyName": "Test Apotheke",
+ "customerNumber": "9999",
+ "date": "2026-01-20T11:06:00+01:00",
+ "comment": "comment",
+ "city": "Berlin",
+ "zip": "10115",
+ "questionnaire": [
+ {
+ "id": "question1",
+ "title": "First",
+ "order": 1,
+ "type": "singleChoice",
+ "data": {"answers": [{"id": "a1", "answer": "Yes", "selected": true}]}
+ },
+ {
+ "id": "question2",
+ "title": "Second",
+ "order": 2,
+ "type": "freeText",
+ "data": {"answers": [{"id": "a1", "answer": "Some text", "selected": true}]}
+ }
+ ]
+ }""";
+ }
+
+ private String createJsonWithValues(String username, String pharmacyName, String customerNumber, String city, String zip) {
+ return """
+ {
+ "username": "%s",
+ "pharmacyName": "%s",
+ "customerNumber": "%s",
+ "date": "2026-01-20T11:06:00+01:00",
+ "comment": "test",
+ "city": "%s",
+ "zip": "%s",
+ "questionnaire": [
+ {
+ "id": "q1",
+ "title": "Q",
+ "order": 1,
+ "type": "freeText",
+ "data": {"answers": [{"id": "a1", "answer": "text", "selected": true}]}
+ }
+ ]
+ }""".formatted(username, pharmacyName, customerNumber, city, zip);
+ }
+}
diff --git a/hartmann-foto-documentation-docker/src/test/java/marketing/heyday/hartmann/fotodocumentation/rest/QuestionnairePublishResourceTest.java b/hartmann-foto-documentation-docker/src/test/java/marketing/heyday/hartmann/fotodocumentation/rest/QuestionnairePublishResourceTest.java
index 8bfef83..e0021ad 100644
--- a/hartmann-foto-documentation-docker/src/test/java/marketing/heyday/hartmann/fotodocumentation/rest/QuestionnairePublishResourceTest.java
+++ b/hartmann-foto-documentation-docker/src/test/java/marketing/heyday/hartmann/fotodocumentation/rest/QuestionnairePublishResourceTest.java
@@ -35,7 +35,6 @@ public class QuestionnairePublishResourceTest extends AbstractQuestionnaireTest
@Test
@Order(2)
- @Disabled // FIXME: enable when implemented
public void doAddCustomerdoAddQuestionniare() throws IOException {
LOG.info("doAddCustomerdoAddQuestionniare");
@@ -43,8 +42,8 @@ public class QuestionnairePublishResourceTest extends AbstractQuestionnaireTest
assertEquals(5, questionnaireCount());
String path = deploymentURL + PATH;
- Request request = Request.Post(path).addHeader("Accept", "application/json; charset=utf-8")
- .bodyFile(new File(BASE_UPLOAD + "add.json"), ContentType.APPLICATION_JSON);
+ Request request = Request.Post(path)//.addHeader("Accept", "application/json; charset=utf-8")
+ .bodyFile(new File(BASE_UPLOAD + "questionnaire_add.json"), ContentType.APPLICATION_JSON);
HttpResponse httpResponse = executeRequest(request);
int code = httpResponse.getStatusLine().getStatusCode();
@@ -56,7 +55,6 @@ public class QuestionnairePublishResourceTest extends AbstractQuestionnaireTest
@Test
@Order(3)
- @Disabled // FIXME: enable when implemented
public void doAddCustomerWithQuestionnaire() throws IOException {
LOG.info("doAddCustomerWithQuestionnaire");
@@ -65,7 +63,7 @@ public class QuestionnairePublishResourceTest extends AbstractQuestionnaireTest
String path = deploymentURL + PATH;
Request request = Request.Post(path).addHeader("Accept", "application/json; charset=utf-8")
- .bodyFile(new File(BASE_UPLOAD + "addNewCustomer.json"), ContentType.APPLICATION_JSON);
+ .bodyFile(new File(BASE_UPLOAD + "questionnaire_addNewCustomer.json"), ContentType.APPLICATION_JSON);
HttpResponse httpResponse = executeRequest(request);
int code = httpResponse.getStatusLine().getStatusCode();
@@ -77,13 +75,12 @@ public class QuestionnairePublishResourceTest extends AbstractQuestionnaireTest
@Test
@Order(1)
- @Disabled // FIXME: enable when implemented
public void doAddCustomerWithQuestionnaireWrongJson() throws IOException {
LOG.info("doAddCustomerWithQuestionnaireWrongJson");
String path = deploymentURL + PATH;
Request request = Request.Post(path).addHeader("Accept", "application/json; charset=utf-8")
- .bodyFile(new File(BASE_UPLOAD + "addWrong.json"), ContentType.APPLICATION_JSON);
+ .bodyFile(new File(BASE_UPLOAD + "questionnaire_addWrong.json"), ContentType.APPLICATION_JSON);
HttpResponse httpResponse = executeRequest(request);
int code = httpResponse.getStatusLine().getStatusCode();
diff --git a/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_add.json b/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_add.json
new file mode 100644
index 0000000..d1384a3
--- /dev/null
+++ b/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_add.json
@@ -0,0 +1,302 @@
+{
+ "username": "verboomp",
+ "pharmacyName": "Müller Apotheke",
+ "customerNumber": "1234",
+ "date": "2026-01-20T11:06:00+01:00",
+ "comment": "Some long text for Müller Pharmacy",
+ "city": "Hannover",
+ "zip": "12345",
+ "questionnaire": [
+ {
+ "id": "question1",
+ "title": "",
+ "order": 1,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Nicht-kaufender Kunde",
+ "selected": true
+ },
+ {
+ "id": "answer2",
+ "answer": "Bestandskunde",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question2",
+ "title": "Haben Sie Rezeptpatienten(GKV) für Inko?",
+ "order": 2,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer1",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question3",
+ "title": "Warum nicht?",
+ "order": 3,
+ "type": "multiplChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Lagergründe",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Wirtschaftlichkeitsgründe",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Administrativer Aufwand",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Personeller Aufwand",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question4",
+ "title": "Haben Sie Privatrezeptpatienten für inko?",
+ "order": 4,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question5",
+ "title": "Wie viele Patienten versorgen Sie regelmäßig?\n(Privat) un GKV",
+ "order": 5,
+ "type": "number",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "47",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question6",
+ "title": "Mit welchem Herstellern arbeiten Sie zusammen?",
+ "order": 6,
+ "type": "multiplChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "TZMO",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Ontex",
+ "selected": false
+ },
+ {
+ "id": "answer5",
+ "answer": "Param",
+ "selected": false
+ },
+ {
+ "id": "answer6",
+ "answer": "Andere",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question7",
+ "title": "Was sind Ihre Gründe für die Zusammenarbeit?",
+ "order": 7,
+ "type": "matrix",
+ "data": {
+ "questions": [
+ {
+ "id": "subq1",
+ "title": "Preis",
+ "order": 1,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq2",
+ "title": "Einkaufskondition",
+ "order": 2,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq3",
+ "title": "Qualität",
+ "order": 3,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "id": "question8",
+ "title": "Beziehen Sie Produkte direkt oder über den Großhandel?",
+ "order": 8,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "primär direkt",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "primär Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "ptimär teils. Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "unterschiedlich",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question9",
+ "title": "Gründe für Bezug?",
+ "order": 10,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Umsatzziel mit Händler",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Warenverfügbarkeit/ Liefergeschwindigkeit und Frequent",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Einkaufskondition",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question10",
+ "title": "Weiter/Kommentare Hinweise?",
+ "order": 11,
+ "type": "freeText",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Kommentar eintragen",
+ "selected": true
+ }
+ ]
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_addNewCustomer.json b/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_addNewCustomer.json
new file mode 100644
index 0000000..033004a
--- /dev/null
+++ b/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_addNewCustomer.json
@@ -0,0 +1,302 @@
+{
+ "username": "verboomp",
+ "pharmacyName": "New Apotheke",
+ "customerNumber": "new_number",
+ "date": "2026-01-20T11:06:00+01:00",
+ "comment": "Some long text for New Pharmacy",
+ "city": "Hannover",
+ "zip": "12345",
+ "questionnaire": [
+ {
+ "id": "question1",
+ "title": "",
+ "order": 1,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Nicht-kaufender Kunde",
+ "selected": true
+ },
+ {
+ "id": "answer2",
+ "answer": "Bestandskunde",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question2",
+ "title": "Haben Sie Rezeptpatienten(GKV) für Inko?",
+ "order": 2,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer1",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question3",
+ "title": "Warum nicht?",
+ "order": 3,
+ "type": "multiplChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Lagergründe",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Wirtschaftlichkeitsgründe",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Administrativer Aufwand",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Personeller Aufwand",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question4",
+ "title": "Haben Sie Privatrezeptpatienten für inko?",
+ "order": 4,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question5",
+ "title": "Wie viele Patienten versorgen Sie regelmäßig?\n(Privat) un GKV",
+ "order": 5,
+ "type": "number",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "47",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question6",
+ "title": "Mit welchem Herstellern arbeiten Sie zusammen?",
+ "order": 6,
+ "type": "multiplChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "TZMO",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Ontex",
+ "selected": false
+ },
+ {
+ "id": "answer5",
+ "answer": "Param",
+ "selected": false
+ },
+ {
+ "id": "answer6",
+ "answer": "Andere",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question7",
+ "title": "Was sind Ihre Gründe für die Zusammenarbeit?",
+ "order": 7,
+ "type": "matrix",
+ "data": {
+ "questions": [
+ {
+ "id": "subq1",
+ "title": "Preis",
+ "order": 1,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq2",
+ "title": "Einkaufskondition",
+ "order": 2,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq3",
+ "title": "Qualität",
+ "order": 3,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "id": "question8",
+ "title": "Beziehen Sie Produkte direkt oder über den Großhandel?",
+ "order": 8,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "primär direkt",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "primär Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "ptimär teils. Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "unterschiedlich",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question9",
+ "title": "Gründe für Bezug?",
+ "order": 10,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Umsatzziel mit Händler",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Warenverfügbarkeit/ Liefergeschwindigkeit und Frequent",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Einkaufskondition",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question10",
+ "title": "Weiter/Kommentare Hinweise?",
+ "order": 11,
+ "type": "freeText",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Kommentar eintragen",
+ "selected": true
+ }
+ ]
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_addWrong.json b/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_addWrong.json
new file mode 100644
index 0000000..160658f
--- /dev/null
+++ b/hartmann-foto-documentation-docker/src/test/resources/upload/questionnaire_addWrong.json
@@ -0,0 +1,298 @@
+{
+ "username": "verboomp",
+ "date": "2026-01-20T11:06:00+01:00",
+ "comment": "Some long text for Müller Pharmacy",
+ "questionnaire": [
+ {
+ "id": "question1",
+ "title": "",
+ "order": 1,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Nicht-kaufender Kunde",
+ "selected": true
+ },
+ {
+ "id": "answer2",
+ "answer": "Bestandskunde",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question2",
+ "title": "Haben Sie Rezeptpatienten(GKV) für Inko?",
+ "order": 2,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer1",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question3",
+ "title": "Warum nicht?",
+ "order": 3,
+ "type": "multiplChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Lagergründe",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Wirtschaftlichkeitsgründe",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Administrativer Aufwand",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Personeller Aufwand",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question4",
+ "title": "Haben Sie Privatrezeptpatienten für inko?",
+ "order": 4,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question5",
+ "title": "Wie viele Patienten versorgen Sie regelmäßig?\n(Privat) un GKV",
+ "order": 5,
+ "type": "number",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "47",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question6",
+ "title": "Mit welchem Herstellern arbeiten Sie zusammen?",
+ "order": 6,
+ "type": "multiplChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "TZMO",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Ontex",
+ "selected": false
+ },
+ {
+ "id": "answer5",
+ "answer": "Param",
+ "selected": false
+ },
+ {
+ "id": "answer6",
+ "answer": "Andere",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question7",
+ "title": "Was sind Ihre Gründe für die Zusammenarbeit?",
+ "order": 7,
+ "type": "matrix",
+ "data": {
+ "questions": [
+ {
+ "id": "subq1",
+ "title": "Preis",
+ "order": 1,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq2",
+ "title": "Einkaufskondition",
+ "order": 2,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq3",
+ "title": "Qualität",
+ "order": 3,
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "id": "question8",
+ "title": "Beziehen Sie Produkte direkt oder über den Großhandel?",
+ "order": 8,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "primär direkt",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "primär Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "ptimär teils. Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "unterschiedlich",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question9",
+ "title": "Gründe für Bezug?",
+ "order": 10,
+ "type": "singleChoice",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Umsatzziel mit Händler",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Warenverfügbarkeit/ Liefergeschwindigkeit und Frequent",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Einkaufskondition",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question10",
+ "title": "Weiter/Kommentare Hinweise?",
+ "order": 11,
+ "type": "freeText",
+ "data": {
+ "answers": [
+ {
+ "id": "answer1",
+ "answer": "Kommentar eintragen",
+ "selected": true
+ }
+ ]
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/hartmann-foto-documentation/pom.xml b/hartmann-foto-documentation/pom.xml
index cc8983e..c8af823 100644
--- a/hartmann-foto-documentation/pom.xml
+++ b/hartmann-foto-documentation/pom.xml
@@ -290,12 +290,13 @@
org.apache.poi
poi
- 5.1.0
+ 5.5.1
+
org.apache.poi
poi-ooxml
- 5.1.0
+ 5.5.1
dom4j
diff --git a/question_answer.json b/question_answer.json
new file mode 100644
index 0000000..ddd3ea8
--- /dev/null
+++ b/question_answer.json
@@ -0,0 +1,316 @@
+[
+ {
+ "id": "question1",
+ "title": "",
+ "order": 1,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Nicht-kaufender Kunde",
+ "selected": true
+ },
+ {
+ "id": "answer2",
+ "answer": "Bestandskunde",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question2",
+ "title": "Haben Sie Rezeptpatienten(GKV) für Inko?",
+ "order": 2,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer1",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question3",
+ "title": "Warum nicht?",
+ "order": 3,
+ "type": "multiplChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Lagergründe",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Wirtschaftlichkeitsgründe",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Administrativer Aufwand",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Personeller Aufwand",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question4",
+ "title": "Haben Sie Privatrezeptpatienten für inko?",
+ "order": 4,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Ja",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Nein",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question5",
+ "title": "Wie viele Patienten versorgen Sie regelmäßig?\n(Privat) un GKV",
+ "order": 5,
+ "type": "number",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "47",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question6",
+ "title": "Mit welchem Herstellern arbeiten Sie zusammen?",
+ "order": 6,
+ "type": "multiplChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "TZMO",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "Ontex",
+ "selected": false
+ },
+ {
+ "id": "answer5",
+ "answer": "Param",
+ "selected": false
+ },
+ {
+ "id": "answer6",
+ "answer": "Andere",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question7",
+ "title": "Was sind Ihre Gründe für die Zusammenarbeit?",
+ "order": 7,
+ "type": "matrix",
+ "data":
+ {
+ "questions":
+ [
+ {
+ "id": "subq1",
+ "title": "Preis",
+ "order": 1,
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq2",
+ "title": "Einkaufskondition",
+ "order": 2,
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ },
+ {
+ "id": "subq3",
+ "title": "Qualität",
+ "order": 3,
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "HARTMANN",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Essity",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Ontex",
+ "selected": false
+ }
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "id": "question8",
+ "title": "Beziehen Sie Produkte direkt oder über den Großhandel?",
+ "order": 8,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "primär direkt",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "primär Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "ptimär teils. Großhandel",
+ "selected": true
+ },
+ {
+ "id": "answer4",
+ "answer": "unterschiedlich",
+ "selected": false
+ }
+ ]
+ }
+ },
+ {
+ "id": "question9",
+ "title": "Gründe für Bezug?",
+ "order": 10,
+ "type": "singleChoice",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Umsatzziel mit Händler",
+ "selected": false
+ },
+ {
+ "id": "answer2",
+ "answer": "Warenverfügbarkeit/ Liefergeschwindigkeit und Frequent",
+ "selected": true
+ },
+ {
+ "id": "answer3",
+ "answer": "Einkaufskondition",
+ "selected": true
+ }
+ ]
+ }
+ },
+ {
+ "id": "question10",
+ "title": "Weiter/Kommentare Hinweise?",
+ "order": 11,
+ "type": "freeText",
+ "data":
+ {
+ "answers":
+ [
+ {
+ "id": "answer1",
+ "answer": "Kommentar eintragen",
+ "selected": true
+ }
+ ]
+ }
+ }
+]
\ No newline at end of file