ialbert 2024-02-09 18:17:05 +03:00
parent d06a0efeec
commit f92941a2fc
4 changed files with 61 additions and 19 deletions

View file

@ -1,5 +1,13 @@
package ru.spcex.clearing.service.execution;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -14,6 +22,8 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow;
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.SCrossRate;
import ru.clearing.classes.statics.data.misc.STrades;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.security.Security;
@ -27,25 +37,25 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewR
import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionType;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.InstrumentType;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.Section;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.*;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumId;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.time.TimeUtil;
import ru.spcex.platform.utils.validation.IValidator;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Component
@ -58,7 +68,8 @@ public class ExecutionFondComponent {
private final Imdg<Listing> listingImdg;
private final Imdg<ClientCode> clientCodeImdg;
private final Imdg<FixedIncomeCashFlow> fixedIncomeCashFlowImdg;
private final Imdg<ru.clearing.classes.statics.data.misc.Market> marketImdg;
private final Imdg<Market> marketImdg;
private final Imdg<SCrossRate> crossRateImdg;
//fixme ждать ТЗ
Long tradeNum;
@ -80,8 +91,9 @@ public class ExecutionFondComponent {
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, ru.clearing.classes.statics.data.misc.Market.class);
this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class);
this.fixedIncomeCashFlowImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class);
this.crossRateImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SCrossRate, SCrossRate.class);
this.valuation = settings.getTrade().getValuation(); //fixme
this.stradesValidator = stradesValidator;
this.kafkaSender = kafkaSender;
@ -196,7 +208,7 @@ public class ExecutionFondComponent {
eFond.setTradingClearingRegistryId(rgstr.getId());
//todo можем ли просто переложить sTrades.getClassCode() или все такие искать, одно и тоже же
ru.clearing.classes.statics.data.misc.Market market = marketImdg.getFirstObjectBySQL("code = '%s'".formatted(sTrades.getClassCode()));
Market market = marketImdg.getFirstObjectBySQL("code = '%s'".formatted(sTrades.getClassCode()));
eFond.setMarket(sTrades.getClassCode());
eFond.setPrice(sTrades.getPrice());
@ -251,8 +263,25 @@ public class ExecutionFondComponent {
nominalValue = safeBD(fixedIncome.getNominalValue());
}
{
BigDecimal crossRate;
String currency = fixedIncome.getNominalCurrency();
if (TextUtil.isEmpty(currency) || CurrencyCode.isRub(currency)) {
crossRate = BigDecimal.ONE;
} else {
ImdgPredicateBuilder crsRtpb = crossRateImdg.predicateBuilder();
ImdgPredicate crsRtePrdct = crsRtpb.and(
crsRtpb.equals("date", LocalDate.now()),
crsRtpb.equals("currency", currency)
);
SCrossRate crsRte = crossRateImdg.getFirstObjectByPredicate(crsRtePrdct);
if (crsRte != null) {
crossRate = safeBD(crsRte.getUnitRate());
} else {
crossRate = BigDecimal.ZERO;
}
}
settlementAmount = eFond.getQuantity()
.multiply(nominalValue)
.multiply(nominalValue.multiply(crossRate))
.multiply(price)
.divide(new BigDecimal(100), RoundingMode.HALF_UP)
.setScale(2, RoundingMode.HALF_UP);

View file

@ -4,9 +4,14 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum CurrencyCode implements IEnumKey {
RUB("RUB"),
RUR("RUR") //fixme may be remove to separate enum
RUR("RUR"),//fixme may be remove to separate enum
SUR("SUR"),
;
public static boolean isRub(String currencyCode) {
return IEnumKey.containsIgnoreCase(currencyCode, RUB, RUR, SUR);
}
private final String key;
CurrencyCode(String key) {

View file

@ -3,8 +3,8 @@ package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum InstrumentType implements IEnumKey {
BOND("BOND"), // Долевые ценные бумаги (акции)
EQTY("EQTY"), // Долговые ценные бумаги (облигации)
BOND("BOND"), // (облигации)
EQTY("EQTY"), // (акции)
RATE("RATE"), // Инструмент Денежного рынка
CRNC ("CRNC")
;

View file

@ -21,6 +21,14 @@ public interface IEnumKey extends Serializable {
}
return false;
}
static <T extends Enum<T> & IEnumKey> boolean containsIgnoreCase(String id, T... enumSet) {
for (T e : enumSet) {
if (e.getKey() != null && e.getKey().equalsIgnoreCase(id)) {
return true;
}
}
return false;
}
static <T extends Enum<T> & IEnumKey> boolean contains(T e, T... enumSet) {
for (T enumEl : enumSet) {