From f9c09aa792e441d51e3c0c24cd8188f06a29fe6e Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 26 Sep 2023 13:54:17 +0300 Subject: [PATCH 1/4] http://jira.mfd.msk:8088/browse/CLS-497 fix --- .../reports/ks/KSRepCashNettoReportBuilder.java | 10 ++++++---- .../reports/ks/KSRepDepoNettoReportBuilder.java | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java index 1901d631a..85d247f61 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java @@ -67,11 +67,13 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); - if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); ImdgPredicate finalPredicate = pb.and( - pb.in("sessionId", sessionIds.toArray(new Long[0])), - pb.equals("clearingDate", nowDate), + pb.not(pb.in("registryStatus", + RegistryStatus.CLRD.getKey(), + RegistryStatus.UNCV.getKey(), + RegistryStatus.FAIL.getKey(), + RegistryStatus.NACK.getKey(), + RegistryStatus.NACC.getKey())), pb.sql(sql), pb.or( pb.equals("accountType", AccountType.Clrn.getKey()), diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java index 1e33b4e51..755df29a6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java @@ -66,12 +66,14 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); - if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TS_T, RegistryTradingParams.OS_T).build(); ImdgPredicate finalPredicate = pb.and( - pb.in("sessionId", sessionIds.toArray(new Long[0])), - pb.equals("clearingDate", nowDate), + pb.not(pb.in("registryStatus", + RegistryStatus.CLRD.getKey(), + RegistryStatus.UNCV.getKey(), + RegistryStatus.FAIL.getKey(), + RegistryStatus.NACK.getKey(), + RegistryStatus.NACC.getKey())), pb.sql(sql), pb.equals("accountType", AccountType.Depo.getKey()), pb.notNull("account") From 0761de4b7e645bf1cd98175667b9226b69d67cae Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 26 Sep 2023 13:57:35 +0300 Subject: [PATCH 2/4] http://jira.mfd.msk:8088/browse/CLS-497 fix test --- .../spcex/clearing/reports/services/ReportServiceTest_KS.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java index 9c214a957..ce94d4407 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java @@ -435,6 +435,7 @@ public class ReportServiceTest_KS { registry_1.setGroupId(Long.MAX_VALUE); registry_1.setClearingDate(LocalDate.now()); registry_1.setRegistryCode("OM_T"); + registry_1.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_1.setRegistryDesignation(RegistryDesignation.O.getKey()); registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); registry_1.setRegistryUnit(RegistryUnit.T.getKey()); @@ -450,6 +451,7 @@ public class ReportServiceTest_KS { registry_2.setGroupId(Long.MAX_VALUE); registry_2.setClearingDate(LocalDate.now()); registry_2.setRegistryCode("TM_T"); + registry_2.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_2.setRegistryDesignation(RegistryDesignation.T.getKey()); registry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); registry_2.setRegistryUnit(RegistryUnit.T.getKey()); @@ -499,6 +501,7 @@ public class ReportServiceTest_KS { registry_1.setRegistryCode("TS_T"); registry_1.setRegistryDesignation(RegistryDesignation.T.getKey()); registry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); + registry_1.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_1.setRegistryUnit(RegistryUnit.T.getKey()); registry_1.setSecuritySymbol("SECURITY_SYMBOL"); registry_1.setSessionId(sessionId); @@ -516,6 +519,7 @@ public class ReportServiceTest_KS { registry_2.setRegistryDesignation(RegistryDesignation.O.getKey()); registry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry_2.setRegistryUnit(RegistryUnit.T.getKey()); + registry_2.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_2.setSecuritySymbol("SECURITY_SYMBOL"); registry_2.setSessionId(sessionId); registry_2.setAccount("ACCOUNT"); From b9b3013b2d69fe428fc3e4ec032053dd9e4368c1 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Tue, 26 Sep 2023 16:00:09 +0300 Subject: [PATCH 3/4] =?UTF-8?q?clearing-validation=20http://git.mfd.msk/mf?= =?UTF-8?q?d/clearing/-/issues/12=20IMDGMessageResolver=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B5=20=D1=81=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20(=D0=BA=D0=BE=D0=B3?= =?UTF-8?q?=D0=B4=D0=B0=20=D0=BA=D0=BE=D0=BB-=D0=B2=D0=BE=20=D0=B0=D1=80?= =?UTF-8?q?=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B2=D0=BF=D0=B0=D0=B4=D0=B0=D0=B5=D1=82,=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B4=D0=B0=D1=91=D1=82=20=D0=B1=D0=BE=D0=BB=D0=B5?= =?UTF-8?q?=D0=B5=20=D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9=20=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D1=82=20+=20warn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/services/IMDGMessageResolver.java | 18 ++++++- .../services/IMDGMessageResolverTest.java | 53 +++++++++++++------ 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/util/services/IMDGMessageResolver.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/util/services/IMDGMessageResolver.java index 4c3807bff..3da17146d 100644 --- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/util/services/IMDGMessageResolver.java +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/util/services/IMDGMessageResolver.java @@ -10,6 +10,7 @@ import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; import java.util.Arrays; +import java.util.MissingFormatArgumentException; import java.util.function.Supplier; /** @@ -35,7 +36,22 @@ public class IMDGMessageResolver implements IMessageResolver { return simplFormatter.get(); } String textTemplate = errId + " " + errorDictionary.getName(); - return String.format(textTemplate, errMsg.getArgs()); + try { + return String.format(textTemplate, errMsg.getArgs()); + } catch (MissingFormatArgumentException errFormatting) { // MissingFormatArgumentException + int argExpected = 0; + int i = 0, li = -1; + while ((i = textTemplate.indexOf("%", i)) >= 0 && i != li) { + argExpected++; + li = i; + i++; + } + log.warn("Error dictionary {} text \"{}\" contains {} argument position, but message contains only: {}", + errId, textTemplate, argExpected, errMsg.getArgs().length); + Object[] arg = Arrays.copyOf(errMsg.getArgs(), Math.max(errMsg.getArgs().length, argExpected)); + for (i = errMsg.getArgs().length; i < arg.length; i++) arg[i] = " "; + return String.format(textTemplate, arg); + } } catch (Exception errFormatting) { // MissingFormatArgumentException log.warn("Error in message resolver for error {} id {}. Format error: {}", errMsg.getSubject(), errMsg.getSubject().getId(), errFormatting); return simplFormatter.get(); diff --git a/clearing-parent/clearing-validation/src/test/java/ru/spcex/clearing/util/services/IMDGMessageResolverTest.java b/clearing-parent/clearing-validation/src/test/java/ru/spcex/clearing/util/services/IMDGMessageResolverTest.java index 37dd1196b..fddf0fa74 100644 --- a/clearing-parent/clearing-validation/src/test/java/ru/spcex/clearing/util/services/IMDGMessageResolverTest.java +++ b/clearing-parent/clearing-validation/src/test/java/ru/spcex/clearing/util/services/IMDGMessageResolverTest.java @@ -16,15 +16,26 @@ class IMDGMessageResolverTest { @Test void resolve() { ImdgProvider imdgProvider = Mockito.mock(ImdgProvider.class); - Imdg errorCodeDictionary = Mockito.mock(Imdg.class); - ErrorCodeDictionary error1Dict = new ErrorCodeDictionary(); - error1Dict.setId(1L); - error1Dict.setCode("TEST"); - error1Dict.setName("Error 1 test. Two arg %s, %s."); - Mockito.when(errorCodeDictionary.getSingleObjectByID(1L)).thenReturn(error1Dict); - Mockito.when(imdgProvider.getImdg(IMDGDistributedNames.Map_ErrorCodeDictionary, ErrorCodeDictionary.class)) - .thenReturn(errorCodeDictionary); - + { + Imdg errorCodeDictionary = Mockito.mock(Imdg.class); + ErrorCodeDictionary error1Dict = new ErrorCodeDictionary(); + error1Dict.setId(1L); + error1Dict.setCode("TEST"); + error1Dict.setName("Error 1 test. Two arg %s, %s."); + Mockito.when(errorCodeDictionary.getSingleObjectByID(1L)).thenReturn(error1Dict); + ErrorCodeDictionary error2Dict = new ErrorCodeDictionary(); + error2Dict.setId(2L); + error2Dict.setCode("TEST"); + error2Dict.setName("Error 2 test. Two ar \\%QW."); + Mockito.when(errorCodeDictionary.getSingleObjectByID(2L)).thenReturn(error2Dict); + ErrorCodeDictionary error3Dict = new ErrorCodeDictionary(); + error3Dict.setId(3L); + error3Dict.setCode("TEST"); + error3Dict.setName("Error 3 test only."); + Mockito.when(errorCodeDictionary.getSingleObjectByID(3L)).thenReturn(error3Dict); + Mockito.when(imdgProvider.getImdg(IMDGDistributedNames.Map_ErrorCodeDictionary, ErrorCodeDictionary.class)) + .thenReturn(errorCodeDictionary); + } IMDGMessageResolver resolver = new IMDGMessageResolver(imdgProvider); @@ -39,20 +50,32 @@ class IMDGMessageResolverTest { } { String text = resolver.resolve(new EnumMessage(err1, "one only this")); - //assertEquals("Error 1 test. Two arg one only this, %s.", text); + assertEquals("1 Error 1 test. Two arg one only this, .", text); // java.util.MissingFormatArgumentException: Format specifier '%s' - assertEquals("(1) args [one only this]", text); +// assertEquals("(1) args [one only this]", text); } { String text = resolver.resolve(new EnumMessage(err1)); - //assertEquals("Error 1 test. Two arg %s, %s.", text); + assertEquals("1 Error 1 test. Two arg , .", text); // java.util.MissingFormatArgumentException: Format specifier '%s' - assertEquals("(1) args []", text); +// assertEquals("(1) args []", text); + } + { + String text = resolver.resolve(new EnumMessage(ClearingErrorInternalTest.TestError2, "text")); + // java.util.UnknownFormatConversionException: Conversion = 'Q' + assertEquals("(2) args [text]", text); + } + { + String text = resolver.resolve(new EnumMessage(ClearingErrorInternalTest.TestError3, "text")); + assertEquals("3 Error 3 test only.", text); + + text = resolver.resolve(new EnumMessage(ClearingErrorInternalTest.TestError3)); + assertEquals("3 Error 3 test only.", text); } } - static enum ClearingErrorInternalTest implements IErrorEnumId { // see ClearingErrorInternal - TestError(1L); + enum ClearingErrorInternalTest implements IErrorEnumId { // see ClearingErrorInternal + TestError(1L), TestError2(2L), TestError3(3L); private final Long id; ClearingErrorInternalTest(Long id) { From f467b1062b1f466e6dcd236f0cbbb9a3629f7117 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 26 Sep 2023 19:13:24 +0300 Subject: [PATCH 4/4] PaymentInstructionOutboundService + search for anlt by contract sdf57 session continue event fix --- .../java/ru/spcex/clearing/service/AnltSearcher.java | 10 +++++++++- .../payment/PaymentInstructionOutboundService.java | 2 +- .../spcex/clearing/statement/StatementServiceV2.java | 7 ++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java index 40e549235..5eed48609 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java @@ -89,7 +89,15 @@ public class AnltSearcher { if (tcrIndex == -1) { return null; } - comment = comment.substring(tcrIndex + 3); + if (comment.length() < (tcrIndex + 4)) { + return null; + } + int spaceAfterTCR = comment.indexOf(" ", tcrIndex + 4); + if (spaceAfterTCR == -1) { + comment = comment.substring(tcrIndex + 4); + } else { + comment = comment.substring(tcrIndex + 4, spaceAfterTCR); + } return comment.replaceAll("\\s+", ""); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java index 1f1057ec2..dfcf8f509 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java @@ -125,7 +125,7 @@ public class PaymentInstructionOutboundService { log.debug("all checks passed, accCred.id={}, accDeb.id={}, addressee.id={}, sender.id={}, amount: {}", accCred.getId(), accDeb.getId(), addressee.getId(), sender.getId(), amount); - String purpose = tcr != null ? "Вывод средств по ТКР " + tcr.getCode() + "." : "Вывод средств."; + String purpose = tcr != null ? "Вывод средств по ТКР " + tcr.getCode() + " ." : "Вывод средств."; if (payload.getPaymentPurpose() != null) { purpose += " " + payload.getPaymentPurpose(); if (!(purpose.endsWith(".") || purpose.endsWith("!") || purpose.endsWith("?") || purpose.endsWith(";"))) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java index 264a5f137..5fc3a8031 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.sdf.*; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; @@ -19,6 +20,7 @@ import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.ObjectType; import ru.spcex.platform.enumeration.Priority; import ru.spcex.platform.enumeration.SdfTable; +import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.text.TextUtil; @@ -42,6 +44,7 @@ public class StatementServiceV2 { private final Sdf57Executor sdf57Executor; private final Sdf04Executor sdf04Executor; private final Sdf13Executor sdf13Executor; + private final Imdg sessionImdg; private final Reviser reviser; private final SdfGroupManager grpMng; @@ -63,6 +66,7 @@ public class StatementServiceV2 { this.sdf57Executor = sdf57Executor; this.sdf04Executor = sdf04Executor; this.sdf13Executor = sdf13Executor; + this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.reviser = reviser; this.grpMng = grpMng; } @@ -185,7 +189,8 @@ public class StatementServiceV2 { removeFirstWithSameTableAndGroupId(sdf57); reviser.doRevise(sdf01.getGroupId()); //теперь можем продолжить сессию с шага 1 - if (!sessionStarted) { + if (!sessionStarted + || sessionImdg.getFirstObjectBySQL("workflowStatus = '%s'".formatted(WorkflowStatus.Active.getKey())) != null) { SessionContinueEvent continueSessionBn = new SessionContinueEvent(SdfTable.SDF_01, SdfTable.SDF_57); kafkaSender.sendRequestToQueue(Consts.CONTINUE_SESSION_BN_FIRST_PART, continueSessionBn); }