From 632bdf9e09625b334b2b9bcc3abf3c5b87e3a184 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 20 Nov 2023 11:12:08 +0300 Subject: [PATCH 01/17] http://jira.mfd.msk:8088/browse/CLS-497 KSRepCashNettoReportBuilder --- .../ks/KSRepCashNettoReportBuilder.java | 28 ++++++++++++++----- .../ks/KS_REP_CASH_NETTO_expected.csv | 4 +-- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java index 632e53ebc..f5d4efb5b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java @@ -179,6 +179,8 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionTypeForValue = Set.of( SessionType.IPOT, SessionType.TRDT, @@ -195,21 +197,33 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder Date: Mon, 20 Nov 2023 12:02:16 +0300 Subject: [PATCH 02/17] http://jira.mfd.msk:8088/browse/CLS-497 KSRepTradesReportBuilder --- .../builders/ks/KSRepTradesReportBuilder.java | 24 ++++++++++++++----- .../services/ReportServiceTest_KS.java | 19 ++++++++++++++- .../ks/KS_REP_TRADES_expected.csv | 8 +++---- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java index 557de76f0..0e6cdd2d8 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.builders.ks; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountSymbols; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.execution.ExecutionCommon; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; @@ -37,6 +38,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder companyImdg; private final Imdg tradingClearingRegistryImdg; private final Imdg accountImdg; + private final Imdg accountSymbolsImdg; private List rows = null; @@ -48,6 +50,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder Date: Mon, 20 Nov 2023 14:07:45 +0300 Subject: [PATCH 03/17] http://jira.mfd.msk:8088/browse/CLS-536 --- .../builder/PaymentInstructionBuilderV2.java | 37 ++++++++++++++++++- .../impl/FormingPaymentInstructionAssets.java | 2 + 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java index bb3667c39..bd9329402 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java @@ -4,7 +4,9 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanyRoleSet; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.Registry; @@ -12,6 +14,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.time.TimeUtil; import java.math.BigDecimal; @@ -27,6 +30,8 @@ public class PaymentInstructionBuilderV2 { private ImdgProvider imdgProvider; private Imdg companyImdg; private Imdg companySymbolsImdg; + private final Imdg clearingCategoryImdg; + private final Imdg cmpRoleImdg; private Long sessionId; private BigDecimal amount; private Account creditLegAccount; @@ -37,6 +42,7 @@ public class PaymentInstructionBuilderV2 { private static final DateTimeFormatter DATE_FORMATTER_ddMMyy = DateTimeFormatter.ofPattern("ddMMyy"); private Long senderId; private Long addresseeId; + private boolean useCS_BLKD = false; public static PaymentInstructionBuilderV2 builder(ImdgProvider imdgProvider) { return new PaymentInstructionBuilderV2(imdgProvider); @@ -46,6 +52,13 @@ public class PaymentInstructionBuilderV2 { this.imdgProvider = imdgProvider; this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + this.clearingCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + this.cmpRoleImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class); + } + + public PaymentInstructionBuilderV2 useCS_BLKD(boolean useCS_BLKD) { + this.useCS_BLKD = useCS_BLKD; + return this; } public PaymentInstructionBuilderV2 sessionId(Long sessionId) { @@ -128,7 +141,12 @@ public class PaymentInstructionBuilderV2 { payment.setPaymentDate(Instant.now()); payment.setSettlementDate(LocalDate.now()); } - payment.setPaymentPurpose(purpose); + + if (useCS_BLKD && categoryVInitiator(senderId) && companyRoleODEPPresent(senderId)) { + payment.setPaymentPurpose("CS_BLKD " + purpose); + } else { + payment.setPaymentPurpose(purpose); + } payment.setCreditLeg_amount(amount); payment.setDebitLeg_amount(amount); @@ -193,4 +211,21 @@ public class PaymentInstructionBuilderV2 { return cSymbol.getCompanySymbolValue(); } } + + public boolean categoryVInitiator(Long companyId) { + ClearingMemberCategory category = clearingCategoryImdg.getFirstObjectByFieldValues( + Map.of("companyId", companyId)); + ClearingCategory ctg = IEnumKey.getEnumByKey(ClearingCategory.class, category.getClearingMemberCategory()); + return ctg != null && ctg.equals(ClearingCategory.V); + } + + public boolean companyRoleODEPPresent(Long companyId) { + return cmpRoleImdg.getFirstObjectBySQL( + "companyId = %d and companyRole = '%s' and workflowStatus = '%s'".formatted( + companyId, + CompanyRole.ODEP.getKey(), + WorkflowStatus.Active.getKey() + ) + ) != null; + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java index 89e020f81..30a2b7b47 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java @@ -215,6 +215,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage { .creditLegAccount(creditLegAccount) .amount(amount) .sessionId(sessionId) + .useCS_BLKD(SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) .purpose(String.format("Перевод по итогу клиринга по ТКР %s", registry.getTradingClearingRegistry())); PaymentInstruction paymentInstruction = paymentInstructionBuilder.build(); log.debug("Created paymentInstruction by registry.id: {}", registry.getId()); @@ -281,6 +282,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage { .sender(senderId) .addressee(addresseeId) .debitLegAccount(debitLegAccount) + .useCS_BLKD(SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) .creditLegAccount(creditLegAccount) .amount(amount) .sessionId(sessionId) From 0c00c7fdb3c0f18de0007da5dbbadf172333b50e Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 21 Nov 2023 17:09:08 +0300 Subject: [PATCH 04/17] PaymentInstruction grouping for securities --- .../FormingPaymentInstructionSecurities.java | 2 +- .../group/RegistryLiabilitiesGroup.java | 67 +++++++++++++------ 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java index d7891c4ed..fb11195b2 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java @@ -154,7 +154,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { .stream() .collect(Collectors.groupingBy(Registry::getGroupId)); log.debug("groups.size = {}", groups.size()); - Map lstGroups = RegistryLiabilitiesGroup.group(registries); + Map lstGroups = RegistryLiabilitiesGroup.group(groups); for (Map.Entry> group : groups.entrySet()) { Long groupId = group.getKey(); Function findByCode = rgsCode -> group.getValue() diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java index 96a2bf069..b6934aecc 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java @@ -4,44 +4,56 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.service.registry.RegistryManager; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.utils.collection.Pair; +import ru.spcex.platform.utils.text.TextUtil; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import static ru.spcex.platform.enumeration.RegistryTradingParams.CS_T; import static ru.spcex.platform.enumeration.RegistryTradingParams.LS_T; public class RegistryLiabilitiesGroup { - private Logger log = LoggerFactory.getLogger(getClass()); + private static final Logger log = LoggerFactory.getLogger(RegistryLiabilitiesGroup.class); - public static RegistryLiabilitiesGroup builder() { - return new RegistryLiabilitiesGroup(); - } - - private RegistryLiabilitiesGroup() { - } - - public static Map group(Collection registriesCollection) { + public static Map group(Map> registriesCollection) { Map result = new HashMap<>(); - List registries = registriesCollection + List> lstCstGroup = registriesCollection.entrySet() .stream() - .filter(rgs -> RegistryManager.equalsByCode(LS_T, rgs)) + .map(entry -> { + Long groupId = entry.getKey(); + List value = entry.getValue(); + Registry ls_t = obtain(value, LS_T); + Registry cs_t = obtain(value, CS_T); + if (ls_t == null || cs_t == null) { + log.error("groupId {} registries {} failed to find LS_T/CS_T", groupId, value.stream() + .map(Registry::getId) + .map(Object::toString) + .collect(TextUtil.join)); + return null; + } + return new Pair<>(ls_t, cs_t); + }) .collect(Collectors.toList()); - for (int i = 0; i < registries.size(); i++) { - Registry ls_t = registries.get(i); - if (ls_t == null) { + for (int i = 0; i < lstCstGroup.size(); i++) { + var pair = lstCstGroup.get(i); + if (pair == null) { continue; } + Registry ls_t = pair.getFirst(); LinkedList relatedLiabilities = new LinkedList<>(); relatedLiabilities.add(ls_t); - for (int j = i + 1; j < registries.size(); j++) { - Registry related = registries.get(j); - if (related == null) { + for (int j = i + 1; j < lstCstGroup.size(); j++) { + var anotherGroup = lstCstGroup.get(j); + if (anotherGroup == null) { continue; } - if (rgsOfTheSameAgents(ls_t, related)) { + Registry related = anotherGroup.getFirst(); + if (rgsOfTheSameAgents(pair.getFirst(), pair.getSecond(), anotherGroup.getFirst(), anotherGroup.getSecond())) { relatedLiabilities.add(related); - registries.set(j, null); + lstCstGroup.set(j, null); } } PaymentGroup paymentGroup = new PaymentGroup(); @@ -57,10 +69,25 @@ public class RegistryLiabilitiesGroup { return result; } - private static boolean rgsOfTheSameAgents(Registry ls_t1, Registry ls_t2) { + private static boolean rgsOfTheSameAgents(Registry ls_t1, Registry cs_t1, Registry ls_t2, Registry cs_t2) { return Objects.equals(ls_t1.getSecurityId(), ls_t2.getSecurityId()) && Objects.equals(ls_t1.getTradingClearingRegistryId(), ls_t2.getTradingClearingRegistryId()) + && Objects.equals(cs_t1.getTradingClearingRegistryId(), cs_t2.getTradingClearingRegistryId()) && Objects.equals(ls_t1.getCompanyId(), ls_t2.getCompanyId()) && Objects.equals(ls_t1.getCounterPartyId(), ls_t2.getCounterPartyId()); } + + private static Registry obtain(Collection group, RegistryTradingParams cde) { + List allRegistries = group + .stream() + .filter(rgs -> RegistryManager.equalsByCode(cde, rgs)) + .toList(); + if (allRegistries.size() > 1) { + throw new IllegalStateException("more than one " + cde + " entry in group " + group.iterator().next().getGroupId()); + } + if (allRegistries.size() == 1) { + return allRegistries.iterator().next(); + } + return null; + } } From e04460b194eab9a5ee1db8c571a68b8dcc4603d8 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 21 Nov 2023 16:25:10 +0300 Subject: [PATCH 05/17] http://jira.mfd.msk:8088/browse/CLS-536 --- .../builder/PaymentInstructionBuilderV2.java | 2 +- .../service/executors/Sdf57Executor.java | 3 ++- .../platform/enumeration/SpecifFlag.java | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SpecifFlag.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java index bd9329402..7a4a5211f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java @@ -143,7 +143,7 @@ public class PaymentInstructionBuilderV2 { } if (useCS_BLKD && categoryVInitiator(senderId) && companyRoleODEPPresent(senderId)) { - payment.setPaymentPurpose("CS_BLKD " + purpose); + payment.setPaymentPurpose(SpecifFlag.CS_BLKD.getKey() + " " + purpose); } else { payment.setPaymentPurpose(purpose); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java index 6756a54eb..c1638189a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java @@ -361,7 +361,8 @@ public class Sdf57Executor extends AbstractExecutor { if (TextUtil.isEmpty(asts.a__t().getTradingClearingRegistry())) { log.trace("stmt.id={} {}.id={} TCR is empty, skipping gateway request", stmt.getId(), asts.a__t().getRegistryCode(), asts.a__t().getId()); - } else { + } else if (TextUtil.isEmpty(sdf57.getSpecif()) + || !sdf57.getSpecif().contains(SpecifFlag.CS_BLKD.getKey())) { log.trace("sending gateway request for stmt.id={}", stmt.getId()); kafka.sendRequestToQueue(Consts.ASSET_OPERATION, gatewayRequest(stmt, diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SpecifFlag.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SpecifFlag.java new file mode 100644 index 000000000..3a15df80e --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SpecifFlag.java @@ -0,0 +1,19 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum SpecifFlag implements IEnumKey { + CS_BLKD("CS_BLKD"), + ; + + private final String key; + + SpecifFlag(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} From 0b2bef797e639d017a2b3a50d15c5ec2c62551b6 Mon Sep 17 00:00:00 2001 From: akulikov Date: Wed, 22 Nov 2023 14:22:35 +0300 Subject: [PATCH 06/17] http://jira.mfd.msk:8088/browse/CLS-596 --- .../reports/builders/CSVReportBuilder.java | 43 ++++++++++--------- .../ks/KSCommissionTradesReportBuilder.java | 9 ++-- .../ks/KSRepCashNettoReportBuilder.java | 38 +++++++++------- .../KSRepCashRegisterSumsReportBuilder.java | 2 +- .../ks/KSRepCashRegistersReportBuilder.java | 12 ++++-- .../ks/KSRepDepoNettoReportBuilder.java | 7 ++- ...epDepoRegisterQuantitiesReportBuilder.java | 6 +-- .../ks/KSRepDepoRegistersReportBuilder.java | 3 +- .../builders/ks/KSRepTradesReportBuilder.java | 7 ++- 9 files changed, 69 insertions(+), 58 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java index 6f07fde90..53a3b4243 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java @@ -1,12 +1,13 @@ package ru.spcex.clearing.reports.builders; -import com.opencsv.CSVWriterBuilder; +import com.opencsv.CSVWriter; import com.opencsv.ICSVWriter; import com.opencsv.bean.*; import com.opencsv.exceptions.CsvBadConverterException; import com.opencsv.exceptions.CsvChainedException; import com.opencsv.exceptions.CsvFieldAssignmentException; import com.opencsv.exceptions.CsvRequiredFieldEmptyException; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.misc.Session; @@ -91,23 +92,6 @@ public abstract class CSVReportBuilder { */ protected abstract void collect(P params); - /** - * Создает CSVWriter. Если требуется изменить параметры выходного CSV файла, этот метод следует переопределить. - * - * @param file Файл отчета - * @return Созданный CSVWriter - *

- * todo check it - */ - protected ICSVWriter createCsvWriter(File file) throws IOException { - Writer writer = new FileWriter(file); - CSVWriterBuilder csvWriterBuilder = new CSVWriterBuilder(writer) - .withLineEnd("\n") - .withSeparator(',') - .withQuoteChar('\"'); - return csvWriterBuilder.build(); - } - public File createReport(P params, File outFolder) { assert outFolder != null && outFolder.isDirectory(); @@ -118,10 +102,11 @@ public abstract class CSVReportBuilder { assert rows != null; - try (Writer writer = new FileWriter(reportFile)) { + try (Writer writer = new FileWriter(reportFile); + ICSVWriter icsvWriter = new CustomCSVWriter(writer)) { CustomStrategy customStrategy = new CustomStrategy<>(); customStrategy.setType(getReportClass()); - StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer) + StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(icsvWriter) .withMappingStrategy(customStrategy) .withLineEnd("\n") .withSeparator(',') @@ -160,6 +145,24 @@ public abstract class CSVReportBuilder { return sessionIds.stream().toList(); } + static class CustomCSVWriter extends CSVWriter { + public CustomCSVWriter(Writer writer) { + super(writer); + } + + @Override + protected void writeNext(String[] nextLine, boolean applyQuotesToAll, Appendable appendable) throws IOException { + if (nextLine != null) { + for (int i = 0; i < nextLine.length; i++) { + if (StringUtils.isEmpty(nextLine[i])) { + nextLine[i] = null; + } + } + } + super.writeNext(nextLine, applyQuotesToAll, appendable); + } + } + static class CustomStrategy extends ColumnPositionMappingStrategy { public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException { super.generateHeader(bean); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java index cbb29529f..8d29bcf51 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java @@ -16,7 +16,6 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; -import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -105,8 +104,8 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder sessionTypeForValue = Set.of( SessionType.IPOT, SessionType.TRDT, @@ -198,12 +196,12 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder groupedRegistry = entry.getValue(); try { if (groupedRegistry.isEmpty()) { - log.warn("Empty LS_T and CS_T registries for {}. Registries with id = [{}] was skipped", - pairRegistryId, - groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", ")) + log.warn("Empty LS_T and CS_T registries for {}", + pairRegistryId ); continue; } @@ -110,7 +109,7 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder statusForExecution = new HashMap<>(); executions.forEach(execution -> { if (Set.of("S", "SELL").contains(execution.getSide())) { - String status = ""; + String status = null; if (execution.getCoverageStatus() != null) { Long groupId = execution.getExchangeExecutionId(); String coverageStatus = execution.getCoverageStatus().toUpperCase(); @@ -190,8 +190,8 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder Date: Wed, 22 Nov 2023 14:48:18 +0300 Subject: [PATCH 07/17] http://jira.mfd.msk:8088/browse/CLS-596 fix --- .../reports/builders/ks/KSRepDepoRegistersReportBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoRegistersReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoRegistersReportBuilder.java index be73c86d4..11824a4d4 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoRegistersReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoRegistersReportBuilder.java @@ -138,7 +138,7 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder Date: Wed, 22 Nov 2023 15:19:41 +0300 Subject: [PATCH 08/17] http://jira.mfd.msk:8088/browse/CLS-596 fix after review --- .../reports/builders/ks/KSRepCashNettoReportBuilder.java | 8 ++++---- .../builders/ks/KSRepCashRegisterSumsReportBuilder.java | 2 +- .../reports/builders/ks/KSRepDepoNettoReportBuilder.java | 9 +++------ .../reports/builders/ks/KSRepTradesReportBuilder.java | 2 +- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java index 2d7219ba7..e45532acc 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java @@ -124,24 +124,24 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder Date: Wed, 22 Nov 2023 15:28:18 +0300 Subject: [PATCH 09/17] http://jira.mfd.msk:8088/browse/CLS-596 fixes --- .../ks/KSRepCashNettoReportBuilder.java | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java index e45532acc..2f74eb7d0 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java @@ -175,10 +175,12 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionTypeForValue = Set.of( SessionType.IPOT, SessionType.TRDT, @@ -196,12 +198,12 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder Date: Wed, 22 Nov 2023 19:06:52 +0300 Subject: [PATCH 10/17] CS_BLKD --- .../builder/PaymentInstructionBuilderV2.java | 40 +++++++++- .../service/executors/Sdf57Executor.java | 77 +++++++++++++------ .../impl/FormingPaymentInstructionAssets.java | 4 +- 3 files changed, 93 insertions(+), 28 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java index 7a4a5211f..14f4c3792 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java @@ -14,6 +14,9 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; 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 ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.time.TimeUtil; @@ -21,6 +24,7 @@ import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.Collection; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; @@ -30,6 +34,7 @@ public class PaymentInstructionBuilderV2 { private ImdgProvider imdgProvider; private Imdg companyImdg; private Imdg companySymbolsImdg; + private Imdg rgsImdg; private final Imdg clearingCategoryImdg; private final Imdg cmpRoleImdg; private Long sessionId; @@ -44,6 +49,8 @@ public class PaymentInstructionBuilderV2 { private Long addresseeId; private boolean useCS_BLKD = false; + private Registry am_b; + public static PaymentInstructionBuilderV2 builder(ImdgProvider imdgProvider) { return new PaymentInstructionBuilderV2(imdgProvider); } @@ -52,12 +59,17 @@ public class PaymentInstructionBuilderV2 { this.imdgProvider = imdgProvider; this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.clearingCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); this.cmpRoleImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class); } - public PaymentInstructionBuilderV2 useCS_BLKD(boolean useCS_BLKD) { - this.useCS_BLKD = useCS_BLKD; + public PaymentInstructionBuilderV2 checkBLKD(Registry rgs) { + if (rgs == null) { + return this; + } + this.useCS_BLKD = true; + this.am_b = rgs; return this; } @@ -142,8 +154,8 @@ public class PaymentInstructionBuilderV2 { payment.setSettlementDate(LocalDate.now()); } - if (useCS_BLKD && categoryVInitiator(senderId) && companyRoleODEPPresent(senderId)) { - payment.setPaymentPurpose(SpecifFlag.CS_BLKD.getKey() + " " + purpose); + if (useCS_BLKD && checkAgent()) { + payment.setPaymentPurpose(SpecifFlag.CS_BLKD.getKey() + "_" + sessionId + " " + purpose); } else { payment.setPaymentPurpose(purpose); } @@ -212,6 +224,26 @@ public class PaymentInstructionBuilderV2 { } } + private boolean checkAgent() { + ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); + ImdgPredicate prdct = pb.and( + pb.equals("sessionId", sessionId), + pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM__).build()), + pb.equals("companyId", addresseeId), + pb.equals("accountId", am_b.getAccountId()) + ); + Collection claims = rgsImdg.getCollectionObjectsByPredicate(prdct); + boolean hasCounterPartyInitiator = false; + for (Registry claim : claims) { + Long counterPartyId = claim.getCounterPartyId(); + if (categoryVInitiator(counterPartyId) && companyRoleODEPPresent(counterPartyId)) { + hasCounterPartyInitiator = true; + break; + } + } + return hasCounterPartyInitiator; + } + public boolean categoryVInitiator(Long companyId) { ClearingMemberCategory category = clearingCategoryImdg.getFirstObjectByFieldValues( Map.of("companyId", companyId)); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java index c1638189a..9597c3734 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java @@ -48,6 +48,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidator; @@ -62,6 +63,7 @@ import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Function; +import java.util.regex.Matcher; import java.util.regex.Pattern; import static ru.spcex.platform.enumeration.RegistryTradingParams.D__V; @@ -361,13 +363,13 @@ public class Sdf57Executor extends AbstractExecutor { if (TextUtil.isEmpty(asts.a__t().getTradingClearingRegistry())) { log.trace("stmt.id={} {}.id={} TCR is empty, skipping gateway request", stmt.getId(), asts.a__t().getRegistryCode(), asts.a__t().getId()); - } else if (TextUtil.isEmpty(sdf57.getSpecif()) - || !sdf57.getSpecif().contains(SpecifFlag.CS_BLKD.getKey())) { + } else { log.trace("sending gateway request for stmt.id={}", stmt.getId()); - kafka.sendRequestToQueue(Consts.ASSET_OPERATION, - gatewayRequest(stmt, - company.getTradingCode(), - asts.a__t().getTradingClearingRegistry())); + Optional gtwReq = gatewayRequest(stmt, + company, + account, + asts.a__t().getTradingClearingRegistry()); + gtwReq.ifPresent(r -> kafka.sendRequestToQueue(Consts.ASSET_OPERATION, r)); } } return Optional.of(asts); @@ -735,25 +737,56 @@ public class Sdf57Executor extends AbstractExecutor { R apply(T1 arg1, T2 arg2, T3 arg3); } - private AssetOperationListRequest gatewayRequest(Statement stmt, String tradingCode, String tcrCode) { + private static final Pattern csBlkd = Pattern.compile(SpecifFlag.CS_BLKD.getKey() + "_(\\d+).*"); + + private Optional gatewayRequest(Statement stmt, Company company, Account account, String tcrCode) { + if (AccountType.Anlt.equalsByKey(account.getAccountType())) { + return Optional.empty(); + } + String tradingCode = company.getTradingCode(); AssetOperationListRequest gatewayRequest = new AssetOperationListRequest(); AssetOperationRequest req = GatewayRequestCreator.from(stmt, tradingCode, tcrCode); - Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of( - "workflowStatus", SessionStatus.ACTV.getKey() - )); - if (existActiveSession != null) { - log.debug("active session.id={} type {}", existActiveSession.getId(), existActiveSession.getSessionType()); - List d__vs = assets.searchByParams(stmt.getAccount(), CurrencyCode.RUB.getKey(), stmt.getSenderId(), D__V) - .stream() - .filter(rgs -> existActiveSession.getId().equals(rgs.getSessionId())) - .toList(); - BigDecimal d__vSum = d__vs.stream() - .map(rgs -> safeBD(rgs.getBalance())) - .reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal amount = req.getAmount(); - req.setAmount(safeBD(amount).subtract(d__vSum)); + String specif = stmt.getComment(); + + Matcher m; + if (!TextUtil.isEmpty(specif) && (m = csBlkd.matcher(specif)).find()) { + try { + Long sessionId = Long.valueOf(m.group(1)); + List d__vs = assets.searchByParams(account.getAccount(), CurrencyCode.RUB.getKey(), company.getId(), D__V) + .stream() + .filter(rgs -> sessionId.equals(rgs.getSessionId())) + .toList(); + BigDecimal d__vSum = d__vs.stream() + .map(rgs -> safeBD(rgs.getBalance())) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal amount = req.getAmount(); + req.setAmount(safeBD(amount).subtract(d__vSum)); + } catch (NumberFormatException e) { + log.error("stmt.id={} failed to parse specif {} {}", + stmt.getId(), + specif, + ExceptionUtils.getStackTrace(e)); + } + } + //Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of( + // "workflowStatus", SessionStatus.ACTV.getKey() + //)); + //if (existActiveSession != null) { + // log.debug("active session.id={} type {}", existActiveSession.getId(), existActiveSession.getSessionType()); + // List d__vs = assets.searchByParams(stmt.getAccount(), CurrencyCode.RUB.getKey(), stmt.getSenderId(), D__V) + // .stream() + // .filter(rgs -> existActiveSession.getId().equals(rgs.getSessionId())) + // .toList(); + // BigDecimal d__vSum = d__vs.stream() + // .map(rgs -> safeBD(rgs.getBalance())) + // .reduce(BigDecimal.ZERO, BigDecimal::add); + // BigDecimal amount = req.getAmount(); + // req.setAmount(safeBD(amount).subtract(d__vSum)); + //} + if (req.getAmount().compareTo(BigDecimal.ZERO) == 0) { + return Optional.empty(); } gatewayRequest.setAssetOperationRequests(List.of(req)); - return gatewayRequest; + return Optional.of(gatewayRequest); } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java index 30a2b7b47..31304592f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java @@ -215,7 +215,8 @@ public class FormingPaymentInstructionAssets implements ISessionStage { .creditLegAccount(creditLegAccount) .amount(amount) .sessionId(sessionId) - .useCS_BLKD(SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) + .checkBLKD((SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) + && !isPositiveBalance ? registry : null) .purpose(String.format("Перевод по итогу клиринга по ТКР %s", registry.getTradingClearingRegistry())); PaymentInstruction paymentInstruction = paymentInstructionBuilder.build(); log.debug("Created paymentInstruction by registry.id: {}", registry.getId()); @@ -282,7 +283,6 @@ public class FormingPaymentInstructionAssets implements ISessionStage { .sender(senderId) .addressee(addresseeId) .debitLegAccount(debitLegAccount) - .useCS_BLKD(SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) .creditLegAccount(creditLegAccount) .amount(amount) .sessionId(sessionId) From e028aee516363a6e2d07467dc59808e2a225c1fe Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 23 Nov 2023 14:21:27 +0300 Subject: [PATCH 11/17] http://jira.mfd.msk:8088/browse/CLS-597 --- .../builders/bean/KSCommissionTradesReport.java | 12 ++++++++++++ .../ks/KSCommissionTradesReportBuilder.java | 14 ++++++++++++-- .../ks/KS_COMMISSION_TRADES_expected.csv | 4 ++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java index 5b3031872..d6a1eec4b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java @@ -57,6 +57,10 @@ public class KSCommissionTradesReport { @CsvBindByPosition(position = 10) private String execStatus; + @CsvBindByName(column = "TR_ID") + @CsvBindByPosition(position = 11) + private Long trId; + public String getFirmId() { return firmId; @@ -145,4 +149,12 @@ public class KSCommissionTradesReport { public void setAgreementSettlementDate(LocalDate agreementSettlementDate) { this.agreementSettlementDate = agreementSettlementDate; } + + public Long getTrId() { + return trId; + } + + public void setTrId(Long trId) { + this.trId = trId; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java index 8d29bcf51..37c269d08 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java @@ -125,8 +125,17 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder Date: Thu, 23 Nov 2023 18:11:13 +0300 Subject: [PATCH 12/17] http://jira.mfd.msk:8088/browse/CLS-597 fix --- .../reports/builders/ks/KSCommissionTradesReportBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java index 37c269d08..9200f1f3b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java @@ -130,7 +130,7 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder Date: Thu, 23 Nov 2023 18:58:01 +0300 Subject: [PATCH 13/17] http://jira.mfd.msk:8088/browse/CLS-597 fix --- .../reports/builders/ks/KSCommissionTradesReportBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java index 9200f1f3b..80d40ec72 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java @@ -130,7 +130,7 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder Date: Fri, 24 Nov 2023 17:12:48 +0300 Subject: [PATCH 14/17] http://jira.mfd.msk:8088/browse/CLS-598 --- .../bean/KSCommissionTradesReport.java | 36 +++++++++++++++++++ .../ks/KSCommissionTradesReportBuilder.java | 19 ++++++++++ .../services/ReportServiceTest_KS.java | 4 +++ .../ks/KS_COMMISSION_TRADES_expected.csv | 4 +-- 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java index d6a1eec4b..cb6699796 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java @@ -61,6 +61,18 @@ public class KSCommissionTradesReport { @CsvBindByPosition(position = 11) private Long trId; + @CsvBindByName(column = "TKR") + @CsvBindByPosition(position = 12) + private String tkr; + + @CsvBindByName(column = "ACCOUNT") + @CsvBindByPosition(position = 13) + private String account; + + @CsvBindByName(column = "SESSION_ID") + @CsvBindByPosition(position = 14) + private Long sessionId; + public String getFirmId() { return firmId; @@ -157,4 +169,28 @@ public class KSCommissionTradesReport { public void setTrId(Long trId) { this.trId = trId; } + + public String getTkr() { + return tkr; + } + + public void setTkr(String tkr) { + this.tkr = tkr; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java index 80d40ec72..19f333b62 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java @@ -1,6 +1,7 @@ package ru.spcex.clearing.reports.builders.ks; import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.registry.Registry; @@ -21,6 +22,7 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; @Component public class KSCommissionTradesReportBuilder extends CSVReportBuilder { @@ -29,6 +31,7 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder registryImdg; private final Imdg companyImdg; private final Imdg executionDepositImdg; + private final Imdg accountImdg; private List rows = null; @@ -36,6 +39,7 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder 1) log.warn("ExecutionDeposit[exchangeExecutionId = {}].size > 1, use first", registry.getGroupId()); ExecutionDeposit executionDeposit = executionDeposits.iterator().next(); + String account = null; + AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()); + if (accountType == AccountType.Clrn) { + account = registry.getAccount(); + } else if (accountType == AccountType.Info) { + Account accountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of( + "accountType", AccountType.Anlt.getKey(), + "companyId", 1L + )); + account = accountFromImdg.getAccount(); + } + KSCommissionTradesReport ksCommissionTradesReport = new KSCommissionTradesReport(); ksCommissionTradesReport.setFirmId(firmId); ksCommissionTradesReport.setFirmIdInitiator(firmIdInitiator); @@ -173,6 +189,9 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder Date: Thu, 23 Nov 2023 11:11:41 +0300 Subject: [PATCH 15/17] =?UTF-8?q?meta=203.9.0.70=20=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20couponPeriod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend-api/src/main/resources/meta/meta.json | 6 +++--- .../backend-api/src/main/resources/meta/meta.xml | 6 +++--- clearing-parent/backend-api/src/test/resources/meta.json | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 908b42dc0..290d1ba10 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.9.0.69", + "version": "3.9.0.70", "enums": { @@ -3328,11 +3328,11 @@ "type": 3,"name": "Номер купона","shortname": "Номер","searchable": true,"sortable": true,"visible": true } , - {"code": "periodEndDate", + {"code": "periodStartDate", "type": 6,"name": "Начало периода действия","shortname": "Начало","searchable": true,"sortable": true,"visible": true } , - {"code": "periodStartDate", + {"code": "periodEndDate", "type": 6,"name": "Окончание периода действия","shortname": "Окончание","searchable": true,"sortable": true,"visible": true } , diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index c08dc1188..748f4e6a3 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -772,8 +772,8 @@ - - + +

diff --git a/clearing-parent/backend-api/src/test/resources/meta.json b/clearing-parent/backend-api/src/test/resources/meta.json index 908b42dc0..290d1ba10 100644 --- a/clearing-parent/backend-api/src/test/resources/meta.json +++ b/clearing-parent/backend-api/src/test/resources/meta.json @@ -1,6 +1,6 @@ { - "version": "3.9.0.69", + "version": "3.9.0.70", "enums": { @@ -3328,11 +3328,11 @@ "type": 3,"name": "Номер купона","shortname": "Номер","searchable": true,"sortable": true,"visible": true } , - {"code": "periodEndDate", + {"code": "periodStartDate", "type": 6,"name": "Начало периода действия","shortname": "Начало","searchable": true,"sortable": true,"visible": true } , - {"code": "periodStartDate", + {"code": "periodEndDate", "type": 6,"name": "Окончание периода действия","shortname": "Окончание","searchable": true,"sortable": true,"visible": true } , From 793171b3da60db6b109b23e586c1b8160a988480 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 24 Nov 2023 19:04:55 +0300 Subject: [PATCH 16/17] =?UTF-8?q?security-util=20UserRoleVerification=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/security/UserRoleVerification.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/UserRoleVerification.java b/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/UserRoleVerification.java index 4141b7725..f76c116ba 100644 --- a/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/UserRoleVerification.java +++ b/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/UserRoleVerification.java @@ -77,26 +77,32 @@ public class UserRoleVerification { public void validateRoleAndThrow(BaseRequest req) throws ValidationException { Objects.requireNonNull(roleForVerification); Long requesterId = req.getUserId(); - if (requesterId != null && !userHasRole(requesterId, roleForVerification)) { - log.trace("User {} has no role to allow this action", requesterId); - throw new ValidationException(roleVerificationError); - } else { + if (requesterId == null) { log.trace("Request without userId"); + } else { + if (!userHasRole(requesterId, roleForVerification)) { + log.trace("User {} has no role to allow this action", requesterId); + throw new ValidationException(roleVerificationError); + } } } public RequestInfoUpdate validateRoleAndGetResult(BaseRequest req) { Objects.requireNonNull(roleForVerification); Long requesterId = req.getUserId(); - if (requesterId != null && !userHasRole(requesterId, roleForVerification)) { - String errMsg = messageResolver.resolve(new EnumMessage(roleVerificationError, requesterId)); - log.info("User {} has no role: {}", requesterId, errMsg); - return new RequestInfoUpdate() - .setId(req.getId()) - .setStatus(ru.spcex.clearing.platform.messaging.service.Status.Error) - .setMessage(errMsg); - } else { + if (requesterId == null) { log.debug("Request without userId"); + } else { + if (!userHasRole(requesterId, roleForVerification)) { + String errMsg = messageResolver.resolve(new EnumMessage(roleVerificationError, requesterId)); + log.info("User {} has no role: {}", requesterId, errMsg); + return new RequestInfoUpdate() + .setId(req.getId()) + .setStatus(ru.spcex.clearing.platform.messaging.service.Status.Error) + .setMessage(errMsg); + } else { + log.trace("Request validateRoleAndGetResult for userId={} success", requesterId); + } } return null; } From d5e764131ddedb0f3b1c296ced043510778be1f2 Mon Sep 17 00:00:00 2001 From: etreshenkov Date: Mon, 27 Nov 2023 12:33:25 +0300 Subject: [PATCH 17/17] fix PlannerAllTodayMaker --- .../ru/spcex/clearing/imdg/services/PlannerAllTodayMaker.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/PlannerAllTodayMaker.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/PlannerAllTodayMaker.java index c418c0a4e..bcd617eda 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/PlannerAllTodayMaker.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/PlannerAllTodayMaker.java @@ -47,9 +47,8 @@ public class PlannerAllTodayMaker { public void makeSchedulerAllTodayMap() { LocalDate currentDate = LocalDate.now(); - List listOfPlannerAllToday = new ArrayList<>(); - if (!plannerMap.isEmpty()) listOfPlannerAllToday.addAll(getPlannersAllTodayToDate(currentDate)); + List listOfPlannerAllToday = getPlannersAllTodayToDate(currentDate); log.info("For today find {} plannerTemplates satisfying rules", listOfPlannerAllToday.size()); plannerMap.values().stream()