diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/SDFProcessService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/SDFProcessService.java
index ed5d3d1af..e22cfa248 100644
--- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/SDFProcessService.java
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/SDFProcessService.java
@@ -1,33 +1,29 @@
package ru.spcex.clearing.account.service;
+import java.time.Instant;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
-import ru.clearing.classes.statics.data.misc.Notification;
import ru.clearing.classes.statics.data.sdf.SDf52;
import ru.clearing.classes.statics.data.sdf.SDf53;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
-import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationFeedbackRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.AccountStatus;
-import ru.spcex.platform.enumeration.NotificationStatus;
-import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
-import ru.spcex.platform.utils.collection.Pair;
-
-import java.time.Instant;
-import java.util.*;
-import java.util.concurrent.CopyOnWriteArrayList;
@Service
public class SDFProcessService {
@@ -116,6 +112,7 @@ public class SDFProcessService {
newSdf.setDeal(sdf52.getDeal());
newSdf.setDate(sdf52.getDate());
newSdf.setStatus(sdf52.getStatus());
+ newSdf.setAccType(sdf52.getAcc_type());
newSdf.setResult(result);
newSdf.setGenerationTime(now);
newSdf.setGenerationId(sdf52.getGenerationId());
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf53.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf53.java
index ed1038eaa..dce6ce2b8 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf53.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf53.java
@@ -1,12 +1,9 @@
package ru.clearing.classes.statics.data.sdf;
+import java.time.Instant;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;
-import java.math.BigDecimal;
-import java.time.Instant;
-import java.time.LocalDate;
-
/**
* ДФ-53 Квитанция о получении информации о состоянии счета (блокировка/разблокировка/закрытие/открытие)
*
@@ -25,6 +22,7 @@ public class SDf53 extends SpcexObjectBase {
private String fileName;
private Long inSDfId;
private String accName;
+ private String accType;
public String getAccount() {
return account;
@@ -105,4 +103,12 @@ public class SDf53 extends SpcexObjectBase {
public void setAccName(String accName) {
this.accName = accName;
}
+
+ public String getAccType() {
+ return accType;
+ }
+
+ public void setAccType(String accType) {
+ this.accType = accType;
+ }
}
\ No newline at end of file
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MarketCodesBySessionConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MarketCodesBySessionConfig.java
index 59864c9ef..2934b9f6f 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MarketCodesBySessionConfig.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MarketCodesBySessionConfig.java
@@ -1,5 +1,10 @@
package ru.spcex.clearing.config;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.misc.Market;
@@ -9,12 +14,6 @@ import ru.spcex.platform.enumeration.Section;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
@Configuration
public class MarketCodesBySessionConfig {
@@ -28,6 +27,11 @@ public class MarketCodesBySessionConfig {
return new MarketCodesProvider(imdgProvider, Section.FOND, MarketType.SCND);
}
+ @Bean(name = "marketCodesForCurr")
+ public Supplier> marketCodesForCurr(ImdgProvider imdgProvider) {
+ return new MarketCodesProvider(imdgProvider, Section.CURR, MarketType.SCND);
+ }
+
@Bean(name = "marketCodesForT0Primary")
public Supplier> marketCodesForT0Primary(ImdgProvider imdgProvider) {
return new MarketCodesProvider(imdgProvider, Section.FOND, MarketType.PRMR);
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java
index e8fbcecbb..9c695355d 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java
@@ -34,6 +34,7 @@ import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.service.executors.Sdf06Executor;
import ru.spcex.clearing.service.executors.Sdf10Executor;
import ru.spcex.clearing.service.payment.PaymentInstructionOutboundService;
+import ru.spcex.clearing.session.stage.CurrencySession;
import ru.spcex.clearing.session.stage.FinalMkrSession;
import ru.spcex.clearing.session.stage.IntermediateMkrSession;
import ru.spcex.clearing.session.stage.PrimaryAuctionB0Session;
@@ -60,6 +61,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
private final PrimaryAuctionBnSession primaryAuctionBnSession;
private final PrimaryAuctionT0Session primaryAuctionT0Session;
private final SecondaryAuctionT0Session secondaryAuctionT0Session;
+ private final CurrencySession currencySession;
private final PrimaryAuctionB0Session primaryAuctionB0Session;
private final IntermediateMkrSession intermediateMkrSession;
private final FinalMkrSession finalMkrSession;
@@ -80,6 +82,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
RegistryService registryService,
PrimaryAuctionBnSession primaryAuctionBnSession,
SecondaryAuctionT0Session secondaryAuctionT0Session,
+ CurrencySession currencySession,
PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager,
Sdf06Executor sdf06Executor,
Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender, StatementServiceV2 statementService, SessionTerminator sessionTerminator, PaymentInstructionOutboundService pmtOutboundService) {
@@ -90,6 +93,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
this.registryService = registryService;
this.primaryAuctionBnSession = primaryAuctionBnSession;
this.secondaryAuctionT0Session = secondaryAuctionT0Session;
+ this.currencySession = currencySession;
this.primaryAuctionB0Session = primaryAuctionB0Session;
this.primaryAuctionT0Session = primaryAuctionT0Session;
this.intermediateMkrSession = intermediateMkrSession;
@@ -145,6 +149,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
primaryAuctionBnSession.continueSession(req);
primaryAuctionT0Session.continueSession(req);
secondaryAuctionT0Session.continueSession(req);
+ currencySession.continueSession(req);
primaryAuctionB0Session.continueSession(req);
intermediateMkrSession.continueSession(req);
finalMkrSession.continueSession(req);
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf03Creator.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf03Creator.java
index 93d0d2f9a..4ea98f2f6 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf03Creator.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf03Creator.java
@@ -1,5 +1,7 @@
package ru.spcex.clearing.service;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@@ -18,9 +20,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.number.BigDecimalUtil;
import ru.spcex.platform.utils.time.TimeUtil;
-import java.time.Instant;
-import java.time.format.DateTimeFormatter;
-
@Component
public class Sdf03Creator {
private Logger log = LoggerFactory.getLogger(getClass());
@@ -63,6 +62,7 @@ public class Sdf03Creator {
sDf03.setId(idGenerator.nextId());
sDf03.setSeg_type("S");
sDf03.setDoc_type("002");
+ sDf03.setPay_val(paymentInstruction.getCreditLeg_currencyCode());
String strId = paymentInstruction.getId().toString();
String strIdCut = strId.length() > 16 ? strId.substring(strId.length() - 16) : strId;
sDf03.setDocnm_ref(strIdCut);
@@ -104,7 +104,6 @@ public class Sdf03Creator {
sDf03::setRbanknam5);
sDf03.setPay_date(payDateFormatter.format(TimeUtil.toLocalDate(paymentInstruction.getPaymentDate())));
- sDf03.setPay_val("RUR");
String sumDeb = paymentInstruction.getDebitLeg_amount() != null ? paymentInstruction.getDebitLeg_amount().toString() : "";
sDf03.setSum_deb(BigDecimalUtil.limitDecimalPlaces(sumDeb, 2));
sDf03.setSpecif_1(paymentInstruction.getPaymentPurpose());
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/TcrSearcher.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/TcrSearcher.java
index cf128a442..9c23fdebd 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/TcrSearcher.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/TcrSearcher.java
@@ -1,5 +1,6 @@
package ru.spcex.clearing.service;
+import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +13,7 @@ import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ServiceStatus;
+import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
@@ -48,7 +50,44 @@ public class TcrSearcher {
this.accountImdg = accountImdg;
}
- public AnltSearcher.AnltSearch loadByCurrencyAccountId(Long accountId, String currency) {
+
+ public Optional searchByTcr(Long tcrId, String currency) {
+ TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(tcrId);
+ if (tcr == null || (CurrencyCode.RUB.equalsByKey(currency) && tcr.getMoneyAccountId() == null)) {
+ log.warn("couldn't find account by tcr#id={}; currency {}. TCR {}",
+ tcrId, currency, tcr != null ? "found" : "not found");
+ return Optional.empty();
+ }
+ if (CurrencyCode.RUB.equalsByKey(currency)) {
+ Optional acc = Optional.ofNullable(accountImdg.getSingleObjectByID(tcr.getMoneyAccountId()));
+ if (acc.isEmpty()) {
+ log.warn("couldn't find account by tcr#id={}; currency {}. tcr#moneyAccountId {}.",
+ tcrId, currency, tcr.getMoneyAccountId());
+ }
+ return acc;
+ }
+ ImdgPredicateBuilder pb = tcrListImdg.predicateBuilder();
+ TradingClearingRegistryList tcrList = tcrListImdg.getFirstObjectByPredicate(
+ pb.and(
+ pb.equals("tradingClearingRegistryId", tcr.getId()),
+ pb.equals("currency", currency),
+ pb.equals("status", Status.Active.getKey())
+ )
+ );
+ if (tcrList == null || tcrList.getAccountId() == null) {
+ log.warn("couldn't find account by tcr#id={}; currency {}. tcrList {}.",
+ tcrId, currency, tcrList != null ? (tcrList.getId() + " present though.") : "not found");
+ return Optional.empty();
+ }
+ Account acc = accountImdg.getSingleObjectByID(tcrList.getAccountId());
+ if (acc == null) {
+ log.warn("couldn't find account by tcr#id={}; currency {}. tcrList.id={}.",
+ tcrId, currency, tcrList.getId());
+ }
+ return Optional.of(acc);
+ }
+
+ public AnltSearcher.AnltSearch searchByAccountId(Long accountId, String currency) {
AnltSearcher.AnltSearch srchRes = new AnltSearcher.AnltSearch();
ImdgPredicateBuilder pb = tcrImdg.predicateBuilder();
ImdgPredicate sttsPrdct = pb.or(
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java
index 636bdbb23..74ff213b7 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java
@@ -1,5 +1,12 @@
package ru.spcex.clearing.service.builder;
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -11,7 +18,16 @@ import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.platform.enumeration.*;
+import ru.spcex.platform.enumeration.ClearingCategory;
+import ru.spcex.platform.enumeration.CompanyRole;
+import ru.spcex.platform.enumeration.CompanySymbol;
+import ru.spcex.platform.enumeration.CurrencyCode;
+import ru.spcex.platform.enumeration.InOutDirection;
+import ru.spcex.platform.enumeration.RegistryTradingParams;
+import ru.spcex.platform.enumeration.Sender;
+import ru.spcex.platform.enumeration.SpecifFlag;
+import ru.spcex.platform.enumeration.TransactionStatus;
+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;
@@ -20,14 +36,6 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.time.TimeUtil;
-import java.math.BigDecimal;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
public class PaymentInstructionBuilderV2 {
private final static Logger log = LoggerFactory.getLogger(PaymentInstructionBuilderV2.class);
private Registry registry;
@@ -47,6 +55,7 @@ public class PaymentInstructionBuilderV2 {
private static final DateTimeFormatter DATE_FORMATTER_ddMMyy = DateTimeFormatter.ofPattern("ddMMyy");
private Long senderId;
private Long addresseeId;
+ private String currency;
private boolean useCS_BLKD = false;
private Registry am_b;
@@ -113,6 +122,11 @@ public class PaymentInstructionBuilderV2 {
return this;
}
+ public PaymentInstructionBuilderV2 currency(String currency) {
+ this.currency = currency;
+ return this;
+ }
+
public PaymentInstruction build() {
Instant now = Instant.now();
PaymentInstruction payment = new PaymentInstruction();
@@ -175,8 +189,13 @@ public class PaymentInstructionBuilderV2 {
}
payment.setDebit_csAccount(null);
- payment.setCreditLeg_currencyCode(CurrencyCode.RUB.getKey());
- payment.setDebitLeg_currencyCode(CurrencyCode.RUB.getKey());
+ if (currency != null) {
+ payment.setCreditLeg_currencyCode(currency);
+ payment.setDebitLeg_currencyCode(currency);
+ } else {
+ payment.setCreditLeg_currencyCode(CurrencyCode.RUB.getKey());
+ payment.setDebitLeg_currencyCode(CurrencyCode.RUB.getKey());
+ }
payment.setTransactionStatus(TransactionStatus.stld.getKey());
payment.setDocumentNumber(nextDocumentNumber(registry, payment));
payment.setCreditLeg_direction(InOutDirection.out.getKey());
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java
index 73af2f4e6..7bc429dfb 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java
@@ -117,7 +117,7 @@ public class RegistryBuilder {
rgs.setRegistryCode(RegistryUtil.clearingCode(rgs));
if (currency != null) {
- AnltSearcher.AnltSearch anltSearch = tcrSrcher.loadByCurrencyAccountId(account.getId(), currency);
+ AnltSearcher.AnltSearch anltSearch = tcrSrcher.searchByAccountId(account.getId(), currency);
if (anltSearch.isFound()) {
TradingClearingRegistry tcr = anltSearch.getTcr();
rgs.setTradingClearingRegistryId(tcr.getId());
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java
index 24c468396..10c68106d 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java
@@ -1,17 +1,23 @@
package ru.spcex.clearing.service.execution;
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Function;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.execution.ExecutionCurrency;
import ru.clearing.classes.statics.data.misc.Listing;
-import ru.clearing.classes.statics.data.misc.Market;
import ru.clearing.classes.statics.data.misc.STrades;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.security.Security;
@@ -36,15 +42,6 @@ import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.time.TimeUtil;
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.Collection;
-import java.util.Map;
-import java.util.Optional;
-import java.util.function.Function;
-
/**
* ExecutionCurrency - Сделки на Валютной секции
*/
@@ -186,7 +183,7 @@ public class ExecutionCurrencyComponent {
eCurrency.setExchangeExecutionTime(sTrades.getTradeDateTime());
eCurrency.setExchangeExecutionMicroseconds(sTrades.getTradeDateTime()); // todo проверить это дата+время или нет
eCurrency.setPartyTradingClearingRegistryId(rgstr.getId()); // setTradingClearingRegistryId
- eCurrency.setPartyTradingClearingRegistry(sTrades.getAccount()); // todo уточнить rgstr.code/strades.account?
+ eCurrency.setPartyTradingClearingRegistry(rgstr.getCode()); // todo уточнить rgstr.code/strades.account?
eCurrency.setMarket(sTrades.getClassCode());
// { todo нет поля Description и не понятно как искать Market
// Market market = market=market.code ;
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf04Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf04Executor.java
index 3459ff88d..8ab3418be 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf04Executor.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf04Executor.java
@@ -1,5 +1,11 @@
package ru.spcex.clearing.service.executors;
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -15,7 +21,11 @@ import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.clearing.service.model.Result;
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import ru.spcex.clearing.service.registry.RegistryManager;
-import ru.spcex.platform.enumeration.*;
+import ru.spcex.platform.enumeration.AccountType;
+import ru.spcex.platform.enumeration.RegistryDesignation;
+import ru.spcex.platform.enumeration.RegistryInstrumentType;
+import ru.spcex.platform.enumeration.RegistryUnit;
+import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
@@ -23,13 +33,6 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
-import java.math.BigDecimal;
-import java.time.Instant;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Optional;
-
@Service
public class Sdf04Executor extends AbstractExecutor {
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -84,8 +87,10 @@ public class Sdf04Executor extends AbstractExecutor {
//обычно мы ищем по группу sdf04, здесь как будто всегда только одна запись, todo нужно прочекать этот момент
log.debug("Process sdf04 record; sdf04.id: {}", sdf04.getId());
Collection registries;
- Account anltAcc = accountImdg.getFirstObjectBySQL("account = '%s' and accountType = '%s'"
- .formatted(sdf04.getC_acc_deb(), AccountType.Anlt.getKey()));
+ Account anltAcc = accountImdg.getFirstObjectBySQL("account = '%s' and accountType = '%s' and currency = '%s'"
+ .formatted(sdf04.getC_acc_deb(),
+ AccountType.Anlt.getKey(),
+ sdf04.getPay_val()));
// Account tranAcc = accountImdg.getFirstObjectBySQL("account = '%s' and accountType = '%s'"
// .formatted(sdf04.getC_acc_cred(), AccountType.Tran.getKey()));
// //если сдф04 не по аналитическому счету ни по tran счету, выбираем по тому c_acc_deb/c_acc_cred что пришло
@@ -100,7 +105,7 @@ public class Sdf04Executor extends AbstractExecutor {
// registries = selectRegistryForSDF04(acc);
} else {
//в сдф04 указан ANLT или TRAN счет, ищем по контракту
- AnltSearcher.AnltSearch anltSearch = anltSearcher.loadByAnlt(sdf04.getSpecif_1());
+ AnltSearcher.AnltSearch anltSearch = anltSearcher.loadByAnlt(sdf04.getSpecif_1(), sdf04.getPay_val());
if (!anltSearch.isFound()) {
log.error("sdf04.id={} search by specif1 failed {}", sdf04.getId(), msgRslv.resolve(anltSearch.getError()));
registries = Collections.emptyList();
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 6b988bf17..e0927b70f 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
@@ -348,6 +348,8 @@ public class Sdf06Executor {
sDf07.setNumber(sdf06.getNumber());
sDf07.setSpec(sdf06.getSpec());
sDf07.setResult(result);
+ sDf07.setDoc_Date(sdf06.getDoc_Date());
+ sDf07.setDoc_Num(sdf06.getDoc_Num());
sDf07.setPay_val(sdf06.getPay_val());
return sDf07;
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java
index 30cd00265..49fe1010b 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java
@@ -207,7 +207,7 @@ public enum Sdf06NewValidationRule implements IValidationRule executionFondImdg;
+ private final Imdg executionCurrencyImdg;
+ private final Supplier> marketCodes;
+ private SessionMonitor firstReviseMonitor;
+ private SessionMonitor afterPaymentsSdf4And13Monitor;
+ private SessionMonitor afterPaymentsReviseMonitor;
+ private SessionMonitor afterReviseErrorMonitor;
+
+
+ public CurrencySession(
+ ImdgProvider imdgProvider,
+ BalanceRevise balanceRevise,
+ DealsPrepare dealsPrepare,
+ RequirementsAndObligationCreation requirementsAndObligationCreation,
+ ObligationAdmission obligationsAdmission,
+ InclusionObligations inclusionObligations,
+ FormingRegistersOnOS formingRegistersOnOS,
+ FormingPaymentInstructionAssets formingPaymentInstructionAssets,
+ UnlockResources unlockResources,
+ FinishingSession finishingSession,
+ EndStageNotification endStageNotification,
+ IMessageResolver messageResolver,
+ InspectionObligations inspectionObligations,
+ @Qualifier("marketCodesForCurr") Supplier> marketCodes) {
+ super(imdgProvider, messageResolver);
+ this.balanceRevise = balanceRevise;
+ this.dealsPrepare = dealsPrepare;
+ this.requirementsAndObligationCreation = requirementsAndObligationCreation;
+ this.obligationsAdmission = obligationsAdmission;
+ this.inclusionObligations = inclusionObligations;
+ this.formingRegistersOnOS = formingRegistersOnOS;
+ this.formingPaymentInstructionAssets = formingPaymentInstructionAssets;
+ this.unlockResources = unlockResources;
+ this.finishingSession = finishingSession;
+ this.endStageNotification = endStageNotification;
+ this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
+ this.executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class);
+ this.inspectionObligations = inspectionObligations;
+ this.marketCodes = marketCodes;
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ dealsPrepare.searchForExecutions(ExecutionType.ExecutionCurrency);
+ ImdgPredicateBuilder execFondPb = executionCurrencyImdg.predicateBuilder();
+ dealsPrepare.addExecutionCurrencyCondition(execFondPb.regex("settlementCode", "^T0.*$"));
+ dealsPrepare.addExecutionCurrencyCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0])));
+ formingPaymentInstructionAssets.setSessionType(sessionType());
+ inclusionObligations.setSessionType(sessionType());
+ inspectionObligations.setSection(section());
+ finishingSession.setSection(section());
+ finishingSession.setSessionType(sessionType());
+ imdgProvider.waitAvailable();
+ initSessionIfPresent();
+ }
+
+ @Override
+ public void runSession(BaseRequest> req) {
+ if (!startSession()) {
+ return;
+ }
+ StageResult> submit = balanceRevise.submit(new Task<>(TaskType.StartRevise, null));
+ if (!submit.success) {
+ log.error("stage {} error={}", balanceRevise.getClass().getSimpleName(), messageResolver.resolve(submit.error));
+ endSession();
+ } else {
+ log.info("stage BalanceRevise success, waiting for a response from kafka");
+ this.firstReviseMonitor = SessionMonitorFactory.waitRevise();
+ }
+ }
+
+ public void continueSession(BaseRequest> req) {
+ try {
+ if (!isRunning()) {
+ return;
+ }
+ log.info("session is running, stage {}, monitors: {}",
+ currStage.get(),
+ logMonitors(firstReviseMonitor, afterPaymentsSdf4And13Monitor, afterPaymentsReviseMonitor));
+ if (firstReviseMonitor != null && isMonitorPassed(firstReviseMonitor, req.getRequestPayload())) {
+ firstReviseMonitor = null;
+ firstPart();
+ return;
+ }
+ if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) {
+ afterPaymentsSdf4And13Monitor = null;
+ checkStageAndThrow(TaskType.FormingPaymentInstruction);
+ finishPart();
+ return;
+ }
+ if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
+ afterReviseErrorMonitor = null;
+ finishPart();
+ return;
+ }
+ //if (afterPaymentsReviseMonitor != null && isMonitorPassed(afterPaymentsReviseMonitor, req.getRequestPayload())) {
+ // afterPaymentsReviseMonitor = null;
+ // finishPart();
+ //}
+ } catch (StageException e) {
+ //already logged
+ }
+ }
+
+ private void firstPart() {
+ try {
+ if (!checkStage(TaskType.StartRevise)) {
+ log.error("cannot continue session, current stage is {}", currStage.get());
+ throw new StageException();
+ }
+ runStage(TaskType.StartRevisePart1, currSession.getId(), balanceRevise);
+ //stage 1
+ StageResult> dealsPreparationResult;
+ {
+ DealsPreparePayload payload = new DealsPreparePayload();
+ payload.setSessionId(currSession.getId());
+ dealsPreparationResult = runStage(TaskType.DealsPrepare, payload, dealsPrepare);
+ }
+ //stage 2
+ runStage(TaskType.RequirementsAndObligationsCreate, dealsPreparationResult.getStageResult(), requirementsAndObligationCreation);
+ //stage 3
+ runStage(TaskType.ObligationsAdmission, currSession.getId(), obligationsAdmission);
+ //stage 4
+ {
+ InclusionToPoolPayload inclusionToPoolPayload = new InclusionToPoolPayload();
+ inclusionToPoolPayload.setSessionType(currSession.getSessionType());
+ inclusionToPoolPayload.setSessionId(currSession.getId());
+ runStage(TaskType.InclusionToPool, inclusionToPoolPayload, inclusionObligations);
+ }
+ //stage 5
+ {
+ InspectionPoolPayload companyIdPayload = new InspectionPoolPayload();
+ companyIdPayload.setSessionId(currSession.getId());
+ companyIdPayload.setProcessedCompanyId(currSession.getCompanyId());
+ runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations);
+ }
+ //stage 6
+ {
+ FormingRegistersOnOSPayload payload = new FormingRegistersOnOSPayload();
+ payload.setSessionId(currSession.getId());
+ runStage(TaskType.FormingRegistersOnOS, payload, formingRegistersOnOS); //returns Collection
+ }
+ //stage 7
+ StageResult paymentResult = null;
+ {
+ FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload();
+ payload.setSessionId(currSession.getId());
+ paymentResult = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstructionAssets);
+ }
+
+ if (paymentResult.getStageResult().getPaymentInstructions().isEmpty()) {
+ log.info("no payment instructions were created");
+ finishPart();
+ } else {
+ this.afterPaymentsSdf4And13Monitor = SessionMonitorFactory.waitStep7(section());
+ log.info("created {} PaymentInstructions, waiting for {}",
+ paymentResult.getStageResult().getPaymentInstructions().size(),
+ this.afterPaymentsSdf4And13Monitor.allConditions());
+ }
+ } catch (StageException e) {
+ //already logged
+ }
+ }
+
+ public void finishPart() {
+ try {
+ //stage 9 continue revision
+ {
+ StageResult