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) {