This commit is contained in:
parent
d06a0efeec
commit
f92941a2fc
4 changed files with 61 additions and 19 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue