fix logs for stages
This commit is contained in:
parent
94ed38e0de
commit
062f6682c2
11 changed files with 414 additions and 62 deletions
|
|
@ -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<ListingsRequestParam> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<CompanySymbols> companySymbolsImdg;
|
||||
private final Imdg<Contact> 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<IssuerCompany> companyList = param.getIssuerCompanyList();
|
||||
|
||||
for (IssuerCompany company : companyList) {
|
||||
boolean companyFound = false;
|
||||
List<IssuerCompanySymbols> companySymbolsList = company.getIssuerCompanySymbolsList();
|
||||
|
||||
// Пытаемся найти компанию по UUID
|
||||
Collection<CompanySymbols> 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<IssuerCompanySymbols> 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<IssuerContact> contactList = company.getIssuerContactList();
|
||||
for (IssuerContact contact : contactList) {
|
||||
Collection<Contact> 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<IssuerCompany> filteredIssuerCompany = companyList.stream()
|
||||
.filter(issuerCompany -> !issuerCompany.isInvalidData())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// todo check list is empty
|
||||
|
||||
param.setIssuerCompanyList(filteredIssuerCompany);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -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<ListingsRequestParam> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
||||
private final Imdg<EquitySecurity> equitySecurityImdg;
|
||||
private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
|
||||
private final Imdg<Listing> listingImdg;
|
||||
|
|
@ -38,28 +42,39 @@ public class CheckSecurityExist extends Stage<ListingsRequestParam> {
|
|||
@Override
|
||||
public ProcessResult process(ListingsRequestParam param) {
|
||||
List<IncomeSecurity> securities = param.getSecurities();
|
||||
|
||||
for (IncomeSecurity incomeSecurity : securities) {
|
||||
String instrumentType = incomeSecurity.getInstrumentType();
|
||||
String securitySymbol = incomeSecurity.getSecuritySymbol();
|
||||
if (InstrumentType.BOND.equalsByKey(instrumentType)) {
|
||||
Collection<FixedIncomeSecurity> fixedIncomeSecurity = fixedIncomeSecurityImdg.getCollectionObjectsByFieldValues(
|
||||
Collection<FixedIncomeSecurity> 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> equitySecurity = equitySecurityImdg.getCollectionObjectsByFieldValues(
|
||||
Collection<EquitySecurity> 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<ListingsRequestParam> {
|
|||
listing.setAlreadyExist(false);
|
||||
continue;
|
||||
}
|
||||
Collection<Listing> listingFromImdg = listingImdg.getCollectionObjectsByFieldValues(
|
||||
Collection<Listing> 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<CouponPeriod> couponPeriodFromImdg = couponPeriodImdg.getCollectionObjectsByFieldValues(
|
||||
Collection<CouponPeriod> 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<FixedIncomeCashFlow> fixedIncomeCashFlowFromImdg = fixedIncomeCashFlowImdg.getCollectionObjectsByFieldValues(
|
||||
Collection<FixedIncomeCashFlow> 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);
|
||||
|
|
|
|||
|
|
@ -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<ListingsRequestParam> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
||||
@Override
|
||||
public ProcessResult process(ListingsRequestParam param) {
|
||||
List<IssuerCompany> issuerCompanyList = param.getListingsRequest().getIssuerCompanyList();
|
||||
Map<UUID, IssuerCompany> 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<ListingsRequestParam> {
|
|||
}
|
||||
}
|
||||
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<ListingsRequestParam> {
|
|||
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<IssuerCompanySymbols> issuerCompanySymbolsList = param.getListingsRequest().getIssuerCompanySymbolsList();
|
||||
|
|
@ -51,7 +66,10 @@ public class GroupingCompanyParts extends Stage<ListingsRequestParam> {
|
|||
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<ListingsRequestParam> {
|
|||
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<IssuerCompany> filteredIssuerCompany = issuerCompanyList.stream()
|
||||
.filter(issuerCompany -> !issuerCompany.isInvalidData())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// todo check list is empty
|
||||
|
||||
param.setIssuerCompanyList(filteredIssuerCompany);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<ListingsRequestParam> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
||||
@Override
|
||||
public ProcessResult process(ListingsRequestParam param) {
|
||||
List<IncomeSecurity> securities = param.getListingsRequest().getSecurities();
|
||||
|
||||
Map<UUID, IncomeSecurity> 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<CouponSchedule> couponSchedules = param.getListingsRequest().getCouponSchedules();
|
||||
|
|
@ -26,7 +34,7 @@ public class GroupingSecurityParts extends Stage<ListingsRequestParam> {
|
|||
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<ListingsRequestParam> {
|
|||
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<ListingsRequestParam> {
|
|||
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<IncomeSecurity> filteredIncomeSecurities = securities.stream()
|
||||
.filter(incomeSecurity -> !incomeSecurity.isInvalidData())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// todo check list is empty
|
||||
|
||||
param.setSecurities(filteredIncomeSecurities);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
|
||||
public class ListingsRequestParam {
|
||||
private final ListingsRequest listingsRequest;
|
||||
private final List<IncomeSecurity> securities = new ArrayList<>();
|
||||
private final List<IssuerCompany> issuerCompanyList = new ArrayList<>();
|
||||
private ListingsRequest listingsRequest;
|
||||
private List<IncomeSecurity> securities = new ArrayList<>();
|
||||
private List<IssuerCompany> issuerCompanyList = new ArrayList<>();
|
||||
|
||||
public ListingsRequestParam(ListingsRequest listingsRequest) {
|
||||
this.listingsRequest = listingsRequest;
|
||||
|
|
@ -28,4 +28,16 @@ public class ListingsRequestParam {
|
|||
public List<IssuerCompany> getIssuerCompanyList() {
|
||||
return issuerCompanyList;
|
||||
}
|
||||
|
||||
public void setListingsRequest(ListingsRequest listingsRequest) {
|
||||
this.listingsRequest = listingsRequest;
|
||||
}
|
||||
|
||||
public void setSecurities(List<IncomeSecurity> securities) {
|
||||
this.securities = securities;
|
||||
}
|
||||
|
||||
public void setIssuerCompanyList(List<IssuerCompany> issuerCompanyList) {
|
||||
this.issuerCompanyList = issuerCompanyList;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<ListingsRequestParam> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
||||
// todo collect errors for response
|
||||
@Override
|
||||
|
|
@ -19,27 +25,49 @@ public class ValidateIncomeSecurities extends Stage<ListingsRequestParam> {
|
|||
List<IncomeSecurity> 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<ListingsRequestParam> {
|
|||
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<IncomeSecurity> filteredIncomeSecurities = securities.stream()
|
||||
.filter(incomeSecurity -> !incomeSecurity.isInvalidData())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// todo check list is empty
|
||||
|
||||
param.setSecurities(filteredIncomeSecurities);
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<IssuerCompanyInfo> issuerCompanyInfoList = new ArrayList<>();
|
||||
private IssuerCompanyInfo issuerCompanyInfo;
|
||||
|
||||
@JsonIgnore
|
||||
private List<IssuerCompanySymbols> issuerCompanySymbolsList = new ArrayList<>();
|
||||
|
|
@ -83,14 +83,6 @@ public class IssuerCompany {
|
|||
this.workflowStatus = workflowStatus;
|
||||
}
|
||||
|
||||
public List<IssuerCompanyInfo> getIssuerCompanyInfoList() {
|
||||
return issuerCompanyInfoList;
|
||||
}
|
||||
|
||||
public void setIssuerCompanyInfoList(List<IssuerCompanyInfo> issuerCompanyInfoList) {
|
||||
this.issuerCompanyInfoList = issuerCompanyInfoList;
|
||||
}
|
||||
|
||||
public List<IssuerCompanySymbols> getIssuerCompanySymbolsList() {
|
||||
return issuerCompanySymbolsList;
|
||||
}
|
||||
|
|
@ -106,4 +98,12 @@ public class IssuerCompany {
|
|||
public void setIssuerContactList(List<IssuerContact> issuerContactList) {
|
||||
this.issuerContactList = issuerContactList;
|
||||
}
|
||||
|
||||
public IssuerCompanyInfo getIssuerCompanyInfo() {
|
||||
return issuerCompanyInfo;
|
||||
}
|
||||
|
||||
public void setIssuerCompanyInfo(IssuerCompanyInfo issuerCompanyInfo) {
|
||||
this.issuerCompanyInfo = issuerCompanyInfo;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue