Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
ialbert 2026-04-14 18:22:50 +03:00
commit d98ba8ab24
10 changed files with 157 additions and 85 deletions

View file

@ -10,7 +10,6 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import ru.spcex.clearing.dflt.management.config.settings.DefaultManagementSettings; import ru.spcex.clearing.dflt.management.config.settings.DefaultManagementSettings;
import ru.spcex.clearing.dflt.management.error.DefaultManagementErrors; import ru.spcex.clearing.dflt.management.error.DefaultManagementErrors;
import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
import ru.spcex.platform.enumeration.UserRole; import ru.spcex.platform.enumeration.UserRole;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
@ -57,9 +56,4 @@ public class AppConfig {
public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) { public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) {
return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, DefaultManagementErrors.UserVerifyDenial); return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, DefaultManagementErrors.UserVerifyDenial);
} }
@Bean
public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
} }

View file

@ -16,7 +16,7 @@ import ru.spcex.clearing.dflt.management.service.SpotOvernightOrderService;
import ru.spcex.clearing.dflt.management.service.SwapOvernightOrderService; import ru.spcex.clearing.dflt.management.service.SwapOvernightOrderService;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.misc.OvernightSettingsNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.enumeration.OvernightType; import ru.spcex.platform.enumeration.OvernightType;
import ru.spcex.platform.enumeration.Task; import ru.spcex.platform.enumeration.Task;
@ -48,13 +48,13 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
@Override @Override
public void afterPropertiesSet() { public void afterPropertiesSet() {
callback(OvernightSettingsNewRequest.class) callback(LauncherCommandRequest.class)
.setConsumer(this::createOrder) .setConsumer(this::createOrder)
.forDestination(Task.CROR.topic(), callbacks::put); .forDestination(Task.CROR.topic(), callbacks::put);
init(); init();
} }
private void createOrder(BaseRequest<OvernightSettingsNewRequest> newReq) { private void createOrder(BaseRequest<LauncherCommandRequest> newReq) {
log.info("CROR createOrder started, request={}", newReq); log.info("CROR createOrder started, request={}", newReq);
Collection<Long> registryIds = imdgQueryService.getCurrencyRegistry(); Collection<Long> registryIds = imdgQueryService.getCurrencyRegistry();

View file

@ -71,7 +71,7 @@ public class ImdgQueryService {
public Optional<OvernightSettings> findOvernightSettingsByCompany(Long companyId) { public Optional<OvernightSettings> findOvernightSettingsByCompany(Long companyId) {
ImdgPredicateBuilder builder = overnightSettingsImdg.predicateBuilder(); ImdgPredicateBuilder builder = overnightSettingsImdg.predicateBuilder();
ImdgPredicate predicate = builder.and( ImdgPredicate predicate = builder.and(
builder.equals("market", ru.spcex.platform.enumeration.Market.curr), builder.equals("market", ru.spcex.platform.enumeration.Market.curr.getKey()),
builder.equals("companyId", companyId) builder.equals("companyId", companyId)
); );
OvernightSettings overnightSettings = overnightSettingsImdg.getFirstObjectByPredicate(predicate); OvernightSettings overnightSettings = overnightSettingsImdg.getFirstObjectByPredicate(predicate);
@ -89,7 +89,7 @@ public class ImdgQueryService {
public CounterpartyInfo getCompanyByRole(CompanyRole role) { public CounterpartyInfo getCompanyByRole(CompanyRole role) {
ImdgPredicateBuilder pb = companyRoleSetImdg.predicateBuilder(); ImdgPredicateBuilder pb = companyRoleSetImdg.predicateBuilder();
CompanyRoleSet roleSet = companyRoleSetImdg.getSingleObjectByPredicate( CompanyRoleSet roleSet = companyRoleSetImdg.getSingleObjectByPredicate(
pb.equals("companyRole", role) pb.equals("companyRole", role.getKey())
); );
Company company = companyImdg.getSingleObjectByID(roleSet.getCompanyId()); Company company = companyImdg.getSingleObjectByID(roleSet.getCompanyId());
@ -126,12 +126,12 @@ public class ImdgQueryService {
public Market getSwapMarket() { public Market getSwapMarket() {
ImdgPredicateBuilder pb = marketImdg.predicateBuilder(); ImdgPredicateBuilder pb = marketImdg.predicateBuilder();
return marketImdg.getSingleObjectByPredicate(pb.equals("marketType", MarketType.SCSW)); return marketImdg.getSingleObjectByPredicate(pb.equals("marketType", MarketType.SCSW.getKey()));
} }
public Market getSpotMarket() { public Market getSpotMarket() {
ImdgPredicateBuilder pb = marketImdg.predicateBuilder(); ImdgPredicateBuilder pb = marketImdg.predicateBuilder();
return marketImdg.getSingleObjectByPredicate(pb.equals("marketType", MarketType.SCSP)); return marketImdg.getSingleObjectByPredicate(pb.equals("marketType", MarketType.SCSP.getKey()));
} }
public Listing findListing(Registry registry, String marketCode) { public Listing findListing(Registry registry, String marketCode) {
@ -164,8 +164,7 @@ public class ImdgQueryService {
RiskParameter riskParameter = riskParameterImdg.getSingleObjectByPredicate( RiskParameter riskParameter = riskParameterImdg.getSingleObjectByPredicate(
pb.and( pb.and(
pb.equals("settlementType", "T0"), pb.equals("settlementType", "T0"),
pb.equals("currencyPairId", currencyPairDictionaryId), pb.equals("currencyPairId", currencyPairDictionaryId)
pb.equals("baseCurrency", baseCurrency)
) )
); );
return riskParameter.getQuoteValue(); return riskParameter.getQuoteValue();
@ -256,9 +255,9 @@ public class ImdgQueryService {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
return registryImdg.getSingleObjectByPredicate( return registryImdg.getSingleObjectByPredicate(
pb.and( pb.and(
pb.regex("registryCode", "^PM.*T"), pb.regex("registryCode", "^AM.*T"),
pb.equals("securitySymbol", securitySymbol), pb.equals("securitySymbol", securitySymbol),
pb.equals("tradingClearingRegistryId", registry.getId()), pb.equals("tradingClearingRegistryId", registry.getTradingClearingRegistryId()),
pb.equals("companyId", registry.getCompanyId()) pb.equals("companyId", registry.getCompanyId())
) )
); );

View file

@ -12,21 +12,22 @@ import ru.clearing.classes.statics.data.security.Rates;
import ru.clearing.platform.dictionary.CurrencyPairDictionary; import ru.clearing.platform.dictionary.CurrencyPairDictionary;
import ru.spcex.clearing.dflt.management.model.CalculationResult; import ru.spcex.clearing.dflt.management.model.CalculationResult;
import ru.spcex.clearing.dflt.management.model.SwapContext; import ru.spcex.clearing.dflt.management.model.SwapContext;
import ru.spcex.platform.enumeration.SettleCode;
@Service @Service
public class SwapCalculationService { public class OrderCalculationService {
private static final MathContext MC = new MathContext(20, RoundingMode.HALF_UP); private static final MathContext MC = new MathContext(20, RoundingMode.HALF_UP);
private final ImdgQueryService imdgQueryService; private final ImdgQueryService imdgQueryService;
private final TransferDateService transferDateService; private final TransferDateService transferDateService;
public SwapCalculationService(ImdgQueryService imdgQueryService, public OrderCalculationService(ImdgQueryService imdgQueryService,
TransferDateService transferDateService) { TransferDateService transferDateService) {
this.imdgQueryService = imdgQueryService; this.imdgQueryService = imdgQueryService;
this.transferDateService = transferDateService; this.transferDateService = transferDateService;
} }
public void calcAndEnrich(OrderCurrency order, public void calcAndEnrichSwap(OrderCurrency order,
SwapContext context) { SwapContext context) {
Registry registry = context.getRegistry(); Registry registry = context.getRegistry();
Listing listing = context.getListing(); Listing listing = context.getListing();
@ -46,6 +47,35 @@ public class SwapCalculationService {
order.setQuantityLot(quantityLot); order.setQuantityLot(quantityLot);
} }
public void calcAndEnrichSpot(OrderCurrency order,
SwapContext context) {
Registry registry = context.getRegistry();
Listing listing = context.getListing();
CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryByListing(listing);
BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol());
BigDecimal n = transferDateService.numberOfDaysOfTransfer();
CalculationResult result = isRub(registry)
? calculationSwapRubSums(registry, listing.getLotSize().intValue(), s, n)
: calculationSwapSums(registry, listing.getLotSize().intValue(), s, n);
Rates rates = imdgQueryService.getRate(pair.getBaseCurrency(), LocalDate.now());
BigDecimal quantityLot;
BigDecimal price;
if (SettleCode.T0.equalsByKey(order.getSettleCode())) {
quantityLot = result.sum3().abs();
price = rates.getValue();
} else {
quantityLot = result.sum5().abs();
BigDecimal delta = swapPriceCalc(pair.getBaseCurrency(), s, n);
price = rates.getValue().add(delta);
}
order.setPrice(price);
order.setQuantityLot(quantityLot);
}
private CalculationResult calculationSwapSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) { private CalculationResult calculationSwapSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
BigDecimal planPosition = registry.getBalance(); BigDecimal planPosition = registry.getBalance();
BigDecimal sum1 = planPosition.abs(); BigDecimal sum1 = planPosition.abs();

View file

@ -8,56 +8,61 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.RiskParameter; import ru.clearing.classes.statics.data.security.RiskParameter;
import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; import ru.spcex.clearing.dflt.management.model.CounterpartyInfo;
import ru.spcex.clearing.dflt.management.model.SwapContext; import ru.spcex.clearing.dflt.management.model.SwapContext;
import ru.spcex.platform.enumeration.SettleCode;
import static ru.spcex.platform.enumeration.SettleCode.T0;
import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.enumeration.Side;
@Service @Service
public class SwapOrderTemplateBuilder { public class OrderTemplateBuilder {
public OrderCurrency buildPrimaryTransfer(SwapContext context) { public OrderCurrency buildPrimaryTransfer(SwapContext context, SettleCode settleCode) {
OrderCurrency orderCurrency; OrderCurrency orderCurrency;
switch (context.getOrderCategory()) { switch (context.getOrderCategory()) {
case "PL" -> orderCurrency = buildPrimaryTransferPl(context); case "PL" -> orderCurrency = buildPrimaryTransferPl(context);
case "UK" -> orderCurrency = buildPrimaryTransferUk(context); case "UK" -> orderCurrency = buildPrimaryTransferUk(context);
default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory()); default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory());
} }
Side side = resolvePrimaryTransferSide(context.getRegistry()); Side side = resolvePrimaryTransferSide(context.getRegistry(), settleCode);
enrichOrder(orderCurrency, context, side, "overnight"); enrichOrder(orderCurrency, context, side, "overnight", settleCode);
return orderCurrency; return orderCurrency;
} }
public OrderCurrency buildCounterTransfer(SwapContext context) { public OrderCurrency buildCounterTransfer(SwapContext context, SettleCode settleCode) {
OrderCurrency orderCurrency; OrderCurrency orderCurrency;
switch (context.getOrderCategory()) { switch (context.getOrderCategory()) {
case "PL" -> orderCurrency = buildCounterTransferPl(context); case "PL" -> orderCurrency = buildCounterTransferPl(context);
case "UK" -> orderCurrency = buildCounterTransferUk(context); case "UK" -> orderCurrency = buildCounterTransferUk(context);
default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory()); default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory());
}; }
Side side = resolveCounterTransferSide(context.getRegistry()); ;
enrichOrder(orderCurrency, context, side, "overnight"); Side side = resolveCounterTransferSide(context.getRegistry(), settleCode);
enrichOrder(orderCurrency, context, side, "overnight", settleCode);
return orderCurrency; return orderCurrency;
} }
public OrderCurrency buildPrimaryBalancing(SwapContext context) { public OrderCurrency buildPrimaryBalancing(SwapContext context, SettleCode settleCode) {
OrderCurrency orderCurrency; OrderCurrency orderCurrency;
switch (context.getOrderCategory()) { switch (context.getOrderCategory()) {
case "PL" -> orderCurrency = buildPrimaryBalancingPl(context); case "PL" -> orderCurrency = buildPrimaryBalancingPl(context);
case "UK" -> orderCurrency = buildPrimaryBalancingUk(context); case "UK" -> orderCurrency = buildPrimaryBalancingUk(context);
default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory()); default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory());
}; }
Side side = resolvePrimaryBalancingSide(context.getRegistry()); ;
enrichOrder(orderCurrency, context, side, "balance"); Side side = resolvePrimaryBalancingSide(context.getRegistry(), settleCode);
enrichOrder(orderCurrency, context, side, "balance", settleCode);
return orderCurrency; return orderCurrency;
} }
public OrderCurrency buildCounterBalancing(SwapContext context) { public OrderCurrency buildCounterBalancing(SwapContext context, SettleCode settleCode) {
OrderCurrency orderCurrency; OrderCurrency orderCurrency;
switch (context.getOrderCategory()) { switch (context.getOrderCategory()) {
case "PL" -> orderCurrency = buildCounterBalancingPl(context); case "PL" -> orderCurrency = buildCounterBalancingPl(context);
case "UK" -> orderCurrency = buildCounterBalancingUk(context); case "UK" -> orderCurrency = buildCounterBalancingUk(context);
default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory()); default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory());
}; }
Side side = resolveCounterBalancingSide(context.getRegistry()); ;
enrichOrder(orderCurrency, context, side, "balance"); Side side = resolveCounterBalancingSide(context.getRegistry(), settleCode);
enrichOrder(orderCurrency, context, side, "balance", settleCode);
return orderCurrency; return orderCurrency;
} }
@ -184,7 +189,8 @@ public class SwapOrderTemplateBuilder {
public void enrichOrder(OrderCurrency order, public void enrichOrder(OrderCurrency order,
SwapContext context, SwapContext context,
Side side, Side side,
String comment) { String comment,
SettleCode settleCode) {
Registry registry = context.getRegistry(); Registry registry = context.getRegistry();
Listing listing = context.getListing(); Listing listing = context.getListing();
Market market = context.getMarket(); Market market = context.getMarket();
@ -198,26 +204,30 @@ public class SwapOrderTemplateBuilder {
order.setLotSize(listing.getLotSize()); order.setLotSize(listing.getLotSize());
order.setRate(riskParameter.getQuoteValue()); order.setRate(riskParameter.getQuoteValue());
order.setSide(side.getKey()); order.setSide(side.getKey());
order.setSettleCode("T1"); order.setSettleCode(settleCode.getKey());
order.setStatus("CRET"); order.setStatus("CRET");
order.setComment(comment); order.setComment(comment);
order.setRegistryId(registry.getId()); order.setRegistryId(registry.getId());
} }
private Side resolvePrimaryTransferSide(Registry registry) { private Side resolvePrimaryTransferSide(Registry registry, SettleCode settleCode) {
return isRub(registry) ? Side.BUY : Side.SELL; Side side = T0 == settleCode ? Side.BUY : Side.SELL;
return isRub(registry) ? side : side.revers();
} }
private Side resolveCounterTransferSide(Registry registry) { private Side resolveCounterTransferSide(Registry registry, SettleCode settleCode) {
return isRub(registry) ? Side.SELL : Side.BUY; Side side = T0 == settleCode ? Side.SELL : Side.BUY;
return isRub(registry) ? side : side.revers();
} }
private Side resolvePrimaryBalancingSide(Registry registry) { private Side resolvePrimaryBalancingSide(Registry registry, SettleCode settleCode) {
return isRub(registry) ? Side.SELL : Side.BUY; Side side = T0 == settleCode ? Side.SELL : Side.BUY;
return isRub(registry) ? side : side.revers();
} }
private Side resolveCounterBalancingSide(Registry registry) { private Side resolveCounterBalancingSide(Registry registry, SettleCode settleCode) {
return isRub(registry) ? Side.BUY : Side.SELL; Side side = T0 == settleCode ? Side.BUY : Side.SELL;
return isRub(registry) ? side : side.revers();
} }
private boolean isRub(Registry registry) { private boolean isRub(Registry registry) {

View file

@ -12,6 +12,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo;
import ru.spcex.clearing.dflt.management.model.SwapContext; import ru.spcex.clearing.dflt.management.model.SwapContext;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.CompanyRole; import ru.spcex.platform.enumeration.CompanyRole;
import ru.spcex.platform.enumeration.SettleCode;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
@ -21,13 +22,13 @@ public class SpotOvernightOrderService {
private final ImdgQueryService imdgQueryService; private final ImdgQueryService imdgQueryService;
private final Imdg<OrderCurrency> orderCurrencyImdg; private final Imdg<OrderCurrency> orderCurrencyImdg;
private final SwapOrderTemplateBuilder templateBuilder; private final OrderTemplateBuilder templateBuilder;
private final SwapCalculationService swapCalculationService; private final OrderCalculationService swapCalculationService;
public SpotOvernightOrderService(ImdgProvider imdgProvider, public SpotOvernightOrderService(ImdgProvider imdgProvider,
ImdgQueryService imdgQueryService, ImdgQueryService imdgQueryService,
SwapOrderTemplateBuilder templateBuilder, OrderTemplateBuilder templateBuilder,
SwapCalculationService swapCalculationService) { OrderCalculationService swapCalculationService) {
this.imdgQueryService = imdgQueryService; this.imdgQueryService = imdgQueryService;
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
this.templateBuilder = templateBuilder; this.templateBuilder = templateBuilder;
@ -55,20 +56,35 @@ public class SpotOvernightOrderService {
.rgcm(rgcm) .rgcm(rgcm)
.build(); .build();
// OrderCurrency primaryTransfer = templateBuilder.buildPrimaryTransfer(context); OrderCurrency primaryTransferT0 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T0);
// OrderCurrency counterTransfer = templateBuilder.buildCounterTransfer(context); OrderCurrency counterTransferT0 = templateBuilder.buildCounterTransfer(context, SettleCode.T0);
// OrderCurrency primaryBalancing = templateBuilder.buildPrimaryBalancing(context); OrderCurrency primaryTransferT1 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1);
// OrderCurrency counterBalancing = templateBuilder.buildCounterBalancing(context); OrderCurrency counterTransferT1 = templateBuilder.buildCounterTransfer(context, SettleCode.T1);
//
// swapCalculationService.calcAndEnrich(primaryTransfer, context); OrderCurrency primaryBalancingT0 = templateBuilder.buildPrimaryBalancing(context, SettleCode.T0);
// swapCalculationService.calcAndEnrich(counterTransfer, context); OrderCurrency counterBalancingT0 = templateBuilder.buildCounterBalancing(context, SettleCode.T0);
// swapCalculationService.calcAndEnrich(primaryBalancing, context); OrderCurrency primaryBalancingT1 = templateBuilder.buildPrimaryBalancing(context, SettleCode.T1);
// swapCalculationService.calcAndEnrich(counterBalancing, context); OrderCurrency counterBalancingT1 = templateBuilder.buildCounterBalancing(context, SettleCode.T1);
//
// orderCurrencyImdg.insert(primaryTransfer); swapCalculationService.calcAndEnrichSpot(primaryTransferT0, context);
// orderCurrencyImdg.insert(counterTransfer); swapCalculationService.calcAndEnrichSpot(counterTransferT0, context);
// orderCurrencyImdg.insert(primaryBalancing); swapCalculationService.calcAndEnrichSpot(primaryTransferT1, context);
// orderCurrencyImdg.insert(counterBalancing); swapCalculationService.calcAndEnrichSpot(counterTransferT1, context);
swapCalculationService.calcAndEnrichSpot(primaryBalancingT0, context);
swapCalculationService.calcAndEnrichSpot(counterBalancingT0, context);
swapCalculationService.calcAndEnrichSpot(primaryBalancingT1, context);
swapCalculationService.calcAndEnrichSpot(counterBalancingT1, context);
orderCurrencyImdg.insert(primaryTransferT0);
orderCurrencyImdg.insert(counterTransferT0);
orderCurrencyImdg.insert(primaryTransferT1);
orderCurrencyImdg.insert(counterTransferT1);
orderCurrencyImdg.insert(primaryBalancingT0);
orderCurrencyImdg.insert(counterBalancingT0);
orderCurrencyImdg.insert(primaryBalancingT1);
orderCurrencyImdg.insert(counterBalancingT1);
log.info("Spot orders created for registryId={}", registry.getId()); log.info("Spot orders created for registryId={}", registry.getId());
} }

View file

@ -12,6 +12,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo;
import ru.spcex.clearing.dflt.management.model.SwapContext; import ru.spcex.clearing.dflt.management.model.SwapContext;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.CompanyRole; import ru.spcex.platform.enumeration.CompanyRole;
import ru.spcex.platform.enumeration.SettleCode;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
@ -21,13 +22,13 @@ public class SwapOvernightOrderService {
private final ImdgQueryService imdgQueryService; private final ImdgQueryService imdgQueryService;
private final Imdg<OrderCurrency> orderCurrencyImdg; private final Imdg<OrderCurrency> orderCurrencyImdg;
private final SwapOrderTemplateBuilder templateBuilder; private final OrderTemplateBuilder templateBuilder;
private final SwapCalculationService swapCalculationService; private final OrderCalculationService swapCalculationService;
public SwapOvernightOrderService(ImdgProvider imdgProvider, public SwapOvernightOrderService(ImdgProvider imdgProvider,
ImdgQueryService imdgQueryService, ImdgQueryService imdgQueryService,
SwapOrderTemplateBuilder templateBuilder, OrderTemplateBuilder templateBuilder,
SwapCalculationService swapCalculationService) { OrderCalculationService swapCalculationService) {
this.imdgQueryService = imdgQueryService; this.imdgQueryService = imdgQueryService;
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
this.templateBuilder = templateBuilder; this.templateBuilder = templateBuilder;
@ -55,15 +56,15 @@ public class SwapOvernightOrderService {
.rgcm(rgcm) .rgcm(rgcm)
.build(); .build();
OrderCurrency primaryTransfer = templateBuilder.buildPrimaryTransfer(context); OrderCurrency primaryTransfer = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1);
OrderCurrency counterTransfer = templateBuilder.buildCounterTransfer(context); OrderCurrency counterTransfer = templateBuilder.buildCounterTransfer(context, SettleCode.T1);
OrderCurrency primaryBalancing = templateBuilder.buildPrimaryBalancing(context); OrderCurrency primaryBalancing = templateBuilder.buildPrimaryBalancing(context, SettleCode.T1);
OrderCurrency counterBalancing = templateBuilder.buildCounterBalancing(context); OrderCurrency counterBalancing = templateBuilder.buildCounterBalancing(context, SettleCode.T1);
swapCalculationService.calcAndEnrich(primaryTransfer, context); swapCalculationService.calcAndEnrichSwap(primaryTransfer, context);
swapCalculationService.calcAndEnrich(counterTransfer, context); swapCalculationService.calcAndEnrichSwap(counterTransfer, context);
swapCalculationService.calcAndEnrich(primaryBalancing, context); swapCalculationService.calcAndEnrichSwap(primaryBalancing, context);
swapCalculationService.calcAndEnrich(counterBalancing, context); swapCalculationService.calcAndEnrichSwap(counterBalancing, context);
orderCurrencyImdg.insert(primaryTransfer); orderCurrencyImdg.insert(primaryTransfer);
orderCurrencyImdg.insert(counterTransfer); orderCurrencyImdg.insert(counterTransfer);

View file

@ -0,0 +1,22 @@
package ru.spcex.clearing.gatewayapi.config.deserializers;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDateTimeV2Deserializer extends JsonDeserializer<LocalDateTime> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS");
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String date = p.getText();
if (date == null || date.trim().length() == 0) {
return null;
}
return LocalDateTime.parse(date, formatter);
}
}

View file

@ -6,7 +6,7 @@ import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer; import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer;
import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateTimeDeserializer; import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateTimeV2Deserializer;
public class CurrencyRate { public class CurrencyRate {
@ -32,11 +32,11 @@ public class CurrencyRate {
private BigDecimal price; private BigDecimal price;
@JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonDeserialize(using = LocalDateTimeV2Deserializer.class)
@JsonProperty("update_date_time") @JsonProperty("update_date_time")
private LocalDateTime updateDateTime; private LocalDateTime updateDateTime;
@JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonDeserialize(using = LocalDateTimeV2Deserializer.class)
@JsonProperty("source_date_time") @JsonProperty("source_date_time")
private LocalDateTime sourceDateTime; private LocalDateTime sourceDateTime;

View file

@ -121,7 +121,7 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB
ImdgPredicateBuilder predicateBuilder = ratesImdg.predicateBuilder(); ImdgPredicateBuilder predicateBuilder = ratesImdg.predicateBuilder();
Collection<Long> rateIds = ratesImdg.getCollectionIdsByPredicate( Collection<Long> rateIds = ratesImdg.getCollectionIdsByPredicate(
predicateBuilder.and( predicateBuilder.and(
predicateBuilder.equals("date", elem.getDate()), predicateBuilder.equals("valueDate", elem.getDate()),
predicateBuilder.equals("currency", elem.getBaseCurrencyLetterCode()) predicateBuilder.equals("currency", elem.getBaseCurrencyLetterCode())
)); ));
if (rateIds.isEmpty()) { if (rateIds.isEmpty()) {