поправлены баги при создании компаний и инструментов

This commit is contained in:
etreschenkov 2023-07-12 18:48:16 +03:00
parent 8da9583854
commit 343277caa3
10 changed files with 108 additions and 54 deletions

View file

@ -2,8 +2,8 @@ package ru.spcex.clearing.company.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.ClearingCategoryDictionary;
import ru.spcex.clearing.company.error.CompanyErrors;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -11,10 +11,8 @@ import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteReques
import ru.spcex.clearing.platform.messaging.domain.cud.company.ClearingMemberCategoryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.ClearingMemberCategoryUpdateRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.EnumPresentRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
@ -44,8 +42,7 @@ public class ClearingMemberCategoryValidationConfig {
IMDGDistributedNames.Map_Company,
Company.class,
CompanyErrors.RequiredFieldEmpty,
CompanyErrors.CompanyNotFound,
company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : CompanyErrors.CompanyDisabled),
CompanyErrors.CompanyNotFound),
DictionaryPresentRule.instance("clearingMemberCategory",
ClearingMemberCategoryNewRequest::getClearingMemberCategory,
IMDGDistributedNames.Map_ClearingCategoryDictionary,

View file

@ -28,11 +28,8 @@ import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.validation.IValidator;
import java.util.Objects;
import java.util.function.Function;
import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey;
@Service
public class ClearingMemberCategoryService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
@ -85,7 +82,7 @@ public class ClearingMemberCategoryService extends QueueConsumer implements Init
init();
}
private RequestInfoUpdate clearingMemberCategoryNew(BaseRequest<ClearingMemberCategoryNewRequest> userRequest) {
protected RequestInfoUpdate clearingMemberCategoryNew(BaseRequest<ClearingMemberCategoryNewRequest> userRequest) {
log.debug("ClearingMemberCategoryNewRequest received {}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);

View file

@ -21,7 +21,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteReques
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyNewRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
@ -66,11 +65,11 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
ValidationHelper validationHelper,
UserRoleVerification userRoleVerification,
@Qualifier("companyNewRequestValidator")
Function<CompanyNewRequest, IValidator> companyNewRequestValidator,
Function<CompanyNewRequest, IValidator> companyNewRequestValidator,
@Qualifier("companyUpdateRequestValidator")
Function<CompanyNewRequest, IValidator> companyUpdateRequestValidator,
Function<CompanyNewRequest, IValidator> companyUpdateRequestValidator,
@Qualifier("CompanyDeleteRequestValidator")
Function<CommonDeleteRequest, IValidator> companyDeleteRequestValidator,
Function<CommonDeleteRequest, IValidator> companyDeleteRequestValidator,
CompanySymbolService companySymbolService,
AccountNotificationHelper accountNotification,
RelationService relationService) {
@ -127,7 +126,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
}
create(companyNewRequest);
}
case UPDATE -> update((CompanyNewRequest) request.getRequestPayload());
case UPDATE -> update((CompanyNewRequest) request.getRequestPayload(), true);
}
return requestInfoUpdate;
}
@ -144,7 +143,11 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
company.setTradingCode(companyNewRequest.getTradingCode());
company.setClearingCode(companyNewRequest.getClearingCode());
company.setRegistrationCode(companyNewRequest.getRegistrationCode());
company.setWorkflowStatus(companyNewRequest.getWorkflowStatus());
if (companyNewRequest.getWorkflowStatus() != null) {
company.setWorkflowStatus(companyNewRequest.getWorkflowStatus());
} else {
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
}
fillNewCompanyInfo(company, companyNewRequest);
ImdgTransaction transaction = imdgProvider.newTransaction();
@ -178,13 +181,14 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
return company.getId();
}
public synchronized void update(CompanyNewRequest updateRequest) throws ValidationException {
IValidator validator = companyUpdateRequestValidator.apply(updateRequest);
Optional<EnumMessage> error = validator.tillFirstError();
if (error.isPresent()) {
throw new ValidationException(error.get());
public synchronized void update(CompanyNewRequest updateRequest, boolean validationIsEnable) throws ValidationException {
if (validationIsEnable) {
IValidator validator = companyUpdateRequestValidator.apply(updateRequest);
Optional<EnumMessage> error = validator.tillFirstError();
if (error.isPresent()) {
throw new ValidationException(error.get());
}
}
ImdgTransaction transaction = imdgProvider.newTransaction();
transaction.beginTransaction();
boolean txOk = false;

View file

@ -8,6 +8,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.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.profile.Contact;
@ -54,12 +55,14 @@ public class MultiCompanyService
final ContactService contactService;
final AccountNotificationHelper accountNotification;
final RelationService relationService;
final ClearingMemberCategoryService clearingMemberCategoryService;
final ImdgProvider imdgProvider;
final Imdg<Company> companyIMap;
final Imdg<CompanySymbols> companySymbolsImdg;
final Imdg<ProfileDocument> profileDocumentImdg;
final Imdg<Contact> contactImdg;
final Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
@Autowired
public MultiCompanyService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
@ -74,8 +77,8 @@ public class MultiCompanyService
AccountNotificationHelper accountNotification,
RelationService relationService,
ValidationHelper validationHelper,
UserRoleVerification userRoleVerification
) {
UserRoleVerification userRoleVerification,
ClearingMemberCategoryService clearingMemberCategoryService) {
super(kafkaQueue, kafkaProducer);
this.imdgProvider = imdgProvider;
this.requestHelper = requestHelper.setLogger(log);
@ -92,6 +95,8 @@ public class MultiCompanyService
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
contactImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Contact, Contact.class);
clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
this.clearingMemberCategoryService = clearingMemberCategoryService;
}
@Override
@ -123,7 +128,7 @@ public class MultiCompanyService
fillCompanyId(req, companyId);
} else {
fillCompanyId(req, companyId);
companyService.update(req.getCompany());
companyService.update(req.getCompany(), false);
}
RequestInfoUpdate replyI;
@ -171,6 +176,20 @@ public class MultiCompanyService
validateReply(companyId, "contactUpdate", replyI);
}
}
for (ClearingMemberCategoryNewRequest partRequest : req.getCategories()) {
ClearingMemberCategory existCategory = findCategory(partRequest);
if (existCategory == null) {
log.trace("For company[{}] do new category", companyId);
replyI = clearingMemberCategoryService.clearingMemberCategoryNew(wrapRequest(baseRequest, partRequest, ActionType.NEW));
validateReply(companyId, "contactNew", replyI);
} else {
log.trace("For company[{}] do update category[{}]", companyId, existCategory.getId());
ClearingMemberCategoryUpdateRequest partUpdateRequest = createUpdateRequest(existCategory, partRequest);
replyI = clearingMemberCategoryService.clearingMemberCategoryUpdate(wrapRequest(baseRequest, partUpdateRequest, ActionType.UPDATE));
validateReply(companyId, "categoryUpdate", replyI);
}
}
txOk = true;
} catch (ValidationException vex) {
log.error("For companyId={} error: {}", companyId, ExceptionUtils.getStackTrace(vex));
@ -229,6 +248,17 @@ public class MultiCompanyService
return allCS.iterator().next();
}
ClearingMemberCategory findCategory(ClearingMemberCategoryNewRequest partRequest) {
Map<String, Comparable<?>> query = new HashMap<>();
query.put("companyId", partRequest.getCompanyId());
Collection<ClearingMemberCategory> allCS = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(query);
if (allCS.isEmpty())
return null;
if (allCS.size() > 1)
log.warn("Fount {} ClearingMemberCategory by: {}", allCS.size(), query);
return allCS.iterator().next();
}
ProfileDocumentUpdateRequest createUpdateRequest(ProfileDocument existDocument, ProfileDocumentNewRequest partRequest) {
ProfileDocumentUpdateRequest r = new ProfileDocumentUpdateRequest();
r.setId(existDocument.getId());
@ -264,6 +294,13 @@ public class MultiCompanyService
return r;
}
ClearingMemberCategoryUpdateRequest createUpdateRequest(ClearingMemberCategory existCategory, ClearingMemberCategoryNewRequest partRequest) {
ClearingMemberCategoryUpdateRequest r = new ClearingMemberCategoryUpdateRequest();
r.setId(existCategory.getId());
r.setClearingMemberCategory(partRequest.getClearingMemberCategory());
return r;
}
Long getCompanyIdForCompanySymbols(String uuid, CompanyNewRequest cnr) {
CompanySymbols companySymbol = null;
if (StringUtils.isNotEmpty(uuid)) {
@ -339,5 +376,8 @@ public class MultiCompanyService
for (ContactNewRequest c : req.getContacts()) {
c.setCompanyId(companyId);
}
for (ClearingMemberCategoryNewRequest c : req.getCategories()) {
c.setCompanyId(companyId);
}
}
}

View file

@ -13,6 +13,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.company.SecurityFondGatew
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.InstrumentType;
import ru.spcex.platform.utils.log.ExceptionUtils;
import java.util.List;
import java.util.UUID;
@ -34,6 +35,7 @@ public class SecurityService {
public void sendRequest(FondListingsRequest request) {
List<FondSecurity> securityList = request.getSecurities();
for (FondSecurity security : securityList) {
log.debug("process security uuid: {}", security.getId());
UUID securityId = security.getId();
log.debug("Grouping by securityId: {}", securityId);
List<IncomeListing> incomeListings = groupByCompanyId(request.getListingList(), securityId);
@ -48,16 +50,22 @@ public class SecurityService {
map(securityRequestAdapter::toFixedIncomeCashFlowRequest).toList();
SecurityFondGatewayRequest securityGatewayRequest;
if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) {
FixedIncomeSecurityNewRequest fixedIncomeSecurityNewRequest = securityRequestAdapter.toFixedIncomeSecurityRequest(security);
securityGatewayRequest = new FixedIncomeGatewayRequest(fixedIncomeSecurityNewRequest);
fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests);
kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_BOND_GATEWAY, securityGatewayRequest);
} else {
EquitySecurityNewRequest equitySecurityNewRequest = securityRequestAdapter.toEquitySecurityNewRequest(security);
securityGatewayRequest = new EquitySecurityGatewayRequest(equitySecurityNewRequest);
fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests);
kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_EQTY_GATEWAY, securityGatewayRequest);
try {
if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) {
FixedIncomeSecurityNewRequest fixedIncomeSecurityNewRequest = securityRequestAdapter.toFixedIncomeSecurityRequest(security);
securityGatewayRequest = new FixedIncomeGatewayRequest(fixedIncomeSecurityNewRequest);
fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests);
log.debug("Send request to DESTINATION_SECURITY_BOND_GATEWAY");
kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_BOND_GATEWAY, securityGatewayRequest);
} else {
EquitySecurityNewRequest equitySecurityNewRequest = securityRequestAdapter.toEquitySecurityNewRequest(security);
securityGatewayRequest = new EquitySecurityGatewayRequest(equitySecurityNewRequest);
fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests);
log.debug("Send request to DESTINATION_SECURITY_BOND_GATEWAY");
kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_EQTY_GATEWAY, securityGatewayRequest);
}
} catch (Throwable e) {
log.error("{}", ExceptionUtils.getStackTrace(e));
}
}

View file

@ -5,6 +5,7 @@ import ru.spcex.clearing.gatewayapi.controller.inbound.request.company.*;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.*;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.WorkflowStatus;
@Service
public class CompanyRequestAdapter {
@ -19,6 +20,7 @@ public class CompanyRequestAdapter {
companyNewRequest.setClearingCode(company.getClearingCode());
companyNewRequest.setRegistrationCode(company.getRegistrationCode());
companyNewRequest.setInitiatorCode(company.getInitiatorCode());
companyNewRequest.setWorkflowStatus(WorkflowStatus.Active.getKey());
return companyNewRequest;
}
@ -64,4 +66,10 @@ public class CompanyRequestAdapter {
clientCodeNewRequest.setDepoAccountId(client.getDepoAccountId());
return clientCodeNewRequest;
}
public ClearingMemberCategoryNewRequest toCategoryRequest(CompanyClearingCategory companyClearingCategory) {
ClearingMemberCategoryNewRequest categoryNewRequest = new ClearingMemberCategoryNewRequest();
categoryNewRequest.setClearingMemberCategory(companyClearingCategory.getCategory());
return categoryNewRequest;
}
}

View file

@ -20,7 +20,9 @@ public class SecurityRequestAdapter {
fixedIncomeSecurityNewRequest.setNominalValue(fondSecurity.getNominalValue());
fixedIncomeSecurityNewRequest.setNominalCurrency(fondSecurity.getNominalCurrency());
fixedIncomeSecurityNewRequest.setMaturityDate(fondSecurity.getMaturityDate());
fixedIncomeSecurityNewRequest.setCouponFrequency(fondSecurity.getCouponFrequency().longValue());
if (fondSecurity.getCouponFrequency() != null) {
fixedIncomeSecurityNewRequest.setCouponFrequency(fondSecurity.getCouponFrequency().longValue());
}
fixedIncomeSecurityNewRequest.setShortNameEng(fondSecurity.getShortNameEng());
fixedIncomeSecurityNewRequest.setFullNameEng(fondSecurity.getFullNameEng());
fixedIncomeSecurityNewRequest.setWorkflowStatus(fondSecurity.getWorkflowStatus());

View file

@ -8,10 +8,7 @@ import ru.spcex.clearing.gatewayapi.controller.inbound.request.company.*;
import ru.spcex.clearing.gatewayapi.service.adapter.CompanyRequestAdapter;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.ContactNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.ProfileDocumentNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.*;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import java.util.List;
@ -50,6 +47,8 @@ public class CompanyProcessor {
map(companyRequestAdapter::toProfileDocumentRequest).toList();
List<ClientCodeNewRequest> clientCodeNewRequests = clients.stream().
map(companyRequestAdapter::toClientRequest).toList();
List<ClearingMemberCategoryNewRequest> categories = companyClearingCategories.stream().
map(companyRequestAdapter::toCategoryRequest).toList();
CompanyGatewayRequest companyGatewayRequest = new CompanyGatewayRequest();
companyGatewayRequest.setCompany(companyRequestAdapter.toCompanyRequest(memberCompany));
@ -62,6 +61,7 @@ public class CompanyProcessor {
companyGatewayRequest.setContacts(contactNewRequests);
companyGatewayRequest.setProfileDocuments(profileDocumentNewRequests);
companyGatewayRequest.setClientCodes(clientCodeNewRequests);
companyGatewayRequest.setCategories(categories);
kafkaSender.sendRequestToQueue(Consts.DESTINATION_COMPANY_GATEWAY_REQUEST, companyGatewayRequest);
}

View file

@ -1,5 +1,6 @@
package ru.spcex.clearing.securities.service.cud;
import org.apache.commons.lang3.StringUtils;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
@ -150,6 +151,9 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
}
<T extends Security> T findSecurityBySecuritySymbol(Imdg<T> imdg, String securitySymbol) {
if (StringUtils.isEmpty(securitySymbol)) {
return null;
}
Collection<T> securities = imdg.getCollectionObjectsByFieldValues(
Map.of("securitySymbol", securitySymbol)
);
@ -194,21 +198,6 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
security = fixedIncomeSecurityService.updateFixedIncome0(updateRequest);
}
}
if (InstrumentType.EQTY.equalsByKey(req.getSecurityType())) {
EquitySecurityGatewayRequest equitySecurityGatewayRequest = (EquitySecurityGatewayRequest) req;
EquitySecurityNewRequest equityRequest = equitySecurityGatewayRequest.getSecurity();
equityRequest.setIssuerId(companyId);
log.trace("EquitySecurityNewRequest - FOND");
String securitySymbol = equityRequest.getSecuritySymbol();
security = findSecurityBySecuritySymbol(equitySecurityImdg, securitySymbol);
if (security == null) {
security = equitySecurityService.newEquity0(equityRequest);
} else {
EquitySecurityUpdateRequest updateRequest = toUpdateRequest(security, equityRequest);
security = equitySecurityService.updateEquity0(updateRequest);
}
}
} catch (ValidationException expected) {
log.warn("Error create or update issue: {}", expected.toString());
return requestHelper.makeErrorResponse(baseRequest, expected.getEnumMsg());

View file

@ -22,6 +22,7 @@ public class CompanyGatewayRequest {
List<ContactNewRequest> contacts = new ArrayList<>();
@JsonProperty
List<ClientCodeNewRequest> clientCodes = new ArrayList<>();
List<ClearingMemberCategoryNewRequest> categories = new ArrayList<>();
public String getUuid() {
return uuid;
@ -78,4 +79,12 @@ public class CompanyGatewayRequest {
public void setClientCodes(List<ClientCodeNewRequest> clientCodes) {
this.clientCodes = clientCodes;
}
public List<ClearingMemberCategoryNewRequest> getCategories() {
return categories;
}
public void setCategories(List<ClearingMemberCategoryNewRequest> categories) {
this.categories = categories;
}
}