diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/migration/ImportOfficeTables.java b/src/test/java/net/hostsharing/hsadminng/hs/office/migration/ImportOfficeTables.java index 0657275e..bcbee321 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/migration/ImportOfficeTables.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/migration/ImportOfficeTables.java @@ -35,9 +35,7 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.constraints.NotNull; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; +import java.io.*; import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Path; @@ -45,10 +43,12 @@ import java.time.LocalDate; import java.util.*; import static java.util.Arrays.stream; +import static java.util.Objects.requireNonNull; import static net.hostsharing.hsadminng.mapper.PostgresDateRange.toPostgresDateRange; import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Fail.fail; /* * This 'test' includes the complete legacy 'office' data import. @@ -196,11 +196,11 @@ public class ImportOfficeTables extends ContextBasedTest { """); assertThat(contacts.toString()).isEqualToIgnoringWhitespace(""" { - 71=contact(label='Herr Michael Mellies ', emailAddresses='mih@example.org'), - 101=contact(label='Frau Dr. Jenny Meyer-Billing , JM e.K.', emailAddresses='jm-billing@example.org'), - 102=contact(label='Herr Andrew Meyer-Operation , JM e.K.', emailAddresses='am-operation@example.org'), - 103=contact(label='Herr Philip Meyer-Contract , JM e.K.', emailAddresses='pm-contractual@example.org'), - 121=contact(label='Petra Schmidt , Test PS', emailAddresses='ps@example.com') + 1101=contact(label='Herr Michael Mellies ', emailAddresses='mih@example.org'), + 1201=contact(label='Frau Dr. Jenny Meyer-Billing , JM e.K.', emailAddresses='jm-billing@example.org'), + 1202=contact(label='Herr Andrew Meyer-Operation , JM e.K.', emailAddresses='am-operation@example.org'), + 1203=contact(label='Herr Philip Meyer-Contract , JM e.K.', emailAddresses='pm-partner@example.org'), + 1301=contact(label='Petra Schmidt , Test PS', emailAddresses='ps@example.com') } """); assertThat(persons.toString()).isEqualToIgnoringWhitespace(""" @@ -226,9 +226,10 @@ public class ImportOfficeTables extends ContextBasedTest { """); assertThat(relationships.toString()).isEqualToIgnoringWhitespace(""" { - 71=rel(relAnchor='Mellies, Michael', relType='TECHNICAL_CONTACT', relHolder='Mellies, Michael', contact='Herr Michael Mellies '), - 102=rel(relAnchor='JM e.K.', relType='TECHNICAL_CONTACT', relHolder='JM e.K.', contact='Herr Andrew Meyer-Operation , JM e.K.'), - 121=rel(relAnchor='Test PS', relType='TECHNICAL_CONTACT', relHolder='Test PS', contact='Petra Schmidt , Test PS') + 1101=rel(relAnchor='Mellies, Michael', relType='OPERATIONS', relHolder='Mellies, Michael', contact='Herr Michael Mellies '), + 1202=rel(relAnchor='JM e.K.', relType='OPERATIONS', relHolder='JM e.K.', contact='Herr Andrew Meyer-Operation , JM e.K.'), + 1203=rel(relAnchor='JM e.K.', relType='REPRESENTATIVE', relHolder='JM e.K.', contact='Herr Philip Meyer-Contract , JM e.K.'), + 1301=rel(relAnchor='Test PS', relType='REPRESENTATIVE', relHolder='Test PS', contact='Petra Schmidt , Test PS') } """); } @@ -485,12 +486,28 @@ public class ImportOfficeTables extends ContextBasedTest { .withQuoteChar('"') .build(); - try (CSVReader csvReader = new CSVReaderBuilder(reader) + final var filteredReader = skippingEmptyAndCommentLines(reader); + try (CSVReader csvReader = new CSVReaderBuilder(filteredReader) .withCSVParser(parser) .build()) { return csvReader.readAll(); } } + public static Reader skippingEmptyAndCommentLines(Reader reader) throws IOException { + try (var bufferedReader = new BufferedReader(reader); + StringWriter writer = new StringWriter()) { + + String line; + while ((line = bufferedReader.readLine()) != null) { + if (!line.isBlank() && !line.startsWith("#")) { + writer.write(line); + writer.write("\n"); + } + } + + return new StringReader(writer.toString()); + } + } private void importBusinessPartners(final String[] header, final List records) { @@ -658,6 +675,10 @@ public class ImportOfficeTables extends ContextBasedTest { .forEach(rec -> { final var contactId = rec.getInteger("contact_id"); + if (rec.getString("roles").isBlank()) { + fail("empty roles assignment not allowed for contact_id: " + contactId); + } + final var partner = partners.get(rec.getInteger("bp_id")); final var debitor = debitors.get(rec.getInteger("bp_id")); @@ -671,7 +692,7 @@ public class ImportOfficeTables extends ContextBasedTest { contacts.put(contactId, initContact(contact, rec)); var imported = false; - if (rec.getString("roles").contains("contractual")) { + if (rec.getString("roles").contains("partner")) { assertThat(partner.getContact()).isNull(); partner.setContact(contact); imported = true; @@ -686,12 +707,12 @@ public class ImportOfficeTables extends ContextBasedTest { .relAnchor(partner.getPerson()) .relHolder(person) .contact(contact) - .relType(HsOfficeRelationshipType.TECHNICAL_CONTACT) + .relType(HsOfficeRelationshipType.OPERATIONS) .build(); relationships.put(contactId, rel); imported = true; } - if (rec.getString("roles").contains("representative")) { + if (rec.getString("roles").contains("contractual")) { final var rel = HsOfficeRelationshipEntity.builder() .relAnchor(partner.getPerson()) .relHolder(person) @@ -808,7 +829,7 @@ public class ImportOfficeTables extends ContextBasedTest { } private Reader resourceReader(@NotNull final String resourcePath) { - return new InputStreamReader(getClass().getClassLoader().getResourceAsStream(resourcePath)); + return new InputStreamReader(requireNonNull(getClass().getClassLoader().getResourceAsStream(resourcePath))); } private Reader fileReader(@NotNull final Path filePath) throws IOException { diff --git a/src/test/resources/migration/contacts.csv b/src/test/resources/migration/contacts.csv index aec7aea7..1dfd6e24 100644 --- a/src/test/resources/migration/contacts.csv +++ b/src/test/resources/migration/contacts.csv @@ -1,6 +1,12 @@ contact_id; bp_id; salut; first_name; last_name; title; firma; co; street; zipcode;city; country; phone_private; phone_office; phone_mobile; fax; email; roles -71; 7; Herr; Michael; Mellies; ; ; ; Kleine Freiheit 50; 26524; Hage; DE; ; +49 4931 123456; +49 1522 123456;; mih@example.org; contractual,billing,operation -101; 10; Frau; Jenny; Meyer-Billing; Dr.; JM e.K.;; Waldweg 5; 11001; Berlin; DE; +49 30 7777777; +49 30 1111111; ; +49 30 2222222; jm-billing@example.org; billing -102; 10; Herr; Andrew; Meyer-Operation; ; JM e.K.;; Waldweg 5; 11001; Berlin; DE; +49 30 6666666; +49 30 3333333; ; +49 30 4444444; am-operation@example.org; operation -103; 10; Herr; Philip; Meyer-Contract; ; JM e.K.;; Waldweg 5; 11001; Berlin; DE; +49 30 6666666; +49 30 5555555; ; +49 30 6666666; pm-contractual@example.org; contractual -121; 12; ; Petra; Schmidt; ; Test PS;; ; ; ; ; ; ; ; ; ps@example.com; billing,contractual,operation + +# eine natürliche Person +1101; 7; Herr; Michael; Mellies; ; ; ; Kleine Freiheit 50; 26524; Hage; DE; ; +49 4931 123456; +49 1522 123456;; mih@example.org; partner,billing,operation + +# eine juristische Person mit drei separaten Ansprechpartnern +1201; 10; Frau; Jenny; Meyer-Billing; Dr.; JM e.K.;; Waldweg 5; 11001; Berlin; DE; +49 30 7777777; +49 30 1111111; ; +49 30 2222222; jm-billing@example.org; billing +1202; 10; Herr; Andrew; Meyer-Operation; ; JM e.K.;; Waldweg 5; 11001; Berlin; DE; +49 30 6666666; +49 30 3333333; ; +49 30 4444444; am-operation@example.org; operation +1203; 10; Herr; Philip; Meyer-Contract; ; JM e.K.;; Waldweg 5; 11001; Berlin; DE; +49 30 6666666; +49 30 5555555; ; +49 30 6666666; pm-partner@example.org; partner,contractual + +# eine juristische Person mit nur einem Ansprechpartner +1301; 12; ; Petra; Schmidt; ; Test PS;; ; ; ; ; ; ; ; ; ps@example.com; partner,billing,contractual,operation