ialbert 2022-12-08 17:06:38 +03:00
parent e65973cf90
commit 6a1951db28
11 changed files with 82 additions and 35 deletions

View file

@ -74,7 +74,8 @@ public class ValidationConfig {
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
Sdf16ValidationRule.CompanyPresent, Sdf16ValidationRule.CompanyPresent,
ExistClrnAccountValidationRule.AccountPresent, ExistClrnAccountValidationRule.AccountPresent,
MarketIsUValidationRule.instance); MarketIsUValidationRule.instance,
AccountBalanceFreeAmountEnough.instance(SDf16.class));
}; };
} }
@ -92,7 +93,7 @@ public class ValidationConfig {
Sdf09ValidationRule.CompanyPresent, Sdf09ValidationRule.CompanyPresent,
Sdf09ValidationRule.AccountPresent, Sdf09ValidationRule.AccountPresent,
MarketIsUValidationRule.instance, MarketIsUValidationRule.instance,
Sdf09ValidationRule.BalanceEnough AccountBalanceFreeAmountEnough.instance(SDf09.class)
); );
}; };
} }

View file

@ -116,7 +116,8 @@ public class Sdf16Executor extends AbstractExecutor<SDf16> {
statement.setSenderId(Sender.Prc.getId()); statement.setSenderId(Sender.Prc.getId());
statement.setCreated(Instant.now()); statement.setCreated(Instant.now());
statement.setClearingDate(LocalDate.now()); statement.setClearingDate(LocalDate.now());
statement.setStatementType(StatementType.full.getKey()); statement.setStatementType(StatementType.incr.getKey());
statement.setComment(sdf.getSpec());
statement.setAccountId(account.getId()); statement.setAccountId(account.getId());
statement.setAccount(sdf.getAccount()); statement.setAccount(sdf.getAccount());
statement.setInOutDirection(InOutDirection.in.getKey()); statement.setInOutDirection(InOutDirection.in.getKey());
@ -124,13 +125,14 @@ public class Sdf16Executor extends AbstractExecutor<SDf16> {
statement.setCashMovementCurrencyCode(CurrencyCode.RUB.getKey()); statement.setCashMovementCurrencyCode(CurrencyCode.RUB.getKey());
statement.setOperationStatus(OperationStatus.Pending.getKey()); statement.setOperationStatus(OperationStatus.Pending.getKey());
statement.setInSDfId(sdf.getId()); statement.setInSDfId(sdf.getId());
statement.setInOutSDfType(InOutSDfType.type1.getKey()); statement.setInOutSDfType(InOutSDfType.type16.getKey());
statementImdg.insert(statement); statementImdg.insert(statement);
return statement; return statement;
} }
private void updateFlow(Statement statement, SDf16 sdf, Account account) { private void updateFlow(Statement statement, SDf16 sdf, Account account) {
statement.setUpdated(Instant.now()); statement.setUpdated(Instant.now());
statement.setComment(sdf.getSpec());
statement.setAccountId(account.getId()); statement.setAccountId(account.getId());
statement.setAccount(sdf.getAccount()); statement.setAccount(sdf.getAccount());
statement.setInOutDirection(InOutDirection.in.getKey()); statement.setInOutDirection(InOutDirection.in.getKey());

View file

@ -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<T extends WithAccount & WithSum> implements IValidationRule<ImdgValidationContext<T>> {
private AccountBalanceFreeAmountEnough() {
}
public static <T1 extends WithAccount & WithSum> AccountBalanceFreeAmountEnough<T1> instance(Class<T1> clazz) {
return new AccountBalanceFreeAmountEnough<>();
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<T> context) {
T validatedObject = context.getValidatedObject();
if (validatedObject.getSum().compareTo(BigDecimal.ZERO) >= 0) {
return empty();
}
Imdg<AccountBalance> 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();
}
}

View file

@ -1,7 +1,6 @@
package ru.spcex.clearing.balance.validation; package ru.spcex.clearing.balance.validation;
import ru.clearing.classes.statics.data.account.Account; 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.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.sdf.SDf09; 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.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@ -60,27 +58,7 @@ public enum Sdf09ValidationRule implements IValidationRule<ImdgValidationContext
} }
return empty(); return empty();
} }
}, };
BalanceEnough() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<SDf09> context) {
SDf09 validatedObject = context.getValidatedObject();
if (validatedObject.getSum().compareTo(BigDecimal.ZERO) >= 0) {
return empty();
}
Imdg<AccountBalance> 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 @Override
public String ruleName() { public String ruleName() {

View file

@ -5,12 +5,12 @@ import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.sdf.SDf16; import ru.clearing.classes.statics.data.sdf.SDf16;
import ru.spcex.clearing.balance.errors.BalanceError; import ru.spcex.clearing.balance.errors.BalanceError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
public enum Sdf16ValidationRule implements IValidationRule<ImdgValidationContext<SDf16>> { public enum Sdf16ValidationRule implements IValidationRule<ImdgValidationContext<SDf16>> {
@ -20,8 +20,10 @@ public enum Sdf16ValidationRule implements IValidationRule<ImdgValidationContext
SDf16 sdf16 = context.getValidatedObject(); SDf16 sdf16 = context.getValidatedObject();
Imdg<CompanySymbols> companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); Imdg<CompanySymbols> companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(Map.of("companySymbolValue", sdf16.getInn())); CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectBySQL(
// CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(Map.of("companySymbolValue", sdf16.getInn()));//search by bic 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; Company company = null;
if (companySymbols != null) { if (companySymbols != null) {
company = companyImdg.getSingleObjectByID(companySymbols.getCompanyId()); company = companyImdg.getSingleObjectByID(companySymbols.getCompanyId());
@ -36,6 +38,6 @@ public enum Sdf16ValidationRule implements IValidationRule<ImdgValidationContext
@Override @Override
public String ruleName() { public String ruleName() {
return "Sdf01ValidationRule." + name(); return "Sdf16ValidationRule." + name();
} }
} }

View file

@ -4,6 +4,7 @@ import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithAccount; import ru.spcex.platform.classes.base.interfaces.WithAccount;
import ru.spcex.platform.classes.base.interfaces.WithMarket; import ru.spcex.platform.classes.base.interfaces.WithMarket;
import ru.spcex.platform.classes.base.interfaces.WithSum;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
@ -13,7 +14,7 @@ import java.time.Instant;
* <p> * <p>
* DB table: S_DF08 * 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 static final long serialVersionUID = ConstSerializable.serialVersionUID;
private String account; private String account;

View file

@ -4,6 +4,7 @@ import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithAccount; import ru.spcex.platform.classes.base.interfaces.WithAccount;
import ru.spcex.platform.classes.base.interfaces.WithMarket; import ru.spcex.platform.classes.base.interfaces.WithMarket;
import ru.spcex.platform.classes.base.interfaces.WithSum;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
@ -13,7 +14,7 @@ import java.time.Instant;
* <p> * <p>
* DB table: S_DF16 * 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 static final long serialVersionUID = ConstSerializable.serialVersionUID;
private String account; private String account;

View file

@ -0,0 +1,7 @@
package ru.spcex.platform.classes.base.interfaces;
import java.math.BigDecimal;
public interface WithSum {
BigDecimal getSum();
}

View file

@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum CompanySymbol implements IEnumKey { public enum CompanySymbol implements IEnumKey {
INN("INN"); INN("INN"), BIC("BIC");
private final String key; private final String key;

View file

@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum InOutSDfType implements IEnumKey { public enum InOutSDfType implements IEnumKey {
type1("0102"), type9("0910"); type1("0102"), type16("1617"), type9("0910");
private final String key; private final String key;

View file

@ -6,6 +6,7 @@ import com.hazelcast.core.IMap;
import com.hazelcast.core.IdGenerator; import com.hazelcast.core.IdGenerator;
import com.hazelcast.query.Predicate; import com.hazelcast.query.Predicate;
import com.hazelcast.query.Predicates; import com.hazelcast.query.Predicates;
import com.hazelcast.query.SqlPredicate;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
@ -99,6 +100,16 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
} }
} }
@Override
public T getSingleObjectBySQL(String paramString) {
SqlPredicate sqlPredicate = new SqlPredicate(paramString);
Set<Map.Entry<Long, T>> found = map.entrySet(sqlPredicate);
Iterator<Map.Entry<Long, T>> allFoundByCondition = found.iterator();
if (allFoundByCondition.hasNext()) {
return allFoundByCondition.next().getValue();
} else return null;
}
/** /**
* возвращает коллекцию объектов, удовлетворяющий условиям на поля * возвращает коллекцию объектов, удовлетворяющий условиям на поля
*/ */