ANLT & TCR search

This commit is contained in:
ialbert 2024-04-22 17:10:41 +03:00
parent e58a19a511
commit e8fda5a8f8
8 changed files with 252 additions and 68 deletions

View file

@ -21,6 +21,7 @@ import ru.clearing.classes.statics.data.misc.Session;
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;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.clearing.classes.statics.data.sdf.SDf01; import ru.clearing.classes.statics.data.sdf.SDf01;
import ru.clearing.classes.statics.data.sdf.SDf06; import ru.clearing.classes.statics.data.sdf.SDf06;
import ru.clearing.classes.statics.data.sdf.SDf08; import ru.clearing.classes.statics.data.sdf.SDf08;
@ -103,6 +104,7 @@ public class ValidationConfig {
Imdg<Security> imdgSecurity; Imdg<Security> imdgSecurity;
Imdg<MoneyMarketSecurity> imdgMoneyMarketSecurity; Imdg<MoneyMarketSecurity> imdgMoneyMarketSecurity;
Imdg<TradingClearingRegistry> imdgTradingClearingRegistry; Imdg<TradingClearingRegistry> imdgTradingClearingRegistry;
Imdg<TradingClearingRegistryList> imdgTradingClearingRegistryList;
Imdg<Session> imdgSession; Imdg<Session> imdgSession;
Imdg<SectionDictionary> imdgSectionDictionary; Imdg<SectionDictionary> imdgSectionDictionary;
Imdg<Statement> imdgStatement; Imdg<Statement> imdgStatement;
@ -124,6 +126,8 @@ public class ValidationConfig {
this.imdgAccountBalance = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); this.imdgAccountBalance = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class);
this.imdgSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class); this.imdgSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class);
this.imdgTradingClearingRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.imdgTradingClearingRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.imdgTradingClearingRegistryList
= imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
this.imdgSession = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.imdgSession = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.imdgSectionDictionary = imdgProvider.getImdg(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class); this.imdgSectionDictionary = imdgProvider.getImdg(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class);
this.imdgMoneyMarketSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); this.imdgMoneyMarketSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
@ -350,6 +354,7 @@ public class ValidationConfig {
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
context.addImdg(IMDGDistributedNames.Map_Session, imdgSession); context.addImdg(IMDGDistributedNames.Map_Session, imdgSession);
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, imdgTradingClearingRegistryList);
context.addImdg(IMDGDistributedNames.Map_Currency, imdgCurrency); context.addImdg(IMDGDistributedNames.Map_Currency, imdgCurrency);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,

View file

@ -1,5 +1,7 @@
package ru.spcex.clearing.service; package ru.spcex.clearing.service;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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;
@ -7,9 +9,11 @@ import org.springframework.stereotype.Component;
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.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.enumeration.ServiceStatus;
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;
@ -19,25 +23,25 @@ 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.text.TextUtil; import ru.spcex.platform.utils.text.TextUtil;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Component @Component
public class AnltSearcher { public class AnltSearcher {
private Logger log = LoggerFactory.getLogger(getClass()); private Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg; private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Company> companyImdg; private final Imdg<Company> companyImdg;
private final Imdg<Account> accountImdg; private final Imdg<Account> accountImdg;
private Imdg<TradingClearingRegistryList> tcrListImdg;
@Autowired @Autowired
public AnltSearcher(ImdgProvider imdgProvider) { public AnltSearcher(ImdgProvider imdgProvider) {
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.tcrListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
} }
public AnltSearcher(Imdg<TradingClearingRegistry> tcrImdg, Imdg<Company> companyImdg, Imdg<Account> accountImdg) { public AnltSearcher(Imdg<TradingClearingRegistry> tcrImdg, Imdg<TradingClearingRegistryList> tcrListImdg, Imdg<Company> companyImdg, Imdg<Account> accountImdg) {
this.tradingClearingRegistryImdg = tcrImdg; this.tradingClearingRegistryImdg = tcrImdg;
this.tcrListImdg = tcrListImdg;
this.companyImdg = companyImdg; this.companyImdg = companyImdg;
this.accountImdg = accountImdg; this.accountImdg = accountImdg;
} }
@ -47,33 +51,58 @@ public class AnltSearcher {
void log(IEnumId subject, Object... args); void log(IEnumId subject, Object... args);
} }
public AnltSearch loadByAnlt(String comment) { public AnltSearch loadByAnlt(String comment) {
return loadByAnlt(comment, CurrencyCode.RUB.getKey());
}
public AnltSearch loadByAnlt(String comment, String currencyCode) {
String commentTcrStripped = getTkrCodeFromComment(comment); String commentTcrStripped = getTkrCodeFromComment(comment);
// AnltLogger localLogger = (subject, args) -> log.debug("stmt.id={} comment='{}' error: {}", statementId, commentTcrStripped, messageResolver.resolve(new EnumMessage(subject, args))); // AnltLogger localLogger = (subject, args) -> log.debug("stmt.id={} comment='{}' error: {}", statementId, commentTcrStripped, messageResolver.resolve(new EnumMessage(subject, args)));
if (commentTcrStripped == null) { if (commentTcrStripped == null) {
return new AnltSearch(ClearingError.AccountNotFound, "comment not contain TCR"); return new AnltSearch(ClearingError.AccountNotFound, "comment not contain TCR");
} }
ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder(); ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder();
ImdgPredicate tcrPredicate = pb.and( ImdgPredicate statusPrdct = pb.or(
pb.equals("code", commentTcrStripped), pb.equals("status", ServiceStatus.Active.getKey()),
pb.or( pb.equals("status", ServiceStatus.Reopened.getKey())
pb.equals("status", ServiceStatus.Active.getKey()),
pb.equals("status", ServiceStatus.Reopened.getKey())
)
); );
ImdgPredicate tcrPredicate = pb.and(
pb.equals("code", commentTcrStripped),
statusPrdct
);
TradingClearingRegistryList tcrList = null;
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByPredicate(tcrPredicate); TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByPredicate(tcrPredicate);
if (tcr == null) { if (tcr == null) {
return new AnltSearch(ClearingError.TCRegistryNotFound, commentTcrStripped); return new AnltSearch(ClearingError.TCRegistryNotFound, commentTcrStripped);
} }
if (tcr.getMoneyAccountId() == null) { Account infoAcc = null;
return new AnltSearch(ClearingError.WrongField, "moneyAccountId"); if (CurrencyCode.isRub(currencyCode)) {
if (tcr.getMoneyAccountId() == null) {
return new AnltSearch(ClearingError.WrongField, "moneyAccountId");
}
infoAcc = accountImdg.getSingleObjectByID(tcr.getMoneyAccountId());
} else {
tcrList = tcrListImdg.getSingleObjectByPredicate(
pb.and(
pb.equals("currency", currencyCode),
pb.equals("tradingClearingRegistryId", tcr.getId()),
statusPrdct
)
);
if (tcrList == null) {
return new AnltSearch(ClearingError.TCRegistryNotFound, "<by commend=%s and currency=%s>"
.formatted(comment, currencyCode));
}
infoAcc = accountImdg.getSingleObjectByID(tcrList.getAccountId());
} }
Account infoAcc = accountImdg.getSingleObjectByID(tcr.getMoneyAccountId());
if (infoAcc == null) { if (infoAcc == null) {
return new AnltSearch(ClearingError.AccountNotFound, "moneyAccountId"); return new AnltSearch(ClearingError.AccountNotFoundB,
"<for tcr.id=%d/moneyAccountId=%d> currency %s".formatted(
tcr.getId(), tcr.getMoneyAccountId(), currencyCode
));
} }
if (!infoAcc.getAccountType().equals(AccountType.Info.getKey())) { if (!infoAcc.getAccountType().equals(AccountType.Info.getKey())) {
@ -84,7 +113,7 @@ public class AnltSearcher {
if (company == null) { if (company == null) {
return new AnltSearch(ClearingError.CompanyNotFoundB, tcr.getCompanyId()); return new AnltSearch(ClearingError.CompanyNotFoundB, tcr.getCompanyId());
} }
return new AnltSearch(infoAcc, company, tcr); return new AnltSearch(infoAcc, company, tcr, tcrList, currencyCode);
} }
private static final Pattern tcrPattern = Pattern.compile("ТКР.*?([0-9A-Z-]{12})"); private static final Pattern tcrPattern = Pattern.compile("ТКР.*?([0-9A-Z-]{12})");
@ -107,15 +136,33 @@ public class AnltSearcher {
private Account account; private Account account;
private Company company; private Company company;
private TradingClearingRegistry tcr; private TradingClearingRegistry tcr;
private TradingClearingRegistryList tcrList;
private String currency;
public AnltSearch(IEnumId errSubject, Object... args) { public AnltSearch(IEnumId errSubject, Object... args) {
this.error = new EnumMessage(errSubject, args); this.error = new EnumMessage(errSubject, args);
} }
public AnltSearch() {
}
public AnltSearch(Account account, Company company, TradingClearingRegistry tcr) { public AnltSearch(Account account, Company company, TradingClearingRegistry tcr) {
this.account = account; this.account = account;
this.company = company; this.company = company;
this.tcr = tcr; this.tcr = tcr;
this.currency = CurrencyCode.RUB.getKey();
}
public AnltSearch(Account account,
Company company,
TradingClearingRegistry tcr,
TradingClearingRegistryList tcrList,
String currency) {
this.account = account;
this.company = company;
this.tcr = tcr;
this.tcrList = tcrList;
this.currency = CurrencyCode.RUB.getKey();
} }
public boolean isFound() { public boolean isFound() {
@ -153,5 +200,21 @@ public class AnltSearcher {
public void setTcr(TradingClearingRegistry tcr) { public void setTcr(TradingClearingRegistry tcr) {
this.tcr = tcr; this.tcr = tcr;
} }
public TradingClearingRegistryList getTcrList() {
return tcrList;
}
public void setTcrList(TradingClearingRegistryList tcrList) {
this.tcrList = tcrList;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
} }
} }

View file

@ -0,0 +1,99 @@
package ru.spcex.clearing.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
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.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Component
public class TcrSearcher {
private Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<TradingClearingRegistry> tcrImdg;
private final Imdg<TradingClearingRegistryList> tcrListImdg;
private final Imdg<Company> companyImdg;
private final Imdg<Account> accountImdg;
@Autowired
public TcrSearcher(ImdgProvider imdgProvider) {
this.tcrImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
this.tcrListImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_TradingClearingRegistryList,
TradingClearingRegistryList.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
}
public TcrSearcher(Imdg<TradingClearingRegistry> tcrImdg,
Imdg<TradingClearingRegistryList> tcrListImdg,
Imdg<Company> companyImdg,
Imdg<Account> accountImdg) {
this.tcrImdg = tcrImdg;
this.tcrListImdg = tcrListImdg;
this.companyImdg = companyImdg;
this.accountImdg = accountImdg;
}
public AnltSearcher.AnltSearch loadByCurrencyAccountId(Long accountId, String currency) {
AnltSearcher.AnltSearch srchRes = new AnltSearcher.AnltSearch();
ImdgPredicateBuilder pb = tcrImdg.predicateBuilder();
ImdgPredicate sttsPrdct = pb.or(
pb.equals("status", ServiceStatus.Active.getKey()),
pb.equals("status", ServiceStatus.Reopened.getKey())
);
//fixme BASED ON CURRENCY
TradingClearingRegistry tcr = tcrImdg.getSingleObjectByPredicate(
pb.and(
pb.equals("moneyAccountId", accountId),
sttsPrdct
)
);
if (tcr != null) {
srchRes.setCurrency(CurrencyCode.RUB.getKey());
} else {
TradingClearingRegistryList tcrList = tcrListImdg.getSingleObjectByPredicate(
pb.and(
pb.equals("accountId", accountId),
sttsPrdct
)
);
if (tcrList == null) {
return new AnltSearcher.AnltSearch(ClearingError.TCRegistryNotFound, "<by accountId=%s".formatted(accountId));
}
tcr = tcrImdg.getSingleObjectByID(tcrList.getTradingClearingRegistryId());
if (tcr == null) {
return new AnltSearcher.AnltSearch(ClearingError.TCRegistryNotFound, "<by accountId=%s".formatted(accountId));
}
srchRes.setCurrency(tcrList.getCurrency());
srchRes.setTcrList(tcrList);
}
srchRes.setTcr(tcr);
Account acc = accountImdg.getSingleObjectByID(accountId);
if (acc == null) {
return new AnltSearcher.AnltSearch(ClearingError.AccountNotFoundB, accountId);
}
Company cmp = companyImdg.getSingleObjectByID(acc.getCompanyId());
if (cmp == null) {
return new AnltSearcher.AnltSearch(ClearingError.CompanyNotFoundB, acc.getCompanyId());
}
srchRes.setAccount(acc);
srchRes.setCompany(cmp);
return srchRes;
}
}

View file

@ -1,5 +1,9 @@
package ru.spcex.clearing.service.builder; package ru.spcex.clearing.service.builder;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Map;
import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
@ -13,18 +17,19 @@ import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement; import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.clearing.service.TcrSearcher;
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.AccountType;
import ru.spcex.platform.enumeration.RegistryCapacity;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryStatus;
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.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
public class RegistryBuilder { public class RegistryBuilder {
private Statement statement; private Statement statement;
private Company company; private Company company;
@ -40,6 +45,8 @@ public class RegistryBuilder {
private final Imdg<EquitySecurity> equitySecurityImdg; private final Imdg<EquitySecurity> equitySecurityImdg;
private final Imdg<CurrencyPairSecurity> currencyPairSecurityImdg; private final Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
private final Imdg<Currency> currencyImdg; private final Imdg<Currency> currencyImdg;
private final TcrSearcher tcrSrcher;
private String currency;
public static RegistryBuilder builder(ImdgProvider imdgProvider) { public static RegistryBuilder builder(ImdgProvider imdgProvider) {
@ -56,6 +63,7 @@ public class RegistryBuilder {
this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
this.currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class); this.currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class);
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class); this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
this.tcrSrcher = new TcrSearcher(imdgProvider);
} }
public RegistryBuilder statement(Statement statement) { public RegistryBuilder statement(Statement statement) {
@ -73,6 +81,11 @@ public class RegistryBuilder {
return this; return this;
} }
public RegistryBuilder loadTcrForCurrency(String currency) {
this.currency = currency;
return this;
}
public RegistryBuilder designation(RegistryDesignation designation) { public RegistryBuilder designation(RegistryDesignation designation) {
this.designation = designation; this.designation = designation;
return this; return this;
@ -103,15 +116,13 @@ public class RegistryBuilder {
rgs.setRegistryUnit(RegistryUnit.T.getKey()); rgs.setRegistryUnit(RegistryUnit.T.getKey());
rgs.setRegistryCode(RegistryUtil.clearingCode(rgs)); rgs.setRegistryCode(RegistryUtil.clearingCode(rgs));
Collection<TradingClearingRegistry> tcrsByAccount = tradingClearingRegistryImdg.getCollectionObjectsByFieldValues(Map.of( if (currency != null) {
"moneyAccountId", account.getId(), AnltSearcher.AnltSearch anltSearch = tcrSrcher.loadByCurrencyAccountId(account.getId(), currency);
"companyId", company.getId(), if (anltSearch.isFound()) {
"status", ServiceStatus.Active.getKey() TradingClearingRegistry tcr = anltSearch.getTcr();
)); rgs.setTradingClearingRegistryId(tcr.getId());
if (!tcrsByAccount.isEmpty()) { rgs.setTradingClearingRegistry(tcr.getCode());
TradingClearingRegistry tcr = tcrsByAccount.iterator().next(); }
rgs.setTradingClearingRegistryId(tcr.getId());
rgs.setTradingClearingRegistry(tcr.getCode());
} }
rgs.setRegistryStatus(RegistryStatus.PROC.getKey()); rgs.setRegistryStatus(RegistryStatus.PROC.getKey());

View file

@ -180,6 +180,7 @@ public class Sdf01Executor extends AbstractExecutor<SDf01> {
.company(company) .company(company)
.account(account) .account(account)
.designation(RegistryDesignation.A) .designation(RegistryDesignation.A)
.loadTcrForCurrency(sdf01.getCurr_code())
.build(); .build();
calcBalance(rgs, stmt); calcBalance(rgs, stmt);
Registry registryB = copyRegB(rgs); Registry registryB = copyRegB(rgs);

View file

@ -40,7 +40,6 @@ import ru.spcex.clearing.service.schedule.TradingTimeService;
import ru.spcex.clearing.service.validation.Sdf06NewValidationRule; import ru.spcex.clearing.service.validation.Sdf06NewValidationRule;
import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.InOutDirection; import ru.spcex.platform.enumeration.InOutDirection;
import ru.spcex.platform.enumeration.InOutSDfType; import ru.spcex.platform.enumeration.InOutSDfType;
import ru.spcex.platform.enumeration.OperationStatus; import ru.spcex.platform.enumeration.OperationStatus;
@ -173,7 +172,7 @@ public class Sdf06Executor {
processedApproved(stmt, sDf06, now, sdf07GroupId); processedApproved(stmt, sDf06, now, sdf07GroupId);
if (tcr != null) { if (tcr != null) {
dmiService.setProcContract(tcr.getId(), dmiService.setProcContract(tcr.getId(),
CurrencyCode.RUB.getKey(), //fixme??? 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(), tcr.getMoneyAccountId());
@ -286,7 +285,7 @@ public class Sdf06Executor {
processedApproved(stmt, sdf06, updatedTime); processedApproved(stmt, sdf06, updatedTime);
Optional<TradingClearingRegistry> tcr = searchTcrOnGatewayResponse(sdf06); Optional<TradingClearingRegistry> tcr = searchTcrOnGatewayResponse(sdf06);
dmiService.setProcContract(tcr.map(SpcexObjectBase::getId).orElse(null), dmiService.setProcContract(tcr.map(SpcexObjectBase::getId).orElse(null),
CurrencyCode.RUB.getKey(), //fixme??? sdf06.getPay_val(),
safeBD(sdf06.getSum()), safeBD(sdf06.getSum()),
sdf06.getNumber().toString() sdf06.getNumber().toString()
); );

View file

@ -278,6 +278,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
.statement(stmt) .statement(stmt)
.company(company) .company(company)
.account(account) .account(account)
.loadTcrForCurrency(sdf57.getPay_val())
.designation(RegistryDesignation.A) .designation(RegistryDesignation.A)
.build(); .build();
calcBalance(registry, stmt, sdf57); calcBalance(registry, stmt, sdf57);
@ -418,7 +419,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
Account acc = stmtCmpAcc.account(); Account acc = stmtCmpAcc.account();
Optional<AssetTrio> asts = createRegistryIfNeeded.apply(stmtCmpAcc); Optional<AssetTrio> asts = createRegistryIfNeeded.apply(stmtCmpAcc);
if (accountIsAnlt(acc)) { if (accountIsAnlt(acc)) {
AnltSearcher.AnltSearch searchResult = anltSearcher.loadByAnlt(stmt.getComment()); AnltSearcher.AnltSearch searchResult = anltSearcher.loadByAnlt(stmt.getComment(), sdf57.getPay_val());
if (searchResult.isFound()) { if (searchResult.isFound()) {
log.debug("stmt.id={} comment={} is anlt, loaded account.id={}/companyId={}", log.debug("stmt.id={} comment={} is anlt, loaded account.id={}/companyId={}",
stmt.getId(), stmt.getId(),

View file

@ -1,35 +1,39 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
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.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf06;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.platform.enumeration.*;
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.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.number.BigDecimalUtil;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.function.Function; import java.util.function.Function;
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.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.clearing.classes.statics.data.sdf.SDf06;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.clearing.service.TcrSearcher;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.InOutDirection;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.WorkflowStatus;
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.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.number.BigDecimalUtil;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule;
public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationContext<SDf06>> { public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationContext<SDf06>> {
Fields() { Fields() {
@ -165,7 +169,9 @@ public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationCont
dir = (InOutDirection.out); dir = (InOutDirection.out);
} }
Imdg<TradingClearingRegistry> tcrImdg; Imdg<TradingClearingRegistry> tcrImdg;
Imdg<TradingClearingRegistryList> tcrListImdg;
tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
tcrListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
//если направление in то ТКР необязателен //если направление in то ТКР необязателен
Function<Optional<EnumMessage>, Optional<EnumMessage>> err = msg -> { Function<Optional<EnumMessage>, Optional<EnumMessage>> err = msg -> {
if (dir.equals(InOutDirection.in)) { if (dir.equals(InOutDirection.in)) {
@ -177,16 +183,16 @@ public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationCont
} }
}; };
AnltSearcher.AnltSearch anltSrch; AnltSearcher.AnltSearch anltSrch;
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
if (AccountType.Anlt.getKey().equals(account.getAccountType())) { if (AccountType.Anlt.getKey().equals(account.getAccountType())) {
log.debug("account.id={} is ANLT", account.getId()); log.debug("account.id={} is ANLT", account.getId());
if (TextUtil.isEmpty(sdf06.getSpec())) { if (TextUtil.isEmpty(sdf06.getSpec())) {
log.debug("ANLT couldn't find by account.id={} spec empty", account.getId()); log.debug("ANLT couldn't find by account.id={} spec empty", account.getId());
return err.apply(of(ClearingError.TCRegistryNotFound, "<spec empty>")); return err.apply(of(ClearingError.TCRegistryNotFound, "<spec empty>"));
} }
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); AnltSearcher anltSearcher = new AnltSearcher(tcrImdg, tcrListImdg, companyImdg, accountImdg);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); anltSrch = anltSearcher.loadByAnlt(sdf06.getSpec(), sdf06.getPay_val());
AnltSearcher anltSearcher = new AnltSearcher(tcrImdg, companyImdg, accountImdg);
anltSrch = anltSearcher.loadByAnlt(sdf06.getSpec());
if (!anltSrch.isFound()) { if (!anltSrch.isFound()) {
log.debug("ANLT couldn't find by account.id={} by spec {}", account.getId(), sdf06.getSpec()); log.debug("ANLT couldn't find by account.id={} by spec {}", account.getId(), sdf06.getSpec());
return err.apply(of(ClearingError.TCRegistryNotFound, sdf06.getSpec())); return err.apply(of(ClearingError.TCRegistryNotFound, sdf06.getSpec()));
@ -200,11 +206,10 @@ public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationCont
return empty(); return empty();
} }
} else { } else {
TradingClearingRegistry tcr = tcrImdg.getFirstObjectByFieldValues( TcrSearcher tcrSearcher = new TcrSearcher(tcrImdg, tcrListImdg, companyImdg, accountImdg);
Map.of("moneyAccountId", account.getId()) AnltSearcher.AnltSearch anltSearch = tcrSearcher.loadByCurrencyAccountId(account.getId(), sdf06.getPay_val());
); if (anltSearch.isFound()) {
if (tcr != null) { context.storeObject(ValidationStored.Sdf06Tcr, anltSearch.getTcr());
context.storeObject(ValidationStored.Sdf06Tcr, tcr);
return empty(); return empty();
} else { } else {
log.debug("couldn't find TCR by account.id={} accountType {}", log.debug("couldn't find TCR by account.id={} accountType {}",