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 14528c2f..b5846324 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 @@ -59,8 +59,8 @@ public class HsOfficeMembershipEntity implements HasUuid, Stringifyable { @Type(PostgreSQLRangeType.class) private Range validity; - @Column(name = "membership_fee_billable") - private boolean membershipFeeBillable; + @Column(name = "membershipfeebillable", nullable = false) + private Boolean membershipFeeBillable; // not primitive to force setting the value @Column(name = "reasonfortermination") @Enumerated(EnumType.STRING) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityPatcher.java index f163434f..59fa6070 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityPatcher.java @@ -37,6 +37,8 @@ public class HsOfficeMembershipEntityPatcher implements EntityPatcher mapper.map(v, HsOfficeReasonForTermination.class)) .ifPresent(entity::setReasonForTermination); + OptionalFromJson.of(resource.getMembershipFeeBillable()).ifPresent( + entity::setMembershipFeeBillable); } private void verifyNotNull(final UUID newValue, final String propertyName) { diff --git a/src/main/resources/api-definition/hs-office/hs-office-membership-schemas.yaml b/src/main/resources/api-definition/hs-office/hs-office-membership-schemas.yaml index fd27412a..74c8143b 100644 --- a/src/main/resources/api-definition/hs-office/hs-office-membership-schemas.yaml +++ b/src/main/resources/api-definition/hs-office/hs-office-membership-schemas.yaml @@ -33,6 +33,8 @@ components: format: date reasonForTermination: $ref: '#/components/schemas/HsOfficeReasonForTermination' + membershipFeeBillable: + type: boolean HsOfficeMembershipPatch: type: object @@ -48,6 +50,9 @@ components: reasonForTermination: nullable: true $ref: '#/components/schemas/HsOfficeReasonForTermination' + membershipFeeBillable: + nullable: true + type: boolean additionalProperties: false HsOfficeMembershipInsert: @@ -74,8 +79,12 @@ components: nullable: true reasonForTermination: $ref: '#/components/schemas/HsOfficeReasonForTermination' + membershipFeeBillable: + nullable: false + type: boolean required: - partnerUuid - mainDebitorUuid - validFrom + - membershipFeeBillable additionalProperties: false 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 69f21799..12f2dd34 100644 --- a/src/main/resources/db/changelog/300-hs-office-membership.sql +++ b/src/main/resources/db/changelog/300-hs-office-membership.sql @@ -16,7 +16,7 @@ create table if not exists hs_office_membership memberNumber numeric(5) not null unique, validity daterange not null, reasonForTermination HsOfficeReasonForTermination not null default 'NONE', - membership_fee_billable boolean not null default true + membershipFeeBillable boolean not null default true ); --// diff --git a/src/main/resources/db/changelog/303-hs-office-membership-rbac.sql b/src/main/resources/db/changelog/303-hs-office-membership-rbac.sql index 5f749445..972021e7 100644 --- a/src/main/resources/db/changelog/303-hs-office-membership-rbac.sql +++ b/src/main/resources/db/changelog/303-hs-office-membership-rbac.sql @@ -106,7 +106,7 @@ call generateRbacRestrictedView('hs_office_membership', columnUpdates => $updates$ validity = new.validity, reasonForTermination = new.reasonForTermination, - membership_fee_billable = new.membership_fee_billable + membershipFeeBillable = new.membershipFeeBillable $updates$); --// 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 199d09f6..243a6fe2 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 @@ -131,7 +131,8 @@ class HsOfficeMembershipControllerAcceptanceTest { "partnerUuid": "%s", "mainDebitorUuid": "%s", "memberNumber": 20001, - "validFrom": "2022-10-13" + "validFrom": "2022-10-13", + "membershipFeeBillable": "true" } """.formatted(givenPartner.getUuid(), givenDebitor.getUuid())) .port(port) @@ -446,6 +447,7 @@ class HsOfficeMembershipControllerAcceptanceTest { .memberNumber(++tempMemberNumber) .validity(Range.closedInfinite(LocalDate.parse("2022-11-01"))) .reasonForTermination(NONE) + .membershipFeeBillable(true) .build(); return membershipRepo.save(newMembership); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java index a2aebfce..2f42cb58 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java @@ -72,7 +72,8 @@ public class HsOfficeMembershipControllerRestTest { "partnerUuid": null, "mainDebitorUuid": "%s", "memberNumber": 20001, - "validFrom": "2022-10-13" + "validFrom": "2022-10-13", + "membershipFeeBillable": "true" } """.formatted(UUID.randomUUID())) .accept(MediaType.APPLICATION_JSON)) @@ -97,7 +98,8 @@ public class HsOfficeMembershipControllerRestTest { "partnerUuid": "%s", "mainDebitorUuid": null, "memberNumber": 20001, - "validFrom": "2022-10-13" + "validFrom": "2022-10-13", + "membershipFeeBillable": "true" } """.formatted(UUID.randomUUID())) .accept(MediaType.APPLICATION_JSON)) @@ -128,7 +130,8 @@ public class HsOfficeMembershipControllerRestTest { "partnerUuid": "%s", "mainDebitorUuid": "%s", "memberNumber": 20001, - "validFrom": "2022-10-13" + "validFrom": "2022-10-13", + "membershipFeeBillable": "true" } """.formatted(givenPartnerUuid, givenMainDebitorUuid)) .accept(MediaType.APPLICATION_JSON)) @@ -159,7 +162,8 @@ public class HsOfficeMembershipControllerRestTest { "partnerUuid": "%s", "mainDebitorUuid": "%s", "memberNumber": 20001, - "validFrom": "2022-10-13" + "validFrom": "2022-10-13", + "membershipFeeBillable": "true" } """.formatted(givenPartnerUuid, givenMainDebitorUuid)) .accept(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityPatcherUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityPatcherUnitTest.java index 25f68f4b..ee4944c1 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityPatcherUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipEntityPatcherUnitTest.java @@ -36,6 +36,9 @@ class HsOfficeMembershipEntityPatcherUnitTest extends PatchUnitTestBase< private static final LocalDate GIVEN_VALID_FROM = LocalDate.parse("2020-04-15"); private static final LocalDate PATCHED_VALID_TO = LocalDate.parse("2022-12-31"); + private static final Boolean GIVEN_MEMBERSHIP_FEE_BILLABLE = true; + private static final Boolean PATCHED_MEMBERSHIP_FEE_BILLABLE = false; + @Mock private EntityManager em; @@ -56,6 +59,7 @@ class HsOfficeMembershipEntityPatcherUnitTest extends PatchUnitTestBase< entity.setMainDebitor(TEST_DEBITOR); entity.setPartner(TEST_PARTNER); entity.setValidity(Range.closedInfinite(GIVEN_VALID_FROM)); + entity.setMembershipFeeBillable(GIVEN_MEMBERSHIP_FEE_BILLABLE); return entity; } @@ -90,7 +94,12 @@ class HsOfficeMembershipEntityPatcherUnitTest extends PatchUnitTestBase< HsOfficeReasonForTerminationResource.CANCELLATION, HsOfficeMembershipEntity::setReasonForTermination, HsOfficeReasonForTermination.CANCELLATION) - .notNullable() + .notNullable(), + new JsonNullableProperty<>( + "membershipFeeBillable", + HsOfficeMembershipPatchResource::setMembershipFeeBillable, + PATCHED_MEMBERSHIP_FEE_BILLABLE, + HsOfficeMembershipEntity::setMembershipFeeBillable) ); } @@ -99,10 +108,4 @@ class HsOfficeMembershipEntityPatcherUnitTest extends PatchUnitTestBase< newDebitor.setUuid(uuid); return newDebitor; } - - private HsOfficeMembershipEntity newMembership(final UUID uuid) { - final var newMembership = new HsOfficeMembershipEntity(); - newMembership.setUuid(uuid); - return newMembership; - } } 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 50f18b64..c6de2a44 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 @@ -81,6 +81,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { .partner(givenPartner) .mainDebitor(givenDebitor) .validity(Range.closedInfinite(LocalDate.parse("2020-01-01"))) + .membershipFeeBillable(true) .build()); return membershipRepo.save(newMembership); }); @@ -111,6 +112,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { .partner(givenPartner) .mainDebitor(givenDebitor) .validity(Range.closedInfinite(LocalDate.parse("2020-01-01"))) + .membershipFeeBillable(true) .build()); return membershipRepo.save(newMembership); }); @@ -416,6 +418,7 @@ class HsOfficeMembershipRepositoryIntegrationTest extends ContextBasedTest { .partner(givenPartner) .mainDebitor(givenDebitor) .validity(Range.closedInfinite(LocalDate.parse("2020-01-01"))) + .membershipFeeBillable(true) .build(); toCleanup(newMembership);