From 4bcf82001908bfda58d6ec1676d015b895abb3d9 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 24 May 2023 13:27:40 +0300 Subject: [PATCH 1/6] copy SDF*executors to clearing-service --- .../clearing/config/SdfExecutorsConfig.java | 24 ++ .../clearing/config/ValidationConfig.java | 42 +++- .../spcex/clearing/error/ClearingError.java | 4 +- .../clearing/service/LoggingService.java | 27 +++ .../clearing/service/StatementService.java | 108 +++++++++ .../service/executors/AbstractExecutor.java | 11 + .../service/executors/Sdf01Executor.java | 198 ++++++++++++++++ .../service/executors/Sdf57Executor.java | 215 ++++++++++++++++++ .../spcex/clearing/service/model/Result.java | 27 +++ .../validation/MarketIsUValidationRule.java | 23 ++ .../validation/Sdf01ValidationRule.java | 99 ++++++++ .../validation/Sdf57ValidationRule.java | 94 ++++++++ .../service/validation/ValidationStored.java | 5 +- 13 files changed, 871 insertions(+), 6 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/SdfExecutorsConfig.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/LoggingService.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/AbstractExecutor.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/model/Result.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/MarketIsUValidationRule.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf01ValidationRule.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf57ValidationRule.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/SdfExecutorsConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/SdfExecutorsConfig.java new file mode 100644 index 000000000..86a1142e9 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/SdfExecutorsConfig.java @@ -0,0 +1,24 @@ +package ru.spcex.clearing.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.service.executors.AbstractExecutor; +import ru.spcex.clearing.service.executors.Sdf01Executor; +import ru.spcex.clearing.service.executors.Sdf57Executor; +import ru.spcex.platform.enumeration.SdfTable; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class SdfExecutorsConfig { + + @Bean("sdfExecutors") + public Map> executorsMap(Sdf01Executor sdf01Executor, + Sdf57Executor sdf57Executor) { + Map> executors = new HashMap<>(); + executors.put(SdfTable.SDF_01, sdf01Executor); + executors.put(SdfTable.SDF_57, sdf57Executor); + return executors; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index 95f979e72..0e7dfc67d 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -10,12 +10,11 @@ import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.misc.STrades; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.sdf.SDf01; +import ru.clearing.classes.statics.data.sdf.SDf57; import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.service.validation.ClrngValidationStored; -import ru.spcex.clearing.service.validation.ExecutionDepositValidationRule; -import ru.spcex.clearing.service.validation.RegistryStep3ValidationRule; -import ru.spcex.clearing.service.validation.STradesValidationRule; +import ru.spcex.clearing.service.validation.*; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.ClearingCategory; import ru.spcex.platform.imdg.api.Imdg; @@ -28,6 +27,7 @@ import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import java.util.function.Consumer; import java.util.function.Function; @Configuration @@ -107,4 +107,38 @@ public class ValidationConfig { RegistryStep3ValidationRule.TradingClearingRegistryActive); }; } + @Bean("sdf01Validator") + public Function sdf01Validator() { + return sDf01 -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(sDf01); + Consumer addImdg = (s) -> context.addImdg(s, getImdg(s)); + addImdg.accept(IMDGDistributedNames.Map_Account); + addImdg.accept(IMDGDistributedNames.Map_Company); + return new ValidatorImpl<>(context, + Sdf01ValidationRule.CompanyPresent, + Sdf01ValidationRule.AccountPresent, + Sdf01ValidationRule.CurrencyCode, + Sdf01ValidationRule.CurrentDateOnly, + MarketIsUValidationRule.instance, + Sdf01ValidationRule.accountType); + }; + } + + @Bean("sdf57Validator") + public Function sdf57Validator() { + return sDf57 -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(sDf57); + Consumer addImdg = (s) -> context.addImdg(s, getImdg(s)); + addImdg.accept(IMDGDistributedNames.Map_Account); + addImdg.accept(IMDGDistributedNames.Map_Company); + return new ValidatorImpl<>(context, + Sdf57ValidationRule.CompanyDebPresent, + Sdf57ValidationRule.CompanyCredPresent, + Sdf57ValidationRule.AccountDebPresent, + Sdf57ValidationRule.CurrencyCode + ); + }; + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java index 9dd2a2595..6cc1b6d75 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java @@ -5,12 +5,14 @@ import ru.spcex.platform.utils.enumeration.IErrorEnumId; public enum ClearingError implements IErrorEnumId { GeneralError(5400L), RecordNotFound(5406L), + CompanyNotFound(5410L), CompanyNotActive(5411L), CompanyCreditCheck(5412L), CompanyDebitCheck(5413L), - CompanyNotFound(5410L), + CurrentDateOnly(5214L), AccountNotActive(5415L), SecurityNotFound(5416L), + AccountNotPresent(5417L), TradingClearingRegistryNotFound(5418L), TradingClearingRegistryNotActive(5419L), ClearingUnavailableForCompany(5421L), diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/LoggingService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/LoggingService.java new file mode 100644 index 000000000..c12ce4cf4 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/LoggingService.java @@ -0,0 +1,27 @@ +package ru.spcex.clearing.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +@Component +public class LoggingService { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final IMessageResolver errorResolver; + + @Autowired + public LoggingService(IMessageResolver errorResolver) { + this.errorResolver = errorResolver; + } + + public void logError(String message, EnumMessage error, Object... args) { + log.error(message + " {}", args, errorResolver.resolve(error)); + } + + public void logError(EnumMessage error) { + log.error("{}", errorResolver.resolve(error)); + } +} 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 new file mode 100644 index 000000000..716272de2 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java @@ -0,0 +1,108 @@ +package ru.spcex.clearing.service; + +import org.apache.kafka.clients.consumer.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +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.sdf.SDf01; +import ru.clearing.classes.statics.data.sdf.SDf57; +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.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; +import ru.spcex.clearing.service.executors.AbstractExecutor; +import ru.spcex.clearing.service.model.Result; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.SdfTable; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.Collection; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class StatementService extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + + private final ImdgProvider imdgProvider; + private final KafkaSender kafkaSender; + private final Map> sdfImdgs; + private final Map> executorsMap; + + @Autowired + public StatementService(Consumer kafkaQueue, + ImdgProvider imdgProvider, + KafkaSender kafkaSender, + @Qualifier("sdfExecutors") Map> executorsMap) { + super(kafkaQueue); + this.imdgProvider = imdgProvider; + this.sdfImdgs = new EnumMap<>(SdfTable.class); + this.kafkaSender = kafkaSender; + this.executorsMap = executorsMap; + this.sdfImdgs.put(SdfTable.SDF_01, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class)); + this.sdfImdgs.put(SdfTable.SDF_57, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf57, SDf57.class)); + } + + @Override + public void afterPropertiesSet() throws Exception { + callback(StatementRequest.class) + .setConsumer(this::process) + .forDestination(Consts.STATEMENT_PROCESS, callbacks::put); + init(); + } + private void process(BaseRequest systemRequest) { + StatementRequest statementRequest = systemRequest.getRequestPayload(); + Collection sdfGroup; + SdfTable table = statementRequest.getTable(); + Imdg sdfImdg = sdfImdgs.get(table); + if (statementRequest.getAccountCreationResults().size() == 0) { + sdfGroup = sdfImdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getGroupId())); + } else { + sdfGroup = statementRequest.getAccountCreationResults() + .stream() + .filter(part -> part.getErrorCode() == null) //fixme эти случае должны попадать в ошибочный sdf02 + .map(part -> sdfImdg.getSingleObjectByID(part.getSdfId())) + .collect(Collectors.toList()); + } +// sdf01Group = sdf01Group +// .stream() +// .sorted(Comparator.comparing(SpcexObjectBase::getId)) +// .collect(Collectors.toList()); + AbstractExecutor service = executorsMap.get(table); + Result res = service.execute(sdfGroup, statementRequest); + if (res.getAccountRequests().size() == 0) { + ExportToFileRequest exportRequest = new ExportToFileRequest(); + exportRequest.setSdfGroupId(res.getGenerationId()); + exportRequest.setNameOfTable(service.exportTableName()); + kafkaSender.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); + } else { + kafkaSender.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); + } + } + + private AccountSdf01Request createAccountsRequest(Long sdf01GroupingId, List accountRequests) { + AccountSdf01Request r = new AccountSdf01Request(); + r.setGroupingSdf01Id(sdf01GroupingId); + r.setAccounts(accountRequests); + return r; + } + + private Imdg defineImdgByTableName(SdfTable table){ + switch (table){ + case SDF_01 -> imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class); + case SDF_57 -> imdgProvider.getImdg(IMDGDistributedNames.Map_SDf57, SDf57.class); + } + return null; + } +} 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 new file mode 100644 index 000000000..a5ee180f4 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/AbstractExecutor.java @@ -0,0 +1,11 @@ +package ru.spcex.clearing.service.executors; + +import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.service.model.Result; + +import java.util.Collection; + +public abstract class AbstractExecutor { + public abstract Result execute(Collection sdf, StatementRequest statementRequest); + public abstract String exportTableName(); +} 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 new file mode 100644 index 000000000..bac828e1f --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java @@ -0,0 +1,198 @@ +package ru.spcex.clearing.service.executors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.sdf.SDf01; +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.cud.account.sdf01.AccountSdfRequestPart; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.service.LoggingService; +import ru.spcex.clearing.service.model.Result; +import ru.spcex.clearing.service.validation.ValidationStored; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.number.BigDecimalUtil; +import ru.spcex.platform.utils.validation.IValidator; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +@Service +public class Sdf01Executor extends AbstractExecutor { + private final Logger log = LoggerFactory.getLogger(getClass()); + + private final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); + private final Imdg statementImdg; + private final Function sDf01Validator; + private final LoggingService errorLogger; + private final Imdg sdf02Imdg; + private final ImdgProvider imdgProvider; + private final IMessageResolver errorResolver; + private final Imdg accountBalanceImdg; + + public Sdf01Executor(Function sDf01Validator, + LoggingService errorLogger, + ImdgProvider imdgProvider, + IMessageResolver errorResolver) { + this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); + this.sdf02Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf02, SDf02.class); + this.accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); + ; + this.sDf01Validator = sDf01Validator; + this.errorLogger = errorLogger; + this.imdgProvider = imdgProvider; + this.errorResolver = errorResolver; + } + + @Override + public String exportTableName() { + return "DF-02"; + } + + public Result execute(Collection sdf, StatementRequest statementRequest) { + Result result = new Result(); + Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); + result.setGenerationId(generationIdForGroup); + for (SDf01 sdf01 : sdf) { + IValidator validator = sDf01Validator.apply(sdf01); + Optional error = validator.tillFirstError(); + Company company = validator.getStored(ValidationStored.Company); + if (statementRequest.getAccountCreationResults().size() == 0 + && ClearingError.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { + //на данном шаге company существует -> getId ok + //формируем пакетный запрос на добавление account + //ответ придет в этот же метод, process + result.getAccountRequests().add(createAccountRequestPart(sdf01.getId(), sdf01.getAccount(), company.getId())); + log.info("account {} for sdf01.id={} not found - send request for creation", sdf01.getAccount(), sdf01.getId()); + continue; + } else if (ClearingError.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { + log.error("fatal error: resumed processing after generating accounts, but no account found for sdf01.id={}", sdf01.getId()); + } + if (error.isPresent()) { + errorLogger.logError("sdf01.id={}", error.get(), sdf01.getId()); + sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); + continue; + } + Statement statement = statementImdg.getSingleObjectByFieldValues(Map.of("account", sdf01.getAccount())); + if (statement == null) { + statement = createFlow(sdf01, + company, + validator.getStored(ValidationStored.Account)); + } else { + updateFlow(statement, sdf01, + validator.getStored(ValidationStored.Account)); + } + SDf02 sdf02New = createSuccessSdf02(sdf01, generationIdForGroup); + sdf02Imdg.insert(sdf02New); + statement.setOutSDfId(sdf02New.getId()); +// AccountResult accountResult = accountBalanceService.createAccountBalance(statement.getAddresseeId(), statement.getAccountId(), statement.getAmount(), +// null/*statement.getCashMovementCurrencyCode()*/); +// if (accountResult.getError() != null) { +// statement.setErrorCodeId(accountResult.getError().getSubject().getId()); +// todo statement.setErrorText(errorResolver.resolve(accountResult.getError())); +// } else { +// accountBalanceImdg.insert(accountResult.getAccount()); //insert == update? +// statement.setOperationStatus(OperationStatus.Executed.getKey()); +// } + statementImdg.update(statement); + } + return result; + } + + private Statement createFlow(SDf01 sdf01, Company company, Account account) { + Statement statement = new Statement(); + statement.setAddresseeId(company.getId()); + statement.setSenderId(Sender.Prc.getId()); + statement.setCreated(Instant.now()); + statement.setClearingDate(LocalDate.now()); + statement.setStatementType(StatementType.full.getKey()); + statement.setAccountId(account.getId()); + statement.setAccount(sdf01.getAccount()); + statement.setInOutDirection(InOutDirection.in.getKey()); + statement.setSettlementDate(LocalDate.parse(sdf01.getDat(), datFormatter)); + statement.setAmount(BigDecimalUtil.parse(sdf01.getRemainder())); + statement.setOperationStatus(OperationStatus.Pending.getKey()); + statement.setInSDfId(sdf01.getId()); + statement.setInOutSDfType(InOutSDfType.type1.getKey()); + statementImdg.insert(statement); + return statement; + } + + private void updateFlow(Statement statement, SDf01 sdf01, Account account) { + statement.setUpdated(Instant.now()); + statement.setAccountId(account.getId()); + statement.setAccount(sdf01.getAccount()); + statement.setInOutDirection(InOutDirection.in.getKey()); + statement.setSettlementDate(LocalDate.parse(sdf01.getDat(), datFormatter)); + statement.setAmount(BigDecimalUtil.parse(sdf01.getRemainder())); + statementImdg.update(statement); + } + + private AccountSdfRequestPart createAccountRequestPart(Long sdf01Id, String account, Long companyId) { + AccountSdfRequestPart req = new AccountSdfRequestPart(); + req.setAccount(account); + req.setCompanyId(companyId); + req.setAccountType(AccountType.Clrn.getKey()); + req.setSdfId(sdf01Id); + return req; + } + + + private SDf02 createErrorSdf02(SDf01 sdf01, EnumMessage error, Long generationIdForGroup) { + SDf02 sDf02 = new SDf02(); + sDf02.setCurr_code(sdf01.getCurr_code()); + sDf02.setAccount(sdf01.getAccount()); + sDf02.setRemainder(sdf01.getRemainder()); + sDf02.setDeal(sdf01.getDeal()); + sDf02.setAcc_code(sdf01.getAcc_code()); + sDf02.setDat(sdf01.getDat()); + sDf02.setMarket(sdf01.getMarket()); + sDf02.setAcc_name(sdf01.getAcc_name()); + sDf02.setAcc_type(sdf01.getAcc_type()); + sDf02.setSumengage(sdf01.getSumengage()); + sDf02.setSumunblock(sdf01.getSumunblock()); + sDf02.setFile_type(sdf01.getFile_type()); + sDf02.setInSDfId(sdf01.getId()); + String errorId = error.getSubject().getId().toString(); + sDf02.setResult(errorId.substring(errorId.length() - 3)); + sDf02.setGenerationId(generationIdForGroup); + sDf02.setGenerationTime(Instant.now()); + return sDf02; + } + + private SDf02 createSuccessSdf02(SDf01 sdf01, Long generationIdForGroup) { + SDf02 sDf02 = new SDf02(); + sDf02.setCurr_code(sdf01.getCurr_code()); + sDf02.setAccount(sdf01.getAccount()); + sDf02.setRemainder(sdf01.getRemainder()); + sDf02.setDeal(sdf01.getDeal()); + sDf02.setAcc_code(sdf01.getAcc_code()); + sDf02.setDat(sdf01.getDat()); + sDf02.setMarket(sdf01.getMarket()); + sDf02.setAcc_name(sdf01.getAcc_name()); + sDf02.setAcc_type(sdf01.getAcc_type()); + sDf02.setSumengage(sdf01.getSumengage()); + sDf02.setSumunblock(sdf01.getSumunblock()); + sDf02.setFile_type(sdf01.getFile_type()); + sDf02.setInSDfId(sdf01.getId()); + sDf02.setGenerationId(generationIdForGroup); + sDf02.setGenerationTime(Instant.now()); + sDf02.setResult("OK!"); + return sDf02; + } +} 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 new file mode 100644 index 000000000..9102630cb --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java @@ -0,0 +1,215 @@ +package ru.spcex.clearing.service.executors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.sdf.SDf02; +import ru.clearing.classes.statics.data.sdf.SDf57; +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.cud.balance.StatementRequest; +import ru.spcex.clearing.service.LoggingService; +import ru.spcex.clearing.service.model.Result; +import ru.spcex.clearing.service.validation.ValidationStored; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.text.TextUtil; +import ru.spcex.platform.utils.validation.IValidator; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Collection; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; + +@Service +public class Sdf57Executor extends AbstractExecutor { + private final Logger log = LoggerFactory.getLogger(getClass()); + + private final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); + private final Imdg statementImdg; + private final Imdg registryImdg; + private final Function sDf57Validator; + private final LoggingService errorLogger; + private final Imdg sdf02Imdg; + private final ImdgProvider imdgProvider; + private final IMessageResolver errorResolver; + private final Imdg accountBalanceImdg; + private final IMessageResolver messageResolver; + + public Sdf57Executor(@Qualifier("sdf57Validator") Function sDf57Validator, + LoggingService errorLogger, + ImdgProvider imdgProvider, + IMessageResolver errorResolver, IMessageResolver messageResolver) { + this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.sdf02Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf02, SDf02.class); + this.accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); + this.sDf57Validator = sDf57Validator; + this.errorLogger = errorLogger; + this.imdgProvider = imdgProvider; + this.errorResolver = errorResolver; + this.messageResolver = messageResolver; + } + + @Override + public String exportTableName() { + return "DF-57"; + } //no need... + + //V - Изменение statement по sDf57 + // + //1. Перед изменением statement необходимо выполнить ряд проверок: + // 1.1. Найти в company запись, у которой company.tradingCode=sDf57.deal_deb. Если такой записи нет, записать в лог ошибку (5211) "Компания %s не найдена". + // 1.2. Найти в company запись, у которой company.tradingCode=sDf57.deal_cred. Если такой записи нет, записать в лог ошибку (5211) "Компания %s не найдена". + // 1.3. Проверить, есть ли в таблице account счет, у которого account.account=sDf57.c_acc_deb. Если такой записи нет, записать в лог ошибку (5217) "Счет %s не найден". + // 1.4. Проверить, есть ли в таблице account счет, у которого account.account=sDf57.c_acc_cred. Если такой записи нет, записать в лог ошибку (5217) "Счет %s не найден". + // 1.5. Проверить, что sDf57.pay_val=RUR. Иначе записать в лог ошибку (5213) "Валюта %s не найдена". + //2. В зависимости от результата прохождения проверок в п.1 раздела Изменение statement по sDf57: + // 2.1. Если все проверки пройдены, необходимо сформировать 2 новые записи согласно описанию с соответствующим тэгом, + // где первая запись будет содержать информацию о плательщике (по sDf57.deal_deb), + // а вторая о получателе (по sDf57.deal_cred) и связаны по одному inSDfId (= sDf57.id). + // 2.2. Иначе запись в statement не добавляется. + //3. По итогу добавления statement: + // Если в п.1 раздела Изменение statement по sDf57 ошибок не обнаружено, то инициировать изменение таблицы registry согласно описанию с соответствующим тэгом. + // По итогу изменения registry должны быть обновлены значения полей в statement: + // - operationStatus; + // - errorCode в случае выявления ошибки; + // - errorText в случае выявления ошибки. + public Result execute(Collection sdf, StatementRequest statementRequest) { + Result result = new Result(); + Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); + result.setGenerationId(generationIdForGroup); + for (SDf57 sdf57 : sdf) { + IValidator validator = sDf57Validator.apply(sdf57); + Optional error = validator.tillFirstError(); + if (error.isPresent()) { + log.error("error while validating sdf57.id={} - {}", sdf57.getId(), messageResolver.resolve(error.get())); + continue; + } + //create by companyDeb + Company companyDeb = validator.getStored(ValidationStored.Sdf57CompanyDeb); + Account accountDeb = validator.getStored(ValidationStored.Sdf57AccountDeb); + Statement statementDeb = create(sdf57, companyDeb, accountDeb); + statementImdg.insert(statementDeb); + //create by companyCred + Company companyCred = validator.getStored(ValidationStored.Sdf57CompanyCred); + Account accountCred = validator.getStored(ValidationStored.Sdf57AccountCred); + Statement statementCred = create(sdf57, companyCred, accountCred); + statementImdg.insert(statementCred); + + Consumer createRegistryIfNeeded = stmtCmpAcc -> { + Statement stmt = stmtCmpAcc.statement(); + Optional err = validateActiveness(stmtCmpAcc.company(), stmtCmpAcc.account(), stmt); + if (err.isEmpty()) { + Consumer update = rgs -> { + updateReg(stmt, rgs); + registryImdg.update(rgs); + }; + Runnable create = () -> { + Registry registry = createRegistryByStatement(stmt); + registryImdg.insert(registry); + }; + findReg(stmt, RegistryDesignation.A).ifPresentOrElse(update, create); + findReg(stmt, RegistryDesignation.D).ifPresentOrElse(update, create); + stmt.setOperationStatus(OperationStatus.Executed.getKey()); + } else { + stmt.setErrorCodeId(err.get().getSubject().getId()); // fixme ErrorText insert + stmt.setOperationStatus(OperationStatus.Rejected.getKey()); + statementImdg.update(stmt); + } + }; + createRegistryIfNeeded.accept(new StmtCmpAcc(statementDeb, companyDeb, accountDeb)); + createRegistryIfNeeded.accept(new StmtCmpAcc(statementCred, companyCred, accountCred)); + } + return result; + } + + private static record StmtCmpAcc(Statement statement, Company company, Account account) { + } + + private Optional validateActiveness(Company company, Account account, Statement statement) { + if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) { + return Optional.of(new EnumMessage(ClearingError.CompanyNotActive, company.getId())); + } + if (!WorkflowStatus.Active.equalsByKey(account.getStatus())) { + return Optional.of(new EnumMessage(ClearingError.AccountNotActive, account.getId())); + } + return Optional.empty(); + } + + private Statement create(SDf57 sdf57, Company companyDeb, Account accountDeb) { + Statement statement = new Statement(); + statement.setAddresseeId(companyDeb.getId()); + statement.setSenderId(Sender.Prc.getId()); + statement.setStatementType(StatementType.full.getKey()); + statement.setContract(getContractFromSpecif(sdf57.getSpecif())); + statement.setAccountId(accountDeb.getId()); + statement.setAccount(accountDeb.getAccount()); + statement.setInOutDirection(InOutDirection.out.getKey()); + statement.setSettlementDate(payDate(sdf57.getPay_date())); //fixme pay_date format + statement.setAmount(TextUtil.isEmpty(sdf57.getSum_deb()) ? null : new BigDecimal(sdf57.getSum_deb())); + statement.setOperationStatus(OperationStatus.Pending.getKey()); + statement.setInSDfId(sdf57.getId()); + statement.setInOutSDfType(InOutSDfType.type57.getKey()); + return statement; + } + + private Registry createRegistryByStatement(Statement statement) { + //todo + return new Registry(); + } + + private void updateReg(Statement s, Registry r) { + //todo + } + + private Optional findReg(Statement s, RegistryDesignation des) { + //todo add dependency on Registry search +// RegistryTradingParams p = new RegistryTradingParams( +// des, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T +// ); +// String sql = RegistryCodeSqlBuilder.getInstance(p).build(); +// ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); +// ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), +// pb.sql(sql), +// pb.equals("companyId", s.getAddresseeId()) //fixme companyId? +// ); +// if (des.equals(RegistryDesignation.D) && !TextUtil.isEmpty(s.getContract())) { +// rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", s.getContract())); +// } +// return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate)); + return null; + } + + DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); + + private LocalDate payDate(String payDate) { + if (TextUtil.isEmpty(payDate)) { + return null; + } + return LocalDate.parse(payDate, payDateFormatter); + } + + private String getContractFromSpecif(String specif) { + if (specif == null) { + return null; + } + int index = specif.indexOf("№"); + if (index == -1) { + return null; + } + return specif.substring(index + 1); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/model/Result.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/model/Result.java new file mode 100644 index 000000000..d5e3896cb --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/model/Result.java @@ -0,0 +1,27 @@ +package ru.spcex.clearing.service.model; + +import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; + +import java.util.ArrayList; +import java.util.List; + +public class Result { + private List accountRequests = new ArrayList<>(); + private Long generationId; + + public List getAccountRequests() { + return accountRequests; + } + + public void setAccountRequests(List accountRequests) { + this.accountRequests = accountRequests; + } + + public Long getGenerationId() { + return generationId; + } + + public void setGenerationId(Long generationId) { + this.generationId = generationId; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/MarketIsUValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/MarketIsUValidationRule.java new file mode 100644 index 000000000..fe69b0b2d --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/MarketIsUValidationRule.java @@ -0,0 +1,23 @@ +package ru.spcex.clearing.service.validation; + +import ru.spcex.clearing.error.ClearingError; +import ru.spcex.platform.classes.base.interfaces.WithMarket; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public class MarketIsUValidationRule implements IValidationRule> { + + public static final MarketIsUValidationRule instance = new MarketIsUValidationRule(); + + @Override + public Optional validate(ImdgValidationContext context) { + WithMarket validatedObject = context.getValidatedObject(); + if (!"U".equals(validatedObject.getMarket())) { + return of(ClearingError.AccountNotActive); + } + return empty(); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf01ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf01ValidationRule.java new file mode 100644 index 000000000..0dee8747c --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf01ValidationRule.java @@ -0,0 +1,99 @@ +package ru.spcex.clearing.service.validation; + +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.sdf.SDf01; +import ru.spcex.clearing.error.ClearingError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Map; +import java.util.Optional; + +public enum Sdf01ValidationRule implements IValidationRule> { + CompanyPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf01 sdf01 = context.getValidatedObject(); + if (sdf01.getDeal() == null) { + return of(ClearingError.CompanyNotFound); + } + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getSingleObjectByFieldValues(Map.of("tradingCode", sdf01.getDeal())); + if (company == null) { + return of(ClearingError.CompanyNotFound); + } + context.storeObject(ValidationStored.Company, company); + return empty(); + } + }, + AccountPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf01 sdf01 = context.getValidatedObject(); + if (sdf01.getAccount() == null) { + return of(ClearingError.AccountNotPresent); + } + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account account = accountImdg.getSingleObjectByFieldValues(Map.of("account", sdf01.getAccount(), + "accountType", AccountType.Clrn.getKey())); + if (account == null) { + return of(ClearingError.AccountNotPresent); + } + context.storeObject(ValidationStored.Account, account); + return empty(); + } + }, + CurrencyCode() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf01 sdf01 = context.getValidatedObject(); + if (!"RUR".equals(sdf01.getCurr_code())) { + return of(ClearingError.CompanyDebitCheck); + } + return empty(); + } + }, + CurrentDateOnly() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf01 sdf01 = context.getValidatedObject(); + if (sdf01.getDat() == null) { + return of(ClearingError.CurrentDateOnly); + } + LocalDate date; + try { + date = LocalDate.parse(sdf01.getDat(), datFormatter); + } catch (DateTimeParseException e) { + return of(ClearingError.CurrentDateOnly); + } + if (!LocalDate.now().equals(date)) { + return of(ClearingError.CurrentDateOnly); + } + return empty(); + } + }, + accountType() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf01 sdf01 = context.getValidatedObject(); + if (!"A".equals(sdf01.getAcc_type())) { + return of(ClearingError.SecurityNotFound); + } + return empty(); + } + }; + private final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); + + @Override + public String ruleName() { + return "Sdf01ValidationRule." + name(); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf57ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf57ValidationRule.java new file mode 100644 index 000000000..464062c48 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf57ValidationRule.java @@ -0,0 +1,94 @@ +package ru.spcex.clearing.service.validation; + +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.sdf.SDf57; +import ru.spcex.clearing.error.ClearingError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.text.TextUtil; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public enum Sdf57ValidationRule implements IValidationRule> { + CompanyDebPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf57 sdf57 = context.getValidatedObject(); + if (TextUtil.isEmpty(sdf57.getDeal_deb())) { + return of(ClearingError.CompanyNotFound, sdf57.getDeal_deb()); + } + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company found = companyImdg.getSingleObjectBySQL("tradingCode = '" + sdf57.getDeal_deb() + "'"); + if (found == null) { + return of(ClearingError.CompanyNotFound, sdf57.getDeal_deb()); + } + context.storeObject(ValidationStored.Sdf57CompanyDeb, found); + return empty(); + } + }, CompanyCredPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf57 sdf57 = context.getValidatedObject(); + if (TextUtil.isEmpty(sdf57.getDeal_cred())) { + return of(ClearingError.CompanyNotFound, sdf57.getDeal_deb()); + } + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company found = companyImdg.getSingleObjectBySQL("tradingCode = '" + sdf57.getDeal_cred() + "'"); + if (found == null) { + return of(ClearingError.CompanyNotFound, sdf57.getDeal_deb()); + } + context.storeObject(ValidationStored.Sdf57CompanyCred, found); + return empty(); + } + }, AccountDebPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf57 sdf57 = context.getValidatedObject(); + if (TextUtil.isEmpty(sdf57.getC_acc_deb())) { + return of(ClearingError.AccountNotPresent, sdf57.getDeal_deb()); + } + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account found = accountImdg.getSingleObjectBySQL("account = '" + sdf57.getC_acc_deb() + "'"); + if (found == null) { + return of(ClearingError.AccountNotPresent, sdf57.getDeal_deb()); + } + context.storeObject(ValidationStored.Sdf57AccountDeb, found); + return empty(); + } + + }, AccountCredPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf57 sdf57 = context.getValidatedObject(); + if (TextUtil.isEmpty(sdf57.getC_acc_cred())) { + return of(ClearingError.AccountNotPresent, sdf57.getDeal_deb()); + } + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account found = accountImdg.getSingleObjectBySQL("account = '" + sdf57.getC_acc_cred() + "'"); + if (found == null) { + return of(ClearingError.AccountNotPresent, sdf57.getDeal_deb()); + } + context.storeObject(ValidationStored.Sdf57AccountCred, found); + return empty(); + } + + }, CurrencyCode() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf57 sdf57 = context.getValidatedObject(); + if (!ru.spcex.platform.enumeration.CurrencyCode.RUR.equalsByKey(sdf57.getPay_val())) { + return of(ClearingError.CompanyDebitCheck, sdf57.getPay_val()); + } + return empty(); + } + }; + + @Override + public String ruleName() { + return "Sdf57ValidationRule." + name(); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java index e1c671c24..861950ecb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.service.validation; public enum ValidationStored { - STradesCompany, STradesCounterCompany, STradesSecurity, STradesTradingClearingRegistry + STradesCompany, STradesCounterCompany, STradesSecurity, STradesTradingClearingRegistry, + Account, Company, + + Sdf57CompanyDeb, Sdf57CompanyCred, Sdf57AccountDeb, Sdf57AccountCred } From 0d01940b42c35ecd490f057f13fa8438a82d8647 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 24 May 2023 13:32:21 +0300 Subject: [PATCH 2/6] delete SDF01,SDF57 executors from balance-service --- .../balance/config/SdfExecutorsConfig.java | 10 +- .../balance/config/ValidationConfig.java | 37 --- .../balance/service/Sdf01Executor.java | 199 ---------------- .../balance/service/Sdf57Executor.java | 215 ------------------ .../balance/service/StatementService.java | 67 +----- .../validation/Sdf01ValidationRule.java | 99 -------- .../validation/Sdf57ValidationRule.java | 94 -------- 7 files changed, 7 insertions(+), 714 deletions(-) delete mode 100644 clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf01Executor.java delete mode 100644 clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf57Executor.java delete mode 100644 clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java delete mode 100644 clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf57ValidationRule.java diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/SdfExecutorsConfig.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/SdfExecutorsConfig.java index 6bc274352..612692cad 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/SdfExecutorsConfig.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/SdfExecutorsConfig.java @@ -3,9 +3,7 @@ package ru.spcex.clearing.balance.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.clearing.balance.service.AbstractExecutor; -import ru.spcex.clearing.balance.service.Sdf01Executor; import ru.spcex.clearing.balance.service.Sdf16Executor; -import ru.spcex.clearing.balance.service.Sdf57Executor; import ru.spcex.platform.enumeration.SdfTable; import java.util.HashMap; @@ -15,15 +13,11 @@ import java.util.Map; public class SdfExecutorsConfig { @Bean("sdfExecutors") - public Map> executorsMap(Sdf01Executor sdf01Executor, - //Sdf09Executor sdf09Executor, - Sdf16Executor sdf16Executor, - Sdf57Executor sdf57Executor) { + public Map> executorsMap(//Sdf09Executor sdf09Executor, + Sdf16Executor sdf16Executor) { Map> executors = new HashMap<>(); - executors.put(SdfTable.SDF_01, sdf01Executor); // todo возможно удалят или переделают: executors.put(SdfTable.SDF_09, sdf09Executor); executors.put(SdfTable.SDF_16, sdf16Executor); - executors.put(SdfTable.SDF_57, sdf57Executor); return executors; } } diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java index aa0745b0a..4434d8165 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java @@ -7,10 +7,8 @@ import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.AccountBalance; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.sdf.SDf01; import ru.clearing.classes.statics.data.sdf.SDf09; import ru.clearing.classes.statics.data.sdf.SDf16; -import ru.clearing.classes.statics.data.sdf.SDf57; import ru.spcex.clearing.balance.validation.*; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -46,41 +44,6 @@ public class ValidationConfig { return imdgs.get(key); } - @Bean("sdf01Validator") - public Function sdf01Validator() { - return sDf01 -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(sDf01); - Consumer addImdg = (s) -> context.addImdg(s, getImdg(s)); - addImdg.accept(IMDGDistributedNames.Map_Account); - addImdg.accept(IMDGDistributedNames.Map_Company); - return new ValidatorImpl<>(context, - Sdf01ValidationRule.CompanyPresent, - Sdf01ValidationRule.AccountPresent, - Sdf01ValidationRule.CurrencyCode, - Sdf01ValidationRule.CurrentDateOnly, - MarketIsUValidationRule.instance, - Sdf01ValidationRule.accountType); - }; - } - - @Bean("sdf57Validator") - public Function sdf57Validator() { - return sDf57 -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(sDf57); - Consumer addImdg = (s) -> context.addImdg(s, getImdg(s)); - addImdg.accept(IMDGDistributedNames.Map_Account); - addImdg.accept(IMDGDistributedNames.Map_Company); - return new ValidatorImpl<>(context, - Sdf57ValidationRule.CompanyDebPresent, - Sdf57ValidationRule.CompanyCredPresent, - Sdf57ValidationRule.AccountDebPresent, - Sdf57ValidationRule.CurrencyCode - ); - }; - } - @Bean("sdf16Validator") public Function sdf16Validator() { return sDf16 -> { diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf01Executor.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf01Executor.java deleted file mode 100644 index 4b321782d..000000000 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf01Executor.java +++ /dev/null @@ -1,199 +0,0 @@ -package ru.spcex.clearing.balance.service; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.account.AccountBalance; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.sdf.SDf01; -import ru.clearing.classes.statics.data.sdf.SDf02; -import ru.clearing.classes.statics.data.statement.Statement; -import ru.spcex.clearing.balance.errors.BalanceError; -import ru.spcex.clearing.balance.validation.ValidationStored; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; -import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.number.BigDecimalUtil; -import ru.spcex.platform.utils.validation.IValidator; - -import java.time.Instant; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -@Service -public class Sdf01Executor extends AbstractExecutor { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); - private final Imdg statementImdg; - private final Function sDf01Validator; - private final LoggingService errorLogger; - private final Imdg sdf02Imdg; - private final ImdgProvider imdgProvider; - private final AccountBalanceService accountBalanceService; - private final IMessageResolver errorResolver; - private final Imdg accountBalanceImdg; - - public Sdf01Executor(Function sDf01Validator, - LoggingService errorLogger, - ImdgProvider imdgProvider, - AccountBalanceService accountBalanceService, - IMessageResolver errorResolver) { - this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); - this.sdf02Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf02, SDf02.class); - this.accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); - ; - this.sDf01Validator = sDf01Validator; - this.errorLogger = errorLogger; - this.imdgProvider = imdgProvider; - this.accountBalanceService = accountBalanceService; - this.errorResolver = errorResolver; - } - - @Override - String exportTableName() { - return "DF-02"; - } - - public Result execute(Collection sdf, StatementRequest statementRequest) { - Result result = new Result(); - Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); - result.setGenerationId(generationIdForGroup); - for (SDf01 sdf01 : sdf) { - IValidator validator = sDf01Validator.apply(sdf01); - Optional error = validator.tillFirstError(); - Company company = validator.getStored(ValidationStored.Company); - if (statementRequest.getAccountCreationResults().size() == 0 - && BalanceError.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { - //на данном шаге company существует -> getId ok - //формируем пакетный запрос на добавление account - //ответ придет в этот же метод, process - result.getAccountRequests().add(createAccountRequestPart(sdf01.getId(), sdf01.getAccount(), company.getId())); - log.info("account {} for sdf01.id={} not found - send request for creation", sdf01.getAccount(), sdf01.getId()); - continue; - } else if (BalanceError.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { - log.error("fatal error: resumed processing after generating accounts, but no account found for sdf01.id={}", sdf01.getId()); - } - if (error.isPresent()) { - errorLogger.logError("sdf01.id={}", error.get(), sdf01.getId()); - sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); - continue; - } - Statement statement = statementImdg.getSingleObjectByFieldValues(Map.of("account", sdf01.getAccount())); - if (statement == null) { - statement = createFlow(sdf01, - company, - validator.getStored(ValidationStored.Account)); - } else { - updateFlow(statement, sdf01, - validator.getStored(ValidationStored.Account)); - } - SDf02 sdf02New = createSuccessSdf02(sdf01, generationIdForGroup); - sdf02Imdg.insert(sdf02New); - statement.setOutSDfId(sdf02New.getId()); - AccountResult accountResult = accountBalanceService.createAccountBalance(statement.getAddresseeId(), statement.getAccountId(), statement.getAmount(), - null/*statement.getCashMovementCurrencyCode()*/); - if (accountResult.getError() != null) { - statement.setErrorCodeId(accountResult.getError().getSubject().getId()); - // todo statement.setErrorText(errorResolver.resolve(accountResult.getError())); - } else { - accountBalanceImdg.insert(accountResult.getAccount()); //insert == update? - statement.setOperationStatus(OperationStatus.Executed.getKey()); - } - statementImdg.update(statement); - } - return result; - } - - private Statement createFlow(SDf01 sdf01, Company company, Account account) { - Statement statement = new Statement(); - statement.setAddresseeId(company.getId()); - statement.setSenderId(Sender.Prc.getId()); - statement.setCreated(Instant.now()); - statement.setClearingDate(LocalDate.now()); - statement.setStatementType(StatementType.full.getKey()); - statement.setAccountId(account.getId()); - statement.setAccount(sdf01.getAccount()); - statement.setInOutDirection(InOutDirection.in.getKey()); - statement.setSettlementDate(LocalDate.parse(sdf01.getDat(), datFormatter)); - statement.setAmount(BigDecimalUtil.parse(sdf01.getRemainder())); - statement.setOperationStatus(OperationStatus.Pending.getKey()); - statement.setInSDfId(sdf01.getId()); - statement.setInOutSDfType(InOutSDfType.type1.getKey()); - statementImdg.insert(statement); - return statement; - } - - private void updateFlow(Statement statement, SDf01 sdf01, Account account) { - statement.setUpdated(Instant.now()); - statement.setAccountId(account.getId()); - statement.setAccount(sdf01.getAccount()); - statement.setInOutDirection(InOutDirection.in.getKey()); - statement.setSettlementDate(LocalDate.parse(sdf01.getDat(), datFormatter)); - statement.setAmount(BigDecimalUtil.parse(sdf01.getRemainder())); - statementImdg.update(statement); - } - - private AccountSdfRequestPart createAccountRequestPart(Long sdf01Id, String account, Long companyId) { - AccountSdfRequestPart req = new AccountSdfRequestPart(); - req.setAccount(account); - req.setCompanyId(companyId); - req.setAccountType(AccountType.Clrn.getKey()); - req.setSdfId(sdf01Id); - return req; - } - - - private SDf02 createErrorSdf02(SDf01 sdf01, EnumMessage error, Long generationIdForGroup) { - SDf02 sDf02 = new SDf02(); - sDf02.setCurr_code(sdf01.getCurr_code()); - sDf02.setAccount(sdf01.getAccount()); - sDf02.setRemainder(sdf01.getRemainder()); - sDf02.setDeal(sdf01.getDeal()); - sDf02.setAcc_code(sdf01.getAcc_code()); - sDf02.setDat(sdf01.getDat()); - sDf02.setMarket(sdf01.getMarket()); - sDf02.setAcc_name(sdf01.getAcc_name()); - sDf02.setAcc_type(sdf01.getAcc_type()); - sDf02.setSumengage(sdf01.getSumengage()); - sDf02.setSumunblock(sdf01.getSumunblock()); - sDf02.setFile_type(sdf01.getFile_type()); - sDf02.setInSDfId(sdf01.getId()); - String errorId = error.getSubject().getId().toString(); - sDf02.setResult(errorId.substring(errorId.length() - 3)); - sDf02.setGenerationId(generationIdForGroup); - sDf02.setGenerationTime(Instant.now()); - return sDf02; - } - - private SDf02 createSuccessSdf02(SDf01 sdf01, Long generationIdForGroup) { - SDf02 sDf02 = new SDf02(); - sDf02.setCurr_code(sdf01.getCurr_code()); - sDf02.setAccount(sdf01.getAccount()); - sDf02.setRemainder(sdf01.getRemainder()); - sDf02.setDeal(sdf01.getDeal()); - sDf02.setAcc_code(sdf01.getAcc_code()); - sDf02.setDat(sdf01.getDat()); - sDf02.setMarket(sdf01.getMarket()); - sDf02.setAcc_name(sdf01.getAcc_name()); - sDf02.setAcc_type(sdf01.getAcc_type()); - sDf02.setSumengage(sdf01.getSumengage()); - sDf02.setSumunblock(sdf01.getSumunblock()); - sDf02.setFile_type(sdf01.getFile_type()); - sDf02.setInSDfId(sdf01.getId()); - sDf02.setGenerationId(generationIdForGroup); - sDf02.setGenerationTime(Instant.now()); - sDf02.setResult("OK!"); - return sDf02; - } -} diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf57Executor.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf57Executor.java deleted file mode 100644 index aefba2ef7..000000000 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf57Executor.java +++ /dev/null @@ -1,215 +0,0 @@ -package ru.spcex.clearing.balance.service; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.account.AccountBalance; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.sdf.SDf02; -import ru.clearing.classes.statics.data.sdf.SDf57; -import ru.clearing.classes.statics.data.statement.Statement; -import ru.spcex.clearing.balance.errors.BalanceError; -import ru.spcex.clearing.balance.validation.ValidationStored; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.text.TextUtil; -import ru.spcex.platform.utils.validation.IValidator; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Optional; -import java.util.function.Consumer; -import java.util.function.Function; - -@Service -public class Sdf57Executor extends AbstractExecutor { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); - private final Imdg statementImdg; - private final Imdg registryImdg; - private final Function sDf57Validator; - private final LoggingService errorLogger; - private final Imdg sdf02Imdg; - private final ImdgProvider imdgProvider; - private final AccountBalanceService accountBalanceService; - private final IMessageResolver errorResolver; - private final Imdg accountBalanceImdg; - private final IMessageResolver messageResolver; - - public Sdf57Executor(@Qualifier("sdf57Validator") Function sDf57Validator, - LoggingService errorLogger, - ImdgProvider imdgProvider, - AccountBalanceService accountBalanceService, - IMessageResolver errorResolver, IMessageResolver messageResolver) { - this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); - this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.sdf02Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf02, SDf02.class); - this.accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); - this.sDf57Validator = sDf57Validator; - this.errorLogger = errorLogger; - this.imdgProvider = imdgProvider; - this.accountBalanceService = accountBalanceService; - this.errorResolver = errorResolver; - this.messageResolver = messageResolver; - } - - @Override - String exportTableName() { - return "DF-57"; - } //no need... - - //V - Изменение statement по sDf57 - // - //1. Перед изменением statement необходимо выполнить ряд проверок: - // 1.1. Найти в company запись, у которой company.tradingCode=sDf57.deal_deb. Если такой записи нет, записать в лог ошибку (5211) "Компания %s не найдена". - // 1.2. Найти в company запись, у которой company.tradingCode=sDf57.deal_cred. Если такой записи нет, записать в лог ошибку (5211) "Компания %s не найдена". - // 1.3. Проверить, есть ли в таблице account счет, у которого account.account=sDf57.c_acc_deb. Если такой записи нет, записать в лог ошибку (5217) "Счет %s не найден". - // 1.4. Проверить, есть ли в таблице account счет, у которого account.account=sDf57.c_acc_cred. Если такой записи нет, записать в лог ошибку (5217) "Счет %s не найден". - // 1.5. Проверить, что sDf57.pay_val=RUR. Иначе записать в лог ошибку (5213) "Валюта %s не найдена". - //2. В зависимости от результата прохождения проверок в п.1 раздела Изменение statement по sDf57: - // 2.1. Если все проверки пройдены, необходимо сформировать 2 новые записи согласно описанию с соответствующим тэгом, - // где первая запись будет содержать информацию о плательщике (по sDf57.deal_deb), - // а вторая о получателе (по sDf57.deal_cred) и связаны по одному inSDfId (= sDf57.id). - // 2.2. Иначе запись в statement не добавляется. - //3. По итогу добавления statement: - // Если в п.1 раздела Изменение statement по sDf57 ошибок не обнаружено, то инициировать изменение таблицы registry согласно описанию с соответствующим тэгом. - // По итогу изменения registry должны быть обновлены значения полей в statement: - // - operationStatus; - // - errorCode в случае выявления ошибки; - // - errorText в случае выявления ошибки. - public Result execute(Collection sdf, StatementRequest statementRequest) { - Result result = new Result(); - Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); - result.setGenerationId(generationIdForGroup); - for (SDf57 sdf57 : sdf) { - IValidator validator = sDf57Validator.apply(sdf57); - Optional error = validator.tillFirstError(); - if (error.isPresent()) { - log.error("error while validating sdf57.id={} - {}", sdf57.getId(), messageResolver.resolve(error.get())); - continue; - } - //create by companyDeb - Company companyDeb = validator.getStored(ValidationStored.Sdf57CompanyDeb); - Account accountDeb = validator.getStored(ValidationStored.Sdf57AccountDeb); - Statement statementDeb = create(sdf57, companyDeb, accountDeb); - statementImdg.insert(statementDeb); - //create by companyCred - Company companyCred = validator.getStored(ValidationStored.Sdf57CompanyCred); - Account accountCred = validator.getStored(ValidationStored.Sdf57AccountCred); - Statement statementCred = create(sdf57, companyCred, accountCred); - statementImdg.insert(statementCred); - - Consumer createRegistryIfNeeded = stmtCmpAcc -> { - Statement stmt = stmtCmpAcc.statement(); - Optional err = validateActiveness(stmtCmpAcc.company(), stmtCmpAcc.account(), stmt); - if (err.isEmpty()) { - Consumer update = rgs -> { - updateReg(stmt, rgs); - registryImdg.update(rgs); - }; - Runnable create = () -> { - Registry registry = createRegistryByStatement(stmt); - registryImdg.insert(registry); - }; - findReg(stmt, RegistryDesignation.A).ifPresentOrElse(update, create); - findReg(stmt, RegistryDesignation.D).ifPresentOrElse(update, create); - stmt.setOperationStatus(OperationStatus.Executed.getKey()); - } else { - stmt.setErrorCodeId(err.get().getSubject().getId()); // fixme ErrorText insert - stmt.setOperationStatus(OperationStatus.Rejected.getKey()); - statementImdg.update(stmt); - } - }; - createRegistryIfNeeded.accept(new StmtCmpAcc(statementDeb, companyDeb, accountDeb)); - createRegistryIfNeeded.accept(new StmtCmpAcc(statementCred, companyCred, accountCred)); - } - return result; - } - - private static record StmtCmpAcc(Statement statement, Company company, Account account) { - } - - private Optional validateActiveness(Company company, Account account, Statement statement) { - if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) { - return Optional.of(new EnumMessage(BalanceError.CompanyNotActive, company.getId())); - } - if (!WorkflowStatus.Active.equalsByKey(account.getStatus())) { - return Optional.of(new EnumMessage(BalanceError.AccountNotActive, account.getId())); - } - return Optional.empty(); - } - - private Statement create(SDf57 sdf57, Company companyDeb, Account accountDeb) { - Statement statement = new Statement(); - statement.setAddresseeId(companyDeb.getId()); - statement.setSenderId(Sender.Prc.getId()); - statement.setStatementType(StatementType.full.getKey()); - statement.setContract(getContractFromSpecif(sdf57.getSpecif())); - statement.setAccountId(accountDeb.getId()); - statement.setAccount(accountDeb.getAccount()); - statement.setInOutDirection(InOutDirection.out.getKey()); - statement.setSettlementDate(payDate(sdf57.getPay_date())); //fixme pay_date format - statement.setAmount(TextUtil.isEmpty(sdf57.getSum_deb()) ? null : new BigDecimal(sdf57.getSum_deb())); - statement.setOperationStatus(OperationStatus.Pending.getKey()); - statement.setInSDfId(sdf57.getId()); - statement.setInOutSDfType(InOutSDfType.type57.getKey()); - return statement; - } - - private Registry createRegistryByStatement(Statement statement) { - //todo - return new Registry(); - } - - private void updateReg(Statement s, Registry r) { - //todo - } - - private Optional findReg(Statement s, RegistryDesignation des) { - //todo add dependency on Registry search -// RegistryTradingParams p = new RegistryTradingParams( -// des, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T -// ); -// String sql = RegistryCodeSqlBuilder.getInstance(p).build(); -// ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); -// ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), -// pb.sql(sql), -// pb.equals("companyId", s.getAddresseeId()) //fixme companyId? -// ); -// if (des.equals(RegistryDesignation.D) && !TextUtil.isEmpty(s.getContract())) { -// rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", s.getContract())); -// } -// return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate)); - return null; - } - - DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); - private LocalDate payDate(String payDate) { - if (TextUtil.isEmpty(payDate)) { - return null; - } - return LocalDate.parse(payDate, payDateFormatter); - } - - private String getContractFromSpecif(String specif) { - if (specif == null) { - return null; - } - int index = specif.indexOf("№"); - if (index == -1) { - return null; - } - return specif.substring(index + 1); - } -} diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java index c1041b9e7..0de34e4b0 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java @@ -7,29 +7,16 @@ import org.springframework.beans.factory.InitializingBean; 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.sdf.SDf01; -import ru.clearing.classes.statics.data.sdf.SDf16; -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.account.sdf01.AccountSdf01Request; -import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountBalanceClearingRequest; -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.domain.cud.common.CommonIdRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; -import ru.spcex.platform.classes.base.interfaces.WithAccount; import ru.spcex.platform.enumeration.SdfTable; -import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import java.util.Collection; -import java.util.EnumMap; -import java.util.List; import java.util.Map; -import java.util.stream.Collectors; @Service public class StatementService extends QueueConsumer implements InitializingBean { @@ -37,31 +24,25 @@ public class StatementService extends QueueConsumer implements InitializingBean private final ImdgProvider imdgProvider; private final KafkaSender kafkaReqProducer; - private final Map> sdfImdgs; - private final Map> executorsMap; private final AccountBalanceService accountBalanceService; @Autowired public StatementService(Consumer kafkaQueue, ImdgProvider imdgProvider, KafkaSender kafkaReqProducer, - @Qualifier("sdfExecutors") Map> executorsMap, AccountBalanceService accountBalanceService) { + @Qualifier("sdfExecutors") Map> executorsMap, + AccountBalanceService accountBalanceService) { super(kafkaQueue); this.imdgProvider = imdgProvider; this.accountBalanceService = accountBalanceService; - this.sdfImdgs = new EnumMap<>(SdfTable.class); this.kafkaReqProducer = kafkaReqProducer; - this.executorsMap = executorsMap; - this.sdfImdgs.put(SdfTable.SDF_01, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class)); -// todo изменение классов. this.sdfImdgs.put(SdfTable.SDF_09, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf09, SDf09.class)); - this.sdfImdgs.put(SdfTable.SDF_16, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf16, SDf16.class)); } @Override public void afterPropertiesSet() throws Exception { - callback(StatementRequest.class) - .setConsumer(this::process) - .forDestination(Consts.STATEMENT_PROCESS, callbacks::put); +// callback(StatementRequest.class) +// .setConsumer(this::process) +// .forDestination(Consts.STATEMENT_PROCESS, callbacks::put); callback(AccountBalanceClearingRequest.class) .setConsumer(this::accountBalanceClearingUpdate) .forDestination(Consts.BALANCE_ACCOUNT_UPDATE, callbacks::put); @@ -77,42 +58,4 @@ public class StatementService extends QueueConsumer implements InitializingBean commonIdRequest.setId(updateAccBalanceReq.getId()); kafkaReqProducer.sendRequestToQueue(Consts.CONTINUE_CLEARING, commonIdRequest, updateAccBalanceReq.getCorrelationId()); } - - private void process(BaseRequest systemRequest) { - StatementRequest statementRequest = systemRequest.getRequestPayload(); - Collection sdfGroup; - SdfTable table = statementRequest.getTable(); - //map = getMapByTable(table) - Imdg sdfImdg = sdfImdgs.get(table); - if (statementRequest.getAccountCreationResults().size() == 0) { - sdfGroup = sdfImdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getGroupId())); - } else { - sdfGroup = statementRequest.getAccountCreationResults() - .stream() - .filter(part -> part.getErrorCode() == null) //fixme эти случае должны попадать в ошибочный sdf02 - .map(part -> sdfImdg.getSingleObjectByID(part.getSdfId())) - .collect(Collectors.toList()); - } -// sdf01Group = sdf01Group -// .stream() -// .sorted(Comparator.comparing(SpcexObjectBase::getId)) -// .collect(Collectors.toList()); - AbstractExecutor service = executorsMap.get(table); - Result res = service.execute(sdfGroup, statementRequest); - if (res.getAccountRequests().size() == 0) { - ExportToFileRequest exportRequest = new ExportToFileRequest(); - exportRequest.setSdfGroupId(res.getGenerationId()); - exportRequest.setNameOfTable(service.exportTableName()); - kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); - } else { - kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); - } - } - - private AccountSdf01Request createAccountsRequest(Long sdf01GroupingId, List accountRequests) { - AccountSdf01Request r = new AccountSdf01Request(); - r.setGroupingSdf01Id(sdf01GroupingId); - r.setAccounts(accountRequests); - return r; - } } diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java deleted file mode 100644 index 400afda73..000000000 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java +++ /dev/null @@ -1,99 +0,0 @@ -package ru.spcex.clearing.balance.validation; - -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.sdf.SDf01; -import ru.spcex.clearing.balance.errors.BalanceError; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.validation.IValidationRule; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.Map; -import java.util.Optional; - -public enum Sdf01ValidationRule implements IValidationRule> { - CompanyPresent() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf01 sdf01 = context.getValidatedObject(); - if (sdf01.getDeal() == null) { - return of(BalanceError.CompanyNotFound); - } - Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); - Company company = companyImdg.getSingleObjectByFieldValues(Map.of("tradingCode", sdf01.getDeal())); - if (company == null) { - return of(BalanceError.CompanyNotFound); - } - context.storeObject(ValidationStored.Company, company); - return empty(); - } - }, - AccountPresent() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf01 sdf01 = context.getValidatedObject(); - if (sdf01.getAccount() == null) { - return of(BalanceError.AccountNotPresent); - } - Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Account account = accountImdg.getSingleObjectByFieldValues(Map.of("account", sdf01.getAccount(), - "accountType", AccountType.Clrn.getKey())); - if (account == null) { - return of(BalanceError.AccountNotPresent); - } - context.storeObject(ValidationStored.Account, account); - return empty(); - } - }, - CurrencyCode() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf01 sdf01 = context.getValidatedObject(); - if (!"RUR".equals(sdf01.getCurr_code())) { - return of(BalanceError.CurrencyNotFound); - } - return empty(); - } - }, - CurrentDateOnly() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf01 sdf01 = context.getValidatedObject(); - if (sdf01.getDat() == null) { - return of(BalanceError.CurrentDateOnly); - } - LocalDate date; - try { - date = LocalDate.parse(sdf01.getDat(), datFormatter); - } catch (DateTimeParseException e) { - return of(BalanceError.CurrentDateOnly); - } - if (!LocalDate.now().equals(date)) { - return of(BalanceError.CurrentDateOnly); - } - return empty(); - } - }, - accountType() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf01 sdf01 = context.getValidatedObject(); - if (!"A".equals(sdf01.getAcc_type())) { - return of(BalanceError.WrongAccount); - } - return empty(); - } - }; - private final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); - - @Override - public String ruleName() { - return "Sdf01ValidationRule." + name(); - } -} diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf57ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf57ValidationRule.java deleted file mode 100644 index 10cb0cd85..000000000 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf57ValidationRule.java +++ /dev/null @@ -1,94 +0,0 @@ -package ru.spcex.clearing.balance.validation; - -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.sdf.SDf57; -import ru.spcex.clearing.balance.errors.BalanceError; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.text.TextUtil; -import ru.spcex.platform.utils.validation.IValidationRule; - -import java.util.Optional; - -public enum Sdf57ValidationRule implements IValidationRule> { - CompanyDebPresent() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf57 sdf57 = context.getValidatedObject(); - if (TextUtil.isEmpty(sdf57.getDeal_deb())) { - return of(BalanceError.CompanyNotFound, sdf57.getDeal_deb()); - } - Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); - Company found = companyImdg.getSingleObjectBySQL("tradingCode = '" + sdf57.getDeal_deb() + "'"); - if (found == null) { - return of(BalanceError.CompanyNotFound, sdf57.getDeal_deb()); - } - context.storeObject(ValidationStored.Sdf57CompanyDeb, found); - return empty(); - } - }, CompanyCredPresent() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf57 sdf57 = context.getValidatedObject(); - if (TextUtil.isEmpty(sdf57.getDeal_cred())) { - return of(BalanceError.CompanyNotFound, sdf57.getDeal_deb()); - } - Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); - Company found = companyImdg.getSingleObjectBySQL("tradingCode = '" + sdf57.getDeal_cred() + "'"); - if (found == null) { - return of(BalanceError.CompanyNotFound, sdf57.getDeal_deb()); - } - context.storeObject(ValidationStored.Sdf57CompanyCred, found); - return empty(); - } - }, AccountDebPresent() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf57 sdf57 = context.getValidatedObject(); - if (TextUtil.isEmpty(sdf57.getC_acc_deb())) { - return of(BalanceError.AccountNotPresent, sdf57.getDeal_deb()); - } - Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Account found = accountImdg.getSingleObjectBySQL("account = '" + sdf57.getC_acc_deb() + "'"); - if (found == null) { - return of(BalanceError.AccountNotPresent, sdf57.getDeal_deb()); - } - context.storeObject(ValidationStored.Sdf57AccountDeb, found); - return empty(); - } - - }, AccountCredPresent() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf57 sdf57 = context.getValidatedObject(); - if (TextUtil.isEmpty(sdf57.getC_acc_cred())) { - return of(BalanceError.AccountNotPresent, sdf57.getDeal_deb()); - } - Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Account found = accountImdg.getSingleObjectBySQL("account = '" + sdf57.getC_acc_cred() + "'"); - if (found == null) { - return of(BalanceError.AccountNotPresent, sdf57.getDeal_deb()); - } - context.storeObject(ValidationStored.Sdf57AccountCred, found); - return empty(); - } - - }, CurrencyCode() { - @Override - public Optional validate(ImdgValidationContext context) { - SDf57 sdf57 = context.getValidatedObject(); - if (!ru.spcex.platform.enumeration.CurrencyCode.RUR.equalsByKey(sdf57.getPay_val())) { - return of(BalanceError.CurrencyNotFound, sdf57.getPay_val()); - } - return empty(); - } - }; - - @Override - public String ruleName() { - return "Sdf57ValidationRule." + name(); - } -} From d3069db920bed35649255a55d8c6d94a2d445ad7 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 24 May 2023 13:32:24 +0300 Subject: [PATCH 3/6] =?UTF-8?q?account-service=20http://jira.mfd.msk:8088/?= =?UTF-8?q?browse/CLS-272=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20ClientCode,=20TradingClearingRegistr?= =?UTF-8?q?y?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/service/ClientCodeService.java | 8 +++--- .../TradingClearingRegistryService.java | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java index c3ed92205..b46a83451 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java @@ -229,11 +229,13 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean ClientCode clientCode = clientCodeMap.getSingleObjectByID(req.getId()); if (clientCode.getMoneyAccountId() != null) { - log.debug("Delete clientCode.id = {}: send message to account-service", clientCode.getId()); + log.debug("Blocking clientCode.id = {}: send message to account-service", clientCode.getId()); sendBlockTCR(clientCode.getTradingClearingRegistryId(), clientCode.getMoneyAccountId()); } - log.debug("Delete clientCode.id={}", clientCode.getId()); - clientCodeMap.delete(clientCode); + log.debug("Blocking clientCode.id={}", clientCode.getId()); + clientCode.setUpdated(Instant.now()); + clientCode.setStatus(WorkflowStatus.Blocked.getKey()); + clientCodeMap.update(clientCode); return null; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java index 3f0a443fe..152894df1 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java @@ -153,6 +153,14 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini // Пока что она соответствует ТЗ, но возможно будет правиться, поэтому расписана без выноса кода в методы и // прочих методов сокращения кода. В дальнейшем, после тестирования и окончательного выяснения вида проверки, // её стоит вынести на этап валидации запроса. + if (req.getMoneyAccountId() == null && (req.getMoneyAccountId() == null || req.getDepoAccountId() == null)) { + TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getSingleObjectByFieldValues(Map.of("companyId", req.getCompanyId())); + if (registryByCompany == null) { + return requestHelper.makeErrorResponse(userRequest, + AccountError.TradingClearingRegistryNotFound, + req.getCompanyId()); + } + } Relation relation = relationImdg.getSingleObjectByFieldValues(Map.of("consumerId", req.getCompanyId())); if (ru.spcex.platform.enumeration.Service.MKR.equalsByKey(relation.getService())) { TradingClearingRegistry registry = tradingClearingRegistryImdg.getSingleObjectByFieldValues(Map.of("companyId", req.getCompanyId())); @@ -281,6 +289,15 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini } TradingClearingRegistryNewRequest req = userRequest.getRequestPayload(); + // Дополнительная проверка + if (req.getMoneyAccountId() == null && (req.getMoneyAccountId() == null || req.getDepoAccountId() == null)) { + TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getSingleObjectByFieldValues(Map.of("companyId", req.getCompanyId())); + if (registryByCompany == null) { + return requestHelper.makeErrorResponse(userRequest, + AccountError.TradingClearingRegistryNotFound, + "companyId=" + req.getCompanyId()); + } + } Long id = tradingClearingRegistryImdg.nextIDSequenceFor(); TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); @@ -335,6 +352,15 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini TradingClearingRegistryUpdateRequest req = userRequest.getRequestPayload(); TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(req.getId()); + // Дополнительная проверка + if (req.getMoneyAccountId() == null && (req.getMoneyAccountId() == null || req.getDepoAccountId() == null)) { + TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getSingleObjectByFieldValues(Map.of("companyId", req.getCompanyId())); + if (registryByCompany == null) { + return requestHelper.makeErrorResponse(userRequest, + AccountError.TradingClearingRegistryNotFound, + "companyId=" + req.getCompanyId()); + } + } if (req.getStatus() != null) tradingClearingRegistry.setStatus(req.getStatus()); From 699587c8d48b441653a342bb864c8bbc9d8aaf90 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 24 May 2023 13:41:27 +0300 Subject: [PATCH 4/6] refactoring SDF*executors --- .../clearing/service/StatementService.java | 20 +++++-------------- .../service/executors/AbstractExecutor.java | 1 + .../service/executors/Sdf01Executor.java | 5 +++++ .../service/executors/Sdf57Executor.java | 9 +++++++-- 4 files changed, 18 insertions(+), 17 deletions(-) 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 716272de2..dd42e9530 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 @@ -61,6 +61,7 @@ public class StatementService extends QueueConsumer implements InitializingBean .forDestination(Consts.STATEMENT_PROCESS, callbacks::put); init(); } + private void process(BaseRequest systemRequest) { StatementRequest statementRequest = systemRequest.getRequestPayload(); Collection sdfGroup; @@ -75,19 +76,16 @@ public class StatementService extends QueueConsumer implements InitializingBean .map(part -> sdfImdg.getSingleObjectByID(part.getSdfId())) .collect(Collectors.toList()); } -// sdf01Group = sdf01Group -// .stream() -// .sorted(Comparator.comparing(SpcexObjectBase::getId)) -// .collect(Collectors.toList()); + AbstractExecutor service = executorsMap.get(table); Result res = service.execute(sdfGroup, statementRequest); - if (res.getAccountRequests().size() == 0) { + 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 { - kafkaSender.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); } } @@ -97,12 +95,4 @@ public class StatementService extends QueueConsumer implements InitializingBean r.setAccounts(accountRequests); return r; } - - private Imdg defineImdgByTableName(SdfTable table){ - switch (table){ - case SDF_01 -> imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class); - case SDF_57 -> imdgProvider.getImdg(IMDGDistributedNames.Map_SDf57, SDf57.class); - } - return null; - } } 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 a5ee180f4..b1bc4cddf 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 @@ -8,4 +8,5 @@ import java.util.Collection; public abstract class AbstractExecutor { public abstract Result execute(Collection sdf, StatementRequest statementRequest); public abstract String exportTableName(); + public abstract boolean isNeedToSendCommandToExport(); } 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 bac828e1f..e2b30c58c 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 @@ -64,6 +64,11 @@ public class Sdf01Executor extends AbstractExecutor { return "DF-02"; } + @Override + public boolean isNeedToSendCommandToExport() { + return true; + } + 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 9102630cb..65e1f26c5 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 @@ -65,8 +65,13 @@ public class Sdf57Executor extends AbstractExecutor { @Override public String exportTableName() { - return "DF-57"; - } //no need... + return null; + } + + @Override + public boolean isNeedToSendCommandToExport() { + return false; + }//no need... //V - Изменение statement по sDf57 // From 412d15ec3aec29cde4c23839004cfe9f0161d2a9 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 24 May 2023 13:49:01 +0300 Subject: [PATCH 5/6] =?UTF-8?q?account-service=20AccountValidationConfig?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB,=20=D1=81?= =?UTF-8?q?=D0=BC.=20=D0=A2=D0=97=20X=20-=20=D0=91=D0=BB=D0=BE=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BD=D0=B4=D0=B5=D0=BD=D1=82=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=81=D1=87=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/config/validation/AccountValidationConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java index 9ee54a54b..037ab0cd2 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java @@ -116,8 +116,8 @@ public class AccountValidationConfig { AccountError.RequiredFieldEmpty, AccountError.AccountNotFound, account -> { - String statusFromRequest = correspondentAccountUpdateRequest.getStatus(); - if (statusFromRequest != null && !statusFromRequest.equalsIgnoreCase(account.getStatus())) + // проверка на заблокированность счёта + if (!AccountStatus.ACTIVE.getKey().equalsIgnoreCase(account.getStatus())) return AccountError.WrongFieldValue; return null; }), From 0daaea522e918ba68f1f22ec3d802425e82fa0b3 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 24 May 2023 13:49:20 +0300 Subject: [PATCH 6/6] copye tests --- .../balance/service/AbstractServiceTest.java | 34 +-- .../balance/service/Sdf01ExecutorTest.java | 263 ------------------ .../service/StatementServiceServiceTest.java | 137 --------- .../service/StatementServiceServiceTest.java | 111 ++++++++ .../sql/RegistryCodeSqlBuilderTest.java | 91 +++--- .../service/executors/Sdf01ExecutorTest.java | 238 ++++++++++++++++ 6 files changed, 406 insertions(+), 468 deletions(-) delete mode 100644 clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/Sdf01ExecutorTest.java delete mode 100644 clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java create mode 100644 clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/StatementServiceServiceTest.java create mode 100644 clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/executors/Sdf01ExecutorTest.java diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AbstractServiceTest.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AbstractServiceTest.java index b77d31c7a..5e08f0f09 100644 --- a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AbstractServiceTest.java +++ b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/AbstractServiceTest.java @@ -22,17 +22,13 @@ import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast; import java.math.BigDecimal; import java.math.RoundingMode; -import java.time.LocalDate; import java.util.concurrent.atomic.AtomicLong; -import static ru.spcex.clearing.balance.service.Sdf01ExecutorTest.acc; -import static ru.spcex.clearing.balance.service.Sdf01ExecutorTest.datFormatter; import static ru.spcex.clearing.balance.utils.MatcherFactory.usingIgnoringFieldsComparator; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { AccountBalanceService.class, - Sdf01Executor.class, Sdf08Service.class, // Sdf09Executor.class, Sdf16Executor.class, @@ -140,19 +136,19 @@ public abstract class AbstractServiceTest { accountBalance.setFullName(company.getFullName()); return accountBalance; } - - protected SDf01 getTestSdf01(long id, long generationId) { - LocalDate date = LocalDate.now(); - SDf01 sdf01 = new SDf01(); - sdf01.setId(id); - sdf01.setGenerationId(generationId); - sdf01.setMarket("U"); - sdf01.setDeal(deal); - sdf01.setAccount(acc); - sdf01.setCurr_code("RUR"); - sdf01.setDat(date.format(datFormatter)); - sdf01.setAcc_type("A"); - sdf01.setRemainder(amountNew.toString()); - return sdf01; - } +// +// protected SDf01 getTestSdf01(long id, long generationId) { +// LocalDate date = LocalDate.now(); +// SDf01 sdf01 = new SDf01(); +// sdf01.setId(id); +// sdf01.setGenerationId(generationId); +// sdf01.setMarket("U"); +// sdf01.setDeal(deal); +// sdf01.setAccount(acc); +// sdf01.setCurr_code("RUR"); +// sdf01.setDat(date.format(datFormatter)); +// sdf01.setAcc_type("A"); +// sdf01.setRemainder(amountNew.toString()); +// return sdf01; +// } } diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/Sdf01ExecutorTest.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/Sdf01ExecutorTest.java deleted file mode 100644 index b2633523a..000000000 --- a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/Sdf01ExecutorTest.java +++ /dev/null @@ -1,263 +0,0 @@ -package ru.spcex.clearing.balance.service; - -import org.apache.kafka.clients.producer.MockProducer; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.SpyBean; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.account.AccountBalance; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.sdf.SDf01; -import ru.clearing.classes.statics.data.sdf.SDf02; -import ru.clearing.classes.statics.data.statement.Statement; -import ru.spcex.clearing.balance.errors.BalanceError; -import ru.spcex.clearing.balance.utils.MatcherFactory; -import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; -import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.number.BigDecimalUtil; - -import javax.annotation.PostConstruct; -import java.time.Instant; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; - -import static ru.spcex.clearing.balance.utils.MatcherFactory.usingIgnoringFieldsComparator; - -class Sdf01ExecutorTest extends AbstractServiceTest { - public final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); - public final static String acc = "123456789"; - private static final MatcherFactory.Matcher SDF_02_MATCHER = usingIgnoringFieldsComparator("created", "comment", "outSDfId", "generationTime", "generationId", "id"); - private final Long ID = 1L; - @Autowired - Sdf01Executor sdf01Executor; - private StatementRequest statementRequest; - @SpyBean - private MockProducer producer; - - @PostConstruct - void init() { - super.init(); - statementRequest = new StatementRequest(); - } - - /** - * {@link Sdf01Executor#execute(Collection collection, StatementRequest statementRequest)}
- * Тест проверяет генерацию сущностей {@link Result}, {@link Statement}, {@link SDf02}
- * Входные параметры:
- * accountId - {@link StatementRequest}: new StatementRequest()
- * addresseeId - {@link Collection}
- * addresseeId - {@link SDf01}
- * {@link SDf01#market} - "U"
- * {@link SDf01#deal} - "111111111"
- * {@link SDf01#account} - "123456789"
- * {@link SDf01#curr_code} - "RUR"
- * {@link SDf01#dat} - текущая дата
- * {@link SDf01#acc_type} - "A"
- * {@link SDf01#remainder} - "1000"
- */ - @Test - void execute() { - //check create statement, SDf02 and AccountBalance - SDf01 sdf01 = getTestSdf01(ID, 1L); - Company company = getTestCompany(); - companyMap.put(addresseeIdNew, company); - - Account account = getTestAccount(ID, acc); - accountMap.put(accountIdNew, account); - - Result predictableResult = new Result(); - predictableResult.setGenerationId(ID); - Statement predictableStatement = getTestStatement(currentId.getAndIncrement(), company, account, sdf01); - predictableStatement.setOperationStatus(OperationStatus.Executed.getKey()); - SDf02 predictableSdf02 = getTestSdf02(currentId.getAndIncrement(), sdf01, ID); - predictableStatement.setOutSDfId(predictableSdf02.getId()); - AccountResult predictableNewResult = getTestAccountResult(currentId.getAndIncrement(), account, company); - - Result result = sdf01Executor.execute(Collections.singletonList(sdf01), statementRequest); - Statement resultStatement = statementImdg.getSingleObjectByFieldValues(Map.of("account", acc)); - SDf02 resultSdf02 = sdf02Imdg.getSingleObjectByFieldValues(Map.of("account", acc)); - AccountBalance resultAccountBalance = accountBalanceImdg.getSingleObjectByFieldValues(Map.of("account", acc)); - - RESULT_MATCHER.assertMatch(result, predictableResult); - STATEMENT_MATCHER.assertMatch(resultStatement, predictableStatement); - SDF_02_MATCHER.assertMatch(resultSdf02, predictableSdf02); - ACCOUNT_BALANCE_MATCHER.assertMatch(resultAccountBalance, predictableNewResult.getAccount()); - } - - /** - * {@link Sdf01Executor#execute(Collection collection, StatementRequest statementRequest)}
- * Тест проверяет валидацию
- * Входные параметры:
- * accountId - {@link StatementRequest}: new StatementRequest()
- * addresseeId - {@link Collection}
- * addresseeId - {@link SDf01}
- * {@link SDf01#market} - "U"
- * {@link SDf01#deal} - "111111111"
- * {@link SDf01#account} - "123456789"
- * {@link SDf01#curr_code} - "RUR"
- * {@link SDf01#dat} - текущая дата
- * {@link SDf01#acc_type} - "A"
- * {@link SDf01#remainder} - "1000"
- */ - @Test - void validatedExecute() { - //CompanyNotFound - SDf01 sdf01 = getTestSdf01(ID, 1L); - companyMap.delete(addresseeIdNew); - checkError(new EnumMessage(BalanceError.CompanyNotFound), sdf01); - - sdf01.setDeal(null); - checkError(new EnumMessage(BalanceError.CompanyNotFound), sdf01); - - //AccountNotPresent accountType=null - sdf01.setDeal(deal); - Company company = getTestCompany(); - companyMap.put(addresseeIdNew, company); - Account account = new Account(); - account.setAccount(acc); - account.setStatus(Status.Active.getKey()); - accountMap.put(accountIdNew, account); - checkErrorAccountNotPresent(company, sdf01); - - //AccountNotPresent account=null - account.setAccount(null); - account.setAccountType(AccountType.Clrn.getKey()); - account.setStatus(Status.Active.getKey()); - accountMap.put(accountIdNew, account); - checkErrorAccountNotPresent(company, sdf01); - - //AccountNotPresent sdf01.account==null - sdf01.setAccount(null); - checkErrorAccountNotPresent(company, sdf01); - - //CurrencyNotFound sdf01.curr_code =! "RUR" - accountMap.put(accountIdNew, getTestAccount(ID, acc)); - sdf01.setAccount(acc); - sdf01.setCurr_code("RUB"); - checkError(new EnumMessage(BalanceError.CurrencyNotFound), sdf01); - - //CurrencyNotFound sdf01.curr_code =! "RUR" - sdf01.setCurr_code(null); - checkError(new EnumMessage(BalanceError.CurrencyNotFound), sdf01); - - //CurrentDateOnly - sdf01.setCurr_code("RUR"); - sdf01.setDat("19.01.23"); - checkError(new EnumMessage(BalanceError.CurrentDateOnly), sdf01); - - //CurrentDateOnly - sdf01.setDat("19.01.2023"); - checkError(new EnumMessage(BalanceError.CurrentDateOnly), sdf01); - - //CurrentDateOnly - sdf01.setDat(null); - checkError(new EnumMessage(BalanceError.CurrentDateOnly), sdf01); - - //WrongAccount - sdf01.setDat(LocalDate.now().format(datFormatter)); - sdf01.setAcc_type(null); - checkError(new EnumMessage(BalanceError.WrongAccount), sdf01); - - //WrongMarket - sdf01.setAcc_type("A"); - sdf01.setMarket(null); - checkError(new EnumMessage(BalanceError.WrongMarket), sdf01); - - sdf01.setMarket("U"); - } - - private void checkError(EnumMessage enumMessage, SDf01 sdf01) { -// SDf01 sdf01 = getTestSdf01(); - SDf02 predictableSdf02 = getTestErrorSdf02(sdf01, enumMessage, ID); - Result result = sdf01Executor.execute(Collections.singletonList(sdf01), statementRequest); - Collection resultsSdf02 = sdf02Imdg.getCollectionObjectsByFieldValues(Map.of("account", acc)); - SDf02 resultSdf02 = resultsSdf02.stream().max((entry1, entry2) -> entry1.getId() > entry2.getId() ? 1 : -1).get(); - SDF_02_MATCHER.assertMatch(resultSdf02, predictableSdf02); - } - - private void checkErrorAccountNotPresent(Company company, SDf01 sdf01) { - Result predictableResult = new Result(); - predictableResult.getAccountRequests().add(createAccountRequestPart(sdf01.getId(), sdf01.getAccount(), company.getId())); - Result result = sdf01Executor.execute(Collections.singletonList(sdf01), statementRequest); - RESULT_MATCHER.assertMatch(result, predictableResult); - - } - - private SDf02 getTestSdf02(Long id, SDf01 sdf01, Long generationIdForGroup) { - SDf02 sDf02 = new SDf02(); - sDf02.setId(id); - sDf02.setCurr_code(sdf01.getCurr_code()); - sDf02.setAccount(sdf01.getAccount()); - sDf02.setRemainder(sdf01.getRemainder()); - sDf02.setDeal(sdf01.getDeal()); - sDf02.setAcc_code(sdf01.getAcc_code()); - sDf02.setDat(sdf01.getDat()); - sDf02.setMarket(sdf01.getMarket()); - sDf02.setAcc_name(sdf01.getAcc_name()); - sDf02.setAcc_type(sdf01.getAcc_type()); - sDf02.setSumengage(sdf01.getSumengage()); - sDf02.setSumunblock(sdf01.getSumunblock()); - sDf02.setFile_type(sdf01.getFile_type()); - sDf02.setInSDfId(sdf01.getId()); - sDf02.setGenerationId(generationIdForGroup); - sDf02.setGenerationTime(Instant.now()); - sDf02.setResult("OK!"); - return sDf02; - } - - private Statement getTestStatement(Long id, Company company, Account account, SDf01 sdf01) { - Statement statement = new Statement(); - statement.setId(id); - statement.setAddresseeId(company.getId()); - statement.setSenderId(Sender.Prc.getId()); - statement.setCreated(Instant.now()); - statement.setClearingDate(LocalDate.now()); - statement.setStatementType(StatementType.full.getKey()); - statement.setAccountId(account.getId()); - statement.setAccount(sdf01.getAccount()); - statement.setInOutDirection(InOutDirection.in.getKey()); - statement.setSettlementDate(LocalDate.parse(sdf01.getDat(), datFormatter)); - statement.setAmount(BigDecimalUtil.parse(sdf01.getRemainder())); - statement.setOperationStatus(OperationStatus.Pending.getKey()); - statement.setInSDfId(sdf01.getId()); - statement.setInOutSDfType(InOutSDfType.type1.getKey()); - return statement; - } - - private SDf02 getTestErrorSdf02(SDf01 sdf01, EnumMessage error, Long generationIdForGroup) { - SDf02 sDf02 = new SDf02(); - sDf02.setId(ID); - sDf02.setCurr_code(sdf01.getCurr_code()); - sDf02.setAccount(sdf01.getAccount()); - sDf02.setRemainder(sdf01.getRemainder()); - sDf02.setDeal(sdf01.getDeal()); - sDf02.setAcc_code(sdf01.getAcc_code()); - sDf02.setDat(sdf01.getDat()); - sDf02.setMarket(sdf01.getMarket()); - sDf02.setAcc_name(sdf01.getAcc_name()); - sDf02.setAcc_type(sdf01.getAcc_type()); - sDf02.setSumengage(sdf01.getSumengage()); - sDf02.setSumunblock(sdf01.getSumunblock()); - sDf02.setFile_type(sdf01.getFile_type()); - sDf02.setInSDfId(sdf01.getId()); - String errorId = error.getSubject().getId().toString(); - sDf02.setResult(errorId.substring(errorId.length() - 3)); - sDf02.setGenerationId(generationIdForGroup); - sDf02.setGenerationTime(Instant.now()); - return sDf02; - } - - private AccountSdfRequestPart createAccountRequestPart(Long sdf01Id, String account, Long companyId) { - AccountSdfRequestPart req = new AccountSdfRequestPart(); - req.setAccount(account); - req.setCompanyId(companyId); - req.setAccountType(AccountType.Clrn.getKey()); - req.setSdfId(sdf01Id); - return req; - } -} \ No newline at end of file diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java deleted file mode 100644 index 9759178f4..000000000 --- a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java +++ /dev/null @@ -1,137 +0,0 @@ -package ru.spcex.clearing.balance.service; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.MockProducer; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.SpyBean; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.sdf.SDf01; -import ru.spcex.clearing.platform.messaging.domain.ActionType; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; -import ru.spcex.clearing.platform.messaging.service.RequestInfo; - -import javax.annotation.PostConstruct; -import java.util.concurrent.atomic.AtomicLong; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; -import static ru.spcex.clearing.balance.utils.MockKafkaUtils.addRecordToKafka; -import static ru.spcex.platform.enumeration.SdfTable.SDF_01; - -class StatementServiceServiceTest extends AbstractServiceTest { - private static final String TOPIC = Consts.STATEMENT_PROCESS; - private static final int PARTITION = 1; - private static final Long groupId = 111L; - private final static AtomicLong cuurentOffset = new AtomicLong(1L); - private final Long ID = 11L; - @Autowired - StatementService statementService; - @Captor - ArgumentCaptor producerRecord; - private MockConsumer mockConsumer; - private SDf01 sDf01; - private Company company; - @SpyBean - private MockProducer producer; - - @PostConstruct - void init() { - super.init(); - mockConsumer = (MockConsumer) statementService.getConsumer(); - sDf01 = getTestSdf01(ID, groupId); - company = getTestCompany(); - } - - /** - * {@link StatementService}
- * Тест проверяет генерацию сущностей {@link RequestInfo}
- * Входные параметры:
- * {@link StatementRequest}: new StatementRequest()
- * {@link StatementRequest#table} - SDF_01
- */ - @Test - void processEXPORT_PROCESS() { - sdf01Imdg.delete(sDf01); - companyImdg.delete(company); - - companyImdg.delete(company); - StatementRequest statementRequest = new StatementRequest(); - statementRequest.setGroupId(groupId); - statementRequest.setTable(SDF_01); - BaseRequest baseNewRequest = new BaseRequest<>(); - baseNewRequest.setRequestPayload(statementRequest); - baseNewRequest.setId(currentId.getAndIncrement()); - baseNewRequest.setActionType(ActionType.NEW); - String jsonBaseNewRequest; - ObjectMapper objectMapper = new ObjectMapper(); - try { - jsonBaseNewRequest = objectMapper.writeValueAsString(baseNewRequest); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - - addRecordToKafka(mockConsumer, TOPIC, PARTITION, cuurentOffset.getAndIncrement(), jsonBaseNewRequest); - - //waiting for kafka producer send message (finale event) - verify(producer, timeout(30_000L).times(1)) - .send(producerRecord.capture()); - - BaseRequest baseRequest = (BaseRequest) producerRecord.getValue().value(); - RequestInfo resultRequestInfo = requestInfoImdg.getSingleObjectByID(baseRequest.getId()); - - assertEquals(Consts.EXPORT_PROCESS, producerRecord.getValue().topic()); - assertNotNull(baseRequest); - assertNotNull(resultRequestInfo); - } - - /** - * {@link StatementService}
- * Тест проверяет генерацию сущностей {@link RequestInfo}
- * Входные параметры:
- * {@link StatementRequest}: new StatementRequest()
- * {@link StatementRequest#table} - SDF_01
- */ - @Test - void processACCOUNT_NEW() { - sdf01Imdg.insert(sDf01); - companyImdg.insert(company); - - StatementRequest statementRequest = new StatementRequest(); - statementRequest.setGroupId(groupId); - statementRequest.setTable(SDF_01); - BaseRequest baseNewRequest = new BaseRequest<>(); - baseNewRequest.setRequestPayload(statementRequest); - baseNewRequest.setId(currentId.getAndIncrement()); - baseNewRequest.setActionType(ActionType.NEW); - String jsonBaseNewRequest; - ObjectMapper objectMapper = new ObjectMapper(); - try { - jsonBaseNewRequest = objectMapper.writeValueAsString(baseNewRequest); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - - addRecordToKafka(mockConsumer, TOPIC, PARTITION, cuurentOffset.getAndIncrement(), jsonBaseNewRequest); - - //waiting for kafka producer send message (finale event) - verify(producer, timeout(30_000L).times(1)) - .send(producerRecord.capture()); - - BaseRequest baseRequest = (BaseRequest) producerRecord.getValue().value(); - RequestInfo resultRequestInfo = requestInfoImdg.getSingleObjectByID(baseRequest.getId()); - - assertEquals(Consts.ACCOUNT_NEW_SDF01, producerRecord.getValue().topic()); - assertNotNull(baseRequest); - assertNotNull(resultRequestInfo); - } -} \ No newline at end of file diff --git a/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/StatementServiceServiceTest.java b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/StatementServiceServiceTest.java new file mode 100644 index 000000000..bd7655f7c --- /dev/null +++ b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/StatementServiceServiceTest.java @@ -0,0 +1,111 @@ +package ru.spcex.clearing.service; + +//todo раскоментить тест +class StatementServiceServiceTest { +// extends AbstractServiceTest { +// private static final String TOPIC = Consts.STATEMENT_PROCESS; +// private static final int PARTITION = 1; +// private static final Long groupId = 111L; +// private final static AtomicLong cuurentOffset = new AtomicLong(1L); +// private final Long ID = 11L; +// @Autowired +// StatementService statementService; +// @Captor +// ArgumentCaptor producerRecord; +// private MockConsumer mockConsumer; +// private SDf01 sDf01; +// private Company company; +// @SpyBean +// private MockProducer producer; +// +// @PostConstruct +// void init() { +// super.init(); +// mockConsumer = (MockConsumer) statementService.getConsumer(); +// sDf01 = getTestSdf01(ID, groupId); +// company = getTestCompany(); +// } +// +// /** +// * {@link StatementService}
+// * Тест проверяет генерацию сущностей {@link RequestInfo}
+// * Входные параметры:
+// * {@link StatementRequest}: new StatementRequest()
+// * {@link StatementRequest#table} - SDF_01
+// */ +// @Test +// void processEXPORT_PROCESS() { +// sdf01Imdg.delete(sDf01); +// companyImdg.delete(company); +// +// companyImdg.delete(company); +// StatementRequest statementRequest = new StatementRequest(); +// statementRequest.setGroupId(groupId); +// statementRequest.setTable(SDF_01); +// BaseRequest baseNewRequest = new BaseRequest<>(); +// baseNewRequest.setRequestPayload(statementRequest); +// baseNewRequest.setId(currentId.getAndIncrement()); +// baseNewRequest.setActionType(ActionType.NEW); +// String jsonBaseNewRequest; +// ObjectMapper objectMapper = new ObjectMapper(); +// try { +// jsonBaseNewRequest = objectMapper.writeValueAsString(baseNewRequest); +// } catch (JsonProcessingException e) { +// throw new RuntimeException(e); +// } +// +// addRecordToKafka(mockConsumer, TOPIC, PARTITION, cuurentOffset.getAndIncrement(), jsonBaseNewRequest); +// +// //waiting for kafka producer send message (finale event) +// verify(producer, timeout(30_000L).times(1)) +// .send(producerRecord.capture()); +// +// BaseRequest baseRequest = (BaseRequest) producerRecord.getValue().value(); +// RequestInfo resultRequestInfo = requestInfoImdg.getSingleObjectByID(baseRequest.getId()); +// +// assertEquals(Consts.EXPORT_PROCESS, producerRecord.getValue().topic()); +// assertNotNull(baseRequest); +// assertNotNull(resultRequestInfo); +// } +// +// /** +// * {@link StatementService}
+// * Тест проверяет генерацию сущностей {@link RequestInfo}
+// * Входные параметры:
+// * {@link StatementRequest}: new StatementRequest()
+// * {@link StatementRequest#table} - SDF_01
+// */ +// @Test +// void processACCOUNT_NEW() { +// sdf01Imdg.insert(sDf01); +// companyImdg.insert(company); +// +// StatementRequest statementRequest = new StatementRequest(); +// statementRequest.setGroupId(groupId); +// statementRequest.setTable(SDF_01); +// BaseRequest baseNewRequest = new BaseRequest<>(); +// baseNewRequest.setRequestPayload(statementRequest); +// baseNewRequest.setId(currentId.getAndIncrement()); +// baseNewRequest.setActionType(ActionType.NEW); +// String jsonBaseNewRequest; +// ObjectMapper objectMapper = new ObjectMapper(); +// try { +// jsonBaseNewRequest = objectMapper.writeValueAsString(baseNewRequest); +// } catch (JsonProcessingException e) { +// throw new RuntimeException(e); +// } +// +// addRecordToKafka(mockConsumer, TOPIC, PARTITION, cuurentOffset.getAndIncrement(), jsonBaseNewRequest); +// +// //waiting for kafka producer send message (finale event) +// verify(producer, timeout(30_000L).times(1)) +// .send(producerRecord.capture()); +// +// BaseRequest baseRequest = (BaseRequest) producerRecord.getValue().value(); +// RequestInfo resultRequestInfo = requestInfoImdg.getSingleObjectByID(baseRequest.getId()); +// +// assertEquals(Consts.ACCOUNT_NEW_SDF01, producerRecord.getValue().topic()); +// assertNotNull(baseRequest); +// assertNotNull(resultRequestInfo); +// } +} \ No newline at end of file diff --git a/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java index ca1c7b68c..c1ffcec83 100644 --- a/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java +++ b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java @@ -1,54 +1,47 @@ package ru.spcex.clearing.service.builder.sql; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import ru.spcex.clearing.models.RegistryTradingParams; -import ru.spcex.platform.enumeration.RegistryCapacity; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryInstrumentType; -import ru.spcex.platform.enumeration.RegistryUnit; - public class RegistryCodeSqlBuilderTest { +//todo раскоментить тесты - @Test - public void testBuildByOneObject() { - RegistryTradingParams registryTradingParams = new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); - RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); - String sql = registryCodeSqlBuilder.build(); - Assertions.assertEquals("(registryDesignation = 'C' and registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')", sql); - - registryTradingParams = new RegistryTradingParams(null, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); - registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); - sql = registryCodeSqlBuilder.build(); - Assertions.assertEquals("(registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')", sql); - - registryTradingParams = new RegistryTradingParams(RegistryDesignation.C, null, null, RegistryUnit.R); - registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); - sql = registryCodeSqlBuilder.build(); - Assertions.assertEquals("(registryDesignation = 'C' and registryUnit = 'R')", sql); - } - - @Test - public void testBuildByFewObjects() { - RegistryTradingParams registryTradingParams_first = new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); - RegistryTradingParams registryTradingParams_second = new RegistryTradingParams(RegistryDesignation.O, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); - RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); - String sql = registryCodeSqlBuilder.build(); - Assertions.assertEquals("(registryDesignation = 'C' and registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')" + - " or (registryDesignation = 'O' and registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); - - registryTradingParams_first = new RegistryTradingParams(null, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); - registryTradingParams_second = new RegistryTradingParams(null, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); - registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); - sql = registryCodeSqlBuilder.build(); - Assertions.assertEquals("(registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R') or " + - "(registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); - - registryTradingParams_first = new RegistryTradingParams(RegistryDesignation.C, null, null, RegistryUnit.R); - registryTradingParams_second = new RegistryTradingParams(null, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); - registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); - sql = registryCodeSqlBuilder.build(); - Assertions.assertEquals("(registryDesignation = 'C' and registryUnit = 'R') or " + - "(registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); - } +// @Test +// public void testBuildByOneObject() { +// RegistryTradingParams registryTradingParams = new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); +// RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); +// String sql = registryCodeSqlBuilder.build(); +// Assertions.assertEquals("(registryDesignation = 'C' and registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')", sql); +// +// registryTradingParams = new RegistryTradingParams(null, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); +// registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); +// sql = registryCodeSqlBuilder.build(); +// Assertions.assertEquals("(registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')", sql); +// +// registryTradingParams = new RegistryTradingParams(RegistryDesignation.C, null, null, RegistryUnit.R); +// registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); +// sql = registryCodeSqlBuilder.build(); +// Assertions.assertEquals("(registryDesignation = 'C' and registryUnit = 'R')", sql); +// } +// +// @Test +// public void testBuildByFewObjects() { +// RegistryTradingParams registryTradingParams_first = new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); +// RegistryTradingParams registryTradingParams_second = new RegistryTradingParams(RegistryDesignation.O, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); +// RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); +// String sql = registryCodeSqlBuilder.build(); +// Assertions.assertEquals("(registryDesignation = 'C' and registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')" + +// " or (registryDesignation = 'O' and registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); +// +// registryTradingParams_first = new RegistryTradingParams(null, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); +// registryTradingParams_second = new RegistryTradingParams(null, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); +// registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); +// sql = registryCodeSqlBuilder.build(); +// Assertions.assertEquals("(registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R') or " + +// "(registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); +// +// registryTradingParams_first = new RegistryTradingParams(RegistryDesignation.C, null, null, RegistryUnit.R); +// registryTradingParams_second = new RegistryTradingParams(null, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); +// registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); +// sql = registryCodeSqlBuilder.build(); +// Assertions.assertEquals("(registryDesignation = 'C' and registryUnit = 'R') or " + +// "(registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); +// } } diff --git a/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/executors/Sdf01ExecutorTest.java b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/executors/Sdf01ExecutorTest.java new file mode 100644 index 000000000..0b358ae18 --- /dev/null +++ b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/executors/Sdf01ExecutorTest.java @@ -0,0 +1,238 @@ +package ru.spcex.clearing.service.executors; + +//todo раскоментить тест +// +class Sdf01ExecutorTest { +// extends AbstractServiceTest { +// public final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); +// public final static String acc = "123456789"; +// private static final MatcherFactory.Matcher SDF_02_MATCHER = usingIgnoringFieldsComparator("created", "comment", "outSDfId", "generationTime", "generationId", "id"); +// private final Long ID = 1L; +// @Autowired +// Sdf01Executor sdf01Executor; +// private StatementRequest statementRequest; +// @SpyBean +// private MockProducer producer; +// +// @PostConstruct +// void init() { +// super.init(); +// statementRequest = new StatementRequest(); +// } +// +// /** +// * {@link Sdf01Executor#execute(Collection collection, StatementRequest statementRequest)}
+// * Тест проверяет генерацию сущностей {@link Result}, {@link Statement}, {@link SDf02}
+// * Входные параметры:
+// * accountId - {@link StatementRequest}: new StatementRequest()
+// * addresseeId - {@link Collection}
+// * addresseeId - {@link SDf01}
+// * {@link SDf01#market} - "U"
+// * {@link SDf01#deal} - "111111111"
+// * {@link SDf01#account} - "123456789"
+// * {@link SDf01#curr_code} - "RUR"
+// * {@link SDf01#dat} - текущая дата
+// * {@link SDf01#acc_type} - "A"
+// * {@link SDf01#remainder} - "1000"
+// */ +// @Test +// void execute() { +// //check create statement, SDf02 and AccountBalance +// SDf01 sdf01 = getTestSdf01(ID, 1L); +// Company company = getTestCompany(); +// companyMap.put(addresseeIdNew, company); +// +// Account account = getTestAccount(ID, acc); +// accountMap.put(accountIdNew, account); +// +// Result predictableResult = new Result(); +// predictableResult.setGenerationId(ID); +// Statement predictableStatement = getTestStatement(currentId.getAndIncrement(), company, account, sdf01); +// predictableStatement.setOperationStatus(OperationStatus.Executed.getKey()); +// SDf02 predictableSdf02 = getTestSdf02(currentId.getAndIncrement(), sdf01, ID); +// predictableStatement.setOutSDfId(predictableSdf02.getId()); +// AccountResult predictableNewResult = getTestAccountResult(currentId.getAndIncrement(), account, company); +// +// Result result = sdf01Executor.execute(Collections.singletonList(sdf01), statementRequest); +// Statement resultStatement = statementImdg.getSingleObjectByFieldValues(Map.of("account", acc)); +// SDf02 resultSdf02 = sdf02Imdg.getSingleObjectByFieldValues(Map.of("account", acc)); +// AccountBalance resultAccountBalance = accountBalanceImdg.getSingleObjectByFieldValues(Map.of("account", acc)); +// +// RESULT_MATCHER.assertMatch(result, predictableResult); +// STATEMENT_MATCHER.assertMatch(resultStatement, predictableStatement); +// SDF_02_MATCHER.assertMatch(resultSdf02, predictableSdf02); +// ACCOUNT_BALANCE_MATCHER.assertMatch(resultAccountBalance, predictableNewResult.getAccount()); +// } +// +// /** +// * {@link Sdf01Executor#execute(Collection collection, StatementRequest statementRequest)}
+// * Тест проверяет валидацию
+// * Входные параметры:
+// * accountId - {@link StatementRequest}: new StatementRequest()
+// * addresseeId - {@link Collection}
+// * addresseeId - {@link SDf01}
+// * {@link SDf01#market} - "U"
+// * {@link SDf01#deal} - "111111111"
+// * {@link SDf01#account} - "123456789"
+// * {@link SDf01#curr_code} - "RUR"
+// * {@link SDf01#dat} - текущая дата
+// * {@link SDf01#acc_type} - "A"
+// * {@link SDf01#remainder} - "1000"
+// */ +// @Test +// void validatedExecute() { +// //CompanyNotFound +// SDf01 sdf01 = getTestSdf01(ID, 1L); +// companyMap.delete(addresseeIdNew); +// checkError(new EnumMessage(BalanceError.CompanyNotFound), sdf01); +// +// sdf01.setDeal(null); +// checkError(new EnumMessage(BalanceError.CompanyNotFound), sdf01); +// +// //AccountNotPresent accountType=null +// sdf01.setDeal(deal); +// Company company = getTestCompany(); +// companyMap.put(addresseeIdNew, company); +// Account account = new Account(); +// account.setAccount(acc); +// account.setStatus(Status.Active.getKey()); +// accountMap.put(accountIdNew, account); +// checkErrorAccountNotPresent(company, sdf01); +// +// //AccountNotPresent account=null +// account.setAccount(null); +// account.setAccountType(AccountType.Clrn.getKey()); +// account.setStatus(Status.Active.getKey()); +// accountMap.put(accountIdNew, account); +// checkErrorAccountNotPresent(company, sdf01); +// +// //AccountNotPresent sdf01.account==null +// sdf01.setAccount(null); +// checkErrorAccountNotPresent(company, sdf01); +// +// //CurrencyNotFound sdf01.curr_code =! "RUR" +// accountMap.put(accountIdNew, getTestAccount(ID, acc)); +// sdf01.setAccount(acc); +// sdf01.setCurr_code("RUB"); +// checkError(new EnumMessage(BalanceError.CurrencyNotFound), sdf01); +// +// //CurrencyNotFound sdf01.curr_code =! "RUR" +// sdf01.setCurr_code(null); +// checkError(new EnumMessage(BalanceError.CurrencyNotFound), sdf01); +// +// //CurrentDateOnly +// sdf01.setCurr_code("RUR"); +// sdf01.setDat("19.01.23"); +// checkError(new EnumMessage(BalanceError.CurrentDateOnly), sdf01); +// +// //CurrentDateOnly +// sdf01.setDat("19.01.2023"); +// checkError(new EnumMessage(BalanceError.CurrentDateOnly), sdf01); +// +// //CurrentDateOnly +// sdf01.setDat(null); +// checkError(new EnumMessage(BalanceError.CurrentDateOnly), sdf01); +// +// //WrongAccount +// sdf01.setDat(LocalDate.now().format(datFormatter)); +// sdf01.setAcc_type(null); +// checkError(new EnumMessage(BalanceError.WrongAccount), sdf01); +// +// //WrongMarket +// sdf01.setAcc_type("A"); +// sdf01.setMarket(null); +// checkError(new EnumMessage(BalanceError.WrongMarket), sdf01); +// +// sdf01.setMarket("U"); +// } +// +// private void checkError(EnumMessage enumMessage, SDf01 sdf01) { +//// SDf01 sdf01 = getTestSdf01(); +// SDf02 predictableSdf02 = getTestErrorSdf02(sdf01, enumMessage, ID); +// Result result = sdf01Executor.execute(Collections.singletonList(sdf01), statementRequest); +// Collection resultsSdf02 = sdf02Imdg.getCollectionObjectsByFieldValues(Map.of("account", acc)); +// SDf02 resultSdf02 = resultsSdf02.stream().max((entry1, entry2) -> entry1.getId() > entry2.getId() ? 1 : -1).get(); +// SDF_02_MATCHER.assertMatch(resultSdf02, predictableSdf02); +// } +// +// private void checkErrorAccountNotPresent(Company company, SDf01 sdf01) { +// Result predictableResult = new Result(); +// predictableResult.getAccountRequests().add(createAccountRequestPart(sdf01.getId(), sdf01.getAccount(), company.getId())); +// Result result = sdf01Executor.execute(Collections.singletonList(sdf01), statementRequest); +// RESULT_MATCHER.assertMatch(result, predictableResult); +// +// } +// +// private SDf02 getTestSdf02(Long id, SDf01 sdf01, Long generationIdForGroup) { +// SDf02 sDf02 = new SDf02(); +// sDf02.setId(id); +// sDf02.setCurr_code(sdf01.getCurr_code()); +// sDf02.setAccount(sdf01.getAccount()); +// sDf02.setRemainder(sdf01.getRemainder()); +// sDf02.setDeal(sdf01.getDeal()); +// sDf02.setAcc_code(sdf01.getAcc_code()); +// sDf02.setDat(sdf01.getDat()); +// sDf02.setMarket(sdf01.getMarket()); +// sDf02.setAcc_name(sdf01.getAcc_name()); +// sDf02.setAcc_type(sdf01.getAcc_type()); +// sDf02.setSumengage(sdf01.getSumengage()); +// sDf02.setSumunblock(sdf01.getSumunblock()); +// sDf02.setFile_type(sdf01.getFile_type()); +// sDf02.setInSDfId(sdf01.getId()); +// sDf02.setGenerationId(generationIdForGroup); +// sDf02.setGenerationTime(Instant.now()); +// sDf02.setResult("OK!"); +// return sDf02; +// } +// +// private Statement getTestStatement(Long id, Company company, Account account, SDf01 sdf01) { +// Statement statement = new Statement(); +// statement.setId(id); +// statement.setAddresseeId(company.getId()); +// statement.setSenderId(Sender.Prc.getId()); +// statement.setCreated(Instant.now()); +// statement.setClearingDate(LocalDate.now()); +// statement.setStatementType(StatementType.full.getKey()); +// statement.setAccountId(account.getId()); +// statement.setAccount(sdf01.getAccount()); +// statement.setInOutDirection(InOutDirection.in.getKey()); +// statement.setSettlementDate(LocalDate.parse(sdf01.getDat(), datFormatter)); +// statement.setAmount(BigDecimalUtil.parse(sdf01.getRemainder())); +// statement.setOperationStatus(OperationStatus.Pending.getKey()); +// statement.setInSDfId(sdf01.getId()); +// statement.setInOutSDfType(InOutSDfType.type1.getKey()); +// return statement; +// } +// +// private SDf02 getTestErrorSdf02(SDf01 sdf01, EnumMessage error, Long generationIdForGroup) { +// SDf02 sDf02 = new SDf02(); +// sDf02.setId(ID); +// sDf02.setCurr_code(sdf01.getCurr_code()); +// sDf02.setAccount(sdf01.getAccount()); +// sDf02.setRemainder(sdf01.getRemainder()); +// sDf02.setDeal(sdf01.getDeal()); +// sDf02.setAcc_code(sdf01.getAcc_code()); +// sDf02.setDat(sdf01.getDat()); +// sDf02.setMarket(sdf01.getMarket()); +// sDf02.setAcc_name(sdf01.getAcc_name()); +// sDf02.setAcc_type(sdf01.getAcc_type()); +// sDf02.setSumengage(sdf01.getSumengage()); +// sDf02.setSumunblock(sdf01.getSumunblock()); +// sDf02.setFile_type(sdf01.getFile_type()); +// sDf02.setInSDfId(sdf01.getId()); +// String errorId = error.getSubject().getId().toString(); +// sDf02.setResult(errorId.substring(errorId.length() - 3)); +// sDf02.setGenerationId(generationIdForGroup); +// sDf02.setGenerationTime(Instant.now()); +// return sDf02; +// } +// +// private AccountSdfRequestPart createAccountRequestPart(Long sdf01Id, String account, Long companyId) { +// AccountSdfRequestPart req = new AccountSdfRequestPart(); +// req.setAccount(account); +// req.setCompanyId(companyId); +// req.setAccountType(AccountType.Clrn.getKey()); +// req.setSdfId(sdf01Id); +// return req; +// } +} \ No newline at end of file