diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipController.java b/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipController.java index b46b02a8..da1b7920 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipController.java @@ -41,11 +41,10 @@ public class HsOfficeMembershipController implements HsOfficeMembershipsApi { final String currentUser, final String assumedRoles, UUID partnerUuid, - Integer memberNumberSuffix) { + Integer memberNumber) { context.define(currentUser, assumedRoles); - final var entities = - membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(partnerUuid, memberNumberSuffix); + final var entities = membershipRepo.findMembershipsByOptionalPartherNumber(partnerUuid); final var resources = mapper.mapList(entities, HsOfficeMembershipResource.class, SEPA_MANDATE_ENTITY_TO_RESOURCE_POSTMAPPER); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntity.java index 5991a9ac..89225f1f 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntity.java @@ -31,7 +31,7 @@ import static net.hostsharing.hsadminng.stringify.Stringify.stringify; public class HsOfficeMembershipEntity implements HasUuid, Stringifyable { private static Stringify stringify = stringify(HsOfficeMembershipEntity.class) - .withProp(HsOfficeMembershipEntity::getMemberNumberSuffix) + .withProp(e -> e.getPartner().getPartnerNumber() + e.memberNumberSuffix) .withProp(e -> e.getPartner().toShortString()) .withProp(e -> e.getMainDebitor().toShortString()) .withProp(e -> e.getValidity().asString()) @@ -52,8 +52,8 @@ public class HsOfficeMembershipEntity implements HasUuid, Stringifyable { @JoinColumn(name = "maindebitoruuid") private HsOfficeDebitorEntity mainDebitor; - @Column(name = "membernumbersuffix") - private int memberNumberSuffix; + @Column(name = "membernumbersuffix", length = 2) + private String memberNumberSuffix; @Column(name = "validity", columnDefinition = "daterange") @Type(PostgreSQLRangeType.class) @@ -98,7 +98,7 @@ public class HsOfficeMembershipEntity implements HasUuid, Stringifyable { @Override public String toShortString() { - return String.valueOf(memberNumberSuffix); + return partner.getPartnerNumber() + String.valueOf(memberNumberSuffix); } @PrePersist diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipRepository.java index 1bee3f73..71f91881 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipRepository.java @@ -3,6 +3,7 @@ package net.hostsharing.hsadminng.hs.office.membership; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; +import jakarta.validation.constraints.NotNull; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -11,16 +12,30 @@ public interface HsOfficeMembershipRepository extends Repository findByUuid(UUID id); + HsOfficeMembershipEntity save(final HsOfficeMembershipEntity entity); + + @Query(""" SELECT membership FROM HsOfficeMembershipEntity membership - WHERE (:memberNumberSuffix is null OR membership.memberNumberSuffix = :memberNumberSuffix) - AND ( CAST(:partnerUuid as org.hibernate.type.UUIDCharType) IS NULL - OR membership.partner.uuid = :partnerUuid ) + WHERE ( CAST(:partnerUuid as org.hibernate.type.UUIDCharType) IS NULL + OR membership.partner.uuid = :partnerUuid ) + ORDER BY membership.partner.partnerNumber, membership.memberNumberSuffix + """) + List findMembershipsByOptionalPartherNumber(UUID partnerUuid); + @Query(""" + SELECT membership FROM HsOfficeMembershipEntity membership + WHERE (:partnerNumber = membership.partner.partnerNumber) + AND (membership.memberNumberSuffix = :suffix) ORDER BY membership.memberNumberSuffix """) - List findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(UUID partnerUuid, Integer memberNumberSuffix); - - HsOfficeMembershipEntity save(final HsOfficeMembershipEntity entity); + List findMembershipsByPartnerNumberAndSuffix( + @NotNull Integer partnerNumber, + @NotNull String suffix); + default List findMembershipsByMemberNumber(Integer memberNumber) { + final var partnerNumber = memberNumber / 100; + final var suffix = memberNumber % 100; + return findMembershipsByPartnerNumberAndSuffix(partnerNumber, String.format("%02d", suffix)); + } long count(); diff --git a/src/main/resources/db/changelog/220-hs-office-partner.sql b/src/main/resources/db/changelog/220-hs-office-partner.sql index 67126766..c4491b0a 100644 --- a/src/main/resources/db/changelog/220-hs-office-partner.sql +++ b/src/main/resources/db/changelog/220-hs-office-partner.sql @@ -32,7 +32,7 @@ call create_journal('hs_office_partner_details'); create table hs_office_partner ( uuid uuid unique references RbacObject (uuid) initially deferred, - partnerNumber varchar(5), + partnerNumber numeric(5), personUuid uuid not null references hs_office_person(uuid), contactUuid uuid not null references hs_office_contact(uuid), detailsUuid uuid not null references hs_office_partner_details(uuid) on delete cascade diff --git a/src/main/resources/db/changelog/300-hs-office-membership.sql b/src/main/resources/db/changelog/300-hs-office-membership.sql index 750fd680..01e644cd 100644 --- a/src/main/resources/db/changelog/300-hs-office-membership.sql +++ b/src/main/resources/db/changelog/300-hs-office-membership.sql @@ -13,7 +13,8 @@ create table if not exists hs_office_membership uuid uuid unique references RbacObject (uuid) initially deferred, partnerUuid uuid not null references hs_office_partner(uuid), mainDebitorUuid uuid not null references hs_office_debitor(uuid), - memberNumberSuffix numeric(5) not null unique, + memberNumberSuffix char(2) not null check ( + memberNumberSuffix::text ~ '^[0-9][0-9]$'), validity daterange not null, reasonForTermination HsOfficeReasonForTermination not null default 'NONE', membershipFeeBillable boolean not null default true 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 6d182650..637c87ca 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,16 +8,18 @@ /* Creates a single membership test record. */ -create or replace procedure createHsOfficeMembershipTestData( forPartnerTradeName varchar, forMainDebitorNumber numeric ) +create or replace procedure createHsOfficeMembershipTestData( + forPartnerTradeName varchar, + forMainDebitorNumberSuffix numeric, + newMemberNumberSuffix char(2) ) language plpgsql as $$ declare - currentTask varchar; - idName varchar; - relatedPartner hs_office_partner; - relatedDebitor hs_office_debitor; - newMemberNumberSuffix numeric; + currentTask varchar; + idName varchar; + relatedPartner hs_office_partner; + relatedDebitor hs_office_debitor; begin - idName := cleanIdentifier( forPartnerTradeName || '#' || forMainDebitorNumber); + idName := cleanIdentifier( forPartnerTradeName || '#' || forMainDebitorNumberSuffix); currentTask := 'creating Membership test-data ' || idName; call defineContext(currentTask, null, 'superuser-alex@hostsharing.net', 'global#global.admin'); execute format('set local hsadminng.currentTask to %L', currentTask); @@ -25,8 +27,10 @@ begin select partner.* from hs_office_partner partner join hs_office_person person on person.uuid = partner.personUuid where person.tradeName = forPartnerTradeName into relatedPartner; - select d.* from hs_office_debitor d where d.debitorNumberSuffix = forMainDebitorNumber into relatedDebitor; - select coalesce(max(memberNumberSuffix)+1, 10001) from hs_office_membership into newMemberNumberSuffix; + select d.* from hs_office_debitor d + where d.partneruuid = relatedPartner.uuid + and d.debitorNumberSuffix = forMainDebitorNumberSuffix + into relatedDebitor; raise notice 'creating test Membership: %', idName; raise notice '- using partner (%): %', relatedPartner.uuid, relatedPartner; @@ -44,9 +48,9 @@ end; $$; do language plpgsql $$ begin - call createHsOfficeMembershipTestData('First GmbH', 11); - call createHsOfficeMembershipTestData('Second e.K.', 12); - call createHsOfficeMembershipTestData('Third OHG', 13); + call createHsOfficeMembershipTestData('First GmbH', 11, '01'); + call createHsOfficeMembershipTestData('Second e.K.', 12, '02'); + call createHsOfficeMembershipTestData('Third OHG', 13, '03'); end; $$; --// diff --git a/src/main/resources/db/changelog/318-hs-office-coopshares-test-data.sql b/src/main/resources/db/changelog/318-hs-office-coopshares-test-data.sql index 987f0aba..2bef88af 100644 --- a/src/main/resources/db/changelog/318-hs-office-coopshares-test-data.sql +++ b/src/main/resources/db/changelog/318-hs-office-coopshares-test-data.sql @@ -8,25 +8,33 @@ /* Creates a single coopSharesTransaction test record. */ -create or replace procedure createHsOfficeCoopSharesTransactionTestData(givenMembershipNumber numeric) +create or replace procedure createHsOfficeCoopSharesTransactionTestData( + givenPartnerNumber numeric, + givenMemberNumberSuffix varchar -- TODO char(2)? +) language plpgsql as $$ declare currentTask varchar; membership hs_office_membership; begin - currentTask = 'creating coopSharesTransaction test-data ' || givenMembershipNumber; + currentTask = 'creating coopSharesTransaction test-data ' || givenPartnerNumber::text || givenMemberNumberSuffix; execute format('set local hsadminng.currentTask to %L', currentTask); call defineContext(currentTask); - select m.uuid from hs_office_membership m where m.memberNumberSuffix = givenMembershipNumber into membership; + select m.uuid + from hs_office_membership m + join hs_office_partner p on p.uuid = m.partneruuid + where p.partnerNumber = givenPartnerNumber + and m.memberNumberSuffix = givenMemberNumberSuffix + into membership; - raise notice 'creating test coopSharesTransaction: %', givenMembershipNumber; + raise notice 'creating test coopSharesTransaction: %', givenPartnerNumber::text || givenMemberNumberSuffix; insert into hs_office_coopsharestransaction(uuid, membershipuuid, transactiontype, valuedate, sharecount, reference, comment) values - (uuid_generate_v4(), membership.uuid, 'SUBSCRIPTION', '2010-03-15', 4, 'ref '||givenMembershipNumber||'-1', 'initial subscription'), - (uuid_generate_v4(), membership.uuid, 'CANCELLATION', '2021-09-01', -2, 'ref '||givenMembershipNumber||'-2', 'cancelling some'), - (uuid_generate_v4(), membership.uuid, 'ADJUSTMENT', '2022-10-20', 2, 'ref '||givenMembershipNumber||'-3', 'some adjustment'); + (uuid_generate_v4(), membership.uuid, 'SUBSCRIPTION', '2010-03-15', 4, 'ref '||givenPartnerNumber::text || givenMemberNumberSuffix||'-1', 'initial subscription'), + (uuid_generate_v4(), membership.uuid, 'CANCELLATION', '2021-09-01', -2, 'ref '||givenPartnerNumber::text || givenMemberNumberSuffix||'-2', 'cancelling some'), + (uuid_generate_v4(), membership.uuid, 'ADJUSTMENT', '2022-10-20', 2, 'ref '||givenPartnerNumber::text || givenMemberNumberSuffix||'-3', 'some adjustment'); end; $$; --// @@ -37,8 +45,8 @@ end; $$; do language plpgsql $$ begin - call createHsOfficeCoopSharesTransactionTestData(10001); - call createHsOfficeCoopSharesTransactionTestData(10002); - call createHsOfficeCoopSharesTransactionTestData(10003); + call createHsOfficeCoopSharesTransactionTestData(10001, '01'); + call createHsOfficeCoopSharesTransactionTestData(10002, '02'); + call createHsOfficeCoopSharesTransactionTestData(10003, '03'); end; $$; diff --git a/src/main/resources/db/changelog/328-hs-office-coopassets-test-data.sql b/src/main/resources/db/changelog/328-hs-office-coopassets-test-data.sql index 4589ceb6..d54e77ca 100644 --- a/src/main/resources/db/changelog/328-hs-office-coopassets-test-data.sql +++ b/src/main/resources/db/changelog/328-hs-office-coopassets-test-data.sql @@ -8,25 +8,33 @@ /* Creates a single coopAssetsTransaction test record. */ -create or replace procedure createHsOfficeCoopAssetsTransactionTestData(givenMembershipNumber numeric) +create or replace procedure createHsOfficeCoopAssetsTransactionTestData( + givenPartnerNumber numeric, + givenMemberNumberSuffix char(2) + ) language plpgsql as $$ declare currentTask varchar; membership hs_office_membership; begin - currentTask = 'creating coopAssetsTransaction test-data ' || givenMembershipNumber; + currentTask = 'creating coopAssetsTransaction test-data ' || givenPartnerNumber || givenMemberNumberSuffix; execute format('set local hsadminng.currentTask to %L', currentTask); call defineContext(currentTask); - select m.uuid from hs_office_membership m where m.memberNumberSuffix = givenMembershipNumber into membership; + select m.uuid + from hs_office_membership m + join hs_office_partner p on p.uuid = m.partneruuid + where p.partnerNumber = givenPartnerNumber + and m.memberNumberSuffix = givenMemberNumberSuffix + into membership; - raise notice 'creating test coopAssetsTransaction: %', givenMembershipNumber; + raise notice 'creating test coopAssetsTransaction: %', givenPartnerNumber || givenMemberNumberSuffix; insert into hs_office_coopassetstransaction(uuid, membershipuuid, transactiontype, valuedate, assetvalue, reference, comment) values - (uuid_generate_v4(), membership.uuid, 'DEPOSIT', '2010-03-15', 320.00, 'ref '||givenMembershipNumber||'-1', 'initial deposit'), - (uuid_generate_v4(), membership.uuid, 'DISBURSAL', '2021-09-01', -128.00, 'ref '||givenMembershipNumber||'-2', 'partial disbursal'), - (uuid_generate_v4(), membership.uuid, 'ADJUSTMENT', '2022-10-20', 128.00, 'ref '||givenMembershipNumber||'-3', 'some adjustment'); + (uuid_generate_v4(), membership.uuid, 'DEPOSIT', '2010-03-15', 320.00, 'ref '||givenPartnerNumber || givenMemberNumberSuffix||'-1', 'initial deposit'), + (uuid_generate_v4(), membership.uuid, 'DISBURSAL', '2021-09-01', -128.00, 'ref '||givenPartnerNumber || givenMemberNumberSuffix||'-2', 'partial disbursal'), + (uuid_generate_v4(), membership.uuid, 'ADJUSTMENT', '2022-10-20', 128.00, 'ref '||givenPartnerNumber || givenMemberNumberSuffix||'-3', 'some adjustment'); end; $$; --// @@ -37,8 +45,8 @@ end; $$; do language plpgsql $$ begin - call createHsOfficeCoopAssetsTransactionTestData(10001); - call createHsOfficeCoopAssetsTransactionTestData(10002); - call createHsOfficeCoopAssetsTransactionTestData(10003); + call createHsOfficeCoopAssetsTransactionTestData(10001, '01'); + call createHsOfficeCoopAssetsTransactionTestData(10002, '02'); + call createHsOfficeCoopAssetsTransactionTestData(10003, '03'); end; $$; diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionControllerAcceptanceTest.java index edf0eed3..c227456d 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionControllerAcceptanceTest.java @@ -75,7 +75,7 @@ class HsOfficeCoopAssetsTransactionControllerAcceptanceTest { void globalAdmin_canFindCoopAssetsTransactionsByMemberNumberSuffix() { context.define("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000202) .get(0); RestAssured // @formatter:off @@ -118,7 +118,7 @@ class HsOfficeCoopAssetsTransactionControllerAcceptanceTest { void globalAdmin_canFindCoopAssetsTransactionsByMemberNumberSuffixAndDateRange() { context.define("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000202) .get(0); RestAssured // @formatter:off @@ -153,7 +153,7 @@ class HsOfficeCoopAssetsTransactionControllerAcceptanceTest { void globalAdmin_canAddCoopAssetsTransaction() { context.define("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10001) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000101) .get(0); final var location = RestAssured // @formatter:off @@ -199,7 +199,7 @@ class HsOfficeCoopAssetsTransactionControllerAcceptanceTest { void globalAdmin_canNotCancelMoreAssetsThanCurrentlySubscribed() { context.define("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10001) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000101) .get(0); final var location = RestAssured // @formatter:off diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionRepositoryIntegrationTest.java index bf9cc649..0db985ff 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/coopassets/HsOfficeCoopAssetsTransactionRepositoryIntegrationTest.java @@ -62,7 +62,7 @@ class HsOfficeCoopAssetsTransactionRepositoryIntegrationTest extends ContextBase // given context("superuser-alex@hostsharing.net"); final var count = coopAssetsTransactionRepo.count(); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10001) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000101) .get(0); // when @@ -96,9 +96,7 @@ class HsOfficeCoopAssetsTransactionRepositoryIntegrationTest extends ContextBase // when attempt(em, () -> { - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix( - null, - 10001).get(0); + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000101).get(0); final var newCoopAssetsTransaction = HsOfficeCoopAssetsTransactionEntity.builder() .membership(givenMembership) .transactionType(HsOfficeCoopAssetsTransactionType.DEPOSIT) @@ -161,8 +159,7 @@ class HsOfficeCoopAssetsTransactionRepositoryIntegrationTest extends ContextBase public void globalAdmin_canViewCoopAssetsTransactions_filteredByMembershipUuid() { // given context("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002) - .get(0); + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(null).get(1000202); // when final var result = coopAssetsTransactionRepo.findCoopAssetsTransactionByOptionalMembershipUuidAndDateRange( @@ -182,7 +179,7 @@ class HsOfficeCoopAssetsTransactionRepositoryIntegrationTest extends ContextBase public void globalAdmin_canViewCoopAssetsTransactions_filteredByMembershipUuidAndValueDateRange() { // given context("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000202) .get(0); // when diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionControllerAcceptanceTest.java index cd4aaffa..1212046e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionControllerAcceptanceTest.java @@ -75,7 +75,7 @@ class HsOfficeCoopSharesTransactionControllerAcceptanceTest { void globalAdmin_canFindCoopSharesTransactionsByMemberNumberSuffix() { context.define("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002).get(0); + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000202).get(0); RestAssured // @formatter:off .given().header("current-user", "superuser-alex@hostsharing.net").port(port).when().get("http://localhost/api/hs/office/coopsharestransactions?membershipUuid=" + givenMembership.getUuid()).then().log().all().assertThat().statusCode(200).contentType("application/json").body("", lenientlyEquals(""" @@ -109,7 +109,7 @@ class HsOfficeCoopSharesTransactionControllerAcceptanceTest { void globalAdmin_canFindCoopSharesTransactionsByMemberNumberSuffixAndDateRange() { context.define("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002).get(0); + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000202).get(0); RestAssured // @formatter:off .given().header("current-user", "superuser-alex@hostsharing.net").port(port).when().get("http://localhost/api/hs/office/coopsharestransactions?membershipUuid=" + givenMembership.getUuid() + "&fromValueDate=2020-01-01&toValueDate=2021-12-31").then().log().all().assertThat().statusCode(200).contentType("application/json").body("", lenientlyEquals(""" @@ -134,7 +134,7 @@ class HsOfficeCoopSharesTransactionControllerAcceptanceTest { void globalAdmin_canAddCoopSharesTransaction() { context.define("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10001).get(0); + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000101).get(0); final var location = RestAssured // @formatter:off .given().header("current-user", "superuser-alex@hostsharing.net").contentType(ContentType.JSON).body(""" @@ -165,7 +165,7 @@ class HsOfficeCoopSharesTransactionControllerAcceptanceTest { void globalAdmin_canNotCancelMoreSharesThanCurrentlySubscribed() { context.define("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10001).get(0); + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000101).get(0); final var location = RestAssured // @formatter:off .given().header("current-user", "superuser-alex@hostsharing.net").contentType(ContentType.JSON).body(""" diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionRepositoryIntegrationTest.java index 8b0c607e..85c3ebc5 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/coopshares/HsOfficeCoopSharesTransactionRepositoryIntegrationTest.java @@ -61,7 +61,7 @@ class HsOfficeCoopSharesTransactionRepositoryIntegrationTest extends ContextBase // given context("superuser-alex@hostsharing.net"); final var count = coopSharesTransactionRepo.count(); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10001) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000101) .get(0); // when @@ -95,9 +95,8 @@ class HsOfficeCoopSharesTransactionRepositoryIntegrationTest extends ContextBase // when attempt(em, () -> { - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix( - null, - 10001).get(0); + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000101) + .get(0); final var newCoopSharesTransaction = HsOfficeCoopSharesTransactionEntity.builder() .membership(givenMembership) .transactionType(HsOfficeCoopSharesTransactionType.SUBSCRIPTION) @@ -160,7 +159,7 @@ class HsOfficeCoopSharesTransactionRepositoryIntegrationTest extends ContextBase public void globalAdmin_canViewCoopSharesTransactions_filteredByMembershipUuid() { // given context("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000202) .get(0); // when @@ -181,7 +180,7 @@ class HsOfficeCoopSharesTransactionRepositoryIntegrationTest extends ContextBase public void globalAdmin_canViewCoopSharesTransactions_filteredByMembershipUuidAndValueDateRange() { // given context("superuser-alex@hostsharing.net"); - final var givenMembership = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002) + final var givenMembership = membershipRepo.findMembershipsByMemberNumber(1000202) .get(0); // when diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerAcceptanceTest.java index 1f83ae07..a5058401 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerAcceptanceTest.java @@ -61,7 +61,7 @@ class HsOfficeMembershipControllerAcceptanceTest { @PersistenceContext EntityManager em; - private static int tempMemberNumberSuffix = 20010; + private static int tempMemberNumberSuffix = 10; @Nested @Accepts({ "Membership:F(Find)" }) @@ -166,9 +166,7 @@ class HsOfficeMembershipControllerAcceptanceTest { @Test void globalAdmin_canGetArbitraryMembership() { context.define("superuser-alex@hostsharing.net"); - final var givenMembershipUuid = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix( - null, - 10001) + final var givenMembershipUuid = membershipRepo.findMembershipsByMemberNumber(1000101) .get(0) .getUuid(); @@ -197,9 +195,7 @@ class HsOfficeMembershipControllerAcceptanceTest { @Accepts({ "Membership:X(Access Control)" }) void normalUser_canNotGetUnrelatedMembership() { context.define("superuser-alex@hostsharing.net"); - final var givenMembershipUuid = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix( - null, - 10001) + final var givenMembershipUuid = membershipRepo.findMembershipsByMemberNumber(1000101) .get(0) .getUuid(); @@ -217,9 +213,7 @@ class HsOfficeMembershipControllerAcceptanceTest { @Accepts({ "Membership:X(Access Control)" }) void debitorAgentUser_canGetRelatedMembership() { context.define("superuser-alex@hostsharing.net"); - final var givenMembershipUuid = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix( - null, - 10003) + final var givenMembershipUuid = membershipRepo.findMembershipsByMemberNumber(1000303) .get(0) .getUuid(); @@ -444,7 +438,7 @@ class HsOfficeMembershipControllerAcceptanceTest { .uuid(UUID.randomUUID()) .partner(givenPartner) .mainDebitor(givenDebitor) - .memberNumberSuffix(++tempMemberNumberSuffix) + .memberNumberSuffix(toPaddedSuffix(++tempMemberNumberSuffix)) .validity(Range.closedInfinite(LocalDate.parse("2022-11-01"))) .reasonForTermination(NONE) .membershipFeeBillable(true) @@ -454,12 +448,16 @@ class HsOfficeMembershipControllerAcceptanceTest { }).assertSuccessful().returnedValue(); } + private String toPaddedSuffix(final int numericSuffix) { + return String.format("%02d", numericSuffix); + } + @BeforeEach @AfterEach void cleanup() { jpaAttempt.transacted(() -> { context.define("superuser-alex@hostsharing.net", null); - final var query = em.createQuery("DELETE FROM HsOfficeMembershipEntity m WHERE m.memberNumberSuffix >= 20000"); + final var query = em.createQuery("DELETE FROM HsOfficeMembershipEntity m WHERE m.memberNumberSuffix >= '20'"); query.executeUpdate(); }); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityUnitTest.java index 5ba69bbc..0b8d1342 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityUnitTest.java @@ -17,7 +17,7 @@ class HsOfficeMembershipEntityUnitTest { public static final LocalDate GIVEN_VALID_FROM = LocalDate.parse("2020-01-01"); final HsOfficeMembershipEntity givenMembership = HsOfficeMembershipEntity.builder() - .memberNumberSuffix(10001) + .memberNumberSuffix("01") .partner(TEST_PARTNER) .mainDebitor(TEST_DEBITOR) .validity(Range.closedInfinite(GIVEN_VALID_FROM)) @@ -27,14 +27,14 @@ class HsOfficeMembershipEntityUnitTest { void toStringContainsAllProps() { final var result = givenMembership.toString(); - assertThat(result).isEqualTo("Membership(10001, LEGAL Test Ltd., 1000100, [2020-01-01,))"); + assertThat(result).isEqualTo("Membership(1000101, LEGAL Test Ltd., 1000100, [2020-01-01,))"); } @Test void toShortStringContainsMemberNumberSuffixOnly() { final var result = givenMembership.toShortString(); - assertThat(result).isEqualTo("10001"); + assertThat(result).isEqualTo("1000101"); } @Test diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipRepositoryIntegrationTest.java index c9a8eb0d..376d1ecd 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipRepositoryIntegrationTest.java @@ -77,7 +77,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { // when final var result = attempt(em, () -> { final var newMembership = toCleanup(HsOfficeMembershipEntity.builder() - .memberNumberSuffix(20001) + .memberNumberSuffix("01") .partner(givenPartner) .mainDebitor(givenDebitor) .validity(Range.closedInfinite(LocalDate.parse("2020-01-01"))) @@ -108,7 +108,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { final var givenPartner = partnerRepo.findPartnerByOptionalNameLike("First").get(0); final var givenDebitor = debitorRepo.findDebitorByOptionalNameLike("First").get(0); final var newMembership = toCleanup(HsOfficeMembershipEntity.builder() - .memberNumberSuffix(20002) + .memberNumberSuffix("02") .partner(givenPartner) .mainDebitor(givenDebitor) .validity(Range.closedInfinite(LocalDate.parse("2020-01-01"))) @@ -179,7 +179,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { context("superuser-alex@hostsharing.net"); // when - final var result = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, null); + final var result = membershipRepo.findMembershipsByOptionalPartherNumber(null); // then exactlyTheseMembershipsAreReturned( @@ -196,21 +196,19 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { final var givenPartner = partnerRepo.findPartnerByOptionalNameLike("First").get(0); // when - final var result = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix( - givenPartner.getUuid(), - null); + final var result = membershipRepo.findMembershipsByOptionalPartherNumber(givenPartner.getUuid()); // then exactlyTheseMembershipsAreReturned(result, "Membership(10001, LEGAL First GmbH, 1000111, [2022-10-01,), NONE)"); } @Test - public void globalAdmin_withoutAssumedRole_canFindAllMembershipByMemberNumberSuffix() { + public void globalAdmin_withoutAssumedRole_canFindAllMemberships() { // given context("superuser-alex@hostsharing.net"); // when - final var result = membershipRepo.findMembershipsByOptionalPartnerUuidAndOptionalMemberNumberSuffix(null, 10002); + final var result = membershipRepo.findMembershipsByOptionalPartherNumber(null); // then exactlyTheseMembershipsAreReturned(result, "Membership(10002, LEGAL Second e.K., 1000212, [2022-10-01,), NONE)"); @@ -401,7 +399,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { }); jpaAttempt.transacted(() -> { context("superuser-alex@hostsharing.net", null); - em.createQuery("DELETE FROM HsOfficeMembershipEntity WHERE memberNumberSuffix >= 20000"); + em.createQuery("DELETE FROM HsOfficeMembershipEntity WHERE memberNumberSuffix >= '20'"); }); } @@ -411,7 +409,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { final var givenPartner = partnerRepo.findPartnerByOptionalNameLike(partnerTradeName).get(0); final var givenDebitor = debitorRepo.findDebitorByOptionalNameLike(debitorName).get(0); final var newMembership = HsOfficeMembershipEntity.builder() - .memberNumberSuffix(20002) + .memberNumberSuffix("02") .partner(givenPartner) .mainDebitor(givenDebitor) .validity(Range.closedInfinite(LocalDate.parse("2020-01-01"))) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/TestHsMembership.java b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/TestHsMembership.java index 3fc8c471..ff50eb58 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/TestHsMembership.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/TestHsMembership.java @@ -11,7 +11,7 @@ public class TestHsMembership { public static final HsOfficeMembershipEntity TEST_MEMBERSHIP = HsOfficeMembershipEntity.builder() .partner(TEST_PARTNER) - .memberNumberSuffix(300001) + .memberNumberSuffix("01") .validity(Range.closedInfinite(LocalDate.parse("2020-01-01"))) .build(); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/migration/ImportOfficeData.java b/src/test/java/net/hostsharing/hsadminng/hs/office/migration/ImportOfficeData.java index 091d1c0d..b4f97f24 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/migration/ImportOfficeData.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/migration/ImportOfficeData.java @@ -573,9 +573,10 @@ public class ImportOfficeData extends ContextBasedTest { partners.put(rec.getInteger("bp_id"), partner); if (isNotBlank(rec.getString("member_since"))) { + assertThat(rec.getInteger("member_id")).isEqualTo(partner.getPartnerNumber()); final var membership = HsOfficeMembershipEntity.builder() .partner(partner) - .memberNumberSuffix(rec.getInteger("member_id")) + .memberNumberSuffix("00") .validity(toPostgresDateRange( rec.getLocalDate("member_since"), rec.getLocalDate("member_until"))) @@ -612,7 +613,7 @@ public class ImportOfficeData extends ContextBasedTest { : HsOfficeCoopSharesTransactionType.ADJUSTMENT ) .shareCount(rec.getInteger("quantity")) - .reference(rec.getString("comment")) + .comment( rec.getString("comment")) .build(); coopShares.put(rec.getInteger("member_share_id"), shareTransaction); @@ -655,7 +656,7 @@ public class ImportOfficeData extends ContextBasedTest { .valueDate(rec.getLocalDate("date")) .transactionType(assetTypeMapping.get(rec.getString("action"))) .assetValue(rec.getBigDecimal("amount")) - .reference(rec.getString("comment")) + .comment(rec.getString("comment")) .build(); coopAssets.put(rec.getInteger("member_asset_id"), assetTransaction);