From e40a8dc724817a8ed4254310e48998ac8b3985f6 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 25 Sep 2023 17:43:43 +0300 Subject: [PATCH 01/37] =?UTF-8?q?1.=20planBalance=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=205=20=D1=88=D0=B0=D0=B3=D0=B0=20=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=82=D0=B0=20=D0=B4=D0=B5=D0=BF?= =?UTF-8?q?=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D0=B2=202.=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B8,=20=D1=81=D0=BE=D0=B7=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5(=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5)=20dm=5Fx=20->=20dm=5Fx/dm=5Ft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/config/ValidationConfig.java | 5 +- .../spcex/clearing/error/ClearingError.java | 1 + .../clearing/service/RegistryService.java | 46 +++++----- .../ReturnDepositValidationRule.java | 86 ++++++++++++++++--- .../service/validation/ValidationStored.java | 2 +- .../session/stage/ReturnDepositSession.java | 1 + .../stage/impl/InspectionObligations.java | 49 +---------- .../InspectionObligationsDepositReturn.java | 11 ++- .../session/stage/impl/PlanBalanceCalc.java | 73 ++++++++++++++++ 9 files changed, 191 insertions(+), 83 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/PlanBalanceCalc.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index 1c33fe8fa..d152890b4 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -329,9 +329,10 @@ public class ValidationConfig { context.setLogPrefix(LogPrefixId.INSTANCE); return new ValidatorImpl<>(context, new PresentById(IMDGDistributedNames.Map_Registry, ClearingError.RecordNotFound, true), - ReturnDepositValidationRule.RegistryCodeCheck, + ReturnDepositValidationRule.RgsWronCodeCheck, + ReturnDepositValidationRule.CategoryCheck, ReturnDepositValidationRule.BalanceCheck, - ReturnDepositValidationRule.DmxCheck + ReturnDepositValidationRule.Dm_Check ); }; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java index b3ca256ca..21fabb227 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java @@ -23,6 +23,7 @@ public enum ClearingError implements IErrorEnumId { SuchRecordAlreadyExists(5405L), TradingClearingRegistryNotFound(5418L), TradingClearingRegistryNotActive(5419L), + CategoryNotFound(5420L), ClearingUnavailableForCompany(5421L), InsecurityObligation(5422L), NewDealsNotFound(5423L), diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index 5b7d00041..6bcbedd89 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -166,28 +166,34 @@ public class RegistryService { msgResolver.resolve(err.get())); return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(err.get())); } - Registry tm_t = validator.getStored(Stored.PresentById); - Registry dm_x = validator.getStored(ValidationStored.ReturnDepositDmx); - if (dm_x != null) { - dm_x.setSessionId(null); - dm_x.setSessionType(null); - dm_x.setBalance(requestPayload.getBalance()); - dm_x.setUpdated(Instant.now()); - registryImdg.update(dm_x); - log.debug("updated dm*x.id={} by RegistryReturnDepositRequest.id={}", - dm_x.getId(), + Registry _m_t = validator.getStored(Stored.PresentById); + Registry dm__ = validator.getStored(ValidationStored.ReturnDepositDm__); + if (dm__ != null) { + dm__.setSessionId(null); + dm__.setSessionType(null); + dm__.setBalance(requestPayload.getBalance()); + dm__.setUpdated(Instant.now()); + registryImdg.update(dm__); + log.debug("updated {}.id={} by RegistryReturnDepositRequest.id={}", + dm__.getRegistryCode(), + dm__.getId(), req.getId()); } else { - dm_x = tm_t.clone(); - dm_x.setRegistryDesignation(RegistryDesignation.D.getKey()); - dm_x.setRegistryUnit(RegistryUnit.X.getKey()); - dm_x.setRegistryCode(RegistryUtil.clearingCode(dm_x)); - dm_x.setBalance(requestPayload.getBalance()); - dm_x.setSessionId(null); - dm_x.setSessionType(null); - registryImdg.insert(dm_x); - log.debug("created dm*x.id={} by RegistryReturnDepositRequest.id={}", - dm_x.getId(), + dm__ = _m_t.clone(); + dm__.setRegistryDesignation(RegistryDesignation.D.getKey()); + if (RegistryDesignation.T.equalsByKey(_m_t.getRegistryDesignation())) { + dm__.setRegistryUnit(RegistryUnit.X.getKey()); + } else { + dm__.setRegistryUnit(RegistryUnit.T.getKey()); + } + dm__.setRegistryCode(RegistryUtil.clearingCode(dm__)); + dm__.setBalance(requestPayload.getBalance()); + dm__.setSessionId(null); + dm__.setSessionType(null); + registryImdg.insert(dm__); + log.debug("created {}.id={} by RegistryReturnDepositRequest.id={}", + dm__.getRegistryCode(), + dm__.getId(), req.getId()); } return new RequestInfoUpdate(req.getId(), Status.Success, null); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java index 31b1c6a28..421b59e1f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java @@ -1,23 +1,68 @@ package ru.spcex.clearing.service.validation; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest; -import ru.spcex.clearing.service.registry.RegistryManager; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryInstrumentType; -import ru.spcex.platform.enumeration.RegistryStatus; -import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.Stored; import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidationRule; +import java.math.BigDecimal; import java.util.Optional; +import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode; + +//1. Проверки +//1.1 Проверить, в запросе у регистра код: +// 1.1.1 Если регистр TM-T: +// Проверить, что у registry.companyId существует категория I, иначе ошибка: 5420 - "Доступ к клирингу на «%s» не найден для компании %s."/> Где %s = категории И +// Проверить, что найденного регистра DM*X: registry.status!=OK, иначе ошибка: 5425 - "Запрещена идентификация средства по рассчитанным обязательствам". +// Создать/добавить в баланс DM-X на базе TM-T +// 1.1.2 Если регистр OM-T: +// Проверить, что у registry.companyId существует категория V, иначе ошибка: 5420 - "Доступ к клирингу на «%s» не найден для компании %s."/> Где %s = категории В +// Проверить, что найденного регистра DM*T: registry.status!=OK, иначе ошибка: 5425 - "Запрещена идентификация средства по рассчитанным обязательствам". +// Создать/добавить в баланс DM-T на базе OM-T +//1.2 Проверить, баланс в запросе +// Баланс должен быть положительный public enum ReturnDepositValidationRule implements IValidationRule> { + RgsWronCodeCheck() { + @Override + public Optional validate(ImdgValidationContext context) { + Registry rgs = context.getStoredObject(Stored.PresentById); + if (!equalsByCode(RegistryTradingParams.TM_T, rgs) && !equalsByCode(RegistryTradingParams.OM_T, rgs)) { + return of(ClearingError.RgsWrongCode, "{}.id={}", rgs.getRegistryCode(), rgs.getId()); + } + return empty(); + } + }, + CategoryCheck() { + @Override + public Optional validate(ImdgValidationContext context) { + Registry rgs = context.getStoredObject(Stored.PresentById); + ClearingCategory ctgr = null; + if (equalsByCode(RegistryTradingParams.TM_T, rgs)) { + ctgr = ClearingCategory.I; + } else { + ctgr = ClearingCategory.V; + } + Imdg ctgImdg = context.obtainMap(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + ClearingMemberCategory category = + ctgImdg.getFirstObjectBySQL("companyId = %d and clearingMemberCategory = '%s'" + .formatted(rgs.getCompanyId(), ctgr.getKey())); + if (category == null) { + return of(ClearingError.CategoryNotFound, ctgr.getKey(), rgs.getCompanyId()); + } + return empty(); + } + }, + @Deprecated RegistryCodeCheck() { @Override public Optional validate(ImdgValidationContext context) { @@ -34,23 +79,40 @@ public enum ReturnDepositValidationRule implements IValidationRule validate(ImdgValidationContext context) { Registry rgs = context.getStoredObject(Stored.PresentById); RegistryReturnDepositRequest request = context.getValidatedObject(); - if (request.getBalance() == null || request.getBalance().compareTo(rgs.getBalance()) > 0) { + if (request.getBalance() == null || request.getBalance().compareTo(BigDecimal.ZERO) < 0) { + return of(ClearingError.WrongField, "balance"); + } + if (request.getBalance().compareTo(rgs.getBalance()) > 0) { return of(ClearingError.IdentifiedFundsExceedObligations); } return Optional.empty(); } - }, DmxCheck() { + }, Dm_Check() { @Override public Optional validate(ImdgValidationContext context) { Registry rgs = context.getStoredObject(Stored.PresentById); Imdg rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); - RegistryManager rgsMng = new RegistryManager(rgsImdg); - Optional dmx = rgsMng.searchDmxByCompanyId(rgs); - if (dmx.isPresent() && RegistryStatus.OK.equalsByKey(dmx.get().getRegistryStatus()) ) { + if (TextUtil.isEmpty(rgs.getContract())) { + return empty(); + } + RegistryTradingParams rgsCode; + if (equalsByCode(RegistryTradingParams.TM_T, rgs)) { + rgsCode = RegistryTradingParams.DM_X; + } else { + rgsCode = RegistryTradingParams.DM_T; + } + String sqlCondition = String.format("(%s) and companyId = %d and contract = '%s'", + RegistryCodeSqlBuilder.getInstance(rgsCode).build(), + rgs.getCompanyId(), + rgs.getContract()); + Registry dm__ = rgsImdg.getFirstObjectBySQL(sqlCondition); + if (dm__ != null && RegistryStatus.OK.equalsByKey(dm__.getRegistryStatus()) ) { return of(ClearingError.ObligationsAlreadyCalculated); } - dmx.ifPresent(dmxRgs -> context.storeObject(ValidationStored.ReturnDepositDmx, dmxRgs)); - return Optional.empty(); + if (dm__ != null) { + context.storeObject(ValidationStored.ReturnDepositDm__, dm__); + } + return empty(); } }; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java index 471106a79..a0ad7e8a8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java @@ -18,7 +18,7 @@ public enum ValidationStored { Sdf06Company, Sdf06Account, Sdf06Tcr, - ReturnDepositDmx, + ReturnDepositDm__, IdentificationFundsTcrSearch, IdentificationFundsAssetTrio, diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java index 4eadca2cb..5913b209e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java @@ -160,6 +160,7 @@ public class ReturnDepositSession extends AbstractSession implements Initializin { InspectionPoolPayload companyIdPayload = new InspectionPoolPayload(); companyIdPayload.setProcessedCompanyId(currSession.getCompanyId()); + companyIdPayload.setSessionId(currSession.getId()); runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligationsDepositReturn); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java index 327b6d8b2..a4161430a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java @@ -1,7 +1,5 @@ package ru.spcex.clearing.session.stage.impl; -import org.apache.commons.lang3.tuple.MutableTriple; -import org.apache.commons.lang3.tuple.Triple; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -55,16 +53,18 @@ public class InspectionObligations implements ISessionStage { private final AssetTBFProcessing assets; private final GatewayRequester gateway; private final TradingTimeService tradingTimeService; + private final PlanBalanceCalc planBalanceCalc; @Autowired public InspectionObligations(ImdgProvider imdgProvider, RegistryManager registryManager, AssetTBFProcessing assets, - GatewayRequester gateway) { + GatewayRequester gateway, PlanBalanceCalc planBalanceCalc) { this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryManager = registryManager; this.assets = assets; this.gateway = gateway; + this.planBalanceCalc = planBalanceCalc; this.gateway.setName("InspectionObligations|OM*T"); this.tradingTimeService = new TradingTimeService(imdgProvider); } @@ -204,52 +204,11 @@ public class InspectionObligations implements ISessionStage { } } - stageRevision2(sessionId); + planBalanceCalc.stageRevision2(sessionId); return new StageResult(null, true); } - protected void stageRevision2(Long sessionId) { - /* todo logic - Collection rgsAT = findRegistryATBySession // registry_disignation=A and registry_unit=T -Collection rgsAB = findRegistryATBySession // registry_disignation=A and registry_unit=B and sessionId = current - -foreach( at: rgsAT) - foreach (ab: rgsAB) - if (at.companyId=ab.companyId and at.accountId=ab.accountId and at.securityId=ab.securityId) - at.plannecBallance -= ab.balance - */ - String sqlAT = RegistryCodeSqlBuilder.getInstance(A__T).build(); - String sqlAB = String.format("(%s) and sessionId = %d", - RegistryCodeSqlBuilder.getInstance(A__B).build(), - sessionId - ); - Collection registriesAT = registryImdg.getCollectionObjectsBySQL(sqlAT); - Collection registriesAB = registryImdg.getCollectionObjectsBySQL(sqlAB); - log.debug("Select {} registers by \"{}\", {} registers by \"{}\" for revision step 2", - registriesAT.size(), sqlAT, registriesAB.size(), sqlAB); - Map, List> regABIndex = registriesAB.stream().collect(Collectors.groupingBy( - (Registry reg) -> new MutableTriple(reg.getCompanyId(), reg.getAccountId(), reg.getSecurityId()) - )); - int updateCount = 0; - Instant now = Instant.now(); - for (Registry regT : registriesAT) { - Triple key = new MutableTriple(regT.getCompanyId(), regT.getAccountId(), regT.getSecurityId()); - List regsB = regABIndex.get(key); - if (regsB == null) { - log.debug("Registry A__B for registry[{}] (A__T key {}) not found", regT, key); - } else { - for (Registry regB : regsB) { - regT.setPlanBalance(safeBD(regT.getPlanBalance()).subtract(safeBD(regB.getBalance()))); - } - regT.setUpdated(now); - registryImdg.update(regT); - updateCount++; - } - } - log.debug("Updated {} registers A__T with planBalance at {}", updateCount, now); - } - private String searchAssetsByObligationSql(Registry obligation) { RegistryTradingParams counterRegistryTradingParams = null; if (IEnumKey.getEnumByKey(RegistryInstrumentType.class, obligation.getRegistryInstrumentType()) == RegistryInstrumentType.S) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java index 0e9742fb9..4d6df6934 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java @@ -16,6 +16,7 @@ import ru.spcex.clearing.service.schedule.TradingTimeService; import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; +import ru.spcex.clearing.session.stage.task.InspectionPoolPayload; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -44,23 +45,26 @@ public class InspectionObligationsDepositReturn implements ISessionStage { private final AssetTBFProcessing assets; private final TradingTimeService tradingTimeService; private final GatewayRequester gateway; + private final PlanBalanceCalc planBalanceCalc; @Autowired - public InspectionObligationsDepositReturn(ImdgProvider imdgProvider, RegistryManager rgsMng, AssetTBFProcessing assets, TradingTimeService tradingTimeService, GatewayRequester gateway) { + public InspectionObligationsDepositReturn(ImdgProvider imdgProvider, RegistryManager rgsMng, AssetTBFProcessing assets, TradingTimeService tradingTimeService, GatewayRequester gateway, PlanBalanceCalc planBalanceCalc) { this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.categoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); this.rgsMng = rgsMng; this.assets = assets; this.tradingTimeService = tradingTimeService; this.gateway = gateway; + this.planBalanceCalc = planBalanceCalc; this.gateway.setName("InspectionObligationsDepositReturn|OM*T"); } @Override public StageResult submit(Task task) { + InspectionPoolPayload payload = (InspectionPoolPayload) task.getData(); switch (task.getTaskType()) { case InspectionObligations -> { - return inspectionObligations(); + return inspectionObligations(payload.getSessionId()); } default -> throw new IllegalStateException("Unknown task type: " + task.getTaskType()); } @@ -81,7 +85,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { } } - private StageResult inspectionObligations() { + private StageResult inspectionObligations(Long sessionId) { String sqlCondition = String.format("(%s) and registryStatus = '%s'", RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(), RegistryStatus.POOL.getKey()); @@ -196,6 +200,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { group.forEach(rgs -> updateStatus(rgs, registryStatusFailed(rgs))); } } + planBalanceCalc.stageRevision2(sessionId); return new StageResult<>(null, true); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/PlanBalanceCalc.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/PlanBalanceCalc.java new file mode 100644 index 000000000..c1c51a30c --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/PlanBalanceCalc.java @@ -0,0 +1,73 @@ +package ru.spcex.clearing.session.stage.impl; + +import org.apache.commons.lang3.tuple.MutableTriple; +import org.apache.commons.lang3.tuple.Triple; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; + +import java.time.Instant; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static ru.spcex.platform.enumeration.RegistryTradingParams.A__B; +import static ru.spcex.platform.enumeration.RegistryTradingParams.A__T; +import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; + +@Component +public class PlanBalanceCalc { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg rgsImdg; + + public PlanBalanceCalc(ImdgProvider imdgProvider) { + this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + } + + public void stageRevision2(Long sessionId) { + /* todo logic + Collection rgsAT = findRegistryATBySession // registry_disignation=A and registry_unit=T +Collection rgsAB = findRegistryATBySession // registry_disignation=A and registry_unit=B and sessionId = current + +foreach( at: rgsAT) + foreach (ab: rgsAB) + if (at.companyId=ab.companyId and at.accountId=ab.accountId and at.securityId=ab.securityId) + at.plannecBallance -= ab.balance + */ + String sqlAT = RegistryCodeSqlBuilder.getInstance(A__T).build(); + String sqlAB = String.format("(%s) and sessionId = %d", + RegistryCodeSqlBuilder.getInstance(A__B).build(), + sessionId + ); + Collection registriesAT = rgsImdg.getCollectionObjectsBySQL(sqlAT); + Collection registriesAB = rgsImdg.getCollectionObjectsBySQL(sqlAB); + log.debug("Select {} registers by \"{}\", {} registers by \"{}\" for revision step 2", + registriesAT.size(), sqlAT, registriesAB.size(), sqlAB); + Map, List> regABIndex = registriesAB.stream().collect(Collectors.groupingBy( + (Registry reg) -> new MutableTriple(reg.getCompanyId(), reg.getAccountId(), reg.getSecurityId()) + )); + int updateCount = 0; + Instant now = Instant.now(); + for (Registry regT : registriesAT) { + Triple key = new MutableTriple(regT.getCompanyId(), regT.getAccountId(), regT.getSecurityId()); + List regsB = regABIndex.get(key); + if (regsB == null) { + log.debug("Registry A__B for registry[{}] (A__T key {}) not found", regT, key); + } else { + for (Registry regB : regsB) { + regT.setPlanBalance(safeBD(regT.getPlanBalance()).subtract(safeBD(regB.getBalance()))); + } + regT.setUpdated(now); + rgsImdg.update(regT); + updateCount++; + } + } + log.debug("Updated {} registers A__T with planBalance at {}", updateCount, now); + } +} From c940316494b1dce7d6298eec9c1826e1d7e15650 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 26 Sep 2023 13:15:18 +0300 Subject: [PATCH 02/37] RegistryService#returnDeposit validator imdg bugfix --- .../main/java/ru/spcex/clearing/config/ValidationConfig.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index d152890b4..dcf29e677 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.AccountBalance; import ru.clearing.classes.statics.data.account.DepoAccount; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; @@ -69,6 +70,7 @@ public class ValidationConfig { Imdg sDf55Imdg; Imdg sDf54Imdg; Imdg pmtImdg; + Imdg ctgrImdg; ImdgProvider imdgProvider; public ValidationConfig(ImdgProvider imdgProvider) { @@ -91,6 +93,7 @@ public class ValidationConfig { this.sDf55Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf55, SDf55.class); this.sDf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class); this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); + this.ctgrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); this.imdgProvider = imdgProvider; } @@ -326,6 +329,7 @@ public class ValidationConfig { ImdgValidationContext context = new ImdgValidationContext<>(); context.setValidatedObject(returnDepositRequest); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); + context.addImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ctgrImdg); context.setLogPrefix(LogPrefixId.INSTANCE); return new ValidatorImpl<>(context, new PresentById(IMDGDistributedNames.Map_Registry, ClearingError.RecordNotFound, true), From b7498399635b5c706a5e88de39bf6853ba4e14d5 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 26 Sep 2023 15:06:22 +0300 Subject: [PATCH 03/37] return deposit dm*x/dm*t --- .../clearing/service/RegistryService.java | 10 +++- .../service/registry/RegistryManager.java | 2 + .../ReturnDepositValidationRule.java | 58 ++++++++++--------- .../service/validation/ValidationStored.java | 2 +- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index 619695f8f..d1d05f9ef 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -20,6 +20,7 @@ import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.clearing.service.builder.PaymentInstructionBuilderV2; import ru.spcex.clearing.service.integration.GatewayRequestCreator; import ru.spcex.clearing.service.registry.AssetTBFProcessing; +import ru.spcex.clearing.service.registry.RegistryManager; import ru.spcex.clearing.service.schedule.TradingTimeService; import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.session.stage.impl.GatewayRequester; @@ -166,12 +167,14 @@ public class RegistryService { msgResolver.resolve(err.get())); return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(err.get())); } - Registry _m_t = validator.getStored(Stored.PresentById); + Registry _m_t = validator.getStored(ValidationStored.ReturnDepositOm_t); + if (_m_t == null) _m_t = validator.getStored(Stored.PresentById); + Registry dm__ = validator.getStored(ValidationStored.ReturnDepositDm__); if (dm__ != null) { dm__.setSessionId(null); dm__.setSessionType(null); - dm__.setBalance(requestPayload.getBalance()); + dm__.setBalance(safeBD(dm__.getBalance()).add(requestPayload.getBalance())); dm__.setUpdated(Instant.now()); registryImdg.update(dm__); log.debug("updated {}.id={} by RegistryReturnDepositRequest.id={}", @@ -181,13 +184,14 @@ public class RegistryService { } else { dm__ = _m_t.clone(); dm__.setRegistryDesignation(RegistryDesignation.D.getKey()); + RegistryManager.zeroState(dm__); if (RegistryDesignation.T.equalsByKey(_m_t.getRegistryDesignation())) { dm__.setRegistryUnit(RegistryUnit.X.getKey()); } else { dm__.setRegistryUnit(RegistryUnit.T.getKey()); } dm__.setRegistryCode(RegistryUtil.clearingCode(dm__)); - dm__.setBalance(requestPayload.getBalance()); + dm__.setBalance(safeBD(dm__.getBalance()).add(requestPayload.getBalance())); dm__.setSessionId(null); dm__.setSessionType(null); registryImdg.insert(dm__); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/RegistryManager.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/RegistryManager.java index 5f316cc29..69c6ecba4 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/RegistryManager.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/RegistryManager.java @@ -183,6 +183,8 @@ public class RegistryManager { //балансы rgs.setBalance(BigDecimal.ZERO); rgs.setDebit(BigDecimal.ZERO); + rgs.setSettledDebit(BigDecimal.ZERO); + rgs.setSettledCredit(BigDecimal.ZERO); rgs.setCredit(BigDecimal.ZERO); rgs.setDiffBalance(BigDecimal.ZERO); rgs.setCheckBalance(BigDecimal.ZERO); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java index 421b59e1f..13b32dbe5 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java @@ -5,16 +5,20 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.ClearingCategory; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.Stored; import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidationRule; import java.math.BigDecimal; +import java.util.Collection; import java.util.Optional; import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode; @@ -36,7 +40,7 @@ public enum ReturnDepositValidationRule implements IValidationRule validate(ImdgValidationContext context) { Registry rgs = context.getStoredObject(Stored.PresentById); - if (!equalsByCode(RegistryTradingParams.TM_T, rgs) && !equalsByCode(RegistryTradingParams.OM_T, rgs)) { + if (!equalsByCode(RegistryTradingParams.TM_T, rgs)) { //!equalsByCode(RegistryTradingParams.OM_T, rgs) return of(ClearingError.RgsWrongCode, "{}.id={}", rgs.getRegistryCode(), rgs.getId()); } return empty(); @@ -46,35 +50,34 @@ public enum ReturnDepositValidationRule implements IValidationRule validate(ImdgValidationContext context) { Registry rgs = context.getStoredObject(Stored.PresentById); - ClearingCategory ctgr = null; - if (equalsByCode(RegistryTradingParams.TM_T, rgs)) { - ctgr = ClearingCategory.I; - } else { - ctgr = ClearingCategory.V; - } Imdg ctgImdg = context.obtainMap(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); - ClearingMemberCategory category = - ctgImdg.getFirstObjectBySQL("companyId = %d and clearingMemberCategory = '%s'" - .formatted(rgs.getCompanyId(), ctgr.getKey())); - if (category == null) { - return of(ClearingError.CategoryNotFound, ctgr.getKey(), rgs.getCompanyId()); + Collection category = ctgImdg.getCollectionObjectsBySQL( + "companyId = %d".formatted(rgs.getCompanyId())); + + Optional ctgr = category.stream() + .map(c -> IEnumKey.getEnumByKey(ClearingCategory.class, c.getClearingMemberCategory())) + .filter(c -> ClearingCategory.V.equals(c) || ClearingCategory.I.equals(c)) + .findFirst(); + + if (ctgr.isEmpty()) { + return of(ClearingError.CategoryNotFound, "I/V", rgs.getCompanyId()); + } + if (ctgr.get().equals(ClearingCategory.V)) { + Imdg rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); + Collection group = rgsImdg.getCollectionObjectsBySQL("groupId = %d".formatted(rgs.getGroupId())); + Optional om_t = group.stream() + .filter(r -> r.getSettlementDate() != null) + .filter(r -> r.getValueDate() != null) + .filter(r -> r.getSettlementDate().isAfter(r.getValueDate())) + .filter(r -> equalsByCode(RegistryTradingParams.OM_T, r)) + .findFirst(); + if (om_t.isEmpty()) return of(ClearingError.RecordNotFound, "OM*T.groupId=%d".formatted(rgs.getGroupId())); + context.storeObject(ValidationStored.ReturnDepositOm_t, om_t.get()); } return empty(); } }, - @Deprecated - RegistryCodeCheck() { - @Override - public Optional validate(ImdgValidationContext context) { - Registry rgs = context.getStoredObject(Stored.PresentById); - if (!RegistryDesignation.T.equalsByKey(rgs.getRegistryDesignation()) - || !RegistryInstrumentType.M.equalsByKey(rgs.getRegistryInstrumentType()) - || !RegistryUnit.T.equalsByKey(rgs.getRegistryUnit())) { - return of(ClearingError.RecordNotFoundInDictionary, "TM*T", "Registry"); - } - return empty(); - } - }, BalanceCheck() { + BalanceCheck() { @Override public Optional validate(ImdgValidationContext context) { Registry rgs = context.getStoredObject(Stored.PresentById); @@ -90,7 +93,8 @@ public enum ReturnDepositValidationRule implements IValidationRule validate(ImdgValidationContext context) { - Registry rgs = context.getStoredObject(Stored.PresentById); + Registry rgs = context.getStoredObject(ValidationStored.ReturnDepositOm_t); + if (rgs == null) rgs = context.getStoredObject(Stored.PresentById); Imdg rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); if (TextUtil.isEmpty(rgs.getContract())) { return empty(); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java index a0ad7e8a8..057aecc58 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java @@ -18,7 +18,7 @@ public enum ValidationStored { Sdf06Company, Sdf06Account, Sdf06Tcr, - ReturnDepositDm__, + ReturnDepositDm__, ReturnDepositOm_t, IdentificationFundsTcrSearch, IdentificationFundsAssetTrio, From 4df71316300cfd39dc8300360748eab677152039 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 27 Sep 2023 18:39:35 +0300 Subject: [PATCH 04/37] DM*V creation for MEDM session --- .../ru/spcex/clearing/session/stage/IntermediateMkrSession.java | 1 + .../session/stage/impl/FormingPaymentInstructionAssets.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java index 269d0553c..2aad817aa 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java @@ -105,6 +105,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ inspectionObligations.setSessionType(sessionType()); inspectionObligations.setSection(section()); formingPaymentInstructionDeals.setSection(section()); + formingPaymentInstructionDeals.setSessionType(sessionType()); imdgProvider.waitAvailable(); initSessionIfPresent(); } 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 df3838a63..3d755ab78 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 @@ -130,7 +130,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage { private StageResult formingPaymentInstructions(FormingPaymentInstructionPayload payload) { Long sessionId = payload.getSessionId(); - if (SessionType.FINL.equals(sessionType)) { + if (SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) { dmvSrv.createDmv(sessionId); } Collection AMBregistries = selectAMBRegistries(sessionId); From 495155989134ccbfafebced38d075d49586ce19a Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 28 Sep 2023 10:28:09 +0300 Subject: [PATCH 05/37] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-550?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=B4=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8E=20=D1=83=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D1=81=D0=B2=D0=BE=D0=B9=20userId,=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BD=D0=B0=20=D0=B1=D1=8D=D0=BA=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cud/registry/NotificationUpdateAction.java | 11 ----------- .../backend-api/src/main/resources/meta/meta.json | 6 +----- .../backend-api/src/main/resources/meta/meta.xml | 3 +-- .../backend-api/src/test/resources/meta.json | 6 +----- .../clearing/utility/service/NotificationService.java | 2 +- .../cud/utilities/NotificationUpdateRequest.java | 11 ----------- 6 files changed, 4 insertions(+), 35 deletions(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/NotificationUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/NotificationUpdateAction.java index 824f095c2..9c82a128b 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/NotificationUpdateAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/NotificationUpdateAction.java @@ -13,16 +13,12 @@ public class NotificationUpdateAction implements IAction - + @@ -1622,7 +1622,6 @@ - diff --git a/clearing-parent/backend-api/src/test/resources/meta.json b/clearing-parent/backend-api/src/test/resources/meta.json index d6d7ba3c1..f38db6df2 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.8.0.56", + "version": "3.8.0.57", "enums": { @@ -7007,10 +7007,6 @@ {"code": "notificationStatus", "type": 12,"name": "Наименование статуса сообщения","shortname": "Статус","link": "notificationStatus","required": true } - , - {"code": "senderId", - "type": 1,"name": "Наименование отправителя","shortname": "Отправитель","visible": false,"required": true - } ] } ] diff --git a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/NotificationService.java b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/NotificationService.java index d8adb6d2c..ffce5e90c 100644 --- a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/NotificationService.java +++ b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/NotificationService.java @@ -68,7 +68,7 @@ public class NotificationService extends QueueConsumer implements InitializingBe throw new NullPointerException("Notification by id:{" + id + "} is null!"); } notification.setNotificationStatus(request.getNotificationStatus()); - notification.setSenderId(request.getSenderId()); + notification.setSenderId(notificationUpdateRequestBaseRequest.getUserId()); notification.setUpdated(Instant.now()); notificationMap.update(notification); sendFeedbackString(notification); diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/NotificationUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/NotificationUpdateRequest.java index b2f0a1fd2..3a14578d3 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/NotificationUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/NotificationUpdateRequest.java @@ -9,9 +9,6 @@ public class NotificationUpdateRequest { @JsonProperty public String notificationStatus; - @JsonProperty - public Long senderId; - public Long getId() { return id; } @@ -27,12 +24,4 @@ public class NotificationUpdateRequest { public void setNotificationStatus(String notificationStatus) { this.notificationStatus = notificationStatus; } - - public Long getSenderId() { - return senderId; - } - - public void setSenderId(Long senderId) { - this.senderId = senderId; - } } From 83ff343c921dc3138cd6930d7313a5ae7c6400e6 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 28 Sep 2023 10:28:09 +0300 Subject: [PATCH 06/37] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-550?= =?UTF-8?q?=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B8=D0=BB=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spcex/clearing/utility/service/NotificationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/NotificationService.java b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/NotificationService.java index ffce5e90c..9fe152254 100644 --- a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/NotificationService.java +++ b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/NotificationService.java @@ -62,7 +62,7 @@ public class NotificationService extends QueueConsumer implements InitializingBe private void notificationUpdateRequest(BaseRequest notificationUpdateRequestBaseRequest) { NotificationUpdateRequest request = notificationUpdateRequestBaseRequest.getRequestPayload(); Long id = request == null ? null : request.getId(); - log.info("Starting notificationUpdateRequest {} processing by id: {} ...", notificationUpdateRequestBaseRequest.getId(), id); + log.info("Starting notificationUpdateRequest {} processing by id: {} from user {}", notificationUpdateRequestBaseRequest.getId(), id, notificationUpdateRequestBaseRequest.getUserId()); Notification notification = notificationMap.getSingleObjectByID(id); if (notification == null) { throw new NullPointerException("Notification by id:{" + id + "} is null!"); From 03aa29413c7bb12d02cea6f736094c557a7183bb Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 28 Sep 2023 11:41:49 +0300 Subject: [PATCH 07/37] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-550?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D0=B0=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B8=D0=BC=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cud/registry/NotificationUpdateAction.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/NotificationUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/NotificationUpdateAction.java index 9c82a128b..86877ab36 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/NotificationUpdateAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/NotificationUpdateAction.java @@ -13,6 +13,10 @@ public class NotificationUpdateAction implements IAction Date: Thu, 28 Sep 2023 13:21:29 +0300 Subject: [PATCH 08/37] =?UTF-8?q?platform-messaging=20http://jira.mfd.msk:?= =?UTF-8?q?8088/browse/CLS-280=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=BA=D0=B8,=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=82=D1=8B?= =?UTF-8?q?,=20=D1=82.=D0=BA.=20=D0=BD=D0=B0=D0=B4=D0=BE=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BD=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdmittedLiabilitiesRegisterService.java | 40 ++-- .../CoveredLiabilitiesRegisterService.java | 35 +-- .../service/DepoBalanceRegisterService.java | 34 ++- ...DepoPaymentInstructionRegisterService.java | 34 +-- .../ExcludeLiabilitiesRegisterService.java | 45 ++-- .../service/ExecutionRegisterService.java | 17 +- .../service/LiabilitiesRegisterService.java | 15 +- .../service/MoneyBalanceRegisterService.java | 40 ++-- ...oneyPaymentInstructionRegisterService.java | 15 +- .../registry/ContractRegisterNewRequest.java | 215 ------------------ 10 files changed, 155 insertions(+), 335 deletions(-) delete mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ContractRegisterNewRequest.java diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java index 695136146..6b6694401 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java @@ -23,6 +23,7 @@ import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; @@ -42,7 +43,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements private final Imdg admittedLiabilitiesRegisterMap; private final Imdg registryMap; private final Imdg companyMap; - private final Imdg securityMap; + private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; @Autowired @@ -54,7 +55,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements this.admittedLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_AdmittedLiabilitiesRegister, AdmittedLiabilitiesRegister.class); this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.securityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class); + this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; } @@ -90,13 +91,12 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements log.trace("Started generating AdmittedLiabilitiesRegister entity..."); AdmittedLiabilitiesRegister admittedLiabilitiesRegister = new AdmittedLiabilitiesRegister(); Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 1L)); - Security security = securityMap.getFirstObjectByFieldValues(Map.of("id", registry.getSecurityId())); - String securitySymbol = security != null ? security.getSecuritySymbol() : null; - String securityFullName = security != null ? security.getShortName() : null; - String companyFullName = security != null ? company.getFullName() : null; + Security security = securitySelector.selectSecurityById(registry.getSecurityId()); + String securityFullName = security != null ? security.getFullName() : null; + String companyFullName = company != null ? company.getFullName() : null; admittedLiabilitiesRegister.setCompanyFullName(companyFullName); admittedLiabilitiesRegister.setSessionId(registry.getSessionId()); - admittedLiabilitiesRegister.setSecuritySymbol(securitySymbol); + admittedLiabilitiesRegister.setSecuritySymbol(registry.getSecuritySymbol()); admittedLiabilitiesRegister.setSecurityFullName(securityFullName); admittedLiabilitiesRegister.setCompanyId(registry.getCompanyId()); admittedLiabilitiesRegister.setClearingCode(registry.getClearingCode()); @@ -113,7 +113,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements return String.format("registryDesignation = '%s' and " + "registryInstrumentType in ('%s','%s') and " + "registryUnit = '%s' and " + - "registryStatus in ('%s','%s','%s','%s','%s')" + "registryStatus in ('%s','%s','%s','%s','%s', '%s')" , RegistryDesignation.O.getKey(), RegistryInstrumentType.S.getKey(), @@ -123,19 +123,27 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements RegistryStatus.NACK.getKey(), RegistryStatus.UNCV.getKey(), RegistryStatus.NACC.getKey(), - RegistryStatus.FAIL.getKey() + RegistryStatus.FAIL.getKey(), + RegistryStatus.CLRD.getKey() ); } @Override public Optional isDuplicateInMap(Registry entity) { - Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); - Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(admittedLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); + return Optional.empty(); +// Map> fieldValues = Map.of( +// "companyId", entity.getRegistryCode(), +// "sessionId", entity.getSessionId(), +// "securitySymbol", entity.getSecuritySymbol(), +// "clearingDate", entity.getClearingDate(), +// "account", entity.getAccount() +// ); +// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(admittedLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java index 1b402c147..1b3928e62 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java @@ -23,6 +23,7 @@ import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; @@ -42,7 +43,7 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements private final Imdg coveredLiabilitiesRegisterMap; private final Imdg registryMap; private final Imdg companyMap; - private final Imdg securityMap; + private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; @Autowired @@ -54,7 +55,7 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements this.coveredLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CoveredLiabilitiesRegister, CoveredLiabilitiesRegister.class); this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.securityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class); + this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; } @@ -91,13 +92,12 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements log.trace("insert CoveredLiabilitiesRegister in map..."); CoveredLiabilitiesRegister coveredLiabilitiesRegister = new CoveredLiabilitiesRegister(); Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 1L)); - Security security = securityMap.getFirstObjectByFieldValues(Map.of("id", registry.getSecurityId())); - String securitySymbol = security != null ? security.getSecuritySymbol() : null; - String securityFullName = security != null ? security.getShortName() : null; - String companyFullName = security != null ? company.getFullName() : null; + Security security = securitySelector.selectSecurityById(registry.getSecurityId()); + String securityFullName = security != null ? security.getFullName() : null; + String companyFullName = company != null ? company.getFullName() : null; coveredLiabilitiesRegister.setCompanyFullName(companyFullName); coveredLiabilitiesRegister.setSessionId(registry.getSessionId()); - coveredLiabilitiesRegister.setSecuritySymbol(securitySymbol); + coveredLiabilitiesRegister.setSecuritySymbol(registry.getSecuritySymbol()); coveredLiabilitiesRegister.setSecurityFullName(securityFullName); coveredLiabilitiesRegister.setCompanyId(registry.getCompanyId()); coveredLiabilitiesRegister.setClearingCode(registry.getClearingCode()); @@ -114,22 +114,25 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements return String.format("registryDesignation = '%s' and " + "registryInstrumentType in ('%s','%s') and " + "registryUnit = '%s' and " + - "registryStatus = '%s'", + "registryStatus in ('%s', '%s')", RegistryDesignation.O.getKey(), RegistryInstrumentType.S.getKey(), RegistryInstrumentType.M.getKey(), RegistryUnit.T.getKey(), - RegistryStatus.OK.getKey()); + RegistryStatus.OK.getKey(), + RegistryStatus.CLRD.getKey() + ); } @Override public Optional isDuplicateInMap(Registry entity) { - Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); - Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(coveredLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); + return Optional.empty(); +// Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); +// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(coveredLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java index 6caaa8f23..59122d989 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java @@ -60,10 +60,6 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial public void depoBalanceRegisterNew(BaseRequest userRequest) { log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic()); - if (userRequest.getRequestPayload().getCompanyId() == null) { - log.debug("No companyId in LauncherCommandRequest.id={}", userRequest.getId()); - return; - } ImdgPredicate prdctForRegistries = getPredicateForRegistries(userRequest.getRequestPayload().getCompanyId()); Collection registries = registryMap.getCollectionObjectsByPredicate(prdctForRegistries); log.trace("Started searching depoBalanceRegister in register by '{}'", prdctForRegistries); @@ -84,14 +80,12 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial log.trace("Started generating DepoBalanceRegister entity..."); DepoBalanceRegister depoBalanceRegister = new DepoBalanceRegister(); depoBalanceRegister.setUpdated(Instant.now()); - depoBalanceRegister.setCreated(Instant.now()); + depoBalanceRegister.setCreated(depoBalanceRegister.getUpdated()); depoBalanceRegister.setCompanyId(registry.getCompanyId()); depoBalanceRegister.setSessionId(registry.getSessionId()); depoBalanceRegister.setDepoCode(registry.getAccountType()); depoBalanceRegister.setQuantity(registry.getCloseBalance()); depoBalanceRegister.setSecuritySymbol(registry.getSecuritySymbol()); - depoBalanceRegister.setCreated(Instant.now()); - depoBalanceRegister.setUpdated(Instant.now()); depoBalanceRegisterMap.insert(depoBalanceRegister); log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoBalanceRegister.getId()); } @@ -99,20 +93,24 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial private ImdgPredicate getPredicateForRegistries(Long companyId) { ImdgPredicateBuilder pb = registryMap.predicateBuilder(); RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T); - return pb.and( - pb.equals("companyId", companyId), - pb.sql(codeSql.build()) - ); + if (companyId == null) // default use case + return pb.sql(codeSql.build()); + else + return pb.and( + pb.equals("companyId", companyId), + pb.sql(codeSql.build()) + ); } @Override public Optional isDuplicateInMap(Registry entity) { - Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); - Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(depoBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues)); + return Optional.empty(); +// Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); +// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(depoBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues)); } } \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java index c1bceb5e7..52c7a7e3a 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java @@ -89,34 +89,38 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme private void insertDepoPaymentInstructionRegister(PaymentInstruction paymentInstruction) { log.trace("Started generating DepoPaymentInstructionRegister entity..."); DepoPaymentInstructionRegister depoPaymentInstructionRegister = new DepoPaymentInstructionRegister(); - TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("depoAccountId", paymentInstruction.getCreditLeg_accountId())); + TradingClearingRegistry tradingClearingRegistry = paymentInstruction.getSenderId() == null ? null : tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("companyId", paymentInstruction.getSenderId())); InOutDirectionDictionary inOutDirectionDictionary = InOutDirectionDictionaryMap.getFirstObjectByFieldValues(Map.of("code", paymentInstruction.getCreditLeg_direction())); depoPaymentInstructionRegister.setCreated(Instant.now()); depoPaymentInstructionRegister.setUpdated(Instant.now()); depoPaymentInstructionRegister.setCompanyId(paymentInstruction.getSenderId()); - depoPaymentInstructionRegister.setTradingClearingRegistryType(tradingClearingRegistry.getTradingClearingRegistryType()); - depoPaymentInstructionRegister.setTradingClearingRegistry(tradingClearingRegistry.getCode()); + if (tradingClearingRegistry == null) { + log.warn("For paymentInstruction[{}].CreditLeg_accountId={} can not find TradingClearingRegistry.", + paymentInstruction.getId(), paymentInstruction.getCreditLeg_accountId()); + } else { + depoPaymentInstructionRegister.setTradingClearingRegistryType(tradingClearingRegistry.getTradingClearingRegistryType()); + depoPaymentInstructionRegister.setTradingClearingRegistry(tradingClearingRegistry.getCode()); + } depoPaymentInstructionRegister.setCbCode("RNCB-BE-01"); depoPaymentInstructionRegister.setQuantity(paymentInstruction.getCreditLeg_amount()); depoPaymentInstructionRegister.setDirection(inOutDirectionDictionary.getId()); depoPaymentInstructionRegister.setSessionId(paymentInstruction.getSessionId()); - depoPaymentInstructionRegister.setCreated(Instant.now()); - depoPaymentInstructionRegister.setUpdated(Instant.now()); depoPaymentInstructionRegisterMap.insert(depoPaymentInstructionRegister); log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoPaymentInstructionRegister.getId()); } @Override public Optional isDuplicateInMap(PaymentInstruction entity) { - Map> fieldValues = Map.of( - "companyId", entity.getSenderId(), - "sessionId", entity.getSessionId() - ); - Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(depoPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValues)); + return Optional.empty(); +// Map> fieldValues = Map.of( +// "companyId", entity.getSenderId(), +// "sessionId", entity.getSessionId() +// ); +// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(depoPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValues)); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java index e5fd393f6..b00e34806 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java @@ -7,10 +7,12 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; +import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -20,6 +22,7 @@ import ru.spcex.clearing.platform.messaging.service.QueueConsumer; 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.specific.SecuritySelector; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; @@ -42,7 +45,7 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements private final Imdg registryMap; private final Imdg sessionMap; private final Imdg companySymbolMap; - private final Imdg moneyMarketSecurityMap; + private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; @Autowired @@ -55,7 +58,7 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.companySymbolMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, ru.clearing.classes.statics.data.company.CompanySymbols.class); - this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; } @@ -97,17 +100,30 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements Map> innPredicates = Map.of("companySymbol", CompanySymbol.INN.getKey(), "companyId", registry.getCompanyId()); ru.clearing.classes.statics.data.company.CompanySymbols companySymbol = companySymbolMap.getFirstObjectByFieldValues(innPredicates); - MoneyMarketSecurity moneyMarketSecurity = moneyMarketSecurityMap.getFirstObjectByFieldValues(Map.of("securityId", registry.getSecurityId())); + Security security = securitySelector.selectSecurityById(registry.getSecurityId()); excludeLiabilitiesRegister.setSessionId(registry.getSessionId()); excludeLiabilitiesRegister.setValidFromDate(sessionBySessionId.getClearingDate()); excludeLiabilitiesRegister.setValidToDate(validToDate); excludeLiabilitiesRegister.setCompanyId(registry.getCompanyId()); + excludeLiabilitiesRegister.setCompanyFullName(registry.getFullName()); excludeLiabilitiesRegister.setInn(companySymbol.getCompanySymbolValue()); excludeLiabilitiesRegister.setRegistryCode(registry.getRegistryCode()); excludeLiabilitiesRegister.setAccount(registry.getAccount()); excludeLiabilitiesRegister.setRegistryStatus(registry.getRegistryStatus()); - excludeLiabilitiesRegister.setCurrency(moneyMarketSecurity.getNominalCurrency()); + if (security == null) { + log.warn("Security id={} not found for registry id={}", registry.getSecurityId(), registry.getId()); + } else { + if (InstrumentType.RATE.equalsByKey(security.getInstrumentType())) { + excludeLiabilitiesRegister.setCurrency(((MoneyMarketSecurity) security).getNominalCurrency()); + } else if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) { + excludeLiabilitiesRegister.setCurrency(((FixedIncomeSecurity) security).getNominalCurrency()); + } else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) { + // не заполняется Currency + } else { // never + log.warn("Unexpected security[{}] type {}", security.getId(), security.getInstrumentType()); + } + } excludeLiabilitiesRegister.setSumLiabilities(registry.getBalance()); excludeLiabilitiesRegister.setSettlementDate(registry.getSettlementDate()); excludeLiabilitiesRegister.setCreated(Instant.now()); @@ -120,22 +136,25 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements return String.format("registryDesignation = '%s' and " + "registryInstrumentType in ('%s','%s') and " + "registryUnit = '%s' and " + - "registryStatus = '%s'", + "registryStatus in ('%s', '%s')", RegistryDesignation.O.getKey(), RegistryInstrumentType.S.getKey(), RegistryInstrumentType.M.getKey(), RegistryUnit.T.getKey(), - RegistryStatus.FAIL.getKey()); + RegistryStatus.FAIL.getKey(), + RegistryStatus.UNCV.getKey() + ); } @Override public Optional isDuplicateInMap(Registry entity) { - Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); - Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(excludeLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); + return Optional.empty(); +// Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); +// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(excludeLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java index 59b30cc16..4f41ab830 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java @@ -283,14 +283,15 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ @Override public Optional isDuplicateInMap(ExecutionCommon entity) { - Map> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(), - "tradingDate", LocalDate.now()); //clarify timezone - Optional message = fieldValuesValidator.apply(map).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(executionRegisterMap.getSingleObjectByFieldValues(map)); + return Optional.empty(); +// Map> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(), +// "tradingDate", LocalDate.now()); //clarify timezone +// Optional message = fieldValuesValidator.apply(map).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(executionRegisterMap.getSingleObjectByFieldValues(map)); } } \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java index 13814069e..ea22fa856 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java @@ -150,12 +150,13 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial @Override public Optional isDuplicateInMap(Registry entity) { - Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); - Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(liabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); + return Optional.empty(); +// Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); +// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(liabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java index 4e3f4ac09..4924a68a0 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java @@ -28,6 +28,7 @@ import ru.spcex.platform.utils.validation.IValidator; import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; +import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -69,10 +70,6 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia public void moneyBalanceRegisterNew(BaseRequest userRequest) { log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic()); - if (userRequest.getRequestPayload().getCompanyId() == null) { - log.warn("LauncherCommandRequest.id={} without companyId", userRequest.getId()); - return; - } ImdgPredicate sqlConditionForRegistry = getSqlForRegistries(userRequest.getRequestPayload().getCompanyId()); Collection registries = registryMap.getCollectionObjectsByPredicate(sqlConditionForRegistry); if (registries == null) { @@ -128,10 +125,15 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia private ImdgPredicate getSqlForRegistries(Long companyId) { ImdgPredicateBuilder pb = registryMap.predicateBuilder(); - ImdgPredicate prdct = pb.and( - pb.equals("companyId", companyId), - pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build()) - ); + ImdgPredicate prdct; + if (companyId == null) { + prdct = pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build()); + } else { + prdct = pb.and( + pb.equals("companyId", companyId), + pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build()) + ); + } log.trace("sql predicate for registries {}", prdct); return prdct; } @@ -171,17 +173,15 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia @Override public Optional isDuplicateInMap(Registry entity) { - Map> fieldValues = Map.of( - "companyId", - entity.getCompanyId(), - "sessionId", - entity.getSessionId() - ); - Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(moneyBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues)); + return Optional.empty(); +// Map fieldValues = new HashMap<>(); +// fieldValues.put("companyId", entity.getCompanyId()); +// fieldValues.put("sessionId", entity.getSessionId()); +// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(moneyBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues)); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java index 825e12950..fd38b554c 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java @@ -92,12 +92,13 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem @Override public Optional isDuplicateInMap(PaymentInstruction entity) { - Map> fieldValuesCompanyIdSessionId = Map.of("senderId", entity.getSenderId(), "date", entity.getClearingDate()); - Optional message = fieldValuesValidator.apply(fieldValuesCompanyIdSessionId).tillFirstError(); - if (message.isPresent()) { - log.warn("Illegal value in map for request to imdg: {}", message.get()); - throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); - } - return Optional.ofNullable(moneyPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValuesCompanyIdSessionId)); + return Optional.empty(); +// Map> fieldValuesCompanyIdSessionId = Map.of("senderId", entity.getSenderId(), "date", entity.getClearingDate()); +// Optional message = fieldValuesValidator.apply(fieldValuesCompanyIdSessionId).tillFirstError(); +// if (message.isPresent()) { +// log.warn("Illegal value in map for request to imdg: {}", message.get()); +// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); +// } +// return Optional.ofNullable(moneyPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValuesCompanyIdSessionId)); } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ContractRegisterNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ContractRegisterNewRequest.java deleted file mode 100644 index 29c58cef3..000000000 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ContractRegisterNewRequest.java +++ /dev/null @@ -1,215 +0,0 @@ -package ru.spcex.clearing.platform.messaging.domain.cud.registry; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import ru.spcex.clearing.platform.messaging.domain.json.deserialize.InstantDateTimeDeserializer; -import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; -import ru.spcex.clearing.platform.messaging.domain.json.serialize.InstantDateTimeSerializer; -import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; - -import java.time.Instant; -import java.time.LocalDate; - -@Deprecated // Не используется. Возможно артефакт мёржа. -public class ContractRegisterNewRequest { - - @JsonProperty - private String name; - - @JsonProperty - private String number; - - @JsonSerialize(using = LocalDateSerializer.class) - @JsonDeserialize(using = LocalDateDeserializer.class) - @JsonProperty - private LocalDate issueDate; - - @JsonProperty - private String companyFullName; - - @JsonProperty - private Long companyId; - - @JsonProperty - private String documentType; - - @JsonProperty - private String issuePlace; - - @JsonProperty - private String issuer; - - @JsonProperty - private String issuerCode; - - @JsonProperty - private String place; - - @JsonSerialize(using = LocalDateSerializer.class) - @JsonDeserialize(using = LocalDateDeserializer.class) - @JsonProperty - private LocalDate validFromDate; - - @JsonSerialize(using = LocalDateSerializer.class) - @JsonDeserialize(using = LocalDateDeserializer.class) - @JsonProperty - private LocalDate validToDate; - - @JsonSerialize(using = LocalDateSerializer.class) - @JsonDeserialize(using = LocalDateDeserializer.class) - @JsonProperty - private LocalDate closeDate; - - @JsonProperty - private String comment; - - @JsonProperty - private Long id; - - @JsonSerialize(using = InstantDateTimeSerializer.class) - @JsonDeserialize(using = InstantDateTimeDeserializer.class) - @JsonProperty - private Instant createdAt; - - @JsonSerialize(using = InstantDateTimeSerializer.class) - @JsonDeserialize(using = InstantDateTimeDeserializer.class) - @JsonProperty - private Instant updatedAt; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public LocalDate getCloseDate() { - return closeDate; - } - - public void setCloseDate(LocalDate closeDate) { - this.closeDate = closeDate; - } - - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Instant getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(Instant createdAt) { - this.createdAt = createdAt; - } - - public Instant getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(Instant updatedAt) { - this.updatedAt = updatedAt; - } - - public String getNumber() { - return number; - } - - public void setNumber(String number) { - this.number = number; - } - - public LocalDate getIssueDate() { - return issueDate; - } - - public void setIssueDate(LocalDate issueDate) { - this.issueDate = issueDate; - } - - public String getCompanyFullName() { - return companyFullName; - } - - public void setCompanyFullName(String companyFullName) { - this.companyFullName = companyFullName; - } - - public Long getCompanyId() { - return companyId; - } - - public void setCompanyId(Long companyId) { - this.companyId = companyId; - } - - public String getDocumentType() { - return documentType; - } - - public void setDocumentType(String documentType) { - this.documentType = documentType; - } - - public String getIssuePlace() { - return issuePlace; - } - - public void setIssuePlace(String issuePlace) { - this.issuePlace = issuePlace; - } - - public String getIssuer() { - return issuer; - } - - public void setIssuer(String issuer) { - this.issuer = issuer; - } - - public String getIssuerCode() { - return issuerCode; - } - - public void setIssuerCode(String issuerCode) { - this.issuerCode = issuerCode; - } - - public String getPlace() { - return place; - } - - public void setPlace(String place) { - this.place = place; - } - - public LocalDate getValidFromDate() { - return validFromDate; - } - - public void setValidFromDate(LocalDate validFromDate) { - this.validFromDate = validFromDate; - } - - public LocalDate getValidToDate() { - return validToDate; - } - - public void setValidToDate(LocalDate validToDate) { - this.validToDate = validToDate; - } -} \ No newline at end of file From 2ee26a3d68d9a02b8c2d00d98a4e0c24001c1e76 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 28 Sep 2023 14:22:32 +0300 Subject: [PATCH 09/37] =?UTF-8?q?company-service=20gateway-api=20http://ji?= =?UTF-8?q?ra.mfd.msk:8088/browse/CLS-347=20bug=20fix,=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClearingMemberCategoryService.java | 6 ++- .../company/service/MultiCompanyService.java | 38 +++++++++++++---- .../ClearingMemberCategoryServiceTest.java | 1 + .../service/MultiCompanyServiceTest.java | 42 ++++++++++++++++--- .../company/service/RelationServiceTest.java | 13 ++++++ .../adapter/CompanyRequestAdapter.java | 2 +- 6 files changed, 87 insertions(+), 15 deletions(-) diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ClearingMemberCategoryService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ClearingMemberCategoryService.java index af6ca5c70..5d0a3825e 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ClearingMemberCategoryService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ClearingMemberCategoryService.java @@ -179,7 +179,11 @@ public class ClearingMemberCategoryService extends QueueConsumer implements Init try { Imdg txClearingMemberCategoryMap = transaction.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); txClearingMemberCategoryMap.delete(clearingMemberCategory); // далить до cancelRelation внутри транзакции - companyService.relationService.cancelRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory); + if (clearingMemberCategory.getCompanyId() == null) { // never, только тестовые данные + log.warn("Deleted clearingMemberCategory[{}] has not companyId", clearingMemberCategory.getId()); + } else { + companyService.relationService.cancelRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory); + } txOk = true; } finally { if (txOk) diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java index d556d62c8..f0cb6e513 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java @@ -27,6 +27,7 @@ import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.CompanySymbol; 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.enumeration.IMessageResolver; import ru.spcex.platform.utils.error.ValidationException; import ru.spcex.platform.utils.log.ExceptionUtils; @@ -48,7 +49,7 @@ public class MultiCompanyService private final RequestHelper requestHelper; protected UserRoleVerification userRoleVerification; -// private final ValidationHelper validationHelper; + // private final ValidationHelper validationHelper; protected IMessageResolver messageResolver; final CompanyService companyService; @@ -128,7 +129,7 @@ public class MultiCompanyService req.setCompanySymbols( Stream.concat(req.getCompanySymbols().stream(), additionalSymbols(req.getCompany())).collect(Collectors.toList()) ); - companyId = getCompanyIdForCompanySymbols(req.getUuid(), req.getCompany()); + companyId = getCompanyIdForCompanySymbols(req.getUuid(), req.getCompany(), req.getCompanySymbols()); log.debug("For request {} (uuid {}) company {}.", baseRequest.getId(), req.getUuid(), companyId == null ? "not found" : ("found, id=" + companyId)); if (companyId == null) { log.debug("For request {} (uuid {}) company not found. Try find by other symbols.", baseRequest.getId(), req.getUuid()); @@ -334,7 +335,7 @@ public class MultiCompanyService return r; } - Long getCompanyIdForCompanySymbols(String uuid, CompanyNewRequest cnr) { + Long getCompanyIdForCompanySymbols(String uuid, CompanyNewRequest cnr, Collection companySymbols) { CompanySymbols companySymbol = null; if (StringUtils.isNotEmpty(uuid)) { log.trace("Search company by companySymbol uuid={}", uuid); @@ -351,10 +352,10 @@ public class MultiCompanyService } } } - if (companySymbol == null && StringUtils.isNotEmpty(cnr.getCompanySymbolValue())) { - for (String companySymbolType : Arrays.asList( - cnr.getCompanySymbol(), CompanySymbol.INN.getKey(), CompanySymbol.CIO.getKey() - )) { + if (companySymbol == null && StringUtils.isNotEmpty(cnr.getCompanySymbolValue()) + && IEnumKey.contains(cnr.getCompanySymbol(), CompanySymbol.INN, CompanySymbol.CIO)) { // вероятно там будет только UUID + { + String companySymbolType = cnr.getCompanySymbol(); log.trace("Search company by companySymbol {}={}", companySymbolType, cnr.getCompanySymbolValue()); Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( Map.of( @@ -367,10 +368,31 @@ public class MultiCompanyService if (companySymbolsFromImdg.size() > 1) { log.warn("For {} found > 1 company_symbols, use first (id = {})", companySymbolType, cnr.getCompanySymbolValue()); } - break; } } } + if (companySymbol == null && companySymbols != null) { + for (CompanySymbolNewRequest cSymbolReq : companySymbols) { + if (IEnumKey.contains(cSymbolReq.getCompanySymbol(), CompanySymbol.INN, CompanySymbol.CIO)) { + String companySymbolType = cSymbolReq.getCompanySymbol(); + log.trace("Search company by companySymbol {}={}", companySymbolType, cSymbolReq.getCompanySymbolValue()); + Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( + Map.of( + "companySymbol", companySymbolType, + "companySymbolValue", cSymbolReq.getCompanySymbolValue() + ) + ); + if (!companySymbolsFromImdg.isEmpty()) { + companySymbol = companySymbolsFromImdg.iterator().next(); + if (companySymbolsFromImdg.size() > 1) { + log.warn("For {} found > 1 company_symbols, use first (id = {})", companySymbolType, cSymbolReq.getCompanySymbolValue()); + } + break; + } + } + } + } + if (companySymbol != null) return companySymbol.getCompanyId(); else diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ClearingMemberCategoryServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ClearingMemberCategoryServiceTest.java index 9fd30fed6..3767a109c 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ClearingMemberCategoryServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ClearingMemberCategoryServiceTest.java @@ -168,6 +168,7 @@ class ClearingMemberCategoryServiceTest { String clearingMemberCategory = "0000"; ClearingMemberCategory existsClearingMemberCategory = new ClearingMemberCategory(); existsClearingMemberCategory.setClearingMemberCategory(clearingMemberCategory); + existsClearingMemberCategory.setCompanyId(COMPANY_ID); Long id = memberCategoryImdg.insert(existsClearingMemberCategory); CommonDeleteRequest memberCategoryDeleteRequest = new CommonDeleteRequest(); diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/MultiCompanyServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/MultiCompanyServiceTest.java index da2ebe661..67bd1f7f9 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/MultiCompanyServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/MultiCompanyServiceTest.java @@ -26,6 +26,8 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import javax.annotation.PostConstruct; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId; @@ -48,6 +50,8 @@ import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProv ProfileDocumentValidationConfig.class, ContactService.class, ContactValidationConfig.class, + ClearingMemberCategoryService.class, + ClearingMemberCategoryValidationConfig.class, KafkaTestConfig.class, ImdgTestConfig.class, @@ -101,8 +105,8 @@ class MultiCompanyServiceTest { CompanySymbols companySymbol = new CompanySymbols(); companySymbol.setId(222L); companySymbol.setCompanyId(company.getId()); - companySymbol.setCompanySymbol(CompanySymbol.CLRC.getKey()); - companySymbol.setCompanySymbolValue("CL-VALUE"); + companySymbol.setCompanySymbol(CompanySymbol.INN.getKey()); + companySymbol.setCompanySymbolValue("INN-VALUE"); companySymbolsImdg.insert(companySymbol); Imdg profileDocumentImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); @@ -130,9 +134,13 @@ class MultiCompanyServiceTest { req.setCompanyId(COMPANY_ID); req.setCompanySymbol(CompanySymbol.CLRC.getKey()); req.setCompanySymbolValue("CL-VALUE-2"); + assertNull(multiCompanyService.findCompanySymbols(req)); + + req.setCompanySymbol(CompanySymbol.INN.getKey()); + req.setCompanySymbolValue("INN-VALUE"); CompanySymbols symbol = multiCompanyService.findCompanySymbols(req); assertNotNull(symbol); - assertEquals("CL-VALUE", symbol.getCompanySymbolValue()); + assertEquals("INN-VALUE", symbol.getCompanySymbolValue()); } @Test @@ -151,8 +159,32 @@ class MultiCompanyServiceTest { CompanyNewRequest req = new CompanyNewRequest(); req.setCompanySymbol(CompanySymbol.CLRC.getKey()); req.setCompanySymbolValue("CL-VALUE"); - Long theId = multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req); - assertEquals(COMPANY_ID, theId); + assertNull(multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req, null)); + + req.setCompanySymbolValue("INN-VALUE"); + assertNull(multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req, null)); + req.setCompanySymbol(CompanySymbol.INN.getKey()); + assertEquals(COMPANY_ID, multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req, null)); + req.setCompanySymbol(null); + req.setCompanySymbolValue(null); + assertNull(multiCompanyService.getCompanyIdForCompanySymbols(null, req, null)); + List csReq=new ArrayList<>(); + assertNull(multiCompanyService.getCompanyIdForCompanySymbols(null, req, null)); + assertNull(multiCompanyService.getCompanyIdForCompanySymbols(null, req, csReq)); + { + CompanySymbolNewRequest cs=new CompanySymbolNewRequest(); + cs.setCompanySymbol(CompanySymbol.CLRC.getKey()); + cs.setCompanySymbolValue("INN-VALUE"); + csReq.add(cs); + } + assertNull(multiCompanyService.getCompanyIdForCompanySymbols(null, req, csReq)); + { + CompanySymbolNewRequest cs=new CompanySymbolNewRequest(); + cs.setCompanySymbol(CompanySymbol.INN.getKey()); + cs.setCompanySymbolValue("INN-VALUE"); + csReq.add(cs); + } + assertEquals(COMPANY_ID, multiCompanyService.getCompanyIdForCompanySymbols(null, req, csReq)); } @Test diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/RelationServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/RelationServiceTest.java index 0adb4903f..520291439 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/RelationServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/RelationServiceTest.java @@ -11,6 +11,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.clearing.platform.dictionary.ClearingCategoryDictionary; +import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.clearing.platform.dictionary.WorkflowStatusDictionary; import ru.spcex.clearing.company.config.BeanConfiguration; import ru.spcex.clearing.company.config.validation.RelationValidationConfig; @@ -92,6 +93,18 @@ class RelationServiceTest { workflowStatusDictionary.setName("not active"); workflowStatusDictionaryImdg.insert(workflowStatusDictionary); + { + Imdg serviceStatusDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_ServiceStatusDictionary, + ServiceStatusDictionary.class + ); + ServiceStatusDictionary status=new ServiceStatusDictionary(); + status.setId(1L); + status.setCode("ACTV"); + status.setName("\"ACTV\""); + serviceStatusDictionaryImdg.insert(status); + } + Imdg clearingCategoryDictionaryImdg = hazelcastServiceTest.getImdg( IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/CompanyRequestAdapter.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/CompanyRequestAdapter.java index 45158d490..2a2bf1707 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/CompanyRequestAdapter.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/CompanyRequestAdapter.java @@ -87,7 +87,7 @@ public class CompanyRequestAdapter { log.warn("Money account \"{}\" not found", client.getMoneyAccount()); } else { log.debug("Money account \"{}\" found with id={}", client.getMoneyAccount(), mAccount.getId()); - client.setDepoAccountId(mAccount.getId()); + client.setMoneyAccountId(mAccount.getId()); } } catch (Exception e) { log.warn("Error happened when search money account \"{}\": {}", client.getMoneyAccount(), ExceptionUtils.getStackTrace(e)); From 1be10820a34d5d4b8ce872acc3d543c23fb8a472 Mon Sep 17 00:00:00 2001 From: mfd Date: Thu, 28 Sep 2023 14:36:51 +0300 Subject: [PATCH 10/37] Added task SDEP - EDEP and errorCode for cancel XDEP --- clearing-parent/backend-api/src/main/resources/meta/data.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clearing-parent/backend-api/src/main/resources/meta/data.xml b/clearing-parent/backend-api/src/main/resources/meta/data.xml index 34cbeb614..4fb3405e5 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/data.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/data.xml @@ -246,6 +246,8 @@ + + @@ -473,6 +475,7 @@ + From c93e59c8147b5616fe2b25f808b1c71d7e7efd6c Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 28 Sep 2023 15:16:16 +0300 Subject: [PATCH 11/37] XDEP time interval RequirementsAndObligationCreation execution match bugfix --- .../spcex/clearing/error/ClearingError.java | 1 + .../service/schedule/TradingTimeService.java | 19 ++++++++---- .../session/stage/SessionManager.java | 29 +++++++++++++------ .../RequirementsAndObligationCreation.java | 1 + .../ru/spcex/platform/enumeration/Task.java | 2 ++ 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java index 77f155ee0..fe40c2381 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java @@ -34,6 +34,7 @@ public enum ClearingError implements IErrorEnumId { RgsWrongCode(5430L), RefundDateCannotBeChanged(5431L), PlanBalanceReviseError(5432L), + XdepTimeIntervalNotMatch(5433L), //ошибки "перенесенные" из balance-service, CompanyNotFoundB(5211L), CurrencyNotFound(5213L), diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/schedule/TradingTimeService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/schedule/TradingTimeService.java index 48421c68a..c6c1fe167 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/schedule/TradingTimeService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/schedule/TradingTimeService.java @@ -25,7 +25,7 @@ public class TradingTimeService { this.plannerAllTodayImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class); } - public boolean isTradingTime() { + private boolean isTradingTime(Task startTime, Task endTime) { ImdgPredicateBuilder pb = plannerAllTodayImdg.predicateBuilder(); Function> plannerByTask = task -> { ImdgPredicate plannerPrdct = pb.and( @@ -34,19 +34,28 @@ public class TradingTimeService { ); return Optional.ofNullable(plannerAllTodayImdg.getFirstObjectByPredicate(plannerPrdct)); }; - LocalTime startTradingTime = plannerByTask.apply(Task.createRegistry_STRS) + LocalTime startTradingTime = plannerByTask.apply(startTime) .map(PlannerAllToday::getTaskTime) .orElse(null); - LocalTime endTradingTime = plannerByTask.apply(Task.createRegistry_ETRS) + LocalTime endTradingTime = plannerByTask.apply(endTime) .map(PlannerAllToday::getTaskTime) .orElse(null); if (startTradingTime == null || endTradingTime == null) { - log.warn("startTradingTime or endTradingTime is null"); + log.warn("{} or {} not found in planner all today", startTime.getKey(), endTime.getKey()); return false; } LocalTime now = LocalTime.now(); boolean isTradingTime = !now.isBefore(startTradingTime) && !now.isAfter(endTradingTime); - log.debug("now: {}, startTradingTime: {}, endTradingTime: {}. trading time: {}", now, startTradingTime, endTradingTime, isTradingTime); + log.debug("now: {}, {}: {}, {}: {}. period check in: {}", + now, startTime.getKey(), startTradingTime, endTime.getKey(), endTradingTime, isTradingTime); return isTradingTime; } + + public boolean isTradingTime() { + return isTradingTime(Task.createRegistry_STRS, Task.createRegistry_ETRS); + } + + public boolean timeForXdep() { + return isTradingTime(Task.startTime_SDEP, Task.endTime_EDEP); + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java index 3ab08e000..f911f457a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java @@ -9,6 +9,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.notification.NotificationSender; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.service.schedule.TradingTimeService; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -33,13 +34,14 @@ public class SessionManager { private final IntermediateMkrSession intermediateMkrSession; private final FinalMkrSession finalMkrSession; private final ReturnDepositSession returnDepositSession; + private final TradingTimeService time; public SessionManager(ImdgProvider imdgProvider, NotificationSender notification, IMessageResolver msgs, PrimaryAuctionT0Session primaryAuctionT0Session, PrimaryAuctionBnSession primaryAuctionBnSession, PrimaryAuctionB0Session primaryAuctionB0Session, SecondaryAuctionT0Session secondaryAuctionT0Session, - IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession) { + IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, TradingTimeService time) { this.notification = notification; this.msgs = msgs; this.primaryAuctionT0Session = primaryAuctionT0Session; @@ -51,6 +53,7 @@ public class SessionManager { this.returnDepositSession = returnDepositSession; sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + this.time = time; } public void defineAndStartSession(BaseRequest r) throws ValidationException { //task sclr section fond sessiontype trdt @@ -76,19 +79,27 @@ public class SessionManager { if (session != null) { //checkActive - checkActiveSession(); + checkAllowSessionStart(sessionType); session.runSession(baseRequest); } } - protected void checkActiveSession() throws ValidationException { - Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of( - "workflowStatus", SessionStatus.ACTV.getKey() - )); - if (existActiveSession != null) { - log.warn("Can not start new session, cause exist active session.id={}", existActiveSession.getId()); - EnumMessage err = new EnumMessage(ClearingError.ActiveSessionIsPresent, String.valueOf(existActiveSession.getId())); + protected void checkAllowSessionStart(SessionType sessionType) throws ValidationException { + EnumMessage err = null; + if (sessionType.equals(SessionType.XDEP) && !time.timeForXdep()) { + log.warn("cannot launch {} reason: time interval not matched", sessionType); + err = new EnumMessage(ClearingError.XdepTimeIntervalNotMatch); + } else { + Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of( + "workflowStatus", SessionStatus.ACTV.getKey() + )); + if (existActiveSession != null) { + log.warn("Can not start new session, cause exist active session.id={}", existActiveSession.getId()); + err = new EnumMessage(ClearingError.ActiveSessionIsPresent, String.valueOf(existActiveSession.getId())); + } + } + if (err != null) { notification.sendNotification(ObjectType.session, msgs.resolve(err), Priority.HIGH); throw new ValidationException(err); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java index bfbbde376..f65808b13 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java @@ -230,6 +230,7 @@ public class RequirementsAndObligationCreation implements ISessionStage { } if (invalid != null) { log.error("FATAL couldn't match Execution#id({}) with Execution#id({}) error: {}", exec1.getId(), exec2.getId(), invalid); + return null; } return new Pair<>(exec1, exec2); } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java index b932af49a..78172c922 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java @@ -25,6 +25,8 @@ public enum Task implements IEnumKey { liquidationSession_LIQU("LIQU"),//Ликвидационная сессия по обязательтсвам участника startSession_STRM("STRM"),//Начало торговой сессии секции МКР terminationSession_ETRM("ETRM"),//Завершение торговой сессии секции МКР + startTime_SDEP("SDEP"), + endTime_EDEP("EDEP"), startSession_SIPO("SIPO"),//Начало торговой сессии по первичным торгам terminationSession_EIPO("EIPO"),//Завершение торговой сессии по первичным торгам startSession_STRF("STRF"),//Начало торговой сессии по вторичным торгам From c66df265d963227f7a559becc01304c7db880e91 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 28 Sep 2023 15:54:00 +0300 Subject: [PATCH 12/37] =?UTF-8?q?company-service=20http://jira.mfd.msk:808?= =?UTF-8?q?8/browse/CLS-347=20bug=20fix,=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/service/MultiCompanyService.java | 35 +++---------------- .../service/processor/CompanyProcessor.java | 2 ++ 2 files changed, 6 insertions(+), 31 deletions(-) diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java index f0cb6e513..22dc30751 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java @@ -131,10 +131,6 @@ public class MultiCompanyService ); companyId = getCompanyIdForCompanySymbols(req.getUuid(), req.getCompany(), req.getCompanySymbols()); log.debug("For request {} (uuid {}) company {}.", baseRequest.getId(), req.getUuid(), companyId == null ? "not found" : ("found, id=" + companyId)); - if (companyId == null) { - log.debug("For request {} (uuid {}) company not found. Try find by other symbols.", baseRequest.getId(), req.getUuid()); - companyId = getCompanyIdForCompanySymbols(req.getCompanySymbols()); - } if (companyId == null) { companyId = companyService.create(req.getCompany()); @@ -353,9 +349,11 @@ public class MultiCompanyService } } if (companySymbol == null && StringUtils.isNotEmpty(cnr.getCompanySymbolValue()) - && IEnumKey.contains(cnr.getCompanySymbol(), CompanySymbol.INN, CompanySymbol.CIO)) { // вероятно там будет только UUID + && IEnumKey.contains(cnr.getCompanySymbol(), CompanySymbol.UUID, CompanySymbol.INN, CompanySymbol.CIO)) { // вероятно там будет только UUID { String companySymbolType = cnr.getCompanySymbol(); + log.debug("Company not found by UUID=\"{}\", try find by {}={}", + uuid, companySymbolType, cnr.getCompanySymbolValue()); log.trace("Search company by companySymbol {}={}", companySymbolType, cnr.getCompanySymbolValue()); Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( Map.of( @@ -375,6 +373,7 @@ public class MultiCompanyService for (CompanySymbolNewRequest cSymbolReq : companySymbols) { if (IEnumKey.contains(cSymbolReq.getCompanySymbol(), CompanySymbol.INN, CompanySymbol.CIO)) { String companySymbolType = cSymbolReq.getCompanySymbol(); + log.debug("Company not found by UUID=\"{}\", try find by {}", uuid, companySymbolType); log.trace("Search company by companySymbol {}={}", companySymbolType, cSymbolReq.getCompanySymbolValue()); Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( Map.of( @@ -399,32 +398,6 @@ public class MultiCompanyService return null; } - Long getCompanyIdForCompanySymbols(List otherRequests) { - CompanySymbols companySymbol = null; - for (CompanySymbolNewRequest req : otherRequests) { - if (req.getCompanySymbol() == null) continue; - log.trace("Search company by companySymbol {}={}", req.getCompanySymbol(), req.getCompanySymbolValue()); - Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( - Map.of( - "companySymbol", req.getCompanySymbol(), - "companySymbolValue", req.getCompanySymbolValue() - ) - ); - if (!companySymbolsFromImdg.isEmpty()) { - companySymbol = companySymbolsFromImdg.iterator().next(); - if (companySymbolsFromImdg.size() > 1) { - log.warn("For {} found > 1 company_symbols, use first (id = {})", req.getCompanySymbol(), req.getCompanySymbolValue()); - } - log.debug("Found by company symbol {} {}", req.getCompanySymbol(), req.getCompanySymbolValue()); - break; - } - } - if (companySymbol != null) - return companySymbol.getCompanyId(); - else - return null; - } - private BaseRequest wrapRequest(BaseRequest template, T payload, ActionType action) { BaseRequest r = new BaseRequest<>(); r.setId(template.getId()); diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/CompanyProcessor.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/CompanyProcessor.java index 2635f1704..c23c4aebd 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/CompanyProcessor.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/CompanyProcessor.java @@ -53,6 +53,8 @@ public class CompanyProcessor { map(companyRequestAdapter::toCategoryRequest).toList(); CompanyGatewayRequest companyGatewayRequest = new CompanyGatewayRequest(); + if (companyId != null) + companyGatewayRequest.setUuid(companyId.toString()); companyGatewayRequest.setCompany(companyRequestAdapter.toCompanyRequest(memberCompany)); request.getCompanyInfoList() .stream() From 4b089a91aee70f07e4bce3ef18f44a8022167aeb Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 28 Sep 2023 16:53:58 +0300 Subject: [PATCH 13/37] http://jira.mfd.msk:8088/browse/CLS-497 fix --- .../reports/ks/KSRepCashNettoReportBuilder.java | 10 ++++------ .../reports/ks/KSRepDepoNettoReportBuilder.java | 10 ++++------ .../ks/KSRepDepoRegisterQuantitiesReportBuilder.java | 2 +- 3 files changed, 9 insertions(+), 13 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 85d247f61..1901d631a 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,13 +67,11 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); + if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); ImdgPredicate finalPredicate = pb.and( - pb.not(pb.in("registryStatus", - RegistryStatus.CLRD.getKey(), - RegistryStatus.UNCV.getKey(), - RegistryStatus.FAIL.getKey(), - RegistryStatus.NACK.getKey(), - RegistryStatus.NACC.getKey())), + pb.in("sessionId", sessionIds.toArray(new Long[0])), + pb.equals("clearingDate", nowDate), 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 755df29a6..1e33b4e51 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,14 +66,12 @@ 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.not(pb.in("registryStatus", - RegistryStatus.CLRD.getKey(), - RegistryStatus.UNCV.getKey(), - RegistryStatus.FAIL.getKey(), - RegistryStatus.NACK.getKey(), - RegistryStatus.NACC.getKey())), + pb.in("sessionId", sessionIds.toArray(new Long[0])), + pb.equals("clearingDate", nowDate), pb.sql(sql), pb.equals("accountType", AccountType.Depo.getKey()), pb.notNull("account") diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegisterQuantitiesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegisterQuantitiesReportBuilder.java index ca0dc7794..01893c3c6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegisterQuantitiesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegisterQuantitiesReportBuilder.java @@ -142,7 +142,7 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder Date: Thu, 28 Sep 2023 16:50:53 +0300 Subject: [PATCH 14/37] =?UTF-8?q?registry-service=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AdmittedLiabilitiesRegisterService.java | 3 ++- .../service/CoveredLiabilitiesRegisterService.java | 2 +- .../service/DepoBalanceRegisterService.java | 11 ++++++++--- .../DepoPaymentInstructionRegisterService.java | 5 +++-- .../service/ExcludeLiabilitiesRegisterService.java | 2 +- .../registry/service/ExecutionRegisterService.java | 13 +++++++++++++ .../service/LiabilitiesRegisterService.java | 10 +++++----- .../service/MoneyBalanceRegisterService.java | 4 +++- 8 files changed, 36 insertions(+), 14 deletions(-) diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java index 6b6694401..62faa9e03 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java @@ -74,7 +74,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements log.debug("AdmittedLiabilitiesRegisterNewRequest received from {}", Consts.REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW); String sqlConditionForRegistry = getSqlForRegistries(); Collection registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry); - if (registries == null) { + if (registries.isEmpty()) { log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } @@ -131,6 +131,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements @Override public Optional isDuplicateInMap(Registry entity) { return Optional.empty(); + //todo для всех isDuplicateInMap: сказали надо по критерию чистить мапу перед вставкой записей, критерий уточнят. // Map> fieldValues = Map.of( // "companyId", entity.getRegistryCode(), // "sessionId", entity.getSessionId(), diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java index 1b3928e62..247088edf 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java @@ -75,7 +75,7 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements log.debug("CoveredLiabilitiesRegisterNew received"); String sqlConditionForRegistry = getSqlForRegistries(); Collection registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry); - if (registries == null) { + if (registries.isEmpty()) { log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java index 59122d989..d41a72d23 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java @@ -13,6 +13,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -63,7 +64,7 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial ImdgPredicate prdctForRegistries = getPredicateForRegistries(userRequest.getRequestPayload().getCompanyId()); Collection registries = registryMap.getCollectionObjectsByPredicate(prdctForRegistries); log.trace("Started searching depoBalanceRegister in register by '{}'", prdctForRegistries); - if (registries == null) { + if (registries.isEmpty()) { log.debug("No registry with such conditions '{}'", prdctForRegistries); return; } @@ -83,8 +84,12 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial depoBalanceRegister.setCreated(depoBalanceRegister.getUpdated()); depoBalanceRegister.setCompanyId(registry.getCompanyId()); depoBalanceRegister.setSessionId(registry.getSessionId()); - depoBalanceRegister.setDepoCode(registry.getAccountType()); - depoBalanceRegister.setQuantity(registry.getCloseBalance()); + if (AccountType.Depo.equalsByKey(registry.getAccountType())) { + depoBalanceRegister.setDepoCode(registry.getAccount()); + } else if (registry.getAccountType() != null) { + log.warn("Unexpected registry[{}].accountType={}", registry.getId(), registry.getAccountType()); + } + depoBalanceRegister.setQuantity(registry.getBalance()); depoBalanceRegister.setSecuritySymbol(registry.getSecuritySymbol()); depoBalanceRegisterMap.insert(depoBalanceRegister); log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoBalanceRegister.getId()); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java index 52c7a7e3a..b62067ec6 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java @@ -68,7 +68,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme public void depoPaymentInstructionRegisterNew(BaseRequest userRequest) { log.debug("LauncherCommandRequest received from {}", createRegistry_GORR.topic()); Collection actualSessions = sessionMap.getCollectionObjectsByFieldValues(Map.of("section", "FOND")); - if (actualSessions == null) { + if (actualSessions.isEmpty()) { log.debug("No Session with such conditions section = FOND"); return; } @@ -89,7 +89,8 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme private void insertDepoPaymentInstructionRegister(PaymentInstruction paymentInstruction) { log.trace("Started generating DepoPaymentInstructionRegister entity..."); DepoPaymentInstructionRegister depoPaymentInstructionRegister = new DepoPaymentInstructionRegister(); - TradingClearingRegistry tradingClearingRegistry = paymentInstruction.getSenderId() == null ? null : tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("companyId", paymentInstruction.getSenderId())); + TradingClearingRegistry tradingClearingRegistry = paymentInstruction.getCreditLeg_accountId() == null ? null : + tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("depoAccountId", paymentInstruction.getCreditLeg_accountId())); InOutDirectionDictionary inOutDirectionDictionary = InOutDirectionDictionaryMap.getFirstObjectByFieldValues(Map.of("code", paymentInstruction.getCreditLeg_direction())); depoPaymentInstructionRegister.setCreated(Instant.now()); depoPaymentInstructionRegister.setUpdated(Instant.now()); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java index b00e34806..7f6b083b2 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java @@ -78,7 +78,7 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements log.debug("ExcludeLiabilitiesRegisterNew received"); String sqlForRegistries = getSqlForRegistries(); Collection registries = registryMap.getCollectionObjectsBySQL(sqlForRegistries); - if (registries == null) { + if (registries.isEmpty()) { log.debug("No registry with such conditions {}", sqlForRegistries); return; } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java index 4f41ab830..4058813ae 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java @@ -115,6 +115,19 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ private void insertExecutionRegister(Boolean isFond, ExecutionCommon common) { log.trace("Started generating ExecutionRegister entity..."); + /* todo сверить с ТЗ, замечания от 28.09.2023: + executionRegister - Реестр сделок +sellerId - Если executionDeposit/Fond.side=BUY - company.shortName [executionDeposit/Fond.counterPartyId = company.id]. Если executionDeposit/Fond.side=SELL - company.shortName [executionDeposit/Fond.companyId = company.id] +sellerClearingCode - не заполняется +sellerTradingClearingRegister - не заполняется +sellerMoneyAccount - не заполняется +sellerDepoAccount - не заполняется +buyerId - Если executionDeposit/Fond.side=BUY - company.shortName [executionDeposit/Fond.counterPartyId = company.id]. Если executionDeposit/Fond.side=SELL - company.shortName [executionDeposit/Fond.counterPartyId = company.id] +buyerClearingCode - не заполняется +buyerTradingClearingRegister - не заполняется +buyerMoneyAccount - не заполняется +buyerDepoAccount - не заполняется + */ String sellerClearingCode = null; String sellerTradingClearingRegister = null; String sellerMoneyAccount = null; diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java index ea22fa856..4231f47c8 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java @@ -18,6 +18,7 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.LiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryUnit; @@ -97,10 +98,8 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial ) ); CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues( - Map.of("companyId", - registry.getCompanyId(), - "companySymbol", - "INN" + Map.of("companyId", registry.getCompanyId(), + "companySymbol", CompanySymbol.INN.getKey() ) ); MoneyMarketSecurity moneyMarketSecurity = moneyMarketSecurityMap.getFirstObjectByFieldValues( @@ -116,7 +115,7 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial liabilitiesRegister.setValidToDate(TimeUtil.toLocalDate(session.getUpdated())); } if (companySymbols == null) { - log.warn("CompanySymbols is empty!"); + log.warn("CompanySymbols is empty! For companyId={}", registry.getCompanyId()); } else { liabilitiesRegister.setInn(companySymbols.getCompanySymbolValue()); } @@ -127,6 +126,7 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial } liabilitiesRegister.setSessionId(registry.getSessionId()); liabilitiesRegister.setCompanyId(registry.getCompanyId()); + liabilitiesRegister.setCompanyFullName(registry.getFullName()); liabilitiesRegister.setRegistryCode(registry.getRegistryCode()); liabilitiesRegister.setAccount(registry.getAccount()); liabilitiesRegister.setRegistryStatus(registry.getRegistryStatus()); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java index 4924a68a0..40a438400 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java @@ -16,6 +16,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -76,6 +77,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } + //todo надо группировать! registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertMoneyBalanceRegister(registry); @@ -92,7 +94,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia Registry registryForBlockedSum = registryMap.getFirstObjectByPredicate(getSqlForBlockedSum(registry.getCompanyId(), registry.getAccount())); Registry registryForUnblockedSum = registryMap.getFirstObjectByPredicate(getSqlForUnblockedSum(registry.getCompanyId(), registry.getAccount())); Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 2L)); - CompanySymbols companySymbol = companySymbolsMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId())); + CompanySymbols companySymbol = companySymbolsMap.getFirstObjectByFieldValues(Map.of("companySymbol", CompanySymbol.INN.getKey(), "companyId", registry.getCompanyId())); String setHouseName = company != null ? company.getShortName() : null; String inn = companySymbol != null ? companySymbol.getCompanySymbolValue() : null; String accountType = registry.getAccountType(); From 43911cbb589d8c4884224b2554948c46717c167d Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 28 Sep 2023 17:25:04 +0300 Subject: [PATCH 15/37] TCR registry update, AM*F/AM*T/AM*B creation --- .../clearing/service/RegistryService.java | 55 +++++++++++++++++++ .../service/registry/AssetTBFProcessing.java | 40 ++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index d1d05f9ef..f1d97ade4 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -5,6 +5,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.misc.Currency; import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; @@ -47,6 +49,7 @@ import java.util.Map; import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; +import java.util.stream.Stream; import static ru.spcex.clearing.session.stage.impl.GatewayRequester.mapError; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @@ -58,6 +61,9 @@ public class RegistryService { private final ImdgProvider imdgProvider; private final Imdg tradingClearingRegistryImdg; private final Imdg registryImdg; + private final Imdg accImdg; + private final Imdg currImdg; + private final Imdg cmpImdg; private final Imdg pmtImdg; private final Function returnDepositVal; private final Function refundDateVal; @@ -90,6 +96,9 @@ public class RegistryService { this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); + this.accImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.currImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class); + this.cmpImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.returnDepositVal = returnDepositVal; this.refundDateVal = refundDateVal; this.identificationFundsVal = identificationFundsVal; @@ -155,6 +164,52 @@ public class RegistryService { registryImdg.update(rgs); log.trace("TCR#id={} registry#id={} updated", tcr.getId(), rgs.getId()); }); + + if (registries.size() > 0) { + log.info("assets size {} updated by TCR#id={}, will not create new assets", + registries.size(), tcr.getId()); + return; + } + + Account acc = accImdg.getSingleObjectByID(tcr.getMoneyAccountId()); + Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey())); + Company cmp = cmpImdg.getSingleObjectByID(tcr.getCompanyId()); + + if (acc == null) { + log.warn("TCR#id={} account {} not found", tcr.getId(), tcr.getMoneyAccountId()); + return; + } + if (currency == null) { + log.warn("TCR#id={} currency {} not found", tcr.getId(), CurrencyCode.RUB.getKey()); + return; + } + if (cmp == null) { + log.warn("TCR#id={} company {} not found", tcr.getId(), tcr.getCompanyId()); + return; + } + log.debug("TCR#id={} account#id={} company#id={}, creating assets", tcr.getId(), acc.getId(), cmp.getId()); + + AssetTrio assets = this.assets.createMAssets(acc, + CurrencyCode.RUB.getKey(), + currency.getId(), + tcr.getTradingClearingRegistryType(), + tcr.getId(), + tcr.getCode(), + cmp); + + + Stream.of(assets.a__t(), assets.a__b(), assets.a__f()) + .forEach(a -> { + a.setRegistryStatus(RegistryStatus.PROC.getKey()); + registryImdg.insert(a); + }); + + log.debug("TCR#id={} created {}#id={} {}#id={} {}#id={}", + tcr.getId(), + assets.a__f().getRegistryCode(), assets.a__f().getId(), + assets.a__t().getRegistryCode(), assets.a__t().getId(), + assets.a__b().getRegistryCode(), assets.a__b().getId()); + } public RequestInfoUpdate returnDeposit(BaseRequest req) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java index 3b5c3ac62..a8aa42d54 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java @@ -162,6 +162,46 @@ public class AssetTBFProcessing { return new AssetTrio(asf, asb, ast); } + public AssetTrio createMAssets(Account acc, + String securitySymbol, + Long securityId, + String tcrType, + Long tcrId, + String tcr, + Company company) { + Registry ast = new Registry(); + ast.setCreated(Instant.now()); + ast.setSecuritySymbol(securitySymbol); + ast.setSecurityId(securityId); + ast.setAccountId(acc.getId()); + ast.setAccount(acc.getAccount()); + ast.setAccountType(acc.getAccountType()); + ast.setRegistryDesignation(RegistryDesignation.A.getKey()); + ast.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + ast.setRegistryCapacity(tcrType); + ast.setRegistryUnit(RegistryUnit.T.getKey()); + ast.setRegistryCode(RegistryUtil.clearingCode(ast)); + ast.setClearingCode(company.getClearingCode()); + ast.setTradingCode(company.getClearingCode()); + ast.setCompanyId(company.getId()); + ast.setShortName(company.getShortName()); + ast.setFullName(company.getFullName()); + ast.setTradingClearingRegistryId(tcrId); + ast.setTradingClearingRegistry(tcr); + ast.setRegistryStatus(RegistryStatus.OK.getKey()); + ast.setBalanceDimension(BalanceDimension.MONY.getKey()); + RegistryManager.zeroState(ast); + Registry asf = ast.clone(); + asf.setRegistryUnit(RegistryUnit.F.getKey()); + asf.setRegistryCode(RegistryUtil.clearingCode(asf)); + RegistryManager.zeroState(asf); + Registry asb = ast.clone(); + asb.setRegistryUnit(RegistryUnit.B.getKey()); + asb.setRegistryCode(RegistryUtil.clearingCode(asb)); + RegistryManager.zeroState(asb); + return new AssetTrio(asf, asb, ast); + } + public Optional searchByTcrCompanyAccount(Registry rgs, RegistryTradingParams params) { ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); From caeece00f3c257f578339b06fd17d6366d3aff76 Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 28 Sep 2023 17:26:04 +0300 Subject: [PATCH 16/37] SDF06 active session error 4 -> 1 --- .../ru/spcex/clearing/service/executors/Sdf06Executor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java index 9cb346202..1982a15ac 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java @@ -211,6 +211,9 @@ public class Sdf06Executor { if (ClearingError.WrongField.equals(err.getSubject())) { result = errorResult4; } + if (ClearingError.ActiveSessionIsPresent.equals(err.getSubject())) { + result = errorResult1; + } if (result == null) { result = errorResult4; } From 11f6ea0b8471a0011faf252c9a3323aea3f0019e Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 28 Sep 2023 17:59:05 +0300 Subject: [PATCH 17/37] =?UTF-8?q?=D0=9F=D0=BE=D1=81=D0=BB=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=D1=81=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=20DMAU=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=20=D0=B1=D1=8B?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BE=D0=B1=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=20=D0=A2=D0=A1=20=D0=9F=D1=80=D0=B8=20DM=5FV=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BC=D0=B5=D0=BD=D1=8F=D1=82=D1=8C=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5,=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=82=D0=B5=D0=BC=20=D0=B7=D0=B0=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83=20=D0=B2=20?= =?UTF-8?q?=D0=A2=D0=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/service/RegistryService.java | 77 +++++++++++-------- .../integration/GatewayRequestCreator.java | 6 +- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index 81456f9bf..3bb4deeaf 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -12,11 +12,14 @@ import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.notification.NotificationSender; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationListRequest; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRequest; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.*; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.service.builder.PaymentInstructionBuilderV2; import ru.spcex.clearing.service.integration.GatewayRequestCreator; import ru.spcex.clearing.service.registry.AssetTBFProcessing; @@ -42,12 +45,11 @@ import ru.spcex.platform.utils.validation.IValidator; import java.math.BigDecimal; import java.time.Instant; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; -import java.util.function.Supplier; -import static ru.spcex.clearing.session.stage.impl.GatewayRequester.mapError; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @Service @@ -66,6 +68,7 @@ public class RegistryService { private final GatewayRequester gateway; private final TradingTimeService trdTime; private final NotificationSender notification; + private final KafkaSender kafkaSender; private final IMessageResolver msgResolver; private final RequestHelper reqHelp; @@ -81,7 +84,7 @@ public class RegistryService { GatewayRequester gateway, TradingTimeService tradingTimeService, NotificationSender notification, - IMessageResolver msgResolver, + KafkaSender kafkaSender, IMessageResolver msgResolver, RequestHelper reqHelp, UserRoleVerification rights, AssetTBFProcessing assets) { @@ -97,6 +100,7 @@ public class RegistryService { this.gateway = gateway; this.trdTime = tradingTimeService; this.notification = notification; + this.kafkaSender = kafkaSender; this.assets = assets; this.gateway.setName("RgsService|DM*V"); this.msgResolver = msgResolver; @@ -207,24 +211,24 @@ public class RegistryService { return reqHelp.error(req.getId(), err.get()); } Registry rgs = validator.getStored(Stored.PresentById); - Supplier gtwBuilder = () -> GatewayRequestCreator.from(rgs); - Optional gatewayOk; - if (trdTime.isTradingTime()) { - gatewayOk = gateway.gatewayRequestAndWait(gtwBuilder); - } else { - log.debug("RegistryChangeStatusExtractRequest rgs.id={} not sending gateway request", rgs.getId()); - gatewayOk = Optional.of(true); - } - if (gatewayOk.isEmpty() || !gatewayOk.get()) { - String gtwErr = msgResolver.resolve(mapError(gatewayOk)); - log.error("{}.id={} {}", - rgs.getRegistryCode(), - rgs.getId(), - gtwErr); - notification.sendNotification(ObjectType.rgst, - "Отметка о получении выписки: %s".formatted(gtwErr), - Priority.HIGH); - } + //Supplier gtwBuilder = () -> GatewayRequestCreator.from(rgs, InOutDirection.in); + //Optional gatewayOk; + //if (trdTime.isTradingTime()) { + // gatewayOk = gateway.gatewayRequestAndWait(gtwBuilder); + //} else { + // log.debug("RegistryChangeStatusExtractRequest rgs.id={} not sending gateway request", rgs.getId()); + // gatewayOk = Optional.of(true); + //} + //if (gatewayOk.isEmpty() || !gatewayOk.get()) { + // String gtwErr = msgResolver.resolve(mapError(gatewayOk)); + // log.error("{}.id={} {}", + // rgs.getRegistryCode(), + // rgs.getId(), + // gtwErr); + // notification.sendNotification(ObjectType.rgst, + // "Отметка о получении выписки: %s".formatted(gtwErr), + // Priority.HIGH); + //} rgs.setRegistryStatus(payload.getRegistryStatus()); log.debug("changing registry.id={} status to {}", rgs.getId(), payload.getRegistryStatus()); registryImdg.update(rgs); @@ -281,22 +285,19 @@ public class RegistryService { .build(); pmt.setTransactionStatus(TransactionStatus.ok.getKey()); pmtImdg.insert(pmt); - //BankAccount bnkAcc = bnkAccImdg.getFirstObjectBySQL("accountId = %d".formatted(accDeb.getId())); - // if (bnkAcc != null) { - // pmt.setAddresseeBankName(bnkAcc.getBankIdentificationCode()); - // pmt.setDebit_csAccount(bnkAcc.getCorrespondentAccount()); - // } - // Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey())); - // if (currency != null) { - // pmt.setCreditLeg_securityId(currency.getId()); - // pmt.setDebitLeg_securityId(currency.getId()); - // } - // pmt.setTransactionStatus(TransactionStatus.stld.getKey()); registryImdg.update(dmau); registryImdg.update(asts.a__t()); assets.process(asts.a__b(), asts.a__t(), asts.a__f(), BigDecimal.ZERO); log.debug("IdentificationFundsRequest.id={} dmau.id={} am*t.id={} payment_instruction.id={}", req.getId(), dmau.getId(), asts.a__t().getId(), pmt.getId()); + if (trdTime.isTradingTime()) { + log.trace("sending gateway request for IdentificationFundsRequest.id={} dmau.id={}", + req.getId(), dmau.getId()); + kafkaSender.sendRequestToQueue(Consts.ASSET_OPERATION, + gatewayRequest(dmau, payload.getBalance(), + accCompTcr.getCompany().getTradingCode(), + asts.a__t().getTradingClearingRegistry())); + } return reqHelp.success(req.getId()); } @@ -516,4 +517,16 @@ public class RegistryService { return new RequestInfoUpdate(req.getId(), Status.Success, null); } + private AssetOperationListRequest gatewayRequest(Registry dmau, BigDecimal balance, String tradingCode, String tcrCode) { + AssetOperationListRequest gatewayRequest = new AssetOperationListRequest(); + AssetOperationRequest req = GatewayRequestCreator.from( + dmau.getId(), + null, + balance, + InOutDirection.in, + tradingCode, + tcrCode); + gatewayRequest.setAssetOperationRequests(List.of(req)); + return gatewayRequest; + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/integration/GatewayRequestCreator.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/integration/GatewayRequestCreator.java index 52d773617..74886aa22 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/integration/GatewayRequestCreator.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/integration/GatewayRequestCreator.java @@ -23,10 +23,14 @@ public class GatewayRequestCreator { } public static AssetOperationRequest from(Registry rgs) { + return from(rgs, InOutDirection.out); + } + + public static AssetOperationRequest from(Registry rgs, InOutDirection dir) { return from(rgs.getId(), null, BigDecimalUtil.safeBD(rgs.getBalance()).abs(), - InOutDirection.out, + dir, rgs.getTradingCode(), rgs.getTradingClearingRegistry()); } From a743de0dd141527a3d1cebcc5086c1a9bcd05aed Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 28 Sep 2023 18:45:20 +0300 Subject: [PATCH 18/37] =?UTF-8?q?company-service=20http://jira.mfd.msk:808?= =?UTF-8?q?8/browse/CLS-347=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/validation/ProfileDocumentValidationConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java index 9bf592aea..57ff9253c 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java @@ -53,10 +53,10 @@ public class ProfileDocumentValidationConfig { FieldRequiredRule.instance("issueDate", ProfileDocumentNewRequest::getIssueDate, CompanyErrors.RequiredFieldEmpty), - FieldRequiredRule.instance("issuer", + FieldNotBlankRequiredRule.instance("issuer", ProfileDocumentNewRequest::getIssuer, CompanyErrors.RequiredFieldEmpty), - FieldRequiredRule.instance("number", + FieldNotBlankRequiredRule.instance("number", ProfileDocumentNewRequest::getNumber, CompanyErrors.RequiredFieldEmpty), FieldRequiredRule.instance("validToDate", From 36b0381294c445ca1d6b8cf86a219df3b99b3f11 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 28 Sep 2023 19:11:14 +0300 Subject: [PATCH 19/37] =?UTF-8?q?registry-service=20todo=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AdmittedLiabilitiesRegisterService.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java index 62faa9e03..d7c8cb5b6 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java @@ -132,6 +132,19 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements public Optional isDuplicateInMap(Registry entity) { return Optional.empty(); //todo для всех isDuplicateInMap: сказали надо по критерию чистить мапу перед вставкой записей, критерий уточнят. + /* + todo вечер 28.09.2023 + Вот по какому полю ориентируемся (название реестра - наименование поля) + depoBalanceRegister - createdAt + moneyBalanceRegister - createdAt + admittedLiabilitiesRegister - clearingDate + coveredLiabilitiesRegister - clearingDate + moneyPaymentInstructionRegister - clearingDate + depoPaymentInstructionRegister - createdAt + excludeLiabilitiesRegister - createdAt + liabilitiesRegister - createdAt + executionRegister - clearingDate + */ // Map> fieldValues = Map.of( // "companyId", entity.getRegistryCode(), // "sessionId", entity.getSessionId(), From e278bc1bb8b87cb95aaa34b9c70e82658599e34c Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 29 Sep 2023 12:25:27 +0300 Subject: [PATCH 20/37] =?UTF-8?q?registry-service=20http://jira.mfd.msk:80?= =?UTF-8?q?88/browse/CLS-280=20=D0=BF=D1=80=D0=B5=D0=B4=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20=D0=BC=D0=B0=D0=BF=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=20=D0=B2=D1=81=D1=82=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=BE=D0=B9;=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdmittedLiabilitiesRegisterService.java | 22 ++---- .../CoveredLiabilitiesRegisterService.java | 7 +- .../service/DepoBalanceRegisterService.java | 7 +- ...DepoPaymentInstructionRegisterService.java | 11 ++- .../ExcludeLiabilitiesRegisterService.java | 7 +- .../service/ExecutionRegisterService.java | 8 +- .../service/LiabilitiesRegisterService.java | 8 +- .../service/MoneyBalanceRegisterService.java | 11 +-- ...oneyPaymentInstructionRegisterService.java | 8 +- .../clearing/registry/util/PreClearMap.java | 79 +++++++++++++++++++ .../registry/util/PreClearMapTest.java | 50 ++++++++++++ 11 files changed, 181 insertions(+), 37 deletions(-) create mode 100644 clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java create mode 100644 clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java index d7c8cb5b6..35b78a684 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java @@ -17,6 +17,7 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.AdmittedLiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryStatus; @@ -24,10 +25,8 @@ import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -45,6 +44,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements private final Imdg companyMap; private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public AdmittedLiabilitiesRegisterService(Consumer kafkaQueue, @@ -57,6 +57,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForLocalDateField(admittedLiabilitiesRegisterMap, "clearingDate"); } @Override @@ -78,6 +79,8 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } + log.debug("Select {} Registry by query {}", registries.size(), registries); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertAdmittedLiabilitiesRegister(registry); @@ -131,20 +134,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements @Override public Optional isDuplicateInMap(Registry entity) { return Optional.empty(); - //todo для всех isDuplicateInMap: сказали надо по критерию чистить мапу перед вставкой записей, критерий уточнят. - /* - todo вечер 28.09.2023 - Вот по какому полю ориентируемся (название реестра - наименование поля) - depoBalanceRegister - createdAt - moneyBalanceRegister - createdAt - admittedLiabilitiesRegister - clearingDate - coveredLiabilitiesRegister - clearingDate - moneyPaymentInstructionRegister - clearingDate - depoPaymentInstructionRegister - createdAt - excludeLiabilitiesRegister - createdAt - liabilitiesRegister - createdAt - executionRegister - clearingDate - */ + //для всех isDuplicateInMap: пока не используется, надо по критерию чистить мапу перед вставкой записей, preClearMap. // Map> fieldValues = Map.of( // "companyId", entity.getRegistryCode(), // "sessionId", entity.getSessionId(), diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java index 247088edf..bdfabce94 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java @@ -17,6 +17,7 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.CoveredLiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryStatus; @@ -24,10 +25,8 @@ import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -45,6 +44,7 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements private final Imdg companyMap; private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public CoveredLiabilitiesRegisterService(Consumer kafkaQueue, @@ -57,6 +57,7 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForLocalDateField(coveredLiabilitiesRegisterMap, "clearingDate"); } @Override @@ -79,6 +80,8 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } + log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertCoveredLiabilitiesRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java index d41a72d23..2a88c5690 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java @@ -13,6 +13,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.imdg.api.Imdg; @@ -20,10 +21,8 @@ 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.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -39,6 +38,7 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial private final Imdg depoBalanceRegisterMap; private final Imdg registryMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public DepoBalanceRegisterService(Consumer kafkaQueue, @@ -49,6 +49,7 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial this.depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class); this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(depoBalanceRegisterMap, "created"); } @Override @@ -68,6 +69,8 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial log.debug("No registry with such conditions '{}'", prdctForRegistries); return; } + log.debug("Select {} Registry by query {}", registries.size(), prdctForRegistries); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertDepoBalanceRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java index b62067ec6..b7323faef 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java @@ -16,12 +16,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -41,6 +40,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme private final Imdg tradingClearingRegistryMap; private final Imdg InOutDirectionDictionaryMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public DepoPaymentInstructionRegisterService(Consumer kafkaQueue, @@ -54,6 +54,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.InOutDirectionDictionaryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(depoPaymentInstructionRegisterMap, "created"); } @Override @@ -67,15 +68,19 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme public void depoPaymentInstructionRegisterNew(BaseRequest userRequest) { log.debug("LauncherCommandRequest received from {}", createRegistry_GORR.topic()); - Collection actualSessions = sessionMap.getCollectionObjectsByFieldValues(Map.of("section", "FOND")); + Map sessionQuery = Map.of("section", "FOND"); + Collection actualSessions = sessionMap.getCollectionObjectsByFieldValues(sessionQuery); if (actualSessions.isEmpty()) { log.debug("No Session with such conditions section = FOND"); return; } + log.debug("Select {} Session by query {}", actualSessions.size(), sessionQuery); + preClearMap.preClearMap(); for (Session session : actualSessions) { Map> fieldValues = Map.of("sessionId", session.getId()); Collection paymentInstructionBySessionId = paymentInstructionMap.getCollectionObjectsByFieldValues(fieldValues); + log.debug("Select {} PaymentInstruction by query {}", paymentInstructionBySessionId.size(), fieldValues); for (PaymentInstruction paymentInstruction : paymentInstructionBySessionId) { if (isDuplicateInMap(paymentInstruction).isEmpty()) { insertDepoPaymentInstructionRegister(paymentInstruction); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java index 7f6b083b2..b3ed52edf 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java @@ -19,15 +19,14 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExcludeLiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; 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.specific.SecuritySelector; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.time.LocalDate; import java.util.Collection; @@ -47,6 +46,7 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements private final Imdg companySymbolMap; private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public ExcludeLiabilitiesRegisterService(Consumer kafkaQueue, @@ -60,6 +60,7 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements this.companySymbolMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, ru.clearing.classes.statics.data.company.CompanySymbols.class); this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(excludeLiabilitiesRegisterMap, "created"); } @Override @@ -82,6 +83,8 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements log.debug("No registry with such conditions {}", sqlForRegistries); return; } + log.debug("Select {} Registry by query {}", registries.size(), sqlForRegistries); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertExcludeLiabilitiesRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java index 4058813ae..aec13f61e 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java @@ -18,14 +18,13 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionRegisterOnSaveRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.MoneyFlowSide; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.time.LocalDate; import java.util.Collection; @@ -46,6 +45,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ private final Imdg executionDepositMap; private final Imdg tradingClearingRegistryMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public ExecutionRegisterService(Consumer kafkaQueue, @@ -59,6 +59,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ this.executionDepositMap = imdgProvider.getImdg(Map_ExecutionDeposit, ExecutionDeposit.class); this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForLocalDateField(executionRegisterMap, "clearingDate"); } @Override @@ -77,6 +78,9 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ log.debug("ExecutionRegisterNewRequest received"); Collection collectionFond = executionFondMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow)); Collection collectionDeposit = executionDepositMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow)); + log.debug("Found {} ExecutionFond and {} ExecutionDeposit on clearingDate={}", + collectionFond.size(), collectionDeposit.size(), localDateNow); + preClearMap.preClearMap(); collectionFond.forEach(x -> { if (isDuplicateInMap(x).isEmpty()) { insertExecutionRegister(true, x); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java index 4231f47c8..3d31414af 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java @@ -18,17 +18,16 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.LiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -47,6 +46,7 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial private final Imdg companySymbolsMap; private final Imdg moneyMarketSecurityMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public LiabilitiesRegisterService(Consumer kafkaQueue, @@ -60,6 +60,7 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(liabilitiesRegisterMap, "created"); } @Override @@ -78,7 +79,8 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial log.debug("LiabilitiesRegisterNewRequest received from {}", Consts.REGISTRY_LIABILITIES_REGISTER_NEW); String sqlConditionForRegistry = getSqlForRegistries(); Collection registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry); - //checking for duplicates + log.debug("Found {} Registry by query {}", registries.size(), sqlConditionForRegistry); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertLiabilitiesRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java index 40a438400..da1a355d5 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java @@ -16,6 +16,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.imdg.api.Imdg; @@ -23,13 +24,10 @@ 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.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; -import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -46,6 +44,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia private final Imdg companyMap; private final Imdg accountMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public MoneyBalanceRegisterService(Consumer kafkaQueue, @@ -59,6 +58,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(moneyBalanceRegisterMap, "created"); } @Override @@ -73,11 +73,12 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic()); ImdgPredicate sqlConditionForRegistry = getSqlForRegistries(userRequest.getRequestPayload().getCompanyId()); Collection registries = registryMap.getCollectionObjectsByPredicate(sqlConditionForRegistry); - if (registries == null) { + if (registries.isEmpty()) { log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } - //todo надо группировать! + log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertMoneyBalanceRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java index fd38b554c..aeaf1ee6f 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java @@ -14,12 +14,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -36,6 +35,7 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem private final Imdg paymentInstructionMap; private final Imdg sessionMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public MoneyPaymentInstructionRegisterService(Consumer kafkaQueue, @@ -47,6 +47,7 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForLocalDateField(moneyPaymentInstructionRegisterMap, "clearingDate"); } @Override @@ -61,10 +62,13 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem log.debug("LauncherCommandRequest received from {}", TOPIC_NAME); Map> fieldValuesSectionMkr = Map.of("section", "MKR"); Collection actualSessions = sessionMap.getCollectionObjectsByFieldValues(fieldValuesSectionMkr); + log.debug("Selected {} Session by query {}", actualSessions.size(), fieldValuesSectionMkr); + preClearMap.preClearMap(); actualSessions.forEach(session -> { Map> fieldValuesSessionId = Map.of("sessionId", session.getId()); Collection paymentInstructionBySessionId = paymentInstructionMap.getCollectionObjectsByFieldValues(fieldValuesSessionId); + log.debug("Selected {} PaymentInstruction by query {}", paymentInstructionBySessionId.size(), fieldValuesSessionId); for (PaymentInstruction paymentInstruction : paymentInstructionBySessionId) { if (isDuplicateInMap(paymentInstruction).isEmpty()) { insertMoneyPaymentInstructionRegister(paymentInstruction); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java new file mode 100644 index 000000000..ba80db4e7 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java @@ -0,0 +1,79 @@ +package ru.spcex.clearing.registry.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.clearing.classes.objects.BusinessObject; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.time.TimeUtil; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.Collection; +import java.util.Objects; + +public class PreClearMap { + protected final Logger log = LoggerFactory.getLogger(getClass()); + protected final Imdg map; + protected final PredicateBuilder predicateBuilder; + + public PreClearMap(Imdg map, PredicateBuilder predicateBuilder) { + this.map = map; + this.predicateBuilder = predicateBuilder; + } + + public void preClearMap() { + ImdgPredicate query = predicateBuilder.query(map.predicateBuilder(), LocalDate.now()); + Collection toDelete = map.getCollectionObjectsByPredicate(query); + log.debug("Prepare {} to delete by query \"{}\" from map {}", toDelete.size(), query, map.getMapName()); + for (T item : toDelete) + map.delete(item); + } + + public static PreClearMap instanceForLocalDateField(Imdg map, String fieldName) { + Objects.requireNonNull(map); + Objects.requireNonNull(fieldName); + return new PreClearMap<>(map, new PredicateBuilder() { + @Override + public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) { + return pb.equals(fieldName, date); + } + + @Override + public String toString() { + return "LocalDate predicate on " + fieldName; + } + }); + } + + public static PreClearMap instanceForInstantField(Imdg map, String fieldName) { + Objects.requireNonNull(map); + Objects.requireNonNull(fieldName); + return new PreClearMap<>(map, new PredicateBuilder() { + @Override + public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) { +// Instant atFrom = TimeUtil.localDateToInstant(date); +// Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)); + Instant atFrom = TimeUtil.localDateToInstant(date).truncatedTo(ChronoUnit.DAYS); + Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)).plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); + return pb.and(pb.greatEqual(fieldName, atFrom), pb.less(fieldName, atTill)); + } + + @Override + public String toString() { + return "Instant predicate on " + fieldName; + } + }); + } + + public interface PredicateBuilder { + ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate onDate); + } + + @Override + public String toString() { + return "PreClearMap{map=" + map.getMapName() + ", predicateBuilder=" + predicateBuilder + "}"; + } +} diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java new file mode 100644 index 000000000..e6b8a8add --- /dev/null +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java @@ -0,0 +1,50 @@ +package ru.spcex.clearing.registry.util; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import ru.clearing.classes.objects.BusinessObject; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; +import ru.spcex.platform.utils.time.TimeUtil; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; + +class PreClearMapTest { + + @Test + void instanceForLocalDateField() { + LocalDate dt = LocalDate.of(2023, 9, 29); + Imdg map = Mockito.mock(Imdg.class); + Mockito.when(map.getMapName()).thenReturn("Map_Test"); + ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast(); + Mockito.when(map.predicateBuilder()).thenReturn(pb); + + PreClearMap pcm = PreClearMap.instanceForLocalDateField(map, "dateField"); + assertEquals("PreClearMap{map=Map_Test, predicateBuilder=LocalDate predicate on dateField}", pcm.toString()); + + ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt); + assertEquals("dateField=2023-09-29", predicate.toString()); + } + + @Test + void instanceForInstantField() { + LocalDate dt = LocalDate.of(2023, 9, 29); + Imdg map = Mockito.mock(Imdg.class); + Mockito.when(map.getMapName()).thenReturn("Map_Test"); + ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast(); + Mockito.when(map.predicateBuilder()).thenReturn(pb); + + PreClearMap pcm = PreClearMap.instanceForInstantField(map, "dateField"); + assertEquals("PreClearMap{map=Map_Test, predicateBuilder=Instant predicate on dateField}", pcm.toString()); + + ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt); + assertEquals("(dateField>=2023-09-28T00:00:00Z AND dateField<2023-09-30T00:00:00Z)", predicate.toString()); +// String expectedQuery = "(dateField>=" + TimeUtil.localDateToInstant(dt) + " AND dateField<" + TimeUtil.localDateToInstant(dt.plusDays(1)) + ")"; +// assertEquals("(dateField>=2023-09-28T21:00:00Z AND dateField<2023-09-29T21:00:00Z)", predicate.toString()); +// assertEquals(expectedQuery, predicate.toString()); + } +} \ No newline at end of file From ef972a593d5928709b32ca9b918ff3024e1fe4d8 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 29 Sep 2023 16:05:05 +0300 Subject: [PATCH 21/37] =?UTF-8?q?registry-service=20http://jira.mfd.msk:80?= =?UTF-8?q?88/browse/CLS-280=20=D1=81=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=20=D0=A2=D0=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExcludeLiabilitiesRegisterService.java | 16 ++- .../service/LiabilitiesRegisterService.java | 50 +++---- .../service/MoneyBalanceRegisterService.java | 72 +++++++--- ...oneyPaymentInstructionRegisterService.java | 8 +- .../registry/util/FieldValuesValidator.java | 1 + ...ExcludeLiabilitiesRegisterServiceTest.java | 34 +++++ .../LiabilitiesRegisterServiceTest.java | 31 +++++ .../MoneyBalanceRegisterServiceTest.java | 123 ++++++++++++++++++ 8 files changed, 284 insertions(+), 51 deletions(-) create mode 100644 clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java create mode 100644 clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java create mode 100644 clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java index b3ed52edf..2b30ff310 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java @@ -99,18 +99,22 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements ExcludeLiabilitiesRegister excludeLiabilitiesRegister = new ExcludeLiabilitiesRegister(); //hz communicating Session sessionBySessionId = sessionMap.getSingleObjectByID(registry.getSessionId()); - LocalDate validToDate = TimeUtil.toLocalDate(sessionBySessionId.getUpdated()); - Map> innPredicates = Map.of("companySymbol", CompanySymbol.INN.getKey(), - "companyId", registry.getCompanyId()); + Map> innPredicates = Map.of( + "companySymbol", CompanySymbol.INN.getKey(), + "companyId", registry.getCompanyId() + ); ru.clearing.classes.statics.data.company.CompanySymbols companySymbol = companySymbolMap.getFirstObjectByFieldValues(innPredicates); Security security = securitySelector.selectSecurityById(registry.getSecurityId()); excludeLiabilitiesRegister.setSessionId(registry.getSessionId()); excludeLiabilitiesRegister.setValidFromDate(sessionBySessionId.getClearingDate()); + LocalDate validToDate = TimeUtil.toLocalDate(sessionBySessionId.getUpdated()); excludeLiabilitiesRegister.setValidToDate(validToDate); excludeLiabilitiesRegister.setCompanyId(registry.getCompanyId()); excludeLiabilitiesRegister.setCompanyFullName(registry.getFullName()); - excludeLiabilitiesRegister.setInn(companySymbol.getCompanySymbolValue()); + if (companySymbol != null) { + excludeLiabilitiesRegister.setInn(companySymbol.getCompanySymbolValue()); + } excludeLiabilitiesRegister.setRegistryCode(registry.getRegistryCode()); excludeLiabilitiesRegister.setAccount(registry.getAccount()); excludeLiabilitiesRegister.setRegistryStatus(registry.getRegistryStatus()); @@ -130,12 +134,12 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements excludeLiabilitiesRegister.setSumLiabilities(registry.getBalance()); excludeLiabilitiesRegister.setSettlementDate(registry.getSettlementDate()); excludeLiabilitiesRegister.setCreated(Instant.now()); - excludeLiabilitiesRegister.setUpdated(Instant.now()); + excludeLiabilitiesRegister.setUpdated(excludeLiabilitiesRegister.getCreated()); excludeLiabilitiesRegisterMap.insert(excludeLiabilitiesRegister); log.debug("inserted successfully ExcludeLiabilitiesRegister entity with id: {}", excludeLiabilitiesRegister.getId()); } - private String getSqlForRegistries() { + protected String getSqlForRegistries() { return String.format("registryDesignation = '%s' and " + "registryInstrumentType in ('%s','%s') and " + "registryUnit = '%s' and " + diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java index 3d31414af..5ccb096f9 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java @@ -8,10 +8,12 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.register.LiabilitiesRegister; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; +import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -19,16 +21,15 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.LiabilitiesRegis import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.CompanySymbol; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryInstrumentType; -import ru.spcex.platform.enumeration.RegistryUnit; +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.specific.SecuritySelector; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; +import java.time.LocalDate; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -44,7 +45,7 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial private final Imdg registryMap; private final Imdg sessionMap; private final Imdg companySymbolsMap; - private final Imdg moneyMarketSecurityMap; + private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; private final PreClearMap preClearMap; @@ -58,7 +59,7 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; preClearMap = PreClearMap.instanceForInstantField(liabilitiesRegisterMap, "created"); } @@ -93,23 +94,13 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial private void insertLiabilitiesRegister(Registry registry) { log.trace("Started generating LiabilitiesRegister entity..."); LiabilitiesRegister liabilitiesRegister = new LiabilitiesRegister(); - Session session = sessionMap.getFirstObjectByFieldValues( - Map.of( - "id", - registry.getCompanyId() - ) - ); + Session session = sessionMap.getSingleObjectByID(registry.getSessionId()); CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues( Map.of("companyId", registry.getCompanyId(), "companySymbol", CompanySymbol.INN.getKey() ) ); - MoneyMarketSecurity moneyMarketSecurity = moneyMarketSecurityMap.getFirstObjectByFieldValues( - Map.of( - "securityId", - registry.getSecurityId() - ) - ); + Security security = securitySelector.selectSecurityById(registry.getSecurityId()); if (session == null) { log.warn("Session is empty!"); } else { @@ -117,16 +108,27 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial liabilitiesRegister.setValidToDate(TimeUtil.toLocalDate(session.getUpdated())); } if (companySymbols == null) { - log.warn("CompanySymbols is empty! For companyId={}", registry.getCompanyId()); + log.warn("CompanySymbols not found, for companyId={}", registry.getCompanyId()); } else { liabilitiesRegister.setInn(companySymbols.getCompanySymbolValue()); } - if (moneyMarketSecurity == null) { - log.warn("MoneyMarketSecurity is empty!"); + if (security == null) { + log.warn("Security id={} not found for registry id={}", registry.getSecurityId(), registry.getId()); } else { - liabilitiesRegister.setCurrency(moneyMarketSecurity.getNominalCurrency()); + if (InstrumentType.RATE.equalsByKey(security.getInstrumentType())) { + liabilitiesRegister.setCurrency(((MoneyMarketSecurity) security).getNominalCurrency()); + } else if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) { + liabilitiesRegister.setCurrency(((FixedIncomeSecurity) security).getNominalCurrency()); + } else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) { + // не заполняется Currency + } else { // never + log.warn("Unexpected security[{}] type {}", security.getId(), security.getInstrumentType()); + } } liabilitiesRegister.setSessionId(registry.getSessionId()); + liabilitiesRegister.setValidFromDate(session.getClearingDate()); + LocalDate validToDate = TimeUtil.toLocalDate(session.getUpdated()); + liabilitiesRegister.setValidToDate(validToDate); liabilitiesRegister.setCompanyId(registry.getCompanyId()); liabilitiesRegister.setCompanyFullName(registry.getFullName()); liabilitiesRegister.setRegistryCode(registry.getRegistryCode()); @@ -135,12 +137,12 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial liabilitiesRegister.setSumLiabilities(registry.getBalance()); liabilitiesRegister.setSettlementDate(registry.getSettlementDate()); liabilitiesRegister.setCreated(Instant.now()); - liabilitiesRegister.setUpdated(Instant.now()); + liabilitiesRegister.setUpdated(liabilitiesRegister.getCreated()); liabilitiesRegisterMap.insert(liabilitiesRegister); log.debug("inserted successfully LiabilitiesRegister entity with id: {}", liabilitiesRegister.getId()); } - private String getSqlForRegistries() { + protected String getSqlForRegistries() { return String.format("registryDesignation = '%s' and " + "registryInstrumentType in ('%s','%s') and " + "registryUnit = '%s'", diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java index da1a355d5..826677d25 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.registry.service; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.MutableTriple; +import org.apache.commons.lang3.tuple.Triple; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -17,8 +20,10 @@ import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.registry.util.PreClearMap; +import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; @@ -27,10 +32,9 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.function.Function; +import java.util.stream.Collectors; import static ru.spcex.platform.enumeration.Task.createRegistry_GBRR; @@ -69,6 +73,24 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia init(); } + protected List> groupingRegistry(Collection registries) { + Map, List> regGroups = registries.stream().collect(Collectors.groupingBy( + (Registry reg) -> new MutablePair(reg.getCompanyId(), reg.getAccountId()) + )); + List> result = new ArrayList<>(regGroups.values()); + if (result.size() > 3) { + log.warn("Found too many ({}) registries in group: {}", result.size(), result); + } + return result; +// return regGroups.values().stream().map((List regLst) -> { +// for (Registry r : regLst) +// if (RegistryUnit.T.equalsByKey(r.getRegistryUnit())) { +// return r;// приоритетно нужен AM_T +// } +// return regLst.iterator().next(); +// }).collect(Collectors.toList()); + } + public void moneyBalanceRegisterNew(BaseRequest userRequest) { log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic()); ImdgPredicate sqlConditionForRegistry = getSqlForRegistries(userRequest.getRequestPayload().getCompanyId()); @@ -78,22 +100,36 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia return; } log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry); + List> registerGroups = groupingRegistry(registries); preClearMap.preClearMap(); - registries.forEach((registry -> { - if (isDuplicateInMap(registry).isEmpty()) { - insertMoneyBalanceRegister(registry); - } + registerGroups.forEach((registryItems -> { +// if (isDuplicateInMap(registry).isEmpty()) { + insertMoneyBalanceRegister(registryItems); +// } } )); log.debug("successfully processed"); } - private void insertMoneyBalanceRegister(Registry registry) { + private void insertMoneyBalanceRegister(List registryGroup) { log.trace("Started generating MoneyBalanceRegister entity..."); MoneyBalanceRegister moneyBalanceRegister = new MoneyBalanceRegister(); - Registry registryForRemainderSum = registryMap.getFirstObjectByPredicate(getSqlForRemainderSum(registry.getCompanyId(), registry.getAccount())); - Registry registryForBlockedSum = registryMap.getFirstObjectByPredicate(getSqlForBlockedSum(registry.getCompanyId(), registry.getAccount())); - Registry registryForUnblockedSum = registryMap.getFirstObjectByPredicate(getSqlForUnblockedSum(registry.getCompanyId(), registry.getAccount())); + Registry registryForRemainderSum = registryGroup.stream() + .filter(r -> RegistryUnit.T.equalsByKey(r.getRegistryUnit())) + .findAny().orElse(null); + Registry registryForBlockedSum = registryGroup.stream() + .filter(r -> RegistryUnit.B.equalsByKey(r.getRegistryUnit())) + .findAny().orElse(null); + Registry registryForUnblockedSum = registryGroup.stream() + .filter(r -> RegistryUnit.F.equalsByKey(r.getRegistryUnit())) + .findAny().orElse(null); + Registry registry = registryForRemainderSum; + if (registry == null) + registry = registryGroup.iterator().next(); + log.trace("Group of {} registries: T={}; B={}; F={}", registryGroup.size(), registryForRemainderSum, registryForBlockedSum, registryForUnblockedSum); +// Registry registryForRemainderSum = registryMap.getFirstObjectByPredicate(getSqlForRemainderSum(registry.getCompanyId(), registry.getAccount())); +// Registry registryForBlockedSum = registryMap.getFirstObjectByPredicate(getSqlForBlockedSum(registry.getCompanyId(), registry.getAccount())); +// Registry registryForUnblockedSum = registryMap.getFirstObjectByPredicate(getSqlForUnblockedSum(registry.getCompanyId(), registry.getAccount())); Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 2L)); CompanySymbols companySymbol = companySymbolsMap.getFirstObjectByFieldValues(Map.of("companySymbol", CompanySymbol.INN.getKey(), "companyId", registry.getCompanyId())); String setHouseName = company != null ? company.getShortName() : null; @@ -102,11 +138,11 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia String account = null; String infoAccount = null; if ("CLRN".equalsIgnoreCase(accountType)) { - Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", "INFO")); + Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", AccountType.Info.getKey())); account = registry.getAccount(); infoAccount = accountValue != null ? accountValue.getAccount() : null; } else if ("INFO".equalsIgnoreCase(accountType)) { - Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", "CLRN")); + Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", AccountType.Clrn.getKey())); account = accountValue != null ? accountValue.getAccount() : null; infoAccount = registry.getAccount(); } @@ -121,12 +157,12 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia moneyBalanceRegister.setSessionId(registry.getSessionId()); moneyBalanceRegister.setCompanyId(registry.getCompanyId()); moneyBalanceRegister.setCreated(Instant.now()); - moneyBalanceRegister.setUpdated(Instant.now()); + moneyBalanceRegister.setUpdated(moneyBalanceRegister.getCreated()); moneyBalanceRegisterMap.insert(moneyBalanceRegister); log.debug("inserted successfully MoneyBalanceRegister entity with id: {}", moneyBalanceRegister.getId()); } - private ImdgPredicate getSqlForRegistries(Long companyId) { + protected ImdgPredicate getSqlForRegistries(Long companyId) { ImdgPredicateBuilder pb = registryMap.predicateBuilder(); ImdgPredicate prdct; if (companyId == null) { @@ -141,7 +177,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia return prdct; } - private ImdgPredicate getSqlForRemainderSum(Long companyId, String account) { + protected ImdgPredicate getSqlForRemainderSum(Long companyId, String account) { ImdgPredicateBuilder pb = registryMap.predicateBuilder(); ImdgPredicate prdct = pb.and( pb.equals("companyId", companyId), @@ -152,7 +188,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia return prdct; } - private ImdgPredicate getSqlForBlockedSum(Long companyId, String account) { + protected ImdgPredicate getSqlForBlockedSum(Long companyId, String account) { ImdgPredicateBuilder pb = registryMap.predicateBuilder(); ImdgPredicate prdct = pb.and( pb.equals("companyId", companyId), @@ -163,7 +199,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia return prdct; } - private ImdgPredicate getSqlForUnblockedSum(Long companyId, String account) { + protected ImdgPredicate getSqlForUnblockedSum(Long companyId, String account) { ImdgPredicateBuilder pb = registryMap.predicateBuilder(); ImdgPredicate prdct = pb.and( pb.equals("companyId", companyId), diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java index aeaf1ee6f..73633a618 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java @@ -85,11 +85,13 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem moneyPaymentInstructionRegister.setCreditLegAmount(paymentInstruction.getCreditLeg_amount()); moneyPaymentInstructionRegister.setCreditLegCurrencyCode(paymentInstruction.getCreditLeg_currencyCode()); moneyPaymentInstructionRegister.setDebitLegAccount(paymentInstruction.getDebitLeg_account()); - moneyPaymentInstructionRegister.setSender(paymentInstruction.getSenderId().toString()); - moneyPaymentInstructionRegister.setAddressee(paymentInstruction.getAddresseeId().toString()); + if (paymentInstruction.getSenderId()!=null) + moneyPaymentInstructionRegister.setSender(paymentInstruction.getSenderId().toString()); + if (paymentInstruction.getAddresseeId()!=null) + moneyPaymentInstructionRegister.setAddressee(paymentInstruction.getAddresseeId().toString()); moneyPaymentInstructionRegister.setClearingDate(paymentInstruction.getClearingDate()); moneyPaymentInstructionRegister.setCreated(Instant.now()); - moneyPaymentInstructionRegister.setUpdated(Instant.now()); + moneyPaymentInstructionRegister.setUpdated(moneyPaymentInstructionRegister.getCreated()); moneyPaymentInstructionRegisterMap.insert(moneyPaymentInstructionRegister); log.debug("inserted successfully PaymentInstruction entity with id: {}", paymentInstruction.getId()); } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java index 4ae5f8a3f..e897308e2 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +@Deprecated public class FieldValuesValidator { public static List delete2(Map map) { List errors = new ArrayList<>(); diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java new file mode 100644 index 000000000..ec8bdeae5 --- /dev/null +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java @@ -0,0 +1,34 @@ +package ru.spcex.clearing.registry.service; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister; +import ru.clearing.classes.statics.data.register.MoneyBalanceRegister; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; + +import static org.junit.jupiter.api.Assertions.*; + +class ExcludeLiabilitiesRegisterServiceTest { + + @Test + void getSqlForRegistries() { + ExcludeLiabilitiesRegisterService svc = instance(); + assertEquals("registryDesignation = 'O' and registryInstrumentType in ('S','M') and registryUnit = 'T' and registryStatus in ('FAIL', 'UNCV')", + svc.getSqlForRegistries()); + } + + + ExcludeLiabilitiesRegisterService instance() { + ImdgProvider imdg = Mockito.mock(ImdgProvider.class); + Imdg map1 = Mockito.mock(Imdg.class); + Mockito.when(map1.predicateBuilder()).thenReturn(new ImdgPredicateBuilderHazelcast()); + Mockito.when(imdg.getImdg(IMDGDistributedNames.Map_ExcludeLiabilitiesRegister, ExcludeLiabilitiesRegister.class)).thenReturn(map1); + + return new ExcludeLiabilitiesRegisterService(null, null, imdg, null); + } + +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java new file mode 100644 index 000000000..b35882342 --- /dev/null +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.registry.service; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import ru.clearing.classes.statics.data.register.LiabilitiesRegister; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; + +import static org.junit.jupiter.api.Assertions.*; + +class LiabilitiesRegisterServiceTest { + + @Test + void getSqlForRegistries() { + LiabilitiesRegisterService svc = instance(); + assertEquals("registryDesignation = 'L' and registryInstrumentType in ('S','M') and registryUnit = 'T'", + svc.getSqlForRegistries()); + } + + + LiabilitiesRegisterService instance() { + ImdgProvider imdg = Mockito.mock(ImdgProvider.class); + Imdg map1 = Mockito.mock(Imdg.class); + Mockito.when(map1.predicateBuilder()).thenReturn(new ImdgPredicateBuilderHazelcast()); + Mockito.when(imdg.getImdg(IMDGDistributedNames.Map_LiabilitiesRegister, LiabilitiesRegister.class)).thenReturn(map1); + + return new LiabilitiesRegisterService(null, null, imdg, null); + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java new file mode 100644 index 000000000..d6de6c4f0 --- /dev/null +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java @@ -0,0 +1,123 @@ +package ru.spcex.clearing.registry.service; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import ru.clearing.classes.statics.data.register.MoneyBalanceRegister; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; + +class MoneyBalanceRegisterServiceTest { + + @Test + void groupingRegistry() { + MoneyBalanceRegisterService svc = testInstance(); + ArrayList regs1 = new ArrayList<>(); + assertEquals(0, svc.groupingRegistry(regs1).size()); + { + Registry r = new Registry(); + r.setId(1001L); + r.setCompanyId(10L); + r.setAccount("A100"); + r.setAccountId(100L); + r.setRegistryUnit(RegistryUnit.T.getKey()); + regs1.add(r); + } + { + Registry r = new Registry(); + r.setId(1002L); + r.setCompanyId(10L); + r.setAccount("A100"); + r.setAccountId(100L); + r.setRegistryUnit(RegistryUnit.B.getKey()); + regs1.add(r); + } + { + Registry r = new Registry(); + r.setId(1003L); + r.setCompanyId(10L); + r.setAccount("A100"); + r.setAccountId(100L); + r.setRegistryUnit(RegistryUnit.F.getKey()); + regs1.add(r); + } + { + Registry r = new Registry(); + r.setId(1004L); + r.setCompanyId(110L); + r.setAccount("A103"); + r.setAccountId(103L); + r.setRegistryUnit(RegistryUnit.F.getKey()); + regs1.add(r); + } + { + Registry r = new Registry(); + r.setId(1005L); + r.setCompanyId(10L); + r.setAccount("A101"); + r.setAccountId(101L); + r.setRegistryUnit(RegistryUnit.F.getKey()); + regs1.add(r); + } + + List> out = svc.groupingRegistry(regs1); + + assertEquals("[[Registry{id=1004}], [Registry{id=1001}, Registry{id=1002}, Registry{id=1003}], [Registry{id=1005}]]", + "[" + out.stream().map(lst -> "[" + lst.stream().map(v -> v.toString()).collect(Collectors.joining(", ")) + "]") + .collect(Collectors.joining(", ")) + "]"); + } + + @Test + void getSqlForRegistries() { + MoneyBalanceRegisterService svc = testInstance(); + assertEquals("(companyId=1000 AND (registryDesignation=A AND registryInstrumentType=M))", + svc.getSqlForRegistries(1000L).toString()); + } + + @Test + void getSqlForRemainderSum() { + MoneyBalanceRegisterService svc = testInstance(); + assertEquals("(companyId=1000 AND account=ACC-2 AND (registryDesignation=A AND registryInstrumentType=M AND registryUnit=T))", + svc.getSqlForRemainderSum(1000L, "ACC-2").toString()); + } + + @Test + void getSqlForBlockedSum() { + MoneyBalanceRegisterService svc = testInstance(); + assertEquals("(companyId=1000 AND account=ACC-2 AND (registryDesignation=A AND registryInstrumentType=M AND registryUnit=B))", + svc.getSqlForBlockedSum(1000L, "ACC-2").toString()); + } + + @Test + void getSqlForUnblockedSum() { + MoneyBalanceRegisterService svc = testInstance(); + assertEquals("(companyId=1000 AND account=ACC-2 AND (registryDesignation=A AND registryInstrumentType=M AND registryUnit=F))", + svc.getSqlForUnblockedSum(1000L, "ACC-2").toString()); + } + + static MoneyBalanceRegisterService testInstance() { + ImdgProvider imdg = Mockito.mock(ImdgProvider.class); + Imdg map1 = Mockito.mock(Imdg.class); + Mockito.when(map1.predicateBuilder()).thenReturn(new ImdgPredicateBuilderHazelcast()); + Mockito.when(imdg.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class)).thenReturn(map1); + Imdg map2 = Mockito.mock(Imdg.class); + Mockito.when(map2.predicateBuilder()).thenReturn(new ImdgPredicateBuilderHazelcast()); + Mockito.when(imdg.getImdg(IMDGDistributedNames.Map_Registry, Registry.class)).thenReturn(map2); + + MoneyBalanceRegisterService instance = new MoneyBalanceRegisterService(null, null, imdg, null); + return instance; + + //todo тесты с выборкой с реальным тестовым Imdg, чтобы провалидировать типы данных в SQL + } + +} \ No newline at end of file From 646c8c7e77ec99e589405877a3f0e3fe095e4ee4 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 29 Sep 2023 16:15:33 +0300 Subject: [PATCH 22/37] =?UTF-8?q?backend-api=20http://jira.mfd.msk:8088/br?= =?UTF-8?q?owse/CLS-553=20meta=20=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20DATA.sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend-api/src/main/resources/meta/data.xml | 3 ++- .../backend-api/src/main/resources/meta/meta.json | 4 ++-- .../backend-api/src/main/resources/meta/meta.xml | 4 ++-- .../backend-api/src/test/resources/meta.json | 4 ++-- .../db-scripts/src/main/resources/db/DATA.sql | 10 +++++++++- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/data.xml b/clearing-parent/backend-api/src/main/resources/meta/data.xml index 4fb3405e5..5cc07adaf 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/data.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/data.xml @@ -427,6 +427,7 @@ + @@ -531,7 +532,7 @@ - + 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 f38db6df2..a1c79cd96 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.8.0.57", + "version": "3.8.0.58", "enums": { @@ -4263,7 +4263,7 @@ } , {"code": "account", - "type": 2,"length": 50,"name": "Номер счета","shortname": "Счет","required": true + "type": 2,"length": 50,"name": "Номер счета","shortname": "Счет" } , {"code": "status", 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 d19bfe011..0873a9139 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 @@ - + @@ -988,7 +988,7 @@ - + diff --git a/clearing-parent/backend-api/src/test/resources/meta.json b/clearing-parent/backend-api/src/test/resources/meta.json index f38db6df2..a1c79cd96 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.8.0.57", + "version": "3.8.0.58", "enums": { @@ -4263,7 +4263,7 @@ } , {"code": "account", - "type": 2,"length": 50,"name": "Номер счета","shortname": "Счет","required": true + "type": 2,"length": 50,"name": "Номер счета","shortname": "Счет" } , {"code": "status", diff --git a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql b/clearing-parent/db-scripts/src/main/resources/db/DATA.sql index 86f5f59bb..e410b2c68 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DATA.sql @@ -1,4 +1,4 @@ --- DB version: 3.8.0.55 +-- DB version: 3.8.0.58 -- DATA version: 3.5.0.13 @@ -492,6 +492,10 @@ INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (24, 'GREF', 'Формиро INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (25, 'FDFF', 'Формирование ДФ-05 с кодом 9 (финальный)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (26, 'SDEP', 'Время начала возврата депозитов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (27, 'EDEP', 'Время завершения возврата депозитов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Активна') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'BLKD', 'Не активна') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; @@ -824,6 +828,8 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5022, 'ACNT', 'Для INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5023, 'ACNT', 'Счет %s уже используется.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5024, 'ACNT', 'Не указан номер счета.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5200, 'BLNC', 'Общая ошибка модуля balance-service.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5210, 'BLNC', 'Клиринговая сессия неактивна.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; @@ -916,6 +922,8 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5431, 'CLRN', 'Дат INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5432, 'CLRN', 'После сверки обнаружена разница между плановым и фактическим балансом') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5433, 'CLRN', 'Сессия по возврату депозита не может исполняться вне временного интервала, установленного в системе') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5600, 'DBFI', 'Общая ошибка модуля dbf-importer.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5800, 'DBFE', 'Общая ошибка модуля dbf-exporter.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; From 6ec042bd30cc6f1e1259c325c1b153743f6a6a73 Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 29 Sep 2023 16:22:41 +0300 Subject: [PATCH 23/37] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D1=81=20?= =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=D0=BC=20dm*x=20=D1=84=D0=B8=D0=BA=D1=81=20=D1=81=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=D0=BE=D0=BC=20=D0=B0=D1=81=D1=81=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B8=20=D0=B8=D0=BD=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=BC=20=D0=B8=20ipob=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20planbalance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/executors/Sdf57Executor.java | 46 +++++++++++++++---- .../service/registry/AssetTBFProcessing.java | 3 +- .../stage/PrimaryAuctionBnSession.java | 20 ++++---- 3 files changed, 49 insertions(+), 20 deletions(-) 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 5bc78342c..4986c50fd 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 @@ -320,15 +320,35 @@ public class Sdf57Executor extends AbstractExecutor { registryD.getId()); sessionIsNeededFlag.set(true); } else if (tm_tFound.isPresent()) { - Registry tm_t = tm_tFound.get(); - Registry registryD = copyRegD(tm_t, stmt, RegistryUnit.X); - registryImdg.insert(registryD); - log.debug("stmt.id={}, sdf57.specif={} found TM*T.id={} new DM*X.id={}. Return money identification for Initiator account based on TM*T registry searchin on companyId, accountId, contract and registry_status=PROC|MGN", - stmt.getId(), - sdf57.getSpecif(), - tm_t.getId(), - registryD.getId()); - sessionIsNeededFlag.set(true); + Optional dm_xFound = RegistrySearch.builder(registryImdg) + .rgsCode(RegistryTradingParams.DM_X) + .companyId(company.getId()) + .accountId(account.getId()) + .contract(stmt.getContract()) + .statusNotOk() + .find(); + if (dm_xFound.isEmpty()) { + Registry tm_t = tm_tFound.get(); + Registry registryD = copyRegD(tm_t, stmt, RegistryUnit.X); + registryImdg.insert(registryD); + log.debug("stmt.id={}, sdf57.specif={} found TM*T.id={} new DM*X.id={}. Return money identification for Initiator account based on TM*T registry searchin on companyId, accountId, contract and registry_status=PROC|MGN", + stmt.getId(), + sdf57.getSpecif(), + tm_t.getId(), + registryD.getId()); + sessionIsNeededFlag.set(true); + } else { + Registry dm_x = dm_xFound.get(); + dm_x.setBalance(safeBD(dm_x.getBalance()).add(safeBD(stmt.getAmount()))); + dm_x.setUpdated(Instant.now()); + registryImdg.update(dm_x); + log.debug("stmt.id={}, sdf57.specif={} updated {}.id={}", + stmt.getId(), + sdf57.getSpecif(), + dm_x.getRegistryCode(), + dm_x.getId()); + sessionIsNeededFlag.set(true); + } } } stmt.setOperationStatus(OperationStatus.Executed.getKey()); @@ -610,6 +630,14 @@ public class Sdf57Executor extends AbstractExecutor { return this; } + private RegistrySearch statusNotOk() { + predicate = pb.and(predicate, pb.or( + pb.equals("registryStatus", RegistryStatus.PROC.getKey()), + pb.equals("registryStatus", RegistryStatus.UNCV.getKey()) + )); + return this; + } + private Optional find() { return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(predicate)); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java index 3b5c3ac62..d5d078e7a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java @@ -169,7 +169,8 @@ public class AssetTBFProcessing { pb.sql(RegistryCodeSqlBuilder.getInstance(params).build()), pb.equals("tradingClearingRegistryId", rgs.getTradingClearingRegistryId()), pb.equals("companyId", rgs.getCompanyId()), - pb.equals("accountId", rgs.getAccountId()) + pb.equals("accountId", rgs.getAccountId()), + pb.equals("securityId", rgs.getSecurityId()) ); return Optional.ofNullable(rgsImdg.getFirstObjectByPredicate(prdct)); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java index e0577eab0..833d337eb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java @@ -214,16 +214,16 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali public void finishPart() { try { //stage 9 continue revision - { - StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); - if (!reviseRes.isSuccess()) { - this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); - log.warn("{} stage error, created monitor for {}", - TaskType.AgainRevise, - afterReviseErrorMonitor.allConditions()); - return; - } - } + //{ + // StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + // if (!reviseRes.isSuccess()) { + // this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + // log.warn("{} stage error, created monitor for {}", + // TaskType.AgainRevise, + // afterReviseErrorMonitor.allConditions()); + // return; + // } + //} //stage 10 { FinishingSessionPayload payload = new FinishingSessionPayload(); From 9ed6a75fe555ed46620e1da2cb293c9c00199baa Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 29 Sep 2023 16:58:58 +0300 Subject: [PATCH 24/37] http://jira.mfd.msk:8088/browse/CLS-280 --- clearing-parent/registry-service/pom.xml | 5 + .../service/ExecutionRegisterService.java | 215 +++++++++--------- .../registry/config/KafkaConfigTest.java | 17 ++ .../service/ExecutionRegisterServiceTest.java | 201 ++++++++++++++++ .../clearing/registry/utils/TestUtils.java | 9 +- 5 files changed, 337 insertions(+), 110 deletions(-) create mode 100644 clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index 2df1f4a6b..90d1d2dbb 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -46,6 +46,11 @@ ru.spcex.clearing dictionary + + ru.spcex.clearing + test-clearing + test + diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java index aec13f61e..9697e48fc 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.execution.ExecutionCommon; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; @@ -21,10 +22,13 @@ import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.MoneyFlowSide; +import ru.spcex.platform.enumeration.Side; 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.validation.IValidator; +import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDate; import java.util.Collection; @@ -44,6 +48,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ private final Imdg executionFondMap; private final Imdg executionDepositMap; private final Imdg tradingClearingRegistryMap; + private final Imdg accountImdg; private final Function, IValidator> fieldValuesValidator; private final PreClearMap preClearMap; @@ -58,6 +63,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ this.executionFondMap = imdgProvider.getImdg(Map_ExecutionFond, ExecutionFond.class); this.executionDepositMap = imdgProvider.getImdg(Map_ExecutionDeposit, ExecutionDeposit.class); this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class); + this.accountImdg = imdgProvider.getImdg(Map_Account, Account.class); this.fieldValuesValidator = fieldValuesValidator; preClearMap = PreClearMap.instanceForLocalDateField(executionRegisterMap, "clearingDate"); } @@ -119,91 +125,112 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ private void insertExecutionRegister(Boolean isFond, ExecutionCommon common) { log.trace("Started generating ExecutionRegister entity..."); - /* todo сверить с ТЗ, замечания от 28.09.2023: - executionRegister - Реестр сделок -sellerId - Если executionDeposit/Fond.side=BUY - company.shortName [executionDeposit/Fond.counterPartyId = company.id]. Если executionDeposit/Fond.side=SELL - company.shortName [executionDeposit/Fond.companyId = company.id] -sellerClearingCode - не заполняется -sellerTradingClearingRegister - не заполняется -sellerMoneyAccount - не заполняется -sellerDepoAccount - не заполняется -buyerId - Если executionDeposit/Fond.side=BUY - company.shortName [executionDeposit/Fond.counterPartyId = company.id]. Если executionDeposit/Fond.side=SELL - company.shortName [executionDeposit/Fond.counterPartyId = company.id] -buyerClearingCode - не заполняется -buyerTradingClearingRegister - не заполняется -buyerMoneyAccount - не заполняется -buyerDepoAccount - не заполняется - */ + + LocalDate tradingDate = common.getTradingDate(); + Long exchangeExecutionId = common.getExchangeExecutionId(); + Instant exchangeExecutionTime = common.getExchangeExecutionTime(); + Long securityId = common.getSecurityId(); + LocalDate clearingDate = common.getClearingDate(); + + Long sellerId; String sellerClearingCode = null; - String sellerTradingClearingRegister = null; + String sellerTradingClearingRegister; String sellerMoneyAccount = null; String sellerDepoAccount = null; - Long buyerId = common.getSide().equalsIgnoreCase(MoneyFlowSide.BUY.getKey()) ? common.getCompanyId() : common.getCounterPartyId(); - Long sellerId = common.getSide().equalsIgnoreCase(MoneyFlowSide.BUY.getKey()) ? common.getCounterPartyId() : common.getCompanyId(); + + Long buyerId; String buyerClearingCode = null; - String buyerTradingClearingRegister = null; + String buyerTradingClearingRegister; String buyerMoneyAccount = null; String buyerDepoAccount = null; - String side = common.getSide(); - Optional companySymbolsByCLRSandCompanyId = getCompanySymbolsByCompanyIdAndCompanySymbol(CompanySymbol.CLRC.getKey(), common.getCompanyId()); - Optional tradingClearingRegistryByCodeOfCompanyId = getTradingClearingRegistryByCode(common.getCompanyId().toString()); - Optional companySymbolsByCLRSandCounterPartyId = getCompanySymbolsByCompanyIdAndCompanySymbol(CompanySymbol.CLRC.getKey(), common.getCounterPartyId()); - Optional tradingClearingRegistryByCodeOfCounterPartyId = getTradingClearingRegistryByCode(common.getCounterPartyId().toString()); - Optional tradingClearingRegistryByCompanyIdOfCounterPartyId = getTradingClearingRegistryByCompanyId(common.getCounterPartyId()); - if (side.equalsIgnoreCase(MoneyFlowSide.BUY.getKey())) { - if (companySymbolsByCLRSandCounterPartyId.isPresent()) { - sellerClearingCode = companySymbolsByCLRSandCounterPartyId.get().getCompanySymbolValue(); - } - if (tradingClearingRegistryByCompanyIdOfCounterPartyId.isPresent()) { - sellerTradingClearingRegister = tradingClearingRegistryByCompanyIdOfCounterPartyId.get().getCode(); - } - if (tradingClearingRegistryByCodeOfCounterPartyId.isPresent()) { - TradingClearingRegistry clearingRegistry = tradingClearingRegistryByCodeOfCounterPartyId.get(); - sellerMoneyAccount = clearingRegistry.getMoneyAccountId().toString(); - if (isFond) { - sellerDepoAccount = clearingRegistry.getDepoAccountId().toString(); - } - } - if (companySymbolsByCLRSandCompanyId.isPresent()) { - buyerClearingCode = companySymbolsByCLRSandCompanyId.get().getCompanySymbolValue(); - } - buyerTradingClearingRegister = common.getTradingClearingRegistryId().toString(); - if (tradingClearingRegistryByCodeOfCompanyId.isPresent()) { - TradingClearingRegistry clearingRegistry = tradingClearingRegistryByCodeOfCompanyId.get(); - buyerMoneyAccount = clearingRegistry.getMoneyAccountId().toString(); - if (isFond) { - buyerDepoAccount = clearingRegistry.getDepoAccountId().toString(); - } - } - } else if (side.equalsIgnoreCase(MoneyFlowSide.SELL.getKey())) { - if (companySymbolsByCLRSandCompanyId.isPresent()) { - sellerClearingCode = companySymbolsByCLRSandCompanyId.get().getCompanySymbolValue(); - } - sellerTradingClearingRegister = common.getTradingClearingRegistryId().toString(); - if (tradingClearingRegistryByCodeOfCompanyId.isPresent()) { - TradingClearingRegistry clearingRegistry = tradingClearingRegistryByCodeOfCompanyId.get(); - sellerMoneyAccount = clearingRegistry.getMoneyAccountId().toString(); - if (isFond) { - sellerDepoAccount = clearingRegistry.getDepoAccountId().toString(); - } - } - if (companySymbolsByCLRSandCounterPartyId.isPresent()) { - buyerClearingCode = companySymbolsByCLRSandCounterPartyId.get().getCompanySymbolValue(); - } - if (tradingClearingRegistryByCodeOfCounterPartyId.isPresent()) { - TradingClearingRegistry clearingRegistry = tradingClearingRegistryByCodeOfCounterPartyId.get(); - buyerMoneyAccount = clearingRegistry.getMoneyAccountId().toString(); - if (isFond) { - buyerDepoAccount = clearingRegistry.getDepoAccountId().toString(); - } - } - if (tradingClearingRegistryByCompanyIdOfCounterPartyId.isPresent()) { - buyerTradingClearingRegister = tradingClearingRegistryByCompanyIdOfCounterPartyId.get().getId().toString(); - } + + BigDecimal amount; + BigDecimal quantity = null; + if (isFond) { + ExecutionFond executionFond = (ExecutionFond) common; + amount = executionFond.getSettlementAmount(); + quantity = executionFond.getQuantity(); + } else { + ExecutionDeposit executionDeposit = (ExecutionDeposit) common; + amount = executionDeposit.getFirstLegAmount(); } + + TradingClearingRegistry tkrForCounterPartyTkrId = tradingClearingRegistryMap.getSingleObjectByID( + common.getCounterPartyTradingClearingRegistryId() + ); + TradingClearingRegistry tkrForTkrId = tradingClearingRegistryMap.getSingleObjectByID( + common.getTradingClearingRegistryId() + ); + Account moneyAccountForCounterPartyTkrId = null; + Account depoAccountForCounterPartyTkrId = null; + if (tkrForCounterPartyTkrId != null) { + if (tkrForCounterPartyTkrId.getMoneyAccountId() != null) + moneyAccountForCounterPartyTkrId = accountImdg.getSingleObjectByID(tkrForCounterPartyTkrId.getMoneyAccountId()); + if (tkrForCounterPartyTkrId.getDepoAccountId() != null) + depoAccountForCounterPartyTkrId = accountImdg.getSingleObjectByID(tkrForCounterPartyTkrId.getDepoAccountId()); + } + Account moneyAccountForTkrId = null; + Account depoAccountForTkrId = null; + if (tkrForTkrId != null) { + if (tkrForTkrId.getMoneyAccountId() != null) + moneyAccountForTkrId = accountImdg.getSingleObjectByID(tkrForTkrId.getMoneyAccountId()); + if (tkrForTkrId.getDepoAccountId() != null) + depoAccountForTkrId = accountImdg.getSingleObjectByID(tkrForTkrId.getDepoAccountId()); + } + + CompanySymbols companySymbolsForCompanyId = companySymbolsMap.getFirstObjectByFieldValues( + Map.of( + "companySymbol", CompanySymbol.CLRC.getKey(), + "companyId", common.getCompanyId() + ) + ); + CompanySymbols companySymbolsForCounterPartyId = companySymbolsMap.getFirstObjectByFieldValues( + Map.of( + "companySymbol", CompanySymbol.CLRC.getKey(), + "companyId", common.getCounterPartyId() + ) + ); + + String sideStr = common.getSide(); + MoneyFlowSide moneyFlowSide = IEnumKey.getEnumByKey(MoneyFlowSide.class, sideStr); + Side side = IEnumKey.getEnumByKey(Side.class, sideStr); + if (moneyFlowSide == MoneyFlowSide.BUY || side == Side.BUY) { + + sellerId = common.getCounterPartyId(); + buyerId = common.getCompanyId(); + + if (companySymbolsForCounterPartyId != null) sellerClearingCode = companySymbolsForCounterPartyId.getCompanySymbolValue(); + sellerTradingClearingRegister = common.getCounterPartyTradingClearingRegistry(); + if (moneyAccountForCounterPartyTkrId != null) sellerMoneyAccount = moneyAccountForCounterPartyTkrId.getAccount(); + if (depoAccountForCounterPartyTkrId != null) sellerDepoAccount = depoAccountForCounterPartyTkrId.getAccount(); + + if (companySymbolsForCompanyId != null) buyerClearingCode = companySymbolsForCompanyId.getCompanySymbolValue(); + buyerTradingClearingRegister = common.getPartyTradingClearingRegistry(); + if (moneyAccountForTkrId != null) buyerMoneyAccount = moneyAccountForTkrId.getAccount(); + if (depoAccountForTkrId != null) buyerDepoAccount = depoAccountForTkrId.getAccount(); + + } else { + + sellerId = common.getCompanyId(); + buyerId = common.getCounterPartyId(); + + if (companySymbolsForCompanyId != null) sellerClearingCode = companySymbolsForCompanyId.getCompanySymbolValue(); + sellerTradingClearingRegister = common.getPartyTradingClearingRegistry(); + if (moneyAccountForTkrId != null) sellerMoneyAccount = moneyAccountForTkrId.getAccount(); + if (depoAccountForTkrId != null) sellerDepoAccount = depoAccountForTkrId.getAccount(); + + if (companySymbolsForCounterPartyId != null) buyerClearingCode = companySymbolsForCounterPartyId.getCompanySymbolValue(); + buyerTradingClearingRegister = common.getCounterPartyTradingClearingRegistry(); + if (moneyAccountForCounterPartyTkrId != null) buyerMoneyAccount = moneyAccountForCounterPartyTkrId.getAccount(); + if (depoAccountForCounterPartyTkrId != null) buyerDepoAccount = depoAccountForCounterPartyTkrId.getAccount(); + + } + ExecutionRegister executionRegister = new ExecutionRegister(); - executionRegister.setTradingDate(common.getTradingDate()); - executionRegister.setExchangeExecutionId(common.getExchangeExecutionId()); - executionRegister.setExchangeExecutionTime(common.getExchangeExecutionTime()); - executionRegister.setSecurityId(common.getSecurityId()); + executionRegister.setTradingDate(tradingDate); + executionRegister.setExchangeExecutionId(exchangeExecutionId); + executionRegister.setExchangeExecutionTime(exchangeExecutionTime); + executionRegister.setSecurityId(securityId); executionRegister.setSellerId(sellerId); executionRegister.setSellerClearingCode(sellerClearingCode); executionRegister.setSellerTradingClearingRegister(sellerTradingClearingRegister); @@ -214,13 +241,9 @@ buyerDepoAccount - не заполняется executionRegister.setBuyerTradingClearingRegister(buyerTradingClearingRegister); executionRegister.setBuyerMoneyAccount(buyerMoneyAccount); executionRegister.setBuyerDepoAccount(buyerDepoAccount); - if (isFond) { - executionRegister.setQuantity(common.getQuantity()); - executionRegister.setAmount(((ExecutionFond) common).getSettlementAmount()); - } else { - executionRegister.setAmount(((ExecutionDeposit) common).getFirstLegAmount()); - } - executionRegister.setClearingDate(common.getClearingDate()); + executionRegister.setAmount(amount); + executionRegister.setQuantity(quantity); + executionRegister.setClearingDate(clearingDate); executionRegister.setCreated(Instant.now()); executionRegisterMap.insert(executionRegister); log.debug("inserted successfully ExecutionRegister entity with id: {}", executionRegister.getId()); @@ -274,30 +297,6 @@ buyerDepoAccount - не заполняется return common; } - private Optional getCompanySymbolsByCompanyIdAndCompanySymbol(String companySymbol, Long companyId) { - Map> fieldValues = Map.of("companySymbol", companySymbol, "companyId", companyId); - CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues(fieldValues); - return Optional.ofNullable(companySymbols); - } - - private Optional getCompanySymbolsByCompanyId(Long companyId) { - Map> fieldValues = Map.of("companyId", companyId); - CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues(fieldValues); - return Optional.ofNullable(companySymbols); - } - - private Optional getTradingClearingRegistryByCompanyId(Long companyId) { - Map> fieldValues = Map.of("companyId", companyId); - TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(fieldValues); - return Optional.ofNullable(tradingClearingRegistry); - } - - private Optional getTradingClearingRegistryByCode(String code) { - Map> fieldValues = Map.of("code", code); - TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(fieldValues); - return Optional.ofNullable(tradingClearingRegistry); - } - @Override public Optional isDuplicateInMap(ExecutionCommon entity) { return Optional.empty(); diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/KafkaConfigTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/KafkaConfigTest.java index effdcf574..0ca299c99 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/KafkaConfigTest.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/KafkaConfigTest.java @@ -3,10 +3,14 @@ package ru.spcex.clearing.registry.config; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.consumer.OffsetResetStrategy; +import org.apache.kafka.clients.producer.MockProducer; import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.mockito.ArgumentCaptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.boot.test.mock.mockito.MockReset; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; @@ -17,6 +21,10 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; +import static org.mockito.Mockito.mock; +import static ru.spcex.clearing.registry.utils.TestUtils.setFuture; +import static ru.spcex.clearing.test.config.KafkaTestConfig.producerCaptors; + @Configuration public class KafkaConfigTest { @@ -41,4 +49,13 @@ public class KafkaConfigTest { return new MockConsumer<>(OffsetResetStrategy.EARLIEST); } + @Bean("mockProducer") + public Producer kafkaProducer() { + Producer mockProducer = mock(MockProducer.class, MockReset.withSettings(MockReset.AFTER)); + ArgumentCaptor recordArgumentCaptor = ArgumentCaptor.forClass(ProducerRecord.class); + setFuture(recordArgumentCaptor, mockProducer); + producerCaptors.put(mockProducer, recordArgumentCaptor); + return mockProducer; + } + } diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java new file mode 100644 index 000000000..fabe878ea --- /dev/null +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java @@ -0,0 +1,201 @@ +package ru.spcex.clearing.registry.service; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.Producer; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.clearing.classes.statics.data.register.ExecutionRegister; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.registry.config.ValidationConfig; +import ru.spcex.clearing.test.TestUtils; +import ru.spcex.clearing.test.config.ImdgTestConfig; +import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.Side; +import ru.spcex.platform.enumeration.Task; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import javax.annotation.PostConstruct; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneOffset; +import java.util.Collection; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + ValidationConfig.class, + ExecutionRegisterService.class, + ImdgTestConfig.class, + KafkaTestConfig.class, +}) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +class ExecutionRegisterServiceTest { + LocalDate TRADING_DATE = LocalDate.of(2020, 1, 1); + Instant EXCHANGE_EXECUTION_TIME = LocalDate.of(2020, 1, 1).atStartOfDay().toInstant(ZoneOffset.UTC); + Long COUNTER_PARTY_ID = 888L; + Long COMPANY_ID = 777L; + Long EXCHANGE_EXECUTION_ID = 777L; + Long SECURITY_ID = 888L; + BigDecimal SETTLEMENT_AMOUNT = BigDecimal.valueOf(777L); + BigDecimal QUANTITY = BigDecimal.valueOf(888L); + + String COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID = "COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID"; + String COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID = "COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID"; + + Long MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID; + Long MONEY_ACCOUNT_FOR_TKR_ID; + Long DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID; + Long DEPO_ACCOUNT_FOR_TKR_ID; + + Long TKR_FOR_COUNTER_PARTY_TKR_ID; + Long TKR_FOR_TKR_ID; + + String MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR = "MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR"; + String MONEY_ACCOUNT_FOR_TKR = "MONEY_ACCOUNT_FOR_TKR"; + String DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR = "DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR"; + String DEPO_ACCOUNT_FOR_TKR = "DEPO_ACCOUNT_FOR_TKR"; + + String COUNTER_PARTY_TKR = "COUNTER_PARTY_TKR"; + String PARTY_TKR = "PARTY_TKR"; + + private static int requestCount = 0; + + private Imdg accountImdg; + private Imdg executionDepositImdg; + private Imdg executionFondImdg; + private Imdg companySymbolsImdg; + private Imdg tradingClearingRegistryImdg; + private Imdg executionRegisterImdg; + + @Autowired + private ExecutionRegisterService executionRegisterService; + + @Autowired + @Qualifier("hazelcastServiceTest") + private ImdgProvider imdgProvider; + + @Autowired + @Qualifier("mockProducer") + private Producer producer; + + @PostConstruct + private void init() { + ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); + + executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); + executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + executionRegisterImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionRegister, ExecutionRegister.class); + + Account moneyAccountForCounterPartyTkr = new Account(); + moneyAccountForCounterPartyTkr.setAccount(MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); + MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID = accountImdg.insert(moneyAccountForCounterPartyTkr); + + Account moneyAccountForTkr = new Account(); + moneyAccountForTkr.setAccount(MONEY_ACCOUNT_FOR_TKR); + MONEY_ACCOUNT_FOR_TKR_ID = accountImdg.insert(moneyAccountForTkr); + + Account depoAccountForCounterPartyTkr = new Account(); + depoAccountForCounterPartyTkr.setAccount(DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); + DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID = accountImdg.insert(depoAccountForCounterPartyTkr); + + Account depoAccountForTkr = new Account(); + depoAccountForTkr.setAccount(DEPO_ACCOUNT_FOR_TKR); + DEPO_ACCOUNT_FOR_TKR_ID = accountImdg.insert(depoAccountForTkr); + + TradingClearingRegistry tkrForCounterPartyTkrId = new TradingClearingRegistry(); + tkrForCounterPartyTkrId.setMoneyAccountId(MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID); + tkrForCounterPartyTkrId.setDepoAccountId(DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID); + TKR_FOR_COUNTER_PARTY_TKR_ID = tradingClearingRegistryImdg.insert(tkrForCounterPartyTkrId); + + TradingClearingRegistry tkrForTkrId = new TradingClearingRegistry(); + tkrForTkrId.setMoneyAccountId(MONEY_ACCOUNT_FOR_TKR_ID); + tkrForTkrId.setDepoAccountId(DEPO_ACCOUNT_FOR_TKR_ID); + TKR_FOR_TKR_ID = tradingClearingRegistryImdg.insert(tkrForTkrId); + + CompanySymbols companySymbolsForCompanyId = new CompanySymbols(); + companySymbolsForCompanyId.setCompanyId(COMPANY_ID); + companySymbolsForCompanyId.setCompanySymbol(CompanySymbol.CLRC.getKey()); + companySymbolsForCompanyId.setCompanySymbolValue(COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); + companySymbolsImdg.insert(companySymbolsForCompanyId); + + CompanySymbols companySymbolsForCounterPartyId = new CompanySymbols(); + companySymbolsForCounterPartyId.setCompanyId(COUNTER_PARTY_ID); + companySymbolsForCounterPartyId.setCompanySymbol(CompanySymbol.CLRC.getKey()); + companySymbolsForCounterPartyId.setCompanySymbolValue(COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); + companySymbolsImdg.insert(companySymbolsForCounterPartyId); + } + + @Test + @Order(1) + void executionRegisterNewForClearingDate() { + + ExecutionFond executionFond = new ExecutionFond(); + executionFond.setClearingDate(LocalDate.now()); + executionFond.setTradingDate(TRADING_DATE); + executionFond.setExchangeExecutionId(EXCHANGE_EXECUTION_ID); + executionFond.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME); + executionFond.setSecurityId(SECURITY_ID); + executionFond.setSettlementAmount(SETTLEMENT_AMOUNT); + executionFond.setQuantity(QUANTITY); + executionFond.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID); + executionFond.setTradingClearingRegistryId(TKR_FOR_TKR_ID); + executionFond.setCompanyId(COMPANY_ID); + executionFond.setCounterPartyId(COUNTER_PARTY_ID); + executionFond.setSide(Side.BUY.getKey()); + executionFond.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR); + executionFond.setPartyTradingClearingRegistry(PARTY_TKR); + executionFondImdg.insert(executionFond); + + LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); + + String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(), + Task.createRegistry_ECNR.topic(), + requestCount++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + Collection allValues = executionRegisterImdg.getAllValues(); + ExecutionRegister executionRegister = allValues.iterator().next(); + assertEquals(executionRegister.getTradingDate(), TRADING_DATE); + assertEquals(executionRegister.getExchangeExecutionId(), EXCHANGE_EXECUTION_ID); + assertEquals(executionRegister.getExchangeExecutionTime(), EXCHANGE_EXECUTION_TIME); + assertEquals(executionRegister.getSecurityId(), SECURITY_ID); + assertEquals(executionRegister.getSellerId(), COUNTER_PARTY_ID); + assertEquals(executionRegister.getSellerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); + assertEquals(executionRegister.getSellerTradingClearingRegister(), COUNTER_PARTY_TKR); + assertEquals(executionRegister.getSellerMoneyAccount(), MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); + assertEquals(executionRegister.getSellerDepoAccount(), DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); + assertEquals(executionRegister.getBuyerId(), COMPANY_ID); + assertEquals(executionRegister.getBuyerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); + assertEquals(executionRegister.getBuyerTradingClearingRegister(), PARTY_TKR); + assertEquals(executionRegister.getBuyerMoneyAccount(), MONEY_ACCOUNT_FOR_TKR); + assertEquals(executionRegister.getBuyerDepoAccount(), DEPO_ACCOUNT_FOR_TKR); + assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT); + assertEquals(executionRegister.getQuantity(), QUANTITY); + assertEquals(executionRegister.getClearingDate(), LocalDate.now()); + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java index 93099808c..4795327bb 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.MockConsumer; import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.TopicPartition; @@ -25,8 +26,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; import static ru.spcex.clearing.platform.messaging.service.Status.Success; import static ru.spcex.clearing.registry.utils.MatcherFactory.usingIgnoringFieldsComparator; @@ -89,6 +89,11 @@ public class TestUtils { return jsonBaseRequest; } + public static void setFuture(ArgumentCaptor captor, Producer mockProducer){ + TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); + doReturn(future).when(mockProducer).send(captor.capture()); + } + public static void clearAllInImdg(Imdg imdg) { Collection values = imdg.getAllValues(); values.forEach(imdg::delete); From 40978a0017fdb9a0e444c90ca817e94312f85ccc Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 29 Sep 2023 18:18:16 +0300 Subject: [PATCH 25/37] http://jira.mfd.msk:8088/browse/CLS-280 --- .../service/ExecutionRegisterService.java | 71 ++++++++++--------- .../service/ExecutionRegisterServiceTest.java | 58 +++++++++++++++ .../ExecutionRegisterOnSaveRequest.java | 2 + 3 files changed, 98 insertions(+), 33 deletions(-) diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java index 9697e48fc..92451a125 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java @@ -15,7 +15,6 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.register.ExecutionRegister; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionRegisterOnSaveRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; @@ -73,9 +72,13 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ callback(LauncherCommandRequest.class) .setConsumer(this::executionRegisterNew) .forDestination(createRegistry_ECNR.topic(), callbacks::put); - callback(ExecutionRegisterOnSaveRequest.class) - .setConsumer(this::executionRegisterOnSavingOfTrade) - .forDestination(Consts.REGISTRY_EXECUTION_REGISTER_ON_SAVE, callbacks::put); + + + // TODO возможно deprecated +// callback(ExecutionRegisterOnSaveRequest.class) +// .setConsumer(this::executionRegisterOnSavingOfTrade) +// .forDestination(Consts.REGISTRY_EXECUTION_REGISTER_ON_SAVE, callbacks::put); + init(); } @@ -88,41 +91,14 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ collectionFond.size(), collectionDeposit.size(), localDateNow); preClearMap.preClearMap(); collectionFond.forEach(x -> { - if (isDuplicateInMap(x).isEmpty()) { - insertExecutionRegister(true, x); - } + insertExecutionRegister(true, x); }); collectionDeposit.forEach(x -> { - if (isDuplicateInMap(x).isPresent()) { - insertExecutionRegister(false, x); - } + insertExecutionRegister(false, x); }); log.debug("successfully processed..."); } - public void executionRegisterOnSavingOfTrade(BaseRequest userRequest) { - ExecutionRegisterOnSaveRequest request = userRequest.getRequestPayload(); - ExecutionCommon common = setUpExecutionCommon(request); - boolean isFond = request.isExecutionFond(); - Optional optionalDuplicate = isDuplicateInMap(common); - if (optionalDuplicate.isEmpty()) { - insertExecutionRegister(isFond, common); - } else { - updateExecutionRegister(isFond, common, optionalDuplicate.get()); - } - } - - private void updateExecutionRegister(boolean isFond, ExecutionCommon common, ExecutionRegister registerToUpdate) { - log.trace("Started updating ExecutionRegister entity..."); - registerToUpdate.setSecurityId(common.getSecurityId()); - registerToUpdate.setExchangeExecutionTime(common.getExchangeExecutionTime()); - registerToUpdate.setAmount(isFond ? ((ExecutionFond) common).getSettlementAmount() : ((ExecutionDeposit) common).getFirstLegAmount()); - registerToUpdate.setQuantity(isFond ? common.getQuantity() : null); - registerToUpdate.setUpdated(Instant.now()); - executionRegisterMap.update(registerToUpdate); - log.debug("Updated successfully ExecutionRegister entity with id: {}", registerToUpdate.getId()); - } - private void insertExecutionRegister(Boolean isFond, ExecutionCommon common) { log.trace("Started generating ExecutionRegister entity..."); @@ -249,6 +225,34 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ log.debug("inserted successfully ExecutionRegister entity with id: {}", executionRegister.getId()); } + + // TODO возможно deprecated + public void executionRegisterOnSavingOfTrade(BaseRequest userRequest) { + ExecutionRegisterOnSaveRequest request = userRequest.getRequestPayload(); + ExecutionCommon common = setUpExecutionCommon(request); + boolean isFond = request.isExecutionFond(); + Optional optionalDuplicate = isDuplicateInMap(common); + if (optionalDuplicate.isEmpty()) { + insertExecutionRegister(isFond, common); + } else { + updateExecutionRegister(isFond, common, optionalDuplicate.get()); + } + } + + // TODO возможно deprecated + private void updateExecutionRegister(boolean isFond, ExecutionCommon common, ExecutionRegister registerToUpdate) { + log.trace("Started updating ExecutionRegister entity..."); + registerToUpdate.setSecurityId(common.getSecurityId()); + registerToUpdate.setExchangeExecutionTime(common.getExchangeExecutionTime()); + registerToUpdate.setAmount(isFond ? ((ExecutionFond) common).getSettlementAmount() : ((ExecutionDeposit) common).getFirstLegAmount()); + registerToUpdate.setQuantity(isFond ? common.getQuantity() : null); + registerToUpdate.setUpdated(Instant.now()); + executionRegisterMap.update(registerToUpdate); + log.debug("Updated successfully ExecutionRegister entity with id: {}", registerToUpdate.getId()); + } + + + // todo возможно deprecated private ExecutionCommon setUpExecutionCommon(ExecutionRegisterOnSaveRequest request) { ExecutionFond fond = null; ExecutionDeposit deposit = null; @@ -297,6 +301,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ return common; } + @Deprecated @Override public Optional isDuplicateInMap(ExecutionCommon entity) { return Optional.empty(); diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java index fabe878ea..422ebbbf0 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java @@ -37,6 +37,7 @@ import java.time.ZoneOffset; import java.util.Collection; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { @@ -197,5 +198,62 @@ class ExecutionRegisterServiceTest { assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT); assertEquals(executionRegister.getQuantity(), QUANTITY); assertEquals(executionRegister.getClearingDate(), LocalDate.now()); + + executionFondImdg.delete(executionFond); + } + + @Test + @Order(2) + void executionRegisterNewFromRequest() { + ExecutionDeposit executionDeposit = new ExecutionDeposit(); + executionDeposit.setClearingDate(LocalDate.now()); + executionDeposit.setTradingDate(TRADING_DATE); + executionDeposit.setExchangeExecutionId(EXCHANGE_EXECUTION_ID); + executionDeposit.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME); + executionDeposit.setSecurityId(SECURITY_ID); + executionDeposit.setFirstLegAmount(SETTLEMENT_AMOUNT); + executionDeposit.setQuantity(QUANTITY); + executionDeposit.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID); + executionDeposit.setTradingClearingRegistryId(TKR_FOR_TKR_ID); + executionDeposit.setCompanyId(COMPANY_ID); + executionDeposit.setCounterPartyId(COUNTER_PARTY_ID); + executionDeposit.setSide(Side.SELL.getKey()); + executionDeposit.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR); + executionDeposit.setPartyTradingClearingRegistry(PARTY_TKR); + executionDepositImdg.insert(executionDeposit); + + LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); + + String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(), + Task.createRegistry_ECNR.topic(), + requestCount++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + Collection allValues = executionRegisterImdg.getAllValues(); + ExecutionRegister executionRegister = allValues.iterator().next(); + assertEquals(executionRegister.getTradingDate(), TRADING_DATE); + assertEquals(executionRegister.getExchangeExecutionId(), EXCHANGE_EXECUTION_ID); + assertEquals(executionRegister.getExchangeExecutionTime(), EXCHANGE_EXECUTION_TIME); + assertEquals(executionRegister.getSecurityId(), SECURITY_ID); + assertEquals(executionRegister.getSellerId(), COMPANY_ID); + assertEquals(executionRegister.getSellerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); + assertEquals(executionRegister.getSellerTradingClearingRegister(), PARTY_TKR); + assertEquals(executionRegister.getSellerMoneyAccount(), MONEY_ACCOUNT_FOR_TKR); + assertEquals(executionRegister.getSellerDepoAccount(), DEPO_ACCOUNT_FOR_TKR); + assertEquals(executionRegister.getBuyerId(), COUNTER_PARTY_ID); + assertEquals(executionRegister.getBuyerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); + assertEquals(executionRegister.getBuyerTradingClearingRegister(), COUNTER_PARTY_TKR); + assertEquals(executionRegister.getBuyerMoneyAccount(), MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); + assertEquals(executionRegister.getBuyerDepoAccount(), DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); + assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT); + assertNull(executionRegister.getQuantity()); + assertEquals(executionRegister.getClearingDate(), LocalDate.now()); + + executionDepositImdg.delete(executionDeposit); } } \ No newline at end of file diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ExecutionRegisterOnSaveRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ExecutionRegisterOnSaveRequest.java index cb7c80222..46650b5ff 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ExecutionRegisterOnSaveRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ExecutionRegisterOnSaveRequest.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.platform.messaging.domain.cud.registry; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -103,6 +104,7 @@ public class ExecutionRegisterOnSaveRequest { @JsonProperty private Instant exchangeExecutionMicroseconds; + @JsonIgnore public boolean isExecutionFond() { return exchangeOrderId != null || settlementAmount != null || comment != null || clientCodeId != null || settlementCode != null || settlementDate != null || exchangeExecutionMicroseconds != null; } From dd4cd2a3149e39fb377e8093bae96cfac62f52e4 Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 29 Sep 2023 18:26:32 +0300 Subject: [PATCH 26/37] AssetTBFProcessing verbose log session 5 step return removed gateway request --- .../clearing/service/registry/AssetTBFProcessing.java | 11 ++++++++++- .../impl/InspectionObligationsDepositReturn.java | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java index 37cc52524..dd547e258 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java @@ -65,7 +65,8 @@ public class AssetTBFProcessing { .map(rgs -> safeBD(rgs.getBalance())) .reduce(BigDecimal.ZERO, BigDecimal::add); Instant now = Instant.now(); - + BigDecimal am_fBalanceForLoging = am_f.getBalance(); + BigDecimal am_bBalanceForLoging = am_b.getBalance(); am_b.setBalance(am_b.getBalance().subtract(sum)); am_f.setBalance(am_t.getBalance().subtract(am_b.getBalance()).add(d__iSum).subtract(d__vSum)); am_b.setUpdated(now); @@ -73,6 +74,14 @@ public class AssetTBFProcessing { rgsImdg.update(am_b); rgsImdg.update(am_f); + log.debug("assets processing [{}#id={}#balance={} | {}#id={}#balance={} | {}#id={}#balance={}] " + + "D**I.size={} D**V.size={}. {}.balance -> {}, {}.balance -> {}", + am_f.getRegistryCode(), am_f.getId(), am_fBalanceForLoging, + am_t.getRegistryCode(), am_t.getId(), am_t.getBalance(), + am_b.getRegistryCode(), am_b.getId(), am_bBalanceForLoging, + d__is.size(), d__vs.size(), + am_b.getRegistryCode(), am_b.getBalance(), + am_f.getRegistryCode(), am_f.getBalance()); } public Collection searchByParams(String account, diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java index 4d6df6934..452ea6e80 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java @@ -156,7 +156,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { dmtInfo.get().getId(), dmtBalance, omtBalance, amfBalance ); - if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >=0 && gatewayIfNeeded(omtRgs)) { + if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >=0) { group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); assets.processByAm_f(amfAsset, omtBalance.negate()); // updateStatus(dmtInfo.get(), RegistryStatus.POOL); @@ -175,7 +175,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { dmtClnr.get().getId(), dmtBalance, omtBalance, amfBalance ); - if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0 && gatewayIfNeeded(omtRgs)) { + if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0) { group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); assets.processByAm_f(amfAsset, omtBalance.negate()); continue; From afc8fb0b54e471daf5bf1df3a6c232343d7d20ea Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 29 Sep 2023 18:46:26 +0300 Subject: [PATCH 27/37] session step 2 sort execution --- .../session/stage/impl/RequirementsAndObligationCreation.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java index f65808b13..81476c58f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java @@ -25,6 +25,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.collection.Pair; import java.time.LocalDate; +import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -58,6 +59,7 @@ public class RequirementsAndObligationCreation implements ISessionStage { } private StageResult createRegisters(List data) { + data.sort(Comparator.comparing(ExecutionCommon::getExchangeExecutionId)); //см. описание к #matchExecutions for (int i = 0; i < data.size(); ) { Pair matched = matchExecutions(data, i); From f36286e14b56d7d67c2d41842b2ab506a6ddec95 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 29 Sep 2023 20:02:36 +0300 Subject: [PATCH 28/37] =?UTF-8?q?account-service=20http://jira.mfd.msk:808?= =?UTF-8?q?8/browse/CLS-553=20account=20=D1=81=20=D1=82=D0=B8=D0=BF=D0=BE?= =?UTF-8?q?=D0=BC=20INFO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../validation/AccountValidationConfig.java | 10 +- .../clearing/account/errors/AccountError.java | 1 + .../account/service/AccountHelper.java | 106 ++++++++++++++++++ .../account/service/AccountService.java | 68 +++-------- .../account/service/BankAccountService.java | 4 +- .../service/ClearingAccountService.java | 4 +- .../account/service/DepoAccountService.java | 4 +- .../service/InformationAccountService.java | 12 +- .../account/service/AccountServiceTest.java | 16 ++- .../service/BankAccountServiceTest.java | 2 +- .../service/ClearingAccountServiceTest.java | 2 +- .../service/DepoAccountServiceTest.java | 2 +- .../InformationAccountServiceTest.java | 2 +- .../service/SDFProcessServiceTest.java | 3 +- 14 files changed, 159 insertions(+), 77 deletions(-) create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountHelper.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java index bc33db303..bbb557877 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java @@ -59,10 +59,14 @@ public class AccountValidationConfig { ), FieldRequiredSpecificRule.instance("account", CorrespondentAccountNewRequest::getAccount, - AccountError.RequiredFieldEmpty, + AccountError.AccountFieldNotSet, + false, accountValue -> { - if (accountValue.isBlank()) - return new EnumMessage(AccountError.RequiredFieldEmpty, "account"); + if ((accountValue == null || accountValue.isBlank()) && AccountType.Info.equalsByKey(context.getValidatedObject().getAccountType())) { + return null; + } + if (accountValue == null || accountValue.isBlank()) + return new EnumMessage(AccountError.AccountFieldNotSet, "account"); Imdg accountImdg = context.obtainMap( IMDGDistributedNames.Map_Account, Account.class ); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java index ad479b785..2f340aee3 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java @@ -21,6 +21,7 @@ public enum AccountError implements IErrorEnumId { ClearingCategoryNotFound(5019L), ClearingCompanySymbolNotFound(5022L), // Для компании %s отсутствует клиринговый код». AccountForTradingClearingRegistryAlreadyUsed(5023L), + AccountFieldNotSet(5024L), TradingClearingRegistryNotFound(3022L), ; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountHelper.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountHelper.java new file mode 100644 index 000000000..510ba460c --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountHelper.java @@ -0,0 +1,106 @@ +package ru.spcex.clearing.account.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; +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.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +import java.util.Collection; + +@Service +public class AccountHelper { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg clearingMemberCategoryMap; + private final Imdg relationMap; + private final IMessageResolver messageResolver; + + @Autowired + public AccountHelper(ImdgProvider imdgProvider, + IMessageResolver messageResolver) { + this.clearingMemberCategoryMap = imdgProvider.getImdg( + IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class + ); + this.relationMap = imdgProvider.getImdg( + IMDGDistributedNames.Map_Relation, Relation.class + ); + this.messageResolver = messageResolver; + } + + /** + * Заполняет поля relationId и companyId из соответствующей записи Relation + * + * @param requestId Идентификатор запроса для вывода лога + */ + public RequestInfoUpdate fillAccountFromRelation(Account account, Long requestId, boolean checkClearingMemberCategory) { + Long companyId = account.getCompanyId(); + Collection relations; + ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder(); + ImdgPredicate finalRelationPredicate; + if (checkClearingMemberCategory) { + ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder(); + ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId); + Collection clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals); + + if (clearingMemberCategories.isEmpty()) + return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, "(any)"); + if (clearingMemberCategories.size() > 1) + log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); + ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next(); + + ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId); + ImdgPredicate servicePredicate; + String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory(); + if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) { + servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey()); + } else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) { + servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); + } else { + log.info("ClearingCategoryNotFound with clearingCategoryValue={} not implemented. Do not search Relation.", clearingCategoryValue); + return null; + //return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, clearingCategoryValue + " (case not implemented)"); + } + finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); + relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); + } else { + finalRelationPredicate = relationPredicateBuilder.equals("consumerId", companyId); + relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); + } + + if (relations.isEmpty()) { + //return makeError(requestId, AccountError.WrongFieldValue, "companyId", finalRelationPredicate.toString()); + log.info("Relation not found: {}", finalRelationPredicate.toString()); + return null; + } + if (relations.size() > 1) + log.warn("Relation for consumerId {} contains multiply elements, use first", companyId); + Relation relation = relations.iterator().next(); + account.setRelationId(relation.getId()); + + return null; + } + + public RequestInfoUpdate makeError(Long reqId, AccountError accountError, Object... args) { + String errMsg = messageResolver.resolve(new EnumMessage(accountError, args)); + return new RequestInfoUpdate() + .setId(reqId) + .setStatus(Status.Error) + .setMessage(errMsg); + } + +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index 7fa1a3634..47f1ec0a6 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -55,6 +55,8 @@ public class AccountService extends QueueConsumer implements InitializingBean { private final IMessageResolver messageResolver; private final UserRoleVerification userRoleVerification; private final ValidationHelper validationHelper; + private final AccountHelper accountHelper; + private final InformationAccountService informationAccountService; private final Function accountNewRequestValidator; private final Function accountUpdateRequestValidator; private final Function accountBlockRequestValidator; @@ -67,6 +69,8 @@ public class AccountService extends QueueConsumer implements InitializingBean { IMessageResolver messageResolver, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, + AccountHelper accountHelper, + InformationAccountService informationAccountService, @Qualifier("correspondentAccountNewRequestValidator") Function accountNewRequestValidator, @Qualifier("correspondentAccountUpdateRequestValidator") @@ -74,6 +78,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { @Qualifier("correspondentAccountBlockRequestValidator") Function accountBlockRequestValidator) { super(kafkaQueue, kafkaProducer); + this.accountHelper = accountHelper; this.imdgProvider = imdgProvider; this.accountMap = imdgProvider.getImdg( IMDGDistributedNames.Map_Account, Account.class @@ -88,6 +93,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { this.messageResolver = messageResolver; this.userRoleVerification = userRoleVerification; this.validationHelper = validationHelper; + this.informationAccountService = informationAccountService; this.accountNewRequestValidator = accountNewRequestValidator; this.accountUpdateRequestValidator = accountUpdateRequestValidator; this.accountBlockRequestValidator = accountBlockRequestValidator; @@ -128,6 +134,12 @@ public class AccountService extends QueueConsumer implements InitializingBean { Account account = new Account(); account.setCompanyId(req.getCompanyId()); account.setAccount(req.getAccount()); + if (AccountType.Info.equalsByKey(req.getAccountType())) { + Long infoSequenceId = informationAccountService.accountNextId(); + String accountValue = informationAccountService.generateInfoAccount(infoSequenceId); + log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue); + account.setAccount(accountValue); + } account.setAccountType(req.getAccountType()); if (req.getStatus() == null) { account.setStatus(WorkflowStatus.Active.getKey()); @@ -138,7 +150,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { account.setCreated(now); account.setUpdated(now); - requestInfoUpdate = fillAccountFromRelation(account, userRequest.getId(), false); + requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), false); if (requestInfoUpdate != null) return requestInfoUpdate; Long newId = null; @@ -306,60 +318,6 @@ public class AccountService extends QueueConsumer implements InitializingBean { return null; } - - /** - * Заполняет поля relationId и companyId из соответствующей записи Relation - * - * @param requestId Идентификатор запроса для вывода лога - */ - public RequestInfoUpdate fillAccountFromRelation(Account account, Long requestId, boolean checkClearingMemberCategory) { - Long companyId = account.getCompanyId(); - Collection relations; - ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder(); - ImdgPredicate finalRelationPredicate; - if (checkClearingMemberCategory) { - ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder(); - ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId); - Collection clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals); - - if (clearingMemberCategories.isEmpty()) - return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, "(any)"); - if (clearingMemberCategories.size() > 1) - log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); - ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next(); - - ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId); - ImdgPredicate servicePredicate; - String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory(); - if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) { - servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey()); - } else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) { - servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); - } else { - log.info("ClearingCategoryNotFound with clearingCategoryValue={} not implemented. Do not search Relation.", clearingCategoryValue); - return null; - //return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, clearingCategoryValue + " (case not implemented)"); - } - finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); - relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); - } else { - finalRelationPredicate = relationPredicateBuilder.equals("consumerId", companyId); - relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); - } - - if (relations.isEmpty()) { - //return makeError(requestId, AccountError.WrongFieldValue, "companyId", finalRelationPredicate.toString()); - log.info("Relation not found: {}", finalRelationPredicate.toString()); - return null; - } - if (relations.size() > 1) - log.warn("Relation for consumerId {} contains multiply elements, use first", companyId); - Relation relation = relations.iterator().next(); - account.setRelationId(relation.getId()); - - return null; - } - private RequestInfoUpdate makeError(Long reqId, AccountError accountError, Object... args) { String errMsg = messageResolver.resolve(new EnumMessage(accountError, args)); return new RequestInfoUpdate() diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index 6c7dc1b8e..f473e7ab1 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -41,7 +41,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea private final UserRoleVerification userRoleVerification; private final ValidationHelper validationHelper; - private final AccountService accountService; + private final AccountHelper accountService; private final Function bankAccountNewRequestValidator; private final Function bankAccountUpdateRequestValidator; @@ -53,7 +53,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea ImdgProvider imdgProvider, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, - AccountService accountService, + AccountHelper accountService, @Qualifier("bankAccountNewRequestValidator") Function bankAccountNewRequestValidator, @Qualifier("bankAccountUpdateRequestValidator") diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java index 4d8fd0da3..bed4b8f49 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java @@ -60,7 +60,7 @@ import java.util.function.Function; public class ClearingAccountService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final KafkaSender kafkaSender; - private final AccountService accountService; + private final AccountHelper accountService; private final SDFProcessService sdfProcessService; private final ValidationHelper validationHelper; private final ImdgProvider imdgProvider; @@ -81,7 +81,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin public ClearingAccountService(Consumer kafkaQueue, Producer kafkaResponseQueue, KafkaSender kafkaSender, - AccountService accountService, + AccountHelper accountService, SDFProcessService sdfProcessService, ValidationHelper validationHelper, ImdgProvider imdgProvider, diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java index d8300b86b..6d52d2c31 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java @@ -44,7 +44,7 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea private final KafkaSender kafkaSender; private final ValidationHelper validationHelper; private final ImdgProvider imdgProvider; - private final AccountService accountService; + private final AccountHelper accountService; private final Function depoAccountNewRequestValidator; public DepoAccountService(Consumer kafkaQueue, @@ -52,7 +52,7 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea KafkaSender kafkaSender, ValidationHelper validationHelper, ImdgProvider imdgProvider, - AccountService accountService, + AccountHelper accountService, @Qualifier("depoAccountNewRequestValidator") Function depoAccountNewRequestValidator) { super(kafkaQueue, kafkaProducer); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 7ad79b489..26e273f76 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -54,7 +54,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali private final UserRoleVerification userRoleVerification; private final ImdgProvider imdgProvider; private final ValidationHelper validationHelper; - private final AccountService accountService; + private final AccountHelper accountHelper; private final RequestHelper requestHelper; private final Function infoAccountNewRequestValidator; private final Imdg informationAccountImdg; @@ -73,7 +73,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali UserRoleVerification userRoleVerification, ImdgProvider imdgProvider, ValidationHelper validationHelper, - AccountService accountService, + AccountHelper accountHelper, RequestHelper requestHelper, @Qualifier("informationAccountNewRequestValidator") Function infoAccountNewRequestValidator) { @@ -83,7 +83,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali this.userRoleVerification = userRoleVerification; this.imdgProvider = imdgProvider; this.validationHelper = validationHelper; - this.accountService = accountService; + this.accountHelper = accountHelper; this.requestHelper = requestHelper; this.infoAccountNewRequestValidator = infoAccountNewRequestValidator; this.informationAccountImdg = imdgProvider.getImdg( @@ -147,7 +147,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali account.setCreated(now); account.setUpdated(now); - requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true); + requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), true); if (requestInfoUpdate != null) return requestInfoUpdate; ImdgTransaction imdgTransaction = imdgProvider.newTransaction(); @@ -239,7 +239,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali account.setCompanyId(forCompanyId); account.setCreated(now); account.setUpdated(now); - requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), false); + requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), false); if (requestInfoUpdate != null) { log.debug("Stop make new account, cause error: {}", requestInfoUpdate.getMessage()); return requestInfoUpdate; @@ -304,7 +304,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali * * @return infoCounter++ */ - protected Long accountNextId() { + public synchronized Long accountNextId() { if (infoCounter == null) synchronized (this) { if (infoCounter == null) { log.debug("Init account-information counter."); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index e7e4afae9..20df4f957 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -23,6 +23,7 @@ import ru.clearing.platform.dictionary.AccountTypeDictionary; import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.validation.AccountValidationConfig; +import ru.spcex.clearing.account.config.validation.InformationAccountValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -64,6 +65,9 @@ import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID; ValidationConfig.class, AccountValidationConfig.class, AccountService.class, + AccountHelper.class, + InformationAccountService.class, + InformationAccountValidationConfig.class, ImdgTestConfig.class, KafkaTestConfig.class}) class AccountServiceTest { @@ -209,8 +213,16 @@ class AccountServiceTest { waitingSendAndCheckRecord(0L, mockProducer); Account resultUpdating = accountImdg.getSingleObjectByID(accountId); - existAccount.setUpdated(resultUpdating.getUpdated()); - ACCOUNT_MATCHER.assertMatch(resultUpdating, existAccount); + Account expectAccount = new Account(); + expectAccount.setId(existAccount.getId()); + expectAccount.setAccount(account); + expectAccount.setAccountType(AccountType.Corr.getKey()); + expectAccount.setStatus(ServiceStatus.Closed.getKey()); + expectAccount.setCompanyId(companyId); + expectAccount.setCreated(existAccount.getCreated()); + expectAccount.setUpdated(resultUpdating.getUpdated()); + expectAccount.setStatus(ServiceStatus.Active.getKey()); + ACCOUNT_MATCHER.assertMatch(resultUpdating, expectAccount); accountImdg.delete(resultUpdating); } diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index 23cf024d2..e499ac5a8 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -55,7 +55,7 @@ import static ru.spcex.clearing.test.TestUtils.*; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { - AccountService.class, + AccountHelper.class, BankAccountService.class, ValidationConfig.class, BankAccountValidationConfig.class, diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java index 4e5bc803d..5e218ed39 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java @@ -52,7 +52,7 @@ import static ru.spcex.clearing.test.TestUtils.*; ValidationConfig.class, ClearingAccountValidationConfig.class, AccountValidationConfig.class, - AccountService.class, + AccountHelper.class, ClearingAccountService.class, SDFProcessService.class, ImdgTestConfig.class, diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java index 7f0f32086..d6e39b9b8 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java @@ -50,7 +50,7 @@ import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; ValidationConfig.class, DepoAccountValidationConfig.class, AccountValidationConfig.class, - AccountService.class, + AccountHelper.class, DepoAccountService.class, ImdgTestConfig.class, KafkaTestConfig.class}) diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java index 664a6b550..6fbe84f26 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java @@ -53,7 +53,7 @@ import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; ValidationConfig.class, InformationAccountValidationConfig.class, AccountValidationConfig.class, - AccountService.class, + AccountHelper.class, InformationAccountService.class, ImdgTestConfig.class, KafkaTestConfig.class}) diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/SDFProcessServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/SDFProcessServiceTest.java index 819b41379..bd2b2f3f7 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/SDFProcessServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/SDFProcessServiceTest.java @@ -103,8 +103,9 @@ class SDFProcessServiceTest { void parseSdf52Status() { Assertions.assertEquals(AccountStatus.BLOCKED, sdfProcessService.parseSdf52Status(0L)); Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(1L)); + Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(3L)); Assertions.assertEquals(AccountStatus.CLOSE, sdfProcessService.parseSdf52Status(2L)); - Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(3L)); + Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(4705211956118233163L)); Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(null)); } } \ No newline at end of file From 553d829b4f9789e24ac0c2b4f144c8095e140e5b Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 2 Oct 2023 11:13:31 +0300 Subject: [PATCH 29/37] when account is ANLT TCR search fix status condition --- .../main/java/ru/spcex/clearing/service/AnltSearcher.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 5eed48609..4b654bd81 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 @@ -52,7 +52,10 @@ public class AnltSearcher { ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder(); ImdgPredicate tcrPredicate = pb.and( pb.equals("code", commentTcrStripped), - pb.equals("status", ServiceStatus.Active.getKey()) + pb.or( + pb.equals("status", ServiceStatus.Active.getKey()), + pb.equals("status", ServiceStatus.Reopened.getKey()) + ) ); TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByPredicate(tcrPredicate); From 93080c76c91e8e3249ab67c2d1bf4274d592b454 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 2 Oct 2023 11:17:24 +0300 Subject: [PATCH 30/37] IdentificationFundsValidationRule TCR search status --- .../service/validation/IdentificationFundsValidationRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java index 672acc2a8..544d695b8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java @@ -84,7 +84,7 @@ public enum IdentificationFundsValidationRule implements IValidationRule Date: Mon, 2 Oct 2023 11:13:31 +0300 Subject: [PATCH 31/37] when account is ANLT TCR search fix status condition --- .../main/java/ru/spcex/clearing/service/AnltSearcher.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 5eed48609..4b654bd81 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 @@ -52,7 +52,10 @@ public class AnltSearcher { ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder(); ImdgPredicate tcrPredicate = pb.and( pb.equals("code", commentTcrStripped), - pb.equals("status", ServiceStatus.Active.getKey()) + pb.or( + pb.equals("status", ServiceStatus.Active.getKey()), + pb.equals("status", ServiceStatus.Reopened.getKey()) + ) ); TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByPredicate(tcrPredicate); From 49119bcabdb51c1ca1f9522e96131f1ff32751d3 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 2 Oct 2023 11:17:24 +0300 Subject: [PATCH 32/37] IdentificationFundsValidationRule TCR search status --- .../service/validation/IdentificationFundsValidationRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java index 672acc2a8..544d695b8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java @@ -84,7 +84,7 @@ public enum IdentificationFundsValidationRule implements IValidationRule Date: Mon, 2 Oct 2023 12:56:17 +0300 Subject: [PATCH 33/37] SDF57 gateway request only when A**T.TradingClearingRegistry not empty --- .../clearing/service/executors/Sdf57Executor.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 4986c50fd..6885b4ae4 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 @@ -355,11 +355,16 @@ public class Sdf57Executor extends AbstractExecutor { statementImdg.update(stmt); log.debug("stmt.id={} status -> {}", stmt.getId(), OperationStatus.Executed.getKey()); if (!dm_tWasCreated && timeService.isTradingTime() && InOutDirection.in.equalsByKey(stmt.getInOutDirection())) { - log.trace("sending gateway request for stmt.id={}", stmt.getId()); - kafka.sendRequestToQueue(Consts.ASSET_OPERATION, - gatewayRequest(stmt, - company.getTradingCode(), - asts.a__t().getTradingClearingRegistry())); + 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 { + log.trace("sending gateway request for stmt.id={}", stmt.getId()); + kafka.sendRequestToQueue(Consts.ASSET_OPERATION, + gatewayRequest(stmt, + company.getTradingCode(), + asts.a__t().getTradingClearingRegistry())); + } } return Optional.of(asts); } else { From e99311b582da348c6eeb75f8960cc2eddcbabdc5 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 2 Oct 2023 13:06:26 +0300 Subject: [PATCH 34/37] http://jira.mfd.msk:8088/browse/CLS-497 --- .../ks/KSRepCashNettoReportBuilder.java | 44 ++-- .../KSRepCashRegisterSumsReportBuilder.java | 238 ++++-------------- .../ks/KSRepCashRegistersReportBuilder.java | 19 +- .../ks/KSRepDepoNettoReportBuilder.java | 44 ++-- ...epDepoRegisterQuantitiesReportBuilder.java | 172 ++++--------- .../ks/KSRepDepoRegistersReportBuilder.java | 23 +- ...SRepCashRegisterSumsReportBuilderTest.java | 23 -- .../services/ReportServiceTest_KS.java | 183 +++++++++----- .../ks/KS_REP_CASH_NETTO_expected.csv | 2 +- .../ks/KS_REP_CASH_REGISTERS_expected.csv | 2 +- .../ks/KS_REP_CASH_REGISTER_SUMS_expected.csv | 2 +- .../ks/KS_REP_DEPO_REGISTERS_expected.csv | 2 +- ..._REP_DEPO_REGISTER_QUANTITIES_expected.csv | 2 +- .../enumeration/RegistryTradingParams.java | 5 + 14 files changed, 294 insertions(+), 467 deletions(-) delete mode 100644 clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegisterSumsReportBuilderTest.java 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..1bdf7b79e 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 @@ -66,7 +66,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); ImdgPredicate finalPredicate = pb.and( @@ -89,7 +89,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder groupedRegistry = entry.getValue(); try { if (groupedRegistry.isEmpty()) { - log.warn("Empty OM_T and TM_T registries for account = {} and session_id = {}. Registries with id = [{}] was skipped", + log.warn("Empty LM_T and CM_T registries for account = {} and session_id = {}. Registries with id = [{}] was skipped", pairRegistryId.getAccount(), pairRegistryId.getSessionId(), groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", ")) @@ -97,32 +97,32 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder tmtRegistries = new ArrayList<>(); - List omtRegistries = new ArrayList<>(); + List cmtRegistries = new ArrayList<>(); + List lmtRegistries = new ArrayList<>(); Registry registry = null; for (Registry currRegistry : groupedRegistry) { registry = currRegistry; - if (RegistryDesignation.O.equalsByKey(currRegistry.getRegistryDesignation())) - omtRegistries.add(currRegistry); - if (RegistryDesignation.T.equalsByKey(currRegistry.getRegistryDesignation())) - tmtRegistries.add(currRegistry); + if (RegistryDesignation.L.equalsByKey(currRegistry.getRegistryDesignation())) + lmtRegistries.add(currRegistry); + if (RegistryDesignation.C.equalsByKey(currRegistry.getRegistryDesignation())) + cmtRegistries.add(currRegistry); } boolean invalid = false; - if (!tmtRegistries.isEmpty() || !omtRegistries.isEmpty()) { + if (!cmtRegistries.isEmpty() || !lmtRegistries.isEmpty()) { String sourceTradingCode = ""; - if (!tmtRegistries.isEmpty()) sourceTradingCode = tmtRegistries.iterator().next().getTradingCode(); - if (!omtRegistries.isEmpty()) sourceTradingCode = omtRegistries.iterator().next().getTradingCode(); - for (Registry currRegistry : tmtRegistries) { + if (!cmtRegistries.isEmpty()) sourceTradingCode = cmtRegistries.iterator().next().getTradingCode(); + if (!lmtRegistries.isEmpty()) sourceTradingCode = lmtRegistries.iterator().next().getTradingCode(); + for (Registry currRegistry : cmtRegistries) { if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue; invalid = true; - log.warn("Invalid TM_T registries set, tradingCode not equals. Registries was skipped"); + log.warn("Invalid CM_T registries set, tradingCode not equals. Registries was skipped"); break; } - for (Registry currRegistry : omtRegistries) { + for (Registry currRegistry : lmtRegistries) { if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue; invalid = true; - log.warn("Invalid OM_T registries set, tradingCode not equals. Registries was skipped"); + log.warn("Invalid LM_T registries set, tradingCode not equals. Registries was skipped"); break; } if (invalid) continue; @@ -140,15 +140,15 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder { - private final Imdg statementImdg; - private final Imdg registryImdg; private final Imdg companyImdg; - private final Imdg accountImdg; - private final Imdg tradingClearingRegistryImdg; + private final Imdg registryImdg; private List rows = null; public KSRepCashRegisterSumsReportBuilder(ImdgProvider imdgProvider) { - statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); } @Override @@ -69,196 +62,51 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder statements = statementImdg.getCollectionObjectsByPredicate(finalPredicate); - log.debug("Found {} Statements by query: {}", statements.size(), finalPredicate); - rows = new ArrayList<>(statements.size()); - for (Statement statement : statements) { - if (statement.getAmount() == null) { - log.warn("Statement id={} has null amount, statement was skipped", statement.getId()); + Collection registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); + log.debug("Found {} registries by query: {}", registries.size(), finalPredicate); + rows = new ArrayList<>(registries.size()); + for (Registry registry : registries) { + Company company = companyImdg.getSingleObjectByID(registry.getCompanyId()); + if (company == null) { + log.warn("For registry id = {} company with id = {} not found, registry was skipped", + registry.getId(), + registry.getCompanyId()); continue; } - try { - boolean searchTCRAsInfo; - if (Arrays.asList(1L, 2L).contains(statement.getAccountId())) { - searchTCRAsInfo = true; - } else { - Account account = accountImdg.getSingleObjectByID(statement.getAccountId()); - if (account == null) { - log.warn("Unexpected state: for statement (id = {}) not found account for accountId = {}. Statement was skipped", - statement.getId(), - statement.getAccountId()); - continue; - } - searchTCRAsInfo = AccountType.Info.equalsByKey(account.getAccountType()); - if (!searchTCRAsInfo && !AccountType.Clrn.equalsByKey(account.getAccountType())) { - log.warn("Unexpected account[{}] type {}", account.getId(), account.getAccountType()); - } - } - TradingClearingRegistry tkr; - if (searchTCRAsInfo) { - String code = parseCodeFromStatementComment(statement.getComment()); - if (code == null || code.isBlank()) { - log.warn("For statement id = {} empty or unparseable code=\"{}\" (comment \"{}\"), statement was skipped", - code, statement.getComment(), statement.getId()); - continue; - } - log.debug("Search TradingClearingRegistry by code={}", code); - tkr = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("code", code)); - if (tkr == null) { - log.warn( - "For statement id = {} and code = {} (or unparseable comment=\"{}\") not found TradingClearingRegistry, statement was skipped", - statement.getId(), - code, statement.getComment() - ); - continue; - } - } else { - Long accountId = statement.getAccountId(); - if (accountId == null) { - log.warn("For statement id = {} empty accountId, statement was skipped", statement.getId()); - continue; - } - log.debug("Search TCR by moneyAccountId={}", accountId); - tkr = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("moneyAccountId", accountId)); - if (tkr == null) { - log.warn( - "For statement id = {} and accountId = {} not found TradingClearingRegistry, statement was skipped", - statement.getId(), - accountId - ); - continue; - } - } + if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue; - Company company; - if (searchTCRAsInfo) { - company = companyImdg.getSingleObjectByID(tkr.getCompanyId()); - if (company == null) { - log.warn("For statement id = {}, tcr.id={}, company with id = {} not found, statement was skipped", - statement.getId(), - tkr.getId(), - tkr.getCompanyId()); - continue; - } - } else { - company = companyImdg.getSingleObjectByID(statement.getAddresseeId()); - if (company == null) { - log.warn("For statement id = {}, company with id = {} not found, statement was skipped", - statement.getId(), - statement.getAddresseeId()); - continue; - } - } - if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) { - log.debug("For statement id = {}, company with id = {} not active", - statement.getId(), company.getId()); - continue; - } + String firmId = registry.getTradingCode(); + String account = registry.getAccount(); + String tkr = registry.getTradingClearingRegistry(); + String tradeNum = ""; + String registerCode = registry.getRegistryCode(); + BigDecimal addSum = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO; + Instant addTime = registry.getUpdated(); + LocalDate addDate = LocalDate.now(); - - ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder(); - ImdgPredicate registryQuery; - if (searchTCRAsInfo) { - registryQuery = pbRegistry.and( - pbRegistry.equals("tradingClearingRegistry", tkr.getCode()), - pbRegistry.in("accountType", AccountType.Clrn.getKey(), AccountType.Info.getKey()), - RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).buildPredicate(pbRegistry) - ); - } else { - registryQuery = pbRegistry.and( - pbRegistry.equals("companyId", statement.getAddresseeId()), - pbRegistry.equals("account", statement.getAccount()), - pbRegistry.in("accountType", AccountType.Clrn.getKey(), AccountType.Info.getKey()), - RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).buildPredicate(pbRegistry) - ); - } - log.trace("For statement id={} search registry query: {}", statement.getId(), registryQuery); - Collection registries = registryImdg.getCollectionObjectsByPredicate(registryQuery); - if (registries.isEmpty()) { - log.warn( - "Can't find registry for {}. Statement id = {} skipped", - registryQuery, - statement.getId() - ); - continue; - } else if (registries.size() > 1) { - log.warn( - "More then one AM_T registry found for {}, statement id {}. Use first", - registryQuery, - statement.getId() - ); - } - Registry registry = registries.iterator().next(); - - KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport(); - ksRepCashRegisterSumsReport.setFirmId(company.getTradingCode()); - if (searchTCRAsInfo) { - Account account = accountImdg.getSingleObjectByID(tkr.getMoneyAccountId()); - if (account == null) { - log.debug("statement id={}, moneyAccount not found with id={}", - statement.getId(), tkr.getMoneyAccountId()); - } else { - ksRepCashRegisterSumsReport.setAccount(account.getAccount()); - } - } else { - ksRepCashRegisterSumsReport.setAccount(statement.getAccount()); - } - ksRepCashRegisterSumsReport.setTkr(tkr.getCode()); - ksRepCashRegisterSumsReport.setRegisterCode(registry.getRegistryCode()); - ksRepCashRegisterSumsReport.setAddDate(nowDate); - if (statement.getCreated() != null) - ksRepCashRegisterSumsReport.setAddTime(LocalTime.ofInstant(statement.getCreated(), getReportZoneId())); - - InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection()); - if (inOutDirection == InOutDirection.in) { - ksRepCashRegisterSumsReport.setAddSum(statement.getAmount()); - } else if (inOutDirection == InOutDirection.out) { - ksRepCashRegisterSumsReport.setAddSum(statement.getAmount().negate()); - } else { - log.warn( - "Invalid statement.in_out_direction ({}). Statement id = {} skipped", - statement.getInOutDirection(), - statement.getId() - ); - continue; - } - - rows.add(ksRepCashRegisterSumsReport); - - } catch (Throwable e) { - log.error("Can't create report row for registry (id = %d), skipped".formatted(statement.getId()), e); - } + KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport(); + ksRepCashRegisterSumsReport.setFirmId(firmId); + ksRepCashRegisterSumsReport.setAccount(account); + ksRepCashRegisterSumsReport.setTkr(tkr); + ksRepCashRegisterSumsReport.setTradeNum(tradeNum); + ksRepCashRegisterSumsReport.setRegisterCode(registerCode); + ksRepCashRegisterSumsReport.setAddSum(addSum); + ksRepCashRegisterSumsReport.setAddTime(LocalTime.ofInstant(addTime, getReportZoneId())); + ksRepCashRegisterSumsReport.setAddDate(addDate); + rows.add(ksRepCashRegisterSumsReport); } } - - protected String parseCodeFromStatementComment(String comment) { - if (comment == null) - return null; - int i = comment.lastIndexOf("ТКР"); - String code = comment; - if (i >= 0) { - code = code.substring(i + 3).trim(); - } else { - return null; - } - i = -1; - for (String end : Arrays.asList(".", ";", " ")) { - int p = code.indexOf(end); - if (p > 0 && (i <= 0 || i > p)) i = p; - } - if (i > 0) { - code = code.substring(0, i); - } - return code; - } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegistersReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegistersReportBuilder.java index 7b98e2a18..680571cfa 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegistersReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegistersReportBuilder.java @@ -114,9 +114,22 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder registriesForAddWithdraw = registryImdg.getCollectionObjectsByPredicate( + pb.and( + registryPredicate, + pb.equals("securityId", registry.getSecurityId()), + pb.equals("accountId", registry.getAccountId()), + pb.equals("companyId", registry.getCompanyId()), + pb.equals("registryStatus", RegistryStatus.OK.getKey()), + pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), + pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)), + pb.notNull("balance") + ) + ); + BigDecimal addWithdraw = BigDecimal.ZERO; + for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance()); + ksRepCashRegistersReport.setAddWithdraw(addWithdraw); BigDecimal closeBalance = ksRepCashRegistersReport.getOpenBalance() .add(ksRepCashRegistersReport.getChangeBalance()) 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..c0f6ada38 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 @@ -68,7 +68,7 @@ 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(); + String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CS_T, RegistryTradingParams.LS_T).build(); ImdgPredicate finalPredicate = pb.and( pb.in("sessionId", sessionIds.toArray(new Long[0])), pb.equals("clearingDate", nowDate), @@ -86,39 +86,39 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder groupedRegistry = entry.getValue(); try { if (groupedRegistry.isEmpty()) { - log.warn("Empty OS_T and TS_T registries for {}. Registries with id = [{}] was skipped", + 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(", ")) ); continue; } - List tstRegistries = new ArrayList<>(); - List ostRegistries = new ArrayList<>(); + List cstRegistries = new ArrayList<>(); + List lstRegistries = new ArrayList<>(); Registry registry = null; for (Registry currRegistry : groupedRegistry) { registry = currRegistry; - if (RegistryDesignation.O.equalsByKey(currRegistry.getRegistryDesignation())) - ostRegistries.add(currRegistry); - if (RegistryDesignation.T.equalsByKey(currRegistry.getRegistryDesignation())) - tstRegistries.add(currRegistry); + if (RegistryDesignation.L.equalsByKey(currRegistry.getRegistryDesignation())) + lstRegistries.add(currRegistry); + if (RegistryDesignation.C.equalsByKey(currRegistry.getRegistryDesignation())) + cstRegistries.add(currRegistry); } boolean invalid = false; - if (!tstRegistries.isEmpty() || !ostRegistries.isEmpty()) { + if (!cstRegistries.isEmpty() || !lstRegistries.isEmpty()) { String sourceTradingCode = ""; - if (!tstRegistries.isEmpty()) sourceTradingCode = tstRegistries.iterator().next().getTradingCode(); - if (!ostRegistries.isEmpty()) sourceTradingCode = ostRegistries.iterator().next().getTradingCode(); - for (Registry currRegistry : tstRegistries) { + if (!cstRegistries.isEmpty()) sourceTradingCode = cstRegistries.iterator().next().getTradingCode(); + if (!lstRegistries.isEmpty()) sourceTradingCode = lstRegistries.iterator().next().getTradingCode(); + for (Registry currRegistry : cstRegistries) { if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue; invalid = true; - log.warn("Invalid TS_T registries set, tradingCode not equals. Registries was skipped"); + log.warn("Invalid CS_T registries set, tradingCode not equals. Registries was skipped"); break; } - for (Registry currRegistry : ostRegistries) { + for (Registry currRegistry : lstRegistries) { if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue; invalid = true; - log.warn("Invalid OS_T registries set, tradingCode not equals. Registries was skipped"); + log.warn("Invalid LS_T registries set, tradingCode not equals. Registries was skipped"); break; } if (invalid) continue; @@ -135,15 +135,15 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder { - private final Imdg statementImdg; private final Imdg registryImdg; private final Imdg companyImdg; - private final Imdg fixedIncomeSecurityImdg; - private final Imdg equitySecurityImdg; - private final Imdg moneyMarketSecurityImdg; private List rows = null; public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) { - statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); - equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); - moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); } @Override @@ -75,126 +62,55 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder statements = statementImdg.getCollectionObjectsByPredicate(finalPredicate); - log.debug("Found {} Statement by query: {}", statements.size(), finalPredicate); - - rows = new ArrayList<>(statements.size()); - for (Statement statement : statements) { - try { - Company company = companyImdg.getSingleObjectByID(statement.getAddresseeId()); - if (company == null) { - log.warn("For statement id = {} company with id = {} not found, statement was skipped", - statement.getId(), - statement.getAddresseeId()); - continue; - } - if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue; - - ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder(); - Collection registries = registryImdg.getCollectionObjectsByPredicate( - pbRegistry.and( - pbRegistry.equals("companyId", statement.getAddresseeId()), - pbRegistry.equals("account", statement.getAccount()), - pbRegistry.equals("accountType", AccountType.Depo.getKey()), - RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T).buildPredicate(pbRegistry), - pbRegistry.equals("securityId", statement.getSecurityId()) - ) - ); - if (registries.isEmpty()) { - log.warn( - "Can't find registry for companyId = {}, securityId = {} and account: {}. Statement id = {} skipped", - statement.getAddresseeId(), - statement.getSecurityId(), - statement.getAccount(), - statement.getId() - ); - continue; - } else if (registries.size() > 1) { - log.warn( - "More then one AS_T registry found for companyId = {}, securityId = {} and account: {}, statement id {}. Use first", - statement.getAddresseeId(), - statement.getSecurityId(), - statement.getAccount(), - statement.getId() - ); - } - Registry registry = registries.iterator().next(); - - Security security = getSecurityWithSecuritySymbolForId(statement.getSecurityId()); - if (security == null) { - log.warn( - "Can't find security for securityId = {}. Statement id = {} skipped", - statement.getSecurityId(), - statement.getId() - ); - continue; - } - - KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport(); - ksRepDepoRegisterQuantitiesReport.setFirmId(company.getTradingCode()); - ksRepDepoRegisterQuantitiesReport.setAccount(statement.getAccount()); - ksRepDepoRegisterQuantitiesReport.setTkr(registry.getTradingClearingRegistry()); - ksRepDepoRegisterQuantitiesReport.setSecurityId(security.getSecuritySymbol()); - ksRepDepoRegisterQuantitiesReport.setRegisterCode(registry.getRegistryCode()); - ksRepDepoRegisterQuantitiesReport.setAddDate(nowDate); - if (statement.getCreated() != null) - ksRepDepoRegisterQuantitiesReport.setAddTime(LocalTime.ofInstant(statement.getCreated(), getReportZoneId())); - - InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection()); - if (inOutDirection == InOutDirection.in) { - ksRepDepoRegisterQuantitiesReport.setAddQuantity(statement.getAmount()); - } else if (inOutDirection == InOutDirection.out) { - ksRepDepoRegisterQuantitiesReport.setAddQuantity(statement.getAmount().negate()); - } else { - log.warn( - "Invalid statement.in_out_direction ({}). Statement id = {} skipped", - statement.getInOutDirection(), - statement.getId() - ); - continue; - } - - rows.add(ksRepDepoRegisterQuantitiesReport); - } catch (Throwable e) { - log.error("Can't create report row for registry (id = %d), skipped".formatted(statement.getId()), e); + Collection registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); + log.debug("Found {} registries by query: {}", registries.size(), finalPredicate); + rows = new ArrayList<>(registries.size()); + for (Registry registry : registries) { + Company company = companyImdg.getSingleObjectByID(registry.getCompanyId()); + if (company == null) { + log.warn("For registry id = {} company with id = {} not found, registry was skipped", + registry.getId(), + registry.getCompanyId()); + continue; } + if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue; + + String firmId = registry.getTradingCode(); + String account = registry.getAccount(); + String tkr = registry.getTradingClearingRegistry(); + String tradeNum = ""; + String securityId = registry.getSecuritySymbol(); + String registerCode = registry.getRegistryCode(); + BigDecimal addQuantity = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO; + Instant addTime = registry.getUpdated(); + LocalDate addDate = LocalDate.now(); + + KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport(); + ksRepDepoRegisterQuantitiesReport.setFirmId(firmId); + ksRepDepoRegisterQuantitiesReport.setAccount(account); + ksRepDepoRegisterQuantitiesReport.setTkr(tkr); + ksRepDepoRegisterQuantitiesReport.setTradeNum(tradeNum); + ksRepDepoRegisterQuantitiesReport.setSecurityId(securityId); + ksRepDepoRegisterQuantitiesReport.setRegisterCode(registerCode); + ksRepDepoRegisterQuantitiesReport.setAddQuantity(addQuantity); + ksRepDepoRegisterQuantitiesReport.setAddTime(LocalTime.ofInstant(addTime, getReportZoneId())); + ksRepDepoRegisterQuantitiesReport.setAddDate(addDate); + rows.add(ksRepDepoRegisterQuantitiesReport); } + } - private Security getSecurityWithSecuritySymbolForId(Long securityId) { - Security security; - security = equitySecurityImdg.getFirstObjectByPredicate( - equitySecurityImdg.predicateBuilder().and( - equitySecurityImdg.predicateBuilder().equals("securityId", securityId), - equitySecurityImdg.predicateBuilder().notNull("securitySymbol") - ) - ); - if (security == null) { - security = fixedIncomeSecurityImdg.getFirstObjectByPredicate( - fixedIncomeSecurityImdg.predicateBuilder().and( - fixedIncomeSecurityImdg.predicateBuilder().equals("securityId", securityId), - fixedIncomeSecurityImdg.predicateBuilder().notNull("securitySymbol") - ) - ); - } - if (security == null) - security = moneyMarketSecurityImdg.getFirstObjectByPredicate( - moneyMarketSecurityImdg.predicateBuilder().and( - moneyMarketSecurityImdg.predicateBuilder().equals("securityId", securityId), - moneyMarketSecurityImdg.predicateBuilder().notNull("securitySymbol") - ) - ); - return security; - } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegistersReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegistersReportBuilder.java index b7d154b2c..d844a70e6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegistersReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegistersReportBuilder.java @@ -69,9 +69,9 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder registriesForAddWithdraw = registryImdg.getCollectionObjectsByPredicate( + pb.and( + registryPredicate, + pb.equals("securityId", registry.getSecurityId()), + pb.equals("accountId", registry.getAccountId()), + pb.equals("companyId", registry.getCompanyId()), + pb.equals("registryStatus", RegistryStatus.OK.getKey()), + pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), + pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)), + pb.notNull("balance") + ) + ); + BigDecimal addWithdraw = BigDecimal.ZERO; + for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance()); + ksRepDepoRegistersReport.setAddWithdrawDepo(addWithdraw); BigDecimal closeBalance = ksRepDepoRegistersReport.getOpenQuantity() .add(ksRepDepoRegistersReport.getChangeQuantity()) diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegisterSumsReportBuilderTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegisterSumsReportBuilderTest.java deleted file mode 100644 index b9ec67e23..000000000 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegisterSumsReportBuilderTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.spcex.clearing.reports.reports.ks; - -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import static org.junit.jupiter.api.Assertions.*; - -class KSRepCashRegisterSumsReportBuilderTest { - - @Test - void parseCodeFromStatementComment() { - KSRepCashRegisterSumsReportBuilder reportB = new KSRepCashRegisterSumsReportBuilder(Mockito.mock(ImdgProvider.class)); - assertNull(reportB.parseCodeFromStatementComment(null)); - assertEquals(null, reportB.parseCodeFromStatementComment("")); - assertEquals(null, reportB.parseCodeFromStatementComment(" TTTAAA ")); - assertEquals("0045CAT00001", reportB.parseCodeFromStatementComment("Возврат на депозит №DSTAA10S003/150923/45/23091500000008 по ТКР 0045CAT00001")); - assertEquals("0574MAT00001", reportB.parseCodeFromStatementComment("Вывод средств по ТКР 0574MAT00001. Поручения 777.")); - assertEquals("0574MAT00001", reportB.parseCodeFromStatementComment("ТКР 0574MAT00001")); - assertEquals("0574MAT00001", reportB.parseCodeFromStatementComment("ТКР0574MAT00001")); - assertEquals("", reportB.parseCodeFromStatementComment("ТКР")); - } -} \ No newline at end of file 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 ce94d4407..b223b9199 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 @@ -129,6 +129,8 @@ public class ReportServiceTest_KS { Registry registry = new Registry(); registry.setCompanyId(COMPANY_ID); + registry.setSecurityId(777L); + registry.setAccountId(888L); registry.setRegistryCode("AM_T"); registry.setRegistryDesignation(RegistryDesignation.A.getKey()); registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); @@ -146,6 +148,48 @@ public class ReportServiceTest_KS { registry.setCloseBalance(BigDecimal.valueOf(11.11111111)); registryImdg.insert(registry); + Registry addWithdrawRegistry_1 = new Registry(); + addWithdrawRegistry_1.setCompanyId(COMPANY_ID); + addWithdrawRegistry_1.setSecurityId(777L); + addWithdrawRegistry_1.setAccountId(888L); + addWithdrawRegistry_1.setRegistryStatus(RegistryStatus.OK.getKey()); + addWithdrawRegistry_1.setRegistryCode("DMAI"); + addWithdrawRegistry_1.setRegistryDesignation(RegistryDesignation.D.getKey()); + addWithdrawRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + addWithdrawRegistry_1.setRegistryCapacity(RegistryCapacity.A.getKey()); + addWithdrawRegistry_1.setRegistryUnit(RegistryUnit.I.getKey()); + addWithdrawRegistry_1.setUpdated(Instant.now()); + addWithdrawRegistry_1.setBalance(BigDecimal.TEN); + registryImdg.insert(addWithdrawRegistry_1); + + Registry addWithdrawRegistry_2 = new Registry(); + addWithdrawRegistry_2.setCompanyId(COMPANY_ID); + addWithdrawRegistry_2.setSecurityId(777L); + addWithdrawRegistry_2.setAccountId(888L); + addWithdrawRegistry_2.setRegistryStatus(RegistryStatus.OK.getKey()); + addWithdrawRegistry_2.setRegistryCode("DMAI"); + addWithdrawRegistry_2.setRegistryDesignation(RegistryDesignation.D.getKey()); + addWithdrawRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + addWithdrawRegistry_2.setRegistryCapacity(RegistryCapacity.A.getKey()); + addWithdrawRegistry_2.setRegistryUnit(RegistryUnit.I.getKey()); + addWithdrawRegistry_2.setUpdated(Instant.now()); + addWithdrawRegistry_2.setBalance(BigDecimal.ONE); + registryImdg.insert(addWithdrawRegistry_2); + + Registry addWithdrawRegistry_3 = new Registry(); + addWithdrawRegistry_3.setCompanyId(COMPANY_ID); + addWithdrawRegistry_3.setSecurityId(777L); + addWithdrawRegistry_3.setAccountId(888L); + addWithdrawRegistry_3.setRegistryStatus(RegistryStatus.OK.getKey()); + addWithdrawRegistry_3.setRegistryCode("DMAI"); + addWithdrawRegistry_3.setRegistryDesignation(RegistryDesignation.D.getKey()); + addWithdrawRegistry_3.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + addWithdrawRegistry_3.setRegistryCapacity(RegistryCapacity.A.getKey()); + addWithdrawRegistry_3.setRegistryUnit(RegistryUnit.I.getKey()); + addWithdrawRegistry_3.setUpdated(Instant.now()); + addWithdrawRegistry_3.setBalance(BigDecimal.valueOf(100L)); + registryImdg.insert(addWithdrawRegistry_3); + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), @@ -162,6 +206,9 @@ public class ReportServiceTest_KS { registryCodeDictionaryImdg.delete(registryCodeDictionary); registryImdg.delete(registry); + registryImdg.delete(addWithdrawRegistry_1); + registryImdg.delete(addWithdrawRegistry_2); + registryImdg.delete(addWithdrawRegistry_3); } @Test @@ -173,39 +220,18 @@ public class ReportServiceTest_KS { reportRequest.setReportId(ReportBuilderType.KS_REP_CASH_REGISTER_SUMS.getKey()); Registry registry_1 = new Registry(); + registry_1.setUpdated(Instant.now()); + registry_1.setRegistryStatus(RegistryStatus.OK.getKey()); + registry_1.setTradingCode("TRADING_CODE"); + registry_1.setTradingClearingRegistry("0008CAT00001"); registry_1.setCompanyId(COMPANY_ID); registry_1.setAccount("ACCOUNT"); - registry_1.setAccountType(AccountType.Clrn.getKey()); - registry_1.setRegistryCode("AM_T"); - registry_1.setRegistryDesignation("A"); + registry_1.setRegistryCode("DM_I"); + registry_1.setRegistryDesignation("D"); registry_1.setRegistryInstrumentType("M"); - registry_1.setRegistryUnit("T"); - registry_1.setTradingClearingRegistry("0008CAT00001"); + registry_1.setRegistryUnit("I"); registryImdg.insert(registry_1); - TradingClearingRegistry tkr = new TradingClearingRegistry(); - tkr.setMoneyAccountId(777L); - tkr.setCode("0008CAT00001"); - tkr.setCompanyId(COMPANY_ID); - tradingClearingRegistryImdg.insert(tkr); - - Account account = new Account(); - account.setAccountType(AccountType.Info.getKey()); - account.setAccount("ACCOUNT"); - Long accountId = accountImdg.insert(account); - - Statement statement_1 = new Statement(); - statement_1.setAddresseeId(COMPANY_ID); - statement_1.setAccount("ACCOUNT"); - statement_1.setAccountId(accountId); - statement_1.setInOutDirection(InOutDirection.in.getKey()); - statement_1.setInOutSDfType(InOutSDfType.type57.getKey()); - statement_1.setOperationStatus(OperationStatus.Executed.getKey()); - statement_1.setAmount(BigDecimal.valueOf(7777.777777777)); - statement_1.setCreated(Instant.now()); - statement_1.setComment("Зачислить на ТКР 0008CAT00001"); - statementImdg.insert(statement_1); - String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), @@ -221,9 +247,6 @@ public class ReportServiceTest_KS { compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME")); registryImdg.delete(registry_1); - statementImdg.delete(statement_1); - tradingClearingRegistryImdg.delete(tkr); - accountImdg.delete(account); } @Test @@ -241,7 +264,10 @@ public class ReportServiceTest_KS { Registry registry = new Registry(); registry.setCompanyId(COMPANY_ID); + registry.setSecurityId(777L); + registry.setAccountId(888L); registry.setRegistryCode("AS_T"); + registry.setSecuritySymbol("SECURITY_SYMBOL"); registry.setRegistryDesignation(RegistryDesignation.A.getKey()); registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry.setRegistryUnit(RegistryUnit.T.getKey()); @@ -258,6 +284,48 @@ public class ReportServiceTest_KS { registry.setCloseBalance(BigDecimal.valueOf(11.11111111)); registryImdg.insert(registry); + Registry addWithdrawRegistry_1 = new Registry(); + addWithdrawRegistry_1.setCompanyId(COMPANY_ID); + addWithdrawRegistry_1.setSecurityId(777L); + addWithdrawRegistry_1.setAccountId(888L); + addWithdrawRegistry_1.setRegistryStatus(RegistryStatus.OK.getKey()); + addWithdrawRegistry_1.setRegistryCode("DMAI"); + addWithdrawRegistry_1.setRegistryDesignation(RegistryDesignation.D.getKey()); + addWithdrawRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + addWithdrawRegistry_1.setRegistryCapacity(RegistryCapacity.A.getKey()); + addWithdrawRegistry_1.setRegistryUnit(RegistryUnit.I.getKey()); + addWithdrawRegistry_1.setUpdated(Instant.now()); + addWithdrawRegistry_1.setBalance(BigDecimal.TEN); + registryImdg.insert(addWithdrawRegistry_1); + + Registry addWithdrawRegistry_2 = new Registry(); + addWithdrawRegistry_2.setCompanyId(COMPANY_ID); + addWithdrawRegistry_2.setSecurityId(777L); + addWithdrawRegistry_2.setAccountId(888L); + addWithdrawRegistry_2.setRegistryStatus(RegistryStatus.OK.getKey()); + addWithdrawRegistry_2.setRegistryCode("DMAI"); + addWithdrawRegistry_2.setRegistryDesignation(RegistryDesignation.D.getKey()); + addWithdrawRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + addWithdrawRegistry_2.setRegistryCapacity(RegistryCapacity.A.getKey()); + addWithdrawRegistry_2.setRegistryUnit(RegistryUnit.I.getKey()); + addWithdrawRegistry_2.setUpdated(Instant.now()); + addWithdrawRegistry_2.setBalance(BigDecimal.ONE); + registryImdg.insert(addWithdrawRegistry_2); + + Registry addWithdrawRegistry_3 = new Registry(); + addWithdrawRegistry_3.setCompanyId(COMPANY_ID); + addWithdrawRegistry_3.setSecurityId(777L); + addWithdrawRegistry_3.setAccountId(888L); + addWithdrawRegistry_3.setRegistryStatus(RegistryStatus.OK.getKey()); + addWithdrawRegistry_3.setRegistryCode("DMAI"); + addWithdrawRegistry_3.setRegistryDesignation(RegistryDesignation.D.getKey()); + addWithdrawRegistry_3.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + addWithdrawRegistry_3.setRegistryCapacity(RegistryCapacity.A.getKey()); + addWithdrawRegistry_3.setRegistryUnit(RegistryUnit.I.getKey()); + addWithdrawRegistry_3.setUpdated(Instant.now()); + addWithdrawRegistry_3.setBalance(BigDecimal.valueOf(100L)); + registryImdg.insert(addWithdrawRegistry_3); + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), @@ -274,6 +342,9 @@ public class ReportServiceTest_KS { registryCodeDictionaryImdg.delete(registryCodeDictionary); registryImdg.delete(registry); + registryImdg.delete(addWithdrawRegistry_1); + registryImdg.delete(addWithdrawRegistry_2); + registryImdg.delete(addWithdrawRegistry_3); } @Test @@ -285,34 +356,20 @@ public class ReportServiceTest_KS { reportRequest.setReportId(ReportBuilderType.KS_REP_DEPO_REGISTER_QUANTITIES.getKey()); Registry registry_1 = new Registry(); + registry_1.setUpdated(Instant.now()); + registry_1.setSecuritySymbol("SECURITY_SYMBOL"); + registry_1.setRegistryStatus(RegistryStatus.OK.getKey()); + registry_1.setTradingCode("TRADING_CODE"); + registry_1.setTradingClearingRegistry("0008CAT00001"); registry_1.setCompanyId(COMPANY_ID); registry_1.setAccount("ACCOUNT"); - registry_1.setTradingClearingRegistry("TRADING_CLEARING_REGISTRY"); - registry_1.setAccountType(AccountType.Depo.getKey()); - registry_1.setRegistryCode("AS_T"); - registry_1.setRegistryDesignation("A"); + registry_1.setRegistryCode("DS_I"); + registry_1.setRegistryDesignation("D"); registry_1.setRegistryInstrumentType("S"); - registry_1.setRegistryUnit("T"); - registry_1.setSecurityId(777L); - + registry_1.setRegistryUnit("I"); + registry_1.setBalance(BigDecimal.TEN); registryImdg.insert(registry_1); - EquitySecurity equitySecurity = new EquitySecurity(); - equitySecurity.setSecuritySymbol("value"); - equitySecurity.setSecurityId(777L); - equitySecurityImdg.insert(equitySecurity); - - Statement statement_1 = new Statement(); - statement_1.setAddresseeId(COMPANY_ID); - statement_1.setAccount("ACCOUNT"); - statement_1.setInOutDirection(InOutDirection.in.getKey()); - statement_1.setInOutSDfType(InOutSDfType.type21.getKey()); - statement_1.setOperationStatus(OperationStatus.Executed.getKey()); - statement_1.setAmount(BigDecimal.valueOf(7777.777777777)); - statement_1.setCreated(Instant.now()); - statement_1.setSecurityId(777L); - statementImdg.insert(statement_1); - String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), @@ -328,8 +385,6 @@ public class ReportServiceTest_KS { compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME")); registryImdg.delete(registry_1); - equitySecurityImdg.delete(equitySecurity); - statementImdg.delete(statement_1); } @Test @@ -434,9 +489,9 @@ public class ReportServiceTest_KS { registry_1.setSettlementDate(LocalDate.now()); registry_1.setGroupId(Long.MAX_VALUE); registry_1.setClearingDate(LocalDate.now()); - registry_1.setRegistryCode("OM_T"); + registry_1.setRegistryCode("LM_T"); registry_1.setRegistryStatus(RegistryStatus.PROC.getKey()); - registry_1.setRegistryDesignation(RegistryDesignation.O.getKey()); + registry_1.setRegistryDesignation(RegistryDesignation.L.getKey()); registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); registry_1.setRegistryUnit(RegistryUnit.T.getKey()); registry_1.setSessionId(sessionId); @@ -450,9 +505,9 @@ public class ReportServiceTest_KS { registry_2.setSettlementDate(LocalDate.now()); registry_2.setGroupId(Long.MAX_VALUE); registry_2.setClearingDate(LocalDate.now()); - registry_2.setRegistryCode("TM_T"); + registry_2.setRegistryCode("CM_T"); registry_2.setRegistryStatus(RegistryStatus.PROC.getKey()); - registry_2.setRegistryDesignation(RegistryDesignation.T.getKey()); + registry_2.setRegistryDesignation(RegistryDesignation.C.getKey()); registry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); registry_2.setRegistryUnit(RegistryUnit.T.getKey()); registry_2.setSessionId(sessionId); @@ -498,8 +553,8 @@ public class ReportServiceTest_KS { registry_1.setClearingDate(LocalDate.now()); registry_1.setGroupId(Long.MAX_VALUE); registry_1.setSettlementDate(LocalDate.now()); - registry_1.setRegistryCode("TS_T"); - registry_1.setRegistryDesignation(RegistryDesignation.T.getKey()); + registry_1.setRegistryCode("CS_T"); + registry_1.setRegistryDesignation(RegistryDesignation.C.getKey()); registry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry_1.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_1.setRegistryUnit(RegistryUnit.T.getKey()); @@ -515,8 +570,8 @@ public class ReportServiceTest_KS { registry_2.setClearingDate(LocalDate.now()); registry_2.setGroupId(Long.MAX_VALUE); registry_2.setSettlementDate(LocalDate.now()); - registry_2.setRegistryCode("OS_T"); - registry_2.setRegistryDesignation(RegistryDesignation.O.getKey()); + registry_2.setRegistryCode("LS_T"); + registry_2.setRegistryDesignation(RegistryDesignation.L.getKey()); registry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry_2.setRegistryUnit(RegistryUnit.T.getKey()); registry_2.setRegistryStatus(RegistryStatus.PROC.getKey()); diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv index 516c29866..fa10ee654 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv @@ -1,2 +1,2 @@ "FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","VALUE","DATE" -"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","22.22","07.07.2023" +"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","22.22","02.10.2023" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv index c35bdee4f..679b960c6 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv @@ -1,2 +1,2 @@ "FIRMID","ACCOUNT","TKR","DATE","REGISTER_CODE","REGISTER_NAME","OPEN_BALANCE","CHANGE_BALANCE","ADD_WITHDRAW","CLOSE_BALANCE","REMARKS","TRADE_NUM" -"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","01.08.2023","AM_T","AM_T_NAME","77.78","66.67","66.67","211.11","","" +"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","02.10.2023","AM_T","AM_T_NAME","77.78","66.67","111.00","255.44","","" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv index 73425c69a..8ccfdd127 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv @@ -1,2 +1,2 @@ "FIRMID","ACCOUNT","TKR","REGISTER_CODE","ADD_SUM","ADD_TIME","ADD_DATE","TRADE_NUM" -"1","","0008CAT00001","AM_T","7777.78","15:49:30","01.08.2023","" +"TRADING_CODE","ACCOUNT","0008CAT00001","DM_I","0.00","13:02:50","02.10.2023","" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv index a2140ad54..e2345d222 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv @@ -1,2 +1,2 @@ "FIRMID","ACCOUNT","TKR","DATE","SECURITYID","REGISTER_CODE","REGISTER_NAME","OPEN_QUANTITY","CHANGE_QUANTITY","ADD_WITHDRAW_DEPO","CLOSE_QUANTITY","REMARKS","TRADE_NUM" -"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","01.08.2023","","AS_T","AS_T_NAME","78","67","67","211","","" +"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","02.10.2023","SECURITY_SYMBOL","AS_T","AS_T_NAME","78","67","111","255","","" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv index 526f4f940..c26be1cc2 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv @@ -1,2 +1,2 @@ "FIRMID","ACCOUNT","TKR","SECURITYID","REGISTER_CODE","ADD_QUANTITY","ADD_TIME","ADD_DATE","TRADE_NUM" -"1","ACCOUNT","TRADING_CLEARING_REGISTRY","value","AS_T","7778","15:52:33","01.08.2023","" +"TRADING_CODE","ACCOUNT","0008CAT00001","SECURITY_SYMBOL","DS_I","10","13:55:53","02.10.2023","" diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java index b427a4aa2..42c07d279 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java @@ -105,6 +105,7 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation, public final static RegistryTradingParams CM__; public final static RegistryTradingParams LM__; public final static RegistryTradingParams DMAU; + public final static RegistryTradingParams DMAI; public final static RegistryTradingParams D__I; public final static RegistryTradingParams D__V; @@ -218,6 +219,10 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.U); + DMAI = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.M, + RegistryCapacity.A, + RegistryUnit.I); DS_I = new RegistryTradingParams(RegistryDesignation.D, RegistryInstrumentType.S, null, From d2cf49b7c8c033553ef955077b36ad436ef92561 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 2 Oct 2023 17:09:48 +0300 Subject: [PATCH 35/37] http://jira.mfd.msk:8088/browse/CLS-497 --- .../reports/bp/ExecutedDealReportBuilder_INFTYPE_1.java | 8 +++++++- .../reports/bp/ExecutedDealReportBuilder_INFTYPE_2.java | 8 +++++++- .../reports/bp/ExecutedDealReportBuilder_INFTYPE_3.java | 6 +++++- .../reports/bp/ExecutedDealReportBuilder_INFTYPE_4.java | 6 +++++- .../reports/reports/bp/UnfulfilledDealReportBuilder.java | 6 +++++- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_1.java index 272ac42ae..e1b45f4e9 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_1.java @@ -3,6 +3,8 @@ package ru.spcex.clearing.reports.reports.bp; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.spcex.clearing.reports.reports.SessionIdParam; +import ru.spcex.platform.enumeration.CoverageStatus; +import ru.spcex.platform.enumeration.MoneyFlowSide; import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -36,7 +38,11 @@ public class ExecutedDealReportBuilder_INFTYPE_1 extends ExecutedDealReportBuild pb.notNull("sessionId"), pb.less("tradingDate", LocalDate.now()), pb.equals("settlementDate", LocalDate.now()), - pb.equals("side", Side.SELL.getKey()) + pb.or( + pb.equals("side", Side.SELL.getKey()), + pb.equals("side", MoneyFlowSide.SELL.getKey()) + ), + pb.equals("coverageStatus", CoverageStatus.ALWD) ) ); } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_2.java index ca795e318..f75818369 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_2.java @@ -3,6 +3,8 @@ package ru.spcex.clearing.reports.reports.bp; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.spcex.clearing.reports.reports.SessionIdParam; +import ru.spcex.platform.enumeration.CoverageStatus; +import ru.spcex.platform.enumeration.MoneyFlowSide; import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -36,7 +38,11 @@ public class ExecutedDealReportBuilder_INFTYPE_2 extends ExecutedDealReportBuild pb.notNull("sessionId"), pb.equals("tradingDate", LocalDate.now()), pb.equals("settlementDate", LocalDate.now()), - pb.equals("side", Side.SELL.getKey()) + pb.or( + pb.equals("side", Side.SELL.getKey()), + pb.equals("side", MoneyFlowSide.SELL.getKey()) + ), + pb.equals("coverageStatus", CoverageStatus.ALWD) ) ); } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_3.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_3.java index ba5bfb406..0aaa6b7cd 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_3.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_3.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.reports.reports.bp; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.spcex.clearing.reports.reports.SessionIdParam; +import ru.spcex.platform.enumeration.MoneyFlowSide; import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -34,7 +35,10 @@ public class ExecutedDealReportBuilder_INFTYPE_3 extends ExecutedDealReportBuild return executionFondImdg.getCollectionObjectsByPredicate( pb.and( pb.greater("settlementDate", LocalDate.now()), - pb.equals("side", Side.SELL.getKey()) + pb.or( + pb.equals("side", Side.SELL.getKey()), + pb.equals("side", MoneyFlowSide.SELL.getKey()) + ) ) ); } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_4.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_4.java index c353ec60d..ca00f76b1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_4.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_4.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.spcex.clearing.reports.reports.SessionIdParam; import ru.spcex.platform.enumeration.Allowed; +import ru.spcex.platform.enumeration.MoneyFlowSide; import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -36,7 +37,10 @@ public class ExecutedDealReportBuilder_INFTYPE_4 extends ExecutedDealReportBuild pb.and( pb.equals("coverageStatus", Allowed.DENIED.getKey()), pb.equals("settlementDate", LocalDate.now()), - pb.equals("side", Side.SELL.getKey()) + pb.or( + pb.equals("side", Side.SELL.getKey()), + pb.equals("side", MoneyFlowSide.SELL.getKey()) + ) ) ); } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java index def911739..0e3ac7758 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java @@ -66,9 +66,13 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate); + log.debug("Found {} ExecutionFond by query: {}", executionFonds.size(), predicate); rows = new ArrayList<>(executionFonds.size()); for (ExecutionFond executionFond : executionFonds) { From 6d5e5fd00e2ddb4dc6ef93c7b1e0f7df89836c65 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 2 Oct 2023 18:10:29 +0300 Subject: [PATCH 36/37] split deposit contract index and parentId --- .../clearing/config/ValidationConfig.java | 3 +- .../clearing/service/RegistryService.java | 18 +++++-- .../SplitDepositRequestValidationRule.java | 47 +++++++++++++++++++ .../service/validation/ValidationStored.java | 2 +- 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index dcf29e677..fd20f8b54 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -412,7 +412,8 @@ public class ValidationConfig { IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class, ClearingError.RequiredFieldEmpty, ClearingError.DictionaryNotFound, false), SplitDepositRequestValidationRule.PositiveAmount, - SplitDepositRequestValidationRule.CrossvalidateByRegistry + SplitDepositRequestValidationRule.CrossvalidateByRegistry, + SplitDepositRequestValidationRule.LoadContractIndexes ); }; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index 4c4455891..bb15afb9b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -52,7 +52,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; -import java.util.function.Supplier; import java.util.stream.Stream; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @@ -498,6 +497,7 @@ public class RegistryService { return roleCheck; } Collection baseRegistrys; + Integer index; { IValidator validator = splitDepositActionVal.apply(requestPayload); Optional err = validator.tillFirstError(); @@ -508,6 +508,8 @@ public class RegistryService { return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(err.get())); } baseRegistrys = validator.getStored(ValidationStored.RegistrysByContract); + index = validator.getStored(ValidationStored.SplitDepositMaxNumber); + if (index == null) index = 0; } ImdgTransaction txCtx = imdgProvider.newTransaction(); @@ -524,6 +526,13 @@ public class RegistryService { log.debug("Process {} for {} registry", direction, baseRegistrys.size()); Long groupId = null; for (Registry baseRegistry : baseRegistrys) { + String cntrctWithoutTilda; + { + cntrctWithoutTilda = baseRegistry.getContract(); + if (cntrctWithoutTilda.contains("~")) { + cntrctWithoutTilda = cntrctWithoutTilda.substring(0, cntrctWithoutTilda.indexOf("~")); + } + } log.trace("Registry[{}], groupId={}, ClearingCode={}", baseRegistry.getId(), baseRegistry.getGroupId(), baseRegistry.getClearingCode()); if (groupId == null) groupId = baseRegistry.getGroupId(); @@ -542,9 +551,9 @@ public class RegistryService { } else { log.warn("Direction not set, do not change Balance"); } - firstRegistry.setContract(baseRegistry.getContract() + "~1"); + firstRegistry.setContract(cntrctWithoutTilda + "~" + (index + 1)); + firstRegistry.setParentId(baseRegistry.getId()); registryTMap.insert(firstRegistry); - // 2. Вторая группа Registry secondRegistry = null; if (InOutDirection.out == direction) { @@ -553,9 +562,10 @@ public class RegistryService { secondRegistry.setCreated(now); secondRegistry.setUpdated(null); secondRegistry.setBalance(requestPayload.getOutboundAmount()); - secondRegistry.setContract(baseRegistry.getContract() + "~2"); + secondRegistry.setContract(cntrctWithoutTilda + "~" + (index + 2)); secondRegistry.setRefundDate(requestPayload.getRefundDate()); secondRegistry.setSettlementDate(requestPayload.getRefundDate()); + secondRegistry.setParentId(baseRegistry.getId()); registryTMap.insert(secondRegistry); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/SplitDepositRequestValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/SplitDepositRequestValidationRule.java index 1d913eb65..aca9efe29 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/SplitDepositRequestValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/SplitDepositRequestValidationRule.java @@ -14,12 +14,14 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidationRule; import java.math.BigDecimal; import java.util.Collection; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; public enum SplitDepositRequestValidationRule implements IValidationRule> { PositiveAmount() { @@ -78,6 +80,51 @@ public enum SplitDepositRequestValidationRule implements IValidationRule validate(ImdgValidationContext context) { + Imdg registryImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); + RegistrySplitDepositActionRequest validatedObject = context.getValidatedObject(); + String contract = validatedObject.getContract(); + if (TextUtil.isEmpty(contract)) { + return of(ClearingError.WrongField, "contract"); + } + String cntrSrch; + int i = contract.indexOf("~"); + if (i == -1) { + context.storeObject(ValidationStored.SplitDepositMaxNumber, 0); + return empty(); + } else { + cntrSrch = contract.substring(0, i); + } + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate allContracts = pb.and( + pb.or(pb.equals("registryStatus", RegistryStatus.PROC.getKey()), pb.equals("registryStatus", RegistryStatus.MNG.getKey())), + pb.or(pb.equals("registryDesignation", RegistryDesignation.O.getKey()), pb.equals("registryDesignation", RegistryDesignation.T.getKey())), + pb.equals("registryUnit", RegistryUnit.T.getKey()), + pb.regex("contract", cntrSrch + ".*") + ); + Collection rgss = registryImdg.getCollectionObjectsByPredicate(allContracts); + Integer maxContractNumber = rgss.stream() + .map(Registry::getContract) + .filter(c -> c.contains("~")) + .map(c -> c.substring(c.lastIndexOf("~") + 1)) + .flatMap(number -> { + try { + return Stream.of(Integer.valueOf(number)); + } catch (NumberFormatException e) { + return Stream.empty(); + } + }) + .max(Integer::compareTo) + .orElse(0); + if (maxContractNumber == 0) { + log.warn("contract {} contains '~' but no maximum number was extracted", contract); + } + context.storeObject(ValidationStored.SplitDepositMaxNumber, maxContractNumber); return empty(); } }; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java index 057aecc58..115f28e5c 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java @@ -32,5 +32,5 @@ public enum ValidationStored { SecurityBySecurityCode, - RegistrysByContract + RegistrysByContract, SplitDepositMaxNumber } From afdfa0d6d6abba5982a98c946c772e52b01f6c06 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 2 Oct 2023 18:40:26 +0300 Subject: [PATCH 37/37] http://jira.mfd.msk:8088/browse/CLS-280 npe possible fix --- .../service/ExecutionRegisterService.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java index 92451a125..36af7c2c8 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java @@ -131,12 +131,18 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ amount = executionDeposit.getFirstLegAmount(); } - TradingClearingRegistry tkrForCounterPartyTkrId = tradingClearingRegistryMap.getSingleObjectByID( - common.getCounterPartyTradingClearingRegistryId() - ); - TradingClearingRegistry tkrForTkrId = tradingClearingRegistryMap.getSingleObjectByID( - common.getTradingClearingRegistryId() - ); + TradingClearingRegistry tkrForCounterPartyTkrId = null; + if (common.getCounterPartyTradingClearingRegistryId() != null) { + tkrForCounterPartyTkrId = tradingClearingRegistryMap.getSingleObjectByID( + common.getCounterPartyTradingClearingRegistryId() + ); + } + TradingClearingRegistry tkrForTkrId = null; + if (common.getTradingClearingRegistryId() != null) { + tkrForTkrId = tradingClearingRegistryMap.getSingleObjectByID( + common.getTradingClearingRegistryId() + ); + } Account moneyAccountForCounterPartyTkrId = null; Account depoAccountForCounterPartyTkrId = null; if (tkrForCounterPartyTkrId != null) {