currency: sdf06/sdf55/sdf57/identification funds/outbound payment

This commit is contained in:
ialbert 2024-05-06 14:54:41 +03:00
parent 662d083b9c
commit d636a6b0ce
12 changed files with 120 additions and 55 deletions

View file

@ -46,6 +46,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryChangeRe
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryChangeStatusExtractRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryChangeStatusExtractRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDepositActionRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDepositActionRequest;
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.CurrencyCodeValidationRule;
@ -79,7 +80,6 @@ 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.AnltAccLoad;
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;
@ -458,6 +458,7 @@ public class ValidationConfig {
context.setValidatedObject(identificationFundsRequest); context.setValidatedObject(identificationFundsRequest);
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, imdgTradingClearingRegistryList);
context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount); context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
@ -556,6 +557,7 @@ public class ValidationConfig {
ImdgValidationContext<StatementRequest> ctx = new ImdgValidationContext<>(); ImdgValidationContext<StatementRequest> ctx = new ImdgValidationContext<>();
ctx.setValidatedObject(req); ctx.setValidatedObject(req);
ctx.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); ctx.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
ctx.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
ctx.addImdg(IMDGDistributedNames.Map_SDf55, sDf55Imdg); ctx.addImdg(IMDGDistributedNames.Map_SDf55, sDf55Imdg);
ctx.addImdg(IMDGDistributedNames.Map_SDf54, sDf54Imdg); ctx.addImdg(IMDGDistributedNames.Map_SDf54, sDf54Imdg);
ctx.addImdg(IMDGDistributedNames.Map_PaymentInstruction, pmtImdg); ctx.addImdg(IMDGDistributedNames.Map_PaymentInstruction, pmtImdg);

View file

@ -685,6 +685,7 @@ public class RegistryService {
AssetOperationListRequest gatewayRequest = new AssetOperationListRequest(); AssetOperationListRequest gatewayRequest = new AssetOperationListRequest();
AssetOperationRequest req = GatewayRequestCreator.from( AssetOperationRequest req = GatewayRequestCreator.from(
dmau.getId(), dmau.getId(),
dmau.getSecuritySymbol(),
null, null,
balance, balance,
InOutDirection.in, InOutDirection.in,

View file

@ -53,9 +53,19 @@ public class TcrSearcher {
public Optional<Account> searchByTcr(Long tcrId, String currency) { public Optional<Account> searchByTcr(Long tcrId, String currency) {
TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(tcrId); TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(tcrId);
if (tcr == null || (CurrencyCode.RUB.equalsByKey(currency) && tcr.getMoneyAccountId() == null)) { if (tcr == null) {
log.warn("couldn't find account by tcr#id={}; currency {}. TCR {}", log.warn("couldn't find account by tcr#id={}; currency {}. TCR {}",
tcrId, currency, tcr != null ? "found" : "not found"); tcrId, currency, "not found");
return Optional.empty();
}
return searchByTcr(tcr, currency);
}
public Optional<Account> searchByTcr(TradingClearingRegistry tcr, String currency) {
Long tcrId = tcr.getId();
if ((CurrencyCode.RUB.equalsByKey(currency) && tcr.getMoneyAccountId() == null)) {
log.warn("couldn't find account by tcr#id={}; currency {}. TCR#id={}",
tcrId, currency, tcr.getId());
return Optional.empty(); return Optional.empty();
} }
if (CurrencyCode.RUB.equalsByKey(currency)) { if (CurrencyCode.RUB.equalsByKey(currency)) {

View file

@ -34,6 +34,7 @@ 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.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.time.TimeUtil;
public class PaymentInstructionBuilderV2 { public class PaymentInstructionBuilderV2 {
@ -189,12 +190,12 @@ public class PaymentInstructionBuilderV2 {
} }
payment.setDebit_csAccount(null); payment.setDebit_csAccount(null);
if (currency != null) { if (TextUtil.isEmpty(currency)) {
payment.setCreditLeg_currencyCode(currency);
payment.setDebitLeg_currencyCode(currency);
} else {
payment.setCreditLeg_currencyCode(CurrencyCode.RUB.getKey()); payment.setCreditLeg_currencyCode(CurrencyCode.RUB.getKey());
payment.setDebitLeg_currencyCode(CurrencyCode.RUB.getKey()); payment.setDebitLeg_currencyCode(CurrencyCode.RUB.getKey());
} else {
payment.setCreditLeg_currencyCode(currency);
payment.setDebitLeg_currencyCode(currency);
} }
payment.setTransactionStatus(TransactionStatus.stld.getKey()); payment.setTransactionStatus(TransactionStatus.stld.getKey());
payment.setDocumentNumber(nextDocumentNumber(registry, payment)); payment.setDocumentNumber(nextDocumentNumber(registry, payment));

View file

@ -138,6 +138,7 @@ public class Sdf06Executor {
for (SDf06 sDf06 : sdfs) { for (SDf06 sDf06 : sdfs) {
IValidator validator = sDf06Validator.apply(sDf06); IValidator validator = sDf06Validator.apply(sDf06);
Optional<EnumMessage> err = validator.tillFirstError(); Optional<EnumMessage> err = validator.tillFirstError();
Account account = validator.getStored(ValidationStored.Sdf06Account);
if (err.isPresent()) { if (err.isPresent()) {
log.debug("sdf06.id={} validation error: {}", sDf06.getId(), messageResolver.resolve(err.get())); log.debug("sdf06.id={} validation error: {}", sDf06.getId(), messageResolver.resolve(err.get()));
SDf07 errorSdf07; SDf07 errorSdf07;
@ -146,7 +147,7 @@ public class Sdf06Executor {
if (needToCreateStatement(err.get())) { if (needToCreateStatement(err.get())) {
stmt = createStatementBySdf06(sDf06, stmt = createStatementBySdf06(sDf06,
((Company) validator.getStored(ValidationStored.Sdf06Company)).getId(), ((Company) validator.getStored(ValidationStored.Sdf06Company)).getId(),
validator.getStored(ValidationStored.Sdf06Account), null); account, null);
} }
errorSdf07 = createSdf07(sDf06, now, errorResult); errorSdf07 = createSdf07(sDf06, now, errorResult);
errorSdf07.setGenerationId(sdf07GroupId); errorSdf07.setGenerationId(sdf07GroupId);
@ -165,7 +166,7 @@ public class Sdf06Executor {
//проверка существует ли statement пока убрал //проверка существует ли statement пока убрал
Statement stmt = createStatementBySdf06(sDf06, Statement stmt = createStatementBySdf06(sDf06,
company.getId(), company.getId(),
validator.getStored(ValidationStored.Sdf06Account), account,
currency.getId()); currency.getId());
statementImdg.insert(stmt); statementImdg.insert(stmt);
log.debug("Statement created: {}", stmt.getId()); log.debug("Statement created: {}", stmt.getId());
@ -179,7 +180,7 @@ public class Sdf06Executor {
sDf06.getPay_val(), sDf06.getPay_val(),
safeBD(sDf06.getSum()), safeBD(sDf06.getSum()),
sDf06.getNumber().toString()); sDf06.getNumber().toString());
Optional<AssetTrio> asts = assets.searchMoneyByAccAndCompany(company.getId(), tcr.getMoneyAccountId()); Optional<AssetTrio> asts = assets.searchMoneyByAccAndCompany(company.getId(), account.getId());
asts.ifPresent(ast -> assets.process(ast.a__b(), ast.a__t(), ast.a__f(), BigDecimal.ZERO)); asts.ifPresent(ast -> assets.process(ast.a__b(), ast.a__t(), ast.a__f(), BigDecimal.ZERO));
} }
sdf07WasCreated = true; sdf07WasCreated = true;

View file

@ -413,6 +413,14 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
return Optional.empty(); return Optional.empty();
} }
}; };
Function<Statement, String> findCurr = (stmt) -> {
Currency currency = currencyImdg.getSingleObjectByID(stmt.getSecurityId());
if (currency == null) {
log.warn("failed to find currency for statement.id={} securityId={}", stmt.getId(), stmt.getSecurityId());
return CurrencyCode.RUB.getKey();
}
return currency.getCurrencyCode();
};
Consumer<StmtCmpAcc> registersUpdate = stmtCmpAcc -> { Consumer<StmtCmpAcc> registersUpdate = stmtCmpAcc -> {
Statement stmt = stmtCmpAcc.statement(); Statement stmt = stmtCmpAcc.statement();
Company cmp = stmtCmpAcc.company(); Company cmp = stmtCmpAcc.company();
@ -429,7 +437,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
asts = createRegistryIfNeeded.apply(new StmtCmpAcc(stmt, searchResult.getCompany(), searchResult.getAccount())); asts = createRegistryIfNeeded.apply(new StmtCmpAcc(stmt, searchResult.getCompany(), searchResult.getAccount()));
if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) { if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) {
Optional<BigDecimal> dmiBalance = dmiService.setOk(searchResult.getTcr().getId(), Optional<BigDecimal> dmiBalance = dmiService.setOk(searchResult.getTcr().getId(),
CurrencyCode.RUB.getKey(), findCurr.apply(stmt),
sdf57.getDbfId().toString()); sdf57.getDbfId().toString());
asts.ifPresent(trio -> { asts.ifPresent(trio -> {
if (dmiBalance.isPresent() && sessionIsPresent) { if (dmiBalance.isPresent() && sessionIsPresent) {
@ -473,7 +481,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
} else if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) { } else if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) {
if (asts.isPresent()) { if (asts.isPresent()) {
Optional<BigDecimal> dmiBalance = dmiService.setOk(asts.get().a__t().getTradingClearingRegistryId(), Optional<BigDecimal> dmiBalance = dmiService.setOk(asts.get().a__t().getTradingClearingRegistryId(),
CurrencyCode.RUB.getKey(), findCurr.apply(stmt),
sdf57.getDbfId().toString()); sdf57.getDbfId().toString());
asts.ifPresent(trio -> { asts.ifPresent(trio -> {
if (dmiBalance.isPresent() && sessionIsPresent) { if (dmiBalance.isPresent() && sessionIsPresent) {

View file

@ -8,6 +8,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRe
import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.InOutDirection; import ru.spcex.platform.enumeration.InOutDirection;
import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.number.BigDecimalUtil;
import ru.spcex.platform.utils.text.TextUtil;
public class GatewayRequestCreator { public class GatewayRequestCreator {
public static AssetOperationRequest from(Statement stmt, public static AssetOperationRequest from(Statement stmt,
@ -30,6 +31,7 @@ public class GatewayRequestCreator {
public static AssetOperationRequest from(Registry rgs, InOutDirection dir) { public static AssetOperationRequest from(Registry rgs, InOutDirection dir) {
return from(rgs.getId(), return from(rgs.getId(),
rgs.getSecuritySymbol(),
null, null,
BigDecimalUtil.safeBD(rgs.getBalance()).abs(), BigDecimalUtil.safeBD(rgs.getBalance()).abs(),
dir, dir,
@ -39,6 +41,7 @@ public class GatewayRequestCreator {
public static AssetOperationRequest from(PaymentInstruction pmt, String tradingCode, String tcr) { public static AssetOperationRequest from(PaymentInstruction pmt, String tradingCode, String tcr) {
return from(pmt.getId(), return from(pmt.getId(),
pmt.getCreditLeg_currencyCode(),
null, null,
pmt.getCreditLeg_amount(), pmt.getCreditLeg_amount(),
InOutDirection.out, InOutDirection.out,
@ -52,11 +55,22 @@ public class GatewayRequestCreator {
InOutDirection direction, InOutDirection direction,
String tradingCode, String tradingCode,
String tcrCode) { String tcrCode) {
return from(entityId, (String) null, sessionId, amount, direction, tradingCode, tcrCode);
}
public static AssetOperationRequest from(Long entityId,
String currency,
Long sessionId,
BigDecimal amount,
InOutDirection direction,
String tradingCode,
String tcrCode) {
if (TextUtil.isEmpty(currency)) currency = CurrencyCode.RUB.getKey();
AssetOperationRequest req = new AssetOperationRequest(); AssetOperationRequest req = new AssetOperationRequest();
req.setSessionId(sessionId); req.setSessionId(sessionId);
req.setEntityId(entityId); req.setEntityId(entityId);
req.setAmount(amount); req.setAmount(amount);
req.setSecuritySymbol(CurrencyCode.RUB.getKey()); //fixme retrieve security symbol from validator req.setSecuritySymbol(currency);
req.setTradingCode(tradingCode); req.setTradingCode(tradingCode);
req.setCode(tcrCode); req.setCode(tcrCode);
req.setDirection(direction.getKey()); req.setDirection(direction.getKey());

View file

@ -1,5 +1,10 @@
package ru.spcex.clearing.service.payment; package ru.spcex.clearing.service.payment;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -33,24 +38,21 @@ import ru.spcex.clearing.service.registry.RegistryManager;
import ru.spcex.clearing.service.schedule.TradingTimeService; import ru.spcex.clearing.service.schedule.TradingTimeService;
import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.clearing.session.stage.impl.GatewayRequester; import ru.spcex.clearing.session.stage.impl.GatewayRequester;
import static ru.spcex.clearing.session.stage.impl.GatewayRequester.mapError;
import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.enumeration.*; import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.TransactionStatus;
import ru.spcex.platform.enumeration.UserRole;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId; 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.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumId; import ru.spcex.platform.utils.enumeration.IEnumId;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
import static ru.spcex.clearing.session.stage.impl.GatewayRequester.mapError;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import ru.spcex.platform.utils.validation.IValidator;
@Service @Service
public class PaymentInstructionOutboundService { public class PaymentInstructionOutboundService {
@ -142,6 +144,7 @@ public class PaymentInstructionOutboundService {
.amount(amount) .amount(amount)
.sessionId(null) .sessionId(null)
.purpose(purpose) .purpose(purpose)
.currency(accCred.getCurrency())
.build(); .build();
BankAccount bnkAcc = bnkAccImdg.getFirstObjectBySQL("accountId = %d".formatted(accDeb.getId())); BankAccount bnkAcc = bnkAccImdg.getFirstObjectBySQL("accountId = %d".formatted(accDeb.getId()));
if (bnkAcc != null) { if (bnkAcc != null) {

View file

@ -1,5 +1,12 @@
package ru.spcex.clearing.service.registry; package ru.spcex.clearing.service.registry;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -10,38 +17,37 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.AssetTrio;
import ru.spcex.clearing.session.stage.util.RegistryUtil; import ru.spcex.clearing.session.stage.util.RegistryUtil;
import ru.spcex.platform.enumeration.*; import ru.spcex.platform.enumeration.BalanceDimension;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
import ru.spcex.platform.enumeration.RegistryUnit;
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.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.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Service @Service
public class AssetTBFProcessing { public class AssetTBFProcessing {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Registry> rgsImdg; private final Imdg<Registry> rgsImdg;
private final Imdg<Account> accImdg;
private final RegistryManager rgsMng; private final RegistryManager rgsMng;
@Autowired @Autowired
public AssetTBFProcessing(ImdgProvider imdgProvider, RegistryManager rgsMng) { public AssetTBFProcessing(ImdgProvider imdgProvider, RegistryManager rgsMng) {
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.accImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.rgsMng = rgsMng; this.rgsMng = rgsMng;
} }
public AssetTBFProcessing(Imdg<Registry> rgsImdg) { public AssetTBFProcessing(Imdg<Registry> rgsImdg, Imdg<Account> accImdg) {
this.rgsImdg = rgsImdg; this.rgsImdg = rgsImdg;
this.accImdg = accImdg;
this.rgsMng = new RegistryManager(rgsImdg); this.rgsMng = new RegistryManager(rgsImdg);
} }
@ -271,12 +277,17 @@ public class AssetTBFProcessing {
} }
public Optional<AssetTrio> searchMoneyByAccAndCompany(Long companyId, Long accountId) { public Optional<AssetTrio> searchMoneyByAccAndCompany(Long companyId, Long accountId) {
Account account = accImdg.getSingleObjectByID(accountId);
if (account == null) {
log.error("company.id={}, account.id={} - account not found", companyId, accountId);
return Optional.empty();
}
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
Function<RegistryTradingParams, ImdgPredicate> prdct = rgsCode -> pb.and( Function<RegistryTradingParams, ImdgPredicate> prdct = rgsCode -> pb.and(
pb.sql(RegistryCodeSqlBuilder.getInstance(rgsCode).build()), pb.sql(RegistryCodeSqlBuilder.getInstance(rgsCode).build()),
pb.equals("companyId", companyId), pb.equals("companyId", companyId),
pb.equals("accountId", accountId), pb.equals("accountId", accountId),
pb.equals("securitySymbol", CurrencyCode.RUB.getKey()) pb.equals("securitySymbol", account.getCurrency())
); );
Registry amf = rgsImdg.getFirstObjectByPredicate(prdct.apply(AM_F)); Registry amf = rgsImdg.getFirstObjectByPredicate(prdct.apply(AM_F));
Registry amb = rgsImdg.getFirstObjectByPredicate(prdct.apply(AM_B)); Registry amb = rgsImdg.getFirstObjectByPredicate(prdct.apply(AM_B));

View file

@ -1,5 +1,7 @@
package ru.spcex.platform.imdg.validation.rule; package ru.spcex.clearing.service.validation;
import java.util.Optional;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.AccountType;
@ -13,8 +15,6 @@ import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IErrorEnumId; import ru.spcex.platform.utils.enumeration.IErrorEnumId;
import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Optional;
/** /**
* В рексевте необходим интерфейс WithId * В рексевте необходим интерфейс WithId
*/ */
@ -27,11 +27,14 @@ public class AnltAccLoad implements IValidationRule<ImdgValidationContext<Object
@Override @Override
public Optional<EnumMessage> validate(ImdgValidationContext<Object> context) { public Optional<EnumMessage> validate(ImdgValidationContext<Object> context) {
//если захотим где-то еще использовать, нужно сделать Registry implements WithCurrency
Registry rgs = context.getStoredObject(Stored.PresentById);
Imdg<SpcexObjectBase> accImdg = context.obtainMap(IMDGDistributedNames.Map_Account, SpcexObjectBase.class); Imdg<SpcexObjectBase> accImdg = context.obtainMap(IMDGDistributedNames.Map_Account, SpcexObjectBase.class);
ImdgPredicateBuilder pb = accImdg.predicateBuilder(); ImdgPredicateBuilder pb = accImdg.predicateBuilder();
ImdgPredicate prdct = pb.and( ImdgPredicate prdct = pb.and(
pb.equals("companyId", Sender.One.getId()), pb.equals("companyId", Sender.One.getId()),
pb.equals("accountType", AccountType.Anlt.getKey()) pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("currency", rgs.getSecuritySymbol())
); );
Object anltAcc = accImdg.getSingleObjectByPredicate(prdct); Object anltAcc = accImdg.getSingleObjectByPredicate(prdct);
if (anltAcc == null) { if (anltAcc == null) {

View file

@ -1,17 +1,22 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
import java.math.BigDecimal;
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.Registry; import ru.clearing.classes.statics.data.registry.Registry;
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.registry.IdentificationFundsRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.IdentificationFundsRequest;
import ru.spcex.clearing.service.AnltSearcher; import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.AssetTrio;
import ru.spcex.clearing.service.TcrSearcher;
import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode;
import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.enumeration.ServiceStatus;
@ -21,13 +26,8 @@ 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.imdg.validation.Stored;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal;
import java.util.Optional;
import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import ru.spcex.platform.utils.validation.IValidationRule;
public enum IdentificationFundsValidationRule implements IValidationRule<ImdgValidationContext<IdentificationFundsRequest>> { public enum IdentificationFundsValidationRule implements IValidationRule<ImdgValidationContext<IdentificationFundsRequest>> {
Fields() { Fields() {
@ -77,9 +77,14 @@ public enum IdentificationFundsValidationRule implements IValidationRule<ImdgVal
TcrCheck() { TcrCheck() {
@Override @Override
public Optional<EnumMessage> validate(ImdgValidationContext<IdentificationFundsRequest> context) { public Optional<EnumMessage> validate(ImdgValidationContext<IdentificationFundsRequest> context) {
Registry rgs = context.getStoredObject(Stored.PresentById);
IdentificationFundsRequest validatedObject = context.getValidatedObject(); IdentificationFundsRequest validatedObject = context.getValidatedObject();
Imdg<TradingClearingRegistry> tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); Imdg<TradingClearingRegistry> tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
Imdg<TradingClearingRegistryList> tcrListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
Imdg<Account> accImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Imdg<Company> cmpImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(validatedObject.getTradingClearingRegistryId()); TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(validatedObject.getTradingClearingRegistryId());
if (tcr == null) { if (tcr == null) {
return of(ClearingError.TCRegistryNotFound, validatedObject.getTradingClearingRegistryId()); return of(ClearingError.TCRegistryNotFound, validatedObject.getTradingClearingRegistryId());
@ -92,16 +97,20 @@ public enum IdentificationFundsValidationRule implements IValidationRule<ImdgVal
return of(ClearingError.AccountNotFoundB, "null"); //mb other error return of(ClearingError.AccountNotFoundB, "null"); //mb other error
} }
Imdg<Account> accImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); TcrSearcher tcrSearcher = new TcrSearcher(tcrImdg,
Account acc = accImdg.getSingleObjectByID(tcr.getMoneyAccountId()); tcrListImdg,
if (acc == null) { cmpImdg,
return of(ClearingError.AccountNotFoundB, tcr.getMoneyAccountId()); accImdg);
Optional<Account> accF = tcrSearcher.searchByTcr(tcr.getId(), rgs.getSecuritySymbol());
if (accF.isEmpty()) {
return of(ClearingError.AccountNotFoundB, "<by TCR.id=%d for currency %s>"
.formatted(tcr.getId(), rgs.getSecuritySymbol()));
} }
Account acc = accF.get();
if (!AccountType.Info.equalsByKey(acc.getAccountType())) { if (!AccountType.Info.equalsByKey(acc.getAccountType())) {
return of(ClearingError.AccountWrongType, acc.getAccountType()); return of(ClearingError.AccountWrongType, acc.getAccountType());
} }
Imdg<Company> cmpImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Company company = cmpImdg.getSingleObjectByID(tcr.getCompanyId()); Company company = cmpImdg.getSingleObjectByID(tcr.getCompanyId());
if (company == null) { if (company == null) {
return of(ClearingError.CompanyNotFoundB, tcr.getCompanyId()); return of(ClearingError.CompanyNotFoundB, tcr.getCompanyId());
@ -120,7 +129,8 @@ public enum IdentificationFundsValidationRule implements IValidationRule<ImdgVal
return of(ClearingError.RecordNotFound, "AM*T"); return of(ClearingError.RecordNotFound, "AM*T");
} }
Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
AssetTBFProcessing assets = new AssetTBFProcessing(rgsImdg); Imdg<Account> accImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
AssetTBFProcessing assets = new AssetTBFProcessing(rgsImdg, accImdg);
Optional<AssetTrio> assetTrio = assets.searchMoneyByAccAndCompany(tcrSearch.getCompany().getId(), tcrSearch.getAccount().getId()); Optional<AssetTrio> assetTrio = assets.searchMoneyByAccAndCompany(tcrSearch.getCompany().getId(), tcrSearch.getAccount().getId());
if (assetTrio.isEmpty()) { if (assetTrio.isEmpty()) {
return of(ClearingError.RecordNotFound, "AM*T"); return of(ClearingError.RecordNotFound, "AM*T");

View file

@ -1,7 +1,9 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
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.payment.PaymentInstruction; import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
@ -17,8 +19,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.util.Optional;
public enum Sdf55ValidationRule implements IValidationRule<ImdgValidationContext<StatementRequest>> { public enum Sdf55ValidationRule implements IValidationRule<ImdgValidationContext<StatementRequest>> {
Fields() { Fields() {
@Override @Override
@ -96,11 +96,12 @@ public enum Sdf55ValidationRule implements IValidationRule<ImdgValidationContext
@Override @Override
public Optional<EnumMessage> validate(ImdgValidationContext<StatementRequest> context) { public Optional<EnumMessage> validate(ImdgValidationContext<StatementRequest> context) {
Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
Imdg<Account> accImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
PaymentInstruction pmt = context.getStoredObject(ValidationStored.Sdf55PaymentInstruction); PaymentInstruction pmt = context.getStoredObject(ValidationStored.Sdf55PaymentInstruction);
Long accCredId = pmt.getCreditLeg_accountId(); Long accCredId = pmt.getCreditLeg_accountId();
Long addresseeId = pmt.getSenderId(); Long addresseeId = pmt.getSenderId();
AssetTBFProcessing assets = new AssetTBFProcessing(rgsImdg); AssetTBFProcessing assets = new AssetTBFProcessing(rgsImdg, accImdg);
Optional<AssetTrio> assetTrio = assets.searchMoneyByAccAndCompany(addresseeId, accCredId); Optional<AssetTrio> assetTrio = assets.searchMoneyByAccAndCompany(addresseeId, accCredId);
if (assetTrio.isEmpty()) { if (assetTrio.isEmpty()) {
return of(ClearingError.RecordNotFound, "AM*F/AM*B/AM*T"); return of(ClearingError.RecordNotFound, "AM*F/AM*B/AM*T");