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 0cbb9a371..e2f57ab87 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,5 +1,6 @@ package ru.spcex.clearing.service.execution; +import static java.lang.String.format; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Instant; @@ -10,7 +11,6 @@ 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; @@ -30,6 +30,7 @@ import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; import ru.clearing.classes.statics.data.security.DigitalCertificateSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.Security; +import ru.spcex.clearing.config.element.ClearingServiceSettings; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingException; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -95,13 +96,15 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { private static final DateTimeFormatter contractFormatter = DateTimeFormatter.ofPattern("ddMMyy"); private final Map cash = new HashMap<>(); private final NotificationSender notifications; + private final boolean valuation; @Autowired public ExecutionCurrencyComponent(ImdgProvider imdgProvider, Producer kafka, @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, IMessageResolver msgResolver, - NotificationSender notifications) { + NotificationSender notifications, + ClearingServiceSettings serviceSettings) { this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); this.executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class); this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); @@ -114,7 +117,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { this.imdgDigitCertSecurity = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_DigitalCertificateSecurity, DigitalCertificateSecurity.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(); // resetTradingDay(); this.idGen = imdgProvider.getImdgIdGenerator(); this.notifications = notifications; @@ -225,6 +228,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { } execsToInsert.put(newEC.getId(), newEC); //executionCurrencyImdg.insert(newEC); + checkSettlementAmount(newEC, sTrd); sendNotification(newEC); } catch (ClearingException ce) { auditMessage(ce); @@ -243,6 +247,16 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { } } + private void checkSettlementAmount(ExecutionCurrency newEC, STrades sTrd) { + BigDecimal expectedSettlementAmount = sTrd.getValue().setScale(2, RoundingMode.HALF_UP); + BigDecimal actualSettlementAmount = newEC.getSettlementAmount(); + if (expectedSettlementAmount.compareTo(actualSettlementAmount) != 0) { + String comment = String.format("Для сделки %s объем сделки в ТС %s не совпадает с рассчитанным в КС %s", + sTrd.getTradeNum(), sTrd.getValue(), newEC.getSettlementAmount()); + notifications.sendNotification(ObjectType.vfrs, comment, Priority.HIGH); + } + } + protected void auditMessage(ClearingException ce) { String err = String.format("AUDIT error code %s: %s", ce.getEnumMsg(), ce.getMessage()); @@ -295,7 +309,16 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { // } eCurrency.setPrice(sTrades.getPrice()); eCurrency.setLots(sTrades.getQty()); - eCurrency.setSettlementAmount(safeBD(sTrades.getValue()).setScale(2, RoundingMode.HALF_UP)); + if (valuation) { + BigDecimal lotSize = listing != null ? safeBD(listing.getLotSize()) : BigDecimal.ONE; + BigDecimal settlementAmount = safeBD(sTrades.getPrice()) + .multiply(safeBD(sTrades.getQty())) + .multiply(lotSize) + .setScale(2, RoundingMode.HALF_UP); + eCurrency.setSettlementAmount(settlementAmount); + } else { + eCurrency.setSettlementAmount(safeBD(sTrades.getValue()).setScale(2, RoundingMode.HALF_UP)); + } if (listing != null && listing.getLotSize() != null && eCurrency.getLots() != null) { BigDecimal lots = eCurrency.getLots(); BigDecimal listingLotSize = listing.getLotSize();