diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index b81417fdd..358390a8e 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -11,7 +11,7 @@ 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.AccountSdf01RequestPart; +import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; @@ -47,12 +47,12 @@ public class AccountService extends QueueConsumer implements InitializingBean { AccountSdf01Request req = userRequest.getRequestPayload(); log.debug("AccountSdf01Request received"); List accountToStatement = new ArrayList<>(); - for (AccountSdf01RequestPart accountReq : req.getAccounts()) { + for (AccountSdfRequestPart accountReq : req.getAccounts()) { Account account = new Account(); account.setAccount(accountReq.getAccount()); //fixme account.setCompany(); accountMap.insert(account); - AccountSdfToStatementRequestPart responsePart = responsePart(accountReq.getSdf01Id()); + AccountSdfToStatementRequestPart responsePart = responsePart(accountReq.getSdfId()); accountToStatement.add(responsePart); } sendStatementRequestBack(req.getGroupingSdf01Id(), accountToStatement); 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 f4410767d..2aecfe859 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 @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Configuration; 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.clearing.classes.statics.data.sdf.SDf16; import ru.spcex.clearing.balance.validation.AccountBalanceValidation; import ru.spcex.clearing.balance.validation.AccountBalanceValidationRule; import ru.spcex.clearing.balance.validation.Sdf01ValidationRule; @@ -60,6 +61,24 @@ public class ValidationConfig { }; } + @Bean("sdf16Validator") + public Function sdf16Validator(ImdgProvider imdgProvider) { + return sDf16 -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(sDf16); + 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, + Sdf01ValidationRule.Market, + Sdf01ValidationRule.accountType); + }; + } + @Autowired @Bean("accountBalanceValidator") public Function accountBalanceValidator(ImdgProvider imdgProvider) { diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Result.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Result.java index d1bb55272..10be78ea7 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Result.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Result.java @@ -1,19 +1,19 @@ package ru.spcex.clearing.balance.service; -import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01RequestPart; +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 List accountRequests = new ArrayList<>(); private Long generationId; - public List getAccountRequests() { + public List getAccountRequests() { return accountRequests; } - public void setAccountRequests(List accountRequests) { + public void setAccountRequests(List accountRequests) { this.accountRequests = accountRequests; } 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 index 144505434..a6ba8c479 100644 --- 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 @@ -12,7 +12,7 @@ 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.AccountSdf01RequestPart; +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; @@ -139,11 +139,11 @@ public class Sdf01Executor extends AbstractExecutor { statementImdg.update(statement); } - private AccountSdf01RequestPart createAccountRequestPart(Long sdf01Id, String account, Long companyId) { - AccountSdf01RequestPart req = new AccountSdf01RequestPart(); + private AccountSdfRequestPart createAccountRequestPart(Long sdf01Id, String account, Long companyId) { + AccountSdfRequestPart req = new AccountSdfRequestPart(); req.setAccount(account); req.setCompanyId(companyId); - req.setSdf01Id(sdf01Id); + req.setSdfId(sdf01Id); return req; } diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf16Executor.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf16Executor.java new file mode 100644 index 000000000..ba2567cda --- /dev/null +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf16Executor.java @@ -0,0 +1,191 @@ +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.SDf16; +import ru.clearing.classes.statics.data.sdf.SDf17; +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.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 Sdf16Executor 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 sDf16Validator; + private final LoggingService errorLogger; + private final Imdg sdf17Imdg; + private final ImdgProvider imdgProvider; + private final AccountBalanceService accountBalanceService; + private final IMessageResolver errorResolver; + private final Imdg accountBalanceImdg; + + public Sdf16Executor(Function sDf16Validator, + LoggingService errorLogger, + ImdgProvider imdgProvider, + AccountBalanceService accountBalanceService, + IMessageResolver errorResolver) { + this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); + this.sdf17Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf17, SDf17.class); + this.accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class);; + this.sDf16Validator = sDf16Validator; + this.errorLogger = errorLogger; + this.imdgProvider = imdgProvider; + this.accountBalanceService = accountBalanceService; + this.errorResolver = errorResolver; + } + + public Result execute(Collection sdf, StatementRequest statementRequest){ + Result result = new Result(); + Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); + result.setGenerationId(generationIdForGroup); + for (SDf16 sdfItem : sdf) { + IValidator validator = sDf16Validator.apply(sdfItem); + 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(sdfItem.getId(), sdfItem.getAccount(), company.getId())); + log.info("account {} for sdf01.id={} not found - send request for creation", sdfItem.getAccount(), sdfItem.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={}", sdfItem.getId()); + } + if (error.isPresent()) { + errorLogger.logError("sdf01.id={}", error.get(), sdfItem.getId()); + sdf17Imdg.insert(createErrorSdfRes(sdfItem, error.get(), generationIdForGroup)); + continue; + } + Statement statement = statementImdg.getSingleObjectByFieldValues(Map.of("account", sdfItem.getAccount())); + if (statement == null) { + statement = createFlow(sdfItem, + company, + validator.getStored(ValidationStored.Account)); + } else { + updateFlow(statement, sdfItem, + validator.getStored(ValidationStored.Account)); + } + SDf17 sdfNew = createSuccessSdfRes(sdfItem, generationIdForGroup); + sdf17Imdg.insert(sdfNew); + statement.setOutSDfId(sdfNew.getId()); + AccountResult accountResult = accountBalanceService.createAccountBalance(statement.getAddresseeId(), statement.getAccountId(), statement.getAmount(), statement.getCashMovementCurrencyCode()); + if (accountResult.getError() != null) { + statement.setErrorCode(accountResult.getError().getSubject().getId().toString()); + 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(SDf16 sdf, 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(sdf.getAccount()); + statement.setInOutDirection(InOutDirection.in.getKey()); +// statement.setSettlementDate(LocalDate.parse(sdf.getDat(), datFormatter)); +// statement.setAmount(BigDecimalUtil.parse(sdf.getRemainder())); + statement.setCashMovementCurrencyCode(CurrencyCode.RUB.getKey()); + statement.setOperationStatus(OperationStatus.Pending.getKey()); + statement.setInSDfId(sdf.getId()); + statement.setInOutSDfType(InOutSDfType.type1.getKey()); + statementImdg.insert(statement); + return statement; + } + + private void updateFlow(Statement statement, SDf16 sdf, Account account) { + statement.setUpdated(Instant.now()); + statement.setAccountId(account.getId()); + statement.setAccount(sdf.getAccount()); + statement.setInOutDirection(InOutDirection.in.getKey()); +// statement.setSettlementDate(LocalDate.parse(sdf.getDat(), datFormatter)); +// statement.setAmount(BigDecimalUtil.parse(sdf.getRemainder())); + statement.setCashMovementCurrencyCode(CurrencyCode.RUB.getKey()); + statementImdg.update(statement); + } + + private AccountSdfRequestPart createAccountRequestPart(Long sdfId, String account, Long companyId) { + AccountSdfRequestPart req = new AccountSdfRequestPart(); + req.setAccount(account); + req.setCompanyId(companyId); + req.setSdfId(sdfId); + return req; + } + + private SDf17 createErrorSdfRes(SDf16 sdf, EnumMessage error, Long generationIdForGroup) { + SDf17 errorSdf = new SDf17(); +// errorSdf.setCurr_code(sdf.getCurr_code()); + errorSdf.setAccount(sdf.getAccount()); +// errorSdf.setRemainder(sdf.getRemainder()); +// errorSdf.setDeal(sdf.getDeal()); +// errorSdf.setAcc_code(sdf.getAcc_code()); +// errorSdf.setDat(sdf.getDat()); + errorSdf.setMarket(sdf.getMarket()); +// errorSdf.setAcc_name(sdf.getAcc_name()); +// errorSdf.setAcc_type(sdf.getAcc_type()); +// errorSdf.setSumengage(sdf.getSumengage()); +// errorSdf.setSumunblock(sdf.getSumunblock()); +// errorSdf.setFile_type(sdf.getFile_type()); +// errorSdf.setInSDf01Id(sdf.getId()); +// String errorId = error.getSubject().getId().toString(); +// errorSdf.setResult(errorId.substring(errorId.length() - 3)); + errorSdf.setGenerationId(generationIdForGroup); + errorSdf.setGenerationTime(Instant.now()); + return errorSdf; + } + + private SDf17 createSuccessSdfRes(SDf16 sdf, Long generationIdForGroup) { + SDf17 successSdf = new SDf17(); +// successSdf.setCurr_code(sdf.getCurr_code()); + successSdf.setAccount(sdf.getAccount()); +// successSdf.setRemainder(sdf.getRemainder()); +// successSdf.setDeal(sdf.getDeal()); +// successSdf.setAcc_code(sdf.getAcc_code()); +// successSdf.setDat(sdf.getDat()); + successSdf.setMarket(sdf.getMarket()); +// successSdf.setAcc_name(sdf.getAcc_name()); +// successSdf.setAcc_type(sdf.getAcc_type()); +// successSdf.setSumengage(sdf.getSumengage()); +// successSdf.setSumunblock(sdf.getSumunblock()); +// successSdf.setFile_type(sdf.getFile_type()); +// successSdf.setInSDf01Id(sdf.getId()); + successSdf.setGenerationId(generationIdForGroup); + successSdf.setGenerationTime(Instant.now()); +// successSdf.setResult("OK!"); + return successSdf; + } +} 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 7266c1c46..ee232f632 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 @@ -12,7 +12,7 @@ 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.AccountSdf01RequestPart; +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; @@ -86,7 +86,7 @@ public class StatementService extends QueueConsumer implements InitializingBean } } - private AccountSdf01Request createAccountsRequest(Long sdf01GroupingId, List accountRequests) { + private AccountSdf01Request createAccountsRequest(Long sdf01GroupingId, List accountRequests) { AccountSdf01Request r = new AccountSdf01Request(); r.setGroupingSdf01Id(sdf01GroupingId); r.setAccounts(accountRequests); diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java index 01a4cb4b7..2e9cb13a2 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java @@ -9,13 +9,13 @@ public class AccountSdf01Request { private Long groupingSdf01Id; @JsonProperty("accounts") - List accounts; + List accounts; - public List getAccounts() { + public List getAccounts() { return accounts; } - public void setAccounts(List accounts) { + public void setAccounts(List accounts) { this.accounts = accounts; } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01RequestPart.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdfRequestPart.java similarity index 74% rename from platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01RequestPart.java rename to platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdfRequestPart.java index a48429623..ed9bd67e2 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01RequestPart.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdfRequestPart.java @@ -2,20 +2,20 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountSdf01RequestPart { +public class AccountSdfRequestPart { @JsonProperty - private Long sdf01Id; + private Long sdfId; @JsonProperty private String account; @JsonProperty private Long companyId; - public Long getSdf01Id() { - return sdf01Id; + public Long getSdfId() { + return sdfId; } - public void setSdf01Id(Long sdf01Id) { - this.sdf01Id = sdf01Id; + public void setSdfId(Long sdfId) { + this.sdfId = sdfId; } public String getAccount() {