etreschenkov 2026-04-01 14:56:44 +03:00
parent 46afedede1
commit e31453e293
10 changed files with 524 additions and 127 deletions

View file

@ -29,9 +29,6 @@ public class RatesFacade implements IClearingFacade {
this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class);
}
/**
* Создает clientCode, TCR и опционально TCRList, если указаны валюты.
*/
public void createRates(RatesNewRequest request) {
log.trace("Start process creating new rates");
Rates rates = new Rates();

View file

@ -1,43 +1,47 @@
package ru.spcex.clearing.securities.service.facade;
import java.math.BigDecimal;
import java.time.Instant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.SCrossRate;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateUpdateRequest;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
@Service
public class SCrossRateFacade {
private final Logger log = LoggerFactory.getLogger(getClass());
private final SecuritySelector<Security> securitySelector;
private final ImdgProvider imdgProvider;
private final ImdgId idGenerator;
private final Imdg<SCrossRate> sCrossRateImdg;
public SCrossRateFacade(SecuritySelector<Security> securitySelector, ImdgProvider imdgProvider) {
this.securitySelector = securitySelector;
public SCrossRateFacade(ImdgProvider imdgProvider) {
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.sCrossRateImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SCrossRate, SCrossRate.class);
}
public Listing newSCrossRate(SCrossRateRequest req) {
public void create(SCrossRateNewRequest req) {
SCrossRate sCrossRate = new SCrossRate();
sCrossRate.setCreated(Instant.now());
sCrossRate.setDate(req.getDate());
sCrossRate.setCurrency(req.getBaseCurrencyLetterCode());
sCrossRate.setCurrency(req.getCurrency());
sCrossRate.setUnitRate(req.getRate());
sCrossRate.setFaceValue(new BigDecimal(req.getBaseCurrencyUnit()));
sCrossRate.setRate(req.getPrice());
return null;
sCrossRate.setFaceValue(req.getFaceValue());
sCrossRate.setRate(req.getRate());
sCrossRateImdg.insert(sCrossRate);
}
public void update(SCrossRateUpdateRequest req) {
SCrossRate sCrossRate = sCrossRateImdg.getSingleObjectByID(req.getId());
sCrossRate.setUnitRate(req.getRate());
sCrossRate.setFaceValue(req.getFaceValue());
sCrossRate.setRate(req.getRate());
sCrossRate.setUpdated(Instant.now());
sCrossRateImdg.update(sCrossRate);
}
}

View file

@ -1,5 +1,6 @@
package ru.spcex.clearing.securities.service.listeners;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
@ -8,15 +9,22 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.security.Rates;
import ru.clearing.platform.dictionary.CurrencyCodeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.securities.service.facade.RatesFacade;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
@ -26,10 +34,12 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final RatesFacade ratesFacade;
private final Imdg<Rates> ratesImdg;
private final Function<RatesNewRequest, IValidator> ratesNewValidator;
private final Function<RatesUpdateRequest, IValidator> ratesUpdateValidator;
private final UserRoleVerification userRoleVerification;
private final IMessageResolver messageResolver;
private final Imdg<CurrencyCodeDictionary> currencyCodeDictionaryImdg;
public RatesMessageListener(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
@ -46,6 +56,8 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB
this.ratesUpdateValidator = ratesUpdateValidator;
this.userRoleVerification = userRoleVerification;
this.messageResolver = messageResolver;
this.ratesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Rates, Rates.class);
this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class);
}
@Override
@ -59,6 +71,9 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB
callback(RatesUpdateRequest.class)
.setFunction(this::ratesUpdate)
.forDestination(Consts.DESTINATION_RATES_UPDATE, callbacks::put);
callback(RatesGatewayRequest.class)
.setConsumer(this::gatewayRatesRequest)
.forDestination(Consts.DESTINATION_RATES_GATEWAY, callbacks::put);
init();
}
@ -97,4 +112,58 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB
ratesFacade.updateRates(request);
return null;
}
private void gatewayRatesRequest(BaseRequest<RatesGatewayRequest> ratesGatewayRequest) {
RatesGatewayRequest payload = ratesGatewayRequest.getRequestPayload();
for (RatesGatewayRequest.RateElem elem : payload.getRateElems()) {
ImdgPredicateBuilder predicateBuilder = ratesImdg.predicateBuilder();
Collection<Long> rateIds = ratesImdg.getCollectionIdsByPredicate(
predicateBuilder.and(
predicateBuilder.equals("date", elem.getDate()),
predicateBuilder.equals("currency", elem.getBaseCurrencyLetterCode())
));
if (rateIds.isEmpty()) {
toNewRequest(elem).ifPresent(ratesFacade::createRates);
} else {
toUpdateRequest(elem).ifPresent(ratesUpdateRequest -> {
ratesUpdateRequest.setId(rateIds.iterator().next());
ratesFacade.updateRates(ratesUpdateRequest);
});
}
}
}
private Optional<RatesNewRequest> toNewRequest(RatesGatewayRequest.RateElem sRateElem) {
RatesNewRequest newRequest = new RatesNewRequest();
CurrencyCodeDictionary currencyCodeDictionary = currencyByCode(sRateElem.getBaseCurrencyLetterCode());
if (currencyCodeDictionary == null) {
return Optional.empty();
}
newRequest.setCurrencyId(currencyCodeDictionary.getId());
newRequest.setValueDate(sRateElem.getDate());
newRequest.setValue(sRateElem.getPrice());
newRequest.setStatus(WorkflowStatus.Active.getKey());
return Optional.of(newRequest);
}
private Optional<RatesUpdateRequest> toUpdateRequest(RatesGatewayRequest.RateElem sRateElem) {
RatesUpdateRequest updateRequest = new RatesUpdateRequest();
CurrencyCodeDictionary currencyCodeDictionary = currencyByCode(sRateElem.getBaseCurrencyLetterCode());
if (currencyCodeDictionary == null) {
return Optional.empty();
}
updateRequest.setValue(sRateElem.getPrice());
updateRequest.setStatus(WorkflowStatus.Active.getKey());
return Optional.of(updateRequest);
}
private CurrencyCodeDictionary currencyByCode(String code) {
ImdgPredicateBuilder predicateBuilder = currencyCodeDictionaryImdg.predicateBuilder();
return currencyCodeDictionaryImdg.getFirstObjectByPredicate(
predicateBuilder.equals("code", code)
);
}
}

View file

@ -0,0 +1,127 @@
package ru.spcex.clearing.securities.service.listeners;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Collection;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.SCrossRate;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.securities.service.facade.SCrossRateFacade;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
@Service
public class SCrossRatesMessageListener extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final UserRoleVerification userRoleVerification;
private final IMessageResolver messageResolver;
private final Imdg<SCrossRate> sCrossRateImdg;
private final SCrossRateFacade sCrossRateFacade;
public SCrossRatesMessageListener(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
UserRoleVerification userRoleVerification,
IMessageResolver messageResolver,
SCrossRateFacade sCrossRateFacade) {
super(kafkaQueue, kafkaProducer);
this.imdgProvider = imdgProvider;
this.userRoleVerification = userRoleVerification;
this.messageResolver = messageResolver;
this.sCrossRateImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SCrossRate, SCrossRate.class);
this.sCrossRateFacade = sCrossRateFacade;
}
@Override
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
callback(SCrossRateGatewayRequest.class)
.setConsumer(this::sCrossRatesProcess)
.forDestination(Consts.DESTINATION_S_CROSS_RATES_GATEWAY, callbacks::put);
init();
}
private void sCrossRatesProcess(BaseRequest<SCrossRateGatewayRequest> sCrossRatesReq) {
SCrossRateGatewayRequest payload = sCrossRatesReq.getRequestPayload();
for (SCrossRateGatewayRequest.SCrossRateElem elem : payload.getCrossRateElems()) {
ImdgPredicateBuilder predicateBuilder = sCrossRateImdg.predicateBuilder();
Collection<Long> sCrossRateIds = sCrossRateImdg.getCollectionIdsByPredicate(
predicateBuilder.and(
predicateBuilder.equals("date", elem.getDate()),
predicateBuilder.equals("currency", elem.getBaseCurrencyLetterCode())
));
if (sCrossRateIds.isEmpty()) {
SCrossRateNewRequest newRequest = toNewRequest(elem);
sCrossRateFacade.create(newRequest);
} else {
SCrossRateUpdateRequest updateRequest = toUpdateRequest(elem);
updateRequest.setId(sCrossRateIds.iterator().next());
sCrossRateFacade.update(updateRequest);
}
}
}
private SCrossRateNewRequest toNewRequest(SCrossRateGatewayRequest.SCrossRateElem sCrossRateElem) {
SCrossRateNewRequest newRequest = new SCrossRateNewRequest();
newRequest.setDate(sCrossRateElem.getDate());
newRequest.setCurrency(sCrossRateElem.getBaseCurrencyLetterCode());
newRequest.setUnitRate(sCrossRateElem.getRate());
newRequest.setFaceValue(BigDecimal.valueOf(sCrossRateElem.getBaseCurrencyUnit()));
newRequest.setRate(sCrossRateElem.getPrice());
return newRequest;
}
private SCrossRateUpdateRequest toUpdateRequest(SCrossRateGatewayRequest.SCrossRateElem sCrossRateElem) {
SCrossRateUpdateRequest updateRequest = new SCrossRateUpdateRequest();
updateRequest.setUnitRate(sCrossRateElem.getRate());
updateRequest.setFaceValue(BigDecimal.valueOf(sCrossRateElem.getBaseCurrencyUnit()));
updateRequest.setRate(sCrossRateElem.getPrice());
return updateRequest;
}
private Function<SCrossRateGatewayRequest.SCrossRateElem, SCrossRate> findSCrossRate() {
return req -> {
ImdgPredicateBuilder predicateBuilder = sCrossRateImdg.predicateBuilder();
Collection<Long> sCrossRateIds = sCrossRateImdg.getCollectionIdsByPredicate(
predicateBuilder.and(
predicateBuilder.equals("date", req.getDate()),
predicateBuilder.equals("currency", req.getBaseCurrencyLetterCode())
));
SCrossRate sCrossRate;
if (sCrossRateIds.isEmpty()) {
log.debug("Not found any cross rate for date: {}, currency: {}",
req.getDate(),
req.getBaseCurrencyLetterCode());
sCrossRate = new SCrossRate();
sCrossRate.setCreated(Instant.now());
} else {
Long id = sCrossRateIds.iterator().next();
log.debug("Found cross rate for date: {}, currency: {} with id: {}",
req.getDate(),
req.getBaseCurrencyLetterCode(),
id);
sCrossRate = sCrossRateImdg.getSingleObjectByID(sCrossRateIds.iterator().next());
sCrossRate.setUpdated(Instant.now());
}
return sCrossRate;
};
}
}

View file

@ -133,7 +133,8 @@ public interface Consts {
String DESTINATION_RATES_NEW = "rates-new";
String DESTINATION_RATES_UPDATE = "rates-update";
String DESTINATION_RATES_GATEWAY = "rates-gateway";
String DESTINATION_S_CROSS_RATES_GATEWAY = "sCross-rates-gateway";
String DESTINATION_VALIDATE_SYMBOLS_NEW = "validate-symbols-new";
String DESTINATION_VALIDATE_SYMBOLS_UPDATE = "validate-symbols-update";
String DESTINATION_VALIDATE_SYMBOLS_DELETE = "validate-symbols-delete";

View file

@ -0,0 +1,135 @@
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.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class SCrossRateGatewayRequest {
@JsonProperty
private List<SCrossRateElem> crossRateElems;
public List<SCrossRateElem> getCrossRateElems() {
return crossRateElems;
}
public void setCrossRateElems(List<SCrossRateElem> crossRateElems) {
this.crossRateElems = crossRateElems;
}
public static class SCrossRateElem {
@JsonProperty
private String type;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate date;
@JsonProperty
private String baseCurrencyLetterCode;
@JsonProperty
private String associatedCurrencyLetterCode;
@JsonProperty
private BigDecimal rate;
@JsonProperty
private Integer priceAccuracy;
@JsonProperty
private Integer baseCurrencyUnit;
@JsonProperty
private BigDecimal price;
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonProperty
private LocalDateTime updateDateTime;
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonProperty
private LocalDateTime sourceDateTime;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public String getBaseCurrencyLetterCode() {
return baseCurrencyLetterCode;
}
public void setBaseCurrencyLetterCode(String baseCurrencyLetterCode) {
this.baseCurrencyLetterCode = baseCurrencyLetterCode;
}
public String getAssociatedCurrencyLetterCode() {
return associatedCurrencyLetterCode;
}
public void setAssociatedCurrencyLetterCode(String associatedCurrencyLetterCode) {
this.associatedCurrencyLetterCode = associatedCurrencyLetterCode;
}
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
public Integer getPriceAccuracy() {
return priceAccuracy;
}
public void setPriceAccuracy(Integer priceAccuracy) {
this.priceAccuracy = priceAccuracy;
}
public Integer getBaseCurrencyUnit() {
return baseCurrencyUnit;
}
public void setBaseCurrencyUnit(Integer baseCurrencyUnit) {
this.baseCurrencyUnit = baseCurrencyUnit;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public LocalDateTime getUpdateDateTime() {
return updateDateTime;
}
public void setUpdateDateTime(LocalDateTime updateDateTime) {
this.updateDateTime = updateDateTime;
}
public LocalDateTime getSourceDateTime() {
return sourceDateTime;
}
public void setSourceDateTime(LocalDateTime sourceDateTime) {
this.sourceDateTime = sourceDateTime;
}
}
}

View file

@ -0,0 +1,68 @@
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
import java.time.LocalDate;
public class SCrossRateNewRequest {
@JsonProperty
private String type;
@JsonProperty
private LocalDate date;
@JsonProperty
private String currency;
@JsonProperty
private BigDecimal unitRate;
@JsonProperty
private BigDecimal faceValue;
@JsonProperty
private BigDecimal rate;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public BigDecimal getUnitRate() {
return unitRate;
}
public void setUnitRate(BigDecimal unitRate) {
this.unitRate = unitRate;
}
public BigDecimal getFaceValue() {
return faceValue;
}
public void setFaceValue(BigDecimal faceValue) {
this.faceValue = faceValue;
}
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
}

View file

@ -1,109 +0,0 @@
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class SCrossRateRequest {
@JsonProperty
private String type;
@JsonProperty
private LocalDate date;
@JsonProperty
private String baseCurrencyLetterCode;
@JsonProperty
private String associatedCurrencyLetterCode;
@JsonProperty
private BigDecimal rate;
@JsonProperty
private Integer priceAccuracy;
@JsonProperty
private Integer baseCurrencyUnit;
@JsonProperty
private BigDecimal price;
@JsonProperty
private LocalDateTime updateDateTime;
@JsonProperty
private LocalDateTime sourceDateTime;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public String getBaseCurrencyLetterCode() {
return baseCurrencyLetterCode;
}
public void setBaseCurrencyLetterCode(String baseCurrencyLetterCode) {
this.baseCurrencyLetterCode = baseCurrencyLetterCode;
}
public String getAssociatedCurrencyLetterCode() {
return associatedCurrencyLetterCode;
}
public void setAssociatedCurrencyLetterCode(String associatedCurrencyLetterCode) {
this.associatedCurrencyLetterCode = associatedCurrencyLetterCode;
}
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
public Integer getPriceAccuracy() {
return priceAccuracy;
}
public void setPriceAccuracy(Integer priceAccuracy) {
this.priceAccuracy = priceAccuracy;
}
public Integer getBaseCurrencyUnit() {
return baseCurrencyUnit;
}
public void setBaseCurrencyUnit(Integer baseCurrencyUnit) {
this.baseCurrencyUnit = baseCurrencyUnit;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public LocalDateTime getUpdateDateTime() {
return updateDateTime;
}
public void setUpdateDateTime(LocalDateTime updateDateTime) {
this.updateDateTime = updateDateTime;
}
public LocalDateTime getSourceDateTime() {
return sourceDateTime;
}
public void setSourceDateTime(LocalDateTime sourceDateTime) {
this.sourceDateTime = sourceDateTime;
}
}

View file

@ -0,0 +1,46 @@
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
public class SCrossRateUpdateRequest {
@JsonProperty
private Long id;
@JsonProperty
private BigDecimal unitRate;
@JsonProperty
private BigDecimal faceValue;
@JsonProperty
private BigDecimal rate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public BigDecimal getUnitRate() {
return unitRate;
}
public void setUnitRate(BigDecimal unitRate) {
this.unitRate = unitRate;
}
public BigDecimal getFaceValue() {
return faceValue;
}
public void setFaceValue(BigDecimal faceValue) {
this.faceValue = faceValue;
}
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
}

View file

@ -0,0 +1,59 @@
package ru.spcex.clearing.platform.messaging.domain.cud.security;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class RatesGatewayRequest {
@JsonProperty
private List<RateElem> rateElems;
public List<RateElem> getRateElems() {
return rateElems;
}
public void setRateElems(List<RateElem> rateElems) {
this.rateElems = rateElems;
}
public static class RateElem {
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate date;
@JsonProperty
private String baseCurrencyLetterCode;
@JsonProperty
private BigDecimal price;
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public String getBaseCurrencyLetterCode() {
return baseCurrencyLetterCode;
}
public void setBaseCurrencyLetterCode(String baseCurrencyLetterCode) {
this.baseCurrencyLetterCode = baseCurrencyLetterCode;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
}