diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/CouponPeriodService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/CouponPeriodService.java index 96e55f284..e6bf52ebe 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/CouponPeriodService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/CouponPeriodService.java @@ -66,6 +66,8 @@ public class CouponPeriodService extends QueueConsumer implements InitializingBe CouponPeriod couponPeriod = new CouponPeriod(); couponPeriod.setId(idGenerator.nextId()); couponPeriod.setSecurityId(req.getSecurityId()); + couponPeriod.setCouponRate(req.getCouponRate()); + couponPeriod.setNumber(req.getNumber()); couponPeriod.setPeriodEndDate(req.getPeriodEndDate()); couponPeriod.setPeriodStartDate(req.getPeriodStartDate()); couponPeriodImdg.insert(couponPeriod); @@ -80,9 +82,11 @@ public class CouponPeriodService extends QueueConsumer implements InitializingBe RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.couponPeriodUpdateValidator()); if (requestInfoUpdate != null) return requestInfoUpdate; - CouponPeriod couponPeriod = couponPeriodImdg.getSingleObjectBySQL(String.format("securityId = %s", req.getSecurityId())); - couponPeriod.setPeriodEndDate(req.getPeriodEndDate()); - couponPeriod.setPeriodStartDate(req.getPeriodStartDate()); + CouponPeriod couponPeriod = couponPeriodImdg.getSingleObjectByID(req.getId()); + if (req.getCouponRate() != null) couponPeriod.setCouponRate(req.getCouponRate()); + if (req.getNumber() != null) couponPeriod.setNumber(req.getNumber()); + if (req.getPeriodEndDate() != null) couponPeriod.setPeriodEndDate(req.getPeriodEndDate()); + if (req.getPeriodStartDate() != null) couponPeriod.setPeriodStartDate(req.getPeriodStartDate()); couponPeriodImdg.update(couponPeriod); return null; } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java index 6aedc564f..2dfae6757 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java @@ -7,6 +7,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*; import ru.spcex.clearing.securities.errors.SecuritiesError; import ru.spcex.clearing.securities.validation.rule.*; import ru.spcex.clearing.validation.common.rules.EndDtAfterStartDtRule; +import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -264,7 +265,13 @@ public class ValidationProvider { CouponPeriodNewRequest::getPeriodEndDate, SecuritiesError.RequiredFieldIsEmpty, SecuritiesError.WrongFieldValue, false), - CouponPeriodNewValidationRule.CouponPeriodNotExists + CouponPeriodNewValidationRule.CouponPeriodNotExists, + FieldRequiredRule.instance("couponRate", + CouponPeriodNewRequest::getCouponRate, + SecuritiesError.RequiredFieldIsEmpty), + FieldRequiredRule.instance("number", + CouponPeriodNewRequest::getNumber, + SecuritiesError.RequiredFieldIsEmpty) ); }; } diff --git a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/CouponPeriodServiceTest.java b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/CouponPeriodServiceTest.java index 295d403b0..c6cc8c02b 100644 --- a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/CouponPeriodServiceTest.java +++ b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/CouponPeriodServiceTest.java @@ -12,6 +12,7 @@ import ru.spcex.clearing.securities.service.cud.CouponPeriodService; import ru.spcex.clearing.securities.utils.MatcherFactory; import javax.annotation.PostConstruct; +import java.math.BigDecimal; import java.time.LocalDate; import static ru.spcex.clearing.securities.utils.MatcherFactory.usingIgnoringFieldsComparator; @@ -46,10 +47,14 @@ public class CouponPeriodServiceTest extends AbstractServiceTest { currencyPrediction.setSecurityId(securityId); currencyPrediction.setPeriodEndDate(LocalDate.now()); currencyPrediction.setPeriodStartDate(LocalDate.ofEpochDay(0)); + currencyPrediction.setCouponRate(BigDecimal.TEN); + currencyPrediction.setNumber(Long.MAX_VALUE); final CouponPeriodNewRequest request = new CouponPeriodNewRequest(); request.setSecurityId(securityId); request.setPeriodEndDate(LocalDate.now()); request.setPeriodStartDate(LocalDate.ofEpochDay(0)); + request.setCouponRate(BigDecimal.TEN); + request.setNumber(Long.MAX_VALUE); //ACT @@ -74,27 +79,43 @@ public class CouponPeriodServiceTest extends AbstractServiceTest { public void testUpdateCurrency() { clearAllInImdg(couponPeriodImdg); final String TOPIC = Consts.DESTINATION_COUPON_PERIOD_UPDATE; - final CouponPeriod currencyPrediction = new CouponPeriod(); - currencyPrediction.setSecurityId(securityId); - currencyPrediction.setPeriodEndDate(LocalDate.ofEpochDay(0)); - currencyPrediction.setPeriodStartDate(LocalDate.ofEpochDay(0)); - couponPeriodImdg.insert(currencyPrediction); - final CouponPeriodNewRequest request = new CouponPeriodNewRequest(); - currencyPrediction.setPeriodEndDate(LocalDate.now()); + final CouponPeriod existCouponPeriod = new CouponPeriod(); + existCouponPeriod.setSecurityId(securityId); + existCouponPeriod.setCouponRate(BigDecimal.ZERO); + existCouponPeriod.setNumber(Long.MIN_VALUE); + existCouponPeriod.setPeriodEndDate(LocalDate.ofEpochDay(0)); + existCouponPeriod.setPeriodStartDate(LocalDate.ofEpochDay(0)); + Long id = couponPeriodImdg.insert(existCouponPeriod); + + LocalDate testStartDate = LocalDate.now(); + LocalDate testEndDate = LocalDate.now().minusDays(10); + + final CouponPeriod predictableCoupon = new CouponPeriod(); + predictableCoupon.setSecurityId(securityId); + predictableCoupon.setCouponRate(BigDecimal.TEN); + predictableCoupon.setNumber(Long.MAX_VALUE); + predictableCoupon.setPeriodEndDate(testStartDate); + predictableCoupon.setPeriodStartDate(testEndDate); + + final CouponPeriodUpdateRequest request = new CouponPeriodUpdateRequest(); + predictableCoupon.setPeriodEndDate(LocalDate.now()); + request.setId(id); + request.setCouponRate(BigDecimal.TEN); + request.setNumber(Long.MAX_VALUE); request.setSecurityId(securityId); - request.setPeriodEndDate(LocalDate.now()); - request.setPeriodStartDate(LocalDate.ofEpochDay(0)); + request.setPeriodEndDate(testStartDate); + request.setPeriodStartDate(testEndDate); //ACT - String jsonString = getJsonStringForUPDATE(request, ID); + String jsonString = getJsonStringForUPDATE(request, id); addRecordToKafka((MockConsumer) couponPeriodService.getConsumer(), TOPIC, PARTITION, 0, jsonString); //ASSERT - waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord); + waitingWhenAddedRecordAndCheckIt(id, mockProducer, producerRecord); - CouponPeriod result = couponPeriodImdg.getSingleObjectBySQL(String.format("securityId = %s", currencyPrediction.getSecurityId())); - currencyPrediction.setId(result.getId()); - COUPON_PERIOD_MATCHER.assertMatch(result, currencyPrediction); + CouponPeriod result = couponPeriodImdg.getSingleObjectBySQL(String.format("securityId = %s", predictableCoupon.getSecurityId())); + predictableCoupon.setId(result.getId()); + COUPON_PERIOD_MATCHER.assertMatch(result, predictableCoupon); } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/CouponPeriodNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/CouponPeriodNewRequest.java index 23118e3cb..6c1d706f1 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/CouponPeriodNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/CouponPeriodNewRequest.java @@ -3,15 +3,22 @@ package ru.spcex.clearing.platform.messaging.domain.cud.securitites; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.deser.std.NumberDeserializers; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; +import java.math.BigDecimal; import java.time.LocalDate; public class CouponPeriodNewRequest { @JsonProperty public Long securityId; @JsonProperty + @JsonDeserialize(using = NumberDeserializers.BigDecimalDeserializer.class) + public BigDecimal couponRate; + @JsonProperty + public Long number; + @JsonProperty @JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class) public LocalDate periodEndDate; @@ -43,4 +50,20 @@ public class CouponPeriodNewRequest { public void setPeriodStartDate(LocalDate periodStartDate) { this.periodStartDate = periodStartDate; } + + public BigDecimal getCouponRate() { + return couponRate; + } + + public void setCouponRate(BigDecimal couponRate) { + this.couponRate = couponRate; + } + + public Long getNumber() { + return number; + } + + public void setNumber(Long number) { + this.number = number; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/CouponPeriodUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/CouponPeriodUpdateRequest.java index 96a344661..fb0bf2a1b 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/CouponPeriodUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/CouponPeriodUpdateRequest.java @@ -3,10 +3,12 @@ package ru.spcex.clearing.platform.messaging.domain.cud.securitites; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.deser.std.NumberDeserializers; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; import ru.spcex.platform.classes.base.interfaces.WithId; +import java.math.BigDecimal; import java.time.LocalDate; public class CouponPeriodUpdateRequest implements WithId { @@ -15,6 +17,11 @@ public class CouponPeriodUpdateRequest implements WithId { @JsonProperty public Long securityId; @JsonProperty + @JsonDeserialize(using = NumberDeserializers.BigDecimalDeserializer.class) + public BigDecimal couponRate; + @JsonProperty + public Long number; + @JsonProperty @JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class) public LocalDate periodEndDate; @@ -56,4 +63,20 @@ public class CouponPeriodUpdateRequest implements WithId { public void setPeriodStartDate(LocalDate periodStartDate) { this.periodStartDate = periodStartDate; } + + public BigDecimal getCouponRate() { + return couponRate; + } + + public void setCouponRate(BigDecimal couponRate) { + this.couponRate = couponRate; + } + + public Long getNumber() { + return number; + } + + public void setNumber(Long number) { + this.number = number; + } }