SEPA-Mandate signed date and patcher

This commit is contained in:
Michael Hoennig 2022-10-28 13:44:48 +02:00
parent 3b340a92ed
commit 64461fc4da
15 changed files with 261 additions and 34 deletions

View File

@ -18,7 +18,7 @@ import javax.persistence.*;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.UUID; import java.util.UUID;
import static net.hostsharing.hsadminng.mapper.PostgresDateRange.toPostgresDateRange; import static net.hostsharing.hsadminng.mapper.PostgresDateRange.*;
import static net.hostsharing.hsadminng.stringify.Stringify.stringify; import static net.hostsharing.hsadminng.stringify.Stringify.stringify;
@Entity @Entity
@ -73,13 +73,22 @@ public class HsOfficeMembershipEntity implements Stringifyable {
private HsOfficeReasonForTermination reasonForTermination; private HsOfficeReasonForTermination reasonForTermination;
public void setValidFrom(final LocalDate validFrom) { public void setValidFrom(final LocalDate validFrom) {
validity = toPostgresDateRange(validFrom, getValidity().upper()); setValidity(toPostgresDateRange(validFrom, getValidTo()));
} }
public void setValidTo(final LocalDate validTo) { public void setValidTo(final LocalDate validTo) {
validity = toPostgresDateRange(getValidity().lower(), validTo); setValidity(toPostgresDateRange(getValidFrom(), validTo));
} }
public LocalDate getValidFrom() {
return lowerInclusiveFromPostgresDateRange(getValidity());
}
public LocalDate getValidTo() {
return upperInclusiveFromPostgresDateRange(getValidity());
}
public Range<LocalDate> getValidity() { public Range<LocalDate> getValidity() {
if (validity == null) { if (validity == null) {
validity = Range.infinite(LocalDate.class); validity = Range.infinite(LocalDate.class);

View File

@ -1,5 +1,7 @@
package net.hostsharing.hsadminng.hs.office.sepamandate; package net.hostsharing.hsadminng.hs.office.sepamandate;
import net.hostsharing.hsadminng.hs.office.membership.HsOfficeMembershipEntityPatcher;
import net.hostsharing.hsadminng.mapper.Mapper;
import net.hostsharing.hsadminng.context.Context; import net.hostsharing.hsadminng.context.Context;
import net.hostsharing.hsadminng.hs.office.generated.api.v1.api.HsOfficeSepaMandatesApi; import net.hostsharing.hsadminng.hs.office.generated.api.v1.api.HsOfficeSepaMandatesApi;
import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeSepaMandateInsertResource; import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeSepaMandateInsertResource;
@ -32,7 +34,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
private Mapper mapper; private Mapper mapper;
@Autowired @Autowired
private HsOfficeSepaMandateRepository SepaMandateRepo; private HsOfficeSepaMandateRepository sepaMandateRepo;
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@ -45,7 +47,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
final String iban) { final String iban) {
context.define(currentUser, assumedRoles); context.define(currentUser, assumedRoles);
final var entities = SepaMandateRepo.findSepaMandateByOptionalIban(iban); final var entities = sepaMandateRepo.findSepaMandateByOptionalIban(iban);
final var resources = mapper.mapList(entities, HsOfficeSepaMandateResource.class, final var resources = mapper.mapList(entities, HsOfficeSepaMandateResource.class,
SEPA_MANDATE_ENTITY_TO_RESOURCE_POSTMAPPER); SEPA_MANDATE_ENTITY_TO_RESOURCE_POSTMAPPER);
@ -63,7 +65,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
final var entityToSave = mapper.map(body, HsOfficeSepaMandateEntity.class, SEPA_MANDATE_RESOURCE_TO_ENTITY_POSTMAPPER); final var entityToSave = mapper.map(body, HsOfficeSepaMandateEntity.class, SEPA_MANDATE_RESOURCE_TO_ENTITY_POSTMAPPER);
final var saved = SepaMandateRepo.save(entityToSave); final var saved = sepaMandateRepo.save(entityToSave);
final var uri = final var uri =
MvcUriComponentsBuilder.fromController(getClass()) MvcUriComponentsBuilder.fromController(getClass())
@ -84,7 +86,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
context.define(currentUser, assumedRoles); context.define(currentUser, assumedRoles);
final var result = SepaMandateRepo.findByUuid(sepaMandateUuid); final var result = sepaMandateRepo.findByUuid(sepaMandateUuid);
if (result.isEmpty()) { if (result.isEmpty()) {
return ResponseEntity.notFound().build(); return ResponseEntity.notFound().build();
} }
@ -100,7 +102,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
final UUID sepaMandateUuid) { final UUID sepaMandateUuid) {
context.define(currentUser, assumedRoles); context.define(currentUser, assumedRoles);
final var result = SepaMandateRepo.deleteByUuid(sepaMandateUuid); final var result = sepaMandateRepo.deleteByUuid(sepaMandateUuid);
if (result == 0) { if (result == 0) {
return ResponseEntity.notFound().build(); return ResponseEntity.notFound().build();
} }
@ -118,11 +120,11 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
context.define(currentUser, assumedRoles); context.define(currentUser, assumedRoles);
final var current = SepaMandateRepo.findByUuid(sepaMandateUuid).orElseThrow(); final var current = sepaMandateRepo.findByUuid(sepaMandateUuid).orElseThrow();
current.setValidity(toPostgresDateRange(current.getValidity().lower(), body.getValidTo())); new HsOfficeSepaMandateEntityPatcher(current).apply(body);
final var saved = SepaMandateRepo.save(current); final var saved = sepaMandateRepo.save(current);
final var mapped = mapper.map(saved, HsOfficeSepaMandateResource.class, SEPA_MANDATE_ENTITY_TO_RESOURCE_POSTMAPPER); final var mapped = mapper.map(saved, HsOfficeSepaMandateResource.class, SEPA_MANDATE_ENTITY_TO_RESOURCE_POSTMAPPER);
return ResponseEntity.ok(mapped); return ResponseEntity.ok(mapped);
} }

View File

@ -14,6 +14,7 @@ import javax.persistence.*;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.UUID; import java.util.UUID;
import static net.hostsharing.hsadminng.mapper.PostgresDateRange.*;
import static net.hostsharing.hsadminng.stringify.Stringify.stringify; import static net.hostsharing.hsadminng.stringify.Stringify.stringify;
@Entity @Entity
@ -33,6 +34,7 @@ public class HsOfficeSepaMandateEntity implements Stringifyable {
private static Stringify<HsOfficeSepaMandateEntity> stringify = stringify(HsOfficeSepaMandateEntity.class) private static Stringify<HsOfficeSepaMandateEntity> stringify = stringify(HsOfficeSepaMandateEntity.class)
.withProp(e -> e.getBankAccount().getIban()) .withProp(e -> e.getBankAccount().getIban())
.withProp(HsOfficeSepaMandateEntity::getReference) .withProp(HsOfficeSepaMandateEntity::getReference)
.withProp(HsOfficeSepaMandateEntity::getAgreement)
.withProp(e -> e.getValidity().asString()) .withProp(e -> e.getValidity().asString())
.withSeparator(", ") .withSeparator(", ")
.quotedValues(false); .quotedValues(false);
@ -51,8 +53,27 @@ public class HsOfficeSepaMandateEntity implements Stringifyable {
private @Column(name = "reference") String reference; private @Column(name = "reference") String reference;
@Column(name="agreement", columnDefinition = "date")
private LocalDate agreement;
@Column(name = "validity", columnDefinition = "daterange") @Column(name = "validity", columnDefinition = "daterange")
private Range<LocalDate> validity; private Range<LocalDate> validity = Range.infinite(LocalDate.class);
public void setValidFrom(final LocalDate validFrom) {
setValidity(toPostgresDateRange(validFrom, getValidTo()));
}
public void setValidTo(final LocalDate validTo) {
setValidity(toPostgresDateRange(getValidFrom(), validTo));
}
public LocalDate getValidFrom() {
return lowerInclusiveFromPostgresDateRange(getValidity());
}
public LocalDate getValidTo() {
return upperInclusiveFromPostgresDateRange(getValidity());
}
@Override @Override
public String toString() { public String toString() {
@ -63,4 +84,5 @@ public class HsOfficeSepaMandateEntity implements Stringifyable {
public String toShortString() { public String toShortString() {
return reference; return reference;
} }
} }

View File

@ -0,0 +1,26 @@
package net.hostsharing.hsadminng.hs.office.sepamandate;
import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeSepaMandatePatchResource;
import net.hostsharing.hsadminng.mapper.EntityPatcher;
import net.hostsharing.hsadminng.mapper.OptionalFromJson;
public class HsOfficeSepaMandateEntityPatcher implements EntityPatcher<HsOfficeSepaMandatePatchResource> {
private final HsOfficeSepaMandateEntity entity;
public HsOfficeSepaMandateEntityPatcher(final HsOfficeSepaMandateEntity entity) {
this.entity = entity;
}
@Override
public void apply(final HsOfficeSepaMandatePatchResource resource) {
OptionalFromJson.of(resource.getReference()).ifPresent(
entity::setReference);
OptionalFromJson.of(resource.getAgreement()).ifPresent(
entity::setAgreement);
OptionalFromJson.of(resource.getValidFrom()).ifPresent(
entity::setValidFrom);
OptionalFromJson.of(resource.getValidTo()).ifPresent(
entity::setValidTo);
}
}

View File

@ -9,14 +9,25 @@ import java.time.LocalDate;
public class PostgresDateRange { public class PostgresDateRange {
public static Range<LocalDate> toPostgresDateRange( public static Range<LocalDate> toPostgresDateRange(
final LocalDate validFrom, final LocalDate lowerInclusive,
final LocalDate validTo) { final LocalDate upperInclusive) {
return validFrom != null return lowerInclusive != null
? validTo != null ? upperInclusive != null
? Range.closedOpen(validFrom, validTo.plusDays(1)) ? Range.closedOpen(lowerInclusive, upperInclusive.plusDays(1))
: Range.closedInfinite(validFrom) : Range.closedInfinite(lowerInclusive)
: validTo != null : upperInclusive != null
? Range.infiniteOpen(validTo.plusDays(1)) ? Range.infiniteOpen(upperInclusive.plusDays(1))
: Range.infinite(LocalDate.class); : Range.infinite(LocalDate.class);
} }
public static LocalDate lowerInclusiveFromPostgresDateRange(
final Range<LocalDate> range) {
return range.lower();
}
public static LocalDate upperInclusiveFromPostgresDateRange(
final Range<LocalDate> range) {
return range.upper() != null ? range.upper().minusDays(1) : null;
}
} }

View File

@ -29,7 +29,7 @@ map:
null: org.openapitools.jackson.nullable.JsonNullable null: org.openapitools.jackson.nullable.JsonNullable
/api/hs/office/debitors/{debitorUUID}: /api/hs/office/debitors/{debitorUUID}:
null: org.openapitools.jackson.nullable.JsonNullable null: org.openapitools.jackson.nullable.JsonNullable
/api/hs/office/sepamandates/{debitorUUID}: /api/hs/office/sepamandates/{sepaMandateUUID}:
null: org.openapitools.jackson.nullable.JsonNullable null: org.openapitools.jackson.nullable.JsonNullable
/api/hs/office/memberships/{membershipUUID}: /api/hs/office/memberships/{membershipUUID}:
null: org.openapitools.jackson.nullable.JsonNullable null: org.openapitools.jackson.nullable.JsonNullable

View File

@ -15,6 +15,9 @@ components:
$ref: './hs-office-bankaccount-schemas.yaml#/components/schemas/HsOfficeBankAccount' $ref: './hs-office-bankaccount-schemas.yaml#/components/schemas/HsOfficeBankAccount'
reference: reference:
type: string type: string
agreement:
type: string
format: date
validFrom: validFrom:
type: string type: string
format: date format: date
@ -25,9 +28,21 @@ components:
HsOfficeSepaMandatePatch: HsOfficeSepaMandatePatch:
type: object type: object
properties: properties:
reference:
type: string
nullable: true
agreement:
type: string
format: date
nullable: true
validFrom:
type: string
format: date
nullable: true
validTo: validTo:
type: string type: string
format: date format: date
nullable: true
additionalProperties: false additionalProperties: false
HsOfficeSepaMandateInsert: HsOfficeSepaMandateInsert:
@ -44,6 +59,10 @@ components:
reference: reference:
type: string type: string
nullable: false nullable: false
agreement:
type: string
format: date
nullable: false
validFrom: validFrom:
type: string type: string
format: date format: date
@ -56,5 +75,6 @@ components:
- debitorUuid - debitorUuid
- bankAccountUuid - bankAccountUuid
- reference - reference
- agreement
- validFrom - validFrom
additionalProperties: false additionalProperties: false

View File

@ -10,6 +10,7 @@ create table if not exists hs_office_sepamandate
debitorUuid uuid not null references hs_office_debitor(uuid), debitorUuid uuid not null references hs_office_debitor(uuid),
bankAccountUuid uuid not null references hs_office_bankaccount(uuid), bankAccountUuid uuid not null references hs_office_bankaccount(uuid),
reference varchar(96) not null, reference varchar(96) not null,
agreement date not null,
validity daterange not null validity daterange not null
); );
--// --//

View File

@ -102,6 +102,7 @@ call generateRbacIdentityView('hs_office_sepamandate', idNameExpression => 'targ
call generateRbacRestrictedView('hs_office_sepamandate', call generateRbacRestrictedView('hs_office_sepamandate',
orderby => 'target.reference', orderby => 'target.reference',
columnUpdates => $updates$ columnUpdates => $updates$
agreement = new.agreement,
validity = new.validity validity = new.validity
$updates$); $updates$);
--// --//

View File

@ -31,8 +31,8 @@ begin
raise notice '- using debitor (%): %', relatedDebitor.uuid, relatedDebitor; raise notice '- using debitor (%): %', relatedDebitor.uuid, relatedDebitor;
raise notice '- using bankAccount (%): %', relatedBankAccount.uuid, relatedBankAccount; raise notice '- using bankAccount (%): %', relatedBankAccount.uuid, relatedBankAccount;
insert insert
into hs_office_sepamandate (uuid, debitoruuid, bankAccountuuid, reference, validity) into hs_office_sepamandate (uuid, debitoruuid, bankAccountuuid, reference, agreement, validity)
values (uuid_generate_v4(), relatedDebitor.uuid, relatedBankAccount.uuid, 'ref'||idName, daterange('20221001' , '20261231', '[]')); values (uuid_generate_v4(), relatedDebitor.uuid, relatedBankAccount.uuid, 'ref'||idName, '20220930', daterange('20221001' , '20261231', '[]'));
end; $$; end; $$;
--// --//

View File

@ -15,6 +15,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class HsOfficeMembershipEntityUnitTest { class HsOfficeMembershipEntityUnitTest {
public static final LocalDate GIVEN_VALID_FROM = LocalDate.parse("2020-01-01"); public static final LocalDate GIVEN_VALID_FROM = LocalDate.parse("2020-01-01");
final HsOfficeMembershipEntity givenMembership = HsOfficeMembershipEntity.builder() final HsOfficeMembershipEntity givenMembership = HsOfficeMembershipEntity.builder()
.memberNumber(10001) .memberNumber(10001)
.partner(TEST_PARTNER) .partner(TEST_PARTNER)
@ -53,10 +54,20 @@ class HsOfficeMembershipEntityUnitTest {
assertThat(givenMembership.getReasonForTermination()).isEqualTo(HsOfficeReasonForTermination.CANCELLATION); assertThat(givenMembership.getReasonForTermination()).isEqualTo(HsOfficeReasonForTermination.CANCELLATION);
} }
@Test
void settingValidFromKeepsValidTo() {
givenMembership.setValidFrom(LocalDate.parse("2020-01-01"));
assertThat(givenMembership.getValidFrom()).isEqualTo(LocalDate.parse("2020-01-01"));
assertThat(givenMembership.getValidTo()).isNull();
}
@Test @Test
void settingValidToKeepsValidFrom() { void settingValidToKeepsValidFrom() {
givenMembership.setValidTo(LocalDate.parse("2024-12-31")); givenMembership.setValidTo(LocalDate.parse("2024-12-31"));
assertThat(givenMembership.getValidity().lower()).isEqualTo(GIVEN_VALID_FROM); assertThat(givenMembership.getValidFrom()).isEqualTo(GIVEN_VALID_FROM);
assertThat(givenMembership.getValidTo()).isEqualTo(LocalDate.parse("2024-12-31"));
} }
private static void invokePrePersist(final HsOfficeMembershipEntity membershipEntity) private static void invokePrePersist(final HsOfficeMembershipEntity membershipEntity)

View File

@ -134,6 +134,7 @@ class HsOfficeSepaMandateControllerAcceptanceTest {
"debitorUuid": "%s", "debitorUuid": "%s",
"bankAccountUuid": "%s", "bankAccountUuid": "%s",
"reference": "temp ref CAT A", "reference": "temp ref CAT A",
"agreement": "2020-01-02",
"validFrom": "2022-10-13" "validFrom": "2022-10-13"
} }
""".formatted(givenDebitor.getUuid(), givenBankAccount.getUuid())) """.formatted(givenDebitor.getUuid(), givenBankAccount.getUuid()))
@ -200,6 +201,7 @@ class HsOfficeSepaMandateControllerAcceptanceTest {
"debitorUuid": "%s", "debitorUuid": "%s",
"bankAccountUuid": "%s", "bankAccountUuid": "%s",
"reference": "temp ref CAT C", "reference": "temp ref CAT C",
"agreement": "2022-10-12",
"validFrom": "2022-10-13", "validFrom": "2022-10-13",
"validTo": "2024-12-31" "validTo": "2024-12-31"
} }
@ -229,6 +231,7 @@ class HsOfficeSepaMandateControllerAcceptanceTest {
"debitorUuid": "%s", "debitorUuid": "%s",
"bankAccountUuid": "%s", "bankAccountUuid": "%s",
"reference": "temp refCAT D", "reference": "temp refCAT D",
"agreement": "2022-10-12",
"validFrom": "2022-10-13", "validFrom": "2022-10-13",
"validTo": "2024-12-31" "validTo": "2024-12-31"
} }
@ -403,7 +406,7 @@ class HsOfficeSepaMandateControllerAcceptanceTest {
// finally, the sepaMandate is actually updated // finally, the sepaMandate is actually updated
assertThat(sepaMandateRepo.findByUuid(givenSepaMandate.getUuid())).isPresent().get() assertThat(sepaMandateRepo.findByUuid(givenSepaMandate.getUuid())).isPresent().get()
.matches(mandate -> { .matches(mandate -> {
assertThat(mandate.getValidity().asString()).isEqualTo("[2022-11-01,)"); assertThat(mandate.getValidity().asString()).isEqualTo("[2022-11-01,2023-03-31)");
return true; return true;
}); });
} }
@ -480,6 +483,7 @@ class HsOfficeSepaMandateControllerAcceptanceTest {
.debitor(givenDebitor) .debitor(givenDebitor)
.bankAccount(givenBankAccount) .bankAccount(givenBankAccount)
.reference("temp ref CAT Z") .reference("temp ref CAT Z")
.agreement(LocalDate.parse("2022-10-31"))
.validity(Range.closedOpen( .validity(Range.closedOpen(
LocalDate.parse("2022-11-01"), LocalDate.parse("2023-03-31"))) LocalDate.parse("2022-11-01"), LocalDate.parse("2023-03-31")))
.build(); .build();

View File

@ -0,0 +1,98 @@
package net.hostsharing.hsadminng.hs.office.sepamandate;
import com.vladmihalcea.hibernate.type.range.Range;
import net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorEntity;
import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeSepaMandatePatchResource;
import net.hostsharing.test.PatchUnitTestBase;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import javax.persistence.EntityManager;
import java.time.LocalDate;
import java.util.UUID;
import java.util.stream.Stream;
import static net.hostsharing.hsadminng.hs.office.bankaccount.TestHsOfficeBankAccount.TEST_BANK_ACCOUNT;
import static net.hostsharing.hsadminng.hs.office.debitor.TestHsOfficeDebitor.TEST_DEBITOR;
import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.lenient;
@TestInstance(PER_CLASS)
@ExtendWith(MockitoExtension.class)
class HsOfficeSepaMandateEntityPatcherUnitTest extends PatchUnitTestBase<
HsOfficeSepaMandatePatchResource,
HsOfficeSepaMandateEntity
> {
private static final UUID INITIAL_SepaMandate_UUID = UUID.randomUUID();
private static final LocalDate GIVEN_VALID_FROM = LocalDate.parse("2020-04-15");
private static final LocalDate PATCHED_VALID_FROM = LocalDate.parse("2022-10-30");
private static final LocalDate PATCHED_VALID_TO = LocalDate.parse("2022-12-31");
private static final LocalDate PATCHED_AGREEMENT = LocalDate.parse("2022-11-01");
private static final String PATCHED_REFERENCE = "ref sepamandate-patched";
@Mock
private EntityManager em;
@BeforeEach
void initMocks() {
lenient().when(em.getReference(eq(HsOfficeDebitorEntity.class), any())).thenAnswer(invocation ->
HsOfficeDebitorEntity.builder().uuid(invocation.getArgument(1)).build());
lenient().when(em.getReference(eq(HsOfficeSepaMandateEntity.class), any())).thenAnswer(invocation ->
HsOfficeSepaMandateEntity.builder().uuid(invocation.getArgument(1)).build());
}
@Override
protected HsOfficeSepaMandateEntity newInitialEntity() {
final var entity = new HsOfficeSepaMandateEntity();
entity.setUuid(INITIAL_SepaMandate_UUID);
entity.setDebitor(TEST_DEBITOR);
entity.setBankAccount(TEST_BANK_ACCOUNT);
entity.setReference("ref sepamandate");
entity.setAgreement(LocalDate.parse("2022-10-28"));
entity.setValidity(Range.closedInfinite(GIVEN_VALID_FROM));
return entity;
}
@Override
protected HsOfficeSepaMandatePatchResource newPatchResource() {
return new HsOfficeSepaMandatePatchResource();
}
@Override
protected HsOfficeSepaMandateEntityPatcher createPatcher(final HsOfficeSepaMandateEntity sepaMandate) {
return new HsOfficeSepaMandateEntityPatcher(sepaMandate);
}
@Override
protected Stream<Property> propertyTestDescriptors() {
return Stream.of(
new JsonNullableProperty<>(
"reference",
HsOfficeSepaMandatePatchResource::setReference,
PATCHED_REFERENCE,
HsOfficeSepaMandateEntity::setReference),
new JsonNullableProperty<>(
"agreement",
HsOfficeSepaMandatePatchResource::setAgreement,
PATCHED_AGREEMENT,
HsOfficeSepaMandateEntity::setAgreement),
new JsonNullableProperty<>(
"validfrom",
HsOfficeSepaMandatePatchResource::setValidFrom,
PATCHED_VALID_FROM,
HsOfficeSepaMandateEntity::setValidFrom),
new JsonNullableProperty<>(
"validto",
HsOfficeSepaMandatePatchResource::setValidTo,
PATCHED_VALID_TO,
HsOfficeSepaMandateEntity::setValidTo)
);
}
}

View File

@ -7,14 +7,17 @@ import org.junit.jupiter.api.Test;
import java.time.LocalDate; import java.time.LocalDate;
import static net.hostsharing.hsadminng.hs.office.debitor.TestHsOfficeDebitor.TEST_DEBITOR; import static net.hostsharing.hsadminng.hs.office.debitor.TestHsOfficeDebitor.TEST_DEBITOR;
import static net.hostsharing.hsadminng.mapper.PostgresDateRange.toPostgresDateRange;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
class HsOfficeSepaMandateEntityUnitTest { class HsOfficeSepaMandateEntityUnitTest {
public static final LocalDate GIVEN_VALID_FROM = LocalDate.parse("2020-01-01");
public static final LocalDate GIVEN_VALID_TO = LocalDate.parse("2030-12-31");
final HsOfficeSepaMandateEntity givenSepaMandate = HsOfficeSepaMandateEntity.builder() final HsOfficeSepaMandateEntity givenSepaMandate = HsOfficeSepaMandateEntity.builder()
.debitor(TEST_DEBITOR) .debitor(TEST_DEBITOR)
.reference("some-ref") .reference("some-ref")
.validity(Range.closedOpen(LocalDate.parse("2020-01-01"), LocalDate.parse("2031-01-01"))) .validity(toPostgresDateRange(GIVEN_VALID_FROM, GIVEN_VALID_TO))
.bankAccount(HsOfficeBankAccountEntity.builder().iban("some label").build()) .bankAccount(HsOfficeBankAccountEntity.builder().iban("some label").build())
.build(); .build();
@ -31,4 +34,20 @@ class HsOfficeSepaMandateEntityUnitTest {
assertThat(result).isEqualTo("some-ref"); assertThat(result).isEqualTo("some-ref");
} }
@Test
void settingValidFromKeepsValidTo() {
givenSepaMandate.setValidFrom(LocalDate.parse("2023-12-31"));
assertThat(givenSepaMandate.getValidFrom()).isEqualTo(LocalDate.parse("2023-12-31"));
assertThat(givenSepaMandate.getValidTo()).isEqualTo(GIVEN_VALID_TO);
}
@Test
void settingValidToKeepsValidFrom() {
givenSepaMandate.setValidTo(LocalDate.parse("2024-12-31"));
assertThat(givenSepaMandate.getValidFrom()).isEqualTo(GIVEN_VALID_FROM);
assertThat(givenSepaMandate.getValidTo()).isEqualTo(LocalDate.parse("2024-12-31"));
}
} }

View File

@ -78,6 +78,7 @@ class HsOfficeSepaMandateRepositoryIntegrationTest extends ContextBasedTest {
.debitor(givenDebitor) .debitor(givenDebitor)
.bankAccount(givenBankAccount) .bankAccount(givenBankAccount)
.reference("temp ref A") .reference("temp ref A")
.agreement(LocalDate.parse( "2020-01-02"))
.validity(Range.closedOpen( .validity(Range.closedOpen(
LocalDate.parse("2020-01-01"), LocalDate.parse("2023-01-01"))) LocalDate.parse("2020-01-01"), LocalDate.parse("2023-01-01")))
.build(); .build();
@ -110,6 +111,7 @@ class HsOfficeSepaMandateRepositoryIntegrationTest extends ContextBasedTest {
.debitor(givenDebitor) .debitor(givenDebitor)
.bankAccount(givenBankAccount) .bankAccount(givenBankAccount)
.reference("temp ref B") .reference("temp ref B")
.agreement(LocalDate.parse("2020-01-02"))
.validity(Range.closedOpen( .validity(Range.closedOpen(
LocalDate.parse("2020-01-01"), LocalDate.parse("2023-01-01"))) LocalDate.parse("2020-01-01"), LocalDate.parse("2023-01-01")))
.build(); .build();
@ -178,9 +180,9 @@ class HsOfficeSepaMandateRepositoryIntegrationTest extends ContextBasedTest {
// then // then
allTheseSepaMandatesAreReturned( allTheseSepaMandatesAreReturned(
result, result,
"SEPA-Mandate(DE02120300000000202051, refFirstGmbH, [2022-10-01,2027-01-01))", "SEPA-Mandate(DE02120300000000202051, refFirstGmbH, 2022-09-30, [2022-10-01,2027-01-01))",
"SEPA-Mandate(DE02100500000054540402, refSeconde.K., [2022-10-01,2027-01-01))", "SEPA-Mandate(DE02100500000054540402, refSeconde.K., 2022-09-30, [2022-10-01,2027-01-01))",
"SEPA-Mandate(DE02300209000106531065, refThirdOHG, [2022-10-01,2027-01-01))"); "SEPA-Mandate(DE02300209000106531065, refThirdOHG, 2022-09-30, [2022-10-01,2027-01-01))");
} }
@Test @Test
@ -194,7 +196,7 @@ class HsOfficeSepaMandateRepositoryIntegrationTest extends ContextBasedTest {
// then: // then:
exactlyTheseSepaMandatesAreReturned( exactlyTheseSepaMandatesAreReturned(
result, result,
"SEPA-Mandate(DE02120300000000202051, refFirstGmbH, [2022-10-01,2027-01-01))"); "SEPA-Mandate(DE02120300000000202051, refFirstGmbH, 2022-09-30, [2022-10-01,2027-01-01))");
} }
} }
@ -212,9 +214,9 @@ class HsOfficeSepaMandateRepositoryIntegrationTest extends ContextBasedTest {
// then // then
exactlyTheseSepaMandatesAreReturned( exactlyTheseSepaMandatesAreReturned(
result, result,
"SEPA-Mandate(DE02120300000000202051, refFirstGmbH, [2022-10-01,2027-01-01))", "SEPA-Mandate(DE02120300000000202051, refFirstGmbH, 2022-09-30, [2022-10-01,2027-01-01))",
"SEPA-Mandate(DE02100500000054540402, refSeconde.K., [2022-10-01,2027-01-01))", "SEPA-Mandate(DE02100500000054540402, refSeconde.K., 2022-09-30, [2022-10-01,2027-01-01))",
"SEPA-Mandate(DE02300209000106531065, refThirdOHG, [2022-10-01,2027-01-01))"); "SEPA-Mandate(DE02300209000106531065, refThirdOHG, 2022-09-30, [2022-10-01,2027-01-01))");
} }
@Test @Test
@ -228,7 +230,7 @@ class HsOfficeSepaMandateRepositoryIntegrationTest extends ContextBasedTest {
// then // then
exactlyTheseSepaMandatesAreReturned( exactlyTheseSepaMandatesAreReturned(
result, result,
"SEPA-Mandate(DE02300209000106531065, refThirdOHG, [2022-10-01,2027-01-01))"); "SEPA-Mandate(DE02300209000106531065, refThirdOHG, 2022-09-30, [2022-10-01,2027-01-01))");
} }
} }
@ -420,6 +422,7 @@ class HsOfficeSepaMandateRepositoryIntegrationTest extends ContextBasedTest {
.debitor(givenDebitor) .debitor(givenDebitor)
.bankAccount(givenBankAccount) .bankAccount(givenBankAccount)
.reference("temp ref X") .reference("temp ref X")
.agreement(LocalDate.parse( "2020-01-02"))
.validity(Range.closedOpen( .validity(Range.closedOpen(
LocalDate.parse("2020-01-01"), LocalDate.parse("2023-01-01"))) LocalDate.parse("2020-01-01"), LocalDate.parse("2023-01-01")))
.build(); .build();