From 6a1951db28133db727a61cecfaae8d5d1a2707ca Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 8 Dec 2022 17:06:38 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-69 --- .../balance/config/ValidationConfig.java | 5 ++- .../balance/service/Sdf16Executor.java | 6 ++- .../AccountBalanceFreeAmountEnough.java | 44 +++++++++++++++++++ .../validation/Sdf09ValidationRule.java | 24 +--------- .../validation/Sdf16ValidationRule.java | 10 +++-- .../classes/statics/data/sdf/SDf09.java | 3 +- .../classes/statics/data/sdf/SDf16.java | 3 +- .../classes/base/interfaces/WithSum.java | 7 +++ .../platform/enumeration/CompanySymbol.java | 2 +- .../platform/enumeration/InOutSDfType.java | 2 +- .../iml/hazelcast/adapter/ImdgHazelcast.java | 11 +++++ 11 files changed, 82 insertions(+), 35 deletions(-) create mode 100644 clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceFreeAmountEnough.java create mode 100644 platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSum.java 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 452c07053..161f536ca 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 @@ -74,7 +74,8 @@ public class ValidationConfig { return new ValidatorImpl<>(context, Sdf16ValidationRule.CompanyPresent, ExistClrnAccountValidationRule.AccountPresent, - MarketIsUValidationRule.instance); + MarketIsUValidationRule.instance, + AccountBalanceFreeAmountEnough.instance(SDf16.class)); }; } @@ -92,7 +93,7 @@ public class ValidationConfig { Sdf09ValidationRule.CompanyPresent, Sdf09ValidationRule.AccountPresent, MarketIsUValidationRule.instance, - Sdf09ValidationRule.BalanceEnough + AccountBalanceFreeAmountEnough.instance(SDf09.class) ); }; } 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 index eb4989deb..6a85cfd37 100644 --- 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 @@ -116,7 +116,8 @@ public class Sdf16Executor extends AbstractExecutor { statement.setSenderId(Sender.Prc.getId()); statement.setCreated(Instant.now()); statement.setClearingDate(LocalDate.now()); - statement.setStatementType(StatementType.full.getKey()); + statement.setStatementType(StatementType.incr.getKey()); + statement.setComment(sdf.getSpec()); statement.setAccountId(account.getId()); statement.setAccount(sdf.getAccount()); statement.setInOutDirection(InOutDirection.in.getKey()); @@ -124,13 +125,14 @@ public class Sdf16Executor extends AbstractExecutor { statement.setCashMovementCurrencyCode(CurrencyCode.RUB.getKey()); statement.setOperationStatus(OperationStatus.Pending.getKey()); statement.setInSDfId(sdf.getId()); - statement.setInOutSDfType(InOutSDfType.type1.getKey()); + statement.setInOutSDfType(InOutSDfType.type16.getKey()); statementImdg.insert(statement); return statement; } private void updateFlow(Statement statement, SDf16 sdf, Account account) { statement.setUpdated(Instant.now()); + statement.setComment(sdf.getSpec()); statement.setAccountId(account.getId()); statement.setAccount(sdf.getAccount()); statement.setInOutDirection(InOutDirection.in.getKey()); diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceFreeAmountEnough.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceFreeAmountEnough.java new file mode 100644 index 000000000..ec4597943 --- /dev/null +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceFreeAmountEnough.java @@ -0,0 +1,44 @@ +package ru.spcex.clearing.balance.validation; + +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.spcex.clearing.balance.errors.BalanceError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.classes.base.interfaces.WithAccount; +import ru.spcex.platform.classes.base.interfaces.WithSum; +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.math.BigDecimal; +import java.util.Map; +import java.util.Optional; + +public class AccountBalanceFreeAmountEnough implements IValidationRule> { + + private AccountBalanceFreeAmountEnough() { + } + + public static AccountBalanceFreeAmountEnough instance(Class clazz) { + return new AccountBalanceFreeAmountEnough<>(); + } + + @Override + public Optional validate(ImdgValidationContext context) { + T validatedObject = context.getValidatedObject(); + if (validatedObject.getSum().compareTo(BigDecimal.ZERO) >= 0) { + return empty(); + } + Imdg balanceImdg = context.obtainMap(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); + AccountBalance balance = balanceImdg.getSingleObjectByFieldValues(Map.of("account", validatedObject.getAccount(), + "accountType", AccountType.Clrn.getKey())); + if (balance == null) { + return of(BalanceError.BalanceNotEnough); + } + if (balance.getFreeBalanceAmount().compareTo(validatedObject.getSum()) < 0) { + return of(BalanceError.BalanceNotEnough); + } + return empty(); + } +} diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java index 6f2590a8e..5daf7d4a6 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java @@ -1,7 +1,6 @@ package ru.spcex.clearing.balance.validation; 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.SDf09; @@ -14,7 +13,6 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; -import java.math.BigDecimal; import java.util.Map; import java.util.Optional; @@ -60,27 +58,7 @@ public enum Sdf09ValidationRule implements IValidationRule validate(ImdgValidationContext context) { - SDf09 validatedObject = context.getValidatedObject(); - if (validatedObject.getSum().compareTo(BigDecimal.ZERO) >= 0) { - return empty(); - } - Imdg balanceImdg = context.obtainMap(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); - AccountBalance balance = balanceImdg.getSingleObjectByFieldValues(Map.of("account", validatedObject.getAccount(), - "accountType", AccountType.Clrn.getKey())); - if (balance == null) { - return of(BalanceError.BalanceNotEnough); - } - if (balance.getFreeBalanceAmount().compareTo(validatedObject.getSum()) < 0) { - return of(BalanceError.BalanceNotEnough); - } - return empty(); - } - } - ; + }; @Override public String ruleName() { diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java index 43cb3cd49..69bdeb806 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java @@ -5,12 +5,12 @@ import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.sdf.SDf16; import ru.spcex.clearing.balance.errors.BalanceError; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; 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.util.Map; import java.util.Optional; public enum Sdf16ValidationRule implements IValidationRule> { @@ -20,8 +20,10 @@ public enum Sdf16ValidationRule implements IValidationRule companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); - CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(Map.of("companySymbolValue", sdf16.getInn())); -// CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(Map.of("companySymbolValue", sdf16.getInn()));//search by bic + CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectBySQL( + String.format("(companySymbolValue = '%s' and companySymbol = '%s') " + + "or (companySymbolValue = '%s' and companySymbol = '%s')", + sdf16.getInn(), CompanySymbol.INN.getKey(), sdf16.getBic(), CompanySymbol.BIC.getKey())); Company company = null; if (companySymbols != null) { company = companyImdg.getSingleObjectByID(companySymbols.getCompanyId()); @@ -36,6 +38,6 @@ public enum Sdf16ValidationRule implements IValidationRule * DB table: S_DF08 **/ -public class SDf09 extends SpcexObjectBase implements WithAccount, WithMarket { +public class SDf09 extends SpcexObjectBase implements WithAccount, WithMarket, WithSum { private static final long serialVersionUID = ConstSerializable.serialVersionUID; private String account; diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf16.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf16.java index dce51b3db..2072f0cb0 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf16.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf16.java @@ -4,6 +4,7 @@ import ru.clearing.classes.ConstSerializable; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.interfaces.WithAccount; import ru.spcex.platform.classes.base.interfaces.WithMarket; +import ru.spcex.platform.classes.base.interfaces.WithSum; import java.math.BigDecimal; import java.time.Instant; @@ -13,7 +14,7 @@ import java.time.Instant; *

* DB table: S_DF16 **/ -public class SDf16 extends SpcexObjectBase implements WithAccount, WithMarket { +public class SDf16 extends SpcexObjectBase implements WithAccount, WithMarket, WithSum { private static final long serialVersionUID = ConstSerializable.serialVersionUID; private String account; diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSum.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSum.java new file mode 100644 index 000000000..5e1772969 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSum.java @@ -0,0 +1,7 @@ +package ru.spcex.platform.classes.base.interfaces; + +import java.math.BigDecimal; + +public interface WithSum { + BigDecimal getSum(); +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CompanySymbol.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CompanySymbol.java index efe0ea3c3..33170c8d0 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CompanySymbol.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CompanySymbol.java @@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum CompanySymbol implements IEnumKey { - INN("INN"); + INN("INN"), BIC("BIC"); private final String key; diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java index 62617520e..496c5befb 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java @@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum InOutSDfType implements IEnumKey { - type1("0102"), type9("0910"); + type1("0102"), type16("1617"), type9("0910"); private final String key; diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java index 940adedcb..0db5e0b28 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java @@ -6,6 +6,7 @@ import com.hazelcast.core.IMap; import com.hazelcast.core.IdGenerator; import com.hazelcast.query.Predicate; import com.hazelcast.query.Predicates; +import com.hazelcast.query.SqlPredicate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -99,6 +100,16 @@ public class ImdgHazelcast implements Imdg { } } + @Override + public T getSingleObjectBySQL(String paramString) { + SqlPredicate sqlPredicate = new SqlPredicate(paramString); + Set> found = map.entrySet(sqlPredicate); + Iterator> allFoundByCondition = found.iterator(); + if (allFoundByCondition.hasNext()) { + return allFoundByCondition.next().getValue(); + } else return null; + } + /** * возвращает коллекцию объектов, удовлетворяющий условиям на поля */