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); } 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) { 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") 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");