From e9636e8723da38ebc28523bf378c48fe70f51afa Mon Sep 17 00:00:00 2001 From: psemenkov Date: Tue, 22 Aug 2023 17:40:58 +0300 Subject: [PATCH] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-262=20?= =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D0=BB=20=D0=B2=D1=8B=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D1=83=20=D0=B4=D0=B5=D0=BD=D0=B5=D0=B3?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/AbstractExporterService.java | 23 +++++++ .../services/MoneyExporterService.java | 62 +++++++++---------- .../services/SecurityExporterService.java | 24 ++----- .../lim/exporter/AbstractServiceTest.java | 16 +++-- .../services/MoneyExporterServiceTest.java | 17 +++-- .../services/SecurityExporterServiceTest.java | 11 ++-- .../enumeration/RegistryTradingParams.java | 5 ++ 7 files changed, 93 insertions(+), 65 deletions(-) diff --git a/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/AbstractExporterService.java b/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/AbstractExporterService.java index 1cdac46e0..aa3a46ede 100644 --- a/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/AbstractExporterService.java +++ b/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/AbstractExporterService.java @@ -19,6 +19,7 @@ import ru.spcex.platform.utils.log.ExceptionUtils; import java.io.File; import java.io.IOException; +import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDateTime; @@ -109,4 +110,26 @@ public abstract class AbstractExporterService { } return false; } + + protected BigDecimal sumNegativeABS(Collection registries) { + if (registries == null || registries.isEmpty()) return BigDecimal.ZERO; + BigDecimal result = BigDecimal.ZERO; + for (Registry registry : registries) { + if (registry.getBalance() != null && registry.getBalance().compareTo(BigDecimal.ZERO) < 0) { + result = result.add(registry.getBalance().abs()); + } + } + return result; + } + + protected BigDecimal sum(Collection registries) { + if (registries == null || registries.isEmpty()) return BigDecimal.ZERO; + BigDecimal result = BigDecimal.ZERO; + for (Registry registry : registries) { + if (registry.getBalance() != null) { + result = result.add(registry.getBalance()); + } + } + return result; + } } diff --git a/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/MoneyExporterService.java b/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/MoneyExporterService.java index 1b4ffe6b1..3eea0d108 100644 --- a/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/MoneyExporterService.java +++ b/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/MoneyExporterService.java @@ -3,21 +3,24 @@ package ru.spcex.clearing.lim.exporter.services; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.lim.exporter.config.LimFormat; import ru.spcex.clearing.lim.exporter.config.SFTPConfig; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.Section; 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.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import java.math.BigDecimal; -import java.util.*; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; -import static ru.spcex.platform.enumeration.RegistryTradingParams.AM_F; -import static ru.spcex.platform.enumeration.RegistryTradingParams.DM_T; +import static ru.spcex.platform.enumeration.RegistryTradingParams.*; @Service public class MoneyExporterService extends AbstractExporterService { @@ -44,30 +47,36 @@ public class MoneyExporterService extends AbstractExporterService { log.debug("Started loading and formation of money file lines"); List limFileRows = new ArrayList<>(); Collection registriesA = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(AM_F).build()); - Collection registriesD = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(DM_T).build()); + log.debug("Selected {} registriesA.", registriesA.size()); - Map> byTcrA = registriesA.stream().filter(r -> StringUtils.hasText(r.getTradingClearingRegistry())) - .collect(Collectors.groupingBy(Registry::getTradingClearingRegistry)); - Map> byTcrD = registriesD.stream().filter(r -> StringUtils.hasText(r.getTradingClearingRegistry())) - .collect(Collectors.groupingBy(Registry::getTradingClearingRegistry)); - log.debug("Selected {} registriesA, {} registriesD. {} groups of A, {} groups of D.", - registriesA.size(), registriesD.size(), byTcrA.size(), byTcrD.size()); + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + Function prdctDM_T = registry -> pb.and( + pb.sql(RegistryCodeSqlBuilder.getInstance(DM_T).build()), + pb.equals("registryStatus", RegistryStatus.PROC.getKey()), + pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()), + pb.equals("securityId", registry.getSecurityId()) + ); + Function prdctDM_I = registry -> pb.and( + pb.sql(RegistryCodeSqlBuilder.getInstance(DM_I).build()), + pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()), + pb.equals("securityId", registry.getSecurityId()) + ); - for (Map.Entry> entryA : byTcrA.entrySet()) { - List registriesListA = entryA.getValue(); - List registriesListB = byTcrD.getOrDefault(entryA.getKey(), Collections.emptyList()); - for (Registry registryA : registriesListA) { - if (checkNotBlocked(registryA)) { - Registry registryD = findRegistryBySecurityId(registryA.getSecurityId(), registriesListB); - limFileRows.add(getRow(registryA, registryD)); + for (Registry registry : registriesA) { + if (checkNotBlocked(registry)) { + BigDecimal sumPositive = BigDecimal.ZERO; + if (registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null) { + sumPositive = sumNegativeABS(registryImdg.getCollectionObjectsByPredicate(prdctDM_I.apply(registry))); + sumPositive = sumPositive.add(sum(registryImdg.getCollectionObjectsByPredicate(prdctDM_T.apply(registry)))); } + limFileRows.add(getRow(registry, sumPositive)); } } log.debug("Successfully completed the formation of rows: {} for export money", limFileRows.size()); return limFileRows; } - public String getRow(Registry registryA, Registry registryD) { + public String getRow(Registry registryA, BigDecimal sumPositive) { StringBuilder row = new StringBuilder(); row.append("MONEY: FIRM_ID = "); @@ -82,9 +91,7 @@ public class MoneyExporterService extends AbstractExporterService { row.append(registryA.getTradingClearingRegistry()); row.append("; OPEN_BALANCE = "); - BigDecimal balance = registryA.getBalance() != null ? - registryD != null && registryD.getBalance() != null ? registryA.getBalance().subtract(registryD.getBalance()) : registryA.getBalance() : - BigDecimal.ZERO; + BigDecimal balance = registryA.getBalance() != null ? registryA.getBalance().subtract(sumPositive) : BigDecimal.ZERO; row.append(LimFormat.toStringD2(balance)); row.append("; OPEN_LIMIT = 0.00"); @@ -92,13 +99,4 @@ public class MoneyExporterService extends AbstractExporterService { row.append("; LIMIT_KIND = 0;"); return row.toString(); } - - private Registry findRegistryBySecurityId(Long securityId, List registries) { - for (Registry registry : registries) { - if (securityId.equals(registry.getSecurityId())) { - return registry; - } - } - return null; - } } diff --git a/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/SecurityExporterService.java b/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/SecurityExporterService.java index a13061a50..c07474bf5 100644 --- a/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/SecurityExporterService.java +++ b/clearing-parent/lim-exporter/src/main/java/ru/spcex/clearing/lim/exporter/services/SecurityExporterService.java @@ -56,19 +56,18 @@ public class SecurityExporterService extends AbstractExporterService { pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()), pb.equals("securityId", registry.getSecurityId()) ); - + List limFileRows = new ArrayList<>(); Collection registriesA = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(AS_F).build()); - log.debug("Selected {} registriesA.", - registriesA.size()); + log.debug("Selected {} registriesA.", registriesA.size()); for (Registry registry : registriesA) { if (checkNotBlocked(registry)) { - BigDecimal sumPositive = BigDecimal.ZERO; - if(registry.getCompanyId() != null && registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null){ - sumPositive = sumPositive(registryImdg.getCollectionObjectsByPredicate(prdct.apply(registry))); + BigDecimal sumNegative = BigDecimal.ZERO; + if (registry.getCompanyId() != null && registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null) { + sumNegative = sumNegativeABS(registryImdg.getCollectionObjectsByPredicate(prdct.apply(registry))); } - limFileRows.add(getRow(registry, sumPositive)); + limFileRows.add(getRow(registry, sumNegative)); } } log.debug("Successfully completed the formation of rows: {} for export DEPO", limFileRows.size()); @@ -100,15 +99,4 @@ public class SecurityExporterService extends AbstractExporterService { return row.toString(); } - - private BigDecimal sumPositive(Collection registries) { - if (registries == null || registries.isEmpty()) return BigDecimal.ZERO; - BigDecimal result = BigDecimal.ZERO; - for (Registry registry : registries) { - if (registry.getBalance() != null && registry.getBalance().compareTo(BigDecimal.ZERO) > 0) { - result = result.add(registry.getBalance()); - } - } - return result; - } } diff --git a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java index 358ef45f3..a063b291a 100644 --- a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java +++ b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java @@ -34,8 +34,8 @@ public abstract class AbstractServiceTest { protected Imdg registryImdg; protected Imdg tradingClearingRegistryImdg; protected LocalDate currentDate = LocalDate.now(); - protected String tcrA = "1324A234"; - protected String tcrD = "124324A234"; + protected String tcrFirst = "1324A234"; + protected String tcrSecond = "124324A234"; protected Long securityIdFirst = 12L; protected Long securityIdSecond = 23L; @@ -60,7 +60,7 @@ public abstract class AbstractServiceTest { protected Registry getRegistryA(String tradingClearingRegistry, Long securityId, String registryInstrumentType) { Registry registry = new Registry(); registry.setTradingCode("1A12323"); - registry.setBalance(new BigDecimal("10.00")); + registry.setBalance(new BigDecimal("15.00")); registry.setTradingClearingRegistry(tradingClearingRegistry); registry.setRegistryDesignation(RegistryDesignation.A.getKey()); registry.setRegistryInstrumentType(registryInstrumentType); @@ -74,14 +74,14 @@ public abstract class AbstractServiceTest { return registry; } - protected Registry getRegistryD(String tradingClearingRegistry, Long securityId, String registryInstrumentType) { + protected Registry getRegistryD(String tradingClearingRegistry, Long securityId, String registryInstrumentType, String registryUnit) { Registry registry = new Registry(); registry.setTradingCode("1A12323"); registry.setBalance(new BigDecimal("5.00")); registry.setTradingClearingRegistry(tradingClearingRegistry); registry.setRegistryDesignation(RegistryDesignation.D.getKey()); registry.setRegistryInstrumentType(registryInstrumentType); - registry.setRegistryUnit(RegistryUnit.T.getKey()); + registry.setRegistryUnit(registryUnit); registry.setClearingCode(clearingCode(registry)); registry.setClearingDate(currentDate); registry.setSecuritySymbol("RUB"); @@ -92,6 +92,12 @@ public abstract class AbstractServiceTest { return registry; } + protected Registry getRegistryNegativeD(String tradingClearingRegistry, Long securityId, String registryInstrumentType, String registryUnit) { + Registry registry = getRegistryD(tradingClearingRegistry, securityId, registryInstrumentType, registryUnit); + registry.setBalance(registry.getBalance().negate()); + return registry; + } + // see clearing-service RegistryUtil: public static String clearingCode(Registry ofRegistry) { return clearingCode(ofRegistry.getRegistryDesignation(), ofRegistry.getRegistryInstrumentType(), ofRegistry.getRegistryCapacity(), ofRegistry.getRegistryUnit()); diff --git a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/services/MoneyExporterServiceTest.java b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/services/MoneyExporterServiceTest.java index ac5f6ef51..85986c05f 100644 --- a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/services/MoneyExporterServiceTest.java +++ b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/services/MoneyExporterServiceTest.java @@ -5,9 +5,11 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.lim.exporter.AbstractServiceTest; import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.enumeration.ServiceStatus; import javax.annotation.PostConstruct; +import java.math.BigDecimal; import java.util.Collection; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -27,14 +29,19 @@ class MoneyExporterServiceTest extends AbstractServiceTest { @Test void getLimFileRows() { clearAllInImdg(tradingClearingRegistryImdg); - Registry registryA = getRegistryA(tcrA, securityIdFirst, RegistryInstrumentType.M.getKey()); - Registry registryD = getRegistryD(tcrA, securityIdFirst, RegistryInstrumentType.M.getKey()); + Registry registryA = getRegistryA(tcrFirst, securityIdFirst, RegistryInstrumentType.M.getKey()); + Registry registryD = getRegistryD(tcrFirst, securityIdFirst, RegistryInstrumentType.M.getKey(), RegistryUnit.T.getKey()); registryImdg.insert(registryA); registryImdg.insert(registryD); - registryA = getRegistryA(tcrD, securityIdSecond, RegistryInstrumentType.M.getKey()); - registryD = getRegistryD(tcrD, securityIdSecond, RegistryInstrumentType.M.getKey()); + registryD = getRegistryNegativeD(tcrFirst, securityIdFirst, RegistryInstrumentType.M.getKey(), RegistryUnit.I.getKey()); + registryImdg.insert(registryD); + registryA = getRegistryA(tcrSecond, securityIdSecond, RegistryInstrumentType.M.getKey()); + registryD = getRegistryD(tcrSecond, securityIdSecond, RegistryInstrumentType.M.getKey(), RegistryUnit.T.getKey()); registryImdg.insert(registryA); registryImdg.insert(registryD); + registryD = getRegistryNegativeD(tcrFirst, securityIdFirst, RegistryInstrumentType.M.getKey(), RegistryUnit.I.getKey()); + registryImdg.insert(registryD); + MoneyExporterService moneyExporterService = new MoneyExporterService(null, kafkaSender, imdgProvider); Collection limFileRows = moneyExporterService.getLimFileRows(); @@ -49,6 +56,6 @@ class MoneyExporterServiceTest extends AbstractServiceTest { limFileRows = moneyExporterService.getLimFileRows(); assertEquals(2, limFileRows.size()); - assertTrue(limFileRows.contains(moneyExporterService.getRow(registryA, registryD))); + assertTrue(limFileRows.contains(moneyExporterService.getRow(registryA, new BigDecimal("5.00")))); } } \ No newline at end of file diff --git a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/services/SecurityExporterServiceTest.java b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/services/SecurityExporterServiceTest.java index 5b4ed89fc..bdf16e555 100644 --- a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/services/SecurityExporterServiceTest.java +++ b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/services/SecurityExporterServiceTest.java @@ -5,6 +5,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.lim.exporter.AbstractServiceTest; import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.enumeration.ServiceStatus; import javax.annotation.PostConstruct; @@ -28,12 +29,12 @@ class SecurityExporterServiceTest extends AbstractServiceTest { @Test void getLimFileRows() { clearAllInImdg(tradingClearingRegistryImdg); - Registry registryA = getRegistryA(tcrA, securityIdFirst, RegistryInstrumentType.S.getKey()); - Registry registryD = getRegistryD(tcrA, securityIdFirst, RegistryInstrumentType.S.getKey()); + Registry registryA = getRegistryA(tcrFirst, securityIdFirst, RegistryInstrumentType.S.getKey()); + Registry registryD = getRegistryNegativeD(tcrFirst, securityIdFirst, RegistryInstrumentType.S.getKey(), RegistryUnit.T.getKey()); registryImdg.insert(registryA); registryImdg.insert(registryD); - registryA = getRegistryA(tcrD, securityIdSecond, RegistryInstrumentType.S.getKey()); - registryD = getRegistryD(tcrD, securityIdSecond, RegistryInstrumentType.S.getKey()); + registryA = getRegistryA(tcrSecond, securityIdSecond, RegistryInstrumentType.S.getKey()); + registryD = getRegistryNegativeD(tcrSecond, securityIdSecond, RegistryInstrumentType.S.getKey(), RegistryUnit.T.getKey()); registryImdg.insert(registryA); registryImdg.insert(registryD); @@ -50,6 +51,6 @@ class SecurityExporterServiceTest extends AbstractServiceTest { limFileRows = securityExporterService.getLimFileRows(); assertEquals(2, limFileRows.size()); - assertTrue(limFileRows.contains(securityExporterService.getRow(registryA, new BigDecimal("5.00")))); + assertTrue(limFileRows.contains(securityExporterService.getRow(registryA, new BigDecimal("10.00")))); } } \ No newline at end of file diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java index a8a9f7a71..ed86625cd 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java @@ -20,6 +20,7 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation, public final static RegistryTradingParams TM_T; public final static RegistryTradingParams DM_X; public final static RegistryTradingParams DM_T; + public final static RegistryTradingParams DM_I; public final static RegistryTradingParams AM_F; public final static RegistryTradingParams AM_T; public final static RegistryTradingParams AM_B; @@ -66,6 +67,10 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation, RegistryInstrumentType.M, null, RegistryUnit.T); + DM_I = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.M, + null, + RegistryUnit.I); AM_F = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, null,