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,
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)
);
};
}

View file

@ -116,7 +116,8 @@ public class Sdf16Executor extends AbstractExecutor<SDf16> {
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<SDf16> {
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());

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;
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<ImdgValidationContext
}
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
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.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<ImdgValidationContext<SDf16>> {
@ -20,8 +20,10 @@ public enum Sdf16ValidationRule implements IValidationRule<ImdgValidationContext
SDf16 sdf16 = context.getValidatedObject();
Imdg<CompanySymbols> companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
Imdg<Company> 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<ImdgValidationContext
@Override
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.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;
* <p>
* 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;

View file

@ -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;
* <p>
* 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;

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;
public enum CompanySymbol implements IEnumKey {
INN("INN");
INN("INN"), BIC("BIC");
private final String key;

View file

@ -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;

View file

@ -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<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;
}
/**
* возвращает коллекцию объектов, удовлетворяющий условиям на поля
*/