This commit is contained in:
parent
e5d8dd7ddb
commit
dce6f9b7b8
1 changed files with 27 additions and 4 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
package ru.spcex.clearing.service.execution;
|
package ru.spcex.clearing.service.execution;
|
||||||
|
|
||||||
|
import static java.lang.String.format;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
@ -10,7 +11,6 @@ import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import static java.lang.String.format;
|
|
||||||
import org.apache.kafka.clients.producer.Producer;
|
import org.apache.kafka.clients.producer.Producer;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.DigitalCertificateSecurity;
|
||||||
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
|
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
|
||||||
import ru.clearing.classes.statics.data.security.Security;
|
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.ClearingError;
|
||||||
import ru.spcex.clearing.error.ClearingException;
|
import ru.spcex.clearing.error.ClearingException;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
|
@ -95,13 +96,15 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
|
||||||
private static final DateTimeFormatter contractFormatter = DateTimeFormatter.ofPattern("ddMMyy");
|
private static final DateTimeFormatter contractFormatter = DateTimeFormatter.ofPattern("ddMMyy");
|
||||||
private final Map<ExecUploadKey, ExecUploadCashInfo> cash = new HashMap<>();
|
private final Map<ExecUploadKey, ExecUploadCashInfo> cash = new HashMap<>();
|
||||||
private final NotificationSender notifications;
|
private final NotificationSender notifications;
|
||||||
|
private final boolean valuation;
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public ExecutionCurrencyComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka,
|
public ExecutionCurrencyComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka,
|
||||||
@Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender,
|
@Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender,
|
||||||
IMessageResolver msgResolver,
|
IMessageResolver msgResolver,
|
||||||
NotificationSender notifications) {
|
NotificationSender notifications,
|
||||||
|
ClearingServiceSettings serviceSettings) {
|
||||||
this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
|
this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
|
||||||
this.executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class);
|
this.executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class);
|
||||||
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.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.imdgDigitCertSecurity = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_DigitalCertificateSecurity, DigitalCertificateSecurity.class, null);
|
||||||
this.cmpImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_Company, Company.class, null);
|
this.cmpImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_Company, Company.class, null);
|
||||||
this.tcrImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, null);
|
this.tcrImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, null);
|
||||||
|
this.valuation = serviceSettings.getTrade().getValuation();
|
||||||
// resetTradingDay();
|
// resetTradingDay();
|
||||||
this.idGen = imdgProvider.getImdgIdGenerator();
|
this.idGen = imdgProvider.getImdgIdGenerator();
|
||||||
this.notifications = notifications;
|
this.notifications = notifications;
|
||||||
|
|
@ -225,6 +228,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
|
||||||
}
|
}
|
||||||
execsToInsert.put(newEC.getId(), newEC);
|
execsToInsert.put(newEC.getId(), newEC);
|
||||||
//executionCurrencyImdg.insert(newEC);
|
//executionCurrencyImdg.insert(newEC);
|
||||||
|
checkSettlementAmount(newEC, sTrd);
|
||||||
sendNotification(newEC);
|
sendNotification(newEC);
|
||||||
} catch (ClearingException ce) {
|
} catch (ClearingException ce) {
|
||||||
auditMessage(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) {
|
protected void auditMessage(ClearingException ce) {
|
||||||
String err = String.format("AUDIT error code %s: %s", ce.getEnumMsg(), ce.getMessage());
|
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.setPrice(sTrades.getPrice());
|
||||||
eCurrency.setLots(sTrades.getQty());
|
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) {
|
if (listing != null && listing.getLotSize() != null && eCurrency.getLots() != null) {
|
||||||
BigDecimal lots = eCurrency.getLots();
|
BigDecimal lots = eCurrency.getLots();
|
||||||
BigDecimal listingLotSize = listing.getLotSize();
|
BigDecimal listingLotSize = listing.getLotSize();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue