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;
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();
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}

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.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
);
};

View file

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

View file

@ -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());
}

View file

@ -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);

View file

@ -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());

View file

@ -1,6 +1,8 @@
package ru.spcex.clearing.service.validation;
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;
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

View file

@ -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

View file

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