1
0

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.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;
@Entity
@ -73,13 +73,22 @@ public class HsOfficeMembershipEntity implements Stringifyable {
private HsOfficeReasonForTermination reasonForTermination;
public void setValidFrom(final LocalDate validFrom) {
validity = toPostgresDateRange(validFrom, getValidity().upper());
setValidity(toPostgresDateRange(validFrom, getValidTo()));
}
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() {
if (validity == null) {
validity = Range.infinite(LocalDate.class);

View File

@ -1,5 +1,7 @@
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.hs.office.generated.api.v1.api.HsOfficeSepaMandatesApi;
import net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeSepaMandateInsertResource;
@ -32,7 +34,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
private Mapper mapper;
@Autowired
private HsOfficeSepaMandateRepository SepaMandateRepo;
private HsOfficeSepaMandateRepository sepaMandateRepo;
@PersistenceContext
private EntityManager em;
@ -45,7 +47,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
final String iban) {
context.define(currentUser, assumedRoles);
final var entities = SepaMandateRepo.findSepaMandateByOptionalIban(iban);
final var entities = sepaMandateRepo.findSepaMandateByOptionalIban(iban);
final var resources = mapper.mapList(entities, HsOfficeSepaMandateResource.class,
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 saved = SepaMandateRepo.save(entityToSave);
final var saved = sepaMandateRepo.save(entityToSave);
final var uri =
MvcUriComponentsBuilder.fromController(getClass())
@ -84,7 +86,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
context.define(currentUser, assumedRoles);
final var result = SepaMandateRepo.findByUuid(sepaMandateUuid);
final var result = sepaMandateRepo.findByUuid(sepaMandateUuid);
if (result.isEmpty()) {
return ResponseEntity.notFound().build();
}
@ -100,7 +102,7 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
final UUID sepaMandateUuid) {
context.define(currentUser, assumedRoles);
final var result = SepaMandateRepo.deleteByUuid(sepaMandateUuid);
final var result = sepaMandateRepo.deleteByUuid(sepaMandateUuid);
if (result == 0) {
return ResponseEntity.notFound().build();
}
@ -118,11 +120,11 @@ public class HsOfficeSepaMandateController implements HsOfficeSepaMandatesApi {
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);
return ResponseEntity.ok(mapped);
}

View File

@ -14,6 +14,7 @@ import javax.persistence.*;
import java.time.LocalDate;
import java.util.UUID;
import static net.hostsharing.hsadminng.mapper.PostgresDateRange.*;
import static net.hostsharing.hsadminng.stringify.Stringify.stringify;
@Entity
@ -33,6 +34,7 @@ public class HsOfficeSepaMandateEntity implements Stringifyable {
private static Stringify<HsOfficeSepaMandateEntity> stringify = stringify(HsOfficeSepaMandateEntity.class)
.withProp(e -> e.getBankAccount().getIban())
.withProp(HsOfficeSepaMandateEntity::getReference)
.withProp(HsOfficeSepaMandateEntity::getAgreement)
.withProp(e -> e.getValidity().asString())
.withSeparator(", ")
.quotedValues(false);
@ -51,8 +53,27 @@ public class HsOfficeSepaMandateEntity implements Stringifyable {
private @Column(name = "reference") String reference;
@Column(name="agreement", columnDefinition = "date")
private LocalDate agreement;
@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
public String toString() {
@ -63,4 +84,5 @@ public class HsOfficeSepaMandateEntity implements Stringifyable {
public String toShortString() {
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);
}
}