diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java index e2f57ab87..10f6cd517 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java @@ -1,6 +1,5 @@ package ru.spcex.clearing.service.execution; -import static java.lang.String.format; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Instant; @@ -11,6 +10,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import static java.lang.String.format; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +24,7 @@ import ru.clearing.classes.statics.data.execution.ExecutionCurrency; import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; 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.STrades; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; @@ -44,6 +45,7 @@ import ru.spcex.clearing.service.validation.strades.CompanyByTradingCodeCashingV import ru.spcex.clearing.service.validation.strades.STradesSecurityPresentValidationRule; import ru.spcex.clearing.service.validation.strades.TcrByCodeAndCmpIsActiveCashingValidationRule; import ru.spcex.clearing.validation.common.rules.FieldNotBlankRequiredRule; +import ru.spcex.platform.enumeration.MarketType; import ru.spcex.platform.enumeration.ObjectType; import ru.spcex.platform.enumeration.Priority; import ru.spcex.platform.enumeration.Section; @@ -64,6 +66,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.log.ExceptionUtils; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; +import static ru.spcex.platform.utils.number.BigDecimalUtil.safeSumBD; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; @@ -85,6 +88,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { private final Imdg equitySecurityImdg; private final Imdg cmpImdg; private final Imdg tcrImdg; + private final Imdg mrktImdg; private final ExecCurrCompCash valCash = new ExecCurrCompCash(); private final ImdgId idGen; private final Imdg listingImdg; @@ -115,6 +119,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { this.fixedIncomeSecurityImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class, null); this.equitySecurityImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class, null); this.imdgDigitCertSecurity = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_DigitalCertificateSecurity, DigitalCertificateSecurity.class, null); + this.mrktImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_Market, Market.class, null); this.cmpImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_Company, Company.class, null); this.tcrImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, null); this.valuation = serviceSettings.getTrade().getValuation(); @@ -309,7 +314,17 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { // } eCurrency.setPrice(sTrades.getPrice()); eCurrency.setLots(sTrades.getQty()); - if (valuation) { + Market market = Optional.of(marketCashingPredicate(eCurrency.getMarket())) + .map(mrktImdg::getSingleObjectByPredicate) + .orElse(null); + if (valuation && market != null && MarketType.SCSW.equalsByKey(market.getMarketType())) { + BigDecimal lotSize = listing != null ? safeBD(listing.getLotSize()) : BigDecimal.ONE; + BigDecimal settlementAmount = safeSumBD(sTrades.getPrice(), sTrades.getPrice2()) + .multiply(safeBD(sTrades.getQty())) + .multiply(lotSize) + .setScale(2, RoundingMode.HALF_UP); + eCurrency.setSettlementAmount(settlementAmount); + } else if (valuation) { BigDecimal lotSize = listing != null ? safeBD(listing.getLotSize()) : BigDecimal.ONE; BigDecimal settlementAmount = safeBD(sTrades.getPrice()) .multiply(safeBD(sTrades.getQty())) @@ -376,6 +391,15 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { return eCurrency; } + private ImdgPredicate marketCashingPredicate(String code) { + ImdgPredicateBuilder pb = mrktImdg.predicateBuilder(); + return pb.cashed( + pb.equals("code", code), + valCash.mrktCash, + code + ); + } + private Optional stripDaysFromSecCode(String secCode) { if (secCode == null || secCode.length() <= 7) { return Optional.empty(); @@ -471,6 +495,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { private final CashV2ByString digitCertSecCash; private final CashV2ByString cmpCash; private final CashV2ByIdAndString tcrCash; + private final CashV2ByString mrktCash; public ExecCurrCompCash() { this.cashes = new ArrayList<>(); @@ -481,6 +506,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { this.cmpCash = add(new CashV2ByString<>("cmpCash", Company::getTradingCode)); this.tcrCash = add(new CashV2ByIdAndString<>("tcrCash", tcr -> new CashV2ByIdAndString.CustomKey(tcr.getCompanyId(), tcr.getCode()))); this.digitCertSecCash = add(new CashV2ByString<>("digitCertSecCash", Security::getSecuritySymbol)); + this.mrktCash = add(new CashV2ByString<>("mrktCash", Market::getCode)); } } }