diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/company/CompanySymbolNewAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/company/CompanySymbolNewAction.java index 0ed4dcd1a..2ec0b8681 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/company/CompanySymbolNewAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/company/CompanySymbolNewAction.java @@ -4,9 +4,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModelProperty; import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.platform.messaging.domain.ActionType; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolNewRequest; -public class CompanySymbolNewAction implements IAction { +public class CompanySymbolNewAction implements IAction { @ApiModelProperty(value = "Идентификатор Компании", example = "1234") @JsonProperty private Long companyId; @@ -18,8 +18,8 @@ public class CompanySymbolNewAction implements IAction clearingService.executeSTrade()) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java index dd42e9530..208158ed2 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java @@ -14,7 +14,6 @@ import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; -import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; @@ -81,11 +80,8 @@ public class StatementService extends QueueConsumer implements InitializingBean Result res = service.execute(sdfGroup, statementRequest); if (res.getAccountRequests().size() != 0) { kafkaSender.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); - } else if (service.isNeedToSendCommandToExport()) { - ExportToFileRequest exportRequest = new ExportToFileRequest(); - exportRequest.setSdfGroupId(res.getGenerationId()); - exportRequest.setNameOfTable(service.exportTableName()); - kafkaSender.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); + } else if (service.isNeedToSendCommand()) { + service.sendCommand(kafkaSender, res); } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilder.java new file mode 100644 index 000000000..ff1f9ecde --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilder.java @@ -0,0 +1,74 @@ +package ru.spcex.clearing.service.builder; + +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; +import ru.clearing.classes.statics.data.registry.Registry; +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.Map; + +public class PaymentInstructionBuilder { + + private Registry registry; + private ImdgProvider imdgProvider; + + public static PaymentInstructionBuilder builder(ImdgProvider imdgProvider, Registry registry) { + return new PaymentInstructionBuilder(imdgProvider, registry); + } + + private PaymentInstructionBuilder(ImdgProvider imdgProvider, Registry registry) { + this.imdgProvider = imdgProvider; + this.registry = registry; + } + + public PaymentInstruction build() { + PaymentInstruction paymentInstruction = new PaymentInstruction(); + paymentInstruction.setSenderId(registry.getCompanyId()); + paymentInstruction.setAddresseeId(registry.getCounterPartyId()); + + Imdg companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(Map.of( + "companyId", registry.getCompanyId(), + "companySymbol", CompanySymbol.BIC.getKey()) + ); + CompanySymbols counterCompanySymbols = companySymbolsImdg.getSingleObjectByFieldValues(Map.of( + "companyId", registry.getCounterPartyId(), + "companySymbol", CompanySymbol.BIC.getKey()) + ); + + if (companySymbols != null) { + paymentInstruction.setPayeeBic(companySymbols.getCompanySymbolValue()); + } + if (counterCompanySymbols != null) { + paymentInstruction.setAdresseeBic(counterCompanySymbols.getCompanySymbolValue()); + } + + Imdg companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getSingleObjectByFieldValues(Map.of("companyId", registry.getCompanyId())); + if (company != null) { + paymentInstruction.setPayeeBankName(company.getShortName()); + paymentInstruction.setAddresseeBankName(company.getShortName()); + } + paymentInstruction.setSettlementDate(registry.getSettlementDate()); + paymentInstruction.setCreditLeg_amount(registry.getBalance()); + paymentInstruction.setDebitLeg_amount(registry.getBalance()); + paymentInstruction.setCreditLeg_accountId(registry.getAccountId()); + + Imdg accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + Account account = accountImdg.getSingleObjectByID(registry.getAccountId()); + if (account != null) { + paymentInstruction.setCreditLeg_account(account.getAccount()); + } + + paymentInstruction.setDebitLeg_accountId(registry.getAccountId()); + +// Account account = accountImdg.getSingleObjectByID(registry.get()); +// paymentInstruction.setDebitLeg_account(); + return paymentInstruction; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/AbstractExecutor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/AbstractExecutor.java index b1bc4cddf..afead4914 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/AbstractExecutor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/AbstractExecutor.java @@ -1,6 +1,7 @@ package ru.spcex.clearing.service.executors; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.service.model.Result; import java.util.Collection; @@ -8,5 +9,6 @@ import java.util.Collection; public abstract class AbstractExecutor { public abstract Result execute(Collection sdf, StatementRequest statementRequest); public abstract String exportTableName(); - public abstract boolean isNeedToSendCommandToExport(); + public abstract boolean isNeedToSendCommand(); + public abstract void sendCommand(KafkaSender kafkaSender, Result result); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java index e2b30c58c..8f18d90cc 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java @@ -11,8 +11,11 @@ import ru.clearing.classes.statics.data.sdf.SDf02; import ru.clearing.classes.statics.data.statement.Statement; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.service.LoggingService; import ru.spcex.clearing.service.model.Result; import ru.spcex.clearing.service.validation.ValidationStored; @@ -65,10 +68,18 @@ public class Sdf01Executor extends AbstractExecutor { } @Override - public boolean isNeedToSendCommandToExport() { + public boolean isNeedToSendCommand() { return true; } + @Override + public void sendCommand(KafkaSender kafkaSender, Result result) { + ExportToFileRequest exportRequest = new ExportToFileRequest(); + exportRequest.setSdfGroupId(result.getGenerationId()); + exportRequest.setNameOfTable(exportTableName()); + kafkaSender.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); + } + public Result execute(Collection sdf, StatementRequest statementRequest) { Result result = new Result(); Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java index 21fd8fa77..7be4a4e1b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java @@ -14,7 +14,10 @@ import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.statement.Statement; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.ContinueSessionBnRequest; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.service.LoggingService; import ru.spcex.clearing.service.model.Result; import ru.spcex.clearing.service.validation.ValidationStored; @@ -78,9 +81,16 @@ public class Sdf57Executor extends AbstractExecutor { } @Override - public boolean isNeedToSendCommandToExport() { - return false; - }//no need... + public boolean isNeedToSendCommand() { + return true; + } + + @Override + public void sendCommand(KafkaSender kafkaSender, Result result) { + ContinueSessionBnRequest continueSessionBn = new ContinueSessionBnRequest(); + continueSessionBn.setGenerationId(result.getGenerationId()); + kafkaSender.sendRequestToQueue(Consts.CONTINUE_SESSION_BN, continueSessionBn); + } //V - Изменение statement по sDf57 // @@ -145,7 +155,13 @@ public class Sdf57Executor extends AbstractExecutor { }; Consumer create = (dsgn) -> { Registry registry = createRegistryByStatement(stmt, company, account, dsgn); + Registry registryF = registry.clone(); + registryF.setRegistryUnit(RegistryUnit.F.getKey()); + Registry registryB = registry.clone(); + registryB.setRegistryUnit(RegistryUnit.B.getKey()); registryImdg.insert(registry); + registryImdg.insert(registryF); + registryImdg.insert(registryB); }; //todo понять что происходит со инициатором/контрагентом, особенно если у нас только один Statement @@ -181,7 +197,7 @@ public class Sdf57Executor extends AbstractExecutor { Statement statement = new Statement(); statement.setAddresseeId(companyDeb.getId()); statement.setSenderId(Sender.Prc.getId()); - statement.setStatementType(StatementType.full.getKey()); + statement.setStatementType(StatementType.incr.getKey()); statement.setContract(getContractFromSpecif(sdf57.getSpecif())); statement.setAccountId(accountDeb.getId()); statement.setAccount(accountDeb.getAccount()); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java index d962c1355..94346090e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java @@ -19,6 +19,7 @@ import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.api.predicate.specific.StatementRevisePredicate; import ru.spcex.platform.utils.enumeration.IEnumKey; @@ -93,32 +94,31 @@ public class BalanceRevise implements ISessionStage { Collection stmts = statementImdg.getCollectionObjectsBySQL(statementSQL); for (Statement stmt : stmts) { - String unformatted = "registry_designation = '%s' " + - "and registry_instrument_type = '%s' " + - "and registry_unit = '%s' " + - "and account = '%s' " + - "and securityId = %d"; + String unformatted = "%s and account = '%s' and securityId = %d"; + + RegistryTradingParams registryAMT = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, + null, RegistryUnit.T); + RegistryTradingParams registryAMF = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, + null, RegistryUnit.F); + RegistryTradingParams registryAMB = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, + null, RegistryUnit.B); + String registrySqlAMT = String.format(unformatted, - RegistryDesignation.A.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), + RegistryCodeSqlBuilder.getInstance(registryAMT).build(), stmt.getAccount(), stmt.getSecurityId() ); String registrySqlAMF = String.format(unformatted, - RegistryDesignation.A.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.F.getKey(), + RegistryCodeSqlBuilder.getInstance(registryAMF).build(), stmt.getAccount(), stmt.getSecurityId() ); String registrySqlAMB = String.format(unformatted, - RegistryDesignation.A.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.B.getKey(), + RegistryCodeSqlBuilder.getInstance(registryAMB).build(), stmt.getAccount(), stmt.getSecurityId() ); + Registry rgsAMT = registryImdg.getSingleObjectBySQL(registrySqlAMT); Registry rgsAMF = registryImdg.getSingleObjectBySQL(registrySqlAMF); Registry rgsAMB = registryImdg.getSingleObjectBySQL(registrySqlAMB); @@ -152,14 +152,11 @@ public class BalanceRevise implements ISessionStage { InOutSDfType.type1.getKey(), OperationStatus.Pending.getKey(), StatementType.full.getKey()); Collection stmts = statementImdg.getCollectionObjectsBySQL(statementSQL); for (Statement stmt : stmts) { - String registrySqlAMT = String.format("registry_designation = '%s' " + - "and registry_instrument_type = '%s' " + - "and registry_unit = '%s' " + - "and account = '%s' " + - "and securityId = %d", - RegistryDesignation.A.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), + + RegistryTradingParams registryAMT = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, + null, RegistryUnit.T); + String registrySqlAMT = String.format("%s and account = '%s' and securityId = %d", + RegistryCodeSqlBuilder.getInstance(registryAMT).build(), stmt.getAccount(), stmt.getSecurityId() ); @@ -175,7 +172,7 @@ public class BalanceRevise implements ISessionStage { } private void newSDf56(Statement statement) { - log.debug("GALB request received; creating sdf56"); + log.debug("creating sdf56"); SDf56 sDf56 = new SDf56(); sDf56.setNumber(idGenerator.nextId().toString()); Instant now = Instant.now(); diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/CompanySymbolValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/CompanySymbolValidationConfig.java index 9c8ae450e..7dd825470 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/CompanySymbolValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/CompanySymbolValidationConfig.java @@ -4,22 +4,17 @@ 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.CompanySymbols; -import ru.clearing.platform.dictionary.*; +import ru.clearing.platform.dictionary.CompanySymbolDictionary; import ru.spcex.clearing.company.error.CompanyErrors; -import ru.spcex.clearing.company.validation.CompanySymbolNotExistRule; import ru.spcex.clearing.company.validation.CompanySymbolOfSymbolNewRequestNotExistRule; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyInfoUpdateRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolUpdateRequest; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; -import ru.spcex.clearing.validation.common.rules.EnumPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; -import ru.spcex.platform.enumeration.CompanySymbol; -import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.validation.IValidator; @@ -33,16 +28,16 @@ import java.util.function.Function; public class CompanySymbolValidationConfig { @Bean("companySymbolNewRequestValidator") - public Function companySymbolNewRequestValidator(Map> imdgForValidation) { - return companySymbolUpdateRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(companySymbolUpdateRequest); + public Function companySymbolNewRequestValidator(Map> imdgForValidation) { + return companySymbolNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(companySymbolNewRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_CompanySymbols); addImdg.accept(IMDGDistributedNames.Map_CompanySymbolDictionary); addImdg.accept(IMDGDistributedNames.Map_Company); return new ValidatorImpl<>(context, - FieldRequiredRule.instance("companyId", CompanySymbolUpdateRequest::getCompanyId, CompanyErrors.RequiredFieldEmpty), + FieldRequiredRule.instance("companyId", CompanySymbolNewRequest::getCompanyId, CompanyErrors.RequiredFieldEmpty), IdPresentRule.instance("companyId", CompanySymbolUpdateRequest::getCompanyId, IMDGDistributedNames.Map_Company, @@ -52,7 +47,7 @@ public class CompanySymbolValidationConfig { // FieldRequiredRule.instance("companySymbol", CompanySymbolUpdateRequest::getCompanySymbol, CompanyErrors.RequiredFieldEmpty), // FieldRequiredRule.instance("companySymbolValue", CompanySymbolUpdateRequest::getCompanySymbolValue, CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("companySymbol", - CompanySymbolUpdateRequest::getCompanySymbol, + CompanySymbolNewRequest::getCompanySymbol, IMDGDistributedNames.Map_CompanySymbolDictionary, CompanySymbolDictionary.class, CompanyErrors.RequiredFieldEmpty, @@ -104,4 +99,35 @@ public class CompanySymbolValidationConfig { ); }; } + + + @Bean("companySymbolDeleteRequestValidator") + public Function companySymbolDeleteRequestValidator( + Map> imdgForValidation + ) { + return companySymbolDeleteRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(companySymbolDeleteRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_DocumentTypeDictionary); + addImdg.accept(IMDGDistributedNames.Map_CompanySymbols); + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + CommonDeleteRequest::getId, + IMDGDistributedNames.Map_CompanySymbols, + CompanySymbols.class, + CompanyErrors.RequiredFieldEmpty, + CompanyErrors.RecordNotFound, + companySymbol -> { + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getSingleObjectByID(companySymbol.getCompanyId()); + if (company == null) { + return CompanyErrors.CompanyNotFound; + } + return null; + }) + ); + }; + } } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java index 5ee1b2778..72a2fc37d 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java @@ -11,7 +11,6 @@ import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.spcex.clearing.company.error.CompanyErrors; -import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -20,6 +19,7 @@ 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.util.security.UserRoleVerification; +import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.UserRole; @@ -46,15 +46,13 @@ public class CompanyService extends QueueConsumer implements InitializingBean { private final ImdgId idSequence; private final Imdg companyIMap; protected UserRoleVerification userRoleVerification; - - private ValidationHelper validationHelper; - private Function companyNewRequestValidator; - private Function companyUpdateRequestValidator; - private Function companyDeleteRequestValidator; - protected CompanySymbolService companySymbolService; protected AccountNotificationHelper accountNotification; protected RelationService relationService; + private final ValidationHelper validationHelper; + private final Function companyNewRequestValidator; + private final Function companyUpdateRequestValidator; + private final Function companyDeleteRequestValidator; @Autowired public CompanyService(Consumer kafkaQueue, Producer kafkaProducer, @@ -134,7 +132,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean { try { if (req.getCompanySymbol() != null) { CompanySymbols newSymbol = companySymbolService.createCompanySymbol(transaction, company.getId(), req.getCompanySymbol(), req.getCompanySymbolValue()); - updateCompanyBySymbol(company, newSymbol); + updateCompanyBySymbol(company, newSymbol, false); } company.setWorkflowStatus(req.getWorkflowStatus()); @@ -215,20 +213,26 @@ public class CompanyService extends QueueConsumer implements InitializingBean { return null; } - protected void updateCompanyBySymbol(Company company, CompanySymbols companySymbol) { + protected void updateCompanyBySymbol(Company company, CompanySymbols companySymbol, boolean shouldBeDeleted) { assert company.getId().equals(companySymbol.getCompanyId()); + String companySymbolValue = companySymbol.getCompanySymbolValue(); + String setUpValue = shouldBeDeletedOrSet(companySymbolValue, shouldBeDeleted); if (CompanySymbol.TRDC.equalsByKey(companySymbol.getCompanySymbol())) { - company.setTradingCode(companySymbol.getCompanySymbolValue()); + company.setTradingCode(setUpValue); } if (CompanySymbol.CLRC.equalsByKey(companySymbol.getCompanySymbol())) { - company.setClearingCode(companySymbol.getCompanySymbolValue()); + company.setClearingCode(setUpValue); } if (CompanySymbol.RGRC.equalsByKey(companySymbol.getCompanySymbol())) { - company.setRegistrationCode(companySymbol.getCompanySymbolValue()); + company.setRegistrationCode(setUpValue); } } - public synchronized void updateCompanyBySymbol(ImdgTransaction transaction, CompanySymbols companySymbol) throws ClearingBaseException { + private String shouldBeDeletedOrSet(String companySymbol, boolean shouldBeDeleted) { + return shouldBeDeleted ? "" : companySymbol; + } + + public synchronized void updateCompanyBySymbol(ImdgTransaction transaction, CompanySymbols companySymbol, boolean shouldBeDeleted) throws ClearingBaseException { if (companySymbol.getCompanyId() == null) { throw new IllegalArgumentException("Required companySymbol.companyId"); } @@ -241,7 +245,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean { if (company == null) { throw new ClearingBaseException(new EnumMessage(CompanyErrors.CompanyNotFound, companySymbol.getCompanyId())); } - updateCompanyBySymbol(company, companySymbol); + updateCompanyBySymbol(company, companySymbol, shouldBeDeleted); company.setUpdated(Instant.now()); companyMap.update(company); log.debug("Company {} updated by change CompanySymbols {} ({})", diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanySymbolService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanySymbolService.java index cf534c0ea..41addee87 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanySymbolService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanySymbolService.java @@ -10,20 +10,24 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.spcex.clearing.util.services.RequestHelper; +import ru.spcex.clearing.company.error.CompanyErrors; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.UserRole; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgTransaction; +import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.error.ClearingBaseException; import ru.spcex.platform.utils.validation.IValidator; @@ -35,13 +39,13 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB private final Logger log = LoggerFactory.getLogger(getClass()); private final ImdgProvider imdgProvider; private final ImdgId idSequence; - protected CompanyService companyService; - private final RequestHelper requestHelper; + protected CompanyService companyService; protected ValidationHelper validationHelper; protected UserRoleVerification userRoleVerification; - protected Function companySymbolNewRequestValidator; + protected Function companySymbolNewRequestValidator; protected Function companySymbolUpdateRequestValidator; + protected Function companySymbolDeleteRequestValidator; @Autowired public CompanySymbolService(Consumer kafkaQueue, Producer kafkaProducer, @@ -50,7 +54,9 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB ValidationHelper validationHelper, UserRoleVerification userRoleVerification, @Qualifier("companySymbolNewRequestValidator") - Function companySymbolNewRequestValidator, + Function companySymbolNewRequestValidator, + @Qualifier("companySymbolDeleteRequestValidator") + Function companySymbolDeleteRequestValidator, @Qualifier("companySymbolUpdateRequestValidator") Function companySymbolUpdateRequestValidator ) { @@ -64,16 +70,20 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB userRoleVerification.setRoleForVerification(UserRole.Admin); this.companySymbolNewRequestValidator = companySymbolNewRequestValidator; this.companySymbolUpdateRequestValidator = companySymbolUpdateRequestValidator; + this.companySymbolDeleteRequestValidator = companySymbolDeleteRequestValidator; } @Override public void afterPropertiesSet() { - callback(CompanySymbolUpdateRequest.class) + callback(CompanySymbolNewRequest.class) .setFunction(this::companySymbolNew) .forDestination(Consts.DESTINATION_COMPANY_SYMBOL_NEW, callbacks::put); callback(CompanySymbolUpdateRequest.class) .setFunction(this::companySymbolUpdate) .forDestination(Consts.DESTINATION_COMPANY_SYMBOL_UPDATE, callbacks::put); + callback(CommonDeleteRequest.class) + .setFunction(this::companySymbolDelete) + .forDestination(Consts.DESTINATION_COMPANY_SYMBOL_DELETE, callbacks::put); init(); } @@ -82,8 +92,8 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB } - public RequestInfoUpdate companySymbolNew(BaseRequest symbolRequest) { - CompanySymbolUpdateRequest req = symbolRequest.getRequestPayload(); + public RequestInfoUpdate companySymbolNew(BaseRequest symbolRequest) { + CompanySymbolNewRequest req = symbolRequest.getRequestPayload(); log.debug("CompanySymbolNewRequest received, id={}", symbolRequest.getId()); { // validate RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(symbolRequest); @@ -107,7 +117,7 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB Imdg companySymbolsTMap = transaction.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); companySymbolsTMap.update(companySymbols); try { - companyService.updateCompanyBySymbol(transaction, companySymbols); + companyService.updateCompanyBySymbol(transaction, companySymbols, false); } catch (ClearingBaseException e) { return requestHelper.makeErrorResponse(symbolRequest, e.getEnumMsg()); } @@ -141,15 +151,18 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB try { Imdg companySymbolsTMap = transaction.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); companySymbols = companySymbolsTMap.getSingleObjectByID(req.getId()); -// companySymbols.setCompanySymbol(req.getCompanySymbol()); по ТЗ не должен менятся при обновлении + if (companySymbols == null) { + throw new ClearingBaseException(new EnumMessage(CompanyErrors.CompanyInfoNotFound, req.getId())); + } + if (!companySymbols.getCompanySymbol().equalsIgnoreCase(req.getCompanySymbolValue())) { + throw new ClearingBaseException(new EnumMessage(CompanyErrors.EditCompanySymbols, req.getId())); + } companySymbols.setCompanySymbolValue(req.getCompanySymbolValue()); companySymbolsTMap.update(companySymbols); - try { - companyService.updateCompanyBySymbol(transaction, companySymbols); - } catch (ClearingBaseException e) { - return requestHelper.makeErrorResponse(symbolRequest, e.getEnumMsg()); - } + companyService.updateCompanyBySymbol(transaction, companySymbols, false); txOk = true; + } catch (ClearingBaseException e) { + return requestHelper.makeErrorResponse(symbolRequest, e.getEnumMsg()); } finally { if (txOk) transaction.commitTransaction(); @@ -161,6 +174,42 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB return null; } + public RequestInfoUpdate companySymbolDelete(BaseRequest symbolRequest) { + CommonDeleteRequest req = symbolRequest.getRequestPayload(); + log.debug("CommonDeleteRequest for CompanySymbol received, id={}", symbolRequest.getId()); + + { // validate + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(symbolRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(symbolRequest, companySymbolDeleteRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + } + CompanySymbols companySymbols; + ImdgTransaction transaction = imdgProvider.newTransaction(); + transaction.beginTransaction(); + boolean txOk = false; + try { + Imdg companySymbolsTMap = transaction.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + companySymbols = companySymbolsTMap.getSingleObjectByID(req.getId()); + if (companySymbols == null) { + throw new ClearingBaseException(new EnumMessage(CompanyErrors.CompanyInfoNotFound, req.getId())); + } + companySymbolsTMap.delete(companySymbols); + companyService.updateCompanyBySymbol(transaction, companySymbols, true); + txOk = true; + } catch (ClearingBaseException e) { + return requestHelper.makeErrorResponse(symbolRequest, e.getEnumMsg()); + } finally { + if (txOk) + transaction.commitTransaction(); + else + transaction.rollbackTransaction(); + } + + log.debug("successfully processed, id {}", companySymbols.getId()); + return null; + } public CompanySymbols createCompanySymbol(ImdgTransaction transaction, Long companyId, String companySymbol, String companySymbolValue) { Objects.requireNonNull(companyId); diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/validation/CompanySymbolOfSymbolNewRequestNotExistRule.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/validation/CompanySymbolOfSymbolNewRequestNotExistRule.java index 1e15c4986..f8dba7678 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/validation/CompanySymbolOfSymbolNewRequestNotExistRule.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/validation/CompanySymbolOfSymbolNewRequestNotExistRule.java @@ -3,17 +3,12 @@ package ru.spcex.clearing.company.validation; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.spcex.clearing.company.error.CompanyErrors; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolUpdateRequest; -import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolNewRequest; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; -import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -21,10 +16,10 @@ import java.util.Optional; /** * Проверка наличия CompanySymbols с переданными в запросе companySymbol и companyId */ -public class CompanySymbolOfSymbolNewRequestNotExistRule implements IValidationRule> { +public class CompanySymbolOfSymbolNewRequestNotExistRule implements IValidationRule> { @Override - public Optional validate(ImdgValidationContext context) { - CompanySymbolUpdateRequest request = context.getValidatedObject(); + public Optional validate(ImdgValidationContext context) { + CompanySymbolNewRequest request = context.getValidatedObject(); Imdg companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index e0197d92c..a897be3b6 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -121,7 +121,7 @@ public interface Consts { String SDF53_PROCESS = "sdf53-process"; String SDF54_PROCESS = "sdf54-process"; String SDF56_PROCESS = "sdf56-process"; - String SDF57_PROCESS = "sdf57-process"; + String CONTINUE_SESSION_BN = "sdf57-process"; String REVISE_PROCESS = "revise-process"; String EXPORT_PROCESS = "export-process"; String EXPORT_COMPLETED = "export_completed"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/clearing/ContinueSessionBnRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/clearing/ContinueSessionBnRequest.java new file mode 100644 index 000000000..e02afec3c --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/clearing/ContinueSessionBnRequest.java @@ -0,0 +1,16 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.clearing; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ContinueSessionBnRequest { + @JsonProperty + private Long generationId; + + public Long getGenerationId() { + return generationId; + } + + public void setGenerationId(Long generationId) { + this.generationId = generationId; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CompanySymbolNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CompanySymbolNewRequest.java new file mode 100644 index 000000000..610fd1f6a --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CompanySymbolNewRequest.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.company; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CompanySymbolNewRequest { + @JsonProperty + public Long companyId; + + @JsonProperty + private String companySymbol; + + @JsonProperty + private String companySymbolValue; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getCompanySymbol() { + return companySymbol; + } + + public void setCompanySymbol(String companySymbol) { + this.companySymbol = companySymbol; + } + + public String getCompanySymbolValue() { + return companySymbolValue; + } + public void setCompanySymbolValue(String companySymbolValue) { + this.companySymbolValue = companySymbolValue; + } +}