ialbert 2026-05-25 12:11:05 +03:00
parent ddcb0f2619
commit 9276156e1a

View file

@ -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<EquitySecurity> equitySecurityImdg;
private final Imdg<Company> cmpImdg;
private final Imdg<TradingClearingRegistry> tcrImdg;
private final Imdg<Market> mrktImdg;
private final ExecCurrCompCash valCash = new ExecCurrCompCash();
private final ImdgId idGen;
private final Imdg<Listing> 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<Long> stripDaysFromSecCode(String secCode) {
if (secCode == null || secCode.length() <= 7) {
return Optional.empty();
@ -471,6 +495,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
private final CashV2ByString<Security> digitCertSecCash;
private final CashV2ByString<Company> cmpCash;
private final CashV2ByIdAndString<TradingClearingRegistry> tcrCash;
private final CashV2ByString<Market> 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));
}
}
}