From 3d47b2b2f3df3bf908ee9a8ec1b69e97f0df1249 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 17 Apr 2024 18:35:53 +0300 Subject: [PATCH] sdf01/sdf57/sdf06 currency --- .../statics/data/api/WithCurrency.java | 5 ++ .../classes/statics/data/sdf/SDf01.java | 10 ++-- .../classes/statics/data/sdf/SDf06.java | 15 +++--- .../classes/statics/data/sdf/SDf57.java | 13 +++-- .../clearing/config/ValidationConfig.java | 15 ++++-- .../spcex/clearing/error/ClearingError.java | 1 + .../service/executors/Sdf01Executor.java | 32 +++++++---- .../service/executors/Sdf06Executor.java | 53 ++++++++++--------- .../service/executors/Sdf57Executor.java | 41 +++++++++++--- .../validation/ClrngValidationStored.java | 4 +- .../CurrencyCodeValidationRule.java | 35 ++++++++++++ .../validation/Sdf01NewValidationRule.java | 18 ++----- .../validation/Sdf57ValidationRule.java | 19 ++----- .../service/validation/ValidationStored.java | 2 +- 14 files changed, 171 insertions(+), 92 deletions(-) create mode 100644 clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/api/WithCurrency.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/CurrencyCodeValidationRule.java 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 }