diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index 639971466..fa27e7e4b 100644 --- a/clearing-parent/gateway-api/pom.xml +++ b/clearing-parent/gateway-api/pom.xml @@ -61,6 +61,21 @@ ru.spcex.clearing clearing-validation + + org.junit.jupiter + junit-jupiter + test + + + org.springframework + spring-test + test + + + ru.spcex.clearing + test-clearing + test + diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/companies/CheckMemberCompanyExist.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/companies/CheckMemberCompanyExist.java index 7dc7715e6..68593e60b 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/companies/CheckMemberCompanyExist.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/companies/CheckMemberCompanyExist.java @@ -14,11 +14,12 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; 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 java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.stream.Collectors; public class CheckMemberCompanyExist extends Stage { @@ -52,109 +53,35 @@ public class CheckMemberCompanyExist extends Stage { List companyList = param.getMemberCompanyList(); for (MemberCompany company : companyList) { - boolean companyFound = false; List companySymbolsList = company.getMemberCompanySymbolsList(); - // Пытаемся найти компанию по UUID - Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( - Map.of( - "companySymbol", "UUID", - "companySymbolValue", company.getId() - ) - ); - if (!companySymbolsFromImdg.isEmpty()) { - CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); - if (companySymbolsFromImdg.size() > 1) { - log.warn("For UUID = {} > 1 company_symbols, update first (id = {})", company.getId(), companySymbolFromImdg.getId()); - } - companyFound = true; - company.setAlreadyExist(true); - company.setMapId(companySymbolFromImdg.getId()); + Map companySymbolMap = new HashMap<>(); + for (MemberCompanySymbols memberCompanySymbol : companySymbolsList) { + if ( + !memberCompanySymbol.isInvalidData() && + !CompanySymbol.CIO.equalsByKey(memberCompanySymbol.getCompanySymbol()) && + !CompanySymbol.INN.equalsByKey(memberCompanySymbol.getCompanySymbol()) + ) continue; + companySymbolMap.put(IEnumKey.getEnumByKey(CompanySymbol.class, memberCompanySymbol.getCompanySymbol()), memberCompanySymbol.getCompanySymbolValue()); } + Long companyId = getCompanyIdForCompanySymbols(company.getId().toString(), companySymbolMap); - // Если по UUID не нашли, пытаемся найти по INN или CIO - List companySymbolsListINNorCIO = companySymbolsList.stream() - .filter(issuerCompanySymbols -> - !issuerCompanySymbols.isInvalidData() && - ( - CompanySymbol.CIO.equalsByKey(issuerCompanySymbols.getCompanySymbol()) || - CompanySymbol.INN.equalsByKey(issuerCompanySymbols.getCompanySymbol()) - ) - ).collect(Collectors.toList()); - - // Для компании не найдены реквизиты, значит создаем новую компанию - if (companySymbolsListINNorCIO.isEmpty()) { + if (companyId != null) { + company.setAlreadyExist(true); + company.setMapId(companyId); + } else { company.setAlreadyExist(false); continue; } - // Реквизиты найдены, ищем по ним company.id - for (MemberCompanySymbols companySymbols : companySymbolsListINNorCIO) { + // Проверяем реквизиты на необходимость обновления + for (MemberCompanySymbols companySymbols : companySymbolsList) { if (companySymbols.isInvalidData()) continue; - companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( + Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( Map.of( - "companySymbol", companySymbols.getCompanySymbol(), - "companySymbolValue", companySymbols.getCompanySymbolValue() - ) - ); - if (companySymbolsFromImdg.isEmpty()) { - companySymbols.setAlreadyExist(false); - } else { - if (companySymbolsFromImdg.size() > 1) - log.warn("For {} found > 1 company_symbols, use first", companySymbols.getCompanySymbol()); - - CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); - Company companyFromImdg = companyImdg.getSingleObjectByID(companySymbolFromImdg.getCompanyId()); - if (companyFromImdg == null) { - - // Случай, когда реквизиты есть, а компании нет (по сути данных ошибка в мапе) - log.warn("For own company_symbols (id = {}) company not found", companySymbolFromImdg.getId()); - companySymbols.setAlreadyExist(false); - continue; - - } else if (companyFound) { - - // Случай, когда по переданным реквизитам найдено несколько компании - if (!Objects.equals(company.getMapId(), companyFromImdg.getId())) { - log.warn("For company_symbols (company.UUID = {}, {} = {}) found > 1 company (company.id = {}), " + - "company_symbols skipped", - company.getId(), - companySymbols.getCompanySymbol(), - companySymbols.getCompanySymbolValue(), - companyFromImdg.getId()); - companySymbols.setInvalidData(true); - continue; - } - - } else { - - // Самый вероятный случай: компания найдена по реквизитам - companyFound = true; - company.setAlreadyExist(true); - company.setMapId(companyFromImdg.getId()); - } - - companySymbols.setAlreadyExist(true); - companySymbols.setMapId(companySymbolsFromImdg.iterator().next().getId()); - } - } - - // Если компания реквизиты есть, а компании нет. Маловероятный кейс - if (!companyFound) { - company.setAlreadyExist(false); - continue; - } - - // Проверяем оставшиеся реквизиты на необходимость обновления - for (MemberCompanySymbols companySymbols : companySymbolsList) { - if (companySymbols.isInvalidData() || companySymbols.getMapId() == null) continue; - - companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( - Map.of( - "companyId", company.getMapId(), - "companySymbol", companySymbols.getCompanySymbol(), - "companySymbolValue", companySymbols.getCompanySymbolValue() + "companyId", companyId, + "companySymbol", companySymbols.getCompanySymbol() ) ); if (companySymbolsFromImdg.isEmpty()) { @@ -181,7 +108,7 @@ public class CheckMemberCompanyExist extends Stage { Collection contactsFromImdg = contactImdg.getCollectionObjectsByFieldValues( Map.of( - "companyId", company.getMapId(), + "companyId", companyId, "contactType", contact.getContactType() ) ); @@ -205,7 +132,7 @@ public class CheckMemberCompanyExist extends Stage { Collection profileDocumentsFromImdg = profileDocumentImdg.getCollectionObjectsByFieldValues( Map.of( - "companyId", company.getMapId(), + "companyId", companyId, "documentType", memberProfileDocument.getDocumentType() ) ); @@ -216,7 +143,7 @@ public class CheckMemberCompanyExist extends Stage { if (profileDocumentsFromImdg.size() > 1) { log.warn("Found profile_document > 1 for document_type {} (company.id {}), update first (id = {})", memberProfileDocument.getDocumentType(), - company.getMapId(), + companyId, profileDocument.getId()); } memberProfileDocument.setAlreadyExist(true); @@ -230,7 +157,7 @@ public class CheckMemberCompanyExist extends Stage { Collection clientCodesFromImdg = clientCodeImdg.getCollectionObjectsByFieldValues( Map.of( - "companyId", company.getMapId(), + "companyId", companyId, "code", memberClient.getClientCode() ) ); @@ -241,7 +168,7 @@ public class CheckMemberCompanyExist extends Stage { if (clientCodesFromImdg.size() > 1) { log.warn("Found client_code > 1 for code {} (company.id {}), update first (id = {})", clientCode.getCode(), - company.getMapId(), + companyId, clientCode.getId()); } memberClient.setAlreadyExist(true); @@ -256,11 +183,9 @@ public class CheckMemberCompanyExist extends Stage { } List filteredMemberCompany = companyList.stream() - .filter(issuerCompany -> !issuerCompany.isInvalidData()) + .filter(memberCompany -> !memberCompany.isInvalidData()) .collect(Collectors.toList()); - // todo check list is empty - param.setMemberCompanyList(filteredMemberCompany); return null; @@ -319,4 +244,50 @@ public class CheckMemberCompanyExist extends Stage { } } } + + + private Long getCompanyIdForCompanySymbols(String uuid, Map INNorCIO) { + Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( + Map.of( + "companySymbol", CompanySymbol.UUID.getKey(), + "companySymbolValue", uuid + ) + ); + if (!companySymbolsFromImdg.isEmpty()) { + CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); + if (companySymbolsFromImdg.size() > 1) { + log.warn("For UUID found > 1 company_symbols, use first (id = {})", companySymbolFromImdg.getId()); + } + return companySymbolFromImdg.getCompanyId(); + } + + for (Map.Entry entry : INNorCIO.entrySet()) { + CompanySymbol companySymbol = entry.getKey(); + String companySymbolValue = entry.getValue(); + + companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( + Map.of( + "companySymbol", companySymbol.getKey(), + "companySymbolValue", companySymbolValue + ) + ); + if (!companySymbolsFromImdg.isEmpty()) { + if (companySymbolsFromImdg.size() > 1) + log.warn("For {} = {} found > 1 company_symbols, use first", companySymbol.getKey(), companySymbolValue); + + CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); + Company companyFromImdg = companyImdg.getSingleObjectByID(companySymbolFromImdg.getCompanyId()); + + if (companyFromImdg == null) { + // Случай, когда реквизиты есть, а компании нет (по сути данных ошибка в мапе) + log.error("For own company_symbols (id = {}) company not found (map error)", companySymbolFromImdg.getId()); + } else { + return companyFromImdg.getId(); + } + } + } + + return null; + } + } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_fond/CheckIssuerCompanyExist.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_fond/CheckIssuerCompanyExist.java index 93f938f23..af575623e 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_fond/CheckIssuerCompanyExist.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_fond/CheckIssuerCompanyExist.java @@ -14,11 +14,12 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; 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 java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.stream.Collectors; public class CheckIssuerCompanyExist extends Stage { @@ -39,109 +40,35 @@ public class CheckIssuerCompanyExist extends Stage { List companyList = param.getIssuerCompanyList(); for (IssuerCompany company : companyList) { - boolean companyFound = false; List companySymbolsList = company.getIssuerCompanySymbolsList(); - // Пытаемся найти компанию по UUID - Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( - Map.of( - "companySymbol", "UUID", - "companySymbolValue", company.getId() - ) - ); - if (!companySymbolsFromImdg.isEmpty()) { - CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); - if (companySymbolsFromImdg.size() > 1) { - log.warn("For UUID found > 1 company_symbols, update first (id = {})", companySymbolFromImdg.getId()); - } - companyFound = true; - company.setAlreadyExist(true); - company.setMapId(companySymbolFromImdg.getId()); + Map companySymbolMap = new HashMap<>(); + for (IssuerCompanySymbols issuerCompanySymbol : companySymbolsList) { + if ( + !issuerCompanySymbol.isInvalidData() && + !CompanySymbol.CIO.equalsByKey(issuerCompanySymbol.getCompanySymbol()) && + !CompanySymbol.INN.equalsByKey(issuerCompanySymbol.getCompanySymbol()) + ) continue; + companySymbolMap.put(IEnumKey.getEnumByKey(CompanySymbol.class, issuerCompanySymbol.getCompanySymbol()), issuerCompanySymbol.getCompanySymbolValue()); } + Long companyId = getCompanyIdForCompanySymbols(company.getId().toString(), companySymbolMap); - // Если по UUID не нашли, пытаемся найти по INN или CIO - List companySymbolsListINNorCIO = companySymbolsList.stream() - .filter(issuerCompanySymbols -> - !issuerCompanySymbols.isInvalidData() && - ( - CompanySymbol.CIO.equalsByKey(issuerCompanySymbols.getCompanySymbol()) || - CompanySymbol.INN.equalsByKey(issuerCompanySymbols.getCompanySymbol()) - ) - ).collect(Collectors.toList()); - - // Для компании не найдены реквизиты, значит создаем новую компанию - if (companySymbolsListINNorCIO.isEmpty()) { + if (companyId != null) { + company.setAlreadyExist(true); + company.setMapId(companyId); + } else { company.setAlreadyExist(false); continue; } - // Реквизиты найдены, ищем по ним company.id - for (IssuerCompanySymbols companySymbols : companySymbolsListINNorCIO) { + // Проверяем реквизиты на необходимость обновления + for (IssuerCompanySymbols companySymbols : companySymbolsList) { if (companySymbols.isInvalidData()) continue; - companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( + Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( Map.of( - "companySymbol", companySymbols.getCompanySymbol(), - "companySymbolValue", companySymbols.getCompanySymbolValue() - ) - ); - if (companySymbolsFromImdg.isEmpty()) { - companySymbols.setAlreadyExist(false); - } else { - if (companySymbolsFromImdg.size() > 1) - log.warn("For {} found > 1 company_symbols, use first", companySymbols.getCompanySymbol()); - - CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); - Company companyFromImdg = companyImdg.getSingleObjectByID(companySymbolFromImdg.getCompanyId()); - if (companyFromImdg == null) { - - // Случай, когда реквизиты есть, а компании нет (по сути данных ошибка в мапе) - log.warn("For own company_symbols (id = {}) company not found", companySymbolFromImdg.getId()); - companySymbols.setAlreadyExist(false); - continue; - - } else if (companyFound) { - - // Случай, когда по переданным реквизитам найдено несколько компании - if (!Objects.equals(company.getMapId(), companyFromImdg.getId())) { - log.warn("For company_symbols (company.id = {}, {} = {}) found > 1 company (company.id = {}), " + - "company_symbols skipped", - company.getId(), - companySymbols.getCompanySymbol(), - companySymbols.getCompanySymbolValue(), - companyFromImdg.getId()); - companySymbols.setInvalidData(true); - continue; - } - - } else { - - // Самый вероятный случай: компания найдена по реквизитам - companyFound = true; - company.setAlreadyExist(true); - company.setMapId(companyFromImdg.getId()); - } - - companySymbols.setAlreadyExist(true); - companySymbols.setMapId(companySymbolsFromImdg.iterator().next().getId()); - } - } - - // Если компания реквизиты есть, а компании нет. Маловероятный кейс - if (!companyFound) { - company.setAlreadyExist(false); - continue; - } - - // Проверяем оставшиеся реквизиты на необходимость обновления - for (IssuerCompanySymbols companySymbols : companySymbolsList) { - if (companySymbols.isInvalidData() || companySymbols.getMapId() == null) continue; - - companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( - Map.of( - "companyId", company.getMapId(), - "companySymbol", companySymbols.getCompanySymbol(), - "companySymbolValue", companySymbols.getCompanySymbolValue() + "companyId", companyId, + "companySymbol", companySymbols.getCompanySymbol() ) ); if (companySymbolsFromImdg.isEmpty()) { @@ -193,10 +120,53 @@ public class CheckIssuerCompanyExist extends Stage { .filter(issuerCompany -> !issuerCompany.isInvalidData()) .collect(Collectors.toList()); - // todo check list is empty - param.setIssuerCompanyList(filteredIssuerCompany); return null; } + + private Long getCompanyIdForCompanySymbols(String uuid, Map INNorCIO) { + Collection companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( + Map.of( + "companySymbol", CompanySymbol.UUID.getKey(), + "companySymbolValue", uuid + ) + ); + if (!companySymbolsFromImdg.isEmpty()) { + CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); + if (companySymbolsFromImdg.size() > 1) { + log.warn("For UUID found > 1 company_symbols, use first (id = {})", companySymbolFromImdg.getId()); + } + return companySymbolFromImdg.getCompanyId(); + } + + for (Map.Entry entry : INNorCIO.entrySet()) { + CompanySymbol companySymbol = entry.getKey(); + String companySymbolValue = entry.getValue(); + + companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( + Map.of( + "companySymbol", companySymbol.getKey(), + "companySymbolValue", companySymbolValue + ) + ); + if (!companySymbolsFromImdg.isEmpty()) { + if (companySymbolsFromImdg.size() > 1) + log.warn("For {} = {} found > 1 company_symbols, use first", companySymbol.getKey(), companySymbolValue); + + CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); + Company companyFromImdg = companyImdg.getSingleObjectByID(companySymbolFromImdg.getCompanyId()); + + if (companyFromImdg == null) { + // Случай, когда реквизиты есть, а компании нет (по сути данных ошибка в мапе) + log.error("For own company_symbols (id = {}) company not found (map error)", companySymbolFromImdg.getId()); + } else { + return companyFromImdg.getId(); + } + } + } + + return null; + } + } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_fond/SendMessageToSecurityServiceWithFondSecurities.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_fond/SendMessageToSecurityServiceWithFondSecurities.java index fd8d80dcc..77b34af0a 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_fond/SendMessageToSecurityServiceWithFondSecurities.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_fond/SendMessageToSecurityServiceWithFondSecurities.java @@ -2,6 +2,8 @@ package ru.spcex.clearing.gatewayapi.logic.listings_fond; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.spcex.clearing.gatewayapi.logic.ProcessResult; @@ -14,12 +16,15 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.InstrumentType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.UUID; public class SendMessageToSecurityServiceWithFondSecurities extends Stage { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -27,12 +32,16 @@ public class SendMessageToSecurityServiceWithFondSecurities extends Stage fixedIncomeSecurityImdg; private final Imdg equitySecurityImdg; + private final Imdg companySymbolsImdg; + private final Imdg companyImdg; public SendMessageToSecurityServiceWithFondSecurities(KafkaSender kafkaSender, ImdgProvider imdgProvider) { this.kafkaSender = kafkaSender; this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); + this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); } @Override @@ -40,10 +49,34 @@ public class SendMessageToSecurityServiceWithFondSecurities extends Stage securityList = param.getSecurities(); for (FondSecurity security : securityList) { if (security.isInvalidData()) continue; + Long companyId; if (security.getIssuerCompany() == null || security.getIssuerCompany().getMapId() == null) { - log.warn("Can't insert security.UUID {}, company not found for parameter issuerId", security.getId()); - security.setInvalidData(true); - continue; + // Пытаемся найти компанию по UUID + UUID companyUUID = security.getIssuerId(); + Collection companySymbols = companySymbolsImdg.getCollectionObjectsByFieldValues( + Map.of( + "companySymbol", CompanySymbol.UUID.getKey(), + "companySymbolValue", companyUUID.toString() + ) + ); + if (companySymbols.isEmpty()) { + log.warn("Can't insert security.id {}, company not found for parameter issuerId", security.getId()); + security.setInvalidData(true); + continue; + } else if (companySymbols.size() > 1) { + log.warn("For {} = {} found > 1 company_symbol, use first", CompanySymbol.UUID.getKey(), companyUUID); + } + + // Проверяем, что в базе помимо реквизита есть компания + companyId = companySymbols.iterator().next().getCompanyId(); + Company company = companyImdg.getSingleObjectByID(companyId); + if (company == null) { + log.warn("Can't insert security: not found company with id {}", companyId); + security.setInvalidData(true); + continue; + } + } else { + companyId = security.getIssuerCompany().getMapId(); } Long securityId; if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) { @@ -58,7 +91,7 @@ public class SendMessageToSecurityServiceWithFondSecurities extends Stage { for (FondSecurity fondSecurity : securities) { if (fondSecurity.isInvalidData()) continue; - if (fondSecurity.getIssuerCompany() == null) { - log.warn("For security.id {} not found company, skipped", fondSecurity.getId()); - fondSecurity.setInvalidData(true); - continue; - } - String instrumentTypeStr = fondSecurity.getInstrumentType(); InstrumentType instrumentType = IEnumKey.getEnumByKey(InstrumentType.class, instrumentTypeStr); if (instrumentType != InstrumentType.BOND && instrumentType != InstrumentType.EQTY) {