correspondent account validation
currency exists check
This commit is contained in:
parent
dc4a252400
commit
5a158cec1d
13 changed files with 120 additions and 44 deletions
|
|
@ -1,5 +1,10 @@
|
|||
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.Configuration;
|
||||
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.ImdgPredicateBuilder;
|
||||
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.IEnumKey;
|
||||
import ru.spcex.platform.utils.validation.IValidator;
|
||||
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
|
||||
public class AccountValidationConfig {
|
||||
|
||||
|
|
@ -49,6 +49,7 @@ public class AccountValidationConfig {
|
|||
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
|
||||
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
|
||||
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
|
||||
addImdg.accept(IMDGDistributedNames.Map_Currency);
|
||||
return new ValidatorImpl<>(context,
|
||||
IdPresentRule.instance("companyId",
|
||||
CorrespondentAccountNewRequest::getCompanyId,
|
||||
|
|
@ -116,6 +117,7 @@ public class AccountValidationConfig {
|
|||
AccountError.DictionaryNotFound,
|
||||
false
|
||||
),
|
||||
CurrencyCodeValidationRule.get(AccountError.CurrencyNotFound),
|
||||
new SameAccountValidationRule<>(AccountType.Corr, CorrespondentAccountNewRequest::getAccount)
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ public enum AccountError implements IErrorEnumId {
|
|||
AccountDepoTypeRequired(5025L),
|
||||
AccountIsNotACurrency(5026L), // Счет %S не валютный
|
||||
TradingClearingRegistryNotFound(3022L),
|
||||
CurrencyNotFound(1016L),
|
||||
;
|
||||
|
||||
private final Long id;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
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.producer.Producer;
|
||||
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.util.security.UserRoleVerification;
|
||||
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.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.ImdgTransaction;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
import ru.spcex.platform.imdg.validation.Stored;
|
||||
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.validation.IValidator;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
@Service
|
||||
public class AccountService extends QueueConsumer implements InitializingBean {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
|
@ -130,29 +131,26 @@ public class AccountService extends QueueConsumer implements InitializingBean {
|
|||
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
|
||||
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;
|
||||
|
||||
CorrespondentAccountNewRequest req = userRequest.getRequestPayload();
|
||||
String currency = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency();
|
||||
Currency currencyByCode = currencyMap.getFirstObjectByPredicate(
|
||||
currencyMap.predicateBuilder().equals("currencyCode", currency)
|
||||
);
|
||||
Long currencyCodeId = CurrencyCode.RUB.getKey().equals(currency) ? 810 : currencyByCode.getId();
|
||||
Currency currency = validator.getStored(Stored.currency);
|
||||
|
||||
Instant now = Instant.now();
|
||||
Account account = new Account();
|
||||
account.setCompanyId(req.getCompanyId());
|
||||
account.setAccount(req.getAccount());
|
||||
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);
|
||||
account.setAccount(accountValue);
|
||||
}
|
||||
account.setAccountType(req.getAccountType());
|
||||
account.setCurrency(currency);
|
||||
account.setCurrency(currency.getCurrencyCode());
|
||||
if (req.getStatus() == null) {
|
||||
account.setStatus(WorkflowStatus.Active.getKey());
|
||||
log.trace("Status not set in request. Use default: {}", account.getStatus());
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@ package ru.clearing.classes.statics.data.sdf;
|
|||
|
||||
import java.time.Instant;
|
||||
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.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.WithMarket;
|
||||
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ package ru.clearing.classes.statics.data.sdf;
|
|||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
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.interfaces.WithCurrency;
|
||||
import ru.spcex.platform.classes.base.interfaces.WithFileName;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@ package ru.clearing.classes.statics.data.sdf;
|
|||
|
||||
import java.time.Instant;
|
||||
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.interfaces.WithCurrency;
|
||||
|
||||
/**
|
||||
* ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС)
|
||||
|
|
|
|||
|
|
@ -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.ClrngValidationStored;
|
||||
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.IdentificationFundsValidationRule;
|
||||
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.validation.ImdgValidationContext;
|
||||
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.utils.enumeration.IMessageResolver;
|
||||
import ru.spcex.platform.utils.validation.IValidator;
|
||||
|
|
@ -279,7 +279,7 @@ public class ValidationConfig {
|
|||
Sdf57ValidationRule.CompanyDebOrCredPresent,
|
||||
Sdf57ValidationRule.AccountDebOrCredPresent,
|
||||
Sdf57ValidationRule.AccountAndCompanyMatch,
|
||||
CurrencyCodeValidationRule.INSTANCE
|
||||
CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck)
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
@ -321,7 +321,7 @@ public class ValidationConfig {
|
|||
Sdf01NewValidationRule.CompanyPresent,
|
||||
Sdf01NewValidationRule.AccountType,
|
||||
Sdf01NewValidationRule.AccountPresent,
|
||||
CurrencyCodeValidationRule.INSTANCE,
|
||||
CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck),
|
||||
Sdf01NewValidationRule.DatIsCurrentDt
|
||||
);
|
||||
};
|
||||
|
|
@ -365,9 +365,7 @@ public class ValidationConfig {
|
|||
Sdf06NewValidationRule.Session,
|
||||
Sdf06NewValidationRule.Balance,
|
||||
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_Account, imdgAccount);
|
||||
ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
|
||||
ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, imdgTradingClearingRegistryList);
|
||||
return new ValidatorImpl<>(ctx,
|
||||
PaymentOutboundValidationRule.RequiredFields,
|
||||
IdPresentRule.instance("senderId",
|
||||
|
|
|
|||
|
|
@ -55,8 +55,12 @@ public class Sdf54Creator {
|
|||
public SDf54 create(PaymentInstruction paymentInstruction) {
|
||||
Instant now = Instant.now();
|
||||
String c_acc_cred = null;
|
||||
Account anltAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s'"
|
||||
.formatted(AccountType.Anlt.getKey(), Status.Active.getKey()));
|
||||
Account anltAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and currency = '%s'"
|
||||
.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_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());
|
||||
|
||||
{
|
||||
Account prcCorrAcc = accountImdg.getFirstObjectBySQL("companyId=%d and accountType = '%s' and status = '%s'"
|
||||
.formatted(Sender.Prc.getId(), AccountType.Bank.getKey(), Status.Active.getKey()));
|
||||
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(),
|
||||
paymentInstruction.getCreditLeg_currencyCode()
|
||||
));
|
||||
if (prcCorrAcc == null) {
|
||||
log.warn("Account for PRC CORR not found");
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ import ru.spcex.platform.imdg.api.ImdgId;
|
|||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
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.IMessageResolver;
|
||||
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||
|
|
@ -162,7 +163,7 @@ public class Sdf06Executor {
|
|||
}
|
||||
Company company = validator.getStored(ValidationStored.Sdf06Company);
|
||||
TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr);
|
||||
Currency currency = validator.getStored(ValidationStored.currency);
|
||||
Currency currency = validator.getStored(Stored.currency);
|
||||
//проверка существует ли statement пока убрал
|
||||
Statement stmt = createStatementBySdf06(sDf06,
|
||||
company.getId(),
|
||||
|
|
|
|||
|
|
@ -1,13 +1,19 @@
|
|||
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.LoggerFactory;
|
||||
import ru.clearing.classes.statics.data.account.Account;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
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.imdg.IMDGDistributedNames;
|
||||
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.imdg.api.Imdg;
|
||||
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.validation.IValidationRule;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Optional;
|
||||
|
||||
public enum PaymentOutboundValidationRule implements IValidationRule<ImdgValidationContext<PIClearingOutbondActionNewRequest>> {
|
||||
RequiredFields() {
|
||||
@Override
|
||||
|
|
@ -101,8 +104,20 @@ public enum PaymentOutboundValidationRule implements IValidationRule<ImdgValidat
|
|||
Account accCred = context.getStoredObject(ValidationStored.PIOutboundAccountCred);
|
||||
Company addressee = context.getStoredObject(ValidationStored.PIOOutboundAddressee);
|
||||
Imdg<TradingClearingRegistry> tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
||||
TradingClearingRegistry tcr = tcrImdg.getFirstObjectBySQL("moneyAccountId = '%d' and companyId = %d"
|
||||
.formatted(accCred.getId(), addressee.getId()));
|
||||
Imdg<TradingClearingRegistryList> tcrListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
|
||||
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) {
|
||||
return of(ClearingError.RecordNotFound, "TCR");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
package ru.spcex.platform.classes.base.interfaces;
|
||||
|
||||
public interface WithCurrency {
|
||||
String currency();
|
||||
}
|
||||
|
|
@ -9,5 +9,7 @@ public enum Stored {
|
|||
*/
|
||||
PresentById,
|
||||
|
||||
AnltAccount
|
||||
AnltAccount,
|
||||
|
||||
currency
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue