etreschenkov 2026-04-22 17:05:30 +03:00
parent e5d8dd7ddb
commit dce6f9b7b8

View file

@ -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<ExecUploadKey, ExecUploadCashInfo> cash = new HashMap<>();
private final NotificationSender notifications;
private final boolean valuation;
@Autowired
public ExecutionCurrencyComponent(ImdgProvider imdgProvider, Producer<String, Object> 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();