diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCurrency.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCurrency.java new file mode 100644 index 000000000..b69fe55ad --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCurrency.java @@ -0,0 +1,78 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; + +public class ExecutionCurrency extends ExecutionCommon implements IDBObject { + private Long exchangeOrderId; + private BigDecimal settlementAmount; + private String comment; + private Long clientCodeId; + private String settlementCode; + private LocalDate settlementDate; + private Instant exchangeExecutionMicroseconds; + + @Override + public ExecutionType type() { + return ExecutionType.ExecutionCurrency; + } + + public Long getExchangeOrderId() { + return exchangeOrderId; + } + + public void setExchangeOrderId(Long exchangeOrderId) { + this.exchangeOrderId = exchangeOrderId; + } + + public BigDecimal getSettlementAmount() { + return settlementAmount; + } + + public void setSettlementAmount(BigDecimal settlementAmount) { + this.settlementAmount = settlementAmount; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Long getClientCodeId() { + return clientCodeId; + } + + public void setClientCodeId(Long clientCodeId) { + this.clientCodeId = clientCodeId; + } + + public String getSettlementCode() { + return settlementCode; + } + + public void setSettlementCode(String settlementCode) { + this.settlementCode = settlementCode; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + public Instant getExchangeExecutionMicroseconds() { + return exchangeExecutionMicroseconds; + } + + public void setExchangeExecutionMicroseconds(Instant exchangeExecutionMicroseconds) { + this.exchangeExecutionMicroseconds = exchangeExecutionMicroseconds; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java index 1ba89387b..6ade41156 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java @@ -1,5 +1,5 @@ package ru.spcex.clearing.registry.reports.bean; public enum ExecutionType { - ExecutionDeposit, ExecutionFond; + ExecutionDeposit, ExecutionFond, ExecutionCurrency; } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java index 0181c7405..7c4dedbb9 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.registry.reports.builders; import org.springframework.stereotype.Component; import ru.spcex.clearing.registry.reports.bean.ExecutionCommon; +import ru.spcex.clearing.registry.reports.bean.ExecutionCurrency; import ru.spcex.clearing.registry.reports.bean.ExecutionDeposit; import ru.spcex.clearing.registry.reports.bean.ExecutionFond; import ru.spcex.clearing.registry.reports.report.ExecutionRegisterReport; @@ -55,6 +56,15 @@ public class ExecutionRegisterReportBuilder extends XLSXReportBuilder { + public ExecutionCurrencyLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties.getPeriod(), clearingJdbc); + } + + @Override + public String sqlQuery() { + return "select * from EXECUTION_CURRENCY where CLEARING_DATE >= :startDate and CLEARING_DATE < :endDate"; + } + + @Override + protected Class getDBObjectClass() { + return ExecutionCurrency.class; + } + + @Override + public List loadObjects() { + try { + List executionCurrencys = super.loadObjects(); + if (executionCurrencys.isEmpty()) { + log.warn("ExecutionCurrency not found."); + return new ArrayList<>(); + } + + Map tradingClearingRegistryById = new HashMap<>(); + { + Set tkrIds = executionCurrencys.stream() + .filter(eDep -> eDep.getPartyTradingClearingRegistry() == null) // оптимизация; + .map(ExecutionCurrency::getTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + tkrIds.addAll(executionCurrencys.stream() + .filter(eDep -> eDep.getCounterPartyTradingClearingRegistry() == null) // оптимизация + .map(ExecutionCurrency::getCounterPartyTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + if (!tkrIds.isEmpty()) { + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", tkrIds); + List tradingClearingRegistries = clearingJdbc.query( + "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", + parameterSource, new TradingClearingRegistryRowMapper() + ); + for (TradingClearingRegistry tkr : tradingClearingRegistries) { + tradingClearingRegistryById.put(tkr.getId(), tkr); + } + } + } + + Map> companySymbolsForCompanyIdMap; + { + Set companyIds = executionCurrencys.stream().map(ExecutionCurrency::getCompanyId).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", companyIds); + parameterSource.addValue("cs", CompanySymbol.CLRC.getKey()); + List companySymbolsForCompanyId = clearingJdbc.query( + "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :cs", + parameterSource, new CompanySymbolsRowMapper() + ); + companySymbolsForCompanyIdMap = companySymbolsForCompanyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId)); + } + + Map> companySymbolsForCounterPartyIdMap; + { + Set counterPartyIds = executionCurrencys.stream().map(ExecutionCurrency::getCounterPartyId).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", counterPartyIds); + parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey()); + List companySymbolsForCounterPartyId = clearingJdbc.query( + "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :companySymbol", + parameterSource, new CompanySymbolsRowMapper() + ); + companySymbolsForCounterPartyIdMap = companySymbolsForCounterPartyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId)); + } + + Map companyById; + { + Set allCompanyIds = Stream.concat( + executionCurrencys.stream().map(ExecutionCurrency::getCompanyId), + executionCurrencys.stream().map(ExecutionCurrency::getCounterPartyId)) + .collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", allCompanyIds); + List companyForCompanyId = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", + parameterSource, new CompanyRowMapper() + ); + companyById = companyForCompanyId.stream() + .collect(Collectors.toMap(Company::getId, o -> o)); + } + + Map> allowedDictionariesByCode; + { + Set coverageStatuses = executionCurrencys.stream().map(ExecutionCurrency::getCoverageStatus).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("coverageStatuses", coverageStatuses); + List allowedDictionaries = clearingJdbc.query( + "select * from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", + parameterSource, new AllowedDictionaryRowMapper() + ); + allowedDictionariesByCode = allowedDictionaries.stream() + .collect(Collectors.groupingBy(AllowedDictionary::getCode)); + } + + for (ExecutionCurrency executionCurrency : executionCurrencys) { + Company companyByCompanyId = companyById.get(executionCurrency.getCompanyId()); + Company companyByCounterPartyId = companyById.get(executionCurrency.getCounterPartyId()); + String side = executionCurrency.getSide() == null ? null : executionCurrency.getSide().toUpperCase(); + if (MoneyFlowSide.SELL.equalsByKey(side) || Side.SELL.equalsByKey(side)) { + if (companyByCompanyId != null) { + executionCurrency.setSeller(companyByCompanyId.getShortName()); + } + if (companyByCounterPartyId != null) { + executionCurrency.setBuyer(companyByCounterPartyId.getShortName()); + } + { + List cSymbols = companySymbolsForCompanyIdMap.get(executionCurrency.getCompanyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionCurrency.setSellerCode(companySymbols.getCompanySymbolValue()); + } + } + { + List cSymbols = companySymbolsForCounterPartyIdMap.get(executionCurrency.getCounterPartyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionCurrency.setBuyerCode(companySymbols.getCompanySymbolValue()); + } + } + + executionCurrency.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionCurrency.getCounterPartyTradingClearingRegistry(), // В execution Currency они заполнены + executionCurrency.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionCurrency.setSellerTkrCode(getTCRCodeFromValueOrById( + executionCurrency.getPartyTradingClearingRegistry(), // В execution Currency они заполнены + executionCurrency.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) { + if (companyByCompanyId != null) { + executionCurrency.setBuyer(companyByCompanyId.getShortName()); + } + if (companyByCounterPartyId != null) { + executionCurrency.setSeller(companyByCounterPartyId.getShortName()); + } + { + List cSymbols = companySymbolsForCompanyIdMap.get(executionCurrency.getCompanyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionCurrency.setBuyerCode(companySymbols.getCompanySymbolValue()); + } + } + { + List cSymbols = companySymbolsForCounterPartyIdMap.get(executionCurrency.getCounterPartyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionCurrency.setSellerCode(companySymbols.getCompanySymbolValue()); + } + } + executionCurrency.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionCurrency.getPartyTradingClearingRegistry(), // В execution Currency они заполнены + executionCurrency.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionCurrency.setSellerTkrCode(getTCRCodeFromValueOrById( + executionCurrency.getCounterPartyTradingClearingRegistry(), // В execution Currency они заполнены + executionCurrency.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + } else { + log.warn("Unknown executionCurrency[{}].side={}", executionCurrency.getId(), executionCurrency.getSide()); + } + List allowed = allowedDictionariesByCode.get(executionCurrency.getCoverageStatus()); + if (allowed != null && !allowed.isEmpty()) { + executionCurrency.setStatus(allowed.iterator().next().getName()); + } + } + + return executionCurrencys; + } catch (Exception e) { + log.error("Can not load ExecutionCurrency: ", e); + throw new RuntimeException("At ExecutionCurrency", e); + } + } + + String getTCRCodeFromValueOrById(@Nullable String tcrCode, @Nullable Long tcrId, Map tradingClearingRegistryById) { + if (tcrCode != null) + return tcrCode; + if (tcrId != null) { + TradingClearingRegistry tcr = tradingClearingRegistryById.get(tcrId); + if (tcr == null) { + log.warn("Can not find TCR.id={}", tcrId); + } else { + return tcr.getCode(); + } + } + return null; + } + + @Override + public ExecutionCurrency fromRS(ResultSet resultSet) throws SQLException { + ExecutionCurrency object = new ExecutionCurrency(); + object.setId(resultSet.getObject("ID", Long.class)); + object.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT")); + object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT")); + object.setExchangeExecutionId(resultSet.getObject("EXCHANGE_EXECUTION_ID", Long.class)); + object.setExchangeExecutionTime(getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_TIME")); + object.setExchangeExecutionMicroseconds(getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_MICROSECONDS")); + object.setTradingDate(getLocalDateFromSqlDate(resultSet, "TRADING_DATE")); + object.setSettlementDate(getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE")); + object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class)); + object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); + object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class)); + object.setSecurityFullName(resultSet.getObject("SECURITY_NAME", String.class)); + object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class)); + object.setTradingClearingRegistryId(resultSet.getObject("PARTY_TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setPartyTradingClearingRegistry(resultSet.getObject("PARTY_TRADING_CLEARING_REGISTRY", String.class)); + object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class)); + object.setCounterPartyTradingClearingRegistryId(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setCounterPartyTradingClearingRegistry(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY", String.class)); + object.setMarket(resultSet.getObject("MARKET", String.class)); + object.setPrice(resultSet.getObject("PRICE", BigDecimal.class)); + object.setLots(resultSet.getObject("LOTS", BigDecimal.class)); + object.setSettlementAmount(resultSet.getObject("SETTLEMENT_AMOUNT", BigDecimal.class)); + object.setQuantity(resultSet.getObject("QUANTITY", BigDecimal.class)); + object.setSide(resultSet.getObject("SIDE", String.class)); +// object.setCurrencyCode(resultSet.getObject("CURRENCY_CODE", String.class)); +// object.setSettlementOrganization(resultSet.getObject("SETTLEMENT_ORGANIZATION", String.class)); + object.setCoverageStatus(resultSet.getObject("COVERAGE_STATUS", String.class)); + object.setSessionId(resultSet.getObject("SESSION_ID", Long.class)); + object.setClearingDate(getLocalDateFromSqlDate(resultSet, "CLEARING_DATE")); + return object; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java index dab1d6c9f..87d770254 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java @@ -56,15 +56,16 @@ public class ExecutionDepositLoader extends IDBLoader { .map(ExecutionDeposit::getCounterPartyTradingClearingRegistryId) .filter(Objects::nonNull) .collect(Collectors.toSet())); - - MapSqlParameterSource parameterSource = new MapSqlParameterSource(); - parameterSource.addValue("ids", tkrIds); - List tradingClearingRegistries = clearingJdbc.query( - "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", - parameterSource, new TradingClearingRegistryRowMapper() - ); - for (TradingClearingRegistry tkr : tradingClearingRegistries) { - tradingClearingRegistryById.put(tkr.getId(), tkr); + if (!tkrIds.isEmpty()) { + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", tkrIds); + List tradingClearingRegistries = clearingJdbc.query( + "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", + parameterSource, new TradingClearingRegistryRowMapper() + ); + for (TradingClearingRegistry tkr : tradingClearingRegistries) { + tradingClearingRegistryById.put(tkr.getId(), tkr); + } } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java index 6debd93e3..992716b52 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java @@ -47,15 +47,16 @@ public class ExecutionFondLoader extends IDBLoader { .map(ExecutionFond::getCounterPartyTradingClearingRegistryId) .filter(Objects::nonNull) .collect(Collectors.toSet())); - - MapSqlParameterSource parameterSource = new MapSqlParameterSource(); - parameterSource.addValue("ids", tkrIds); - List tradingClearingRegistries = clearingJdbc.query( - "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", - parameterSource, new TradingClearingRegistryRowMapper() - ); - for (TradingClearingRegistry tkr : tradingClearingRegistries) { - tradingClearingRegistryById.put(tkr.getId(), tkr); + if (!tkrIds.isEmpty()) { + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", tkrIds); + List tradingClearingRegistries = clearingJdbc.query( + "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", + parameterSource, new TradingClearingRegistryRowMapper() + ); + for (TradingClearingRegistry tkr : tradingClearingRegistries) { + tradingClearingRegistryById.put(tkr.getId(), tkr); + } } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java index 4d79234b1..50c57ae83 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java @@ -51,6 +51,10 @@ public class LiabilitiesRegistryReport implements FileReport { @BindByPosition(position = 9) private String session_type; + @BindByName(column = "номер сделки") + @BindByPosition(position = 10) + private String executionNumber; + public String getShort_name() { return short_name; } @@ -130,4 +134,12 @@ public class LiabilitiesRegistryReport implements FileReport { public void setSession_type(String session_type) { this.session_type = session_type; } + + public String getExecutionNumber() { + return executionNumber; + } + + public void setExecutionNumber(String executionNumber) { + this.executionNumber = executionNumber; + } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java index 1c2fadb98..d329aebeb 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java @@ -23,6 +23,7 @@ public class RegisterUtilityRunner { private final MoneyBalanceLoader moneyBalanceLoader; private final ExecutionDepositLoader executionDepositLoader; private final ExecutionFondLoader executionFondLoader; + private final ExecutionCurrencyLoader executionCurrencyLoader; private final RegistryLoader registryLoader; private final DepoPaymentInstructionBuilder depoPaymentInstructionBuilder; @@ -40,6 +41,7 @@ public class RegisterUtilityRunner { MoneyBalanceLoader moneyBalanceLoader, ExecutionDepositLoader executionDepositLoader, ExecutionFondLoader executionFondLoader, + ExecutionCurrencyLoader executionCurrencyLoader, RegistryLoader registryLoader, DepoPaymentInstructionBuilder depoPaymentInstructionBuilder, DepoBalanceRegisterReportBuilder depoBalanceRegisterReportBuilder, @@ -54,6 +56,7 @@ public class RegisterUtilityRunner { this.moneyBalanceLoader = moneyBalanceLoader; this.executionDepositLoader = executionDepositLoader; this.executionFondLoader = executionFondLoader; + this.executionCurrencyLoader = executionCurrencyLoader; this.registryLoader = registryLoader; this.depoPaymentInstructionBuilder = depoPaymentInstructionBuilder; this.depoBalanceRegisterReportBuilder = depoBalanceRegisterReportBuilder; @@ -68,6 +71,7 @@ public class RegisterUtilityRunner { public void process() throws InterruptedException { List executionDeposits = new ArrayList<>(); List executionFonds = new ArrayList<>(); + List executionCurrencys = new ArrayList<>(); List moneyPaymentInstruction = new ArrayList<>(); List depoPaymentInstruction = new ArrayList<>(); List moneyBalances = new ArrayList<>(); @@ -79,6 +83,7 @@ public class RegisterUtilityRunner { try { catchExceptions.add(executorService.submit(() -> executionDeposits.addAll(executionDepositLoader.loadObjects()))); catchExceptions.add(executorService.submit(() -> executionFonds.addAll(executionFondLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> executionCurrencys.addAll(executionCurrencyLoader.loadObjects()))); catchExceptions.add(executorService.submit(() -> depoPaymentInstruction.addAll(depoInstructionLoader.loadObjects()))); catchExceptions.add(executorService.submit(() -> moneyPaymentInstruction.addAll(moneyInstructionLoader.loadObjects()))); catchExceptions.add(executorService.submit(() -> moneyBalances.addAll(moneyBalanceLoader.loadObjects()))); @@ -111,6 +116,7 @@ public class RegisterUtilityRunner { Set executionCommons = new HashSet<>(); executionCommons.addAll(executionDeposits); executionCommons.addAll(executionFonds); + executionCommons.addAll(executionCurrencys); executionRegisterReportBuilder.buildReport(executionCommons, outFolder); log.info("Все отчёты завершены."); // todo возможно понадобится отсылать на SFTP ReportUtils.sendFilesToSftp