обработка SDF06 клиринг сервисом
This commit is contained in:
parent
869315ce5a
commit
654b4f643c
10 changed files with 324 additions and 5 deletions
|
|
@ -16,13 +16,15 @@ public class SdfExecutorsConfig {
|
||||||
Sdf57Executor sdf57Executor,
|
Sdf57Executor sdf57Executor,
|
||||||
Sdf04Executor sdf04Executor,
|
Sdf04Executor sdf04Executor,
|
||||||
Sdf13Executor sdf13Executor,
|
Sdf13Executor sdf13Executor,
|
||||||
Sdf08Executor sdf08Executor) {
|
Sdf08Executor sdf08Executor,
|
||||||
|
Sdf06Executor sdf06Executor) {
|
||||||
Map<SdfTable, AbstractExecutor<?>> executors = new HashMap<>();
|
Map<SdfTable, AbstractExecutor<?>> executors = new HashMap<>();
|
||||||
executors.put(SdfTable.SDF_01, sdf01Executor);
|
executors.put(SdfTable.SDF_01, sdf01Executor);
|
||||||
executors.put(SdfTable.SDF_57, sdf57Executor);
|
executors.put(SdfTable.SDF_57, sdf57Executor);
|
||||||
executors.put(SdfTable.SDF_04, sdf04Executor);
|
executors.put(SdfTable.SDF_04, sdf04Executor);
|
||||||
executors.put(SdfTable.SDF_13, sdf13Executor);
|
executors.put(SdfTable.SDF_13, sdf13Executor);
|
||||||
executors.put(SdfTable.SDF_08, sdf08Executor);
|
executors.put(SdfTable.SDF_08, sdf08Executor);
|
||||||
|
executors.put(SdfTable.SDF_06, sdf06Executor);
|
||||||
return executors;
|
return executors;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import org.springframework.context.annotation.Configuration;
|
||||||
import ru.clearing.classes.statics.data.account.Account;
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
import ru.clearing.classes.statics.data.account.AccountBalance;
|
import ru.clearing.classes.statics.data.account.AccountBalance;
|
||||||
import ru.clearing.classes.statics.data.company.Company;
|
import ru.clearing.classes.statics.data.company.Company;
|
||||||
|
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||||
import ru.clearing.classes.statics.data.company.relation.Relation;
|
import ru.clearing.classes.statics.data.company.relation.Relation;
|
||||||
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
|
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
|
||||||
import ru.clearing.classes.statics.data.misc.STrades;
|
import ru.clearing.classes.statics.data.misc.STrades;
|
||||||
|
|
@ -12,14 +13,18 @@ import ru.clearing.classes.statics.data.misc.Session;
|
||||||
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.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.SDf08;
|
import ru.clearing.classes.statics.data.sdf.SDf08;
|
||||||
import ru.clearing.classes.statics.data.sdf.SDf57;
|
import ru.clearing.classes.statics.data.sdf.SDf57;
|
||||||
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
|
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.platform.dictionary.SectionDictionary;
|
import ru.clearing.platform.dictionary.SectionDictionary;
|
||||||
|
import ru.spcex.clearing.error.ClearingError;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.service.validation.*;
|
import ru.spcex.clearing.service.validation.*;
|
||||||
|
import ru.spcex.clearing.util.security.UserRoleVerification;
|
||||||
import ru.spcex.platform.enumeration.ClearingCategory;
|
import ru.spcex.platform.enumeration.ClearingCategory;
|
||||||
|
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.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
|
|
@ -34,6 +39,8 @@ public class ValidationConfig {
|
||||||
|
|
||||||
Imdg<Relation> imdgRelation;
|
Imdg<Relation> imdgRelation;
|
||||||
Imdg<Company> imdgCompany;
|
Imdg<Company> imdgCompany;
|
||||||
|
Imdg<CompanySymbols> imdgCompanySymbols;
|
||||||
|
Imdg<Registry> imdgRegistry;
|
||||||
Imdg<Account> imdgAccount;
|
Imdg<Account> imdgAccount;
|
||||||
Imdg<AccountBalance> imdgAccountBalance;
|
Imdg<AccountBalance> imdgAccountBalance;
|
||||||
Imdg<Security> imdgSecurity;
|
Imdg<Security> imdgSecurity;
|
||||||
|
|
@ -41,10 +48,13 @@ public class ValidationConfig {
|
||||||
Imdg<TradingClearingRegistry> imdgTradingClearingRegistry;
|
Imdg<TradingClearingRegistry> imdgTradingClearingRegistry;
|
||||||
Imdg<Session> imdgSession;
|
Imdg<Session> imdgSession;
|
||||||
Imdg<SectionDictionary> imdgSectionDictionary;
|
Imdg<SectionDictionary> imdgSectionDictionary;
|
||||||
|
ImdgProvider imdgProvider;
|
||||||
|
|
||||||
public ValidationConfig(ImdgProvider imdgProvider) {
|
public ValidationConfig(ImdgProvider imdgProvider) {
|
||||||
this.imdgRelation = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
|
this.imdgRelation = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
|
||||||
this.imdgCompany = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
this.imdgCompany = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
|
this.imdgCompanySymbols = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
||||||
|
this.imdgRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
this.imdgAccount = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
this.imdgAccount = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
||||||
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);
|
||||||
|
|
@ -52,6 +62,14 @@ public class ValidationConfig {
|
||||||
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);
|
||||||
|
this.imdgProvider = imdgProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean("adminRoleVerification")
|
||||||
|
public UserRoleVerification adminRoleVerification() {
|
||||||
|
return new UserRoleVerification(
|
||||||
|
imdgProvider, null, UserRole.Admin, ClearingError.GeneralError //fixme no UserVerifyDenial error
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean("executionDepositValidator")
|
@Bean("executionDepositValidator")
|
||||||
|
|
@ -185,4 +203,22 @@ public class ValidationConfig {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean("sdf06ValidatorNew")
|
||||||
|
public Function<SDf06, IValidator> sdf06ValidatorNew() {
|
||||||
|
return sDf06 -> {
|
||||||
|
ImdgValidationContext<SDf06> context = new ImdgValidationContext<>();
|
||||||
|
context.setValidatedObject(sDf06);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_CompanySymbols, imdgCompany);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_Registry, imdgCompany);
|
||||||
|
return new ValidatorImpl<>(context,
|
||||||
|
Sdf06NewValidationRule.CompanySymbolPresent,
|
||||||
|
Sdf06NewValidationRule.AccountPresent,
|
||||||
|
Sdf06NewValidationRule.MarketIsMkr
|
||||||
|
// Sdf06NewValidationRule.Balance
|
||||||
|
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,9 @@ public enum ClearingError implements IErrorEnumId {
|
||||||
CurrencyNotFound(5213L),
|
CurrencyNotFound(5213L),
|
||||||
OperationCanBeRunForTodayOnly(5214L),
|
OperationCanBeRunForTodayOnly(5214L),
|
||||||
AccountWrongType(5216L),
|
AccountWrongType(5216L),
|
||||||
|
AccountNotFoundB(5217L),
|
||||||
|
MarketIsNotMkr(5217L),
|
||||||
|
BalanceInsufficient(5222L),
|
||||||
;
|
;
|
||||||
private final Long id;
|
private final Long id;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,12 +62,32 @@ public class StatementService extends QueueConsumer implements InitializingBean
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() throws Exception {
|
public void afterPropertiesSet() throws Exception {
|
||||||
callback(StatementRequest.class)
|
callback(StatementRequest.class)
|
||||||
.setConsumer(this::process)
|
.setConsumer(systemRequest -> {
|
||||||
|
SdfTable table = systemRequest.getRequestPayload().getTable();
|
||||||
|
if (SdfTable.SDF_06.equals(table)) {
|
||||||
|
processSdf06(systemRequest);
|
||||||
|
} else {
|
||||||
|
processPaired(systemRequest);
|
||||||
|
}
|
||||||
|
})
|
||||||
.forDestination(Consts.STATEMENT_PROCESS, callbacks::put);
|
.forDestination(Consts.STATEMENT_PROCESS, callbacks::put);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void process(BaseRequest<StatementRequest> systemRequest) {
|
@SuppressWarnings("unchecked")
|
||||||
|
private void processSdf06(BaseRequest<StatementRequest> systemRequest) {
|
||||||
|
Imdg<SDf06> sdfImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf06, SDf06.class);
|
||||||
|
Collection<SDf06> sdf06Group = sdfImdg.getCollectionObjectsByFieldValues(Map.of(
|
||||||
|
"generationId", systemRequest.getRequestPayload().getGroupId()
|
||||||
|
));
|
||||||
|
AbstractExecutor<SDf06> service = (AbstractExecutor<SDf06>) executorsMap.get(SdfTable.SDF_06);
|
||||||
|
Result res = service.execute(sdf06Group, systemRequest.getRequestPayload());
|
||||||
|
if (service.isNeedToSendCommand()) {
|
||||||
|
service.sendCommand(kafkaSender, res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processPaired(BaseRequest<StatementRequest> systemRequest) {
|
||||||
StatementRequest statementRequest = systemRequest.getRequestPayload();
|
StatementRequest statementRequest = systemRequest.getRequestPayload();
|
||||||
SdfTable table = statementRequest.getTable();
|
SdfTable table = statementRequest.getTable();
|
||||||
log.debug("Receiving StatementRequest id={}; table {}", systemRequest.getId(), table);
|
log.debug("Receiving StatementRequest id={}; table {}", systemRequest.getId(), table);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,152 @@
|
||||||
|
package ru.spcex.clearing.service.executors;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
|
import ru.clearing.classes.statics.data.account.DepoAccount;
|
||||||
|
import ru.clearing.classes.statics.data.company.Company;
|
||||||
|
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
|
||||||
|
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
|
||||||
|
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.clearing.classes.statics.data.sdf.SDf09;
|
||||||
|
import ru.clearing.classes.statics.data.statement.Statement;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||||
|
import ru.spcex.clearing.service.model.Result;
|
||||||
|
import ru.spcex.clearing.service.validation.ValidationStored;
|
||||||
|
import ru.spcex.platform.enumeration.*;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class Sdf06Executor extends AbstractExecutor<SDf06> {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
|
private final Imdg<Statement> statementImdg;
|
||||||
|
private final ImdgProvider imdgProvider;
|
||||||
|
private final Imdg<Registry> registryImdg;
|
||||||
|
private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
|
||||||
|
private final Imdg<EquitySecurity> equitySecurityImdg;
|
||||||
|
private final Imdg<DepoAccount> depoAccountImdg;
|
||||||
|
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
|
||||||
|
private final Imdg<Company> companyImdg;
|
||||||
|
private final Imdg<SDf09> sdf09Imdg;
|
||||||
|
private final IMessageResolver messageResolver;
|
||||||
|
private final Function<SDf06, IValidator> sDf06Validator;
|
||||||
|
private final KafkaSender kafkaSender;
|
||||||
|
|
||||||
|
|
||||||
|
//@Qualifier("sdf08ValidatorNew") Function<SDf08, IValidator> sDf08Validator
|
||||||
|
public Sdf06Executor(ImdgProvider imdgProvider,
|
||||||
|
IMessageResolver messageResolver,
|
||||||
|
@Qualifier("sdf06ValidatorNew") Function<SDf06, IValidator> sDf06Validator, KafkaSender kafkaSender) {
|
||||||
|
this.imdgProvider = imdgProvider;
|
||||||
|
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
|
||||||
|
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
|
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
|
||||||
|
this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
|
||||||
|
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
|
||||||
|
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
||||||
|
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
|
this.sdf09Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf09, SDf09.class);
|
||||||
|
this.messageResolver = messageResolver;
|
||||||
|
this.sDf06Validator = sDf06Validator;
|
||||||
|
this.kafkaSender = kafkaSender;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String exportTableName() {
|
||||||
|
return "DF-06";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNeedToSendCommand() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendCommand(KafkaSender kafkaSender, Result result) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Result execute(Collection<SDf06> sdfs, StatementRequest statementRequest) {
|
||||||
|
Result result = new Result();
|
||||||
|
Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId();
|
||||||
|
result.setGenerationId(generationIdForGroup);
|
||||||
|
Collection<AssetOperationRequest> requests = new ArrayList<>();
|
||||||
|
for (SDf06 sDf06 : sdfs) {
|
||||||
|
IValidator validator = sDf06Validator.apply(sDf06);
|
||||||
|
Optional<EnumMessage> err = validator.tillFirstError();
|
||||||
|
if (err.isPresent()) {
|
||||||
|
//todo если ошибка про нехватку баланса - делаем statement с ошибочным статусом
|
||||||
|
//todo 2 делаем ошибочный SDF07
|
||||||
|
log.debug("Validation error: {}", messageResolver.resolve(err.get()));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Long companyId = validator.getStored(ValidationStored.Sdf06CompanyId);
|
||||||
|
Account account = validator.getStored(ValidationStored.Sdf06Account);
|
||||||
|
Company company = companyImdg.getSingleObjectByID(companyId);
|
||||||
|
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByFieldValues(
|
||||||
|
Map.of("moneyAccountId", account.getId())
|
||||||
|
);
|
||||||
|
if (company == null || tcr == null) {
|
||||||
|
log.error("Company.id {} {}, TCR by account.id {} {} ", companyId,
|
||||||
|
company != null ? "present" : "not found",
|
||||||
|
account.getId(),
|
||||||
|
tcr != null ? "present" : "not found");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//проверка существует ли statement пока убрал
|
||||||
|
Statement stmt = createStatementBySdf06(sDf06, companyId, account);
|
||||||
|
statementImdg.insert(stmt);
|
||||||
|
log.debug("Statement created: {}", stmt.getId());
|
||||||
|
requests.add(requestFromStatement(stmt, company.getTradingCode(), tcr.getCode()));
|
||||||
|
}
|
||||||
|
requests.forEach(r -> kafkaSender.sendRequestToQueue(Consts.ASSET_OPERATION, r));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Statement createStatementBySdf06(SDf06 sdf06, Long companyId, Account account) {
|
||||||
|
Statement stmt = new Statement();
|
||||||
|
stmt.setAddresseeId(companyId);
|
||||||
|
stmt.setSenderId(Sender.Prc.getId());
|
||||||
|
stmt.setStatementType(StatementType.incr.getKey());
|
||||||
|
stmt.setComment(sdf06.getSpec());
|
||||||
|
stmt.setAccountId(account.getId());
|
||||||
|
stmt.setAccount(account.getAccount());
|
||||||
|
stmt.setInOutDirection(InOutDirection.in.getKey());
|
||||||
|
stmt.setAmount(sdf06.getSum());
|
||||||
|
stmt.setOperationStatus(OperationStatus.Pending.getKey());
|
||||||
|
stmt.setInSDfId(sdf06.getId());
|
||||||
|
stmt.setInOutSDfType(InOutSDfType.type6.getKey());
|
||||||
|
stmt.setClearingDate(LocalDate.now());
|
||||||
|
stmt.setCreated(Instant.now());
|
||||||
|
return stmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
private AssetOperationRequest requestFromStatement(Statement stmt, String tradingCode, String tcrCode) {
|
||||||
|
AssetOperationRequest req = new AssetOperationRequest();
|
||||||
|
req.setAmount(stmt.getAmount());
|
||||||
|
req.setSecuritySymbol(CurrencyCode.RUB.getKey()); //fixme retrieve security symbol from validator
|
||||||
|
req.setTradingCode(tradingCode);
|
||||||
|
req.setCode(tcrCode);
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
package ru.spcex.clearing.service.validation;
|
||||||
|
|
||||||
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
|
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||||
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.clearing.classes.statics.data.sdf.SDf06;
|
||||||
|
import ru.spcex.clearing.error.ClearingError;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.platform.enumeration.AccountType;
|
||||||
|
import ru.spcex.platform.enumeration.CompanySymbol;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.number.BigDecimalUtil;
|
||||||
|
import ru.spcex.platform.utils.text.TextUtil;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationContext<SDf06>> {
|
||||||
|
CompanySymbolPresent() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<SDf06> context) {
|
||||||
|
SDf06 sdf06 = context.getValidatedObject();
|
||||||
|
Imdg<CompanySymbols> companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
||||||
|
CompanySymbols companySymbols = null;
|
||||||
|
if (sdf06.getInn() != null) { //TextUtil.isEmpty
|
||||||
|
companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(Map.of(
|
||||||
|
"companySymbol", CompanySymbol.INN.getKey(),
|
||||||
|
"companySymbolValue", sdf06.getInn()));
|
||||||
|
} else if (sdf06.getBic() != null) {
|
||||||
|
companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(Map.of(
|
||||||
|
"companySymbol", CompanySymbol.BIC.getKey(),
|
||||||
|
"companySymbolValue", sdf06.getBic()));
|
||||||
|
}
|
||||||
|
if (companySymbols == null) {
|
||||||
|
return of(ClearingError.CompanyNotFoundB, "inn=" + sdf06.getInn() + "/bic=" + sdf06.getBic());
|
||||||
|
}
|
||||||
|
context.storeObject(ValidationStored.Sdf06CompanyId, companySymbols.getCompanyId());
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//// 1.2. Проверить, есть ли в таблице account счет, у которого account.account=sDf06.account
|
||||||
|
// и account.accountType=CLRN (см. справочник accountType). Иначе записать в лог ошибку (5217) "Счет %s не найден".
|
||||||
|
AccountPresent() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<SDf06> context) {
|
||||||
|
SDf06 sdf06 = context.getValidatedObject();
|
||||||
|
if (TextUtil.isEmpty(sdf06.getAccount())) {
|
||||||
|
return of(ClearingError.AccountNotFoundB, sdf06.getAccount());
|
||||||
|
}
|
||||||
|
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
|
||||||
|
Account account = accountImdg.getSingleObjectByFieldValues(Map.of(
|
||||||
|
"account", sdf06.getAccount(),
|
||||||
|
"accountType", AccountType.Clrn.getKey()));
|
||||||
|
if (account == null) {
|
||||||
|
return of(ClearingError.AccountNotFoundB, sdf06.getAccount());
|
||||||
|
}
|
||||||
|
context.storeObject(ValidationStored.Sdf06Account, account);
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
MarketIsMkr() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<SDf06> context) {
|
||||||
|
SDf06 sdf06 = context.getValidatedObject();
|
||||||
|
if (sdf06.getMarket() == null || !sdf06.getMarket().equals("U")) {
|
||||||
|
return of(ClearingError.MarketIsNotMkr);
|
||||||
|
}
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Balance() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<SDf06> context) {
|
||||||
|
SDf06 sdf06 = context.getValidatedObject();
|
||||||
|
if (BigDecimalUtil.safeBD(sdf06.getSum()).compareTo(BigDecimal.ZERO) >= 0) {
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
Imdg<Registry> registryImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
|
Registry rgs = registryImdg.getSingleObjectByFieldValues(Map.of(
|
||||||
|
"account", sdf06.getAccount(),
|
||||||
|
"accountType", AccountType.Clrn.getKey()));
|
||||||
|
if (rgs == null) {
|
||||||
|
return of(ClearingError.BalanceInsufficient, sdf06.getAccount());
|
||||||
|
}
|
||||||
|
//fixme getFreeBalance???
|
||||||
|
if (BigDecimalUtil.safeBD(rgs.getCheckBalance()).compareTo(BigDecimalUtil.safeBD(sdf06.getSum()).abs()) < 0) {
|
||||||
|
return of(ClearingError.BalanceInsufficient, sdf06.getAccount());
|
||||||
|
}
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String ruleName() {
|
||||||
|
return "Sdf08NewValidationRule." + name();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,5 +8,7 @@ public enum ValidationStored {
|
||||||
|
|
||||||
Sdf01Company, Sdf01Account,
|
Sdf01Company, Sdf01Account,
|
||||||
|
|
||||||
Sdf08Company, Sdf08Account
|
Sdf08Company, Sdf08Account,
|
||||||
|
|
||||||
|
Sdf06CompanyId, Sdf06Account
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ public class DbfImportKafkaMessenger implements InitializingBean {
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
public void afterPropertiesSet() {
|
||||||
messengers.put(ETable.DF_01, groupId -> messageBalance(groupId, SdfTable.SDF_01));
|
messengers.put(ETable.DF_01, groupId -> messageBalance(groupId, SdfTable.SDF_01));
|
||||||
|
messengers.put(ETable.DF_06, groupId -> messageBalance(groupId, SdfTable.SDF_06));
|
||||||
messengers.put(ETable.DF_09, groupId -> messageBalance(groupId, SdfTable.SDF_09));
|
messengers.put(ETable.DF_09, groupId -> messageBalance(groupId, SdfTable.SDF_09));
|
||||||
messengers.put(ETable.DF_16, groupId -> messageBalance(groupId, SdfTable.SDF_16));
|
messengers.put(ETable.DF_16, groupId -> messageBalance(groupId, SdfTable.SDF_16));
|
||||||
messengers.put(ETable.DF_57, groupId -> messageBalance(groupId, SdfTable.SDF_57));
|
messengers.put(ETable.DF_57, groupId -> messageBalance(groupId, SdfTable.SDF_57));
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
|
|
||||||
public enum InOutSDfType implements IEnumKey {
|
public enum InOutSDfType implements IEnumKey {
|
||||||
type1("0102"), type16("1617"), type9("0910"), type57("57"), type08("0809");
|
type1("0102"), type6("0607"), type16("1617"), type9("0910"), type57("57"), type08("0809");
|
||||||
|
|
||||||
private final String key;
|
private final String key;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
public enum SdfTable implements IEnumKey {
|
public enum SdfTable implements IEnumKey {
|
||||||
SDF_01("SDF_01"),
|
SDF_01("SDF_01"),
|
||||||
SDF_04("SDF_04"),
|
SDF_04("SDF_04"),
|
||||||
|
SDF_06("SDF_06"),
|
||||||
SDF_08("SDF_08"),
|
SDF_08("SDF_08"),
|
||||||
SDF_09("SDF_09"),
|
SDF_09("SDF_09"),
|
||||||
SDF_10("SDF_10"),
|
SDF_10("SDF_10"),
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue