diff --git a/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl b/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl
new file mode 100644
index 000000000..0b4c78501
--- /dev/null
+++ b/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl
@@ -0,0 +1,467 @@
+
+
+
+
+abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+_0123456789
+
+
+
+// JAVA classes for DB version:
+
+
+
+/* Dictionaries */
+
+
+
+
+/* Business objects */
+
+
+
+
+ // Data types
+
+
+
+
+ // . : -
+ ,
+
+
+
+// ----------------- -
+
+
+
+package ru.clearing.platform.dictionary;
+
+
+/**
+ *
+ *
+ * Dictionary DB table:
+ **/
+public class Dictionary extends AbstractDictionary {
+ private static final long serialVersionUID = ConstDictionarySerializable.serialVersionUID;
+
+
+
+
+}
+
+
+// -- mapstore --
+package ru.spcex.clearing.imdg.dictionary;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.clearing.platform.dictionary.Dictionary;
+import ru.spcex.clearing.imdg.base.DictionaryTMapStore;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+
+@Component
+public class DictionaryMapStore extends DictionaryTMapStore<Dictionary> {
+
+ public DictionaryMapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ @Override
+ public String getMapName() {
+ return IMDGDistributedNames.Map_Dictionary;
+ }
+
+ @Override
+ public String getTableName() {
+ return "";
+ }
+
+ @Override
+ public Dictionary getDictionaryObject() {
+ return new Dictionary();
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+ !! Нестандартное поле !! // FIXME Нестандартный словарь! Требуется писать код вручную.
+
+
+
+
+
+// ------------------ -
+
+
+package ;
+
+import ru.clearing.classes.ConstSerializable;
+import ru.spcex.platform.classes.base.SpcexObjectBase;
+/**
+ *
+ *
+ * DB table:
+ **/
+public class extends SpcexObjectBase {
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+
+
+}
+
+
+//mapstore
+
+// -- mapstore --
+package ru.spcex.clearing.imdg.object;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ;
+import ru.spcex.clearing.imdg.base.TemplateMapStore;
+import ru.spcex.platform.utils.time.TimeUtil;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
+@Component
+public class MapStore extends TemplateMapStore<> {
+
+ public MapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ @Override
+ public String getMapName() {
+ return IMDGDistributedNames.Map_;
+ }
+
+ @Override
+ public String getTableName() {
+ return "";
+ }
+
+ @Override
+ public String[] getFields() {
+ return new String[]{
+
+ };
+ }
+
+ @Override
+ public objectReader(ResultSet resultSet) throws SQLException {
+ object = new ();
+ return object;
+ }
+
+ @Override
+ public Object[] objectToField( object) {
+ Object[] args = new Object[]{
+ };
+ return args;
+ }
+
+}
+
+// todo добавить класс History
+package ;
+
+import ru.clearing.classes.ConstSerializable;
+import ru.clearing.classes.objects.BusinessEvent;
+import java.io.Serial;
+/**
+ * Изменение состояния объекта
+ *
+ * DB table: _HISTORY
+ **/
+public class History extends BusinessEvent<> {
+ @Serial
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+ private object;
+
+ @Override
+ public getObject() {
+ return object;
+ }
+
+ @Override
+ public void setObject( object) {
+ this.object = object;
+ }
+}
+
+// -- History mapstore для журналирования --
+package ru.spcex.clearing.imdg.businessevent;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ;
+import History;
+import ru.spcex.clearing.imdg.base.TemplateEventMapStore;
+import ru.spcex.platform.utils.time.TimeUtil;
+
+@Component
+public class HistoryMapStore extends TemplateEventMapStore<History> {
+
+ public HistoryMapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ @Override
+ public String getMapName() {
+ return IMDGDistributedNames.Map_History;
+ }
+
+ @Override
+ public String getTableName() {
+ return "_HISTORY";
+ }
+
+ @Override
+ public String[] getFields() {
+ return new String[]{"ID","EVENT_TIME", "EVENT_USER_ID", "EVENT_TYPE",
+ _
+ };
+ }
+
+ @Override
+ public Object[] objectToField(History historyLog) {
+ object=historyLog.getObject();
+ Object[] args = new Object[]{
+ historyLog.getId(),
+ TimeUtil.toDateFromInstant(historyLog.getEventTime()),
+ historyLog.getUserId(),
+ historyLog.getEventType(),
+
+ };
+ return args;
+ }
+
+}
+
+
+, "
+
+
+"
+
+
+
+
+object.set(getInstantFromTimestamp(resultSet, "
+
+
+"))
+
+object.set(getLocalDateFromSqlDate(resultSet, "
+
+
+"))
+
+object.set(getLocalTimeFromSqlTime(resultSet, "
+
+
+"))
+
+object.set(resultSet.getObject("
+
+
+", .class))
+;
+
+,
+
+
+
+
+TimeUtil.toDateFromInstant(object.get())
+
+TimeUtil.toDateFromLocalDate(object.get())
+
+TimeUtil.toDateFromLocalTime(object.get())
+
+object.get()
+
+
+
+
+
+
+
+
+
+ // (in parent) private ;
+
+ // DB field:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ private ;
+
+ // DB field:
+
+
+ // (linked to )
+
+
+
+
+
+
+
+
+
+
+
+
+
+ public get() {
+ return ;
+ }
+ public void set( value) {
+ this.=value;
+ }
+
+
+
+
+
+
+
+
+
+
+ public get() {
+ return ;
+ }
+ public void set( value) {
+ this.=value;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ upper
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java
index 367f97bff..e28e28add 100644
--- a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java
+++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java
@@ -26,7 +26,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
-import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.user.User;
import ru.spcex.clearing.backendapi.controller.config.*;
import ru.spcex.clearing.backendapi.controller.queue.account.*;
@@ -60,7 +59,6 @@ import ru.spcex.clearing.test.TestUtils;
import ru.spcex.clearing.test.json.MatcherFactoryWithJson;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
@@ -158,6 +156,7 @@ import static ru.spcex.clearing.test.json.MatcherFactoryWithJson.usingIgnoringFi
WebSecurityTestConfigurer.class,
MessagesTestConfig.class,
Jackson2HttpConverterTestConfig.class})
+//todo может быть указать пакедж а не список контроллеров
@ExtendWith(SpringExtension.class)
@WebMvcTest
//@TestPropertySource(properties = "spring.config.location=D:/repo/mfd/clearing/clearing-parent/backend-api/src/main/resources/")
diff --git a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/securities/MoneyMarketSecurityControllerTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/securities/MoneyMarketSecurityControllerTest.java
index c06d659e1..f79f0469e 100644
--- a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/securities/MoneyMarketSecurityControllerTest.java
+++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/securities/MoneyMarketSecurityControllerTest.java
@@ -1,7 +1,7 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import org.junit.jupiter.api.Test;
-import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
+import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.spcex.clearing.backendapi.controller.queue.AbstractControllerTest;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.MoneyMarketSecurityNewAction;
diff --git a/clearing-parent/backend-api/src/test/resources/meta.json b/clearing-parent/backend-api/src/test/resources/meta.json
index b3bf979e0..a4d163256 100644
--- a/clearing-parent/backend-api/src/test/resources/meta.json
+++ b/clearing-parent/backend-api/src/test/resources/meta.json
@@ -1,6 +1,6 @@
{
- "version": "3.5.0.21",
+ "version": "3.5.0.22",
"enums": {
@@ -2411,7 +2411,7 @@
"destination": "securities/money-securities",
- "class": "ru.clearing.classes.statics.data.misc.MoneyMarketSecurity",
+ "class": "ru.clearing.classes.statics.data.security.MoneyMarketSecurity",
"logUpdates": "true",
@@ -2453,6 +2453,10 @@
{"code": "fullName",
"type": 2,"length": 255,"name": "Полное наименование инструмента","shortname": "Наименование","searchable": true,"sortable": true,"visible": true,"extends": "security"
}
+ ,
+ {"code": "convention",
+ "type": 2,"length": 255,"name": "Нотация наименования инструмента","shortname": "Маска","visible": true
+ }
,
{"code": "securitySymbol",
"type": 2,"length": 255,"name": "Код инструмента","shortname": "Код","searchable": true,"sortable": true,"visible": true,"extends": "security"
@@ -2509,6 +2513,10 @@
{"code": "fullName",
"type": 2,"length": 255,"name": "Полное наименование инструмента","shortname": "Наименование"
}
+ ,
+ {"code": "convention",
+ "type": 2,"length": 255,"name": "Нотация наименования инструмента","shortname": "Маска"
+ }
,
{"code": "lotSize",
"type": 11,"name": "Размер лота","shortname": "Лот","required": true
@@ -2586,6 +2594,10 @@
{"code": "fullName",
"type": 2,"length": 255,"name": "Полное наименование инструмента","shortname": "Наименование"
}
+ ,
+ {"code": "convention",
+ "type": 2,"length": 255,"name": "Нотация наименования инструмента","shortname": "Маска"
+ }
,
{"code": "lotSize",
"type": 11,"name": "Размер лота","shortname": "Лот"
@@ -2654,6 +2666,36 @@
]
}
]
+ }
+ ,
+ "tradedMoneyMarketSecurity": {
+
+ "name": "Инструменты денежного рынка, учавствующие в сделках",
+
+ "destination": "securities/traded-money-securities",
+
+ "class": "ru.clearing.classes.statics.data.misc.TradedMoneyMarketSecurity",
+
+ "table": "traded_money_market_security",
+
+ "fields": [
+ {"code": "securityId",
+ "type": 1,"dbname": "Идентификатор инструмента","name": "Наименование инструмента","shortname": "Инструмент","searchable": true,"sortable": true,"link": "security","linkCode": "shortName"
+ }
+ ,
+ {"code": "shortName",
+ "type": 2,"length": 255,"name": "Краткое наименование инструмента","shortname": "Краткое наименование","searchable": true,"sortable": true,"visible": true,"extends": "security"
+ }
+ ,
+ {"code": "securityCode",
+ "type": 2,"length": 255,"name": "Полный код инструмента со сроком","shortname": "Код инструмента","searchable": true,"sortable": true,"visible": true
+ }
+ ,
+ {"code": "id",
+ "type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true
+ }
+ ]
+
}
,
"equitySecurity": {
@@ -3783,7 +3825,38 @@
"field": "updated","type": 4,"name": "Дата и время изменения записи","shortname": "Изменено","searchable": true,"sortable": true,"ignore": true
}
]
-
+ ,"actions":[
+ {"method":"post",
+
+ "name": "Досрочное изъятие части денежных средств по депозиту МКР",
+
+ "destination": "registries/splitDeposit",
+
+ "confirmation": "contract,outboundAmount,refundDate",
+
+ "fields": [
+ {"code": "contract",
+ "type": 2,"length": 255,"name": "Договор","shortname": "Договор","required": true
+ }
+ ,
+ {"code": "outboundAmount",
+ "type": 10,"name": "Сумма изъятия","shortname": "Сумма","required": true
+ }
+ ,
+ {"code": "refundDate",
+ "type": 6,"name": "Дата возврата","shortname": "Дата","required": true
+ }
+ ,
+ {"code": "comment",
+ "type": 2,"length": 255,"name": "Основание для вывода","shortname": "Основание"
+ }
+ ,
+ {"code": "direction",
+ "type": 1,"name": "Направление","shortname": "Направление","link": "inOutDirection"
+ }
+ ]
+ }
+ ]
}
,
"account": {
@@ -4046,6 +4119,10 @@
{"code": "companyId",
"type": 1,"dbname": "Идентификатор компании","name": "Наименование компании","shortname": "Компания","searchable": true,"sortable": true,"visible": true,"link": "company","linkCode": "shortName"
}
+ ,
+ {"code": "status",
+ "type": 12,"dbname": "Код статуса","name": "Наименование статуса","shortname": "Статус","searchable": true,"sortable": true,"visible": true,"link": "serviceStatus","extends": "account"
+ }
,
{"code": "id",
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true
@@ -4966,7 +5043,11 @@
"name": "Формирование отчетности",
- "fields": []
+ "fields": [
+ {"code": "sessionId",
+ "type": 1,"name": "Клиринговая сессия","shortname": "Сессия","link": "session"
+ }
+ ]
}
,
{"method":"post",
@@ -4975,18 +5056,18 @@
"group": "Обмен с Торговой системой",
- "name": "Выгрузка в торговую систему остатков секции МКР",
+ "name": "Выгрузка в торговую систему остатков по деньгам",
"fields": []
}
,
{"method":"post",
- "destination": "LIMF",
+ "destination": "LIMS",
"group": "Обмен с Торговой системой",
- "name": "Выгрузка в торговую систему остатков Фондовой секции",
+ "name": "Выгрузка в торговую систему остатков по бумагам",
"fields": []
}
@@ -6465,7 +6546,40 @@
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session"
}
]
-
+ ,"actions":[
+ {"method":"post",
+
+ "name": "Вывод денежных средств c регистра инициатора",
+
+ "destination": "payment-instructions/clearing-outbound",
+
+ "fields": [
+ {"code": "senderId",
+ "type": 1,"name": "Участник отправитель","shortname": "Отправитель","link": "company","required": true
+ }
+ ,
+ {"code": "addresseeId",
+ "type": 1,"name": "Участник получатель","shortname": "Получатель","link": "company","required": true
+ }
+ ,
+ {"code": "paymentPurpose",
+ "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение","searchable": true,"sortable": true,"visible": true
+ }
+ ,
+ {"code": "creditLeg_amount",
+ "type": 10,"name": "Сумма отправителя","shortname": "Сумма отправителя","searchable": true,"sortable": true,"visible": true
+ }
+ ,
+ {"code": "creditLeg_accountId",
+ "type": 1,"name": "Наименование счета отправителя","shortname": "Счет отправителя","searchable": true,"sortable": true,"link": "account","ignore": true
+ }
+ ,
+ {"code": "debitLeg_accountId",
+ "type": 1,"name": "Наименование счета получателя","shortname": "Счет получателя","searchable": true,"sortable": true,"link": "account","ignore": true
+ }
+ ]
+ }
+ ]
}
,
"notification": {
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionCommon.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionCommon.java
new file mode 100644
index 000000000..10d252baa
--- /dev/null
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionCommon.java
@@ -0,0 +1,195 @@
+package ru.clearing.classes.statics.data.execution;
+
+import ru.clearing.classes.objects.BusinessObject;
+import ru.spcex.platform.classes.base.interfaces.ExecutionType;
+import ru.spcex.platform.classes.base.interfaces.IExecution;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.time.LocalDate;
+
+public abstract class ExecutionCommon extends BusinessObject implements IExecution {
+ protected Long exchangeExecutionId;
+ protected Instant exchangeExecutionTime;
+ protected LocalDate tradingDate;
+ protected Long tradingClearingRegistryId;
+ protected String market;
+ protected BigDecimal price;
+ protected BigDecimal lots;
+ protected BigDecimal quantity;
+ protected BigDecimal interestAmount;
+ protected String side;
+ protected String settlementCurrency;
+ protected Long companyId;
+ protected Long duration;
+ protected String securityFullName;
+ protected String securitySymbol;
+ protected Long securityId;
+ protected Long counterPartyId;
+ protected String coverageStatus;
+ protected Long sessionId;
+ protected LocalDate clearingDate;
+
+ public abstract ExecutionType type();
+
+ public LocalDate getClearingDate() {
+ return clearingDate;
+ }
+
+ public void setClearingDate(LocalDate value) {
+ this.clearingDate = value;
+ }
+
+ public Long getExchangeExecutionId() {
+ return exchangeExecutionId;
+ }
+
+ public void setExchangeExecutionId(Long value) {
+ this.exchangeExecutionId = value;
+ }
+
+ public String getSide() {
+ return side;
+ }
+
+ public void setSide(String value) {
+ this.side = value;
+ }
+
+ public String getMarket() {
+ return market;
+ }
+
+ public void setMarket(String value) {
+ this.market = value;
+ }
+
+ public LocalDate getTradingDate() {
+ return tradingDate;
+ }
+
+ public void setTradingDate(LocalDate value) {
+ this.tradingDate = value;
+ }
+
+ public String getSecuritySymbol() {
+ return securitySymbol;
+ }
+
+ public void setSecuritySymbol(String value) {
+ this.securitySymbol = value;
+ }
+
+ public Long getSecurityId() {
+ return securityId;
+ }
+
+ public void setSecurityId(Long value) {
+ this.securityId = value;
+ }
+
+ public BigDecimal getInterestAmount() {
+ return interestAmount;
+ }
+
+ public void setInterestAmount(BigDecimal value) {
+ this.interestAmount = value;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public void setPrice(BigDecimal value) {
+ this.price = value;
+ }
+
+ public BigDecimal getLots() {
+ return lots;
+ }
+
+ public void setLots(BigDecimal value) {
+ this.lots = value;
+ }
+
+ public BigDecimal getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(BigDecimal value) {
+ this.quantity = value;
+ }
+
+ public Instant getExchangeExecutionTime() {
+ return exchangeExecutionTime;
+ }
+
+ public void setExchangeExecutionTime(Instant value) {
+ this.exchangeExecutionTime = value;
+ }
+
+ public Long getDuration() {
+ return duration;
+ }
+
+ public void setDuration(Long value) {
+ this.duration = value;
+ }
+
+ public Long getTradingClearingRegistryId() {
+ return tradingClearingRegistryId;
+ }
+
+ public void setTradingClearingRegistryId(Long value) {
+ this.tradingClearingRegistryId = value;
+ }
+
+ public Long getCompanyId() {
+ return companyId;
+ }
+
+ public void setCompanyId(Long value) {
+ this.companyId = value;
+ }
+
+ public Long getCounterPartyId() {
+ return counterPartyId;
+ }
+
+ public void setCounterPartyId(Long value) {
+ this.counterPartyId = value;
+ }
+
+ public String getSecurityFullName() {
+ return securityFullName;
+ }
+
+ public void setSecurityFullName(String value) {
+ this.securityFullName = value;
+ }
+
+ public String getSettlementCurrency() {
+ return settlementCurrency;
+ }
+
+ public void setSettlementCurrency(String value) {
+ this.settlementCurrency = value;
+ }
+
+ public String getCoverageStatus() {
+ return coverageStatus;
+ }
+
+ public void setCoverageStatus(String value) {
+ this.coverageStatus = value;
+ }
+
+ public Long getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(Long value) {
+ this.sessionId = value;
+ }
+
+}
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java
index 5327b6ca6..eba4989d0 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java
@@ -1,103 +1,25 @@
package ru.clearing.classes.statics.data.execution;
-import ru.clearing.classes.objects.BusinessObject;
-import ru.spcex.platform.classes.base.interfaces.IExecution;
+import ru.clearing.classes.ConstSerializable;
+import ru.spcex.platform.classes.base.interfaces.ExecutionType;
import java.math.BigDecimal;
-import java.time.Instant;
import java.time.LocalDate;
-public class ExecutionDeposit extends BusinessObject implements IExecution {
- private Long exchangeExecutionId;
- private Instant exchangeExecutionTime;
- private LocalDate tradingDate;
- private Long tradingClearingRegistryId;
- private String market;
- private BigDecimal price;
- private BigDecimal lots;
- private BigDecimal quantity;
+public class ExecutionDeposit extends ExecutionCommon {
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
private BigDecimal firstLegAmount;
private BigDecimal secondLegAmount;
- private BigDecimal interestAmount;
- private String side;
- private String settlementCurrency;
- private Long companyId;
- private Long duration;
private LocalDate firstLegSettlementDate;
private LocalDate secondLegSettlementDate;
private String firstLegSettlementCode;
private String secondLegSettlementCode;
- private String securityFullName;
- private String securitySymbol;
- private Long securityId;
private String contract;
- private Long counterPartyId;
- private String coverageStatus;
- private Long sessionId;
- private LocalDate clearingDate;
- public Long getExchangeExecutionId() {
- return exchangeExecutionId;
- }
-
- public void setExchangeExecutionId(Long exchangeExecutionId) {
- this.exchangeExecutionId = exchangeExecutionId;
- }
-
- public Instant getExchangeExecutionTime() {
- return exchangeExecutionTime;
- }
-
- public void setExchangeExecutionTime(Instant exchangeExecutionTime) {
- this.exchangeExecutionTime = exchangeExecutionTime;
- }
-
- public LocalDate getTradingDate() {
- return tradingDate;
- }
-
- public void setTradingDate(LocalDate tradingDate) {
- this.tradingDate = tradingDate;
- }
-
- public Long getTradingClearingRegistryId() {
- return tradingClearingRegistryId;
- }
-
- public void setTradingClearingRegistryId(Long tradingClearingRegistryId) {
- this.tradingClearingRegistryId = tradingClearingRegistryId;
- }
-
- public String getMarket() {
- return market;
- }
-
- public void setMarket(String market) {
- this.market = market;
- }
-
- public BigDecimal getPrice() {
- return price;
- }
-
- public void setPrice(BigDecimal price) {
- this.price = price;
- }
-
- public BigDecimal getLots() {
- return lots;
- }
-
- public void setLots(BigDecimal lots) {
- this.lots = lots;
- }
-
- public BigDecimal getQuantity() {
- return quantity;
- }
-
- public void setQuantity(BigDecimal quantity) {
- this.quantity = quantity;
+ @Override
+ public ExecutionType type() {
+ return ExecutionType.ExecutionDeposit;
}
public BigDecimal getFirstLegAmount() {
@@ -116,46 +38,6 @@ public class ExecutionDeposit extends BusinessObject implements IExecution {
this.secondLegAmount = secondLegAmount;
}
- public BigDecimal getInterestAmount() {
- return interestAmount;
- }
-
- public void setInterestAmount(BigDecimal interestAmount) {
- this.interestAmount = interestAmount;
- }
-
- public String getSide() {
- return side;
- }
-
- public void setSide(String side) {
- this.side = side;
- }
-
- public String getSettlementCurrency() {
- return settlementCurrency;
- }
-
- public void setSettlementCurrency(String settlementCurrency) {
- this.settlementCurrency = settlementCurrency;
- }
-
- public Long getCompanyId() {
- return companyId;
- }
-
- public void setCompanyId(Long companyId) {
- this.companyId = companyId;
- }
-
- public Long getDuration() {
- return duration;
- }
-
- public void setDuration(Long duration) {
- this.duration = duration;
- }
-
public LocalDate getFirstLegSettlementDate() {
return firstLegSettlementDate;
}
@@ -188,30 +70,6 @@ public class ExecutionDeposit extends BusinessObject implements IExecution {
this.secondLegSettlementCode = secondLegSettlementCode;
}
- public String getSecurityFullName() {
- return securityFullName;
- }
-
- public void setSecurityFullName(String securityFullName) {
- this.securityFullName = securityFullName;
- }
-
- public String getSecuritySymbol() {
- return securitySymbol;
- }
-
- public void setSecuritySymbol(String securitySymbol) {
- this.securitySymbol = securitySymbol;
- }
-
- public Long getSecurityId() {
- return securityId;
- }
-
- public void setSecurityId(Long securityId) {
- this.securityId = securityId;
- }
-
public String getContract() {
return contract;
}
@@ -219,36 +77,4 @@ public class ExecutionDeposit extends BusinessObject implements IExecution {
public void setContract(String contract) {
this.contract = contract;
}
-
- public Long getCounterPartyId() {
- return counterPartyId;
- }
-
- public void setCounterPartyId(Long counterPartyId) {
- this.counterPartyId = counterPartyId;
- }
-
- public String getCoverageStatus() {
- return coverageStatus;
- }
-
- public void setCoverageStatus(String coverageStatus) {
- this.coverageStatus = coverageStatus;
- }
-
- public Long getSessionId() {
- return sessionId;
- }
-
- public void setSessionId(Long sessionId) {
- this.sessionId = sessionId;
- }
-
- public LocalDate getClearingDate() {
- return clearingDate;
- }
-
- public void setClearingDate(LocalDate clearingDate) {
- this.clearingDate = clearingDate;
- }
}
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java
index 44d95e590..7306327de 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java
@@ -1,8 +1,7 @@
package ru.clearing.classes.statics.data.execution;
import ru.clearing.classes.ConstSerializable;
-import ru.clearing.classes.objects.BusinessObject;
-import ru.spcex.platform.classes.base.interfaces.IExecution;
+import ru.spcex.platform.classes.base.interfaces.ExecutionType;
import java.math.BigDecimal;
import java.time.Instant;
@@ -13,252 +12,75 @@ import java.time.LocalDate;
*
* DB table: EXECUTION_FOND
**/
-public class ExecutionFond extends BusinessObject implements IExecution {
+public class ExecutionFond extends ExecutionCommon {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
- private LocalDate clearingDate;
- private Long exchangeExecutionId;
- private String side;
- private String market;
- private LocalDate tradingDate;
- private String securitySymbol;
- private Long securityId;
- private BigDecimal interestAmount;
private Long exchangeOrderId;
- private BigDecimal price;
private BigDecimal settlementAmount;
- private BigDecimal lots;
- private BigDecimal quantity;
- private Instant exchangeExecutionTime;
- private Long duration;
- private Long tradingClearingRegistryId;
private String comment;
private Long clientCodeId;
private String settlementCode;
- private Long companyId;
- private Long counterPartyId;
- private String securityFullName;
private LocalDate settlementDate;
- private String settlementCurrency;
private Instant exchangeExecutionMicroseconds;
- private String coverageStatus;
- private Long sessionId;
-
- public LocalDate getClearingDate() {
- return clearingDate;
- }
-
- public void setClearingDate(LocalDate value) {
- this.clearingDate = value;
- }
-
- public Long getExchangeExecutionId() {
- return exchangeExecutionId;
- }
-
- public void setExchangeExecutionId(Long value) {
- this.exchangeExecutionId = value;
- }
-
- public String getSide() {
- return side;
- }
-
- public void setSide(String value) {
- this.side = value;
- }
-
- public String getMarket() {
- return market;
- }
-
- public void setMarket(String value) {
- this.market = value;
- }
-
- public LocalDate getTradingDate() {
- return tradingDate;
- }
-
- public void setTradingDate(LocalDate value) {
- this.tradingDate = value;
- }
-
- public String getSecuritySymbol() {
- return securitySymbol;
- }
-
- public void setSecuritySymbol(String value) {
- this.securitySymbol = value;
- }
-
- public Long getSecurityId() {
- return securityId;
- }
-
- public void setSecurityId(Long value) {
- this.securityId = value;
- }
-
- public BigDecimal getInterestAmount() {
- return interestAmount;
- }
-
- public void setInterestAmount(BigDecimal value) {
- this.interestAmount = value;
+ @Override
+ public ExecutionType type() {
+ return ExecutionType.ExecutionFond;
}
public Long getExchangeOrderId() {
return exchangeOrderId;
}
- public void setExchangeOrderId(Long value) {
- this.exchangeOrderId = value;
- }
-
- public BigDecimal getPrice() {
- return price;
- }
-
- public void setPrice(BigDecimal value) {
- this.price = value;
+ public void setExchangeOrderId(Long exchangeOrderId) {
+ this.exchangeOrderId = exchangeOrderId;
}
public BigDecimal getSettlementAmount() {
return settlementAmount;
}
- public void setSettlementAmount(BigDecimal value) {
- this.settlementAmount = value;
- }
-
- public BigDecimal getLots() {
- return lots;
- }
-
- public void setLots(BigDecimal value) {
- this.lots = value;
- }
-
- public BigDecimal getQuantity() {
- return quantity;
- }
-
- public void setQuantity(BigDecimal value) {
- this.quantity = value;
- }
-
- public Instant getExchangeExecutionTime() {
- return exchangeExecutionTime;
- }
-
- public void setExchangeExecutionTime(Instant value) {
- this.exchangeExecutionTime = value;
- }
-
- public Long getDuration() {
- return duration;
- }
-
- public void setDuration(Long value) {
- this.duration = value;
- }
-
- public Long getTradingClearingRegistryId() {
- return tradingClearingRegistryId;
- }
-
- public void setTradingClearingRegistryId(Long value) {
- this.tradingClearingRegistryId = value;
+ public void setSettlementAmount(BigDecimal settlementAmount) {
+ this.settlementAmount = settlementAmount;
}
public String getComment() {
return comment;
}
- public void setComment(String value) {
- this.comment = value;
+ public void setComment(String comment) {
+ this.comment = comment;
}
public Long getClientCodeId() {
return clientCodeId;
}
- public void setClientCodeId(Long value) {
- this.clientCodeId = value;
+ public void setClientCodeId(Long clientCodeId) {
+ this.clientCodeId = clientCodeId;
}
public String getSettlementCode() {
return settlementCode;
}
- public void setSettlementCode(String value) {
- this.settlementCode = value;
- }
-
- public Long getCompanyId() {
- return companyId;
- }
-
- public void setCompanyId(Long value) {
- this.companyId = value;
- }
-
- public Long getCounterPartyId() {
- return counterPartyId;
- }
-
- public void setCounterPartyId(Long value) {
- this.counterPartyId = value;
- }
-
- public String getSecurityFullName() {
- return securityFullName;
- }
-
- public void setSecurityFullName(String value) {
- this.securityFullName = value;
+ public void setSettlementCode(String settlementCode) {
+ this.settlementCode = settlementCode;
}
public LocalDate getSettlementDate() {
return settlementDate;
}
- public void setSettlementDate(LocalDate value) {
- this.settlementDate = value;
- }
-
- public String getSettlementCurrency() {
- return settlementCurrency;
- }
-
- public void setSettlementCurrency(String value) {
- this.settlementCurrency = value;
+ public void setSettlementDate(LocalDate settlementDate) {
+ this.settlementDate = settlementDate;
}
public Instant getExchangeExecutionMicroseconds() {
return exchangeExecutionMicroseconds;
}
- public void setExchangeExecutionMicroseconds(Instant value) {
- this.exchangeExecutionMicroseconds = value;
+ public void setExchangeExecutionMicroseconds(Instant exchangeExecutionMicroseconds) {
+ this.exchangeExecutionMicroseconds = exchangeExecutionMicroseconds;
}
-
- public String getCoverageStatus() {
- return coverageStatus;
- }
-
- public void setCoverageStatus(String value) {
- this.coverageStatus = value;
- }
-
- public Long getSessionId() {
- return sessionId;
- }
-
- public void setSessionId(Long value) {
- this.sessionId = value;
- }
-
}
\ No newline at end of file
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java
index 7aed98446..93836225e 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java
@@ -13,7 +13,7 @@ import java.time.LocalDate;
*
* DB table: REGISTRY
**/
-public class Registry extends BusinessObject {
+public class Registry extends BusinessObject implements Cloneable {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private Long companyId;
@@ -412,4 +412,13 @@ public class Registry extends BusinessObject {
public void setPaymentId(Long paymentId) {
this.paymentId = paymentId;
}
+
+ @Override
+ public Object clone() {
+ try {
+ return super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new RuntimeException("never", e); // it is Cloneable
+ }
+ }
}
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/misc/MoneyMarketSecurity.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/MoneyMarketSecurity.java
similarity index 85%
rename from clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/misc/MoneyMarketSecurity.java
rename to clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/MoneyMarketSecurity.java
index d4e5741ef..7e91af78f 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/misc/MoneyMarketSecurity.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/MoneyMarketSecurity.java
@@ -1,4 +1,4 @@
-package ru.clearing.classes.statics.data.misc;
+package ru.clearing.classes.statics.data.security;
import ru.clearing.classes.statics.data.security.Security;
@@ -11,12 +11,13 @@ import java.time.LocalDate;
* DB table: MONEY_MARKET_SECURITY
**/
public class MoneyMarketSecurity extends Security {
- private Long securityId;// (linked to security)
+ private Long securityId;
private String description;
private LocalDate startDate;
private LocalDate endDate;
private BigDecimal nominalValue;
- private String nominalCurrency; // (linked to currencyCode)
+ private String nominalCurrency;
+ private String convention;
private String termType;
private BigDecimal lotSize;
@@ -68,6 +69,14 @@ public class MoneyMarketSecurity extends Security {
this.nominalCurrency = nominalCurrency;
}
+ public String getConvention() {
+ return convention;
+ }
+
+ public void setConvention(String convention) {
+ this.convention = convention;
+ }
+
public String getTermType() {
return termType;
}
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/misc/MoneyMarketSecurityHistory.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/MoneyMarketSecurityHistory.java
similarity index 88%
rename from clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/misc/MoneyMarketSecurityHistory.java
rename to clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/MoneyMarketSecurityHistory.java
index f24b02f70..98474ad7c 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/misc/MoneyMarketSecurityHistory.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/MoneyMarketSecurityHistory.java
@@ -1,4 +1,4 @@
-package ru.clearing.classes.statics.data.misc;
+package ru.clearing.classes.statics.data.security;
import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.objects.BusinessEvent;
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/TradedMoneyMarketSecurity.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/TradedMoneyMarketSecurity.java
new file mode 100644
index 000000000..e412e01c8
--- /dev/null
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/security/TradedMoneyMarketSecurity.java
@@ -0,0 +1,42 @@
+package ru.clearing.classes.statics.data.security;
+
+import ru.clearing.classes.ConstSerializable;
+import ru.spcex.platform.classes.base.SpcexObjectBase;
+
+/**
+ * Инструменты денежного рынка, учавствующие в сделках
+ *
+ * DB table: TRADED_MONEY_MARKET_SECURITY
+ **/
+public class TradedMoneyMarketSecurity extends SpcexObjectBase {
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+ private Long securityId;
+ private String shortName;
+ private String securityCode;
+
+ public Long getSecurityId() {
+ return securityId;
+ }
+
+ public void setSecurityId(Long value) {
+ this.securityId = value;
+ }
+
+ public String getShortName() {
+ return shortName;
+ }
+
+ public void setShortName(String value) {
+ this.shortName = value;
+ }
+
+ public String getSecurityCode() {
+ return securityCode;
+ }
+
+ public void setSecurityCode(String value) {
+ this.securityCode = value;
+ }
+
+}
\ No newline at end of file
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 91ec6aa4d..7b8cb5e01 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
@@ -11,6 +11,7 @@ public enum ClearingError implements IErrorEnumId {
SecurityNotFound(5416L),
TradingClearingRegistryNotFound(5418L),
TradingClearingRegistryNotActive(5419L),
+ InsecurityObligation(5422L),
NewDealsNotFound(5423L),
;
private final Long id;
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryInfo.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryInfo.java
deleted file mode 100644
index ea1e205f5..000000000
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryInfo.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package ru.spcex.clearing.models;
-
-import ru.spcex.platform.enumeration.RegistryCapacity;
-import ru.spcex.platform.enumeration.RegistryDesignation;
-import ru.spcex.platform.enumeration.RegistryInstrumentType;
-import ru.spcex.platform.enumeration.RegistryUnit;
-
-public record RegistryInfo(RegistryDesignation registryDesignation,
- RegistryInstrumentType registryInstrumentType,
- RegistryCapacity registryCapacity,
- RegistryUnit registryUnit) {
-}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java
new file mode 100644
index 000000000..ce5760087
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java
@@ -0,0 +1,23 @@
+package ru.spcex.clearing.models;
+
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.platform.enumeration.RegistryCapacity;
+import ru.spcex.platform.enumeration.RegistryDesignation;
+import ru.spcex.platform.enumeration.RegistryInstrumentType;
+import ru.spcex.platform.enumeration.RegistryUnit;
+import ru.spcex.platform.utils.enumeration.IEnumKey;
+
+public record RegistryTradingParams(RegistryDesignation registryDesignation,
+ RegistryInstrumentType registryInstrumentType,
+ RegistryCapacity registryCapacity,
+ RegistryUnit registryUnit) {
+
+ public boolean equalByRegistry(Registry registry) {
+ boolean isEqualDesignation = this.registryDesignation == null || IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == this.registryDesignation;
+ boolean isEqualInstrumentType = this.registryInstrumentType == null || IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()) == this.registryInstrumentType;
+ boolean isEqualCapacity = this.registryCapacity == null || IEnumKey.getEnumByKey(RegistryCapacity.class, registry.getRegistryCapacity()) == this.registryCapacity;
+ boolean isEqualUnit = this.registryUnit == null || IEnumKey.getEnumByKey(RegistryUnit.class, registry.getRegistryUnit()) == this.registryUnit;
+ return isEqualDesignation && isEqualInstrumentType && isEqualCapacity && isEqualUnit;
+ }
+
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java
index f6ab3915f..c9b5e79cc 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java
@@ -6,7 +6,7 @@ import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.models.RegistryInfo;
+import ru.spcex.clearing.models.RegistryTradingParams;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
@@ -42,7 +42,7 @@ public class RegistryService {
log.trace("Found tradingClearingRegistry with id: {}", tcrByCompanyId.getId());
Registry registry = new Registry();
tcrByCompanyId.getTradingClearingRegistryType();
- RegistryInfo registryInfo = createRegistryInfoByType(tcrByCompanyId.getTradingClearingRegistryType());
+ RegistryTradingParams registryInfo = createRegistryInfoByType(tcrByCompanyId.getTradingClearingRegistryType());
registry.setRegistryDesignation(registryInfo.registryDesignation().getKey());
registry.setRegistryInstrumentType(registryInfo.registryInstrumentType().getKey());
registry.setRegistryCapacity(registryInfo.registryCapacity().getKey());
@@ -55,20 +55,20 @@ public class RegistryService {
}
- private RegistryInfo createRegistryInfoByType(String type){
+ private RegistryTradingParams createRegistryInfoByType(String type){
TradingClearingRegistryType registryType = IEnumKey.getEnumByKey(TradingClearingRegistryType.class, type);
- RegistryInfo registryInfo = null;
+ RegistryTradingParams registryInfo = null;
//todo спросить про дубль C и T
switch (registryType){
- case Owner_A -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T);
- case Client_B -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.T);
- case Trustee_C, DepoOfShares_T -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.T);
- case TrusteeManager_D -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.A);
- case Issuer_E -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.E, RegistryUnit.R);
- case ToThePlacementOrRedeem_Z -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.Z, RegistryUnit.R);
- case DepoBond_H -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.R);
- case DepoOfTrustedBond_N -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.C, RegistryUnit.R);
- case DepoOfTrustedShares_S -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.C, RegistryUnit.T);
+ case Owner_A -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T);
+ case Client_B -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.T);
+ case Trustee_C, DepoOfShares_T -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.T);
+ case TrusteeManager_D -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.A);
+ case Issuer_E -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.E, RegistryUnit.R);
+ case ToThePlacementOrRedeem_Z -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.Z, RegistryUnit.R);
+ case DepoBond_H -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.R);
+ case DepoOfTrustedBond_N -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.C, RegistryUnit.R);
+ case DepoOfTrustedShares_S -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.C, RegistryUnit.T);
}
return registryInfo;
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java
new file mode 100644
index 000000000..4dd315001
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java
@@ -0,0 +1,58 @@
+package ru.spcex.clearing.service.builder.sql;
+
+import ru.spcex.clearing.models.RegistryTradingParams;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class RegistryCodeSqlBuilder {
+
+ private List registryTradingParams;
+
+ public static RegistryCodeSqlBuilder getInstance(RegistryTradingParams... tradingParams) {
+ return new RegistryCodeSqlBuilder(Arrays.asList(tradingParams));
+ }
+
+ private RegistryCodeSqlBuilder(List tradingParams) {
+ this.registryTradingParams = tradingParams;
+ }
+
+ public String build() {
+ List conditions = new ArrayList<>();
+ for (RegistryTradingParams tradingParams : this.registryTradingParams) {
+ StringBuilder condition = new StringBuilder();
+ boolean wasAddedCondition = false;
+ if (tradingParams.registryDesignation() != null) {
+ condition.append(String.format("registryDesignation = '%s'", tradingParams.registryDesignation().getKey()));
+ wasAddedCondition = true;
+ }
+ if (wasAddedCondition) {
+ condition.append(" and ");
+ wasAddedCondition = false;
+ }
+ if (tradingParams.registryInstrumentType() != null) {
+ condition.append(String.format("registryInstrumentType = '%s'", tradingParams.registryInstrumentType().getKey()));
+ wasAddedCondition = true;
+ }
+ if (wasAddedCondition) {
+ condition.append(" and ");
+ wasAddedCondition = false;
+ }
+ if (tradingParams.registryCapacity() != null) {
+ condition.append(String.format("registryCapacity = '%s'", tradingParams.registryCapacity().getKey()));
+ wasAddedCondition = true;
+ }
+ if (wasAddedCondition) {
+ condition.append(" and ");
+ wasAddedCondition = false;
+ }
+ if (tradingParams.registryUnit() != null) {
+ condition.append(String.format("registryUnit = '%s'", tradingParams.registryUnit().getKey()));
+ }
+ conditions.add(condition);
+ }
+ return conditions.stream().collect(Collectors.joining(") or (", "(", ")"));
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java
index 86b6b740d..72a2f42e8 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java
@@ -11,5 +11,27 @@ public enum TaskType {
* step 1
*/
DealsPrepare,
+ /**
+ * step 2
+ */
+ RequirementsAndObligationsCreate,
+ /**
+ * step 4
+ */
+ InclusionToPool,
+ /**
+ * Step 6: forming Registry on Obligations and Settlement requirements
+ */
+ FormingRegistersOnOS,
+ /**
+ * step 7
+ */
+ FormingPaymentInstruction,
+
+
+ /**
+ * step 8
+ */
+ UnlockResources,
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/DealsPrepare.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/DealsPrepare.java
index 7189e13c2..ab25bb192 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/DealsPrepare.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/DealsPrepare.java
@@ -15,10 +15,14 @@ import ru.spcex.platform.classes.base.interfaces.IExecution;
import ru.spcex.platform.classes.base.interfaces.WithExchangeExecutionId;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
+import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Stream;
@@ -27,6 +31,8 @@ public class DealsPrepare implements ISessionStage {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg executionDepositImdg;
private final Imdg executionFondImdg;
+ private final List execDepositPredicates = new ArrayList<>();
+ private final List execFondPredicates = new ArrayList<>();
@Autowired
public DealsPrepare(ImdgProvider imdgProvider) {
@@ -50,13 +56,24 @@ public class DealsPrepare implements ISessionStage {
private StageResult> prepareDeals(Long sessionId, Long companyId, Long securityId) {
StringBuilder executionDepositSQL = new StringBuilder("sessionId = null");
if (companyId != null) {
- executionDepositSQL.append(" and companyId = ").append(companyId);
+ executionDepositSQL.append(" and companyId = ").append(companyId); //fixme вероятно в ТЗ недостаточно условий для выборки - counterPartyId
}
if (securityId != null) {
executionDepositSQL.append(" and securityId = ").append(securityId);
}
- Collection excDpsts = executionDepositImdg.getCollectionObjectsBySQL(executionDepositSQL.toString());
- Collection excFonds = executionFondImdg.getCollectionObjectsBySQL(executionDepositSQL.toString());
+ ImdgPredicate sqlPredicate = executionFondImdg.predicateBuilder().sql(executionDepositSQL.toString());
+ BiFunction, Imdg>, ImdgPredicate> prdComposer = (imdgPredicates, imdg) -> {
+ ImdgPredicateBuilder pb = imdg.predicateBuilder();
+ if (imdgPredicates.isEmpty()) {
+ return sqlPredicate;
+ } else {
+ return pb.and(sqlPredicate, pb.and(execDepositPredicates.toArray(new ImdgPredicate[0])));
+ }
+ };
+ ImdgPredicate excDepPrct = prdComposer.apply(execDepositPredicates, executionDepositImdg);
+ ImdgPredicate excFondPrct = prdComposer.apply(execFondPredicates, executionFondImdg);
+ Collection excDpsts = executionDepositImdg.getCollectionObjectsByPredicate(excDepPrct);
+ Collection excFonds = executionFondImdg.getCollectionObjectsByPredicate(excFondPrct);
List excs = Stream.concat(excDpsts.stream().map(execToInterface()),
excFonds.stream().map(execToInterface()))
.sorted(Comparator.comparing(WithExchangeExecutionId::getExchangeExecutionId))
@@ -69,11 +86,23 @@ public class DealsPrepare implements ISessionStage {
executionFondImdg.update((ExecutionFond) exc);
}
}
- StageResult> res = new StageResult<>(null, true);
+ StageResult> res = new StageResult<>(null, true);
res.setStageResult(excs);
return res;
}
+ public DealsPrepare addExecutionDepositCondition(ImdgPredicate imdgPredicate) {
+ this.execDepositPredicates.add(imdgPredicate);
+ return this;
+ }
+
+ public DealsPrepare addExecutionFondCondition(ImdgPredicate imdgPredicate) {
+ this.execFondPredicates.add(imdgPredicate);
+ return this;
+ }
+
+
+
private static Function execToInterface() {
return (e) -> e;
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java
new file mode 100644
index 000000000..0867d22af
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java
@@ -0,0 +1,197 @@
+package ru.spcex.clearing.session.stage.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+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.clearing.models.RegistryTradingParams;
+import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
+import ru.spcex.clearing.service.builder.sql.RegistryCodeSqlBuilder;
+import ru.spcex.clearing.session.stage.ISessionStage;
+import ru.spcex.clearing.session.stage.StageResult;
+import ru.spcex.clearing.session.stage.Task;
+import ru.spcex.clearing.session.stage.task.InspectionPoolPayload;
+import ru.spcex.platform.enumeration.RegistryDesignation;
+import ru.spcex.platform.enumeration.RegistryInstrumentType;
+import ru.spcex.platform.enumeration.RegistryUnit;
+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.utils.enumeration.IMessageResolver;
+import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
+
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.List;
+
+@Service
+public class FormingPaymentInstruction implements ISessionStage {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ //todo remove (set all in single method setImdg(provider -> setImdg1();setIdGenerator();...)
+ private ImdgProvider imdgProvider;
+ private ImdgId idGenerator;
+ private Imdg registryImdg;
+ private Imdg paymentInstructionImdg;
+ private KafkaSender kafkaSender;
+ private final IMessageResolver msgResolver = new SimpleMessageResolver();
+
+ @Autowired
+ public FormingPaymentInstruction(ImdgProvider imdgProvider) {
+ this.imdgProvider = imdgProvider;
+ this.idGenerator = imdgProvider.getImdgIdGenerator();
+ this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
+ this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
+ }
+
+ @Override
+ public StageResult submit(Task> task) {
+ InspectionPoolPayload payload = (InspectionPoolPayload) task.getData();
+ switch (task.getTaskType()) {
+ case FormingPaymentInstruction -> {
+ return formingPaymentInstruction(payload.getProcessedCompanyId());
+ }
+ default -> {
+ throw new IllegalStateException("Unknown task type: " + task.getTaskType());
+ }
+ }
+ }
+
+
+ private StageResult formingPaymentInstruction(Long processedCompanyId) {
+ RegistryTradingParams registryTradingParamsL = new RegistryTradingParams(RegistryDesignation.L,
+ RegistryInstrumentType.S, null, RegistryUnit.T);
+ RegistryTradingParams registryTradingParamsC = new RegistryTradingParams(RegistryDesignation.C,
+ RegistryInstrumentType.M, null, null);
+ RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParamsL, registryTradingParamsC);
+ String registryCodeCondition = registryCodeSqlBuilder.build();
+
+ Collection obligations = registryImdg.getCollectionObjectsBySQL(registryCodeCondition);
+
+ List obligationsByMoney = obligations.stream().filter(registry ->
+ new RegistryTradingParams(RegistryDesignation.L, RegistryInstrumentType.M, null, RegistryUnit.T).equalByRegistry(registry))
+ .toList();
+
+ for (Registry obligationByMoney : obligationsByMoney) {
+ String sql = String.format("tradingClearingRegistryId = %s and companyId = %s",
+ obligationByMoney.getTradingClearingRegistryId(), obligationByMoney.getCompanyId());
+ Collection relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql);
+
+ RegistryTradingParams registryTradingParamsF = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.M, null, RegistryUnit.F);
+ RegistryTradingParams registryTradingParamsT = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.M, null, RegistryUnit.T);
+ RegistryTradingParams registryTradingParamsB = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.M, null, RegistryUnit.B);
+
+ for (Registry relatedRegistry : relatedRegistries) {
+ if (registryTradingParamsF.equalByRegistry(relatedRegistry)) {
+ relatedRegistry.setBalance(relatedRegistry.getBalance().subtract(obligationByMoney.getBalance()));
+ } else if (registryTradingParamsT.equalByRegistry(relatedRegistry)) {
+ relatedRegistry.setSettledDebit(relatedRegistry.getSettledDebit().add(obligationByMoney.getBalance()));
+ } else if (registryTradingParamsB.equalByRegistry(relatedRegistry)) {
+ relatedRegistry.setBalance(relatedRegistry.getBalance().add(obligationByMoney.getBalance()));
+ }
+ registryImdg.update(relatedRegistry);
+ }
+ }
+
+ List requirementsByIssue = obligations.stream().filter(registry ->
+ new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.S, null, RegistryUnit.T).equalByRegistry(registry))
+ .toList();
+
+ for (Registry requirementByIssue : requirementsByIssue) {
+ String sql = String.format("tradingClearingRegistryId = %s and companyId = %s",
+ requirementByIssue.getTradingClearingRegistryId(), requirementByIssue.getCompanyId());
+ Collection relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql);
+
+ RegistryTradingParams registryTradingParamsA = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.S, null, RegistryUnit.T);
+
+ for (Registry relatedRegistry : relatedRegistries) {
+ if (registryTradingParamsA.equalByRegistry(relatedRegistry)) {
+ relatedRegistry.setSettledDebit(relatedRegistry.getSettledDebit().add(requirementByIssue.getBalance()));
+ }
+ registryImdg.update(relatedRegistry);
+ }
+ }
+
+ List requirementsByMoney = obligations.stream().filter(registry ->
+ new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, null, RegistryUnit.T).equalByRegistry(registry))
+ .toList();
+
+ for (Registry requirementByMoney : requirementsByMoney) {
+ String sql = String.format("tradingClearingRegistryId = %s and companyId = %s",
+ requirementByMoney.getTradingClearingRegistryId(), requirementByMoney.getCompanyId());
+ Collection relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql);
+
+ RegistryTradingParams registryTradingParamsA = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.M, null, RegistryUnit.T);
+
+ for (Registry relatedRegistry : relatedRegistries) {
+ if (registryTradingParamsA.equalByRegistry(relatedRegistry)) {
+ relatedRegistry.setSettledDebit(relatedRegistry.getSettledDebit().add(requirementByMoney.getBalance()));
+ }
+ registryImdg.update(relatedRegistry);
+ }
+ }
+
+ List obligationsByIssue = obligations.stream().filter(registry ->
+ new RegistryTradingParams(RegistryDesignation.L, RegistryInstrumentType.S, null, RegistryUnit.T).equalByRegistry(registry))
+ .toList();
+
+ for (Registry obligationByIssue : obligationsByIssue) {
+ String sql = String.format("tradingClearingRegistryId = %s and companyId = %s",
+ obligationByIssue.getTradingClearingRegistryId(), obligationByIssue.getCompanyId());
+ Collection relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql);
+
+ RegistryTradingParams registryTradingParamsF = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.S, null, RegistryUnit.F);
+ RegistryTradingParams registryTradingParamsT = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.S, null, RegistryUnit.T);
+ RegistryTradingParams registryTradingParamsB = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.S, null, RegistryUnit.B);
+
+ for (Registry relatedRegistry : relatedRegistries) {
+ if (registryTradingParamsF.equalByRegistry(relatedRegistry)) {
+ relatedRegistry.setBalance(relatedRegistry.getBalance().subtract(obligationByIssue.getBalance()));
+ } else if (registryTradingParamsT.equalByRegistry(relatedRegistry)) {
+ relatedRegistry.setSettledDebit(relatedRegistry.getSettledDebit().add(obligationByIssue.getBalance()));
+ } else if (registryTradingParamsB.equalByRegistry(relatedRegistry)) {
+ relatedRegistry.setBalance(relatedRegistry.getBalance().add(obligationByIssue.getBalance()));
+ }
+ registryImdg.update(relatedRegistry);
+ }
+ }
+
+ for (Registry obligation : obligations) {
+ RegistryTradingParams registryTradingParamsLT = new RegistryTradingParams(RegistryDesignation.L,
+ null, null, RegistryUnit.T);
+ registryCodeCondition = RegistryCodeSqlBuilder.getInstance(registryTradingParamsLT).build();
+ String sqlCondition = String.format("(%s) and securityId = %s and tradingClearingRegistryId = %s and companyId = %s and counterPartyId = %s",
+ registryCodeCondition, obligation.getSecurityId(), obligation.getTradingClearingRegistryId(), obligation.getCompanyId(), obligation.getCounterPartyId());
+ Collection registries = registryImdg.getCollectionObjectsBySQL(sqlCondition);
+
+ BigDecimal sumBalance = registries.stream().map(Registry::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
+ PaymentInstruction paymentInstruction = createPaymentInstruction(obligation, sumBalance);
+ paymentInstructionImdg.insert(paymentInstruction);
+ obligation.setPaymentId(paymentInstruction.getId());
+ registryImdg.update(obligation);
+ }
+
+
+ //todo send message to queue for forming sDf03 and sDf12?
+
+ return new StageResult(null, true);
+ }
+
+ private PaymentInstruction createPaymentInstruction(Registry registry, BigDecimal balance){
+ PaymentInstruction paymentInstruction = new PaymentInstruction();
+ paymentInstruction.setSenderId(registry.getCompanyId());
+ paymentInstruction.setAddresseeId(registry.getCounterPartyId());
+ //todo add builder for paymentInstruction
+ return paymentInstruction;
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java
new file mode 100644
index 000000000..5204abe62
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java
@@ -0,0 +1,119 @@
+package ru.spcex.clearing.session.stage.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.session.stage.ISessionStage;
+import ru.spcex.clearing.session.stage.StageResult;
+import ru.spcex.clearing.session.stage.Task;
+import ru.spcex.clearing.session.stage.task.RegistryOnObligationsAndSettlementRequirementsPayload;
+import ru.spcex.clearing.session.stage.util.RegistryUtil;
+import ru.spcex.platform.enumeration.RegistryDesignation;
+import ru.spcex.platform.enumeration.RegistryInstrumentType;
+import ru.spcex.platform.enumeration.RegistryStatus;
+import ru.spcex.platform.enumeration.RegistryUnit;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgId;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Collection;
+
+@Service
+public class FormingRegistersOnOS implements ISessionStage {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ private final ImdgId idSequence;
+ private final Imdg registryImdg;
+
+ @Autowired
+ public FormingRegistersOnOS(ImdgProvider imdgProvider) {
+ this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
+ this.idSequence = imdgProvider.getImdgIdGenerator();
+
+ }
+
+ @Override
+ public StageResult> submit(Task> task) {
+ RegistryOnObligationsAndSettlementRequirementsPayload payload = (RegistryOnObligationsAndSettlementRequirementsPayload) task.getData();
+ switch (task.getTaskType()) {
+ case FormingRegistersOnOS -> {
+ return createRegistryOnObligationsAndSettlementRequirements(payload.getSessionId());
+ }
+ default -> {
+ throw new IllegalStateException("Unknown task type: " + task.getTaskType());
+ }
+ }
+ }
+
+ /**
+ * Select Registry by: registryCode = [O/T][S/M][*][T] & registryStatus=OK
+ *
+ * @param sessionId
+ * @return
+ */
+ protected Collection selectRegistry(Long sessionId) {
+ String registrySQL = "sessionId = " + sessionId;
+ registrySQL += " and (registryDesignation=" + RegistryDesignation.O.getKey() + " or registryDesignation=" + RegistryDesignation.T.getKey() + ")";
+ registrySQL += " and (registryInstrumentType=" + RegistryInstrumentType.S.getKey() + " or registryInstrumentType=" + RegistryInstrumentType.M.getKey() + ")";
+ registrySQL += " and (registryUnit=" + RegistryUnit.T.getKey() + ")";
+ registrySQL += " and registryStatus=" + RegistryStatus.OK.getKey() + ")";
+ Collection result = registryImdg.getCollectionObjectsBySQL(registrySQL);
+ log.trace("Selected {} registry's by sql: {}", result.size(), registrySQL);
+ return result;
+ }
+
+ protected StageResult> createRegistryOnObligationsAndSettlementRequirements(Long sessionId) {
+ Collection forRegistries = selectRegistry(sessionId);
+ ArrayList newRegistries = new ArrayList<>();
+
+ //todo oreder by обрабатываться группами по полю registry.groupId
+ //todo при перезапуске после незапланированного завершения стадии: надо ли проверять уже созданные регистры и не создавать дубликаты?
+
+ for (Registry registry : forRegistries) {
+ Registry newRegistry = createRegistryFor(registry);
+ newRegistries.add(newRegistry);
+ registryImdg.insert(newRegistry);
+ log.trace("For registry {} (registryCode={}) make new registry {} (registryCode={})",
+ registry.getId(), registry.getRegistryCode(), newRegistry.getId(), newRegistry.getRegistryCode());
+ }
+
+ StageResult> res = new StageResult<>(null, true);
+ res.setStageResult(newRegistries);
+ return res;
+ }
+
+ Registry createRegistryFor(Registry forRegistry) {
+ Registry newRegistry = (Registry) forRegistry.clone();// cloneable
+ newRegistry.setId(idSequence.nextId());
+ newRegistry.setCreated(Instant.now());
+ newRegistry.setUpdated(newRegistry.getCreated());
+
+ String newRegDestination;
+ if (RegistryDesignation.O.equalsByKey(forRegistry.getRegistryDesignation())) {
+ newRegDestination = RegistryDesignation.L.getKey();
+ } else if (RegistryDesignation.T.equalsByKey(forRegistry.getRegistryDesignation())) {
+ newRegDestination = RegistryDesignation.C.getKey();
+ } else {
+ throw new IllegalArgumentException("RegistryDesignation=" + forRegistry.getRegistryDesignation());
+ }
+ newRegistry.setRegistryDesignation(newRegDestination);
+
+ String newRegistryInstrumentType; // по ТЗ не меняется
+ if (RegistryInstrumentType.S.equalsByKey(forRegistry.getRegistryInstrumentType())) {
+ newRegistryInstrumentType = RegistryInstrumentType.S.getKey();
+ } else if (RegistryInstrumentType.M.equalsByKey(forRegistry.getRegistryInstrumentType())) {
+ newRegistryInstrumentType = RegistryInstrumentType.M.getKey();
+ } else {
+ throw new IllegalArgumentException("RegistryInstrumentType=" + forRegistry.getRegistryInstrumentType());
+ }
+ newRegistry.setRegistryInstrumentType(newRegistryInstrumentType);
+
+ newRegistry.setRegistryCode(RegistryUtil.clearingCode(newRegistry));
+ return newRegistry;
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java
new file mode 100644
index 000000000..b3aae427f
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java
@@ -0,0 +1,82 @@
+package ru.spcex.clearing.session.stage.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
+import ru.spcex.clearing.session.stage.ISessionStage;
+import ru.spcex.clearing.session.stage.StageResult;
+import ru.spcex.clearing.session.stage.Task;
+import ru.spcex.clearing.session.stage.task.InclusionToPoolPayload;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgId;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.LocalDate;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+@Service
+public class InclusionObligations implements ISessionStage {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ //todo remove (set all in single method setImdg(provider -> setImdg1();setIdGenerator();...)
+ private ImdgProvider imdgProvider;
+ private ImdgId idGenerator;
+ private Imdg registryImdg;
+ private KafkaSender kafkaSender;
+
+ @Autowired
+ public InclusionObligations(ImdgProvider imdgProvider) {
+ this.imdgProvider = imdgProvider;
+ this.idGenerator = imdgProvider.getImdgIdGenerator();
+ this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
+ }
+
+ @Override
+ public StageResult submit(Task> task) {
+ InclusionToPoolPayload payload = (InclusionToPoolPayload) task.getData();
+ switch (task.getTaskType()) {
+ case InclusionToPool -> {
+ return inclusionToPool(payload.getSessionType(), payload.getCounterPartyId());
+ }
+ default -> {
+ throw new IllegalStateException("Unknown task type: " + task.getTaskType());
+ }
+ }
+ }
+
+
+ private StageResult inclusionToPool(String sessionType, Long counterPartyId) {
+ String sqlCondition = String.format("registryDesignation in ('%s', '%s') and " +
+ "registryInstrumentType in ('%s', '%s') and " +
+ "registryUnit = '%s' and " +
+ "registryStatus = '%s' and " +
+ "settlementDate = '%s' and " +
+ "sessionType = '%s'",
+ "O", "T",
+ "S", "M",
+ "T",
+ "PROC",
+ LocalDate.now(),
+ sessionType);
+ Collection obligations = registryImdg.getCollectionObjectsBySQL(sqlCondition);
+ Map> registryByGroupId = obligations.stream().
+ collect(Collectors.groupingBy(Registry::getGroupId));
+
+ for (Map.Entry> entrySet : registryByGroupId.entrySet()) {
+ log.debug("Processing set of registry with groupId: {}", entrySet.getKey());
+ for (Registry registry : entrySet.getValue()) {
+ registry.setRegistryStatus("POOL");
+ registryImdg.update(registry);
+ }
+ }
+
+ return new StageResult(null, true);
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java
new file mode 100644
index 000000000..47b770347
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java
@@ -0,0 +1,125 @@
+package ru.spcex.clearing.session.stage.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.clearing.error.ClearingError;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
+import ru.spcex.clearing.session.stage.ISessionStage;
+import ru.spcex.clearing.session.stage.StageResult;
+import ru.spcex.clearing.session.stage.Task;
+import ru.spcex.clearing.session.stage.task.InspectionPoolPayload;
+import ru.spcex.platform.enumeration.RegistryDesignation;
+import ru.spcex.platform.enumeration.RegistryInstrumentType;
+import ru.spcex.platform.enumeration.RegistryUnit;
+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.utils.enumeration.EnumMessage;
+import ru.spcex.platform.utils.enumeration.IEnumKey;
+import ru.spcex.platform.utils.enumeration.IMessageResolver;
+import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+@Service
+public class InspectionObligations implements ISessionStage {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ //todo remove (set all in single method setImdg(provider -> setImdg1();setIdGenerator();...)
+ private ImdgProvider imdgProvider;
+ private ImdgId idGenerator;
+ private Imdg registryImdg;
+ private KafkaSender kafkaSender;
+ private final IMessageResolver msgResolver = new SimpleMessageResolver();
+
+ @Autowired
+ public InspectionObligations(ImdgProvider imdgProvider) {
+ this.imdgProvider = imdgProvider;
+ this.idGenerator = imdgProvider.getImdgIdGenerator();
+ this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
+ }
+
+ @Override
+ public StageResult submit(Task> task) {
+ InspectionPoolPayload payload = (InspectionPoolPayload) task.getData();
+ switch (task.getTaskType()) {
+ case InclusionToPool -> {
+ return inspectionPool(payload.getProcessedCompanyId());
+ }
+ default -> {
+ throw new IllegalStateException("Unknown task type: " + task.getTaskType());
+ }
+ }
+ }
+
+
+ private StageResult inspectionPool(Long processedCompanyId) {
+ String sqlCondition = String.format("registryDesignation in ('%s', '%s') and " +
+ "registryInstrumentType in ('%s', '%s') and " +
+ "registryUnit = '%s' and " +
+ "registryStatus = '%s' and " +
+ "settlementDate = '%s'",
+ RegistryDesignation.O.getKey(), RegistryDesignation.T.getKey(),
+ RegistryInstrumentType.S.getKey(), RegistryInstrumentType.M.getKey(),
+ RegistryUnit.T.getKey(),
+ "POOL");
+
+ Collection obligations = registryImdg.getCollectionObjectsBySQL(sqlCondition);
+ Map>> registryByGroupIdAndCompanyId = obligations.stream().
+ collect(Collectors.groupingBy(Registry::getGroupId, Collectors.groupingBy(Registry::getCompanyId)));
+
+ List insecurityGroups = new ArrayList<>();
+ for (Registry currentRegistry : obligations) {
+ if (insecurityGroups.contains(currentRegistry.getGroupId())) {
+ log.debug("Skip insecurity groupId: {}", currentRegistry.getGroupId());
+ continue;
+ }
+ if (IEnumKey.getEnumByKey(RegistryDesignation.class, currentRegistry.getRegistryDesignation()) == RegistryDesignation.A) {
+ String sqlCounterRegistryCondition = String.format("registryDesignation = '%s' and " +
+ "registryInstrumentType in ('%s', '%s') and " +
+ "registryUnit = '%s' and " +
+ "tradingClearingRegistryId = '%s' and " +
+ "companyId = '%s' and ",
+ RegistryDesignation.A,
+ RegistryInstrumentType.S.getKey(), RegistryInstrumentType.M.getKey(),
+ RegistryUnit.F.getKey(),
+ currentRegistry.getTradingClearingRegistryId(),
+ currentRegistry.getCompanyId());
+ Registry counterRegistry = registryImdg.getSingleObjectBySQL(sqlCounterRegistryCondition);
+ if (currentRegistry.getBalance().compareTo(counterRegistry.getBalance()) > 0) {
+ log.warn("{}", msgResolver.resolve(new EnumMessage(ClearingError.InsecurityObligation, currentRegistry.getCompanyId())));
+ insecurityGroups.add(currentRegistry.getGroupId());
+ break;
+ }
+ currentRegistry.setRegistryStatus("OK");
+ registryImdg.update(counterRegistry);
+ }
+ }
+
+ for (Long insecuritiesGroupId : insecurityGroups) {
+ for (Map.Entry> entrySet : registryByGroupIdAndCompanyId.get(insecuritiesGroupId).entrySet()) {
+ if (entrySet.getKey().equals(processedCompanyId)) {
+ for (Registry registry : entrySet.getValue()) {
+ registry.setRegistryStatus("UNCV");
+ registryImdg.update(registry);
+ }
+ } else {
+ for (Registry registry : entrySet.getValue()) {
+ registry.setRegistryStatus("FAIL");
+ registryImdg.update(registry);
+ }
+ }
+ }
+ }
+
+ return new StageResult(null, true);
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java
new file mode 100644
index 000000000..c563c84b5
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java
@@ -0,0 +1,147 @@
+package ru.spcex.clearing.session.stage.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.session.stage.ISessionStage;
+import ru.spcex.clearing.session.stage.StageResult;
+import ru.spcex.clearing.session.stage.Task;
+import ru.spcex.clearing.session.stage.task.UnlockResourcesPayload;
+import ru.spcex.platform.enumeration.RegistryDesignation;
+import ru.spcex.platform.enumeration.RegistryInstrumentType;
+import ru.spcex.platform.enumeration.RegistryUnit;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.util.Collection;
+
+@Service
+public class UnlockResources implements ISessionStage {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ private final Imdg registryImdg;
+
+ @Autowired
+ public UnlockResources(ImdgProvider imdgProvider) {
+ this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
+
+ }
+
+ @Override
+ public StageResult> submit(Task> task) {
+ switch (task.getTaskType()) {
+ case UnlockResources -> {
+ UnlockResourcesPayload payload = (UnlockResourcesPayload) task.getData();
+ return unlockResources(payload.getSdfMode(), payload.getSessionId(),
+ payload.getAccount(),
+ payload.getSecurityId(),
+ payload.getFullNames(),
+ payload.getValue()
+ );
+ }
+ default -> {
+ throw new IllegalStateException("Unknown task type: " + task.getTaskType());
+ }
+ }
+ }
+
+ /**
+ * Select Registry by: account; fullName* / securityId
+ */
+ protected Collection selectRegistry(Long sessionId, String account, Long securityId, Collection fullNames) {
+ ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
+ ImdgPredicate queryPart;
+ if (securityId != null) {
+ queryPart = pb.in("securityId", securityId);
+ } else if (fullNames != null && !fullNames.isEmpty()) {
+ queryPart = pb.in("fullName", fullNames.toArray(new String[fullNames.size()]));
+ } else {
+ throw new IllegalArgumentException("Required securityId or fullNames");
+ }
+ ImdgPredicate query = pb.and(
+ pb.and(
+ pb.equals("sessionId", sessionId),
+ pb.equals("registryDesignation", RegistryDesignation.A.getKey()) // не все нужны, только с этим кодом отфильтруем.
+ ),
+ pb.equals("account", account),
+ queryPart
+ );
+
+ Collection result = registryImdg.getCollectionObjectsByPredicate(query);
+ log.trace("Selected {} registry's by sql: {}", result.size(), query);
+ return result;
+ }
+
+ /**
+ * @param sdfMode UnlockResourcesPayload.sdfMode
+ * @param sessionId
+ * @param account
+ * @param securityId
+ * @param fullNames
+ * @return
+ */
+ protected StageResult> unlockResources(String sdfMode, Long sessionId, String account, Long securityId, Collection fullNames, BigDecimal value) {
+ Collection forRegistries = selectRegistry(sessionId, account, securityId, fullNames);
+
+ //todo при перезапуске после незапланированного завершения стадии: надо ли проверять уже созданные регистры и не создавать дубликаты?
+ if (UnlockResourcesPayload.MODE_SDF04.equals(sdfMode)) {
+ forRegistries = forRegistries.stream().filter(
+ (Registry r) ->
+ RegistryDesignation.A.equalsByKey(r.getRegistryDesignation())
+ &&
+ RegistryInstrumentType.M.equalsByKey(r.getRegistryInstrumentType())
+ &&
+ (RegistryUnit.F.equalsByKey(r.getRegistryUnit()) || RegistryUnit.B.equalsByKey(r.getRegistryUnit()))
+ ).toList();
+ } else if (UnlockResourcesPayload.MODE_SDF12.equals(sdfMode)) {
+ forRegistries = forRegistries.stream().filter(
+ (Registry r) ->
+ RegistryDesignation.A.equalsByKey(r.getRegistryDesignation())
+ &&
+ RegistryInstrumentType.S.equalsByKey(r.getRegistryInstrumentType())
+ &&
+ (RegistryUnit.F.equalsByKey(r.getRegistryUnit()) || RegistryUnit.B.equalsByKey(r.getRegistryUnit()))
+ ).toList();
+ } else {
+ throw new IllegalArgumentException("Mode not support: " + sdfMode);
+ }
+
+ for (Registry registry : forRegistries) {
+ boolean modified = unlockRegistry(registry, value);
+ if (modified) {
+ registry.setUpdated(Instant.now());
+ registryImdg.update(registry);
+ log.trace("Registry {} changed; value +- registry",
+ registry.getId(), registry.getRegistryCode(), value);
+ }
+ }
+ //todo рекомендуется делать транзакцией.
+
+ StageResult> res = new StageResult<>(null, true);
+ res.setStageResult(forRegistries);
+ return res;
+ }
+
+ boolean unlockRegistry(Registry registry, BigDecimal value) {
+ if (RegistryUnit.F.equalsByKey(registry.getRegistryUnit())) {
+ if (registry.getBalance() == null) registry.setBalance(BigDecimal.ZERO);
+ registry.setBalance(registry.getBalance().add(value));
+ return true;
+ } else if (RegistryUnit.B.equalsByKey(registry.getRegistryUnit())) {
+ if (registry.getBalance() == null) registry.setBalance(BigDecimal.ZERO);
+ registry.setBalance(registry.getBalance().subtract(value));
+ return true;
+ } else {
+ log.warn("For registry {} registryUnit={} unlock operation not implemented.",
+ registry.getId(), registry.getRegistryUnit());
+ return false;
+ }
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InclusionToPoolPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InclusionToPoolPayload.java
new file mode 100644
index 000000000..41bba14c6
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InclusionToPoolPayload.java
@@ -0,0 +1,22 @@
+package ru.spcex.clearing.session.stage.task;
+
+public class InclusionToPoolPayload {
+ private String sessionType;
+ private Long counterPartyId;
+
+ public String getSessionType() {
+ return sessionType;
+ }
+
+ public void setSessionType(String sessionType) {
+ this.sessionType = sessionType;
+ }
+
+ public Long getCounterPartyId() {
+ return counterPartyId;
+ }
+
+ public void setCounterPartyId(Long counterPartyId) {
+ this.counterPartyId = counterPartyId;
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InspectionPoolPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InspectionPoolPayload.java
new file mode 100644
index 000000000..66736d104
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InspectionPoolPayload.java
@@ -0,0 +1,13 @@
+package ru.spcex.clearing.session.stage.task;
+
+public class InspectionPoolPayload {
+ private Long processedCompanyId;
+
+ public Long getProcessedCompanyId() {
+ return processedCompanyId;
+ }
+
+ public void setProcessedCompanyId(Long processedCompanyId) {
+ this.processedCompanyId = processedCompanyId;
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java
new file mode 100644
index 000000000..e0ddc15da
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java
@@ -0,0 +1,31 @@
+package ru.spcex.clearing.session.stage.task;
+
+public class RegistryOnObligationsAndSettlementRequirementsPayload {
+ private Long sessionId;
+// private Long companyId;
+// private Long securityId;
+
+ public Long getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(Long sessionId) {
+ this.sessionId = sessionId;
+ }
+
+// public Long getCompanyId() {
+// return companyId;
+// }
+//
+// public void setCompanyId(Long companyId) {
+// this.companyId = companyId;
+// }
+//
+// public Long getSecurityId() {
+// return securityId;
+// }
+//
+// public void setSecurityId(Long securityId) {
+// this.securityId = securityId;
+// }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java
new file mode 100644
index 000000000..1b9525f23
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java
@@ -0,0 +1,88 @@
+package ru.spcex.clearing.session.stage.task;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public class UnlockResourcesPayload {
+ public static final String MODE_SDF04 = "sDf04";
+ public static final String MODE_SDF12 = "sDf12";
+
+ /**
+ * MODE_SDF04/MODE_SDF12
+ */
+ private String sdfMode;
+
+ private Long sessionId;
+
+ /**
+ * sDf04.c_acc_cred
+ * sDf12.depoCodeSender
+ */
+ private String account;
+ /**
+ * sDf04.(sbanknam1, sbanknam2 и т.д.)
+ */
+ private List fullNames;
+
+ /**
+ * sDf12.securityCode
+ */
+ private Long securityId;
+
+ /**
+ * sDf04.pay_val
+ * sDf12.quantity
+ */
+ private BigDecimal value;
+
+
+
+ public String getSdfMode() {
+ return sdfMode;
+ }
+
+ public void setSdfMode(String sdfMode) {
+ this.sdfMode = sdfMode;
+ }
+
+
+ public Long getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(Long sessionId) {
+ this.sessionId = sessionId;
+ }
+
+ public String getAccount() {
+ return account;
+ }
+
+ public void setAccount(String account) {
+ this.account = account;
+ }
+
+ public List getFullNames() {
+ return fullNames;
+ }
+
+ public void setFullNames(List fullNames) {
+ this.fullNames = fullNames;
+ }
+
+ public Long getSecurityId() {
+ return securityId;
+ }
+
+ public void setSecurityId(Long securityId) {
+ this.securityId = securityId;
+ }
+
+ public BigDecimal getValue() {
+ return value;
+ }
+
+ public void setValue(BigDecimal value) {
+ this.value = value;
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/util/RegistryUtil.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/util/RegistryUtil.java
new file mode 100644
index 000000000..4361b6d4b
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/util/RegistryUtil.java
@@ -0,0 +1,43 @@
+package ru.spcex.clearing.session.stage.util;
+
+import org.apache.commons.lang3.StringUtils;
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.platform.enumeration.RegistryCapacity;
+import ru.spcex.platform.enumeration.RegistryDesignation;
+import ru.spcex.platform.enumeration.RegistryInstrumentType;
+import ru.spcex.platform.enumeration.RegistryUnit;
+
+import java.util.*;
+
+public class RegistryUtil {
+
+
+ public static String clearingCode(Registry ofRegistry) {
+ return clearingCode(ofRegistry.getRegistryDesignation(), ofRegistry.getRegistryInstrumentType(), ofRegistry.getRegistryCapacity(), ofRegistry.getRegistryUnit());
+ }
+
+ public static String clearingCode(String registryDesignation, String registryInstrumentType, String registryCapacity, String registryUnit) {
+ if (StringUtils.isEmpty(registryDesignation)) registryDesignation = "-";
+ if (StringUtils.isEmpty(registryInstrumentType)) registryInstrumentType = "-";
+ if (StringUtils.isEmpty(registryCapacity)) registryCapacity = "-";
+ if (StringUtils.isEmpty(registryUnit)) registryUnit = "-";
+ return registryDesignation + registryInstrumentType + registryCapacity + registryUnit;
+ }
+
+ public static String clearingCode(RegistryDesignation registryDesignation, RegistryInstrumentType registryInstrumentType, RegistryCapacity registryCapacity, RegistryUnit registryUnit) {
+ return registryDesignation.getKey() + registryInstrumentType.getKey() + registryCapacity.getKey() + registryUnit.getKey();
+ }
+
+ public static Map> groupByGroupId(Collection registries) {
+ HashMap> groups = new HashMap<>();
+ for (Registry reg : registries) {
+ List lst = groups.get(reg.getGroupId());
+ if (lst == null) {
+ lst = new ArrayList<>();
+ groups.put(reg.getGroupId(), lst);
+ }
+ lst.add(reg);
+ }
+ return groups;
+ }
+}
diff --git a/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java
new file mode 100644
index 000000000..ca1c7b68c
--- /dev/null
+++ b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java
@@ -0,0 +1,54 @@
+package ru.spcex.clearing.service.builder.sql;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import ru.spcex.clearing.models.RegistryTradingParams;
+import ru.spcex.platform.enumeration.RegistryCapacity;
+import ru.spcex.platform.enumeration.RegistryDesignation;
+import ru.spcex.platform.enumeration.RegistryInstrumentType;
+import ru.spcex.platform.enumeration.RegistryUnit;
+
+public class RegistryCodeSqlBuilderTest {
+
+ @Test
+ public void testBuildByOneObject() {
+ RegistryTradingParams registryTradingParams = new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R);
+ RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams);
+ String sql = registryCodeSqlBuilder.build();
+ Assertions.assertEquals("(registryDesignation = 'C' and registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')", sql);
+
+ registryTradingParams = new RegistryTradingParams(null, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R);
+ registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams);
+ sql = registryCodeSqlBuilder.build();
+ Assertions.assertEquals("(registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')", sql);
+
+ registryTradingParams = new RegistryTradingParams(RegistryDesignation.C, null, null, RegistryUnit.R);
+ registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams);
+ sql = registryCodeSqlBuilder.build();
+ Assertions.assertEquals("(registryDesignation = 'C' and registryUnit = 'R')", sql);
+ }
+
+ @Test
+ public void testBuildByFewObjects() {
+ RegistryTradingParams registryTradingParams_first = new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R);
+ RegistryTradingParams registryTradingParams_second = new RegistryTradingParams(RegistryDesignation.O, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F);
+ RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second);
+ String sql = registryCodeSqlBuilder.build();
+ Assertions.assertEquals("(registryDesignation = 'C' and registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')" +
+ " or (registryDesignation = 'O' and registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql);
+
+ registryTradingParams_first = new RegistryTradingParams(null, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R);
+ registryTradingParams_second = new RegistryTradingParams(null, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F);
+ registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second);
+ sql = registryCodeSqlBuilder.build();
+ Assertions.assertEquals("(registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R') or " +
+ "(registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql);
+
+ registryTradingParams_first = new RegistryTradingParams(RegistryDesignation.C, null, null, RegistryUnit.R);
+ registryTradingParams_second = new RegistryTradingParams(null, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F);
+ registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second);
+ sql = registryCodeSqlBuilder.build();
+ Assertions.assertEquals("(registryDesignation = 'C' and registryUnit = 'R') or " +
+ "(registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql);
+ }
+}
diff --git a/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/session/stage/util/RegistryUtilTest.java b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/session/stage/util/RegistryUtilTest.java
new file mode 100644
index 000000000..d423313bd
--- /dev/null
+++ b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/session/stage/util/RegistryUtilTest.java
@@ -0,0 +1,25 @@
+package ru.spcex.clearing.session.stage.util;
+
+import org.junit.jupiter.api.Test;
+import ru.clearing.classes.statics.data.registry.Registry;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class RegistryUtilTest {
+
+ @Test
+ void clearingCode1() {
+ assertEquals("OMAT", RegistryUtil.clearingCode("O", "M", "A", "T"));
+ assertEquals("O-A-", RegistryUtil.clearingCode("O", "", "A", null));
+ }
+
+ @Test
+ void clearingCode2() {
+ Registry reg = new Registry();
+ reg.setRegistryDesignation("O");
+ reg.setRegistryInstrumentType("M");
+ reg.setRegistryCapacity("A");
+ reg.setRegistryUnit("T");
+ assertEquals("OMAT", RegistryUtil.clearingCode(reg));
+ }
+}
\ No newline at end of file
diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java
index 43c6e0e0a..f73172da4 100644
--- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java
+++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java
@@ -65,6 +65,7 @@ public record FieldRequiredRule(
}
@Override
+ // todo replace for error fieldName to fieldValue
public Optional validate(ImdgValidationContext context) {
R validatedObject = context.getValidatedObject();
V value = getter.apply(validatedObject);
diff --git a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql
index fc80f1e1c..cb3537967 100644
--- a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql
+++ b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql
@@ -1,4 +1,4 @@
--- DB version: 3.5.0.21
+-- DB version: 3.5.0.22
/* Dictionaries */
-- allowed - Справочник признаков допустимости использования объектов
@@ -1164,7 +1164,7 @@ COMMENT ON COLUMN CURRENCY_HISTORY.ID IS 'Идентификатор запис
-- moneyMarketSecurity - Инструменты Денежного рынка
DROP TABLE IF EXISTS MONEY_MARKET_SECURITY;
-CREATE TABLE MONEY_MARKET_SECURITY(SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,18), NOMINAL_CURRENCY varchar(4), TERM_TYPE varchar(4), ID bigint PRIMARY KEY);
+CREATE TABLE MONEY_MARKET_SECURITY(SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,18), NOMINAL_CURRENCY varchar(4), CONVENTION varchar(255), TERM_TYPE varchar(4), ID bigint PRIMARY KEY);
COMMENT ON TABLE MONEY_MARKET_SECURITY IS 'Инструменты Денежного рынка';
COMMENT ON COLUMN MONEY_MARKET_SECURITY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)';
@@ -1179,6 +1179,8 @@ COMMENT ON COLUMN MONEY_MARKET_SECURITY.NOMINAL_VALUE IS 'Номинал';
COMMENT ON COLUMN MONEY_MARKET_SECURITY.NOMINAL_CURRENCY IS 'Код валюты номинала (linked to currencyCode)';
+COMMENT ON COLUMN MONEY_MARKET_SECURITY.CONVENTION IS 'Нотация наименования инструмента';
+
COMMENT ON COLUMN MONEY_MARKET_SECURITY.TERM_TYPE IS 'Код вида инструмента (linked to termType)';
COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Идентификатор записи';
@@ -1186,7 +1188,7 @@ COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Идентификатор зап
-- History log of moneyMarketSecurity - Инструменты Денежного рынка
DROP TABLE IF EXISTS MONEY_MARKET_SECURITY_HISTORY;
-CREATE TABLE MONEY_MARKET_SECURITY_HISTORY(MONEY_MARKET_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,18), NOMINAL_CURRENCY varchar(4), TERM_TYPE varchar(4), ID bigint PRIMARY KEY);
+CREATE TABLE MONEY_MARKET_SECURITY_HISTORY(MONEY_MARKET_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,18), NOMINAL_CURRENCY varchar(4), CONVENTION varchar(255), TERM_TYPE varchar(4), ID bigint PRIMARY KEY);
COMMENT ON TABLE MONEY_MARKET_SECURITY_HISTORY IS 'История изменений таблицы moneyMarketSecurity';
COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.MONEY_MARKET_SECURITY_ID IS 'Идентификатор записи в таблице MONEY_MARKET_SECURITY';
COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.EVENT_TIME IS 'Дата и время изменения';
@@ -1205,10 +1207,23 @@ COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.NOMINAL_VALUE IS 'Номинал
COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.NOMINAL_CURRENCY IS 'Код валюты номинала (linked to currencyCode)';
+COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.CONVENTION IS 'Нотация наименования инструмента';
+
COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.TERM_TYPE IS 'Код вида инструмента (linked to termType)';
COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.ID IS 'Идентификатор записи';
+-- tradedMoneyMarketSecurity - Инструменты денежного рынка, учавствующие в сделках
+DROP TABLE IF EXISTS TRADED_MONEY_MARKET_SECURITY;
+CREATE TABLE TRADED_MONEY_MARKET_SECURITY(SECURITY_ID bigint, SECURITY_CODE varchar(255), ID bigint PRIMARY KEY);
+COMMENT ON TABLE TRADED_MONEY_MARKET_SECURITY IS 'Инструменты денежного рынка, учавствующие в сделках';
+
+COMMENT ON COLUMN TRADED_MONEY_MARKET_SECURITY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)';
+
+COMMENT ON COLUMN TRADED_MONEY_MARKET_SECURITY.SECURITY_CODE IS 'Полный код инструмента со сроком';
+
+COMMENT ON COLUMN TRADED_MONEY_MARKET_SECURITY.ID IS 'Идентификатор записи';
+
-- equitySecurity - Акции
DROP TABLE IF EXISTS EQUITY_SECURITY;
CREATE TABLE EQUITY_SECURITY(SECURITY_ID bigint, SHARE_TYPE varchar(4), ID bigint PRIMARY KEY);
diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/AccountBalanceHistoryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/AccountBalanceHistoryMapStore.java
deleted file mode 100644
index f120be004..000000000
--- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/AccountBalanceHistoryMapStore.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package ru.spcex.clearing.imdg.businessevent;
-
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.stereotype.Component;
-import ru.clearing.classes.statics.data.account.AccountBalance;
-import ru.clearing.classes.statics.data.account.AccountBalanceHistory;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.imdg.base.TemplateEventMapStore;
-import ru.spcex.platform.utils.time.TimeUtil;
-
-@Deprecated
-//@Component
-public class AccountBalanceHistoryMapStore extends TemplateEventMapStore {
-
- public AccountBalanceHistoryMapStore(JdbcTemplate jdbcTemplate) {
- super(jdbcTemplate);
- }
-
- @Override
- public String getMapName() {
- return IMDGDistributedNames.Map_AccountBalanceHistory;
- }
-
- @Override
- public String getTableName() {
- return "ACCOUNT_BALANCE_HISTORY";
- }
-
- @Override
- public String[] getFields() {
- return new String[]{"ID", "EVENT_TIME", "EVENT_TYPE", "EVENT_USER_ID",
- "ACCOUNT_BALANCE_ID", "COMPANY_ID", "CREATED_AT", "UPDATED_AT", "ACCOUNT_ID", "ACCOUNT_TYPE",
- "ACCOUNT", "OPEN_BALANCE_AMOUNT", "START_BALANCE_AMOUNT", "CLOSE_BALANCE_AMOUNT",
- "TRADE_BALANCE_AMOUNT", "FREE_BALANCE_AMOUNT", "CHANGE_BALANCE_AMOUNT",
- "CREDIT_AMOUNT", "DEBIT_AMOUNT", "BALANCE_AMOUNT", "BALANCE_ACCOUNT_TYPE",
- "CLEARING_DATE", "CURRENCY_CODE", "TRADING_CODE", "SHORT_NAME", "FULL_NAME"
- };
- }
-
- @Override
- public Object[] objectToField(AccountBalanceHistory updateLog) {
- AccountBalance object = updateLog.getObject();
- Object[] args = new Object[]{
- updateLog.getId(),
- TimeUtil.toDateFromInstant(updateLog.getEventTime()),
- updateLog.getEventType(),
- updateLog.getUserId(),
-
- object.getId(),
- object.getCompanyId(),
- TimeUtil.toDateFromInstant(object.getCreated()),
- TimeUtil.toDateFromInstant(object.getUpdated()),
- object.getAccountId(),
- object.getAccountType(),
- object.getAccount(),
- object.getOpenBalanceAmount(),
- object.getStartBalanceAmount(),
- object.getCloseBalanceAmount(),
- object.getTradeBalanceAmount(),
- object.getFreeBalanceAmount(),
- object.getChangeBalanceAmount(),
- object.getCreditAmount(),
- object.getDebitAmount(),
- object.getBalanceAmount(),
- object.getBalanceAccountType(),
- TimeUtil.toDateFromLocalDate(object.getClearingDate()),
- object.getCurrencyCode(),
- object.getTradingCode(),
- object.getShortName(),
- object.getFullName()
- };
- return args;
- }
-
-}
diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/MoneyMarketSecurityHistoryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/MoneyMarketSecurityHistoryMapStore.java
index 9d2cae9ad..bcba1991d 100644
--- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/MoneyMarketSecurityHistoryMapStore.java
+++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/MoneyMarketSecurityHistoryMapStore.java
@@ -3,15 +3,10 @@ package ru.spcex.clearing.imdg.businessevent;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
-import ru.clearing.classes.statics.data.misc.MoneyMarketSecurityHistory;
-import ru.spcex.clearing.imdg.base.TemplateEventMapStore;
+import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
+import ru.clearing.classes.statics.data.security.MoneyMarketSecurityHistory;
import ru.spcex.platform.utils.time.TimeUtil;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
@Component
public class MoneyMarketSecurityHistoryMapStore extends ASecurityHistoryMapStore {
@@ -34,7 +29,7 @@ public class MoneyMarketSecurityHistoryMapStore extends ASecurityHistoryMapStore
public String[] getFields() {
return new String[]{
"ID", "EVENT_TIME", "EVENT_USER_ID", "EVENT_TYPE",
- "MONEY_MARKET_SECURITY_ID", "SECURITY_ID", "DESCRIPTION", "START_DATE", "END_DATE", "NOMINAL_VALUE", "NOMINAL_CURRENCY", "TERM_TYPE"};
+ "MONEY_MARKET_SECURITY_ID", "SECURITY_ID", "DESCRIPTION", "START_DATE", "END_DATE", "NOMINAL_VALUE", "NOMINAL_CURRENCY", "TERM_TYPE", "CONVENTION"};
}
@@ -54,7 +49,8 @@ public class MoneyMarketSecurityHistoryMapStore extends ASecurityHistoryMapStore
TimeUtil.toDateFromLocalDate(moneyMarketSecurity.getEndDate()),
moneyMarketSecurity.getNominalValue(),
moneyMarketSecurity.getNominalCurrency(),
- moneyMarketSecurity.getTermType()
+ moneyMarketSecurity.getTermType(),
+ moneyMarketSecurity.getConvention()
};
return args;
}
diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/MoneyMarketSecurityMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/MoneyMarketSecurityMapStore.java
index 75651a2c5..d642126f6 100644
--- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/MoneyMarketSecurityMapStore.java
+++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/MoneyMarketSecurityMapStore.java
@@ -2,17 +2,13 @@ package ru.spcex.clearing.imdg.businessobject;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
-import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
+import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.platform.utils.time.TimeUtil;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
@Component
public class MoneyMarketSecurityMapStore extends ASecurityMapStore {
@@ -41,7 +37,7 @@ public class MoneyMarketSecurityMapStore extends ASecurityMapStore {
+
+ public TradedMoneyMarketSecurityMapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ @Override
+ public String getMapName() {
+ return IMDGDistributedNames.Map_TradedMoneyMarketSecurity;
+ }
+
+ @Override
+ public String getTableName() {
+ return "TRADED_MONEY_MARKET_SECURITY";
+ }
+
+ @Override
+ public String[] getFields() {
+ return new String[]{
+ "SECURITY_ID", "SHORT_NAME", "SECURITY_CODE", "ID"
+ };
+ }
+
+ @Override
+ public TradedMoneyMarketSecurity objectReader(ResultSet resultSet) throws SQLException {
+ TradedMoneyMarketSecurity object = new TradedMoneyMarketSecurity();
+ object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
+ object.setShortName(resultSet.getObject("SHORT_NAME", String.class));
+ object.setSecurityCode(resultSet.getObject("SECURITY_CODE", String.class));
+ object.setId(resultSet.getObject("ID", Long.class));
+ return object;
+ }
+
+ @Override
+ public Object[] objectToField(TradedMoneyMarketSecurity object) {
+ Object[] args = new Object[]{
+ object.getSecurityId(),
+ object.getShortName(),
+ object.getSecurityCode(),
+ object.getId()
+ };
+ return args;
+ }
+
+}
\ No newline at end of file
diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/UpdateMapService.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/UpdateMapService.java
index 6b3590754..19d300c15 100644
--- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/UpdateMapService.java
+++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/UpdateMapService.java
@@ -15,6 +15,8 @@ import ru.clearing.classes.statics.data.instrument.issue.*;
import ru.clearing.classes.statics.data.misc.*;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.clearing.classes.statics.data.profile.ProfileDocumentHistory;
+import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
+import ru.clearing.classes.statics.data.security.MoneyMarketSecurityHistory;
import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.security.SecurityHistory;
import ru.clearing.classes.statics.data.user.User;
@@ -61,12 +63,7 @@ public class UpdateMapService extends AbstractUpdateMapService {
protected void entryModified(EntryEvent event, String eventType) {
log.debug("{} {}", event, eventType);
Object value = (EVENT_DELETE.equals(eventType) ? event.getOldValue() : event.getValue());
- if (value instanceof AccountBalance) {
- AccountBalanceHistory accountBalanceHistory = new AccountBalanceHistory();
- createBusinessEvent(accountBalanceHistory, eventType);
- accountBalanceHistory.setObject((AccountBalance) value);
- hazelcastServerInstance.getMap(IMDGDistributedNames.Map_AccountBalanceHistory).put(accountBalanceHistory.getId(), accountBalanceHistory);
- } else if (value instanceof Account) {
+ if (value instanceof Account) {
AccountHistory accountHistory = new AccountHistory();
createBusinessEvent(accountHistory, eventType);
accountHistory.setObject((Account) value);
diff --git a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/RunnableMapNamesForTesting.java b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/RunnableMapNamesForTesting.java
index 55572a080..5f02f1d24 100644
--- a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/RunnableMapNamesForTesting.java
+++ b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/RunnableMapNamesForTesting.java
@@ -23,6 +23,8 @@ import ru.clearing.classes.statics.data.profile.ProfileDocumentHistory;
import ru.clearing.classes.statics.data.register.*;
import ru.clearing.classes.statics.data.scheduler.*;
import ru.clearing.classes.statics.data.sdf.*;
+import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
+import ru.clearing.classes.statics.data.security.MoneyMarketSecurityHistory;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.clearing.classes.statics.data.user.*;
import ru.clearing.platform.dictionary.*;
diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml
index 969ee84ed..a5e83d1ba 100644
--- a/clearing-parent/reports-service/pom.xml
+++ b/clearing-parent/reports-service/pom.xml
@@ -40,17 +40,27 @@
jackson-dataformat-xml
+
com.thoughtworks.xstream
xstream
1.4.19
+
+
org.apache.poi
poi-ooxml
5.1.0
+
+
+ com.opencsv
+ opencsv
+ 5.5.2
+
+
ru.spcex.clearing
@@ -83,6 +93,24 @@
mockito-core
test
+
+ ru.spcex.clearing
+ security-util
+
+
+ ru.spcex.clearing
+ clearing-validation
+
+
+ ru.spcex.clearing
+ test-clearing
+ test
+
+
+ org.springframework.boot
+ spring-boot-test
+ test
+
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java
index 627e9bbf1..06efcbe60 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java
@@ -1,8 +1,5 @@
package ru.spcex.clearing.reports;
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.naming.NoNameCoder;
-import com.thoughtworks.xstream.io.xml.XppDriver;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -10,11 +7,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import ru.spcex.clearing.reports.config.ReportCmdParser;
-import ru.spcex.clearing.reports.reports.bt_16_5.ReportINACCNT;
import ru.spcex.clearing.reports.services.QCommandExecutor;
import ru.spcex.clearing.reports.services.ReportsServiceCommand;
-import ru.spcex.clearing.reports.services.collector.ReportINACCNT_Collector;
-import ru.spcex.platform.imdg.api.ImdgProvider;
@SpringBootApplication
public class ReportsServiceApplication {
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java
new file mode 100644
index 000000000..c0730ce66
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java
@@ -0,0 +1,33 @@
+package ru.spcex.clearing.reports.config;
+
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
+import ru.spcex.clearing.reports.errors.ReportError;
+import ru.spcex.clearing.util.security.UserRoleVerification;
+import ru.spcex.clearing.util.services.IMDGMessageResolver;
+import ru.spcex.clearing.util.services.RequestHelper;
+import ru.spcex.platform.enumeration.UserRole;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.utils.enumeration.IMessageResolver;
+
+@Configuration
+public class BeanConfiguration {
+ @Bean
+ public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
+ return new IMDGMessageResolver(imdgProvider);
+ }
+
+ @Bean
+ @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) {
+ return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, ReportError.UserVerifyDenial);
+ }
+
+ @Bean
+ @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public RequestHelper requestHelper(IMessageResolver messageResolver) {
+ return new RequestHelper(messageResolver, ReportError.InternalError);
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java
index cd3b73821..3a7f95b94 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java
@@ -20,9 +20,9 @@ public class KafkaConfig {
return KafkaConsumerFactory.consumer(settings.getKafkaConsumer());
}
-// @Autowired
-// @Bean
-// public Producer createProducer(ReportsServiceSettings settings) {
-// return KafkaProducerFactory.producer(settings.getKafkaProducer());
-// }
+ @Autowired
+ @Bean
+ public Producer createProducer(ReportsServiceSettings settings) {
+ return KafkaProducerFactory.producer(settings.getKafkaProducer());
+ }
}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java
new file mode 100644
index 000000000..b88e8fd6f
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java
@@ -0,0 +1,54 @@
+package ru.spcex.clearing.reports.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import ru.spcex.clearing.reports.reports.*;
+import ru.spcex.clearing.reports.reports.bp.*;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Configuration
+public class ReportBuildersConfig {
+ @Bean("reportBuildersWithoutParams")
+ public Map>> reportBuildersWithoutParams(ImdgProvider imdgProvider) {
+ Map>> resultMap = new HashMap<>();
+ resultMap.put(ReportType.SUMMARY_LIABILITIES_CLAIMS, List.of(new SummaryLiabilitiesClaimsReportBuilder(imdgProvider)));
+ resultMap.put(ReportType.SUMMARY_MONEY_CHANGE, List.of(new SummaryMoneyChangeReportBuilder(imdgProvider)));
+ return resultMap;
+ }
+
+ @Bean("reportBuildersWithSessionIdParam")
+ public Map>> reportBuildersWithSessionIdParam(ImdgProvider imdgProvider) {
+ Map>> resultMap = new HashMap<>();
+ resultMap.put(ReportType.OPERATIONAL_LIABILITIES_CLAIMS, List.of(new OperationalLiabilitiesClaimsReportBuilder(imdgProvider)));
+ resultMap.put(ReportType.OPERATIONAL_MONEY_CHANGE, List.of(new OperationalMoneyChangeReportBuilder(imdgProvider)));
+ resultMap.put(ReportType.EXECUTED_DEAL_REPORT,
+ List.of(
+ new ExecutedDealReportBuilder_INFTYPE_1(imdgProvider),
+ new ExecutedDealReportBuilder_INFTYPE_2(imdgProvider),
+ new ExecutedDealReportBuilder_INFTYPE_3(imdgProvider),
+ new ExecutedDealReportBuilder_INFTYPE_4(imdgProvider)
+ )
+ );
+ resultMap.put(ReportType.UNFULFILLED_DEAL_REPORT, List.of(new UnfulfilledDealReportBuilder(imdgProvider)));
+ return resultMap;
+ }
+
+ @Bean("reportBuildersWithSessionIdListParam")
+ public Map>> reportBuildersWithSessionIdListParams(ImdgProvider imdgProvider) {
+ Map>> resultMap = new HashMap<>();
+ resultMap.put(ReportType.PERIOD_LIABILITIES_CLAIMS, List.of(new PeriodLiabilitiesClaimsReportBuilder(imdgProvider)));
+ return resultMap;
+ }
+
+ @Bean("reportBuildersWithPeriodParams")
+ public Map>> reportBuildersWithPeriodParams(ImdgProvider imdgProvider) {
+ Map>> resultMap = new HashMap<>();
+ resultMap.put(ReportType.PERIOD_MONEY_CHANGE, List.of(new PeriodMoneyChangeReportBuilder(imdgProvider)));
+ return resultMap;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java
index 8352482f0..c8d0d3ad3 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java
@@ -18,7 +18,7 @@ import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
public class ReportsServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaConsumerSettings kafkaConsumer;
-// private KafkaProducerSettings kafkaProducer;
+ private KafkaProducerSettings kafkaProducer;
private String reportModuleOut;
public HazelcastClientParams getHazelcast() {
@@ -37,13 +37,13 @@ public class ReportsServiceSettings {
this.kafkaConsumer = kafkaConsumer;
}
-// public KafkaProducerSettings getKafkaProducer() {
-// return kafkaProducer;
-// }
-//
-// public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
-// this.kafkaProducer = kafkaProducer;
-// }
+ public KafkaProducerSettings getKafkaProducer() {
+ return kafkaProducer;
+ }
+
+ public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
+ this.kafkaProducer = kafkaProducer;
+ }
public String getReportModuleOut() {
return reportModuleOut;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java
new file mode 100644
index 000000000..f01155eaf
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java
@@ -0,0 +1,149 @@
+package ru.spcex.clearing.reports.config.validation;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import ru.clearing.classes.statics.data.company.Company;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithPeriod;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionIdList;
+import ru.spcex.clearing.reports.errors.ReportError;
+import ru.spcex.clearing.validation.common.ValidationHelper;
+import ru.spcex.clearing.validation.common.rules.EndDtAfterStartDtRule;
+import ru.spcex.clearing.validation.common.rules.EnumPresentRule;
+import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
+import ru.spcex.platform.classes.base.SpcexObjectBase;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.validation.ImdgValidationContext;
+import ru.spcex.platform.utils.enumeration.IEnumKey;
+import ru.spcex.platform.utils.enumeration.IMessageResolver;
+import ru.spcex.platform.utils.validation.IValidator;
+import ru.spcex.platform.utils.validation.ValidatorImpl;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+@Configuration
+public class ValidationConfig {
+
+ @Bean("imdgForValidation")
+ public Map> imdgForValidation(ImdgProvider imdgProvider) {
+ final Map> imdg = new HashMap<>();
+ BiConsumer> addImdg = (s, aClass) -> imdg.put(s, imdgProvider.getImdg(s, aClass));
+
+ addImdg.accept(IMDGDistributedNames.Map_Company, Company.class);
+
+ return imdg;
+ }
+
+ @Bean("validationHelper")
+ public ValidationHelper validationHelper(IMessageResolver messageResolver) {
+ return new ValidationHelper(messageResolver);
+ }
+
+ @Bean("reportRequestValidator")
+ public Function reportRequestValidator(
+ Map> imdgForValidation
+ ) {
+ return reportRequest -> {
+ ImdgValidationContext context = new ImdgValidationContext<>();
+ context.setValidatedObject(reportRequest);
+ return new ValidatorImpl<>(context,
+ EnumPresentRule.instance("reportId",
+ ReportRequest::getReportId,
+ new IEnumKey[]{
+ ReportType.SUMMARY_LIABILITIES_CLAIMS,
+ ReportType.SUMMARY_MONEY_CHANGE
+ },
+ ReportError.WrongFieldValue,
+ ReportError.RequiredFieldEmpty)
+ );
+ };
+ }
+
+ @Bean("reportRequestWithSessionIdValidator")
+ public Function reportRequestWithSessionIdValidator(
+ Map> imdgForValidation
+ ) {
+ return reportRequestWithSessionId -> {
+ ImdgValidationContext context = new ImdgValidationContext<>();
+ context.setValidatedObject(reportRequestWithSessionId);
+ return new ValidatorImpl<>(context,
+ EnumPresentRule.instance("reportId",
+ ReportRequestWithSessionId::getReportId,
+ new IEnumKey[]{
+ ReportType.OPERATIONAL_LIABILITIES_CLAIMS,
+ ReportType.OPERATIONAL_MONEY_CHANGE,
+ ReportType.EXECUTED_DEAL_REPORT,
+ ReportType.UNFULFILLED_DEAL_REPORT
+ },
+ ReportError.WrongFieldValue,
+ ReportError.RequiredFieldEmpty),
+ FieldRequiredRule.instance("sessionId",
+ ReportRequestWithSessionId::getSessionId,
+ ReportError.RequiredFieldEmpty,
+ sessionId -> sessionId > 0 ? null : ReportError.WrongFieldValue)
+ );
+ };
+ }
+
+ @Bean("reportRequestWithSessionIdListValidator")
+ public Function reportRequestWithSessionIdListValidator(
+ Map> imdgForValidation
+ ) {
+ return reportRequestWithSessionIdList -> {
+ ImdgValidationContext context = new ImdgValidationContext<>();
+ context.setValidatedObject(reportRequestWithSessionIdList);
+ return new ValidatorImpl<>(context,
+ EnumPresentRule.instance("reportId",
+ ReportRequestWithSessionIdList::getReportId,
+ new IEnumKey[]{
+ ReportType.PERIOD_LIABILITIES_CLAIMS
+ },
+ ReportError.WrongFieldValue,
+ ReportError.RequiredFieldEmpty),
+ FieldRequiredRule.instance("sessionIdList",
+ ReportRequestWithSessionIdList::getSessionIdList,
+ ReportError.RequiredFieldEmpty,
+ sessionIdList -> {
+ if (sessionIdList == null || sessionIdList.isEmpty())
+ return ReportError.WrongFieldValue;
+ return null;
+ })
+ );
+ };
+ }
+
+ @Bean("reportRequestWithPeriodValidator")
+ public Function reportRequestWithPeriodValidator(
+ Map> imdgForValidation
+ ) {
+ return reportRequestWithPeriod -> {
+ ImdgValidationContext context = new ImdgValidationContext<>();
+ context.setValidatedObject(reportRequestWithPeriod);
+ return new ValidatorImpl<>(context,
+ EnumPresentRule.instance("reportId",
+ ReportRequestWithPeriod::getReportId,
+ new IEnumKey[]{
+ ReportType.PERIOD_MONEY_CHANGE,
+ },
+ ReportError.WrongFieldValue,
+ ReportError.RequiredFieldEmpty),
+ EndDtAfterStartDtRule.instance("endDate", "startDate",
+ ReportRequestWithPeriod::getEndDate,
+ ReportRequestWithPeriod::getStartDate,
+ ReportError.RequiredFieldEmpty,
+ ReportError.WrongFieldValue)
+ );
+ };
+ }
+
+}
+
+
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java
new file mode 100644
index 000000000..de9ba1fb1
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java
@@ -0,0 +1,22 @@
+package ru.spcex.clearing.reports.errors;
+
+import ru.spcex.platform.utils.enumeration.IErrorEnumId;
+
+public enum ReportError implements IErrorEnumId {
+ InternalError(4000L),
+ UserVerifyDenial(4001L),
+ RequiredFieldEmpty(4002L),
+ WrongFieldValue(4004L),
+ ;
+
+ private final Long id;
+
+ ReportError(Long id) {
+ this.id = id;
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java
index 27c7072af..c8b56a13e 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java
@@ -10,6 +10,7 @@ import java.time.format.DateTimeFormatter;
/**
* Общая шапка (атрибуты) для всех отчетов
*/
+@Deprecated
public abstract class AbstractReport {
protected static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy");
protected static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java
new file mode 100644
index 000000000..aa1c830fb
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java
@@ -0,0 +1,114 @@
+package ru.spcex.clearing.reports.reports;
+
+import com.opencsv.CSVWriterBuilder;
+import com.opencsv.ICSVWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ru.spcex.platform.enumeration.ReportType;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * Класс для построения отчетов в формате CSV
+ *
+ * @param тип параметров, используемых при построении отчета
+ */
+public abstract class CSVReportBuilder
{
+ protected static final Logger log = LoggerFactory.getLogger(CSVReportBuilder.class);
+
+ protected DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
+ protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
+ protected DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
+
+ /**
+ * Метод получения заголовков для CSV отчета
+ */
+ protected abstract String[] getHeaders();
+
+ /**
+ * Возвращает списком значения CSV отчета. Каждый элемент списка - строка, элемент массива внутри списка - столбец.
+ */
+ protected abstract List getLines();
+
+ /**
+ * Название отчета, используется для формирования имени отчета (без указания формата)
+ *
+ * @param params Параметры формирования отчета
+ */
+ protected abstract String getReportFilename(P params);
+
+ /**
+ * Тип отчета по {@link ReportType}
+ */
+ public abstract ReportType getReportType();
+
+ /**
+ * Формирование отчета на основе параметров
+ *
+ * @param params Параметры формирования отчета
+ */
+ protected abstract void collect(P params);
+
+ /**
+ * Создает CSVWriter. Если требуется изменить параметры выходного CSV файла, этот метод следует переопределить.
+ *
+ * @param file Файл отчета
+ * @return Созданный CSVWriter
+ *
+ * todo check it
+ */
+ protected ICSVWriter createCsvWriter(File file) throws IOException {
+ Writer writer = new FileWriter(file);
+ CSVWriterBuilder csvWriterBuilder = new CSVWriterBuilder(writer)
+ .withLineEnd("\n")
+ .withSeparator(',')
+ .withQuoteChar('\"');
+ return csvWriterBuilder.build();
+ }
+
+ public File createReport(P params, File outFolder) {
+ assert outFolder != null && outFolder.isDirectory();
+
+ File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename(params) + ".csv"));
+
+ collect(params);
+ String[] headers = getHeaders();
+ List lines = getLines();
+
+ assert headers != null;
+ assert lines != null;
+
+ try (ICSVWriter csvWriter = createCsvWriter(reportFile)) {
+ csvWriter.writeNext(headers, false);
+ csvWriter.writeAll(lines, true);
+ } catch (IOException e) {
+ log.error("Can't create report", e);
+ return null;
+ }
+
+ return reportFile;
+ }
+
+ protected String normalizeFilenameForOS(String filename) {
+ if (System.getProperty("os.name").toLowerCase().contains("windows"))
+ return filename.replace(":", "_");
+ return filename;
+ }
+
+ public void setDateFormatter(DateTimeFormatter dateFormatter) {
+ this.dateFormatter = dateFormatter;
+ }
+
+ public void setDateTimeFormatter(DateTimeFormatter dateTimeFormatter) {
+ this.dateTimeFormatter = dateTimeFormatter;
+ }
+
+ public void setTimeFormatter(DateTimeFormatter timeFormatter) {
+ this.timeFormatter = timeFormatter;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/EmptyParams.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/EmptyParams.java
new file mode 100644
index 000000000..c344fc1d2
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/EmptyParams.java
@@ -0,0 +1,7 @@
+package ru.spcex.clearing.reports.reports;
+
+/**
+ * Класс для формирования отчета без параметров
+ */
+public class EmptyParams {
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/PeriodParams.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/PeriodParams.java
new file mode 100644
index 000000000..4d30c335a
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/PeriodParams.java
@@ -0,0 +1,27 @@
+package ru.spcex.clearing.reports.reports;
+
+import java.time.LocalDate;
+
+/**
+ * Параметры для формирования отчета на период
+ */
+public class PeriodParams {
+ private LocalDate startDate;
+ private LocalDate endDate;
+
+ public LocalDate getStartDate() {
+ return startDate;
+ }
+
+ public void setStartDate(LocalDate startDate) {
+ this.startDate = startDate;
+ }
+
+ public LocalDate getEndDate() {
+ return endDate;
+ }
+
+ public void setEndDate(LocalDate endDate) {
+ this.endDate = endDate;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java
index a235a2a83..1d66b3ebc 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java
@@ -5,6 +5,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
/**
* Идентификаторы отчётов
*/
+@Deprecated
public enum ReportId implements IEnumKey {
PA_B("REPPA.B"), PA_IV("REPPA.IV"),
@@ -22,8 +23,18 @@ public enum ReportId implements IEnumKey {
BR_0420312_P1("REPBR.0420312_р1-1"), BR_0420312_P2("REPBR.0420312_р1-2"), BR_0420312_P3("REPBR.0420312_р1-3"), BR_0420312_P4("REPBR.0420312_р1-4"),
BR_0420312_P5("REPBR.0420312_р1-5"), BR_0420312_P6("REPBR.0420312_р1-6"), BR_0420312_P7("REPBR.0420312_р1-7"), BR_0420312_P8("REPBR.0420312_р3-1"),
- BR_0420312_P9("REPBR.0420312_р3-2"), BR_0420312_P10("REPBR.0420312_р3-3");
+ BR_0420312_P9("REPBR.0420312_р3-2"), BR_0420312_P10("REPBR.0420312_р3-3"),
+ OPERATIONAL_LIABILITIES_CLAIMS("operational_liabilities_claims"),
+ OPERATIONAL_MONEY_CHANGE("operational_money_change"),
+ SUMMARY_LIABILITIES_CLAIMS("summary_liabilities_claims"),
+ SUMMARY_L_MONEY_CHANGE("summary_lmoney_change"),
+ PERIOD_LIABILITIES_CLAIMS("period_liabilities_claims"),
+ PERIOD_MONEY_CHANGE("period_money_change"),
+ EXECUTED_DEAL_REPORT("executed_deal_report"),
+ UNFULFILLED_DEAL_REPORT("unfulfilled_deal_report"),
+
+ ;
private final String key;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java
index e86e5007c..051362750 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java
@@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import java.time.LocalDate;
+@Deprecated
public abstract class ReportWithClearingStatus extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("clearingStatus")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java
index 2895b8b4b..e7e6d7376 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java
@@ -2,24 +2,23 @@ package ru.spcex.clearing.reports.reports;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-import com.thoughtworks.xstream.annotations.XStreamConverter;
-import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter;
import java.time.LocalDate;
/**
* Шапка для отчётов, содержащих startDate и endDate
*/
+@Deprecated
public abstract class ReportWithPeriod extends AbstractReport {
@XStreamAsAttribute
@XStreamAlias("startDate")
- @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
+// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
protected LocalDate startDate;
@XStreamAsAttribute
@XStreamAlias("endDate")
- @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
+// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
protected LocalDate endDate;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/SessionIdListParams.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/SessionIdListParams.java
new file mode 100644
index 000000000..2b198bf17
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/SessionIdListParams.java
@@ -0,0 +1,18 @@
+package ru.spcex.clearing.reports.reports;
+
+import java.util.List;
+
+/**
+ * Параметры для формирования отчета по списку SessionId
+ */
+public class SessionIdListParams {
+ private List sessionIdList;
+
+ public List getSessionIdList() {
+ return sessionIdList;
+ }
+
+ public void setSessionIdList(List sessionIdList) {
+ this.sessionIdList = sessionIdList;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/SessionIdParam.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/SessionIdParam.java
new file mode 100644
index 000000000..e2a529e6b
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/SessionIdParam.java
@@ -0,0 +1,16 @@
+package ru.spcex.clearing.reports.reports;
+
+/**
+ * Параметры для формирования отчета по SessionId
+ */
+public class SessionIdParam {
+ private Long sessionId;
+
+ public Long getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(Long sessionId) {
+ this.sessionId = sessionId;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java
new file mode 100644
index 000000000..3affaeedb
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java
@@ -0,0 +1,99 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.company.Company;
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.clearing.classes.statics.data.misc.STrades;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.reports.reports.CSVReportBuilder;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.enumeration.WorkflowStatus;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public abstract class ExecutedDealReportBuilderCommon extends CSVReportBuilder {
+ protected final DateTimeFormatter fileNameDateTimeFormatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
+ protected final Imdg executionFondImdg;
+ private final Imdg companyImdg;
+ private final Imdg sTradesImdg;
+
+ private final String[] headers = {
+ "id", "securityId", "tradeNo", "tradeDate", "tradeTime",
+ "settleDate", "settleCode", "price", "quanity", "value"
+ };
+ private List lines = null;
+
+ public ExecutedDealReportBuilderCommon(ImdgProvider imdgProvider) {
+ this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
+ this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
+ this.sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
+ }
+
+ @Override
+ public String[] getHeaders() {
+ return headers;
+ }
+
+ @Override
+ protected List getLines() {
+ return lines;
+ }
+
+ @Override
+ public ReportType getReportType() {
+ return ReportType.EXECUTED_DEAL_REPORT;
+ }
+
+ protected abstract Collection getExecutionFondsForReport(T params);
+
+ @Override
+ protected void collect(T params) {
+ Collection executionFonds = getExecutionFondsForReport(params);
+
+ lines = new ArrayList<>(executionFonds.size());
+ for (ExecutionFond executionFond : executionFonds) {
+ Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
+ if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
+ STrades sTrade = sTradesImdg.getSingleObjectByFieldValues(
+ Map.of(
+ "tradeNum", executionFond.getExchangeExecutionId(),
+ "operation", executionFond.getSide()
+ )
+ );
+
+ String id = String.valueOf(executionFond.getId());
+ String securityId = String.valueOf(executionFond.getSecurityId());
+ String tradeNo = String.valueOf(executionFond.getExchangeExecutionId());
+ String tradeDate = dateFormatter.format(executionFond.getTradingDate());
+ String tradeTime = dateFormatter.format(LocalDate.ofInstant(executionFond.getCreated(), ZoneId.systemDefault()));
+ String settleDate = dateFormatter.format(executionFond.getSettlementDate());
+ String settleCode = sTrade != null ? sTrade.getSettleCode() : "";
+ String quantity = String.valueOf(executionFond.getQuantity());
+ String value = String.valueOf(executionFond.getSettlementAmount());
+ String price = String.valueOf(executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP));
+
+ int valueIdx = 0;
+ String[] line = new String[getHeaders().length];
+ line[valueIdx++] = id;
+ line[valueIdx++] = securityId;
+ line[valueIdx++] = tradeNo;
+ line[valueIdx++] = tradeDate;
+ line[valueIdx++] = tradeTime;
+ line[valueIdx++] = settleDate;
+ line[valueIdx++] = settleCode;
+ line[valueIdx++] = price;
+ line[valueIdx++] = quantity;
+ line[valueIdx++] = value;
+ lines.add(line);
+ }
+ }
+
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_1.java
new file mode 100644
index 000000000..065ff9f5e
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_1.java
@@ -0,0 +1,34 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.spcex.clearing.reports.reports.SessionIdParam;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Collection;
+
+public class ExecutedDealReportBuilder_INFTYPE_1 extends ExecutedDealReportBuilderCommon {
+
+ public ExecutedDealReportBuilder_INFTYPE_1(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected String getReportFilename(SessionIdParam params) {
+ return "KS_BR_PFX64_INFTYPE_1_%s".formatted(fileNameDateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ protected Collection getExecutionFondsForReport(SessionIdParam params) {
+ ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
+ return executionFondImdg.getCollectionObjectsByPredicate(
+ pb.and(
+ pb.equals("sessionId", params.getSessionId()),
+ pb.less("tradingDate", LocalDate.now()),
+ pb.equals("settlementDate", LocalDate.now())
+ )
+ );
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_2.java
new file mode 100644
index 000000000..72fadba5e
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_2.java
@@ -0,0 +1,34 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.spcex.clearing.reports.reports.SessionIdParam;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Collection;
+
+public class ExecutedDealReportBuilder_INFTYPE_2 extends ExecutedDealReportBuilderCommon {
+
+ public ExecutedDealReportBuilder_INFTYPE_2(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected String getReportFilename(SessionIdParam params) {
+ return "KS_BR_PFX64_INFTYPE_2_%s".formatted(fileNameDateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ protected Collection getExecutionFondsForReport(SessionIdParam params) {
+ ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
+ return executionFondImdg.getCollectionObjectsByPredicate(
+ pb.and(
+ pb.equals("sessionId", params.getSessionId()),
+ pb.equals("tradingDate", LocalDate.now()),
+ pb.equals("settlementDate", LocalDate.now())
+ )
+ );
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_3.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_3.java
new file mode 100644
index 000000000..0e3c8e934
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_3.java
@@ -0,0 +1,28 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.spcex.clearing.reports.reports.SessionIdParam;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Collection;
+
+public class ExecutedDealReportBuilder_INFTYPE_3 extends ExecutedDealReportBuilderCommon {
+
+ public ExecutedDealReportBuilder_INFTYPE_3(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected String getReportFilename(SessionIdParam params) {
+ return "KS_BR_PFX64_INFTYPE_3_%s".formatted(fileNameDateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ protected Collection getExecutionFondsForReport(SessionIdParam params) {
+ ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
+ return executionFondImdg.getCollectionObjectsByPredicate(pb.greater("settlementDate", LocalDate.now()));
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_4.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_4.java
new file mode 100644
index 000000000..1135aab9f
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilder_INFTYPE_4.java
@@ -0,0 +1,34 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.spcex.clearing.reports.reports.SessionIdParam;
+import ru.spcex.platform.enumeration.Allowed;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Collection;
+
+public class ExecutedDealReportBuilder_INFTYPE_4 extends ExecutedDealReportBuilderCommon {
+
+ public ExecutedDealReportBuilder_INFTYPE_4(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected String getReportFilename(SessionIdParam params) {
+ return "KS_BR_PFX64_INFTYPE_4_%s".formatted(fileNameDateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ protected Collection getExecutionFondsForReport(SessionIdParam params) {
+ ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
+ return executionFondImdg.getCollectionObjectsByPredicate(
+ pb.and(
+ pb.equals("coverageStatus", Allowed.DENIED.getKey()),
+ pb.equals("settlementDate", LocalDate.now())
+ )
+ );
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/LiabilitiesClaimsReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/LiabilitiesClaimsReportBuilder.java
new file mode 100644
index 000000000..8c505c261
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/LiabilitiesClaimsReportBuilder.java
@@ -0,0 +1,257 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.company.Company;
+import ru.clearing.classes.statics.data.execution.ExecutionCommon;
+import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
+import ru.clearing.classes.statics.data.misc.Listing;
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.reports.reports.CSVReportBuilder;
+import ru.spcex.platform.enumeration.Allowed;
+import ru.spcex.platform.enumeration.Market;
+import ru.spcex.platform.enumeration.Side;
+import ru.spcex.platform.enumeration.WorkflowStatus;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+// todo check typo
+public abstract class LiabilitiesClaimsReportBuilder extends CSVReportBuilder
{
+ protected final Imdg executionFondImdg;
+ protected final Imdg executionDepositImdg;
+ protected final Imdg companyImdg;
+ protected final Imdg registryImdg;
+ protected final Imdg listingImdg;
+ protected final Imdg fixedIncomeSecurityImdg;
+ protected final Imdg tradingClearingRegistryImdg;
+
+ protected final String[] headers = {
+ "id", "doc_date", "doc_time", "doc_name", "doc_type", "clearingHouse", "firmId", "firName", "session_id",
+ "clearing_date", "clearing_time", "trdAccId", "account", "depo_account", "currency", "tr_id", "securityId",
+ "tr_buySell", "tr_date", "tr_execDate", "exec_status", "repaym_date", "tr_price", "nominal", "lot_value",
+ "tr_lot", "tr_quantity", "tr_value", "tr_accruedint", "accruedint", "tr_clrComm", "tr_exhComm", "cash_liability",
+ "depo_liability", "cash_netto", "depo_netto"
+ };
+ protected List lines = null;
+
+ public LiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
+ this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
+ this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
+ this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
+ this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
+ this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
+ this.fixedIncomeSecurityImdg = imdgProvider.getImdg(
+ IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class
+ );
+ this.tradingClearingRegistryImdg = imdgProvider.getImdg(
+ IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class
+ );
+ }
+
+ @Override
+ public String[] getHeaders() {
+ return headers;
+ }
+
+ @Override
+ protected List getLines() {
+ return lines;
+ }
+
+ protected abstract Collection getExecutionFondsForReport(P params);
+
+ protected abstract Collection getExecutionDepositsForReport(P params);
+
+ @Override
+ protected void collect(P params) {
+ Collection executionFonds = getExecutionFondsForReport(params);
+ Collection executionDeposits = getExecutionDepositsForReport(params);
+
+ List executions = new ArrayList<>(executionFonds.size() + executionDeposits.size());
+ executions.addAll(executionFonds);
+ executions.addAll(executionDeposits);
+
+ Company clearingHouseCompany = companyImdg.getSingleObjectByID(1L);
+ String clearingHouse = clearingHouseCompany.getFullName();
+
+ LocalDate nowDate = LocalDate.now();
+ LocalTime nowTime = LocalTime.now();
+
+ lines = new ArrayList<>(executions.size());
+ for (ExecutionCommon execution : executions) {
+ Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
+ if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
+
+ Registry registry = registryImdg.getSingleObjectByFieldValues(Map.of("companyId", execution.getCompanyId()));
+ Collection registriesForSessionId = registryImdg.getCollectionObjectsByFieldValues(
+ Map.of("sessionId", execution.getSessionId())
+ );
+ Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", execution.getSecurityId()));
+ FixedIncomeSecurity fixedIncomeSecurity = fixedIncomeSecurityImdg.getSingleObjectByFieldValues(
+ Map.of("securityId", execution.getSecurityId())
+ );
+ TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(
+ execution.getTradingClearingRegistryId()
+ );
+
+ String id = String.valueOf(execution.getId());
+ String docDate = dateFormatter.format(nowDate);
+ String docTime = timeFormatter.format(nowTime);
+ String docName = "Отчет об обязательствах/требованиях Участника клиринга";
+ String docType = "KS_FIRMID_LIABILITIES";
+ String firmId = String.valueOf(execution.getCompanyId());
+ String firName = company.getFullName();
+ String sessionId = String.valueOf(execution.getSessionId());
+ String clearingDate = dateFormatter.format(execution.getClearingDate());
+ String clearingTime = dateFormatter.format(execution.getClearingDate());
+ String trdAccId = registry.getTradingClearingRegistry();
+ String account = String.valueOf(tradingClearingRegistry.getMoneyAccountId());
+ String depoAccount = String.valueOf(tradingClearingRegistry.getDepoAccountId());
+ String currency = execution.getSettlementCurrency();
+ String trId = String.valueOf(execution.getExchangeExecutionId());
+ String securityId = String.valueOf(execution.getSecurityId());
+
+ String trBuySell = "";
+ if (Side.BUY.equalsByKey(execution.getSide()))
+ trBuySell = "B";
+ else if (Side.SELL.equalsByKey(execution.getSide()))
+ trBuySell = "S";
+ String trDate = dateFormatter.format(execution.getTradingDate());
+
+ String trExecDate = "";
+ String execStatus = "";
+ String repaymDate = "";
+ String trPrice = "";
+ String nominal = "";
+ String trQuantity = "";
+ String trValue = "";
+ String trAccruedInt = "";
+ String accruedInt = "";
+ String cashLiability = "";
+ String depoLiability = "";
+ if (execution instanceof ExecutionDeposit executionDeposit) {
+ trExecDate = dateFormatter.format(executionDeposit.getSecondLegSettlementDate());
+ if (Market.mkrs.equalsByKey(execution.getMarket())) {
+
+ String coverageStatus = executionDeposit.getCoverageStatus();
+ if (Allowed.ALLOWED.equalsByKey(coverageStatus)) execStatus = "Y";
+ else if (Allowed.DENIED.equalsByKey(coverageStatus)) execStatus = "N";
+ else execStatus = "W";
+
+ repaymDate = dateFormatter.format(executionDeposit.getSecondLegSettlementDate());
+ trPrice = String.valueOf(executionDeposit.getPrice());
+ trValue = String.valueOf(executionDeposit.getFirstLegAmount());
+ cashLiability = String.valueOf(executionDeposit.getFirstLegAmount());
+ }
+ } else if (execution instanceof ExecutionFond executionFond) {
+ trExecDate = dateFormatter.format(executionFond.getSettlementDate());
+ if (Market.fond.equalsByKey(execution.getMarket())) {
+ trPrice = String.valueOf(
+ executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP)
+ );
+ trQuantity = String.valueOf(executionFond.getQuantity());
+ nominal = String.valueOf(fixedIncomeSecurity.getNominalValue());
+ trValue = String.valueOf(executionFond.getSettlementAmount());
+ trAccruedInt = String.valueOf(fixedIncomeSecurity.getCoupon());
+ accruedInt = String.valueOf(
+ fixedIncomeSecurity.getCoupon().divide(executionFond.getQuantity(), RoundingMode.HALF_UP)
+ );
+ cashLiability = String.valueOf(executionFond.getSettlementAmount());
+ depoLiability = String.valueOf(executionFond.getQuantity());
+ }
+ }
+
+ String lotValue = String.valueOf(listing.getLotSize());
+ String trLot = String.valueOf(execution.getLots());
+ String trClrComm = "";
+ String trExhComm = "";
+
+ Registry tm_tRegistry = null;
+ Registry om_tRegistry = null;
+ Registry ts_tRegistry = null;
+ Registry os_tRegistry = null;
+ for (Registry currRegistry : registriesForSessionId) {
+ String registryCode = currRegistry.getRegistryCode();
+ if (registryCode.endsWith("T")) {
+ if (registryCode.startsWith("TM")) {
+ if (tm_tRegistry != null && tm_tRegistry.getUpdated().isAfter(currRegistry.getUpdated())) continue;
+ tm_tRegistry = currRegistry;
+ }
+ if (registryCode.startsWith("OM")) {
+ if (om_tRegistry != null && om_tRegistry.getUpdated().isAfter(currRegistry.getUpdated())) continue;
+ om_tRegistry = currRegistry;
+ }
+ if (registryCode.startsWith("TS")) {
+ if (ts_tRegistry != null && ts_tRegistry.getUpdated().isAfter(currRegistry.getUpdated())) continue;
+ ts_tRegistry = currRegistry;
+ }
+ if (registryCode.startsWith("OS")) {
+ if (os_tRegistry != null && os_tRegistry.getUpdated().isAfter(currRegistry.getUpdated())) continue;
+ os_tRegistry = currRegistry;
+ }
+ }
+ }
+ String cashNetto = "";
+ if (tm_tRegistry != null && om_tRegistry != null) {
+ cashNetto = String.valueOf(tm_tRegistry.getBalance().subtract(om_tRegistry.getBalance()));
+ }
+
+ String depoNetto = "";
+ if (ts_tRegistry != null && os_tRegistry != null) {
+ depoNetto = String.valueOf(ts_tRegistry.getBalance().subtract(os_tRegistry.getBalance()));
+ }
+
+
+ int valueIdx = 0;
+ String[] line = new String[getHeaders().length];
+ line[valueIdx++] = id;
+ line[valueIdx++] = docDate;
+ line[valueIdx++] = docTime;
+ line[valueIdx++] = docName;
+ line[valueIdx++] = docType;
+ line[valueIdx++] = clearingHouse;
+ line[valueIdx++] = firmId;
+ line[valueIdx++] = firName;
+ line[valueIdx++] = sessionId;
+ line[valueIdx++] = clearingDate;
+ line[valueIdx++] = clearingTime;
+ line[valueIdx++] = trdAccId;
+ line[valueIdx++] = account;
+ line[valueIdx++] = depoAccount;
+ line[valueIdx++] = currency;
+ line[valueIdx++] = trId;
+ line[valueIdx++] = securityId;
+ line[valueIdx++] = trBuySell;
+ line[valueIdx++] = trDate;
+ line[valueIdx++] = trExecDate;
+ line[valueIdx++] = execStatus;
+ line[valueIdx++] = repaymDate;
+ line[valueIdx++] = trPrice;
+ line[valueIdx++] = nominal;
+ line[valueIdx++] = lotValue;
+ line[valueIdx++] = trLot;
+ line[valueIdx++] = trQuantity;
+ line[valueIdx++] = trValue;
+ line[valueIdx++] = trAccruedInt;
+ line[valueIdx++] = accruedInt;
+ line[valueIdx++] = trClrComm;
+ line[valueIdx++] = trExhComm;
+ line[valueIdx++] = cashLiability;
+ line[valueIdx++] = depoLiability;
+ line[valueIdx++] = cashNetto;
+ line[valueIdx] = depoNetto;
+ lines.add(line);
+ }
+ }
+
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/MoneyChangeReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/MoneyChangeReportBuilder.java
new file mode 100644
index 000000000..b72a2a004
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/MoneyChangeReportBuilder.java
@@ -0,0 +1,131 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.company.Company;
+import ru.clearing.classes.statics.data.misc.Listing;
+import ru.clearing.classes.statics.data.payment.PaymentInstruction;
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.clearing.classes.statics.data.statement.Statement;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.reports.reports.CSVReportBuilder;
+import ru.spcex.platform.enumeration.InOutDirection;
+import ru.spcex.platform.enumeration.WorkflowStatus;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public abstract class MoneyChangeReportBuilder extends CSVReportBuilder
{
+ protected final Imdg registryImdg;
+ protected final Imdg companyImdg;
+ protected final Imdg listingImdg;
+ protected final Imdg statementImdg;
+ protected final Imdg paymentInstructionImdg;
+ protected final String[] headers = {
+ "id", "doc_date", "doc_time", "doc_name", "doc_type", "clearingHouse", "firmId", "firName", "trdAccId",
+ "account", "currency", "registry_code", "registry_name", "open_balance", "change_balance", "add_withdraw",
+ "close_balance", "remarks", "add_sum", "add_time", "withdraw_sum", "withdraw_time"
+ };
+
+ protected List lines = null;
+
+ public MoneyChangeReportBuilder(ImdgProvider imdgProvider) {
+ this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
+ this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
+ this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
+ this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
+ this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
+ }
+
+ @Override
+ public String[] getHeaders() {
+ return headers;
+ }
+
+ @Override
+ protected List getLines() {
+ return lines;
+ }
+
+ protected abstract Collection getRegistryForReport(P param);
+
+ @Override
+ protected void collect(P params) {
+ Collection registries = getRegistryForReport(params);
+
+ Company clearingHouseCompany = companyImdg.getSingleObjectByID(1L);
+ String clearingHouse = clearingHouseCompany.getFullName();
+
+ LocalDate nowDate = LocalDate.now();
+ LocalTime nowTime = LocalTime.now();
+ lines = new ArrayList<>(registries.size());
+ for (Registry registry : registries) {
+ Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
+ if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
+
+ Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", registry.getSecurityId()));
+ Statement statement = statementImdg.getSingleObjectByFieldValues(Map.of("addresseeId", registry.getCompanyId()));
+ PaymentInstruction paymentInstruction = paymentInstructionImdg.getSingleObjectByFieldValues(
+ Map.of(
+ "id", registry.getPaymentId(),
+ "creditLeg_direction", InOutDirection.out.getKey()
+ )
+ );
+
+ String id = String.valueOf(registry.getId());
+ String docDate = dateFormatter.format(nowDate);
+ String docTime = timeFormatter.format(nowTime);
+ String docName = "Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга";
+ String docType = "KS_FIRMID_ASSETS";
+ String firmId = String.valueOf(registry.getCompanyId());
+ String firName = company.getFullName();
+ String trdAccId = registry.getTradingClearingRegistry();
+ String account = String.valueOf(registry.getAccountId());
+ String currency = listing.getTradingCurrency();
+ String registryCode = String.valueOf(registry.getId());
+ String registryName = registry.getRegistryCode();
+ String openBalance = String.valueOf(registry.getOpenBalance());
+ String changeBalance = String.valueOf(registry.getCloseBalance().subtract(registry.getOpenBalance()));
+ String addWithdraw = String.valueOf(registry.getCredit().subtract(registry.getDebit()));
+ String closeBalance = String.valueOf(registry.getCloseBalance());
+ String remarks = "";
+ String addSum = String.valueOf(registry.getCredit());
+ String addTime = dateTimeFormatter.format(LocalDateTime.ofInstant(statement.getCreated(), ZoneId.systemDefault()));
+ String withdrawSum = String.valueOf(registry.getDebit());
+ String withdrawTime = dateTimeFormatter.format(LocalDateTime.ofInstant(paymentInstruction.getPaymentDate(), ZoneId.systemDefault()));
+
+ int valueIdx = 0;
+ String[] line = new String[getHeaders().length];
+ line[valueIdx++] = id;
+ line[valueIdx++] = docDate;
+ line[valueIdx++] = docTime;
+ line[valueIdx++] = docName;
+ line[valueIdx++] = docType;
+ line[valueIdx++] = clearingHouse;
+ line[valueIdx++] = firmId;
+ line[valueIdx++] = firName;
+ line[valueIdx++] = trdAccId;
+ line[valueIdx++] = account;
+ line[valueIdx++] = currency;
+ line[valueIdx++] = registryCode;
+ line[valueIdx++] = registryName;
+ line[valueIdx++] = openBalance;
+ line[valueIdx++] = changeBalance;
+ line[valueIdx++] = addWithdraw;
+ line[valueIdx++] = closeBalance;
+ line[valueIdx++] = remarks;
+ line[valueIdx++] = addSum;
+ line[valueIdx++] = addTime;
+ line[valueIdx++] = withdrawSum;
+ line[valueIdx++] = withdrawTime;
+ lines.add(line);
+ }
+ }
+
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/OperationalLiabilitiesClaimsReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/OperationalLiabilitiesClaimsReportBuilder.java
new file mode 100644
index 000000000..dd7e6f9d5
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/OperationalLiabilitiesClaimsReportBuilder.java
@@ -0,0 +1,43 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.spcex.clearing.reports.reports.SessionIdParam;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.Map;
+
+public class OperationalLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsReportBuilder {
+ public OperationalLiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected Collection getExecutionFondsForReport(SessionIdParam params) {
+ return executionFondImdg.getCollectionObjectsByFieldValues(
+ Map.of("sessionId", params.getSessionId())
+ );
+ }
+
+ @Override
+ protected Collection getExecutionDepositsForReport(SessionIdParam params) {
+ return executionDepositImdg.getCollectionObjectsByFieldValues(
+ Map.of("sessionId", params.getSessionId())
+ );
+ }
+
+ @Override
+ protected String getReportFilename(SessionIdParam params) {
+ return "operational_liabilities_claims.%s".formatted(
+ dateTimeFormatter.format(LocalDateTime.now())
+ );
+ }
+
+ @Override
+ public ReportType getReportType() {
+ return ReportType.OPERATIONAL_LIABILITIES_CLAIMS;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/OperationalMoneyChangeReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/OperationalMoneyChangeReportBuilder.java
new file mode 100644
index 000000000..24a1283d6
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/OperationalMoneyChangeReportBuilder.java
@@ -0,0 +1,33 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.clearing.reports.reports.SessionIdParam;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.Map;
+
+public class OperationalMoneyChangeReportBuilder extends MoneyChangeReportBuilder {
+ public OperationalMoneyChangeReportBuilder(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected Collection getRegistryForReport(SessionIdParam param) {
+ return registryImdg.getCollectionObjectsByFieldValues(
+ Map.of("sessionId", param.getSessionId())
+ );
+ }
+
+ @Override
+ protected String getReportFilename(SessionIdParam params) {
+ return "operational_money_change.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ public ReportType getReportType() {
+ return ReportType.OPERATIONAL_MONEY_CHANGE;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodLiabilitiesClaimsReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodLiabilitiesClaimsReportBuilder.java
new file mode 100644
index 000000000..4d5532b07
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodLiabilitiesClaimsReportBuilder.java
@@ -0,0 +1,44 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.spcex.clearing.reports.reports.SessionIdListParams;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.Collections;
+
+public class PeriodLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsReportBuilder {
+
+ public PeriodLiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected String getReportFilename(SessionIdListParams params) {
+ return "period_liabilities_claims.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ public ReportType getReportType() {
+ return ReportType.PERIOD_LIABILITIES_CLAIMS;
+ }
+
+ @Override
+ protected Collection getExecutionFondsForReport(SessionIdListParams params) {
+ if (params.getSessionIdList() == null || params.getSessionIdList().isEmpty()) return Collections.emptyList();
+ return executionFondImdg.getCollectionObjectsByPredicate(
+ executionFondImdg.predicateBuilder().in("sessionId", params.getSessionIdList().toArray(new Long[0]))
+ );
+ }
+
+ @Override
+ protected Collection getExecutionDepositsForReport(SessionIdListParams params) {
+ if (params.getSessionIdList() == null || params.getSessionIdList().isEmpty()) return Collections.emptyList();
+ return executionDepositImdg.getCollectionObjectsByPredicate(
+ executionDepositImdg.predicateBuilder().in("sessionId", params.getSessionIdList().toArray(new Long[0]))
+ );
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodMoneyChangeReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodMoneyChangeReportBuilder.java
new file mode 100644
index 000000000..6e35c0cab
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodMoneyChangeReportBuilder.java
@@ -0,0 +1,43 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.clearing.reports.reports.PeriodParams;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+
+public class PeriodMoneyChangeReportBuilder extends MoneyChangeReportBuilder {
+
+ public PeriodMoneyChangeReportBuilder(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected Collection getRegistryForReport(PeriodParams params) {
+ ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
+ return registryImdg.getCollectionObjectsByPredicate(
+ pb.and(
+ pb.greatEqual("clearingDate", params.getStartDate()),
+ pb.lessEqual("clearingDate", params.getEndDate())
+ )
+ );
+ }
+
+ @Override
+ public String getReportFilename(PeriodParams params) {
+ return "period_money_change.%s-%s.%s".formatted(
+ dateFormatter.format(params.getStartDate()),
+ dateFormatter.format(params.getEndDate()),
+ dateTimeFormatter.format(LocalDateTime.now())
+ );
+ }
+
+ @Override
+ public ReportType getReportType() {
+ return ReportType.PERIOD_MONEY_CHANGE;
+ }
+
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryLiabilitiesClaimsReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryLiabilitiesClaimsReportBuilder.java
new file mode 100644
index 000000000..50de7bac2
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryLiabilitiesClaimsReportBuilder.java
@@ -0,0 +1,36 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.spcex.clearing.reports.reports.EmptyParams;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+
+public class SummaryLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsReportBuilder {
+ public SummaryLiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected Collection getExecutionFondsForReport(EmptyParams params) {
+ return executionFondImdg.getAllValues();
+ }
+
+ @Override
+ protected Collection getExecutionDepositsForReport(EmptyParams params) {
+ return executionDepositImdg.getAllValues();
+ }
+
+ @Override
+ protected String getReportFilename(EmptyParams params) {
+ return "summary_money_change.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ public ReportType getReportType() {
+ return ReportType.SUMMARY_LIABILITIES_CLAIMS;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryMoneyChangeReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryMoneyChangeReportBuilder.java
new file mode 100644
index 000000000..a636c5911
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryMoneyChangeReportBuilder.java
@@ -0,0 +1,31 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.registry.Registry;
+import ru.spcex.clearing.reports.reports.EmptyParams;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+
+public class SummaryMoneyChangeReportBuilder extends MoneyChangeReportBuilder {
+ public SummaryMoneyChangeReportBuilder(ImdgProvider imdgProvider) {
+ super(imdgProvider);
+ }
+
+ @Override
+ protected Collection getRegistryForReport(EmptyParams param) {
+ return registryImdg.getAllValues();
+ }
+
+ @Override
+ protected String getReportFilename(EmptyParams params) {
+ return "summary_money_change.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ public ReportType getReportType() {
+ return ReportType.SUMMARY_MONEY_CHANGE;
+ }
+
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java
new file mode 100644
index 000000000..249b53211
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java
@@ -0,0 +1,95 @@
+package ru.spcex.clearing.reports.reports.bp;
+
+import ru.clearing.classes.statics.data.company.Company;
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.clearing.classes.statics.data.misc.STrades;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.reports.reports.CSVReportBuilder;
+import ru.spcex.clearing.reports.reports.SessionIdParam;
+import ru.spcex.platform.enumeration.Allowed;
+import ru.spcex.platform.enumeration.ReportType;
+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;
+import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class UnfulfilledDealReportBuilder extends CSVReportBuilder {
+ private final Imdg executionFondImdg;
+ private final Imdg companyImdg;
+ private final Imdg sTradesImdg;
+ private final String[] headers = {
+ "id", "securityId", "tradeNo", "tradeDate", "settleCode"
+ };
+ private List lines = null;
+
+ public UnfulfilledDealReportBuilder(ImdgProvider imdgProvider) {
+ executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
+ companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
+ sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
+ }
+
+ @Override
+ public String[] getHeaders() {
+ return headers;
+ }
+
+ @Override
+ protected List getLines() {
+ return lines;
+ }
+
+ @Override
+ protected String getReportFilename(SessionIdParam params) {
+ return "unfulfilled_deal_report.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
+ }
+
+ @Override
+ public ReportType getReportType() {
+ return ReportType.UNFULFILLED_DEAL_REPORT;
+ }
+
+ @Override
+ protected void collect(SessionIdParam params) {
+ ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
+ ImdgPredicate predicate = pb.and(
+ pb.equals("sessionId", params.getSessionId()),
+ pb.equals("coverageStatus", Allowed.DENIED.getKey())
+ );
+ Collection executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate);
+
+ lines = new ArrayList<>(executionFonds.size());
+ for (ExecutionFond executionFond : executionFonds) {
+ Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
+ if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
+ STrades sTrade = sTradesImdg.getSingleObjectByFieldValues(
+ Map.of(
+ "settleCode", executionFond.getSettlementCode(),
+ "operation", executionFond.getSide()
+ )
+ );
+
+ String id = String.valueOf(executionFond.getId());
+ String securityId = String.valueOf(executionFond.getSecurityId());
+ String tradeNo = String.valueOf(executionFond.getExchangeExecutionId());
+ String tradeDate = dateFormatter.format(executionFond.getTradingDate());
+ String settleCode = sTrade != null ? sTrade.getClassCode() : null;
+
+ int valueIdx = 0;
+ String[] line = new String[getHeaders().length];
+ line[valueIdx++] = id;
+ line[valueIdx++] = securityId;
+ line[valueIdx++] = tradeNo;
+ line[valueIdx++] = tradeDate;
+ line[valueIdx++] = settleCode;
+ lines.add(line);
+ }
+ }
+
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_B.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_B.java
similarity index 98%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_B.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_B.java
index 1f3c7ae98..d638fbf44 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_B.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_B.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_12_2;
+package ru.spcex.clearing.reports.reports.bt.bt_12_2;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("netPositionBank")
+@Deprecated
public class ReportPA_B extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("clearingMemberCategory")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_IV.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_IV.java
similarity index 98%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_IV.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_IV.java
index 12d124dc7..a989f5a03 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_IV.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_IV.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_12_2;
+package ru.spcex.clearing.reports.reports.bt.bt_12_2;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("netPositionInitiator")
+@Deprecated
public class ReportPA_IV extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("clearingMemberCategory")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/ReportDOCIN.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCIN.java
similarity index 87%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/ReportDOCIN.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCIN.java
index 3b8a7171b..c10a38e33 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/ReportDOCIN.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCIN.java
@@ -1,12 +1,9 @@
-package ru.spcex.clearing.reports.reports.bt_13;
+package ru.spcex.clearing.reports.reports.bt.bt_13;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-import com.thoughtworks.xstream.annotations.XStreamConverter;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.reports.ReportId;
-import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter;
-import ru.spcex.clearing.reports.xml_test.FormattedLocalTimeConverter;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -15,13 +12,14 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("incomingDocuments")
+@Deprecated
public class ReportDOCIN extends AbstractReport {
/**
* Дата в формате: dd.MM.yyyy
*/
@XStreamAsAttribute
@XStreamAlias("date")
- @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
+// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
private final LocalDate date;
/**
@@ -29,7 +27,7 @@ public class ReportDOCIN extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("time")
- @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
+// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
private final LocalTime time;
@XStreamAlias("rows")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/ReportDOCOUT.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCOUT.java
similarity index 87%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/ReportDOCOUT.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCOUT.java
index 05f22cc48..be4037989 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/ReportDOCOUT.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCOUT.java
@@ -1,12 +1,9 @@
-package ru.spcex.clearing.reports.reports.bt_13;
+package ru.spcex.clearing.reports.reports.bt.bt_13;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-import com.thoughtworks.xstream.annotations.XStreamConverter;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.reports.ReportId;
-import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter;
-import ru.spcex.clearing.reports.xml_test.FormattedLocalTimeConverter;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -15,13 +12,14 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("incomingDocuments")
+@Deprecated
public class ReportDOCOUT extends AbstractReport {
/**
* Дата в формате: dd.MM.yyyy
*/
@XStreamAsAttribute
@XStreamAlias("date")
- @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
+// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
private final LocalDate date;
/**
@@ -29,7 +27,7 @@ public class ReportDOCOUT extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("time")
- @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
+// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
private final LocalTime time;
@XStreamAlias("rows")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/ReportINACCNT.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_16_5/ReportINACCNT.java
similarity index 86%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/ReportINACCNT.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_16_5/ReportINACCNT.java
index 3b1221020..32d9cad93 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/ReportINACCNT.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_16_5/ReportINACCNT.java
@@ -1,12 +1,9 @@
-package ru.spcex.clearing.reports.reports.bt_16_5;
+package ru.spcex.clearing.reports.reports.bt.bt_16_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-import com.thoughtworks.xstream.annotations.XStreamConverter;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.reports.ReportId;
-import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter;
-import ru.spcex.clearing.reports.xml_test.FormattedLocalTimeConverter;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -15,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("accountBalanceInfo")
+@Deprecated
public class ReportINACCNT extends AbstractReport {
@XStreamAsAttribute
@XStreamAlias("clearingMemberCategory")
@@ -25,7 +23,7 @@ public class ReportINACCNT extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("date")
- @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
+// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
private final LocalDate date;
/**
@@ -33,7 +31,7 @@ public class ReportINACCNT extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("time")
- @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
+// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
private final LocalTime time;
@XStreamAlias("rows")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P1.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P1.java
index 67aafde5b..bd317a145 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P1.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_1;
+package ru.spcex.clearing.reports.reports.bt.bt_17_1;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -14,6 +14,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearedLiabilities")
+@Deprecated
public class ReportBR_0420315_P1 extends ReportWithClearingStatus {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P2.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P2.java
index 7520ed7f0..dd013a1ff 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P2.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_1;
+package ru.spcex.clearing.reports.reports.bt.bt_17_1;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -10,6 +10,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearedLiabilitiesTotal")
+@Deprecated
public class ReportBR_0420315_P2 extends ReportWithPeriod {
@XStreamAlias("rows")
private Info_0420315_P2 rows;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_2/ReportBR_0420317.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_2/ReportBR_0420317.java
index 94009f5c6..167b889de 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_2/ReportBR_0420317.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_2;
+package ru.spcex.clearing.reports.reports.bt.bt_17_2;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingServiceStatus")
+@Deprecated
public class ReportBR_0420317 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_3/ReportBR_0420318.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_3/ReportBR_0420318.java
index e42c06933..0a4d1529c 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_3/ReportBR_0420318.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_3;
+package ru.spcex.clearing.reports.reports.bt.bt_17_3;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -13,6 +13,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("unfundedLiabilities")
+@Deprecated
public class ReportBR_0420318 extends ReportWithClearingStatus {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P1.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P1.java
index a72ecca3b..55fede8b5 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P1.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_4;
+package ru.spcex.clearing.reports.reports.bt.bt_17_4;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("accountTransactionLiabilities")
+@Deprecated
public class ReportBR_0420314_P1 extends ReportWithClearingStatus {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P2.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P2.java
index f4019dfdd..1feed5112 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P2.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_4;
+package ru.spcex.clearing.reports.reports.bt.bt_17_4;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -11,6 +11,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("accountTransactionTurnover")
+@Deprecated
public class ReportBR_0420314_P2 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P1.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P1.java
index 03e5cbc05..3e6492797 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P1.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -11,6 +11,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage1")
+@Deprecated
public class ReportBR_0420312_P1 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P10.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P10.java
index 08a428309..32ad2e543 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P10.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage10")
+@Deprecated
public class ReportBR_0420312_P10 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P2.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P2.java
index 22706fb9d..6e0043854 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P2.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage2")
+@Deprecated
public class ReportBR_0420312_P2 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P3.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P3.java
index 4b78a1b87..79ec3df44 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P3.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage3")
+@Deprecated
public class ReportBR_0420312_P3 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P4.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P4.java
index d7aa87a9f..e8350d3b7 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P4.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage4")
+@Deprecated
public class ReportBR_0420312_P4 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P5.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P5.java
index 9132d81db..5579eaf22 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P5.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage5")
+@Deprecated
public class ReportBR_0420312_P5 extends ReportWithPeriod {
@XStreamAsAttribute
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P6.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P6.java
index 00a273649..7f8220da6 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P6.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage6")
+@Deprecated
public class ReportBR_0420312_P6 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P7.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P7.java
index c35b4230c..fa809a07e 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P7.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage7")
+@Deprecated
public class ReportBR_0420312_P7 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P8.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P8.java
index eff2fb7a7..51d6c3345 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P8.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage8")
+@Deprecated
public class ReportBR_0420312_P8 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P9.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P9.java
index 92c5e7f68..24e899539 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P9.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.reports.bt_17_5;
+package ru.spcex.clearing.reports.reports.bt.bt_17_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@@ -12,6 +12,7 @@ import java.util.ArrayList;
import java.util.List;
@XStreamAlias("clearingCoverage9")
+@Deprecated
public class ReportBR_0420312_P9 extends ReportWithPeriod {
@XStreamAsAttribute
@XStreamAlias("destination")
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java
new file mode 100644
index 000000000..2718a3053
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java
@@ -0,0 +1,237 @@
+package ru.spcex.clearing.reports.services;
+
+import org.apache.kafka.clients.consumer.Consumer;
+import org.apache.kafka.clients.producer.Producer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
+import ru.spcex.clearing.platform.messaging.domain.Consts;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithPeriod;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionIdList;
+import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
+import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
+import ru.spcex.clearing.reports.config.element.ReportsServiceSettings;
+import ru.spcex.clearing.reports.reports.*;
+import ru.spcex.clearing.util.security.UserRoleVerification;
+import ru.spcex.clearing.validation.common.ValidationHelper;
+import ru.spcex.platform.enumeration.ReportType;
+import ru.spcex.platform.utils.enumeration.IEnumKey;
+import ru.spcex.platform.utils.validation.IValidator;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+@Service
+public class ReportService extends QueueConsumer implements InitializingBean {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ private final UserRoleVerification userRoleVerification;
+ private final ValidationHelper validationHelper;
+ private final Function reportRequestValidator;
+ private final Function reportRequestWithSessionIdValidator;
+ private final Function reportRequestWithSessionIdListValidator;
+ private final Function reportRequestWithPeriodValidator;
+ private final Map>> reportBuildersWithoutParams;
+ private final Map>> reportBuildersWithSessionIdParam;
+ private final Map>> reportBuildersWithSessionIdListParam;
+ private final Map>> reportBuildersWithPeriodParams;
+
+ private final File outFolder;
+
+ public ReportService(Consumer kafkaQueue,
+ Producer kafkaResponseQueue,
+ UserRoleVerification userRoleVerification,
+ ValidationHelper validationHelper,
+ ReportsServiceSettings reportsServiceSettings,
+ @Qualifier("reportBuildersWithoutParams")
+ Map>> reportBuildersWithoutParams,
+ @Qualifier("reportBuildersWithSessionIdParam")
+ Map>> reportBuildersWithSessionIdParam,
+ @Qualifier("reportBuildersWithSessionIdListParam")
+ Map>> reportBuildersWithSessionIdListParam,
+ @Qualifier("reportBuildersWithPeriodParams")
+ Map>> reportBuildersWithPeriodParams,
+ @Qualifier("reportRequestValidator")
+ Function reportRequestValidator,
+ @Qualifier("reportRequestWithSessionIdValidator")
+ Function reportRequestWithSessionIdValidator,
+ @Qualifier("reportRequestWithSessionIdListValidator")
+ Function reportRequestWithSessionIdListValidator,
+ @Qualifier("reportRequestWithPeriodValidator")
+ Function reportRequestWithPeriodValidator) {
+ super(kafkaQueue, kafkaResponseQueue);
+ this.userRoleVerification = userRoleVerification;
+ this.validationHelper = validationHelper;
+ this.reportRequestValidator = reportRequestValidator;
+ this.reportRequestWithSessionIdValidator = reportRequestWithSessionIdValidator;
+ this.reportRequestWithSessionIdListValidator = reportRequestWithSessionIdListValidator;
+ this.reportRequestWithPeriodValidator = reportRequestWithPeriodValidator;
+ this.reportBuildersWithoutParams = reportBuildersWithoutParams;
+ this.reportBuildersWithSessionIdParam = reportBuildersWithSessionIdParam;
+ this.reportBuildersWithSessionIdListParam = reportBuildersWithSessionIdListParam;
+ this.reportBuildersWithPeriodParams = reportBuildersWithPeriodParams;
+ this.outFolder = new File(reportsServiceSettings.getReportModuleOut());
+ assert outFolder.isDirectory();
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ callback(ReportRequest.class)
+ .setFunction(this::createReport)
+ .forDestination(Consts.CREATE_REPORT, callbacks::put);
+ callback(ReportRequestWithSessionId.class)
+ .setFunction(this::createReportForSessionId)
+ .forDestination(Consts.CREATE_REPORT_FOR_SESSION_ID, callbacks::put);
+ callback(ReportRequestWithSessionIdList.class)
+ .setFunction(this::createReportForSessionIdList)
+ .forDestination(Consts.CREATE_REPORT_FOR_SESSION_ID_LIST, callbacks::put);
+ callback(ReportRequestWithPeriod.class)
+ .setFunction(this::createReportForPeriod)
+ .forDestination(Consts.CREATE_REPORT_FOR_PERIOD, callbacks::put);
+ init();
+ }
+
+ public RequestInfoUpdate createReport(BaseRequest userRequest) {
+ log.debug("ReportRequest received");
+ RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
+ if (requestInfoUpdate != null) return null;
+
+ requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestValidator);
+ if (requestInfoUpdate != null) return null;
+
+ ReportRequest req = userRequest.getRequestPayload();
+ log.debug("Create report type {}...", req.getReportId());
+
+ List> builders = reportBuildersWithoutParams.get(
+ IEnumKey.getEnumByKey(ReportType.class, req.getReportId())
+ );
+ List outFilenames = new ArrayList<>();
+ for (CSVReportBuilder builder : builders) {
+ File outFile = builder.createReport(new EmptyParams(), outFolder);
+ if (outFile == null) continue;
+ outFilenames.add(outFile.getAbsolutePath());
+ }
+
+ int outFilesCnt = outFilenames.size();
+ if (outFilesCnt == 0) {
+ log.error("Create report {} failed, see log", req.getReportId());
+ } else if (outFilesCnt < builders.size()) {
+ log.error("Create some error for {} failed, see log", req.getReportId());
+ } else {
+ log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames));
+ }
+ return null;
+ }
+
+ public RequestInfoUpdate createReportForSessionId(BaseRequest userRequest) {
+ log.debug("ReportRequestWithSessionId received");
+ RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
+ if (requestInfoUpdate != null) return null;
+
+ requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestWithSessionIdValidator);
+ if (requestInfoUpdate != null) return null;
+
+ ReportRequestWithSessionId req = userRequest.getRequestPayload();
+ log.debug("Create report type {}...", req.getReportId());
+
+ List> builders = reportBuildersWithSessionIdParam.get(
+ IEnumKey.getEnumByKey(ReportType.class, req.getReportId())
+ );
+ List outFilenames = new ArrayList<>();
+ for (CSVReportBuilder builder : builders) {
+ SessionIdParam sessionIdParam = new SessionIdParam();
+ sessionIdParam.setSessionId(req.getSessionId());
+ File outFile = builder.createReport(sessionIdParam, outFolder);
+ if (outFile == null) continue;
+ outFilenames.add(outFile.getAbsolutePath());
+ }
+
+ int outFilesCnt = outFilenames.size();
+ if (outFilesCnt == 0) {
+ log.error("Create report {} failed, see log", req.getReportId());
+ } else if (outFilesCnt < builders.size()) {
+ log.error("Create some error for {} failed, see log", req.getReportId());
+ } else {
+ log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames));
+ }
+ return null;
+ }
+
+ public RequestInfoUpdate createReportForSessionIdList(BaseRequest userRequest) {
+ log.debug("ReportRequestWithSessionIdList received");
+ RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
+ if (requestInfoUpdate != null) return null;
+
+ requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestWithSessionIdListValidator);
+ if (requestInfoUpdate != null) return null;
+
+ ReportRequestWithSessionIdList req = userRequest.getRequestPayload();
+ log.debug("Create report type {}...", req.getReportId());
+
+ List> builders = reportBuildersWithSessionIdListParam.get(
+ IEnumKey.getEnumByKey(ReportType.class, req.getReportId())
+ );
+ List outFilenames = new ArrayList<>();
+ for (CSVReportBuilder builder : builders) {
+ SessionIdListParams sessionIdListParams = new SessionIdListParams();
+ sessionIdListParams.setSessionIdList(req.getSessionIdList());
+ File outFile = builder.createReport(sessionIdListParams, outFolder);
+ if (outFile == null) continue;
+ outFilenames.add(outFile.getAbsolutePath());
+ }
+
+ int outFilesCnt = outFilenames.size();
+ if (outFilesCnt == 0) {
+ log.error("Create report {} failed, see log", req.getReportId());
+ } else if (outFilesCnt < builders.size()) {
+ log.error("Create some error for {} failed, see log", req.getReportId());
+ } else {
+ log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames));
+ }
+ return null;
+ }
+
+ public RequestInfoUpdate createReportForPeriod(BaseRequest userRequest) {
+ log.debug("ReportRequestWithPeriod received");
+ RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
+ if (requestInfoUpdate != null) return null;
+
+ requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestWithPeriodValidator);
+ if (requestInfoUpdate != null) return null;
+
+ ReportRequestWithPeriod req = userRequest.getRequestPayload();
+ log.debug("Create report type {}...", req.getReportId());
+
+ List> builders = reportBuildersWithPeriodParams.get(
+ IEnumKey.getEnumByKey(ReportType.class, req.getReportId())
+ );
+ List outFilenames = new ArrayList<>();
+ for (CSVReportBuilder builder : builders) {
+ PeriodParams periodParams = new PeriodParams();
+ periodParams.setStartDate(req.getStartDate());
+ periodParams.setEndDate(req.getEndDate());
+ File outFile = builder.createReport(periodParams, outFolder);
+ if (outFile == null) continue;
+ outFilenames.add(outFile.getAbsolutePath());
+ }
+
+ int outFilesCnt = outFilenames.size();
+ if (outFilesCnt == 0) {
+ log.error("Create report {} failed, see log", req.getReportId());
+ } else if (outFilesCnt < builders.size()) {
+ log.error("Create some error for {} failed, see log", req.getReportId());
+ } else {
+ log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames));
+ }
+ return null;
+ }
+
+
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java
index dcde34308..04e9c6e79 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java
@@ -5,6 +5,7 @@ import ru.spcex.clearing.reports.reports.AbstractReport;
import java.io.File;
import java.io.IOException;
+@Deprecated
public abstract class FileReportBuilder {
protected final Class extends AbstractReport> reportClass;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java
index 2dd5e8546..baafed9b4 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java
@@ -12,6 +12,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
+@Deprecated
public class XMLReportBuilder extends FileReportBuilder {
private final Logger log = LoggerFactory.getLogger(getClass());
protected final XStream xStream;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_B_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_B_Collector.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_B_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_B_Collector.java
index 22f76e2b2..89d132aaf 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_B_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_B_Collector.java
@@ -1,10 +1,10 @@
-package ru.spcex.clearing.reports.services.collector;
+package ru.spcex.clearing.reports.services.collector.bt.bt_12_2;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_12_2.ReportPA_B;
+import ru.spcex.clearing.reports.reports.bt.bt_12_2.ReportPA_B;
import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.imdg.api.Imdg;
@@ -20,6 +20,7 @@ import java.util.Set;
import java.util.stream.Collectors;
@Component
+@Deprecated
public class ReportPA_B_Collector extends ReportWithPeriodCollector {
private final Imdg liabilitiesClaimsAssetsImdg;
private final Imdg clearingMemberCategoryImdg;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_IV_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_IV_Collector.java
similarity index 97%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_IV_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_IV_Collector.java
index c7620a313..b14a4978e 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_IV_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_IV_Collector.java
@@ -1,11 +1,11 @@
-package ru.spcex.clearing.reports.services.collector;
+package ru.spcex.clearing.reports.services.collector.bt.bt_12_2;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
import ru.clearing.platform.dictionary.ClearingStatusDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_12_2.ReportPA_IV;
+import ru.spcex.clearing.reports.reports.bt.bt_12_2.ReportPA_IV;
import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.imdg.api.Imdg;
@@ -20,6 +20,7 @@ import java.util.Set;
import java.util.stream.Collectors;
@Component
+@Deprecated
public class ReportPA_IV_Collector extends ReportWithPeriodCollector {
private final Imdg liabilitiesClaimsAssetsImdg;
private final Imdg clearingStatusDictionaryImdg;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportDOCIN_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCIN_Collector.java
similarity index 95%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportDOCIN_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCIN_Collector.java
index d0f6a9723..4376a8adf 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportDOCIN_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCIN_Collector.java
@@ -1,11 +1,11 @@
-package ru.spcex.clearing.reports.services.collector;
+package ru.spcex.clearing.reports.services.collector.bt.bt_13;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.journal.InDocumentJournal;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_13.ReportDOCIN;
+import ru.spcex.clearing.reports.reports.bt.bt_13.ReportDOCIN;
import ru.spcex.clearing.reports.services.SimpleReportCollector;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@@ -17,6 +17,7 @@ import java.time.LocalTime;
import java.util.Collection;
@Component
+@Deprecated
public class ReportDOCIN_Collector extends SimpleReportCollector {
protected final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportDOCOUT_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCOUT_Collector.java
similarity index 95%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportDOCOUT_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCOUT_Collector.java
index 012000faf..3e613a82d 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportDOCOUT_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCOUT_Collector.java
@@ -1,11 +1,11 @@
-package ru.spcex.clearing.reports.services.collector;
+package ru.spcex.clearing.reports.services.collector.bt.bt_13;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.journal.OutDocumentJournal;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_13.ReportDOCOUT;
+import ru.spcex.clearing.reports.reports.bt.bt_13.ReportDOCOUT;
import ru.spcex.clearing.reports.services.SimpleReportCollector;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@@ -17,6 +17,7 @@ import java.time.LocalTime;
import java.util.Collection;
@Component
+@Deprecated
public class ReportDOCOUT_Collector extends SimpleReportCollector {
protected final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportINACCNT_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_16_5/ReportINACCNT_Collector.java
similarity index 95%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportINACCNT_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_16_5/ReportINACCNT_Collector.java
index 8ec532b53..ef8f26a24 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportINACCNT_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_16_5/ReportINACCNT_Collector.java
@@ -1,10 +1,10 @@
-package ru.spcex.clearing.reports.services.collector;
+package ru.spcex.clearing.reports.services.collector.bt.bt_16_5;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.AccountBalance;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_16_5.ReportINACCNT;
+import ru.spcex.clearing.reports.reports.bt.bt_16_5.ReportINACCNT;
import ru.spcex.clearing.reports.services.ReportForClearingCodeCollector;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.imdg.api.Imdg;
@@ -19,6 +19,7 @@ import java.util.Set;
import java.util.stream.Collectors;
@Component
+@Deprecated
public class ReportINACCNT_Collector extends ReportForClearingCodeCollector {
private final Imdg accountBalanceImdg;
private final Imdg companyImdg;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_P1_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P1_Collector.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_P1_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P1_Collector.java
index 3f4f9f381..6acb0fb0b 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_P1_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P1_Collector.java
@@ -1,16 +1,17 @@
-package ru.spcex.clearing.reports.services.collector;
+package ru.spcex.clearing.reports.services.collector.bt.bt_17_1;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
-import ru.clearing.classes.statics.data.misc.Listing;
+import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
+import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.platform.dictionary.ClearingStatusDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P1;
+import ru.spcex.clearing.reports.reports.bt.bt_17_1.ReportBR_0420315_P1;
import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
+import ru.spcex.clearing.reports.services.collector.MapUtil;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.ClearingStatus;
import ru.spcex.platform.enumeration.Market;
@@ -22,6 +23,7 @@ import java.time.LocalDate;
import java.util.*;
@Component
+@Deprecated
public class ReportBR_0420315_P1_Collector extends ReportWithPeriodCollector {
protected static final List ALLOW_CLEARING_MEMBER_CATEGORY = Arrays.asList(ClearingCategory.I.getKey(), ClearingCategory.V.getKey());
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P2_collector.java
similarity index 92%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_P2_collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P2_collector.java
index 648f69cd0..9085d5c76 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_P2_collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P2_collector.java
@@ -1,56 +1,57 @@
-package ru.spcex.clearing.reports.services.collector;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P2;
-import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
-import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-
-import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.util.Collection;
-import java.util.HashSet;
-
-@Component
-public class ReportBR_0420315_P2_collector extends ReportWithPeriodCollector {
- private Imdg liabilitiesClaimsAssetsImdg;
-
- @Autowired
- public ReportBR_0420315_P2_collector(ImdgProvider imdgProvider) {
- liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class);
- }
-
- @Override
- public ReportBR_0420315_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
- validateDateRange(startDate, endDate);
- Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate);
-
- long liabilitiesAmount;
- BigDecimal contractorQty = BigDecimal.ZERO;
- {
- HashSet collectedToSumm = new HashSet<>();
- for (LiabilitiesClaimsAssets lContract : liabilities) {
- if (lContract.getLiabilitiesQuantity() != null && StringUtils.isNotEmpty(lContract.getContract())) {
- collectedToSumm.add(lContract.getContract());
- contractorQty = contractorQty.add(lContract.getLiabilitiesQuantity());
- }
- }
- liabilitiesAmount = collectedToSumm.size();
- }
-
- ReportBR_0420315_P2 reportBR_0420315_p2 = new ReportBR_0420315_P2(startDate, endDate);
- reportBR_0420315_p2.setRows(new ReportBR_0420315_P2.Info_0420315_P2(toString(contractorQty),
- toString(liabilitiesAmount)));
-
- return reportBR_0420315_p2;
- }
-
- @Override
- public Class getReportClass() {
- return ReportBR_0420315_P2.class;
- }
-}
+package ru.spcex.clearing.reports.services.collector.bt.bt_17_1;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.reports.reports.bt.bt_17_1.ReportBR_0420315_P2;
+import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Collection;
+import java.util.HashSet;
+
+@Component
+@Deprecated
+public class ReportBR_0420315_P2_collector extends ReportWithPeriodCollector {
+ private Imdg liabilitiesClaimsAssetsImdg;
+
+ @Autowired
+ public ReportBR_0420315_P2_collector(ImdgProvider imdgProvider) {
+ liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class);
+ }
+
+ @Override
+ public ReportBR_0420315_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
+ validateDateRange(startDate, endDate);
+ Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate);
+
+ long liabilitiesAmount;
+ BigDecimal contractorQty = BigDecimal.ZERO;
+ {
+ HashSet collectedToSumm = new HashSet<>();
+ for (LiabilitiesClaimsAssets lContract : liabilities) {
+ if (lContract.getLiabilitiesQuantity() != null && StringUtils.isNotEmpty(lContract.getContract())) {
+ collectedToSumm.add(lContract.getContract());
+ contractorQty = contractorQty.add(lContract.getLiabilitiesQuantity());
+ }
+ }
+ liabilitiesAmount = collectedToSumm.size();
+ }
+
+ ReportBR_0420315_P2 reportBR_0420315_p2 = new ReportBR_0420315_P2(startDate, endDate);
+ reportBR_0420315_p2.setRows(new ReportBR_0420315_P2.Info_0420315_P2(toString(contractorQty),
+ toString(liabilitiesAmount)));
+
+ return reportBR_0420315_p2;
+ }
+
+ @Override
+ public Class getReportClass() {
+ return ReportBR_0420315_P2.class;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420317_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_2/ReportBR_0420317_Collector.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420317_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_2/ReportBR_0420317_Collector.java
index c0d7748b0..383fe89f4 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420317_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_2/ReportBR_0420317_Collector.java
@@ -1,4 +1,4 @@
-package ru.spcex.clearing.reports.services.collector;
+package ru.spcex.clearing.reports.services.collector.bt.bt_17_2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -6,7 +6,7 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_17_2.ReportBR_0420317;
+import ru.spcex.clearing.reports.reports.bt.bt_17_2.ReportBR_0420317;
import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
import ru.spcex.platform.enumeration.DocumentTypes;
import ru.spcex.platform.imdg.api.Imdg;
@@ -20,6 +20,7 @@ import java.util.Collection;
import java.util.Map;
@Component
+@Deprecated
public class ReportBR_0420317_Collector extends ReportWithPeriodCollector {
private Imdg companyImdg;
private Imdg relationImdg;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420318_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_3/ReportBR_0420318_Collector.java
similarity index 96%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420318_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_3/ReportBR_0420318_Collector.java
index fa512d506..2ef561446 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420318_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_3/ReportBR_0420318_Collector.java
@@ -1,15 +1,16 @@
-package ru.spcex.clearing.reports.services.collector;
+package ru.spcex.clearing.reports.services.collector.bt.bt_17_3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
-import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
-import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsMoney;
import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
+import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsMoney;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_17_3.ReportBR_0420318;
+import ru.spcex.clearing.reports.reports.bt.bt_17_3.ReportBR_0420318;
import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
+import ru.spcex.clearing.reports.services.collector.MapUtil;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.DocumentTypes;
import ru.spcex.platform.imdg.api.Imdg;
@@ -22,6 +23,7 @@ import java.util.List;
import java.util.Map;
@Component
+@Deprecated
public class ReportBR_0420318_Collector extends ReportWithPeriodCollector {
private Imdg liabilitiesClaimsAssetsImdg;
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420314_P1_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P1_Collector.java
similarity index 95%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420314_P1_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P1_Collector.java
index 75e0d3f0c..bf4022354 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420314_P1_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P1_Collector.java
@@ -1,99 +1,101 @@
-package ru.spcex.clearing.reports.services.collector;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import ru.clearing.classes.statics.data.company.Company;
-import ru.clearing.classes.statics.data.company.CompanySymbols;
-import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
-import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
-import ru.clearing.platform.dictionary.ClearingStatusDictionary;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_17_4.ReportBR_0420314_P1;
-import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
-import ru.spcex.platform.enumeration.ClearingStatus;
-import ru.spcex.platform.enumeration.DocumentTypes;
-import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-
-import java.time.LocalDate;
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * accountTransactionLiabilities
- */
-@Component
-public class ReportBR_0420314_P1_Collector extends ReportWithPeriodCollector {
- private Imdg companyImdg;
- private Imdg companySymbolsImdg;
- private Imdg clearingMemberCategoryImdg;
- private Imdg liabilitiesClaimsAssetsImdg;
- private Imdg clearingStatusDictionaryImdg;
-
- protected static final String ALLOW_CLEARING_STATUS = ClearingStatus.OK.getKey();
-
- @Autowired
- public ReportBR_0420314_P1_Collector(ImdgProvider imdgProvider) {
- companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
- liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class);
- companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
- clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
- clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class);
- }
-
- protected CompanySymbols findSymbol(DocumentTypes docType, Long companyId) {
- CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of(
- "companySymbol", docType.getKey(),
- "companyId", companyId
- ));
- return companySymbol;
- }
-
-
- @Override
- public ReportBR_0420314_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
- validateDateRange(startDate, endDate);
-
- ReportBR_0420314_P1 reportBR_0420312P1 = new ReportBR_0420314_P1(startDate, endDate, "BR",
- ALLOW_CLEARING_STATUS //clearingStatus.getCode() "OK"
- );
- final Long allowClearingStatusId = MapUtil.getDictionaryIdByCode(clearingStatusDictionaryImdg, ALLOW_CLEARING_STATUS); // "OK"
-
- Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate, allowClearingStatusId);
-
- for (LiabilitiesClaimsAssets liability: liabilities) {
- final Long companyId = liability.getCompanyId();
- Company company = companyImdg.getSingleObjectByID(companyId);
- if (company == null) {
- log.warn("Company not found by LiabilitiesClaimsAssets.CompanyId={}", companyId);
- continue;
- }
- Collection cmcLst = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId));
- String cleanMemberCategories = MapUtil.joinMultiString(cmcLst, ClearingMemberCategory::getClearingMemberCategory);
-
- CompanySymbols companySymbolCntr = findSymbol(DocumentTypes.cntr, company.getId());
- CompanySymbols companySymbolINN = findSymbol(DocumentTypes.inn, company.getId());
- CompanySymbols companySymbolOGRN = findSymbol(DocumentTypes.ogrn, company.getId());
-
- ReportBR_0420314_P1.Info_0420314_P1 info_0420314P1 = new ReportBR_0420314_P1.Info_0420314_P1(
- toString(company.getClearingCode()),
- toString(companySymbolCntr == null? null : companySymbolCntr.getId()),
- toString(company.getFullName()),
- toString(companySymbolINN == null ? null : companySymbolINN.getCompanySymbolValue()),
- toString(companySymbolOGRN == null? null : companySymbolOGRN.getCompanySymbolValue()),
- toString(cleanMemberCategories), // может быть несколько, тогда через запятую перечислить
- toString(liability.getRefundPaymentId()),
- toString(liability.getTradingDate()),
- toString(liability.getLiabilitiesQuantity())
- );
- reportBR_0420312P1.getRows().add(info_0420314P1);
- }
-
- return reportBR_0420312P1;
- }
-
- @Override
- public Class getReportClass() {
- return ReportBR_0420314_P1.class;
- }
-}
+package ru.spcex.clearing.reports.services.collector.bt.bt_17_4;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
+import ru.clearing.classes.statics.data.company.Company;
+import ru.clearing.classes.statics.data.company.CompanySymbols;
+import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
+import ru.clearing.platform.dictionary.ClearingStatusDictionary;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.reports.reports.bt.bt_17_4.ReportBR_0420314_P1;
+import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
+import ru.spcex.clearing.reports.services.collector.MapUtil;
+import ru.spcex.platform.enumeration.ClearingStatus;
+import ru.spcex.platform.enumeration.DocumentTypes;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.time.LocalDate;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * accountTransactionLiabilities
+ */
+@Component
+@Deprecated
+public class ReportBR_0420314_P1_Collector extends ReportWithPeriodCollector {
+ private Imdg companyImdg;
+ private Imdg companySymbolsImdg;
+ private Imdg clearingMemberCategoryImdg;
+ private Imdg liabilitiesClaimsAssetsImdg;
+ private Imdg clearingStatusDictionaryImdg;
+
+ protected static final String ALLOW_CLEARING_STATUS = ClearingStatus.OK.getKey();
+
+ @Autowired
+ public ReportBR_0420314_P1_Collector(ImdgProvider imdgProvider) {
+ companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
+ liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class);
+ companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
+ clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
+ clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class);
+ }
+
+ protected CompanySymbols findSymbol(DocumentTypes docType, Long companyId) {
+ CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of(
+ "companySymbol", docType.getKey(),
+ "companyId", companyId
+ ));
+ return companySymbol;
+ }
+
+
+ @Override
+ public ReportBR_0420314_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
+ validateDateRange(startDate, endDate);
+
+ ReportBR_0420314_P1 reportBR_0420312P1 = new ReportBR_0420314_P1(startDate, endDate, "BR",
+ ALLOW_CLEARING_STATUS //clearingStatus.getCode() "OK"
+ );
+ final Long allowClearingStatusId = MapUtil.getDictionaryIdByCode(clearingStatusDictionaryImdg, ALLOW_CLEARING_STATUS); // "OK"
+
+ Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate, allowClearingStatusId);
+
+ for (LiabilitiesClaimsAssets liability: liabilities) {
+ final Long companyId = liability.getCompanyId();
+ Company company = companyImdg.getSingleObjectByID(companyId);
+ if (company == null) {
+ log.warn("Company not found by LiabilitiesClaimsAssets.CompanyId={}", companyId);
+ continue;
+ }
+ Collection cmcLst = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId));
+ String cleanMemberCategories = MapUtil.joinMultiString(cmcLst, ClearingMemberCategory::getClearingMemberCategory);
+
+ CompanySymbols companySymbolCntr = findSymbol(DocumentTypes.cntr, company.getId());
+ CompanySymbols companySymbolINN = findSymbol(DocumentTypes.inn, company.getId());
+ CompanySymbols companySymbolOGRN = findSymbol(DocumentTypes.ogrn, company.getId());
+
+ ReportBR_0420314_P1.Info_0420314_P1 info_0420314P1 = new ReportBR_0420314_P1.Info_0420314_P1(
+ toString(company.getClearingCode()),
+ toString(companySymbolCntr == null? null : companySymbolCntr.getId()),
+ toString(company.getFullName()),
+ toString(companySymbolINN == null ? null : companySymbolINN.getCompanySymbolValue()),
+ toString(companySymbolOGRN == null? null : companySymbolOGRN.getCompanySymbolValue()),
+ toString(cleanMemberCategories), // может быть несколько, тогда через запятую перечислить
+ toString(liability.getRefundPaymentId()),
+ toString(liability.getTradingDate()),
+ toString(liability.getLiabilitiesQuantity())
+ );
+ reportBR_0420312P1.getRows().add(info_0420314P1);
+ }
+
+ return reportBR_0420312P1;
+ }
+
+ @Override
+ public Class getReportClass() {
+ return ReportBR_0420314_P1.class;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420314_P2_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P2_Collector.java
similarity index 95%
rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420314_P2_Collector.java
rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P2_Collector.java
index c49781d95..14ce6e0bf 100644
--- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420314_P2_Collector.java
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P2_Collector.java
@@ -1,129 +1,131 @@
-package ru.spcex.clearing.reports.services.collector;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import ru.clearing.classes.statics.data.account.AccountBalance;
-import ru.clearing.classes.statics.data.company.Company;
-import ru.clearing.classes.statics.data.payment.PaymentInstruction;
-import ru.clearing.classes.statics.data.profile.ProfileDocument;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.reports.reports.bt_17_4.ReportBR_0420314_P2;
-import ru.spcex.clearing.reports.services.ReportWithPeriodCollector;
-import ru.spcex.platform.enumeration.AccountType;
-import ru.spcex.platform.enumeration.DocumentTypes;
-import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
-import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
-
-import java.math.BigDecimal;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * accountTransactionLiabilities
- */
-@Component
-public class ReportBR_0420314_P2_Collector extends ReportWithPeriodCollector