diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/AppConfig.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/AppConfig.java index 95da03020..2033e8c28 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/AppConfig.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/AppConfig.java @@ -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.error.DefaultManagementErrors; import ru.spcex.clearing.util.security.UserRoleVerification; -import ru.spcex.clearing.util.services.IMDGMessageResolver; import ru.spcex.platform.enumeration.UserRole; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @@ -57,9 +56,4 @@ public class AppConfig { public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) { return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, DefaultManagementErrors.UserVerifyDenial); } - - @Bean - public IMessageResolver messageResolver(ImdgProvider imdgProvider) { - return new IMDGMessageResolver(imdgProvider); - } } diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java index 2ca80d7cd..d11692838 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java @@ -16,7 +16,7 @@ import ru.spcex.clearing.dflt.management.service.SpotOvernightOrderService; import ru.spcex.clearing.dflt.management.service.SwapOvernightOrderService; import ru.spcex.clearing.imdg.IMDGDistributedNames; 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.platform.enumeration.OvernightType; import ru.spcex.platform.enumeration.Task; @@ -48,13 +48,13 @@ public class TaskListener extends QueueConsumer implements InitializingBean { @Override public void afterPropertiesSet() { - callback(OvernightSettingsNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::createOrder) .forDestination(Task.CROR.topic(), callbacks::put); init(); } - private void createOrder(BaseRequest newReq) { + private void createOrder(BaseRequest newReq) { log.info("CROR createOrder started, request={}", newReq); Collection registryIds = imdgQueryService.getCurrencyRegistry(); diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java index 150dcbc2d..76f2c501a 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java @@ -71,7 +71,7 @@ public class ImdgQueryService { public Optional findOvernightSettingsByCompany(Long companyId) { ImdgPredicateBuilder builder = overnightSettingsImdg.predicateBuilder(); 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) ); OvernightSettings overnightSettings = overnightSettingsImdg.getFirstObjectByPredicate(predicate); @@ -89,7 +89,7 @@ public class ImdgQueryService { public CounterpartyInfo getCompanyByRole(CompanyRole role) { ImdgPredicateBuilder pb = companyRoleSetImdg.predicateBuilder(); CompanyRoleSet roleSet = companyRoleSetImdg.getSingleObjectByPredicate( - pb.equals("companyRole", role) + pb.equals("companyRole", role.getKey()) ); Company company = companyImdg.getSingleObjectByID(roleSet.getCompanyId()); @@ -126,12 +126,12 @@ public class ImdgQueryService { public Market getSwapMarket() { ImdgPredicateBuilder pb = marketImdg.predicateBuilder(); - return marketImdg.getSingleObjectByPredicate(pb.equals("marketType", MarketType.SCSW)); + return marketImdg.getSingleObjectByPredicate(pb.equals("marketType", MarketType.SCSW.getKey())); } public Market getSpotMarket() { 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) { @@ -164,8 +164,7 @@ public class ImdgQueryService { RiskParameter riskParameter = riskParameterImdg.getSingleObjectByPredicate( pb.and( pb.equals("settlementType", "T0"), - pb.equals("currencyPairId", currencyPairDictionaryId), - pb.equals("baseCurrency", baseCurrency) + pb.equals("currencyPairId", currencyPairDictionaryId) ) ); return riskParameter.getQuoteValue(); @@ -256,9 +255,9 @@ public class ImdgQueryService { ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); return registryImdg.getSingleObjectByPredicate( pb.and( - pb.regex("registryCode", "^PM.*T"), + pb.regex("registryCode", "^AM.*T"), pb.equals("securitySymbol", securitySymbol), - pb.equals("tradingClearingRegistryId", registry.getId()), + pb.equals("tradingClearingRegistryId", registry.getTradingClearingRegistryId()), pb.equals("companyId", registry.getCompanyId()) ) ); diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapCalculationService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java similarity index 73% rename from clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapCalculationService.java rename to clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java index a749d696e..ecf6eade8 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapCalculationService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java @@ -12,22 +12,23 @@ import ru.clearing.classes.statics.data.security.Rates; import ru.clearing.platform.dictionary.CurrencyPairDictionary; import ru.spcex.clearing.dflt.management.model.CalculationResult; import ru.spcex.clearing.dflt.management.model.SwapContext; +import ru.spcex.platform.enumeration.SettleCode; @Service -public class SwapCalculationService { +public class OrderCalculationService { private static final MathContext MC = new MathContext(20, RoundingMode.HALF_UP); private final ImdgQueryService imdgQueryService; private final TransferDateService transferDateService; - public SwapCalculationService(ImdgQueryService imdgQueryService, - TransferDateService transferDateService) { + public OrderCalculationService(ImdgQueryService imdgQueryService, + TransferDateService transferDateService) { this.imdgQueryService = imdgQueryService; this.transferDateService = transferDateService; } - public void calcAndEnrich(OrderCurrency order, - SwapContext context) { + public void calcAndEnrichSwap(OrderCurrency order, + SwapContext context) { Registry registry = context.getRegistry(); Listing listing = context.getListing(); @@ -46,6 +47,35 @@ public class SwapCalculationService { 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) { BigDecimal planPosition = registry.getBalance(); BigDecimal sum1 = planPosition.abs(); diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOrderTemplateBuilder.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java similarity index 82% rename from clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOrderTemplateBuilder.java rename to clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java index 147afc5b2..827b20664 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOrderTemplateBuilder.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java @@ -8,61 +8,66 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.RiskParameter; import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; 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; @Service -public class SwapOrderTemplateBuilder { +public class OrderTemplateBuilder { - public OrderCurrency buildPrimaryTransfer(SwapContext context) { + public OrderCurrency buildPrimaryTransfer(SwapContext context, SettleCode settleCode) { OrderCurrency orderCurrency; switch (context.getOrderCategory()) { case "PL" -> orderCurrency = buildPrimaryTransferPl(context); case "UK" -> orderCurrency = buildPrimaryTransferUk(context); default -> throw new IllegalArgumentException("Unsupported order category: " + context.getOrderCategory()); } - Side side = resolvePrimaryTransferSide(context.getRegistry()); - enrichOrder(orderCurrency, context, side, "overnight"); + Side side = resolvePrimaryTransferSide(context.getRegistry(), settleCode); + enrichOrder(orderCurrency, context, side, "overnight", settleCode); return orderCurrency; } - public OrderCurrency buildCounterTransfer(SwapContext context) { + public OrderCurrency buildCounterTransfer(SwapContext context, SettleCode settleCode) { OrderCurrency orderCurrency; switch (context.getOrderCategory()) { case "PL" -> orderCurrency = buildCounterTransferPl(context); case "UK" -> orderCurrency = buildCounterTransferUk(context); 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; } - public OrderCurrency buildPrimaryBalancing(SwapContext context) { + public OrderCurrency buildPrimaryBalancing(SwapContext context, SettleCode settleCode) { OrderCurrency orderCurrency; switch (context.getOrderCategory()) { case "PL" -> orderCurrency = buildPrimaryBalancingPl(context); case "UK" -> orderCurrency = buildPrimaryBalancingUk(context); 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; } - public OrderCurrency buildCounterBalancing(SwapContext context) { + public OrderCurrency buildCounterBalancing(SwapContext context, SettleCode settleCode) { OrderCurrency orderCurrency; switch (context.getOrderCategory()) { case "PL" -> orderCurrency = buildCounterBalancingPl(context); case "UK" -> orderCurrency = buildCounterBalancingUk(context); 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; } private OrderCurrency buildPrimaryTransferUk(SwapContext context) { - CounterpartyInfo clcc = context.getClcc(); + CounterpartyInfo clcc = context.getClcc(); Registry registry = context.getRegistry(); OrderCurrency order = new OrderCurrency(); @@ -182,9 +187,10 @@ public class SwapOrderTemplateBuilder { } public void enrichOrder(OrderCurrency order, - SwapContext context, - Side side, - String comment) { + SwapContext context, + Side side, + String comment, + SettleCode settleCode) { Registry registry = context.getRegistry(); Listing listing = context.getListing(); Market market = context.getMarket(); @@ -198,26 +204,30 @@ public class SwapOrderTemplateBuilder { order.setLotSize(listing.getLotSize()); order.setRate(riskParameter.getQuoteValue()); order.setSide(side.getKey()); - order.setSettleCode("T1"); + order.setSettleCode(settleCode.getKey()); order.setStatus("CRET"); order.setComment(comment); order.setRegistryId(registry.getId()); } - private Side resolvePrimaryTransferSide(Registry registry) { - return isRub(registry) ? Side.BUY : Side.SELL; + private Side resolvePrimaryTransferSide(Registry registry, SettleCode settleCode) { + Side side = T0 == settleCode ? Side.BUY : Side.SELL; + return isRub(registry) ? side : side.revers(); } - private Side resolveCounterTransferSide(Registry registry) { - return isRub(registry) ? Side.SELL : Side.BUY; + private Side resolveCounterTransferSide(Registry registry, SettleCode settleCode) { + Side side = T0 == settleCode ? Side.SELL : Side.BUY; + return isRub(registry) ? side : side.revers(); } - private Side resolvePrimaryBalancingSide(Registry registry) { - return isRub(registry) ? Side.SELL : Side.BUY; + private Side resolvePrimaryBalancingSide(Registry registry, SettleCode settleCode) { + Side side = T0 == settleCode ? Side.SELL : Side.BUY; + return isRub(registry) ? side : side.revers(); } - private Side resolveCounterBalancingSide(Registry registry) { - return isRub(registry) ? Side.BUY : Side.SELL; + private Side resolveCounterBalancingSide(Registry registry, SettleCode settleCode) { + Side side = T0 == settleCode ? Side.BUY : Side.SELL; + return isRub(registry) ? side : side.revers(); } private boolean isRub(Registry registry) { diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java index 5d31a4f1b..fe6e9fba2 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java @@ -12,6 +12,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; import ru.spcex.clearing.dflt.management.model.SwapContext; import ru.spcex.clearing.imdg.IMDGDistributedNames; 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.ImdgProvider; @@ -21,13 +22,13 @@ public class SpotOvernightOrderService { private final ImdgQueryService imdgQueryService; private final Imdg orderCurrencyImdg; - private final SwapOrderTemplateBuilder templateBuilder; - private final SwapCalculationService swapCalculationService; + private final OrderTemplateBuilder templateBuilder; + private final OrderCalculationService swapCalculationService; public SpotOvernightOrderService(ImdgProvider imdgProvider, ImdgQueryService imdgQueryService, - SwapOrderTemplateBuilder templateBuilder, - SwapCalculationService swapCalculationService) { + OrderTemplateBuilder templateBuilder, + OrderCalculationService swapCalculationService) { this.imdgQueryService = imdgQueryService; this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); this.templateBuilder = templateBuilder; @@ -55,20 +56,35 @@ public class SpotOvernightOrderService { .rgcm(rgcm) .build(); -// OrderCurrency primaryTransfer = templateBuilder.buildPrimaryTransfer(context); -// OrderCurrency counterTransfer = templateBuilder.buildCounterTransfer(context); -// OrderCurrency primaryBalancing = templateBuilder.buildPrimaryBalancing(context); -// OrderCurrency counterBalancing = templateBuilder.buildCounterBalancing(context); -// -// swapCalculationService.calcAndEnrich(primaryTransfer, context); -// swapCalculationService.calcAndEnrich(counterTransfer, context); -// swapCalculationService.calcAndEnrich(primaryBalancing, context); -// swapCalculationService.calcAndEnrich(counterBalancing, context); -// -// orderCurrencyImdg.insert(primaryTransfer); -// orderCurrencyImdg.insert(counterTransfer); -// orderCurrencyImdg.insert(primaryBalancing); -// orderCurrencyImdg.insert(counterBalancing); + OrderCurrency primaryTransferT0 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T0); + OrderCurrency counterTransferT0 = templateBuilder.buildCounterTransfer(context, SettleCode.T0); + OrderCurrency primaryTransferT1 = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1); + OrderCurrency counterTransferT1 = templateBuilder.buildCounterTransfer(context, SettleCode.T1); + + OrderCurrency primaryBalancingT0 = templateBuilder.buildPrimaryBalancing(context, SettleCode.T0); + OrderCurrency counterBalancingT0 = templateBuilder.buildCounterBalancing(context, SettleCode.T0); + OrderCurrency primaryBalancingT1 = templateBuilder.buildPrimaryBalancing(context, SettleCode.T1); + OrderCurrency counterBalancingT1 = templateBuilder.buildCounterBalancing(context, SettleCode.T1); + + swapCalculationService.calcAndEnrichSpot(primaryTransferT0, context); + swapCalculationService.calcAndEnrichSpot(counterTransferT0, context); + swapCalculationService.calcAndEnrichSpot(primaryTransferT1, context); + 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()); } diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java index 6925f318b..3a7f457ce 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java @@ -12,6 +12,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; import ru.spcex.clearing.dflt.management.model.SwapContext; import ru.spcex.clearing.imdg.IMDGDistributedNames; 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.ImdgProvider; @@ -21,13 +22,13 @@ public class SwapOvernightOrderService { private final ImdgQueryService imdgQueryService; private final Imdg orderCurrencyImdg; - private final SwapOrderTemplateBuilder templateBuilder; - private final SwapCalculationService swapCalculationService; + private final OrderTemplateBuilder templateBuilder; + private final OrderCalculationService swapCalculationService; public SwapOvernightOrderService(ImdgProvider imdgProvider, ImdgQueryService imdgQueryService, - SwapOrderTemplateBuilder templateBuilder, - SwapCalculationService swapCalculationService) { + OrderTemplateBuilder templateBuilder, + OrderCalculationService swapCalculationService) { this.imdgQueryService = imdgQueryService; this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); this.templateBuilder = templateBuilder; @@ -55,15 +56,15 @@ public class SwapOvernightOrderService { .rgcm(rgcm) .build(); - OrderCurrency primaryTransfer = templateBuilder.buildPrimaryTransfer(context); - OrderCurrency counterTransfer = templateBuilder.buildCounterTransfer(context); - OrderCurrency primaryBalancing = templateBuilder.buildPrimaryBalancing(context); - OrderCurrency counterBalancing = templateBuilder.buildCounterBalancing(context); + OrderCurrency primaryTransfer = templateBuilder.buildPrimaryTransfer(context, SettleCode.T1); + OrderCurrency counterTransfer = templateBuilder.buildCounterTransfer(context, SettleCode.T1); + OrderCurrency primaryBalancing = templateBuilder.buildPrimaryBalancing(context, SettleCode.T1); + OrderCurrency counterBalancing = templateBuilder.buildCounterBalancing(context, SettleCode.T1); - swapCalculationService.calcAndEnrich(primaryTransfer, context); - swapCalculationService.calcAndEnrich(counterTransfer, context); - swapCalculationService.calcAndEnrich(primaryBalancing, context); - swapCalculationService.calcAndEnrich(counterBalancing, context); + swapCalculationService.calcAndEnrichSwap(primaryTransfer, context); + swapCalculationService.calcAndEnrichSwap(counterTransfer, context); + swapCalculationService.calcAndEnrichSwap(primaryBalancing, context); + swapCalculationService.calcAndEnrichSwap(counterBalancing, context); orderCurrencyImdg.insert(primaryTransfer); orderCurrencyImdg.insert(counterTransfer); diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/config/deserializers/LocalDateTimeV2Deserializer.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/config/deserializers/LocalDateTimeV2Deserializer.java new file mode 100644 index 000000000..23ff5fd85 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/config/deserializers/LocalDateTimeV2Deserializer.java @@ -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 { + 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); + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/security/CurrencyRate.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/security/CurrencyRate.java index f8258a99a..c60b0e7b9 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/security/CurrencyRate.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/security/CurrencyRate.java @@ -6,7 +6,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; 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 { @@ -32,11 +32,11 @@ public class CurrencyRate { private BigDecimal price; - @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonDeserialize(using = LocalDateTimeV2Deserializer.class) @JsonProperty("update_date_time") private LocalDateTime updateDateTime; - @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonDeserialize(using = LocalDateTimeV2Deserializer.class) @JsonProperty("source_date_time") private LocalDateTime sourceDateTime; diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/listeners/RatesMessageListener.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/listeners/RatesMessageListener.java index dc51fd574..3b45db880 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/listeners/RatesMessageListener.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/listeners/RatesMessageListener.java @@ -121,7 +121,7 @@ public class RatesMessageListener extends QueueConsumer implements InitializingB ImdgPredicateBuilder predicateBuilder = ratesImdg.predicateBuilder(); Collection rateIds = ratesImdg.getCollectionIdsByPredicate( predicateBuilder.and( - predicateBuilder.equals("date", elem.getDate()), + predicateBuilder.equals("valueDate", elem.getDate()), predicateBuilder.equals("currency", elem.getBaseCurrencyLetterCode()) )); if (rateIds.isEmpty()) {