This commit is contained in:
parent
46afedede1
commit
e31453e293
10 changed files with 524 additions and 127 deletions
|
|
@ -29,9 +29,6 @@ public class RatesFacade implements IClearingFacade {
|
||||||
this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class);
|
this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Создает clientCode, TCR и опционально TCRList, если указаны валюты.
|
|
||||||
*/
|
|
||||||
public void createRates(RatesNewRequest request) {
|
public void createRates(RatesNewRequest request) {
|
||||||
log.trace("Start process creating new rates");
|
log.trace("Start process creating new rates");
|
||||||
Rates rates = new Rates();
|
Rates rates = new Rates();
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,47 @@
|
||||||
package ru.spcex.clearing.securities.service.facade;
|
package ru.spcex.clearing.securities.service.facade;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.time.Instant;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
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.misc.SCrossRate;
|
||||||
import ru.clearing.classes.statics.data.security.Security;
|
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
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.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgId;
|
import ru.spcex.platform.imdg.api.ImdgId;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class SCrossRateFacade {
|
public class SCrossRateFacade {
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private final SecuritySelector<Security> securitySelector;
|
|
||||||
private final ImdgProvider imdgProvider;
|
private final ImdgProvider imdgProvider;
|
||||||
private final ImdgId idGenerator;
|
private final ImdgId idGenerator;
|
||||||
private final Imdg<SCrossRate> sCrossRateImdg;
|
private final Imdg<SCrossRate> sCrossRateImdg;
|
||||||
|
|
||||||
public SCrossRateFacade(SecuritySelector<Security> securitySelector, ImdgProvider imdgProvider) {
|
public SCrossRateFacade(ImdgProvider imdgProvider) {
|
||||||
this.securitySelector = securitySelector;
|
|
||||||
this.imdgProvider = imdgProvider;
|
this.imdgProvider = imdgProvider;
|
||||||
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
||||||
this.sCrossRateImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SCrossRate, SCrossRate.class);
|
this.sCrossRateImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SCrossRate, SCrossRate.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Listing newSCrossRate(SCrossRateRequest req) {
|
public void create(SCrossRateNewRequest req) {
|
||||||
|
|
||||||
SCrossRate sCrossRate = new SCrossRate();
|
SCrossRate sCrossRate = new SCrossRate();
|
||||||
|
sCrossRate.setCreated(Instant.now());
|
||||||
sCrossRate.setDate(req.getDate());
|
sCrossRate.setDate(req.getDate());
|
||||||
sCrossRate.setCurrency(req.getBaseCurrencyLetterCode());
|
sCrossRate.setCurrency(req.getCurrency());
|
||||||
sCrossRate.setUnitRate(req.getRate());
|
sCrossRate.setUnitRate(req.getRate());
|
||||||
sCrossRate.setFaceValue(new BigDecimal(req.getBaseCurrencyUnit()));
|
sCrossRate.setFaceValue(req.getFaceValue());
|
||||||
sCrossRate.setRate(req.getPrice());
|
sCrossRate.setRate(req.getRate());
|
||||||
return null;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package ru.spcex.clearing.securities.service.listeners;
|
package ru.spcex.clearing.securities.service.listeners;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import org.apache.kafka.clients.consumer.Consumer;
|
import org.apache.kafka.clients.consumer.Consumer;
|
||||||
|
|
@ -8,15 +9,22 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.stereotype.Service;
|
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.BaseRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
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.RatesNewRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesUpdateRequest;
|
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.QueueConsumer;
|
||||||
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
||||||
import ru.spcex.clearing.securities.service.facade.RatesFacade;
|
import ru.spcex.clearing.securities.service.facade.RatesFacade;
|
||||||
import ru.spcex.clearing.util.security.UserRoleVerification;
|
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.ImdgProvider;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
import ru.spcex.platform.utils.validation.IValidator;
|
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 Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private final ImdgProvider imdgProvider;
|
private final ImdgProvider imdgProvider;
|
||||||
private final RatesFacade ratesFacade;
|
private final RatesFacade ratesFacade;
|
||||||
|
private final Imdg<Rates> ratesImdg;
|
||||||
private final Function<RatesNewRequest, IValidator> ratesNewValidator;
|
private final Function<RatesNewRequest, IValidator> ratesNewValidator;
|
||||||
private final Function<RatesUpdateRequest, IValidator> ratesUpdateValidator;
|
private final Function<RatesUpdateRequest, IValidator> ratesUpdateValidator;
|
||||||
private final UserRoleVerification userRoleVerification;
|
private final UserRoleVerification userRoleVerification;
|
||||||
private final IMessageResolver messageResolver;
|
private final IMessageResolver messageResolver;
|
||||||
|
private final Imdg<CurrencyCodeDictionary> currencyCodeDictionaryImdg;
|
||||||
|
|
||||||
public RatesMessageListener(Consumer<String, Object> kafkaQueue,
|
public RatesMessageListener(Consumer<String, Object> kafkaQueue,
|
||||||
Producer<String, Object> kafkaProducer,
|
Producer<String, Object> kafkaProducer,
|
||||||
|
|
@ -46,6 +56,8 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB
|
||||||
this.ratesUpdateValidator = ratesUpdateValidator;
|
this.ratesUpdateValidator = ratesUpdateValidator;
|
||||||
this.userRoleVerification = userRoleVerification;
|
this.userRoleVerification = userRoleVerification;
|
||||||
this.messageResolver = messageResolver;
|
this.messageResolver = messageResolver;
|
||||||
|
this.ratesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Rates, Rates.class);
|
||||||
|
this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -59,6 +71,9 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB
|
||||||
callback(RatesUpdateRequest.class)
|
callback(RatesUpdateRequest.class)
|
||||||
.setFunction(this::ratesUpdate)
|
.setFunction(this::ratesUpdate)
|
||||||
.forDestination(Consts.DESTINATION_RATES_UPDATE, callbacks::put);
|
.forDestination(Consts.DESTINATION_RATES_UPDATE, callbacks::put);
|
||||||
|
callback(RatesGatewayRequest.class)
|
||||||
|
.setConsumer(this::gatewayRatesRequest)
|
||||||
|
.forDestination(Consts.DESTINATION_RATES_GATEWAY, callbacks::put);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -97,4 +112,58 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB
|
||||||
ratesFacade.updateRates(request);
|
ratesFacade.updateRates(request);
|
||||||
return null;
|
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)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -133,7 +133,8 @@ public interface Consts {
|
||||||
|
|
||||||
String DESTINATION_RATES_NEW = "rates-new";
|
String DESTINATION_RATES_NEW = "rates-new";
|
||||||
String DESTINATION_RATES_UPDATE = "rates-update";
|
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_NEW = "validate-symbols-new";
|
||||||
String DESTINATION_VALIDATE_SYMBOLS_UPDATE = "validate-symbols-update";
|
String DESTINATION_VALIDATE_SYMBOLS_UPDATE = "validate-symbols-update";
|
||||||
String DESTINATION_VALIDATE_SYMBOLS_DELETE = "validate-symbols-delete";
|
String DESTINATION_VALIDATE_SYMBOLS_DELETE = "validate-symbols-delete";
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue