diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/api/WithCurrency.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/api/WithCurrency.java
new file mode 100644
index 000000000..f4c4e9e0d
--- /dev/null
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/api/WithCurrency.java
@@ -0,0 +1,5 @@
+package ru.clearing.classes.statics.data.api;
+
+public interface WithCurrency {
+ String currency();
+}
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf01.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf01.java
index 787b655f7..8333fc162 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf01.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf01.java
@@ -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 Информации о денежных средствах, находящихся на торговых банковских счетах участников клиринга
*
* 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();
+ }
}
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java
index 1f50cb88a..a3549a408 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java
@@ -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 Запрос на зачисление/списание денежных средств
*
* 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();
+ }
}
\ No newline at end of file
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java
index 1ef4c839c..ca5627076 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java
@@ -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 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС)
*
* 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();
+ }
}
\ No newline at end of file
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java
index 2084b1ecf..00ba5eb00 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java
@@ -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 imdgRelation;
Imdg imdgCompany;
+ Imdg imdgCurrency;
Imdg fixedIncomeSecurityImdg;
Imdg equitySecurityImdg;
Imdg 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
+
);
};
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java
index 18e15fab6..84f5bfc38 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java
@@ -44,6 +44,7 @@ public enum ClearingError implements IErrorEnumId {
AccountNotFoundB(5217L),
MarketIsNotMkr(5217L),
BalanceInsufficient(5222L),
+ Sdf57UnexpectedBalance(5435L),
TCRegistryNotFound(3022L),
WrongField(5004L),
GatewayTimeout(6003L),
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java
index 93460adb3..91decea8b 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java
@@ -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 {
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -246,7 +260,7 @@ public class Sdf01Executor extends AbstractExecutor {
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());
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java
index 9d1ba048a..b70c6d293 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java
@@ -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 asts = assets.searchMoneyByAccAndCompany(company.getId(), tcr.getMoneyAccountId());
@@ -274,7 +286,7 @@ public class Sdf06Executor {
processedApproved(stmt, sdf06, updatedTime);
Optional 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 searchTcrOnGatewayResponse(SDf06 sdf06) {
ImdgValidationContext ctx = new ImdgValidationContext<>();
ctx.addImdg(IMDGDistributedNames.Map_Account, accImdg);
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java
index cce76357f..85fa61bd0 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java
@@ -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 {
@@ -191,6 +193,7 @@ public class Sdf57Executor extends AbstractExecutor {
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 error = validator.tillFirstError();
@@ -241,7 +244,7 @@ public class Sdf57Executor extends AbstractExecutor {
.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 {
.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 {
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 {
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 {
}
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 {
}
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());
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ClrngValidationStored.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ClrngValidationStored.java
index 27bbb5eec..0f9299c58 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ClrngValidationStored.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ClrngValidationStored.java
@@ -1,6 +1,8 @@
package ru.spcex.clearing.service.validation;
public enum ClrngValidationStored {
- relation, categoryPredefined
+ relation, categoryPredefined,
+
+ currency
;
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/CurrencyCodeValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/CurrencyCodeValidationRule.java
new file mode 100644
index 000000000..a70c534cd
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/CurrencyCodeValidationRule.java
@@ -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> {
+ public static CurrencyCodeValidationRule INSTANCE = new CurrencyCodeValidationRule();
+
+ @Override
+ public Optional validate(ImdgValidationContext context) {
+ WithCurrency obj = context.getValidatedObject();
+ if (TextUtil.isEmpty(obj.currency())) {
+ return of(ClearingError.CompanyDebitCheck, "null");
+ }
+ Imdg 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();
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf01NewValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf01NewValidationRule.java
index f908342a3..35bba60b6 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf01NewValidationRule.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf01NewValidationRule.java
@@ -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> {
CompanyPresent() {
@Override
@@ -63,15 +60,6 @@ public enum Sdf01NewValidationRule implements IValidationRule validate(ImdgValidationContext 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
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf57ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf57ValidationRule.java
index 4da40da59..29b0230d5 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf57ValidationRule.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf57ValidationRule.java
@@ -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> {
CompanyDebOrCredPresent() {
@Override
@@ -85,16 +82,6 @@ public enum Sdf57ValidationRule implements IValidationRule
check.apply(companyCred, accountCred));
}
- },
- CurrencyCodeCheck() {
- @Override
- public Optional validate(ImdgValidationContext context) {
- SDf57 sdf57 = context.getValidatedObject();
- if (!IEnumKey.contains(sdf57.getPay_val(), CurrencyCode.class)) {
- return of(ClearingError.CompanyDebitCheck, sdf57.getPay_val());
- }
- return empty();
- }
};
@Override
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java
index 2977937c5..4def823d1 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java
@@ -34,5 +34,5 @@ public enum ValidationStored {
SessionTerminate,
- RegistrysByContract, SplitDepositMaxNumber
+ RegistrysByContract, currency, SplitDepositMaxNumber
}