diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/component/validation/OrderCurrencyByCompanyAndTcrAlreadyPresent.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/component/validation/OrderCurrencyByCompanyAndTcrAlreadyPresent.java index 4d1988594..9499ec55b 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/component/validation/OrderCurrencyByCompanyAndTcrAlreadyPresent.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/component/validation/OrderCurrencyByCompanyAndTcrAlreadyPresent.java @@ -26,12 +26,14 @@ public class OrderCurrencyByCompanyAndTcrAlreadyPresent validate(ImdgValidationContext ctx) { T validatedObject = ctx.getValidatedObject(); Imdg imdg = ctx.obtainMap(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); + OrderCurrency existOrder = ctx.getStoredObject(OrderCurrencyValidationStored.OrderCurrency); ImdgPredicateBuilder pb = imdg.predicateBuilder(); Collection orders = imdg.getCollectionObjectsByPredicate( pb.and( pb.equals("tradingClearingRegistryId", validatedObject.getTradingClearingRegistryId()), pb.equals("companyId", validatedObject.getCompanyId()), - pb.equals("status", OrderStatus.CREATED.getKey()) + pb.equals("status", OrderStatus.CREATED.getKey()), + pb.equals("registryId", existOrder.getRegistryId()) ) ); if (!orders.isEmpty()) { 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 0afd23839..3154e7294 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 @@ -9,11 +9,13 @@ import java.nio.file.Path; import java.time.Instant; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Arrays; import java.util.Collection; -import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -44,6 +46,7 @@ import ru.spcex.platform.enumeration.ObjectType; import ru.spcex.platform.enumeration.OrderStatus; import ru.spcex.platform.enumeration.OvernightType; import ru.spcex.platform.enumeration.Priority; +import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.enumeration.Task; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -155,13 +158,13 @@ public class TaskListener extends QueueConsumer implements InitializingBean { private void exportToTriAndSendToFix(BaseRequest req) { log.info("SDOR check balance and send notification, request={}", req); Collection cretOrderCurrencies = imdgQueryService.getCRETOrderCurrencies(); - HashSet seen = new HashSet<>(); - Collection withRegistryIdUnique = cretOrderCurrencies.stream() - .filter(orderCurrency -> seen.add(orderCurrency.getRegistryId())) - .toList(); + Map> cretOrderCurrenciesByRegistryId = cretOrderCurrencies.stream() + .filter(orderCurrency -> IEnumKey.getEnumByKey(Side.class, orderCurrency.getSide()) == Side.SELL && + (Arrays.asList("CMOV", "PLOV").contains(orderCurrency.getType()))) + .collect(Collectors.groupingBy(OrderCurrency::getRegistryId)); - List messages = withRegistryIdUnique.stream() - .map(this::checkBalance) + List messages = cretOrderCurrenciesByRegistryId.entrySet().stream() + .map(entry -> checkBalance(entry.getKey(), entry.getValue())) .filter(Objects::nonNull) .toList(); @@ -187,8 +190,10 @@ public class TaskListener extends QueueConsumer implements InitializingBean { } } - private String checkBalance(OrderCurrency orderCurrency) { - Registry pmtRegistry = imdgQueryService.getRegistryById(orderCurrency.getRegistryId()); + private String checkBalance(Long registryId, List orderCurrencies) { + log.debug("Check balance for registryId={}; order ids: {}", registryId, + orderCurrencies.stream().map(OrderCurrency::getId).collect(Collectors.toList())); + Registry pmtRegistry = imdgQueryService.getRegistryById(registryId); Registry amfRegistry = null; boolean isRubPmt = pmtRegistry.getSecuritySymbol().equals(CurrencyCode.RUB.getKey()); if (!isRubPmt) { @@ -198,13 +203,23 @@ public class TaskListener extends QueueConsumer implements InitializingBean { String currency = isRubPmt ? CurrencyCode.CNY.getKey() : pmtRegistry.getSecuritySymbol(); Rates rates = imdgQueryService.getRateOnNextWorkingDay(currency); - BigDecimal val = orderCurrency.getQuantityLot() - .multiply(orderCurrency.getLotSize()) - .multiply(rates.getValue()); - - BigDecimal diff = isRubPmt ? - pmtRegistry.getBalance().add(val) : - amfRegistry.getBalance().subtract(val); + BigDecimal summaryValByCurrencies = BigDecimal.ZERO; + for (OrderCurrency orderCurrency : orderCurrencies) { + summaryValByCurrencies = summaryValByCurrencies.add(orderCurrency.getQuantityLot() + .multiply(orderCurrency.getLotSize()) + .multiply(rates.getValue())); + } + BigDecimal registryBalance; + BigDecimal diff; + if (isRubPmt) { + registryBalance = pmtRegistry.getBalance(); + diff = registryBalance.add(summaryValByCurrencies); + } else { + registryBalance = amfRegistry.getBalance(); + diff = registryBalance.subtract(summaryValByCurrencies); + } + log.debug("Registry balance: {}; Summary balance by orders: {}; diff: {}", registryBalance, + summaryValByCurrencies, diff); if (diff.compareTo(BigDecimal.ZERO) < 0) { return String.format("Для ТКР %s компании %s: баланс %s RUB;", pmtRegistry.getTradingClearingRegistry(), pmtRegistry.getShortName(), diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java index 4b8a4037f..d5edb9a78 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java @@ -94,7 +94,7 @@ public class OrderCalculationService { throw new IllegalStateException(String.format("Not fond rate by security symbol: %s", CurrencyCode.CNY.getKey())); } BigDecimal rateValue = rates.getValue(); - BigDecimal sum3 = sum1.divide(BigDecimal.valueOf(lotSize), 0, RoundingMode.DOWN); + BigDecimal sum3 = sum1.divide(BigDecimal.valueOf(lotSize), 0, RoundingMode.UP); BigDecimal sum4 = sum3.multiply(rateValue, MC).negate(); BigDecimal sum5 = sum3.negate();