From 97f428055e0885583cc2bed7d67702421eba902d Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Sat, 6 Jan 2024 18:07:09 +0100 Subject: [PATCH] import legacy-ids for contact, partner + sepamandate --- .../office/contact/HsOfficeContactEntity.java | 3 +- .../office/partner/HsOfficePartnerEntity.java | 3 +- .../HsOfficeSepaMandateEntity.java | 3 +- .../hsadminng/repository/HasUuid.java | 7 ++++ .../office/migration/ImportOfficeTables.java | 42 ++++++++++++++++--- 5 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/hostsharing/hsadminng/repository/HasUuid.java diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntity.java index 7a2c84e0..ccfbaf5f 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/contact/HsOfficeContactEntity.java @@ -3,6 +3,7 @@ package net.hostsharing.hsadminng.hs.office.contact; import lombok.*; import lombok.experimental.FieldNameConstants; import net.hostsharing.hsadminng.errors.DisplayName; +import net.hostsharing.hsadminng.repository.HasUuid; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; import org.hibernate.annotations.GenericGenerator; @@ -21,7 +22,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @AllArgsConstructor @FieldNameConstants @DisplayName("Contact") -public class HsOfficeContactEntity implements Stringifyable { +public class HsOfficeContactEntity implements Stringifyable, HasUuid { private static Stringify toString = stringify(HsOfficeContactEntity.class, "contact") .withProp(Fields.label, HsOfficeContactEntity::getLabel) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntity.java index 86b27c8d..2dab9e55 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/partner/HsOfficePartnerEntity.java @@ -4,6 +4,7 @@ import lombok.*; import net.hostsharing.hsadminng.errors.DisplayName; import net.hostsharing.hsadminng.hs.office.contact.HsOfficeContactEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; +import net.hostsharing.hsadminng.repository.HasUuid; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; import org.hibernate.annotations.NotFound; @@ -22,7 +23,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @NoArgsConstructor @AllArgsConstructor @DisplayName("Partner") -public class HsOfficePartnerEntity implements Stringifyable { +public class HsOfficePartnerEntity implements Stringifyable, HasUuid { private static Stringify stringify = stringify(HsOfficePartnerEntity.class, "partner") .withProp(HsOfficePartnerEntity::getPerson) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateEntity.java index 84264bd6..aefc34c4 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/sepamandate/HsOfficeSepaMandateEntity.java @@ -6,6 +6,7 @@ import lombok.*; import net.hostsharing.hsadminng.errors.DisplayName; import net.hostsharing.hsadminng.hs.office.bankaccount.HsOfficeBankAccountEntity; import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorEntity; +import net.hostsharing.hsadminng.repository.HasUuid; import net.hostsharing.hsadminng.stringify.Stringify; import net.hostsharing.hsadminng.stringify.Stringifyable; import org.hibernate.annotations.Type; @@ -25,7 +26,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; @NoArgsConstructor @AllArgsConstructor @DisplayName("SEPA-Mandate") -public class HsOfficeSepaMandateEntity implements Stringifyable { +public class HsOfficeSepaMandateEntity implements Stringifyable, HasUuid { private static Stringify stringify = stringify(HsOfficeSepaMandateEntity.class) .withProp(e -> e.getBankAccount().getIban()) diff --git a/src/main/java/net/hostsharing/hsadminng/repository/HasUuid.java b/src/main/java/net/hostsharing/hsadminng/repository/HasUuid.java new file mode 100644 index 00000000..69db49cb --- /dev/null +++ b/src/main/java/net/hostsharing/hsadminng/repository/HasUuid.java @@ -0,0 +1,7 @@ +package net.hostsharing.hsadminng.repository; + +import java.util.UUID; + +public interface HasUuid { + UUID getUuid(); +} 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 f1933005..ef2281b1 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 @@ -15,6 +15,7 @@ import net.hostsharing.hsadminng.hs.office.partner.HsOfficePartnerEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonEntity; import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonType; import net.hostsharing.hsadminng.hs.office.sepamandate.HsOfficeSepaMandateEntity; +import net.hostsharing.hsadminng.repository.HasUuid; import net.hostsharing.test.JpaAttempt; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; @@ -24,7 +25,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import org.springframework.test.annotation.Commit; +import org.springframework.test.annotation.Rollback; +import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.util.ReflectionUtils; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; @@ -36,7 +43,6 @@ import java.io.Reader; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDate; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -72,6 +78,9 @@ public class ImportOfficeTables extends ContextBasedTest { @PersistenceContext EntityManager em; + @Autowired + TransactionTemplate txTemplate; + @Autowired JpaAttempt jpaAttempt; @@ -189,21 +198,46 @@ public class ImportOfficeTables extends ContextBasedTest { @Test @Order(10) - @Transactional + @Commit + //@Rollback(false) void persistEntities() { + context("superuser-alex@hostsharing.net"); // TODO: use real user for actual import contacts.forEach((id, contact) -> em.persist(contact)); + updateLegacyIds(contacts, "hs_office_contact_legacy_id", "contact_id"); + persons.forEach((id, person) -> em.persist(person)); + partners.forEach((id, partner) -> em.persist(partner)); + updateLegacyIds(partners, "hs_office_partner_legacy_id", "bp_id"); + debitors.forEach((id, debitor) -> em.persist(debitor)); memberships.forEach((id, membership) -> em.persist(membership)); bankAccounts.forEach((id, account) -> em.persist(account)); + sepaMandates.forEach((id, mandate) -> em.persist(mandate)); + updateLegacyIds(sepaMandates, "hs_office_sepamandate_legacy_id", "sepa_mandate_id"); + + // TODO: coopshares+coopassets em.flush(); } + private void updateLegacyIds(Map entities, final String legacyIdTable, final String legacyIdColumn) { + entities.forEach((id, entity) -> em.createNativeQuery(""" + UPDATE ${legacyIdTable} + SET ${legacyIdColumn} = :legacyId + WHERE uuid = :uuid + """ + .replace("${legacyIdTable}", legacyIdTable) + .replace("${legacyIdColumn}", legacyIdColumn)) + .setParameter("legacyId", id) + .setParameter("uuid", entity.getUuid()) + .executeUpdate() + ); + } + public List readAllLines(Reader reader) throws Exception { final var parser = new CSVParserBuilder() @@ -423,10 +457,6 @@ public class ImportOfficeTables extends ContextBasedTest { return isNotBlank(value) ? Integer.parseInt(value.trim()) : 0; } - private static Integer toInteger(final String value) { - return isNotBlank(value) ? Integer.parseInt(value.trim()) : null; - } - private LocalDate localDate(final String dateStringNullOrBlank) { if (isNotBlank(dateStringNullOrBlank)) { return LocalDate.parse(dateStringNullOrBlank);