sdf01/sdf57/sdf06 currency

This commit is contained in:
ialbert 2024-04-17 18:35:53 +03:00
parent cbad15aab9
commit 3d47b2b2f3
14 changed files with 171 additions and 92 deletions

View file

@ -0,0 +1,5 @@
package ru.clearing.classes.statics.data.api;
public interface WithCurrency {
String currency();
}

View file

@ -1,19 +1,19 @@
package ru.clearing.classes.statics.data.sdf; package ru.clearing.classes.statics.data.sdf;
import java.time.Instant;
import ru.clearing.classes.ConstSerializable; import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.statics.data.api.WithCurrency;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithAccount; import ru.spcex.platform.classes.base.interfaces.WithAccount;
import ru.spcex.platform.classes.base.interfaces.WithFileName; import ru.spcex.platform.classes.base.interfaces.WithFileName;
import ru.spcex.platform.classes.base.interfaces.WithMarket; import ru.spcex.platform.classes.base.interfaces.WithMarket;
import java.time.Instant;
/** /**
* ДФ-01 Информации о денежных средствах, находящихся на торговых банковских счетах участников клиринга * ДФ-01 Информации о денежных средствах, находящихся на торговых банковских счетах участников клиринга
* <p> * <p>
* DB table: S_DF01 * DB table: S_DF01
**/ **/
public class SDf01 extends SpcexObjectBase implements WithAccount, WithMarket, WithFileName { public class SDf01 extends SpcexObjectBase implements WithAccount, WithMarket, WithFileName, WithCurrency {
private static final long serialVersionUID = ConstSerializable.serialVersionUID; private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private String curr_code; private String curr_code;
@ -153,4 +153,8 @@ public class SDf01 extends SpcexObjectBase implements WithAccount, WithMarket, W
this.generationId = value; this.generationId = value;
} }
@Override
public String currency() {
return getCurr_code();
}
} }

View file

@ -1,19 +1,18 @@
package ru.clearing.classes.statics.data.sdf; package ru.clearing.classes.statics.data.sdf;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithFileName;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.statics.data.api.WithCurrency;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithFileName;
/** /**
* ДФ-06 Запрос на зачисление/списание денежных средств * ДФ-06 Запрос на зачисление/списание денежных средств
* <p> * <p>
* DB table: S_DF06 * DB table: S_DF06
**/ **/
public class SDf06 extends SpcexObjectBase implements WithFileName { public class SDf06 extends SpcexObjectBase implements WithFileName, WithCurrency {
private static final long serialVersionUID = ConstSerializable.serialVersionUID; private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private String account; private String account;
@ -158,4 +157,8 @@ public class SDf06 extends SpcexObjectBase implements WithFileName {
this.pay_val=value; this.pay_val=value;
} }
@Override
public String currency() {
return getPay_val();
}
} }

View file

@ -1,17 +1,16 @@
package ru.clearing.classes.statics.data.sdf; package ru.clearing.classes.statics.data.sdf;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.statics.data.api.WithCurrency;
import ru.spcex.platform.classes.base.SpcexObjectBase;
/** /**
* ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС) * ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС)
* <p> * <p>
* DB table: S_DF57 * DB table: S_DF57
**/ **/
public class SDf57 extends SpcexObjectBase { public class SDf57 extends SpcexObjectBase implements WithCurrency {
private static final long serialVersionUID = ConstSerializable.serialVersionUID; private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private Long dbfId; private Long dbfId;
@ -429,4 +428,8 @@ public class SDf57 extends SpcexObjectBase {
this.kt_out = value; this.kt_out = value;
} }
@Override
public String currency() {
return getPay_val();
}
} }

View file

@ -15,6 +15,7 @@ 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.instrument.issue.EquitySecurity; import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.misc.STrades; import ru.clearing.classes.statics.data.misc.STrades;
import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.payment.PaymentInstruction;
@ -46,6 +47,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDe
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.ClrngValidationStored; import ru.spcex.clearing.service.validation.ClrngValidationStored;
import ru.spcex.clearing.service.validation.CompanyByTradingCodeValidationRule; import ru.spcex.clearing.service.validation.CompanyByTradingCodeValidationRule;
import ru.spcex.clearing.service.validation.CurrencyCodeValidationRule;
import ru.spcex.clearing.service.validation.ExecutionDepositValidationRule; import ru.spcex.clearing.service.validation.ExecutionDepositValidationRule;
import ru.spcex.clearing.service.validation.IdentificationFundsValidationRule; import ru.spcex.clearing.service.validation.IdentificationFundsValidationRule;
import ru.spcex.clearing.service.validation.MarketIsUValidationRule; import ru.spcex.clearing.service.validation.MarketIsUValidationRule;
@ -87,6 +89,7 @@ public class ValidationConfig {
Imdg<Relation> imdgRelation; Imdg<Relation> imdgRelation;
Imdg<Company> imdgCompany; Imdg<Company> imdgCompany;
Imdg<Currency> imdgCurrency;
Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg; Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
Imdg<EquitySecurity> equitySecurityImdg; Imdg<EquitySecurity> equitySecurityImdg;
Imdg<CurrencyPairSecurity> currencyPairSecurityImdg; Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
@ -113,6 +116,7 @@ public class ValidationConfig {
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.imdgCurrency = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
this.imdgCompanySymbols = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); this.imdgCompanySymbols = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.imdgRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.imdgRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.imdgSdf20 = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf20, SDf20.class); this.imdgSdf20 = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf20, SDf20.class);
@ -265,12 +269,13 @@ public class ValidationConfig {
context.setValidatedObject(sDf57); context.setValidatedObject(sDf57);
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.addImdg(IMDGDistributedNames.Map_Currency, imdgCurrency);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
Sdf57ValidationRule.CompanyDebOrCredPresent, Sdf57ValidationRule.CompanyDebOrCredPresent,
Sdf57ValidationRule.AccountDebOrCredPresent, Sdf57ValidationRule.AccountDebOrCredPresent,
Sdf57ValidationRule.AccountAndCompanyMatch, Sdf57ValidationRule.AccountAndCompanyMatch,
Sdf57ValidationRule.CurrencyCodeCheck CurrencyCodeValidationRule.INSTANCE
); );
}; };
} }
@ -306,12 +311,13 @@ public class ValidationConfig {
context.setValidatedObject(sDf01); context.setValidatedObject(sDf01);
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.addImdg(IMDGDistributedNames.Map_Currency, imdgCurrency);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
Sdf01NewValidationRule.CompanyPresent, Sdf01NewValidationRule.CompanyPresent,
Sdf01NewValidationRule.AccountType, Sdf01NewValidationRule.AccountType,
Sdf01NewValidationRule.AccountPresent, Sdf01NewValidationRule.AccountPresent,
Sdf01NewValidationRule.CurrencyCodeCheck, CurrencyCodeValidationRule.INSTANCE,
Sdf01NewValidationRule.DatIsCurrentDt Sdf01NewValidationRule.DatIsCurrentDt
); );
}; };
@ -344,6 +350,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_Currency, imdgCurrency);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
Sdf06NewValidationRule.Fields, Sdf06NewValidationRule.Fields,
@ -352,7 +359,9 @@ public class ValidationConfig {
Sdf06NewValidationRule.CompanyAndAccountMatch, Sdf06NewValidationRule.CompanyAndAccountMatch,
Sdf06NewValidationRule.Session, Sdf06NewValidationRule.Session,
Sdf06NewValidationRule.Balance, Sdf06NewValidationRule.Balance,
Sdf06NewValidationRule.TcrPresent Sdf06NewValidationRule.TcrPresent,
CurrencyCodeValidationRule.INSTANCE
); );
}; };

View file

@ -44,6 +44,7 @@ public enum ClearingError implements IErrorEnumId {
AccountNotFoundB(5217L), AccountNotFoundB(5217L),
MarketIsNotMkr(5217L), MarketIsNotMkr(5217L),
BalanceInsufficient(5222L), BalanceInsufficient(5222L),
Sdf57UnexpectedBalance(5435L),
TCRegistryNotFound(3022L), TCRegistryNotFound(3022L),
WrongField(5004L), WrongField(5004L),
GatewayTimeout(6003L), GatewayTimeout(6003L),

View file

@ -1,5 +1,15 @@
package ru.spcex.clearing.service.executors; package ru.spcex.clearing.service.executors;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
@ -26,7 +36,18 @@ import ru.spcex.clearing.service.builder.RegistryBuilder;
import ru.spcex.clearing.service.model.Result; import ru.spcex.clearing.service.model.Result;
import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.service.validation.ValidationStored;
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.InOutDirection;
import ru.spcex.platform.enumeration.InOutSDfType;
import ru.spcex.platform.enumeration.OperationStatus;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.platform.enumeration.SdfResult;
import ru.spcex.platform.enumeration.Sender;
import ru.spcex.platform.enumeration.StatementType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
@ -37,13 +58,6 @@ import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.number.BigDecimalUtil;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
@Service @Service
public class Sdf01Executor extends AbstractExecutor<SDf01> { public class Sdf01Executor extends AbstractExecutor<SDf01> {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
@ -246,7 +260,7 @@ public class Sdf01Executor extends AbstractExecutor<SDf01> {
stmt.setInSDfId(sdf01.getId()); stmt.setInSDfId(sdf01.getId());
stmt.setInOutSDfType(InOutSDfType.type1.getKey()); stmt.setInOutSDfType(InOutSDfType.type1.getKey());
stmt.setClearingDate(LocalDate.now()); stmt.setClearingDate(LocalDate.now());
Currency currency = currencyImdg.getFirstObjectByFieldValues(Map.of("currencyCode", CurrencyCode.RUB.getKey())); Currency currency = currencyImdg.getFirstObjectByFieldValues(Map.of("currencyCode", sdf01.getCurr_code()));
if (currency != null) { if (currency != null) {
stmt.setSecurityId(currency.getId()); stmt.setSecurityId(currency.getId());
} }

View file

@ -1,5 +1,14 @@
package ru.spcex.clearing.service.executors; package ru.spcex.clearing.service.executors;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
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,6 +16,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
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.misc.Currency;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf06; import ru.clearing.classes.statics.data.sdf.SDf06;
import ru.clearing.classes.statics.data.sdf.SDf07; import ru.clearing.classes.statics.data.sdf.SDf07;
@ -30,7 +40,12 @@ 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.*; import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.InOutDirection;
import ru.spcex.platform.enumeration.InOutSDfType;
import ru.spcex.platform.enumeration.OperationStatus;
import ru.spcex.platform.enumeration.Sender;
import ru.spcex.platform.enumeration.StatementType;
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;
@ -38,18 +53,11 @@ 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.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl; import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.*;
import java.util.function.Function;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Service @Service
public class Sdf06Executor { public class Sdf06Executor {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
@ -136,7 +144,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)); validator.getStored(ValidationStored.Sdf06Account), null);
} }
errorSdf07 = createSdf07(sDf06, now, errorResult); errorSdf07 = createSdf07(sDf06, now, errorResult);
errorSdf07.setGenerationId(sdf07GroupId); errorSdf07.setGenerationId(sdf07GroupId);
@ -151,8 +159,12 @@ public class Sdf06Executor {
} }
Company company = validator.getStored(ValidationStored.Sdf06Company); Company company = validator.getStored(ValidationStored.Sdf06Company);
TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr); TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr);
Currency currency = validator.getStored(ValidationStored.currency);
//проверка существует ли statement пока убрал //проверка существует ли statement пока убрал
Statement stmt = createStatementBySdf06(sDf06, company.getId(), validator.getStored(ValidationStored.Sdf06Account)); Statement stmt = createStatementBySdf06(sDf06,
company.getId(),
validator.getStored(ValidationStored.Sdf06Account),
currency.getId());
statementImdg.insert(stmt); statementImdg.insert(stmt);
log.debug("Statement created: {}", stmt.getId()); log.debug("Statement created: {}", stmt.getId());
if (InOutDirection.out.getKey().equals(stmt.getInOutDirection()) && tradingTimeService.isTradingTime()) { if (InOutDirection.out.getKey().equals(stmt.getInOutDirection()) && tradingTimeService.isTradingTime()) {
@ -161,7 +173,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(), CurrencyCode.RUB.getKey(), //fixme???
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());
@ -274,7 +286,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(), CurrencyCode.RUB.getKey(), //fixme???
safeBD(sdf06.getSum()), safeBD(sdf06.getSum()),
sdf06.getNumber().toString() sdf06.getNumber().toString()
); );
@ -337,10 +349,11 @@ public class Sdf06Executor {
sDf07.setNumber(sdf06.getNumber()); sDf07.setNumber(sdf06.getNumber());
sDf07.setSpec(sdf06.getSpec()); sDf07.setSpec(sdf06.getSpec());
sDf07.setResult(result); sDf07.setResult(result);
sDf07.setPay_val(sdf06.getPay_val());
return sDf07; return sDf07;
} }
private Statement createStatementBySdf06(SDf06 sdf06, Long companyId, Account account) { private Statement createStatementBySdf06(SDf06 sdf06, Long companyId, Account account, Long securityId) {
Statement stmt = new Statement(); Statement stmt = new Statement();
stmt.setContract(sdf06.getNumber().toString()); stmt.setContract(sdf06.getNumber().toString());
stmt.setAddresseeId(companyId); stmt.setAddresseeId(companyId);
@ -361,20 +374,10 @@ public class Sdf06Executor {
stmt.setInOutSDfType(InOutSDfType.type6.getKey()); stmt.setInOutSDfType(InOutSDfType.type6.getKey());
stmt.setClearingDate(LocalDate.now()); stmt.setClearingDate(LocalDate.now());
stmt.setCreated(Instant.now()); stmt.setCreated(Instant.now());
stmt.setSecurityId(securityId);
return stmt; return stmt;
} }
private AssetOperationRequest requestFromStatement(Statement stmt, String tradingCode, String tcrCode) {
AssetOperationRequest req = new AssetOperationRequest();
req.setEntityId(stmt.getId());
req.setAmount(stmt.getAmount());
req.setSecuritySymbol(CurrencyCode.RUB.getKey()); //fixme retrieve security symbol from validator
req.setTradingCode(tradingCode);
req.setCode(tcrCode);
req.setDirection(stmt.getInOutDirection());
return req;
}
private Optional<TradingClearingRegistry> searchTcrOnGatewayResponse(SDf06 sdf06) { private Optional<TradingClearingRegistry> searchTcrOnGatewayResponse(SDf06 sdf06) {
ImdgValidationContext<SDf06> ctx = new ImdgValidationContext<>(); ImdgValidationContext<SDf06> ctx = new ImdgValidationContext<>();
ctx.addImdg(IMDGDistributedNames.Map_Account, accImdg); ctx.addImdg(IMDGDistributedNames.Map_Account, accImdg);

View file

@ -5,6 +5,7 @@ import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@ -65,6 +66,8 @@ import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.RegistryTradingParams;
import static ru.spcex.platform.enumeration.RegistryTradingParams.D__V;
import static ru.spcex.platform.enumeration.RegistryTradingParams.OM_T;
import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.Section;
import ru.spcex.platform.enumeration.Sender; import ru.spcex.platform.enumeration.Sender;
@ -83,11 +86,10 @@ import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.number.BigDecimalUtil;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
import static ru.spcex.platform.enumeration.RegistryTradingParams.D__V;
import static ru.spcex.platform.enumeration.RegistryTradingParams.OM_T;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Service @Service
public class Sdf57Executor extends AbstractExecutor<SDf57> { public class Sdf57Executor extends AbstractExecutor<SDf57> {
@ -191,6 +193,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
boolean sessionIsPresent = sessionImdg.getFirstObjectByFieldValues(Map.of( boolean sessionIsPresent = sessionImdg.getFirstObjectByFieldValues(Map.of(
"workflowStatus", SessionStatus.ACTV.getKey() "workflowStatus", SessionStatus.ACTV.getKey()
)) != null; )) != null;
sdf = sdf.stream().sorted(Comparator.comparing(SpcexObjectBase::getId)).toList();
for (SDf57 sdf57 : sdf) { for (SDf57 sdf57 : sdf) {
IValidator validator = sDf57Validator.apply(sdf57); IValidator validator = sDf57Validator.apply(sdf57);
Optional<EnumMessage> error = validator.tillFirstError(); Optional<EnumMessage> error = validator.tillFirstError();
@ -241,7 +244,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
.find(); .find();
AssetTrio asts = amtFound.map(rgs -> { AssetTrio asts = amtFound.map(rgs -> {
log.debug("stmt.id={}, found AM*T.id={}, updating...", stmt.getId(), rgs.getId()); log.debug("stmt.id={}, found AM*T.id={}, updating...", stmt.getId(), rgs.getId());
updateReg(stmt, rgs); updateReg(stmt, rgs, sdf57);
//добавил создание если не найдены //добавил создание если не найдены
Registry registryUnitB = findRegByUnit(company.getId(), account.getId(), stmt.getContract(), rgs, RegistryUnit.B).orElse(copyRegB(rgs)); Registry registryUnitB = findRegByUnit(company.getId(), account.getId(), stmt.getContract(), rgs, RegistryUnit.B).orElse(copyRegB(rgs));
Registry registryUnitF = findRegByUnit(company.getId(), account.getId(), stmt.getContract(), rgs, RegistryUnit.F).orElse(copyRegF(rgs)); //передаю null т.к. отнимется ниже по коду Registry registryUnitF = findRegByUnit(company.getId(), account.getId(), stmt.getContract(), rgs, RegistryUnit.F).orElse(copyRegF(rgs)); //передаю null т.к. отнимется ниже по коду
@ -277,7 +280,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
.account(account) .account(account)
.designation(RegistryDesignation.A) .designation(RegistryDesignation.A)
.build(); .build();
calcBalance(registry, stmt); calcBalance(registry, stmt, sdf57);
Registry registryB = copyRegB(registry); Registry registryB = copyRegB(registry);
Registry registryF = copyRegF(registry); Registry registryF = copyRegF(registry);
@ -561,7 +564,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
statement.setComment(sdf57.getSpecif()); statement.setComment(sdf57.getSpecif());
statement.setAccountId(accountDeb.getId()); statement.setAccountId(accountDeb.getId());
Currency currency = currencyImdg.getFirstObjectByFieldValues(Map.of("currencyCode", "RUB")); Currency currency = currencyImdg.getFirstObjectByFieldValues(Map.of("currencyCode", sdf57.getPay_val()));
if (currency != null) { if (currency != null) {
statement.setSecurityId(currency.getId()); statement.setSecurityId(currency.getId());
} }
@ -578,7 +581,8 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
return statement; return statement;
} }
private void calcBalance(Registry rgs, Statement statement) { private void calcBalance(Registry rgs, Statement statement, SDf57 sdf57) {
BigDecimal expectedBalance = checkBalanceSendNotification(rgs, sdf57);
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection()); InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
//считаю balance при создании нулевым и исхожу из этого //считаю balance при создании нулевым и исхожу из этого
//При добавлении (на базе изменения statement по sDf57): //При добавлении (на базе изменения statement по sDf57):
@ -599,12 +603,32 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
} }
AccountType accType = IEnumKey.getEnumByKey(AccountType.class, rgs.getAccountType()); AccountType accType = IEnumKey.getEnumByKey(AccountType.class, rgs.getAccountType());
if (!AccountType.Info.equals(accType)) { if (!AccountType.Info.equals(accType)) {
rgs.setCheckBalance(expectedBalance);
rgs.setDiffBalance(safeBD(rgs.getBalance()).subtract(safeBD(rgs.getCheckBalance()))); rgs.setDiffBalance(safeBD(rgs.getBalance()).subtract(safeBD(rgs.getCheckBalance())));
} }
rgs.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme ! смотри описание и ссылка на начало html'ки rgs.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme ! смотри описание и ссылка на начало html'ки
} }
private void updateReg(Statement s, Registry r) { private BigDecimal checkBalanceSendNotification(Registry r, SDf57 sdf57) {
AccountType accType = IEnumKey.getEnumByKey(AccountType.class, r.getAccountType());
BigDecimal expectedBalance = BigDecimalUtil.safeSumBD(
BigDecimalUtil.parse(sdf57.getKt_in()),
BigDecimalUtil.parse(sdf57.getDt_in()));
if (!AccountType.Info.equals(accType)) {
if (safeBD(r.getBalance()).compareTo(expectedBalance) != 0) {
notification.sendNotification(
ObjectType.session,
messageResolver.resolve(ClearingError.Sdf57UnexpectedBalance, sdf57.getId(), r.getId()),
Priority.HIGH);
}
}
return BigDecimalUtil.safeSumBD(
BigDecimalUtil.parse(sdf57.getKt_out()),
BigDecimalUtil.parse(sdf57.getDt_out()));
}
private void updateReg(Statement s, Registry r, SDf57 sdf57) {
BigDecimal expectedBalance = checkBalanceSendNotification(r, sdf57);
InOutDirection direction = IEnumKey.getEnumByKey(InOutDirection.class, s.getInOutDirection()); InOutDirection direction = IEnumKey.getEnumByKey(InOutDirection.class, s.getInOutDirection());
switch (direction) { switch (direction) {
case in -> { case in -> {
@ -618,6 +642,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
} }
AccountType accType = IEnumKey.getEnumByKey(AccountType.class, r.getAccountType()); AccountType accType = IEnumKey.getEnumByKey(AccountType.class, r.getAccountType());
if (!AccountType.Info.equals(accType)) { if (!AccountType.Info.equals(accType)) {
r.setCheckBalance(expectedBalance);
r.setDiffBalance(safeBD(r.getBalance()).subtract(safeBD(r.getCheckBalance()))); r.setDiffBalance(safeBD(r.getBalance()).subtract(safeBD(r.getCheckBalance())));
} }
r.setUpdated(Instant.now()); r.setUpdated(Instant.now());

View file

@ -1,6 +1,8 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
public enum ClrngValidationStored { public enum ClrngValidationStored {
relation, categoryPredefined relation, categoryPredefined,
currency
; ;
} }

View file

@ -0,0 +1,35 @@
package ru.spcex.clearing.service.validation;
import java.util.Optional;
import ru.clearing.classes.statics.data.api.WithCurrency;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule;
public class CurrencyCodeValidationRule implements IValidationRule<ImdgValidationContext<WithCurrency>> {
public static CurrencyCodeValidationRule INSTANCE = new CurrencyCodeValidationRule();
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<WithCurrency> context) {
WithCurrency obj = context.getValidatedObject();
if (TextUtil.isEmpty(obj.currency())) {
return of(ClearingError.CompanyDebitCheck, "null");
}
Imdg<Currency> curImdg = context.obtainMap(IMDGDistributedNames.Map_Currency, Currency.class);
ImdgPredicateBuilder pb = curImdg.predicateBuilder();
Currency currency = curImdg.getFirstObjectByPredicate(
pb.equals("currencyCode", obj.currency())
);
if (currency == null) {
return of(ClearingError.CompanyDebitCheck, obj.currency());
}
context.storeObject(ValidationStored.currency, currency);
return empty();
}
}

View file

@ -1,13 +1,14 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
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.sdf.SDf01; import ru.clearing.classes.statics.data.sdf.SDf01;
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.AccType; import ru.spcex.platform.enumeration.AccType;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
@ -15,10 +16,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidationRule;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
public enum Sdf01NewValidationRule implements IValidationRule<ImdgValidationContext<SDf01>> { public enum Sdf01NewValidationRule implements IValidationRule<ImdgValidationContext<SDf01>> {
CompanyPresent() { CompanyPresent() {
@Override @Override
@ -63,15 +60,6 @@ public enum Sdf01NewValidationRule implements IValidationRule<ImdgValidationCont
context.storeObject(ValidationStored.Sdf01Account, acc); context.storeObject(ValidationStored.Sdf01Account, acc);
return empty(); return empty();
} }
}, CurrencyCodeCheck() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<SDf01> context) {
SDf01 sdf01 = context.getValidatedObject();
if (!IEnumKey.contains(sdf01.getCurr_code(), CurrencyCode.class)) {
return of(ClearingError.CurrencyNotFound, sdf01.getCurr_code());
}
return empty();
}
}, DatIsCurrentDt() { }, DatIsCurrentDt() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yy"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yy");
@Override @Override

View file

@ -1,22 +1,19 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
import java.util.Objects;
import java.util.Optional;
import java.util.function.BiFunction;
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.sdf.SDf57; import ru.clearing.classes.statics.data.sdf.SDf57;
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.CurrencyCode;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; 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.enumeration.IEnumKey;
import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Objects;
import java.util.Optional;
import java.util.function.BiFunction;
public enum Sdf57ValidationRule implements IValidationRule<ImdgValidationContext<SDf57>> { public enum Sdf57ValidationRule implements IValidationRule<ImdgValidationContext<SDf57>> {
CompanyDebOrCredPresent() { CompanyDebOrCredPresent() {
@Override @Override
@ -85,16 +82,6 @@ public enum Sdf57ValidationRule implements IValidationRule<ImdgValidationContext
return check.apply(companyDeb, accountDeb).or(() -> return check.apply(companyDeb, accountDeb).or(() ->
check.apply(companyCred, accountCred)); check.apply(companyCred, accountCred));
} }
},
CurrencyCodeCheck() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<SDf57> context) {
SDf57 sdf57 = context.getValidatedObject();
if (!IEnumKey.contains(sdf57.getPay_val(), CurrencyCode.class)) {
return of(ClearingError.CompanyDebitCheck, sdf57.getPay_val());
}
return empty();
}
}; };
@Override @Override

View file

@ -34,5 +34,5 @@ public enum ValidationStored {
SessionTerminate, SessionTerminate,
RegistrysByContract, SplitDepositMaxNumber RegistrysByContract, currency, SplitDepositMaxNumber
} }