From f92941a2fcfef25e0c0cf694cd93b278f5dc38ab Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 9 Feb 2024 18:17:05 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-640 --- .../execution/ExecutionFondComponent.java | 61 ++++++++++++++----- .../platform/enumeration/CurrencyCode.java | 7 ++- .../platform/enumeration/InstrumentType.java | 4 +- .../platform/utils/enumeration/IEnumKey.java | 8 +++ 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java index c5a33e500..a4ce30d8a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.service.execution; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.Instant; +import java.time.LocalDate; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,6 +22,8 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.statics.data.misc.Market; +import ru.clearing.classes.statics.data.misc.SCrossRate; import ru.clearing.classes.statics.data.misc.STrades; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.security.Security; @@ -27,25 +37,25 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewR import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionType; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.service.validation.ValidationStored; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.CurrencyCode; +import ru.spcex.platform.enumeration.InstrumentType; +import ru.spcex.platform.enumeration.ObjectType; +import ru.spcex.platform.enumeration.Priority; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.utils.enumeration.*; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumId; +import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; import ru.spcex.platform.utils.log.ExceptionUtils; +import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @Component @@ -58,7 +68,8 @@ public class ExecutionFondComponent { private final Imdg listingImdg; private final Imdg clientCodeImdg; private final Imdg fixedIncomeCashFlowImdg; - private final Imdg marketImdg; + private final Imdg marketImdg; + private final Imdg crossRateImdg; //fixme ждать ТЗ Long tradeNum; @@ -80,8 +91,9 @@ public class ExecutionFondComponent { this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class); - this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, ru.clearing.classes.statics.data.misc.Market.class); + this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class); this.fixedIncomeCashFlowImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class); + this.crossRateImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SCrossRate, SCrossRate.class); this.valuation = settings.getTrade().getValuation(); //fixme this.stradesValidator = stradesValidator; this.kafkaSender = kafkaSender; @@ -196,7 +208,7 @@ public class ExecutionFondComponent { eFond.setTradingClearingRegistryId(rgstr.getId()); //todo можем ли просто переложить sTrades.getClassCode() или все такие искать, одно и тоже же - ru.clearing.classes.statics.data.misc.Market market = marketImdg.getFirstObjectBySQL("code = '%s'".formatted(sTrades.getClassCode())); + Market market = marketImdg.getFirstObjectBySQL("code = '%s'".formatted(sTrades.getClassCode())); eFond.setMarket(sTrades.getClassCode()); eFond.setPrice(sTrades.getPrice()); @@ -251,8 +263,25 @@ public class ExecutionFondComponent { nominalValue = safeBD(fixedIncome.getNominalValue()); } { + BigDecimal crossRate; + String currency = fixedIncome.getNominalCurrency(); + if (TextUtil.isEmpty(currency) || CurrencyCode.isRub(currency)) { + crossRate = BigDecimal.ONE; + } else { + ImdgPredicateBuilder crsRtpb = crossRateImdg.predicateBuilder(); + ImdgPredicate crsRtePrdct = crsRtpb.and( + crsRtpb.equals("date", LocalDate.now()), + crsRtpb.equals("currency", currency) + ); + SCrossRate crsRte = crossRateImdg.getFirstObjectByPredicate(crsRtePrdct); + if (crsRte != null) { + crossRate = safeBD(crsRte.getUnitRate()); + } else { + crossRate = BigDecimal.ZERO; + } + } settlementAmount = eFond.getQuantity() - .multiply(nominalValue) + .multiply(nominalValue.multiply(crossRate)) .multiply(price) .divide(new BigDecimal(100), RoundingMode.HALF_UP) .setScale(2, RoundingMode.HALF_UP); diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CurrencyCode.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CurrencyCode.java index e0fd13c1a..2404d3b9f 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CurrencyCode.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CurrencyCode.java @@ -4,9 +4,14 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; public enum CurrencyCode implements IEnumKey { RUB("RUB"), - RUR("RUR") //fixme may be remove to separate enum + RUR("RUR"),//fixme may be remove to separate enum + SUR("SUR"), + ; + public static boolean isRub(String currencyCode) { + return IEnumKey.containsIgnoreCase(currencyCode, RUB, RUR, SUR); + } private final String key; CurrencyCode(String key) { diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InstrumentType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InstrumentType.java index 079ef799b..abfe0f5f8 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InstrumentType.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InstrumentType.java @@ -3,8 +3,8 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum InstrumentType implements IEnumKey { - BOND("BOND"), // Долевые ценные бумаги (акции) - EQTY("EQTY"), // Долговые ценные бумаги (облигации) + BOND("BOND"), // (облигации) + EQTY("EQTY"), // (акции) RATE("RATE"), // Инструмент Денежного рынка CRNC ("CRNC") ; diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/IEnumKey.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/IEnumKey.java index 981f8694f..a898c0250 100644 --- a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/IEnumKey.java +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/IEnumKey.java @@ -21,6 +21,14 @@ public interface IEnumKey extends Serializable { } return false; } + static & IEnumKey> boolean containsIgnoreCase(String id, T... enumSet) { + for (T e : enumSet) { + if (e.getKey() != null && e.getKey().equalsIgnoreCase(id)) { + return true; + } + } + return false; + } static & IEnumKey> boolean contains(T e, T... enumSet) { for (T enumEl : enumSet) {