correspondent account validation

currency exists check
This commit is contained in:
ialbert 2024-05-14 17:21:25 +03:00
parent dc4a252400
commit 5a158cec1d
13 changed files with 120 additions and 44 deletions

View file

@ -1,5 +1,10 @@
package ru.spcex.clearing.account.config.validation; package ru.spcex.clearing.account.config.validation;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.Account;
@ -22,17 +27,12 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.rule.CurrencyCodeValidationRule;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl; import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration @Configuration
public class AccountValidationConfig { public class AccountValidationConfig {
@ -49,6 +49,7 @@ public class AccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary); addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_Currency);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId", IdPresentRule.instance("companyId",
CorrespondentAccountNewRequest::getCompanyId, CorrespondentAccountNewRequest::getCompanyId,
@ -116,6 +117,7 @@ public class AccountValidationConfig {
AccountError.DictionaryNotFound, AccountError.DictionaryNotFound,
false false
), ),
CurrencyCodeValidationRule.get(AccountError.CurrencyNotFound),
new SameAccountValidationRule<>(AccountType.Corr, CorrespondentAccountNewRequest::getAccount) new SameAccountValidationRule<>(AccountType.Corr, CorrespondentAccountNewRequest::getAccount)
); );
}; };

View file

@ -25,6 +25,7 @@ public enum AccountError implements IErrorEnumId {
AccountDepoTypeRequired(5025L), AccountDepoTypeRequired(5025L),
AccountIsNotACurrency(5026L), // Счет %S не валютный AccountIsNotACurrency(5026L), // Счет %S не валютный
TradingClearingRegistryNotFound(3022L), TradingClearingRegistryNotFound(3022L),
CurrencyNotFound(1016L),
; ;
private final Long id; private final Long id;

View file

@ -1,5 +1,9 @@
package ru.spcex.clearing.account.service; package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -29,22 +33,19 @@ import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.*; import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.DepoAccountType;
import ru.spcex.platform.enumeration.Sender;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction; import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.validation.Stored;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
@Service @Service
public class AccountService extends QueueConsumer implements InitializingBean { public class AccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
@ -130,29 +131,26 @@ public class AccountService extends QueueConsumer implements InitializingBean {
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate; if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator); IValidator validator = accountNewRequestValidator.apply(userRequest.getRequestPayload());
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, (r) -> validator);
if (requestInfoUpdate != null) return requestInfoUpdate; if (requestInfoUpdate != null) return requestInfoUpdate;
CorrespondentAccountNewRequest req = userRequest.getRequestPayload(); CorrespondentAccountNewRequest req = userRequest.getRequestPayload();
String currency = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency(); Currency currency = validator.getStored(Stored.currency);
Currency currencyByCode = currencyMap.getFirstObjectByPredicate(
currencyMap.predicateBuilder().equals("currencyCode", currency)
);
Long currencyCodeId = CurrencyCode.RUB.getKey().equals(currency) ? 810 : currencyByCode.getId();
Instant now = Instant.now(); Instant now = Instant.now();
Account account = new Account(); Account account = new Account();
account.setCompanyId(req.getCompanyId()); account.setCompanyId(req.getCompanyId());
account.setAccount(req.getAccount()); account.setAccount(req.getAccount());
if (AccountType.Info.equalsByKey(req.getAccountType())) { if (AccountType.Info.equalsByKey(req.getAccountType())) {
Long infoSequenceId = informationAccountService.accountNextId(currency, currencyCodeId); Long infoSequenceId = informationAccountService.accountNextId(currency.getCurrencyCode(), currency.getId());
String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId); String accountValue = informationAccountService.generateInfoAccount(currency.getId(), infoSequenceId);
log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue); log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue);
account.setAccount(accountValue); account.setAccount(accountValue);
} }
account.setAccountType(req.getAccountType()); account.setAccountType(req.getAccountType());
account.setCurrency(currency); account.setCurrency(currency.getCurrencyCode());
if (req.getStatus() == null) { if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey()); account.setStatus(WorkflowStatus.Active.getKey());
log.trace("Status not set in request. Use default: {}", account.getStatus()); log.trace("Status not set in request. Use default: {}", account.getStatus());

View file

@ -2,9 +2,9 @@ package ru.clearing.classes.statics.data.sdf;
import java.time.Instant; import java.time.Instant;
import ru.clearing.classes.ConstSerializable; import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.statics.data.api.WithCurrency;
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.WithCurrency;
import ru.spcex.platform.classes.base.interfaces.WithFileName; import ru.spcex.platform.classes.base.interfaces.WithFileName;
import ru.spcex.platform.classes.base.interfaces.WithMarket; import ru.spcex.platform.classes.base.interfaces.WithMarket;

View file

@ -3,8 +3,8 @@ package ru.clearing.classes.statics.data.sdf;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import ru.clearing.classes.ConstSerializable; import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.statics.data.api.WithCurrency;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithCurrency;
import ru.spcex.platform.classes.base.interfaces.WithFileName; import ru.spcex.platform.classes.base.interfaces.WithFileName;
/** /**

View file

@ -2,8 +2,8 @@ package ru.clearing.classes.statics.data.sdf;
import java.time.Instant; import java.time.Instant;
import ru.clearing.classes.ConstSerializable; import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.statics.data.api.WithCurrency;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithCurrency;
/** /**
* ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС) * ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС)

View file

@ -49,7 +49,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDep
import ru.spcex.clearing.service.validation.AnltAccLoad; import ru.spcex.clearing.service.validation.AnltAccLoad;
import ru.spcex.clearing.service.validation.ClrngValidationStored; import ru.spcex.clearing.service.validation.ClrngValidationStored;
import ru.spcex.clearing.service.validation.CompanyByTradingCodeValidationRule; import ru.spcex.clearing.service.validation.CompanyByTradingCodeValidationRule;
import ru.spcex.clearing.service.validation.CurrencyCodeValidationRule;
import ru.spcex.clearing.service.validation.ExecutionDepositValidationRule; import ru.spcex.clearing.service.validation.ExecutionDepositValidationRule;
import ru.spcex.clearing.service.validation.IdentificationFundsValidationRule; import ru.spcex.clearing.service.validation.IdentificationFundsValidationRule;
import ru.spcex.clearing.service.validation.MarketIsUValidationRule; import ru.spcex.clearing.service.validation.MarketIsUValidationRule;
@ -80,6 +79,7 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.LogPrefixId; import ru.spcex.platform.imdg.validation.LogPrefixId;
import ru.spcex.platform.imdg.validation.rule.CurrencyCodeValidationRule;
import ru.spcex.platform.imdg.validation.rule.PresentById; import ru.spcex.platform.imdg.validation.rule.PresentById;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
@ -279,7 +279,7 @@ public class ValidationConfig {
Sdf57ValidationRule.CompanyDebOrCredPresent, Sdf57ValidationRule.CompanyDebOrCredPresent,
Sdf57ValidationRule.AccountDebOrCredPresent, Sdf57ValidationRule.AccountDebOrCredPresent,
Sdf57ValidationRule.AccountAndCompanyMatch, Sdf57ValidationRule.AccountAndCompanyMatch,
CurrencyCodeValidationRule.INSTANCE CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck)
); );
}; };
} }
@ -321,7 +321,7 @@ public class ValidationConfig {
Sdf01NewValidationRule.CompanyPresent, Sdf01NewValidationRule.CompanyPresent,
Sdf01NewValidationRule.AccountType, Sdf01NewValidationRule.AccountType,
Sdf01NewValidationRule.AccountPresent, Sdf01NewValidationRule.AccountPresent,
CurrencyCodeValidationRule.INSTANCE, CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck),
Sdf01NewValidationRule.DatIsCurrentDt Sdf01NewValidationRule.DatIsCurrentDt
); );
}; };
@ -365,9 +365,7 @@ public class ValidationConfig {
Sdf06NewValidationRule.Session, Sdf06NewValidationRule.Session,
Sdf06NewValidationRule.Balance, Sdf06NewValidationRule.Balance,
Sdf06NewValidationRule.TcrPresent, Sdf06NewValidationRule.TcrPresent,
CurrencyCodeValidationRule.INSTANCE CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck)
); );
}; };
} }
@ -506,6 +504,7 @@ public class ValidationConfig {
ctx.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); ctx.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
ctx.addImdg(IMDGDistributedNames.Map_Account, imdgAccount); ctx.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, imdgTradingClearingRegistryList);
return new ValidatorImpl<>(ctx, return new ValidatorImpl<>(ctx,
PaymentOutboundValidationRule.RequiredFields, PaymentOutboundValidationRule.RequiredFields,
IdPresentRule.instance("senderId", IdPresentRule.instance("senderId",

View file

@ -55,8 +55,12 @@ public class Sdf54Creator {
public SDf54 create(PaymentInstruction paymentInstruction) { public SDf54 create(PaymentInstruction paymentInstruction) {
Instant now = Instant.now(); Instant now = Instant.now();
String c_acc_cred = null; String c_acc_cred = null;
Account anltAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s'" Account anltAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and currency = '%s'"
.formatted(AccountType.Anlt.getKey(), Status.Active.getKey())); .formatted(
AccountType.Anlt.getKey(),
Status.Active.getKey(),
paymentInstruction.getCreditLeg_currencyCode()
));
// c_acc_deb = c_acc_deb == null ? paymentInstruction.getCreditLeg_account() : c_acc_deb; // c_acc_deb = c_acc_deb == null ? paymentInstruction.getCreditLeg_account() : c_acc_deb;
c_acc_cred = c_acc_cred == null ? paymentInstruction.getDebitLeg_account() : c_acc_cred; c_acc_cred = c_acc_cred == null ? paymentInstruction.getDebitLeg_account() : c_acc_cred;
@ -125,8 +129,13 @@ public class Sdf54Creator {
sDf54.setAcc_kr_1(paymentInstruction.getDebitLeg_account()); sDf54.setAcc_kr_1(paymentInstruction.getDebitLeg_account());
{ {
Account prcCorrAcc = accountImdg.getFirstObjectBySQL("companyId=%d and accountType = '%s' and status = '%s'" Account prcCorrAcc = accountImdg.getFirstObjectBySQL("companyId=%d and accountType = '%s' and status = '%s' and currency = '%s'"
.formatted(Sender.Prc.getId(), AccountType.Bank.getKey(), Status.Active.getKey())); .formatted(
Sender.Prc.getId(),
AccountType.Bank.getKey(),
Status.Active.getKey(),
paymentInstruction.getCreditLeg_currencyCode()
));
if (prcCorrAcc == null) { if (prcCorrAcc == null) {
log.warn("Account for PRC CORR not found"); log.warn("Account for PRC CORR not found");
} else { } else {

View file

@ -51,6 +51,7 @@ import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.Stored;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@ -162,7 +163,7 @@ public class Sdf06Executor {
} }
Company company = validator.getStored(ValidationStored.Sdf06Company); Company company = validator.getStored(ValidationStored.Sdf06Company);
TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr); TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr);
Currency currency = validator.getStored(ValidationStored.currency); Currency currency = validator.getStored(Stored.currency);
//проверка существует ли statement пока убрал //проверка существует ли statement пока убрал
Statement stmt = createStatementBySdf06(sDf06, Statement stmt = createStatementBySdf06(sDf06,
company.getId(), company.getId(),

View file

@ -1,13 +1,19 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
import java.math.BigDecimal;
import java.util.Objects;
import java.util.Optional;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.payment.PIClearingOutbondActionNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.payment.PIClearingOutbondActionNewRequest;
import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.clearing.service.TcrSearcher;
import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@ -15,9 +21,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.Optional;
public enum PaymentOutboundValidationRule implements IValidationRule<ImdgValidationContext<PIClearingOutbondActionNewRequest>> { public enum PaymentOutboundValidationRule implements IValidationRule<ImdgValidationContext<PIClearingOutbondActionNewRequest>> {
RequiredFields() { RequiredFields() {
@Override @Override
@ -101,8 +104,20 @@ public enum PaymentOutboundValidationRule implements IValidationRule<ImdgValidat
Account accCred = context.getStoredObject(ValidationStored.PIOutboundAccountCred); Account accCred = context.getStoredObject(ValidationStored.PIOutboundAccountCred);
Company addressee = context.getStoredObject(ValidationStored.PIOOutboundAddressee); Company addressee = context.getStoredObject(ValidationStored.PIOOutboundAddressee);
Imdg<TradingClearingRegistry> tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); Imdg<TradingClearingRegistry> tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
TradingClearingRegistry tcr = tcrImdg.getFirstObjectBySQL("moneyAccountId = '%d' and companyId = %d" Imdg<TradingClearingRegistryList> tcrListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
.formatted(accCred.getId(), addressee.getId())); Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
TcrSearcher tcrSearcher = new TcrSearcher(tcrImdg, tcrListImdg, companyImdg, accountImdg);
AnltSearcher.AnltSearch srchRes = tcrSearcher.searchByAccountId(accCred.getId(), accCred.getCurrency());
if (!srchRes.isFound()) {
return Optional.of(srchRes.getError());
}
if (srchRes.getCompany() != null) {
if (!Objects.equals(srchRes.getCompany().getId(), addressee.getId())) {
return of(ClearingError.AccountIsNotMatchedWithCompany, accCred.getId(), addressee.getId());
}
}
TradingClearingRegistry tcr = srchRes.getTcr();
if (tcr == null) { if (tcr == null) {
return of(ClearingError.RecordNotFound, "TCR"); return of(ClearingError.RecordNotFound, "TCR");
} }

View file

@ -0,0 +1,5 @@
package ru.spcex.platform.classes.base.interfaces;
public interface WithCurrency {
String currency();
}

View file

@ -9,5 +9,7 @@ public enum Stored {
*/ */
PresentById, PresentById,
AnltAccount AnltAccount,
currency
} }

View file

@ -0,0 +1,44 @@
package ru.spcex.platform.imdg.validation.rule;
import java.util.Optional;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithCurrency;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.Stored;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IErrorEnumId;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule;
public class CurrencyCodeValidationRule implements IValidationRule<ImdgValidationContext<WithCurrency>> {
public static CurrencyCodeValidationRule get(IErrorEnumId err) {
return new CurrencyCodeValidationRule(err);
}
private final IErrorEnumId errEnum;
public CurrencyCodeValidationRule(IErrorEnumId errEnum) {
this.errEnum = errEnum;
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<WithCurrency> context) {
WithCurrency obj = context.getValidatedObject();
if (TextUtil.isEmpty(obj.currency())) {
return of(errEnum, "null");
}
Imdg<SpcexObjectBase> curImdg = context.obtainMap(IMDGDistributedNames.Map_Currency, SpcexObjectBase.class);
ImdgPredicateBuilder pb = curImdg.predicateBuilder();
SpcexObjectBase currency = curImdg.getFirstObjectByPredicate(
pb.equals("currencyCode", obj.currency())
);
if (currency == null) {
return of(errEnum, obj.currency());
}
context.storeObject(Stored.currency, currency);
return empty();
}
}