SEPA-Mandate signed date and patcher
This commit is contained in:
parent
3b340a92ed
commit
64461fc4da
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
);
|
);
|
||||||
--//
|
--//
|
||||||
|
@ -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$);
|
||||||
--//
|
--//
|
||||||
|
@ -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; $$;
|
||||||
--//
|
--//
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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();
|
||||||
|
@ -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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -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"));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user