sdf01/sdf57/sdf06 currency
This commit is contained in:
parent
cbad15aab9
commit
3d47b2b2f3
14 changed files with 171 additions and 92 deletions
|
|
@ -0,0 +1,5 @@
|
|||
package ru.clearing.classes.statics.data.api;
|
||||
|
||||
public interface WithCurrency {
|
||||
String currency();
|
||||
}
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
package ru.clearing.classes.statics.data.sdf;
|
||||
|
||||
import java.time.Instant;
|
||||
import ru.clearing.classes.ConstSerializable;
|
||||
import ru.clearing.classes.statics.data.api.WithCurrency;
|
||||
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||
import ru.spcex.platform.classes.base.interfaces.WithAccount;
|
||||
import ru.spcex.platform.classes.base.interfaces.WithFileName;
|
||||
import ru.spcex.platform.classes.base.interfaces.WithMarket;
|
||||
|
||||
import java.time.Instant;
|
||||
|
||||
/**
|
||||
* ДФ-01 Информации о денежных средствах, находящихся на торговых банковских счетах участников клиринга
|
||||
* <p>
|
||||
* 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 String curr_code;
|
||||
|
|
@ -153,4 +153,8 @@ public class SDf01 extends SpcexObjectBase implements WithAccount, WithMarket, W
|
|||
this.generationId = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String currency() {
|
||||
return getCurr_code();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,19 +1,18 @@
|
|||
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.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 Запрос на зачисление/списание денежных средств
|
||||
* <p>
|
||||
* 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 String account;
|
||||
|
|
@ -158,4 +157,8 @@ public class SDf06 extends SpcexObjectBase implements WithFileName {
|
|||
this.pay_val=value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String currency() {
|
||||
return getPay_val();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +1,16 @@
|
|||
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.LocalDate;
|
||||
import ru.clearing.classes.ConstSerializable;
|
||||
import ru.clearing.classes.statics.data.api.WithCurrency;
|
||||
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||
|
||||
/**
|
||||
* ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС)
|
||||
* <p>
|
||||
* DB table: S_DF57
|
||||
**/
|
||||
public class SDf57 extends SpcexObjectBase {
|
||||
public class SDf57 extends SpcexObjectBase implements WithCurrency {
|
||||
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
|
||||
|
||||
private Long dbfId;
|
||||
|
|
@ -429,4 +428,8 @@ public class SDf57 extends SpcexObjectBase {
|
|||
this.kt_out = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String currency() {
|
||||
return getPay_val();
|
||||
}
|
||||
}
|
||||
|
|
@ -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.instrument.issue.EquitySecurity;
|
||||
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.Session;
|
||||
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.service.validation.ClrngValidationStored;
|
||||
import ru.spcex.clearing.service.validation.CompanyByTradingCodeValidationRule;
|
||||
import ru.spcex.clearing.service.validation.CurrencyCodeValidationRule;
|
||||
import ru.spcex.clearing.service.validation.ExecutionDepositValidationRule;
|
||||
import ru.spcex.clearing.service.validation.IdentificationFundsValidationRule;
|
||||
import ru.spcex.clearing.service.validation.MarketIsUValidationRule;
|
||||
|
|
@ -87,6 +89,7 @@ public class ValidationConfig {
|
|||
|
||||
Imdg<Relation> imdgRelation;
|
||||
Imdg<Company> imdgCompany;
|
||||
Imdg<Currency> imdgCurrency;
|
||||
Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
|
||||
Imdg<EquitySecurity> equitySecurityImdg;
|
||||
Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
|
||||
|
|
@ -113,6 +116,7 @@ public class ValidationConfig {
|
|||
public ValidationConfig(ImdgProvider imdgProvider) {
|
||||
this.imdgRelation = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.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.imdgRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
this.imdgSdf20 = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf20, SDf20.class);
|
||||
|
|
@ -265,12 +269,13 @@ public class ValidationConfig {
|
|||
context.setValidatedObject(sDf57);
|
||||
context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
|
||||
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
|
||||
context.addImdg(IMDGDistributedNames.Map_Currency, imdgCurrency);
|
||||
context.setLogPrefix(LogPrefixId.INSTANCE);
|
||||
return new ValidatorImpl<>(context,
|
||||
Sdf57ValidationRule.CompanyDebOrCredPresent,
|
||||
Sdf57ValidationRule.AccountDebOrCredPresent,
|
||||
Sdf57ValidationRule.AccountAndCompanyMatch,
|
||||
Sdf57ValidationRule.CurrencyCodeCheck
|
||||
CurrencyCodeValidationRule.INSTANCE
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
@ -306,12 +311,13 @@ public class ValidationConfig {
|
|||
context.setValidatedObject(sDf01);
|
||||
context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
|
||||
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
|
||||
context.addImdg(IMDGDistributedNames.Map_Currency, imdgCurrency);
|
||||
context.setLogPrefix(LogPrefixId.INSTANCE);
|
||||
return new ValidatorImpl<>(context,
|
||||
Sdf01NewValidationRule.CompanyPresent,
|
||||
Sdf01NewValidationRule.AccountType,
|
||||
Sdf01NewValidationRule.AccountPresent,
|
||||
Sdf01NewValidationRule.CurrencyCodeCheck,
|
||||
CurrencyCodeValidationRule.INSTANCE,
|
||||
Sdf01NewValidationRule.DatIsCurrentDt
|
||||
);
|
||||
};
|
||||
|
|
@ -344,6 +350,7 @@ public class ValidationConfig {
|
|||
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
|
||||
context.addImdg(IMDGDistributedNames.Map_Session, imdgSession);
|
||||
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
|
||||
context.addImdg(IMDGDistributedNames.Map_Currency, imdgCurrency);
|
||||
context.setLogPrefix(LogPrefixId.INSTANCE);
|
||||
return new ValidatorImpl<>(context,
|
||||
Sdf06NewValidationRule.Fields,
|
||||
|
|
@ -352,7 +359,9 @@ public class ValidationConfig {
|
|||
Sdf06NewValidationRule.CompanyAndAccountMatch,
|
||||
Sdf06NewValidationRule.Session,
|
||||
Sdf06NewValidationRule.Balance,
|
||||
Sdf06NewValidationRule.TcrPresent
|
||||
Sdf06NewValidationRule.TcrPresent,
|
||||
CurrencyCodeValidationRule.INSTANCE
|
||||
|
||||
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ public enum ClearingError implements IErrorEnumId {
|
|||
AccountNotFoundB(5217L),
|
||||
MarketIsNotMkr(5217L),
|
||||
BalanceInsufficient(5222L),
|
||||
Sdf57UnexpectedBalance(5435L),
|
||||
TCRegistryNotFound(3022L),
|
||||
WrongField(5004L),
|
||||
GatewayTimeout(6003L),
|
||||
|
|
|
|||
|
|
@ -1,5 +1,15 @@
|
|||
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.LoggerFactory;
|
||||
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.validation.ValidationStored;
|
||||
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.ImdgProvider;
|
||||
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.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
|
||||
public class Sdf01Executor extends AbstractExecutor<SDf01> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
|
@ -246,7 +260,7 @@ public class Sdf01Executor extends AbstractExecutor<SDf01> {
|
|||
stmt.setInSDfId(sdf01.getId());
|
||||
stmt.setInOutSDfType(InOutSDfType.type1.getKey());
|
||||
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) {
|
||||
stmt.setSecurityId(currency.getId());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,14 @@
|
|||
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.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
|
@ -7,6 +16,7 @@ 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.company.Company;
|
||||
import ru.clearing.classes.statics.data.misc.Currency;
|
||||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||
import ru.clearing.classes.statics.data.sdf.SDf06;
|
||||
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.ValidationStored;
|
||||
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.ImdgId;
|
||||
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.utils.enumeration.EnumMessage;
|
||||
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.validation.IValidator;
|
||||
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
|
||||
public class Sdf06Executor {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
|
@ -136,7 +144,7 @@ public class Sdf06Executor {
|
|||
if (needToCreateStatement(err.get())) {
|
||||
stmt = createStatementBySdf06(sDf06,
|
||||
((Company) validator.getStored(ValidationStored.Sdf06Company)).getId(),
|
||||
validator.getStored(ValidationStored.Sdf06Account));
|
||||
validator.getStored(ValidationStored.Sdf06Account), null);
|
||||
}
|
||||
errorSdf07 = createSdf07(sDf06, now, errorResult);
|
||||
errorSdf07.setGenerationId(sdf07GroupId);
|
||||
|
|
@ -151,8 +159,12 @@ public class Sdf06Executor {
|
|||
}
|
||||
Company company = validator.getStored(ValidationStored.Sdf06Company);
|
||||
TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr);
|
||||
Currency currency = validator.getStored(ValidationStored.currency);
|
||||
//проверка существует ли 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);
|
||||
log.debug("Statement created: {}", stmt.getId());
|
||||
if (InOutDirection.out.getKey().equals(stmt.getInOutDirection()) && tradingTimeService.isTradingTime()) {
|
||||
|
|
@ -161,7 +173,7 @@ public class Sdf06Executor {
|
|||
processedApproved(stmt, sDf06, now, sdf07GroupId);
|
||||
if (tcr != null) {
|
||||
dmiService.setProcContract(tcr.getId(),
|
||||
CurrencyCode.RUB.getKey(),
|
||||
CurrencyCode.RUB.getKey(), //fixme???
|
||||
safeBD(sDf06.getSum()),
|
||||
sDf06.getNumber().toString());
|
||||
Optional<AssetTrio> asts = assets.searchMoneyByAccAndCompany(company.getId(), tcr.getMoneyAccountId());
|
||||
|
|
@ -274,7 +286,7 @@ public class Sdf06Executor {
|
|||
processedApproved(stmt, sdf06, updatedTime);
|
||||
Optional<TradingClearingRegistry> tcr = searchTcrOnGatewayResponse(sdf06);
|
||||
dmiService.setProcContract(tcr.map(SpcexObjectBase::getId).orElse(null),
|
||||
CurrencyCode.RUB.getKey(),
|
||||
CurrencyCode.RUB.getKey(), //fixme???
|
||||
safeBD(sdf06.getSum()),
|
||||
sdf06.getNumber().toString()
|
||||
);
|
||||
|
|
@ -337,10 +349,11 @@ public class Sdf06Executor {
|
|||
sDf07.setNumber(sdf06.getNumber());
|
||||
sDf07.setSpec(sdf06.getSpec());
|
||||
sDf07.setResult(result);
|
||||
sDf07.setPay_val(sdf06.getPay_val());
|
||||
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();
|
||||
stmt.setContract(sdf06.getNumber().toString());
|
||||
stmt.setAddresseeId(companyId);
|
||||
|
|
@ -361,20 +374,10 @@ public class Sdf06Executor {
|
|||
stmt.setInOutSDfType(InOutSDfType.type6.getKey());
|
||||
stmt.setClearingDate(LocalDate.now());
|
||||
stmt.setCreated(Instant.now());
|
||||
stmt.setSecurityId(securityId);
|
||||
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) {
|
||||
ImdgValidationContext<SDf06> ctx = new ImdgValidationContext<>();
|
||||
ctx.addImdg(IMDGDistributedNames.Map_Account, accImdg);
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import java.time.Instant;
|
|||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
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.RegistryStatus;
|
||||
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.Section;
|
||||
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.IMessageResolver;
|
||||
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.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
|
||||
public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
||||
|
|
@ -191,6 +193,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
boolean sessionIsPresent = sessionImdg.getFirstObjectByFieldValues(Map.of(
|
||||
"workflowStatus", SessionStatus.ACTV.getKey()
|
||||
)) != null;
|
||||
sdf = sdf.stream().sorted(Comparator.comparing(SpcexObjectBase::getId)).toList();
|
||||
for (SDf57 sdf57 : sdf) {
|
||||
IValidator validator = sDf57Validator.apply(sdf57);
|
||||
Optional<EnumMessage> error = validator.tillFirstError();
|
||||
|
|
@ -241,7 +244,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
.find();
|
||||
AssetTrio asts = amtFound.map(rgs -> {
|
||||
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 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)
|
||||
.designation(RegistryDesignation.A)
|
||||
.build();
|
||||
calcBalance(registry, stmt);
|
||||
calcBalance(registry, stmt, sdf57);
|
||||
Registry registryB = copyRegB(registry);
|
||||
Registry registryF = copyRegF(registry);
|
||||
|
||||
|
|
@ -561,7 +564,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
statement.setComment(sdf57.getSpecif());
|
||||
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) {
|
||||
statement.setSecurityId(currency.getId());
|
||||
}
|
||||
|
|
@ -578,7 +581,8 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
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());
|
||||
//считаю balance при создании нулевым и исхожу из этого
|
||||
//При добавлении (на базе изменения statement по sDf57):
|
||||
|
|
@ -599,12 +603,32 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
}
|
||||
AccountType accType = IEnumKey.getEnumByKey(AccountType.class, rgs.getAccountType());
|
||||
if (!AccountType.Info.equals(accType)) {
|
||||
rgs.setCheckBalance(expectedBalance);
|
||||
rgs.setDiffBalance(safeBD(rgs.getBalance()).subtract(safeBD(rgs.getCheckBalance())));
|
||||
}
|
||||
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());
|
||||
switch (direction) {
|
||||
case in -> {
|
||||
|
|
@ -618,6 +642,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
}
|
||||
AccountType accType = IEnumKey.getEnumByKey(AccountType.class, r.getAccountType());
|
||||
if (!AccountType.Info.equals(accType)) {
|
||||
r.setCheckBalance(expectedBalance);
|
||||
r.setDiffBalance(safeBD(r.getBalance()).subtract(safeBD(r.getCheckBalance())));
|
||||
}
|
||||
r.setUpdated(Instant.now());
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
package ru.spcex.clearing.service.validation;
|
||||
|
||||
public enum ClrngValidationStored {
|
||||
relation, categoryPredefined
|
||||
relation, categoryPredefined,
|
||||
|
||||
currency
|
||||
;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +1,14 @@
|
|||
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.company.Company;
|
||||
import ru.clearing.classes.statics.data.sdf.SDf01;
|
||||
import ru.spcex.clearing.error.ClearingError;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
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.validation.ImdgValidationContext;
|
||||
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.validation.IValidationRule;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Optional;
|
||||
|
||||
public enum Sdf01NewValidationRule implements IValidationRule<ImdgValidationContext<SDf01>> {
|
||||
CompanyPresent() {
|
||||
@Override
|
||||
|
|
@ -63,15 +60,6 @@ public enum Sdf01NewValidationRule implements IValidationRule<ImdgValidationCont
|
|||
context.storeObject(ValidationStored.Sdf01Account, acc);
|
||||
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() {
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yy");
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -1,22 +1,19 @@
|
|||
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.company.Company;
|
||||
import ru.clearing.classes.statics.data.sdf.SDf57;
|
||||
import ru.spcex.clearing.error.ClearingError;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.platform.enumeration.CurrencyCode;
|
||||
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.enumeration.IEnumKey;
|
||||
import ru.spcex.platform.utils.text.TextUtil;
|
||||
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>> {
|
||||
CompanyDebOrCredPresent() {
|
||||
@Override
|
||||
|
|
@ -85,16 +82,6 @@ public enum Sdf57ValidationRule implements IValidationRule<ImdgValidationContext
|
|||
return check.apply(companyDeb, accountDeb).or(() ->
|
||||
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
|
||||
|
|
|
|||
|
|
@ -34,5 +34,5 @@ public enum ValidationStored {
|
|||
|
||||
SessionTerminate,
|
||||
|
||||
RegistrysByContract, SplitDepositMaxNumber
|
||||
RegistrysByContract, currency, SplitDepositMaxNumber
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue