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 093c477ba..1cdac46e0 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 @@ -31,10 +31,7 @@ import static ru.spcex.clearing.platform.messaging.domain.Consts.LIM_EXPORTED; public abstract class AbstractExporterService { private final Logger log = LoggerFactory.getLogger(getClass()); protected final Imdg registryImdg; - private final List validStatus = List.of( - ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey() - // "ACTV", "ROPN" - ); + private final List validStatus = List.of(ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey()); private final Imdg tradingClearingRegistryImdg; private final DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); private final SFTPConfig.LimGateway gateway; 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 47e162923..1b4ffe6b1 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 @@ -10,12 +10,15 @@ import ru.spcex.clearing.lim.exporter.config.SFTPConfig; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import java.math.BigDecimal; -import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; +import static ru.spcex.platform.enumeration.RegistryTradingParams.AM_F; +import static ru.spcex.platform.enumeration.RegistryTradingParams.DM_T; + @Service public class MoneyExporterService extends AbstractExporterService { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -39,18 +42,10 @@ public class MoneyExporterService extends AbstractExporterService { @Override public Collection getLimFileRows() { log.debug("Started loading and formation of money file lines"); - LocalDate currentDate = LocalDate.now(); List limFileRows = new ArrayList<>(); - Collection registriesA = registryImdg.getCollectionObjectsByFieldValues(Map.of( - "registryDesignation", "A", - "registryInstrumentType", "M", - "registryUnit", "F" - )); - Collection registriesD = registryImdg.getCollectionObjectsByFieldValues(Map.of( - "registryDesignation", "D", - "registryInstrumentType", "M", - "registryUnit", "T" - )); + Collection registriesA = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(AM_F).build()); + Collection registriesD = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(DM_T).build()); + 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())) 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 4289f1795..a13061a50 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 @@ -7,14 +7,21 @@ 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.time.LocalDate; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; +import java.util.function.Function; + +import static ru.spcex.platform.enumeration.RegistryTradingParams.AS_F; +import static ru.spcex.platform.enumeration.RegistryTradingParams.DS_T; @Service public class SecurityExporterService extends AbstractExporterService { @@ -40,26 +47,35 @@ public class SecurityExporterService extends AbstractExporterService { @Override public Collection getLimFileRows() { log.debug("Started loading and formation of DEPO file lines"); - LocalDate currentDate = LocalDate.now(); - List limFileRows = new ArrayList<>(); - Collection registries = registryImdg.getCollectionObjectsByFieldValues(Map.of( - "registryDesignation", "A", - "registryInstrumentType", "S", - "registryUnit", "T" - )); - log.debug("Selected {} registriesA.", - registries.size()); - for (Registry registry : registries) { + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + Function prdct = registry -> pb.and( + pb.sql(RegistryCodeSqlBuilder.getInstance(DS_T).build()), + pb.equals("registryStatus", RegistryStatus.PROC.getKey()), + pb.equals("companyId", registry.getCompanyId()), + 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()); + + for (Registry registry : registriesA) { if (checkNotBlocked(registry)) { - limFileRows.add(getRow(registry)); + BigDecimal sumPositive = BigDecimal.ZERO; + if(registry.getCompanyId() != null && registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null){ + sumPositive = sumPositive(registryImdg.getCollectionObjectsByPredicate(prdct.apply(registry))); + } + limFileRows.add(getRow(registry, sumPositive)); } } log.debug("Successfully completed the formation of rows: {} for export DEPO", limFileRows.size()); return limFileRows; } - public String getRow(Registry registry) { + public String getRow(Registry registry, BigDecimal sumPositive) { StringBuilder row = new StringBuilder(); row.append("DEPO: FIRM_ID = "); @@ -72,7 +88,8 @@ public class SecurityExporterService extends AbstractExporterService { row.append(registry.getTradingClearingRegistry()); row.append("; OPEN_BALANCE = "); - row.append(LimFormat.toStringD2(registry.getBalance())); + BigDecimal balance = registry.getBalance() != null ? registry.getBalance().subtract(sumPositive) : BigDecimal.ZERO; + row.append(LimFormat.toStringD2(balance)); row.append("; OPEN_LIMIT = 0"); @@ -83,4 +100,15 @@ 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 34bb55987..358ef45f3 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 @@ -6,15 +6,20 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.math.BigDecimal; import java.time.LocalDate; import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID; @@ -50,4 +55,53 @@ public abstract class AbstractServiceTest { this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); } + + + protected Registry getRegistryA(String tradingClearingRegistry, Long securityId, String registryInstrumentType) { + Registry registry = new Registry(); + registry.setTradingCode("1A12323"); + registry.setBalance(new BigDecimal("10.00")); + registry.setTradingClearingRegistry(tradingClearingRegistry); + registry.setRegistryDesignation(RegistryDesignation.A.getKey()); + registry.setRegistryInstrumentType(registryInstrumentType); + registry.setRegistryUnit(RegistryUnit.F.getKey()); + registry.setClearingCode(clearingCode(registry)); + registry.setClearingDate(currentDate); + registry.setSecuritySymbol("RUB"); + registry.setSecurityId(securityId); + registry.setTradingClearingRegistryId(securityId); + registry.setCompanyId(securityId); + return registry; + } + + protected Registry getRegistryD(String tradingClearingRegistry, Long securityId, String registryInstrumentType) { + 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.setClearingCode(clearingCode(registry)); + registry.setClearingDate(currentDate); + registry.setSecuritySymbol("RUB"); + registry.setSecurityId(securityId); + registry.setTradingClearingRegistryId(securityId); + registry.setCompanyId(securityId); + registry.setRegistryStatus(RegistryStatus.PROC.getKey()); + return registry; + } + + // see clearing-service RegistryUtil: + public static String clearingCode(Registry ofRegistry) { + return clearingCode(ofRegistry.getRegistryDesignation(), ofRegistry.getRegistryInstrumentType(), ofRegistry.getRegistryCapacity(), ofRegistry.getRegistryUnit()); + } + + public static String clearingCode(String registryDesignation, String registryInstrumentType, String registryCapacity, String registryUnit) { + if (!StringUtils.hasLength(registryDesignation)) registryDesignation = "-"; + if (!StringUtils.hasLength(registryInstrumentType)) registryInstrumentType = "-"; + if (!StringUtils.hasLength(registryCapacity)) registryCapacity = "-"; + if (!StringUtils.hasLength(registryUnit)) registryUnit = "-"; + return registryDesignation + registryInstrumentType + registryCapacity + registryUnit; + } } 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 10741693c..ac5f6ef51 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 @@ -1,13 +1,13 @@ package ru.spcex.clearing.lim.exporter.services; import org.junit.jupiter.api.Test; -import org.springframework.util.StringUtils; 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.ServiceStatus; import javax.annotation.PostConstruct; -import java.math.BigDecimal; import java.util.Collection; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -27,12 +27,12 @@ class MoneyExporterServiceTest extends AbstractServiceTest { @Test void getLimFileRows() { clearAllInImdg(tradingClearingRegistryImdg); - Registry registryA = getRegistryA(tcrA, securityIdFirst); - Registry registryD = getRegistryD(tcrA, securityIdFirst); + Registry registryA = getRegistryA(tcrA, securityIdFirst, RegistryInstrumentType.M.getKey()); + Registry registryD = getRegistryD(tcrA, securityIdFirst, RegistryInstrumentType.M.getKey()); registryImdg.insert(registryA); registryImdg.insert(registryD); - registryA = getRegistryA(tcrD, securityIdSecond); - registryD = getRegistryD(tcrD, securityIdSecond); + registryA = getRegistryA(tcrD, securityIdSecond, RegistryInstrumentType.M.getKey()); + registryD = getRegistryD(tcrD, securityIdSecond, RegistryInstrumentType.M.getKey()); registryImdg.insert(registryA); registryImdg.insert(registryD); @@ -42,7 +42,7 @@ class MoneyExporterServiceTest extends AbstractServiceTest { TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); tradingClearingRegistry.setId(securityIdFirst); - tradingClearingRegistry.setStatus("ACTV"); + tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey()); tradingClearingRegistryImdg.insert(tradingClearingRegistry); tradingClearingRegistry.setId(securityIdSecond); tradingClearingRegistryImdg.insert(tradingClearingRegistry); @@ -51,51 +51,4 @@ class MoneyExporterServiceTest extends AbstractServiceTest { assertEquals(2, limFileRows.size()); assertTrue(limFileRows.contains(moneyExporterService.getRow(registryA, registryD))); } - - private Registry getRegistryA(String tradingClearingRegistry, Long securityId) { - Registry registry = new Registry(); - registry.setTradingCode("1A12323"); - registry.setBalance(new BigDecimal("10.00")); - registry.setTradingClearingRegistry(tradingClearingRegistry); - registry.setRegistryDesignation("A"); - registry.setRegistryInstrumentType("M"); - registry.setRegistryUnit("F"); - registry.setClearingCode(clearingCode(registry)); - registry.setClearingDate(currentDate); - registry.setSecuritySymbol("RUB"); - registry.setSecurityId(securityId); - registry.setTradingClearingRegistryId(securityId); - return registry; - } - - private Registry getRegistryD(String tradingClearingRegistry, Long securityId) { - Registry registry = new Registry(); - registry.setTradingCode("1A12323"); - registry.setBalance(new BigDecimal("5.00")); - registry.setTradingClearingRegistry(tradingClearingRegistry); - registry.setRegistryDesignation("D"); - registry.setRegistryInstrumentType("M"); - registry.setRegistryUnit("T"); - registry.setClearingCode(clearingCode(registry)); - registry.setClearingDate(currentDate); - registry.setSecuritySymbol("RUB"); - registry.setSecurityId(securityId); - registry.setTradingClearingRegistryId(securityId); - return registry; - } - - - // see clearing-service ReistryUtil: - - public static String clearingCode(Registry ofRegistry) { - return clearingCode(ofRegistry.getRegistryDesignation(), ofRegistry.getRegistryInstrumentType(), ofRegistry.getRegistryCapacity(), ofRegistry.getRegistryUnit()); - } - - public static String clearingCode(String registryDesignation, String registryInstrumentType, String registryCapacity, String registryUnit) { - if (StringUtils.isEmpty(registryDesignation)) registryDesignation = "-"; - if (StringUtils.isEmpty(registryInstrumentType)) registryInstrumentType = "-"; - if (StringUtils.isEmpty(registryCapacity)) registryCapacity = "-"; - if (StringUtils.isEmpty(registryUnit)) registryUnit = "-"; - return registryDesignation + registryInstrumentType + registryCapacity + registryUnit; - } } \ 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 72813baf7..5b4ed89fc 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 @@ -4,6 +4,8 @@ import org.junit.jupiter.api.Test; 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.ServiceStatus; import javax.annotation.PostConstruct; import java.math.BigDecimal; @@ -11,7 +13,6 @@ import java.util.Collection; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static ru.spcex.clearing.lim.exporter.services.MoneyExporterServiceTest.clearingCode; import static ru.spcex.clearing.test.TestUtils.clearAllInImdg; class SecurityExporterServiceTest extends AbstractServiceTest { @@ -27,14 +28,14 @@ class SecurityExporterServiceTest extends AbstractServiceTest { @Test void getLimFileRows() { clearAllInImdg(tradingClearingRegistryImdg); - Registry registry1 = getRegistry(tcrA, securityIdFirst); - Registry registry2 = getRegistry(tcrA, securityIdFirst); - registryImdg.insert(registry1); - registryImdg.insert(registry2); - registry1 = getRegistry(tcrD, securityIdSecond); - registry2 = getRegistry(tcrD, securityIdSecond); - registryImdg.insert(registry1); - registryImdg.insert(registry2); + Registry registryA = getRegistryA(tcrA, securityIdFirst, RegistryInstrumentType.S.getKey()); + Registry registryD = getRegistryD(tcrA, securityIdFirst, RegistryInstrumentType.S.getKey()); + registryImdg.insert(registryA); + registryImdg.insert(registryD); + registryA = getRegistryA(tcrD, securityIdSecond, RegistryInstrumentType.S.getKey()); + registryD = getRegistryD(tcrD, securityIdSecond, RegistryInstrumentType.S.getKey()); + registryImdg.insert(registryA); + registryImdg.insert(registryD); SecurityExporterService securityExporterService = new SecurityExporterService(null, kafkaSender, imdgProvider); Collection limFileRows = securityExporterService.getLimFileRows(); @@ -42,31 +43,13 @@ class SecurityExporterServiceTest extends AbstractServiceTest { TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); tradingClearingRegistry.setId(securityIdFirst); - tradingClearingRegistry.setStatus("ACTV"); + tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey()); tradingClearingRegistryImdg.insert(tradingClearingRegistry); tradingClearingRegistry.setId(securityIdSecond); tradingClearingRegistryImdg.insert(tradingClearingRegistry); limFileRows = securityExporterService.getLimFileRows(); - assertEquals(4, limFileRows.size()); - assertTrue(limFileRows.contains(securityExporterService.getRow(registry1))); - assertTrue(limFileRows.contains(securityExporterService.getRow(registry2))); - - } - - private Registry getRegistry(String tradingClearingRegistry, Long securityId) { - Registry registry = new Registry(); - registry.setTradingCode("1A12323"); - registry.setBalance(new BigDecimal("10.00")); - registry.setTradingClearingRegistry(tradingClearingRegistry); - registry.setRegistryDesignation("A"); - registry.setRegistryInstrumentType("S"); - registry.setRegistryUnit("T"); - registry.setClearingCode(clearingCode(registry)); - registry.setClearingDate(currentDate); - registry.setSecuritySymbol("RUB"); - registry.setSecurityId(securityId); - registry.setTradingClearingRegistryId(securityId); - return registry; + assertEquals(2, limFileRows.size()); + assertTrue(limFileRows.contains(securityExporterService.getRow(registryA, new BigDecimal("5.00")))); } } \ No newline at end of file