diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckCompanyExist.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckCompanyExist.java new file mode 100644 index 000000000..7b9b17ccb --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckCompanyExist.java @@ -0,0 +1,191 @@ +package ru.spcex.clearing.gatewayapi.logic.listings; + +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.profile.Contact; +import ru.spcex.clearing.gatewayapi.logic.ProcessResult; +import ru.spcex.clearing.gatewayapi.logic.Stage; +import ru.spcex.clearing.gatewayapi.request.objects.IssuerCompany; +import ru.spcex.clearing.gatewayapi.request.objects.IssuerCompanySymbols; +import ru.spcex.clearing.gatewayapi.request.objects.IssuerContact; +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 java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +public class CheckCompanyExist extends Stage { + private final Logger log = LoggerFactory.getLogger(getClass()); + + private final Imdg companyImdg; + private final Imdg companySymbolsImdg; + private final Imdg contactImdg; + + public CheckCompanyExist(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + contactImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Contact, Contact.class); + } + + @Override + public ProcessResult process(ListingsRequestParam param) { + 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()); + } + + // Если по UUID не нашли, пытаемся найти по INN или CIO + List companySymbolsListINNorCIO = companySymbolsList.stream() + .filter(issuerCompanySymbols -> + CompanySymbol.CIO.equalsByKey(issuerCompanySymbols.getCompanySymbol()) || + CompanySymbol.INN.equalsByKey(issuerCompanySymbols.getCompanySymbol()) + ).collect(Collectors.toList()); + + // Для компании не найдены реквизиты, значит создаем новую компанию + if (companySymbolsListINNorCIO.isEmpty()) { + company.setAlreadyExist(false); + continue; + } + + // Реквизиты найдены, ищем по ним company.id + for (IssuerCompanySymbols companySymbols : companySymbolsListINNorCIO) { + 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 (IssuerCompanySymbols companySymbols : companySymbolsList) { + if (companySymbols.isInvalidData() || companySymbols.getMapId() != null) continue; + + companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues( + Map.of( + "companySymbol", companySymbols.getCompanySymbol(), + "companySymbolValue", companySymbols.getCompanySymbolValue() + ) + ); + if (companySymbolsFromImdg.isEmpty()) { + companySymbols.setAlreadyExist(false); + } else { + CompanySymbols companySymbolFromImdg = companySymbolsFromImdg.iterator().next(); + if (companySymbolsFromImdg.size() > 1) { + log.warn("For company_symbols ({}={}) found > 1 own company_symbols, " + + "update first (company_symbols.id = {})", + companySymbols.getCompanySymbol(), + companySymbols.getCompanySymbolValue(), + companySymbolFromImdg.getId()); + } + companySymbols.setAlreadyExist(true); + companySymbols.setMapId(companySymbolFromImdg.getId()); + } + } + + // Проверяем контакты на необходимость обновления + if (company.isAlreadyExist()) { + List contactList = company.getIssuerContactList(); + for (IssuerContact contact : contactList) { + Collection contactsFromImdg = contactImdg.getCollectionObjectsByFieldValues( + Map.of("contactType", contact.getContactType()) + ); + if (contactsFromImdg.isEmpty()) { + contact.setAlreadyExist(false); + } else { + Contact contactFromImdg = contactsFromImdg.iterator().next(); + if (contactsFromImdg.size() > 1) { + log.warn("Found contact > 1 for contactType {}, update first (id = {})", + contactFromImdg.getContactType(), + contactFromImdg.getId()); + } + contact.setAlreadyExist(true); + contact.setMapId(contactFromImdg.getId()); + } + } + } + + } + + List filteredIssuerCompany = companyList.stream() + .filter(issuerCompany -> !issuerCompany.isInvalidData()) + .collect(Collectors.toList()); + + // todo check list is empty + + param.setIssuerCompanyList(filteredIssuerCompany); + + return null; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckSecurityExist.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckSecurityExist.java index c8b734d15..7117b1e9d 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckSecurityExist.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckSecurityExist.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.gatewayapi.logic.listings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.instrument.issue.CouponPeriod; import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow; @@ -21,6 +23,8 @@ import java.util.List; import java.util.Map; public class CheckSecurityExist extends Stage { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg equitySecurityImdg; private final Imdg fixedIncomeSecurityImdg; private final Imdg listingImdg; @@ -38,28 +42,39 @@ public class CheckSecurityExist extends Stage { @Override public ProcessResult process(ListingsRequestParam param) { List securities = param.getSecurities(); + for (IncomeSecurity incomeSecurity : securities) { String instrumentType = incomeSecurity.getInstrumentType(); String securitySymbol = incomeSecurity.getSecuritySymbol(); if (InstrumentType.BOND.equalsByKey(instrumentType)) { - Collection fixedIncomeSecurity = fixedIncomeSecurityImdg.getCollectionObjectsByFieldValues( + Collection fixedIncomeSecurities = fixedIncomeSecurityImdg.getCollectionObjectsByFieldValues( Map.of("securitySymbol", securitySymbol) ); - if (!fixedIncomeSecurity.isEmpty()) { - // todo log for multiply elements + if (!fixedIncomeSecurities.isEmpty()) { + FixedIncomeSecurity fixedIncomeSecurity = fixedIncomeSecurities.iterator().next(); + if (fixedIncomeSecurities.size() > 1) { + log.warn("For security_symbol = {} found > 1 fixed_income_security, update first (id = {})", + securitySymbol, + fixedIncomeSecurity.getId()); + } incomeSecurity.setAlreadyExist(true); - incomeSecurity.setMapId(fixedIncomeSecurity.iterator().next().getId()); + incomeSecurity.setMapId(fixedIncomeSecurity.getId()); } else { incomeSecurity.setAlreadyExist(false); } } else if (InstrumentType.EQTY.equalsByKey(instrumentType)) { - Collection equitySecurity = equitySecurityImdg.getCollectionObjectsByFieldValues( + Collection equitySecurities = equitySecurityImdg.getCollectionObjectsByFieldValues( Map.of("securitySymbol", securitySymbol) ); - if (!equitySecurity.isEmpty()) { - // todo log for multiply elements + if (!equitySecurities.isEmpty()) { + EquitySecurity equitySecurity = equitySecurities.iterator().next(); + if (equitySecurities.size() > 1) { + log.warn("For security_symbol = {} found > 1 equity_security, update first (id = {})", + securitySymbol, + equitySecurity.getId()); + } incomeSecurity.setAlreadyExist(true); - incomeSecurity.setMapId(equitySecurity.iterator().next().getId()); + incomeSecurity.setMapId(equitySecurity.getId()); } else { incomeSecurity.setAlreadyExist(false); } @@ -70,56 +85,77 @@ public class CheckSecurityExist extends Stage { listing.setAlreadyExist(false); continue; } - Collection listingFromImdg = listingImdg.getCollectionObjectsByFieldValues( + Collection listingsFromImdg = listingImdg.getCollectionObjectsByFieldValues( Map.of( "securityId", incomeSecurity.getMapId(), "market", listing.getCode() ) ); - if (listingFromImdg.isEmpty()) { + if (listingsFromImdg.isEmpty()) { listing.setAlreadyExist(false); } else { - // todo log for multiply elements + Listing listingFromImdg = listingsFromImdg.iterator().next(); + if (listingsFromImdg.size() > 1) { + log.warn("For security_id {} and market {} found > 1 listing, update first (id = {})", + incomeSecurity.getMapId(), + listing.getCode(), + listingFromImdg.getId()); + + } listing.setAlreadyExist(true); - listing.setMapId(listingFromImdg.iterator().next().getId()); + listing.setMapId(listingFromImdg.getId()); } } - for (CouponSchedule couponSchedule : incomeSecurity.getCouponScheduleList()) { + for (CouponSchedule couponSchedules : incomeSecurity.getCouponScheduleList()) { if (!incomeSecurity.isAlreadyExist()) { - couponSchedule.setAlreadyExist(false); + couponSchedules.setAlreadyExist(false); continue; } - Collection couponPeriodFromImdg = couponPeriodImdg.getCollectionObjectsByFieldValues( + Collection couponPeriodListFromImdg = couponPeriodImdg.getCollectionObjectsByFieldValues( Map.of( "securityId", incomeSecurity.getMapId(), - "periodStartDate", couponSchedule.getPeriodStartDate(), - "periodEndDate", couponSchedule.getPeriodEndDate() + "periodStartDate", couponSchedules.getPeriodStartDate(), + "periodEndDate", couponSchedules.getPeriodEndDate() ) ); - if (couponPeriodFromImdg.isEmpty()) { - couponSchedule.setAlreadyExist(false); + if (couponPeriodListFromImdg.isEmpty()) { + couponSchedules.setAlreadyExist(false); } else { - // todo log for multiply elements - couponSchedule.setAlreadyExist(true); - couponSchedule.setMapId(couponPeriodFromImdg.iterator().next().getId()); + CouponPeriod couponPeriod = couponPeriodListFromImdg.iterator().next(); + if (couponPeriodListFromImdg.size() > 1) { + log.warn("For securityId {}, periodStartDate {}, periodEndDate {} found > 1 couponPeriod, " + + "update first (id = {})", + incomeSecurity.getMapId(), + couponSchedules.getPeriodStartDate(), + couponSchedules.getPeriodEndDate(), + couponPeriod.getId()); + } + couponSchedules.setAlreadyExist(true); + couponSchedules.setMapId(couponPeriod.getId()); } } for (Nominal nominal : incomeSecurity.getNominalList()) { if (incomeSecurity.isAlreadyExist()) { - Collection fixedIncomeCashFlowFromImdg = fixedIncomeCashFlowImdg.getCollectionObjectsByFieldValues( + Collection fixedIncomeCashFlowListFromImdg = fixedIncomeCashFlowImdg.getCollectionObjectsByFieldValues( Map.of( "securityId", incomeSecurity.getMapId(), "valueDate", nominal.getDate() ) ); - if (fixedIncomeCashFlowFromImdg.isEmpty()) { + if (fixedIncomeCashFlowListFromImdg.isEmpty()) { nominal.setAlreadyExist(false); } else { - // todo log for multiply elements + FixedIncomeCashFlow fixedIncomeCashFlow = fixedIncomeCashFlowListFromImdg.iterator().next(); + if (fixedIncomeCashFlowListFromImdg.size() > 1) { + log.warn("For securityId {}, valueDate {} found > 1 fixedIncomeCashFlow, update first (id = {})", + incomeSecurity.getMapId(), + nominal.getDate(), + fixedIncomeCashFlow.getId()); + } nominal.setAlreadyExist(true); - nominal.setMapId(fixedIncomeCashFlowFromImdg.iterator().next().getId()); + nominal.setMapId(fixedIncomeCashFlow.getId()); } } else { nominal.setAlreadyExist(false); diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingCompanyParts.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingCompanyParts.java index 06efcf778..1d586bd25 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingCompanyParts.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingCompanyParts.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.gatewayapi.logic.listings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.spcex.clearing.gatewayapi.logic.ProcessResult; import ru.spcex.clearing.gatewayapi.logic.Stage; import ru.spcex.clearing.gatewayapi.request.objects.*; @@ -8,19 +10,27 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; public class GroupingCompanyParts extends Stage { + private final Logger log = LoggerFactory.getLogger(getClass()); + @Override public ProcessResult process(ListingsRequestParam param) { List issuerCompanyList = param.getListingsRequest().getIssuerCompanyList(); Map issuerCompanyMap = new HashMap<>(); for (IssuerCompany issuerCompany : issuerCompanyList) { - if (issuerCompanyMap.put(issuerCompany.getId(), issuerCompany) != null) { - throw new IllegalStateException("Duplicate key"); + if (issuerCompanyMap.containsKey(issuerCompany.getId())) { + log.warn("For company.UUID {} found > 1 element from request, use first", issuerCompany.getId()); + issuerCompany.setInvalidData(true); + continue; } + issuerCompanyMap.put(issuerCompany.getId(), issuerCompany); } for (IssuerCompany issuerCompany : issuerCompanyList) { + if (issuerCompany.isInvalidData()) continue; + UUID issuerCompanyId = issuerCompany.getId(); boolean securityFoundForCompany = false; for (IncomeSecurity incomeSecurity : param.getSecurities()) { @@ -31,7 +41,8 @@ public class GroupingCompanyParts extends Stage { } } if (!securityFoundForCompany) { - // todo error: company without security + log.warn("For company.UUID {} not found security, company skipped", issuerCompanyId); + issuerCompany.setInvalidData(true); } } @@ -40,10 +51,14 @@ public class GroupingCompanyParts extends Stage { UUID issuerCompanyInfoUUID = issuerCompanyInfo.getCompanyId(); IssuerCompany issuerCompany = issuerCompanyMap.get(issuerCompanyInfoUUID); if (issuerCompany == null) { - // todo error + log.warn("For companyInfo.UUID {} not found company, companyInfo skipped", issuerCompanyInfoUUID); continue; } - issuerCompany.getIssuerCompanyInfoList().add(issuerCompanyInfo); + if (issuerCompany.getIssuerCompanyInfo() != null) { + log.warn("For company.UUID {} found > 1 companyInfo, use first", issuerCompanyInfoUUID); + continue; + } + issuerCompany.setIssuerCompanyInfo(issuerCompanyInfo); } List issuerCompanySymbolsList = param.getListingsRequest().getIssuerCompanySymbolsList(); @@ -51,7 +66,10 @@ public class GroupingCompanyParts extends Stage { UUID issuerCompanySymbolsUUID = issuerCompanySymbols.getCompanyId(); IssuerCompany issuerCompany = issuerCompanyMap.get(issuerCompanySymbolsUUID); if (issuerCompany == null) { - // todo error + log.warn("For companySymbols ({} = {}) not found company, companySymbols skipped", + issuerCompanySymbols.getCompanySymbol(), + issuerCompanySymbols.getCompanySymbolValue()); + issuerCompanySymbols.setInvalidData(true); continue; } issuerCompany.getIssuerCompanySymbolsList().add(issuerCompanySymbols); @@ -62,13 +80,22 @@ public class GroupingCompanyParts extends Stage { UUID issuerContactUUID = issuerContact.getCompanyId(); IssuerCompany issuerCompany = issuerCompanyMap.get(issuerContactUUID); if (issuerCompany == null) { - // todo error + log.warn("For contact ({} = {}) not found company, contact skipped", + issuerContact.getContactType(), + issuerContact.getContactValue()); + issuerContact.setInvalidData(true); continue; } issuerCompany.getIssuerContactList().add(issuerContact); } - param.getIssuerCompanyList().addAll(issuerCompanyList); + List filteredIssuerCompany = issuerCompanyList.stream() + .filter(issuerCompany -> !issuerCompany.isInvalidData()) + .collect(Collectors.toList()); + + // todo check list is empty + + param.setIssuerCompanyList(filteredIssuerCompany); return null; } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingSecurityParts.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingSecurityParts.java index e245fbfdb..7ff86b4ac 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingSecurityParts.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingSecurityParts.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.gatewayapi.logic.listings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.spcex.clearing.gatewayapi.logic.ProcessResult; import ru.spcex.clearing.gatewayapi.logic.Stage; import ru.spcex.clearing.gatewayapi.request.objects.*; @@ -8,17 +10,23 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; public class GroupingSecurityParts extends Stage { + private final Logger log = LoggerFactory.getLogger(getClass()); + @Override public ProcessResult process(ListingsRequestParam param) { List securities = param.getListingsRequest().getSecurities(); + Map securityMap = new HashMap<>(); for (IncomeSecurity incomeSecurity : securities) { - if (securityMap.put(incomeSecurity.getId(), incomeSecurity) != null) { - // todo error - throw new IllegalStateException("Duplicate key"); + if (securityMap.containsKey(incomeSecurity.getId())) { + log.warn("For security.UUID {} found > 1 element from request, use first", incomeSecurity.getId()); + incomeSecurity.setInvalidData(true); + continue; } + securityMap.put(incomeSecurity.getId(), incomeSecurity); } List couponSchedules = param.getListingsRequest().getCouponSchedules(); @@ -26,7 +34,7 @@ public class GroupingSecurityParts extends Stage { UUID couponScheduleUUID = couponSchedule.getSecurityId(); IncomeSecurity incomeSecurity = securityMap.get(couponScheduleUUID); if (incomeSecurity == null) { - // todo error + log.warn("For couponSchedule.securityId {} not found security, skipped", couponScheduleUUID); continue; } incomeSecurity.getCouponScheduleList().add(couponSchedule); @@ -43,7 +51,7 @@ public class GroupingSecurityParts extends Stage { UUID listingUUID = listing.getSecurityId(); IncomeSecurity incomeSecurity = securityMap.get(listingUUID); if (incomeSecurity == null) { - // todo error + log.warn("For listing.securityId {} not found security, skipped", listingUUID); continue; } incomeSecurity.getListingList().add(listing); @@ -54,13 +62,20 @@ public class GroupingSecurityParts extends Stage { UUID nominalUUID = nominal.getSecurityId(); IncomeSecurity incomeSecurity = securityMap.get(nominalUUID); if (incomeSecurity == null) { - // todo error + log.warn("For nominal.securityId {} not found security, skipped", nominalUUID); continue; } incomeSecurity.getNominalList().add(nominal); } - param.getSecurities().addAll(securities); + List filteredIncomeSecurities = securities.stream() + .filter(incomeSecurity -> !incomeSecurity.isInvalidData()) + .collect(Collectors.toList()); + + // todo check list is empty + + param.setSecurities(filteredIncomeSecurities); + return null; } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ListingsRequestParam.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ListingsRequestParam.java index 07f6bdae4..5c72d738f 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ListingsRequestParam.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ListingsRequestParam.java @@ -8,9 +8,9 @@ import java.util.ArrayList; import java.util.List; public class ListingsRequestParam { - private final ListingsRequest listingsRequest; - private final List securities = new ArrayList<>(); - private final List issuerCompanyList = new ArrayList<>(); + private ListingsRequest listingsRequest; + private List securities = new ArrayList<>(); + private List issuerCompanyList = new ArrayList<>(); public ListingsRequestParam(ListingsRequest listingsRequest) { this.listingsRequest = listingsRequest; @@ -28,4 +28,16 @@ public class ListingsRequestParam { public List getIssuerCompanyList() { return issuerCompanyList; } + + public void setListingsRequest(ListingsRequest listingsRequest) { + this.listingsRequest = listingsRequest; + } + + public void setSecurities(List securities) { + this.securities = securities; + } + + public void setIssuerCompanyList(List issuerCompanyList) { + this.issuerCompanyList = issuerCompanyList; + } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ValidateIncomeSecurities.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ValidateIncomeSecurities.java index cf45ee024..5ecaedbe4 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ValidateIncomeSecurities.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ValidateIncomeSecurities.java @@ -1,17 +1,23 @@ package ru.spcex.clearing.gatewayapi.logic.listings; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.spcex.clearing.gatewayapi.logic.ProcessResult; import ru.spcex.clearing.gatewayapi.logic.Stage; import ru.spcex.clearing.gatewayapi.request.objects.IncomeListing; import ru.spcex.clearing.gatewayapi.request.objects.IncomeSecurity; import ru.spcex.platform.enumeration.BondType; import ru.spcex.platform.enumeration.InstrumentType; +import ru.spcex.platform.enumeration.ShareType; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.utils.enumeration.IEnumKey; import java.util.List; +import java.util.stream.Collectors; public class ValidateIncomeSecurities extends Stage { + private final Logger log = LoggerFactory.getLogger(getClass()); // todo collect errors for response @Override @@ -19,27 +25,49 @@ public class ValidateIncomeSecurities extends Stage { List securities = param.getSecurities(); for (IncomeSecurity incomeSecurity : securities) { + if (incomeSecurity.isInvalidData()) continue; String instrumentTypeStr = incomeSecurity.getInstrumentType(); InstrumentType instrumentType = IEnumKey.getEnumByKey(InstrumentType.class, instrumentTypeStr); if (instrumentType != InstrumentType.BOND && instrumentType != InstrumentType.EQTY) { - // todo collect error + log.warn("Invalid instrumentType {} for security.UUID {}, skipped", instrumentTypeStr, incomeSecurity.getId()); + incomeSecurity.setInvalidData(true); continue; } String workflowStatusStr = incomeSecurity.getWorkflowStatus(); WorkflowStatus workflowStatus = IEnumKey.getEnumByKey(WorkflowStatus.class, workflowStatusStr); if (workflowStatus == null) { - // todo collect error + log.warn("Invalid workflowStatus {} for security.UUID {}, skipped", workflowStatusStr, incomeSecurity.getId()); + incomeSecurity.setInvalidData(true); continue; } - // todo check share_type + String shareTypeStr = incomeSecurity.getShareType(); + ShareType shareType = IEnumKey.getEnumByKey(ShareType.class, shareTypeStr); + if (instrumentType == InstrumentType.EQTY && shareType == null) { + log.warn("Invalid shareType {} for security.UUID {}, skipped", shareTypeStr, incomeSecurity.getId()); + incomeSecurity.setInvalidData(true); + continue; + } String bondTypeStr = incomeSecurity.getBondType(); BondType bondType = IEnumKey.getEnumByKey(BondType.class, bondTypeStr); if (bondType == null) { - // todo collect error + log.warn("Invalid bondType {} for security.UUID {}, skipped", bondTypeStr, incomeSecurity.getId()); + incomeSecurity.setInvalidData(true); + continue; + } + + if (StringUtils.isEmpty(incomeSecurity.getSecuritySymbol())) { + log.warn("Empty or null securitySymbol for security.UUID {}, skipped", incomeSecurity.getId()); + incomeSecurity.setInvalidData(true); + continue; + } + + if (StringUtils.isEmpty(incomeSecurity.getShortName())) { + log.warn("Empty or null shortName for security.UUID {}, skipped", incomeSecurity.getShortName()); + incomeSecurity.setInvalidData(true); continue; } @@ -49,13 +77,25 @@ public class ValidateIncomeSecurities extends Stage { workflowStatusStr = listing.getWorkflowStatus(); workflowStatus = IEnumKey.getEnumByKey(WorkflowStatus.class, workflowStatusStr); if (workflowStatus == null) { - // todo collect error + log.warn("Invalid workflowStatus {} for listing from security.UUID {}", workflowStatusStr, incomeSecurity.getId()); + listing.setInvalidData(true); continue; } + + // todo add validation after create new listing request } } + List filteredIncomeSecurities = securities.stream() + .filter(incomeSecurity -> !incomeSecurity.isInvalidData()) + .collect(Collectors.toList()); + + // todo check list is empty + + param.setSecurities(filteredIncomeSecurities); + + return null; } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerCompany.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerCompany.java index 369c083b0..479e6aeb2 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerCompany.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerCompany.java @@ -10,7 +10,7 @@ import java.util.List; import java.util.UUID; @ApiModel("Компания эмитент") -public class IssuerCompany { +public class IssuerCompany extends WithMapId { @JsonProperty("id") @ApiModelProperty( value = "Идентификатор Эмитента в Модуле регистрации биржевых инструментов", @@ -43,7 +43,7 @@ public class IssuerCompany { private String workflowStatus; @JsonIgnore - private List issuerCompanyInfoList = new ArrayList<>(); + private IssuerCompanyInfo issuerCompanyInfo; @JsonIgnore private List issuerCompanySymbolsList = new ArrayList<>(); @@ -83,14 +83,6 @@ public class IssuerCompany { this.workflowStatus = workflowStatus; } - public List getIssuerCompanyInfoList() { - return issuerCompanyInfoList; - } - - public void setIssuerCompanyInfoList(List issuerCompanyInfoList) { - this.issuerCompanyInfoList = issuerCompanyInfoList; - } - public List getIssuerCompanySymbolsList() { return issuerCompanySymbolsList; } @@ -106,4 +98,12 @@ public class IssuerCompany { public void setIssuerContactList(List issuerContactList) { this.issuerContactList = issuerContactList; } + + public IssuerCompanyInfo getIssuerCompanyInfo() { + return issuerCompanyInfo; + } + + public void setIssuerCompanyInfo(IssuerCompanyInfo issuerCompanyInfo) { + this.issuerCompanyInfo = issuerCompanyInfo; + } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerCompanySymbols.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerCompanySymbols.java index eac3e4ef0..178222f28 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerCompanySymbols.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerCompanySymbols.java @@ -7,7 +7,7 @@ import io.swagger.annotations.ApiModelProperty; import java.util.UUID; @ApiModel("Реквизиты компании эмитента") -public class IssuerCompanySymbols { +public class IssuerCompanySymbols extends WithMapId { @JsonProperty("company_id") @ApiModelProperty( value = "Ссылка на company", diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerContact.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerContact.java index c9428973c..b7d35d6c1 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerContact.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IssuerContact.java @@ -7,7 +7,7 @@ import io.swagger.annotations.ApiModelProperty; import java.util.UUID; @ApiModel("Контакты компании эмитента") -public class IssuerContact { +public class IssuerContact extends WithMapId { @JsonProperty("company_id") @ApiModelProperty( value = "Ссылка на company", diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/WithMapId.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/WithMapId.java index ffb33d3fa..3f8bb0070 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/WithMapId.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/WithMapId.java @@ -4,11 +4,14 @@ import com.fasterxml.jackson.annotation.JsonIgnore; public abstract class WithMapId { @JsonIgnore - protected Long mapId; + protected Long mapId = null; @JsonIgnore protected boolean alreadyExist = false; + @JsonIgnore + protected boolean invalidData = false; + public Long getMapId() { return mapId; } @@ -24,4 +27,12 @@ public abstract class WithMapId { public void setAlreadyExist(boolean alreadyExist) { this.alreadyExist = alreadyExist; } + + public boolean isInvalidData() { + return invalidData; + } + + public void setInvalidData(boolean invalidData) { + this.invalidData = invalidData; + } } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ShareType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ShareType.java new file mode 100644 index 000000000..51744d51a --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ShareType.java @@ -0,0 +1,20 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum ShareType implements IEnumKey { + S("S"), // Обыкновенная акция + P("P"), // Привилегированная акция + ; + + private final String key; + + ShareType(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +}