diff --git a/src/main/resources/db/changelog/270-hs-office-debitor.sql b/src/main/resources/db/changelog/270-hs-office-debitor.sql index c11ab269..a4f9178f 100644 --- a/src/main/resources/db/changelog/270-hs-office-debitor.sql +++ b/src/main/resources/db/changelog/270-hs-office-debitor.sql @@ -17,7 +17,7 @@ create table hs_office_debitor vatReverseCharge boolean not null, refundBankAccountUuid uuid references hs_office_bankaccount(uuid), defaultPrefix char(3) not null - constraint check_member_code check ( + constraint check_default_prefix check ( defaultPrefix::text ~ '^([a-z]{3}|al0|bh1|c4s|f3k|k8i|l3d|mh1|o13|p2m|s80|t4w)$' ) -- TODO.impl: SEPA-mandate diff --git a/src/main/resources/db/changelog/278-hs-office-debitor-test-data.sql b/src/main/resources/db/changelog/278-hs-office-debitor-test-data.sql index 74cefde0..af75d074 100644 --- a/src/main/resources/db/changelog/278-hs-office-debitor-test-data.sql +++ b/src/main/resources/db/changelog/278-hs-office-debitor-test-data.sql @@ -33,7 +33,6 @@ begin select c.* from hs_office_contact c where c.label = billingContactLabel into relatedContact; select b.uuid from hs_office_bankaccount b where b.holder = partnerTradeName into relatedBankAccountUuid; - -- raise notice 'creating test debitor: % (#%)', idName, relatedPartner.debitorNumberPrefix || '00'; raise notice 'creating test debitor: % (#%)', idName, debitorNumberSuffix; raise notice '- using partner (%): %', relatedPartner.uuid, relatedPartner; raise notice '- using billingContact (%): %', relatedContact.uuid, relatedContact; diff --git a/src/main/resources/db/changelog/308-hs-office-membership-test-data.sql b/src/main/resources/db/changelog/308-hs-office-membership-test-data.sql index 1684ff09..5a4adaa6 100644 --- a/src/main/resources/db/changelog/308-hs-office-membership-test-data.sql +++ b/src/main/resources/db/changelog/308-hs-office-membership-test-data.sql @@ -8,14 +8,11 @@ /* Creates a single membership test record. */ --- create or replace procedure createHsOfficeMembershipTestData( forPartnerTradeName varchar, forMainDebitorNumber integer ) create or replace procedure createHsOfficeMembershipTestData( forPartnerTradeName varchar, forMainDebitorNumber numeric ) language plpgsql as $$ declare currentTask varchar; idName varchar; --- forDebitorNumberPrefix integer; --- forDebitorNumberSuffix integer; relatedPartner hs_office_partner; relatedDebitor hs_office_debitor; newMemberNumber numeric; @@ -28,9 +25,6 @@ begin select partner.* from hs_office_partner partner join hs_office_person person on person.uuid = partner.personUuid where person.tradeName = forPartnerTradeName into relatedPartner; --- forDebitorNumberPrefix := forMainDebitorNumber/ 100; --- forDebitorNumberSuffix := mod(forMainDebitorNumber, 100); --- select d.* from hs_office_debitor d where d.debitorNumberSuffix = forDebitorNumberSuffix into relatedDebitor; select d.* from hs_office_debitor d where d.debitorNumberSuffix = forMainDebitorNumber into relatedDebitor; select coalesce(max(memberNumber)+1, 10001) from hs_office_membership into newMemberNumber; @@ -39,7 +33,6 @@ begin raise notice '- using debitor (%): %', relatedDebitor.uuid, relatedDebitor; insert into hs_office_membership (uuid, partneruuid, maindebitoruuid, membernumber, validity, reasonfortermination) - -- values (uuid_generate_v4(), relatedPartner.uuid, relatedDebitor.uuid, forDebitorNumberPrefix, daterange('20221001' , null, '[]'), 'NONE'); values (uuid_generate_v4(), relatedPartner.uuid, relatedDebitor.uuid, newMemberNumber, daterange('20221001' , null, '[]'), 'NONE'); end; $$; --// @@ -55,10 +48,5 @@ do language plpgsql $$ call createHsOfficeMembershipTestData('Second e.K.', 12); call createHsOfficeMembershipTestData('Third OHG', 13); end; --- begin --- call createHsOfficeMembershipTestData('First GmbH', 1000100); --- call createHsOfficeMembershipTestData('Second e.K.', 1000200); --- call createHsOfficeMembershipTestData('Third OHG', 1000300); --- end; $$; --// diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java index 2b12cffe..8cddbcd8 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/debitor/HsOfficeDebitorRepositoryIntegrationTest.java @@ -20,14 +20,13 @@ 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.orm.jpa.JpaSystemException; +import org.springframework.transaction.annotation.Transactional; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.servlet.http.HttpServletRequest; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import static net.hostsharing.hsadminng.rbac.rbacgrant.RawRbacGrantEntity.grantDisplaysOf; import static net.hostsharing.hsadminng.rbac.rbacrole.RawRbacRoleEntity.roleNamesOf; @@ -65,8 +64,6 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTest { @MockBean HttpServletRequest request; - Set tempDebitors = new HashSet<>(); - @Nested class CreateDebitor { @@ -97,6 +94,34 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTest { assertThat(debitorRepo.count()).isEqualTo(count + 1); } + @ParameterizedTest + @ValueSource(strings = {"", "a", "ab", "a12", "123", "12a"}) + @Transactional + public void canNotCreateNewDebitorWithInvalidDefaultPrefix(final String givenPrefix) { + // given + context("superuser-alex@hostsharing.net"); + final var count = debitorRepo.count(); + final var givenPartner = partnerRepo.findPartnerByOptionalNameLike("First GmbH").get(0); + final var givenContact = contactRepo.findContactByOptionalLabelLike("first contact").get(0); + + // when + final var result = attempt(em, () -> { + final var newDebitor = HsOfficeDebitorEntity.builder() + .debitorNumberSuffix((byte)21) + .partner(givenPartner) + .billingContact(givenContact) + .billable(true) + .vatReverseCharge(false) + .vatBusiness(false) + .defaultPrefix(givenPrefix) + .build(); + return debitorRepo.save(newDebitor); + }); + + // then + result.assertExceptionWithRootCauseMessage(org.hibernate.exception.ConstraintViolationException.class); + } + @Test public void createsAndGrantsRoles() { // given @@ -564,14 +589,6 @@ class HsOfficeDebitorRepositoryIntegrationTest extends ContextBasedTest { }).assertSuccessful().returnedValue(); } - @BeforeEach - @AfterEach - void cleanup() { - context("superuser-alex@hostsharing.net"); - // TODO em.createQuery("DELETE FROM HsOfficeDebitorEntity d where d.debitorNumberSuffix >= 20").executeUpdate(); - em.createQuery("DELETE FROM HsOfficeDebitorEntity d where d.debitorNumberSuffix >= 20000").executeUpdate(); - } - void exactlyTheseDebitorsAreReturned(final List actualResult, final String... debitorNames) { assertThat(actualResult) .extracting(HsOfficeDebitorEntity::toString)