diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java index d89cc1979..c569bf460 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java @@ -24,7 +24,6 @@ import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.misc.OvernightSettings; -import ru.clearing.classes.statics.data.misc.SCrossRate; import ru.clearing.classes.statics.data.misc.SOrders; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; @@ -233,9 +232,9 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing LocalDate now = LocalDate.now(); //мб возвращать вместе с листингом? CurrencyPairDictionary currPairT0 = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listingT0.getSecurityId()); - SCrossRate rateT0 = imdgQueryService.getSCrossRates(currPairT0.getBaseCurrency(), now); + Rates rateT0 = imdgQueryService.getRateOnNextWorkingDay(currPairT0.getBaseCurrency()); CurrencyPairDictionary currPairT1 = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listingT1.getSecurityId()); - SCrossRate rateT1 = imdgQueryService.getSCrossRates(currPairT1.getBaseCurrency(), now); + Rates rateT1 = imdgQueryService.getRateOnNextWorkingDay(currPairT1.getBaseCurrency()); var pair = new Pair<>(orderT0, orderT1); Pair.forEach(pair, o -> { @@ -246,8 +245,8 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing }); updateOrderFieldsByListing(orderT0, listingT0); updateOrderFieldsByListing(orderT1, listingT1); - orderT0.setPrice(rateT0.getUnitRate()); - orderT1.setPrice(BigDecimalUtil.safeSumBD(swap.getPrice(), rateT1.getUnitRate())); + orderT0.setPrice(rateT0.getValue()); + orderT1.setPrice(BigDecimalUtil.safeSumBD(swap.getPrice(), rateT1.getValue())); return pair; } @@ -280,9 +279,7 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing Market market = imdgQueryService.getSwapMarket(); Listing listing = imdgQueryService.findListing(rgs, market.getCode(), SettleCode.T1.getKey()); CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId()); - BigDecimal n = transferDateService.numberOfDaysOfTransfer(); - LocalDate searchingValueDate = LocalDate.now().plusDays(n.longValue()); - Rates rates = imdgQueryService.getRate(pair.getBaseCurrency(), searchingValueDate); + Rates rates = imdgQueryService.getRateOnNextWorkingDay(pair.getBaseCurrency()); BigDecimal rateValue = null; copyCommonFields(order1, swap); swap.setSecurityId(listing.getSecurityId()); diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java index a3e42f850..9597577d9 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java @@ -7,7 +7,6 @@ import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.time.Instant; -import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Collection; @@ -24,8 +23,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.misc.OvernightSettings; -import ru.clearing.classes.statics.data.misc.SCrossRate; import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.security.Rates; import ru.spcex.clearing.dflt.management.config.settings.DefaultManagementSettings; import ru.spcex.clearing.dflt.management.enums.SendOrdersTypes; import ru.spcex.clearing.dflt.management.service.ImdgQueryService; @@ -182,11 +181,11 @@ public class TaskListener extends QueueConsumer implements InitializingBean { } String currency = isRubPmt ? CurrencyCode.CNY.getKey() : pmtRegistry.getSecuritySymbol(); - SCrossRate sCrossRate = imdgQueryService.getSCrossRates(currency, LocalDate.now()); + Rates rates = imdgQueryService.getRateOnNextWorkingDay(currency); BigDecimal val = orderCurrency.getQuantityLot() .multiply(orderCurrency.getLotSize()) - .multiply(sCrossRate.getUnitRate()); + .multiply(rates.getValue()); BigDecimal diff = isRubPmt ? pmtRegistry.getBalance().add(val) : diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java index 8e64da397..9c6905ea9 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java @@ -50,9 +50,11 @@ public class ImdgQueryService { private final Imdg registryImdg; private final Imdg overnightSettingsImdg; private final Imdg orderCurrencyImdg; + private final TransferDateService transferDateService; - public ImdgQueryService(ImdgProvider imdgProvider) { + public ImdgQueryService(ImdgProvider imdgProvider, + TransferDateService transferDateService) { this.categoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); this.companyRoleSetImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class); this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); @@ -67,6 +69,7 @@ public class ImdgQueryService { this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.overnightSettingsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class); this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); + this.transferDateService = transferDateService; } public Collection getCurrencyRegistry() { ImdgPredicateBuilder builder = registryImdg.predicateBuilder(); @@ -194,27 +197,18 @@ public class ImdgQueryService { : findRiskParameterForOtherCurrency(registry); } - public Rates getRate(String currency, LocalDate valueDate) { + public Rates getRateOnNextWorkingDay(String currency) { + LocalDate nextWorkingDate = transferDateService.findNextWorkingDate(); ImdgPredicateBuilder pb = ratesImdg.predicateBuilder(); return ratesImdg.getSingleObjectByPredicate( pb.and( pb.equals("currency", currency), - pb.equals("valueDate", valueDate), + pb.equals("valueDate", nextWorkingDate), pb.equals("workflowStatus", WorkflowStatus.Active.getKey()) ) ); } - public SCrossRate getSCrossRates(String currency, LocalDate date) { - ImdgPredicateBuilder pb = sCrossRateImdg.predicateBuilder(); - return sCrossRateImdg.getSingleObjectByPredicate( - pb.and( - pb.equals("currency", currency), - pb.equals("date", date) - ) - ); - } - public BigDecimal defineTransferRate(Long currencyPairDictionaryId, String securitySymbol) { ImdgPredicateBuilder pb = riskParameterImdg.predicateBuilder(); boolean isRub = "RUB".equals(securitySymbol); diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java index ab9bed0d8..9ceb9e88f 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java @@ -3,13 +3,11 @@ package ru.spcex.clearing.dflt.management.service; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; -import java.time.LocalDate; import java.util.Collection; 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.registry.Registry; import ru.clearing.classes.statics.data.security.Rates; import ru.clearing.platform.dictionary.CurrencyPairDictionary; @@ -53,10 +51,8 @@ public class OrderCalculationService { BigDecimal quantityLot = result.sum3().abs(); BigDecimal price; - long nextWorkDayDelta = n.longValue(); - LocalDate searchingValueDate = LocalDate.now().plusDays(nextWorkDayDelta); int precision = listing.getPrecision().intValue(); - Rates rates = imdgQueryService.getRate(pair.getBaseCurrency(), searchingValueDate); + Rates rates = imdgQueryService.getRateOnNextWorkingDay(pair.getBaseCurrency()); price = swapPriceCalc(rates, s, n, precision); return new FinalCalculationResult(price, rates.getValue().setScale(precision, RoundingMode.HALF_UP), s, quantityLot, result); } @@ -74,8 +70,7 @@ public class OrderCalculationService { ? calculationRubSums(registry, listing.getLotSize().intValue(), s, n) : calculationSums(registry, listing.getLotSize().intValue(), s, n); - long nextWorkDayDelta = n.longValue(); - Rates rates = imdgQueryService.getRate(pair.getBaseCurrency(), LocalDate.now().plusDays(nextWorkDayDelta)); + Rates rates = imdgQueryService.getRateOnNextWorkingDay(pair.getBaseCurrency()); BigDecimal quantityLot; BigDecimal price; if (SettleCode.T0 == settleCode) { @@ -94,11 +89,11 @@ public class OrderCalculationService { BigDecimal planPosition = registry.getBalance(); BigDecimal sum1 = planPosition.abs(); - SCrossRate sCrossRates = imdgQueryService.getSCrossRates(registry.getSecuritySymbol(), LocalDate.now()); - if (sCrossRates == null) { + Rates rates = imdgQueryService.getRateOnNextWorkingDay(registry.getSecuritySymbol()); + if (rates == null) { throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", CurrencyCode.CNY.getKey())); } - BigDecimal rateValue = sCrossRates.getUnitRate(); + BigDecimal rateValue = rates.getValue(); BigDecimal sum3 = mathCeil(sum1, lotSize); BigDecimal sum4 = sum3.multiply(rateValue, MC).negate(); BigDecimal sum5 = sum3.negate(); @@ -115,11 +110,11 @@ public class OrderCalculationService { private CalculationResult calculationRubSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) { BigDecimal planPosition = registry.getBalance(); - SCrossRate sCrossRates = imdgQueryService.getSCrossRates(CurrencyCode.CNY.getKey(), LocalDate.now()); - if (sCrossRates == null) { + Rates rates = imdgQueryService.getRateOnNextWorkingDay(CurrencyCode.CNY.getKey()); + if (rates == null) { throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", CurrencyCode.CNY.getKey())); } - BigDecimal rateValue = sCrossRates.getUnitRate(); + BigDecimal rateValue = rates.getValue(); BigDecimal sum1 = planPosition.divide(rateValue, MC).abs(); @@ -162,8 +157,7 @@ public class OrderCalculationService { } private BigDecimal swapPriceCalcT1(String baseCurrency, BigDecimal s, BigDecimal n, int precision) { - long nextWorkDayDelta = n.longValue(); - Rates rate = imdgQueryService.getRate(baseCurrency, LocalDate.now().plusDays(nextWorkDayDelta)); + Rates rate = imdgQueryService.getRateOnNextWorkingDay(baseCurrency); BigDecimal p = n.divide(BigDecimal.valueOf(365), MC); log.info("Calculation swap price: {}*{}*{}", rate.getValue(), s, p); return rate.getValue() diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCurrencyTriExportService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCurrencyTriExportService.java index 78e6ce4d9..f5ed02fa7 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCurrencyTriExportService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCurrencyTriExportService.java @@ -2,7 +2,6 @@ package ru.spcex.clearing.dflt.management.service; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; -import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -11,15 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.misc.OrderCurrency; -import ru.clearing.classes.statics.data.security.Rates; -import ru.clearing.platform.dictionary.CurrencyPairDictionary; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationNewRequest; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; -import ru.spcex.platform.enumeration.ObjectType; -import ru.spcex.platform.enumeration.OvernightType; -import ru.spcex.platform.enumeration.Priority; -import ru.spcex.platform.enumeration.SettleCode; import ru.spcex.platform.enumeration.Side; @Service @@ -89,29 +80,6 @@ public class OrderCurrencyTriExportService { return ""; } - public String resolveBaseRate(OrderCurrency orderCurrency) { - if (OvernightType.SPOT.equalsByKey(orderCurrency.getOvernightType())) { - return ""; - } - - CurrencyPairDictionary currencyPairDictionary = imdgQueryService.getCurrencyPairDictionaryBySecurityId(orderCurrency.getSecurityId()); - String baseCurrency = currencyPairDictionary.getBaseCurrency(); - LocalDate rateDate = LocalDate.now(); - - if (SettleCode.T1.equalsByKey(orderCurrency.getSettleCode())) { //всегда т.к. SWAP? - BigDecimal n = transferDateService.numberOfDaysOfTransfer(); - rateDate = rateDate.plusDays(n.longValue()); - } - Rates rates = imdgQueryService.getRate(currencyPairDictionary.getBaseCurrency(), rateDate); - - if (rates == null || rates.getValue() == null) { - log.warn("Не найден активный курс для валюты {} на дату {}", baseCurrency, rateDate); - return null; - } - - return formatDecimalStripZeroes(rates.getValue()); - } - private String formatDecimal(BigDecimal value) { return value == null ? "" : value.toPlainString(); }