diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/KeyRate.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/KeyRate.java
new file mode 100644
index 000000000..fa0891ef5
--- /dev/null
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/KeyRate.java
@@ -0,0 +1,59 @@
+package ru.clearing.classes.StaticData.Misc;
+
+import ru.spcex.platform.classes.base.SpcexObjectBase;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+
+/**
+ * Ключевая ставка ЦБ
+ *
+ * DB table: KEY_RATE
+ **/
+public class KeyRate extends SpcexObjectBase {
+ private BigDecimal rate;
+ private Instant startDate;
+ private Instant endDate;
+ private String document;
+ private String workflowStatus;
+
+ public BigDecimal getRate() {
+ return rate;
+ }
+
+ public void setRate(BigDecimal rate) {
+ this.rate = rate;
+ }
+
+ public Instant getStartDate() {
+ return startDate;
+ }
+
+ public void setStartDate(Instant startDate) {
+ this.startDate = startDate;
+ }
+
+ public Instant getEndDate() {
+ return endDate;
+ }
+
+ public void setEndDate(Instant endDate) {
+ this.endDate = endDate;
+ }
+
+ public String getDocument() {
+ return document;
+ }
+
+ public void setDocument(String document) {
+ this.document = document;
+ }
+
+ public String getWorkflowStatus() {
+ return workflowStatus;
+ }
+
+ public void setWorkflowStatus(String workflowStatus) {
+ this.workflowStatus = workflowStatus;
+ }
+}
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/MoneyMarketSecurity.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/MoneyMarketSecurity.java
new file mode 100644
index 000000000..40f57035e
--- /dev/null
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/MoneyMarketSecurity.java
@@ -0,0 +1,95 @@
+package ru.clearing.classes.StaticData.Misc;
+
+import ru.spcex.platform.classes.base.SpcexObjectBase;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+
+/**
+ * Инструменты Денежного рынка
+ *
+ * DB table: MONEY_MARKET_SECURITY
+ **/
+public class MoneyMarketSecurity extends SpcexObjectBase {
+ private Long securityId;// (linked to security)
+ private String description;
+ private Instant startDate;
+ private Instant endDate;
+ private BigDecimal nominalValue;
+ private Long nominalCurrency; // (linked to currencyCode)
+ private String instrumentType; // (linked to instrumentType)
+ private String fullName;
+ private String securitySymbol;
+
+ public Long getSecurityId() {
+ return securityId;
+ }
+
+ public void setSecurityId(Long securityId) {
+ this.securityId = securityId;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Instant getStartDate() {
+ return startDate;
+ }
+
+ public void setStartDate(Instant startDate) {
+ this.startDate = startDate;
+ }
+
+ public Instant getEndDate() {
+ return endDate;
+ }
+
+ public void setEndDate(Instant endDate) {
+ this.endDate = endDate;
+ }
+
+ public BigDecimal getNominalValue() {
+ return nominalValue;
+ }
+
+ public void setNominalValue(BigDecimal nominalValue) {
+ this.nominalValue = nominalValue;
+ }
+
+ public Long getNominalCurrency() {
+ return nominalCurrency;
+ }
+
+ public void setNominalCurrency(Long nominalCurrency) {
+ this.nominalCurrency = nominalCurrency;
+ }
+
+ public String getInstrumentType() {
+ return instrumentType;
+ }
+
+ public void setInstrumentType(String instrumentType) {
+ this.instrumentType = instrumentType;
+ }
+
+ public String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(String fullName) {
+ this.fullName = fullName;
+ }
+
+ public String getSecuritySymbol() {
+ return securitySymbol;
+ }
+
+ public void setSecuritySymbol(String securitySymbol) {
+ this.securitySymbol = securitySymbol;
+ }
+}
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 a8c367c0b..b6acee77f 100644
--- a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql
+++ b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql
@@ -549,7 +549,7 @@ COMMENT ON COLUMN RELATION_UPDATE.SERVICE_PRODUCT_ID IS 'Идентификат
COMMENT ON COLUMN RELATION_UPDATE.COMMENT IS 'Текст причины';
-- bankAccount - Банковские счета
-CREATE TABLE IF NOT EXISTS BANK_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), _сORRESPONDENT_ACCOUNT varchar(255));
+CREATE TABLE IF NOT EXISTS BANK_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), CORRESPONDENT_ACCOUNT varchar(255));
COMMENT ON TABLE BANK_ACCOUNT IS 'Банковские счета';
COMMENT ON COLUMN BANK_ACCOUNT.ID IS 'Идентификатор записи';
@@ -576,11 +576,11 @@ COMMENT ON COLUMN BANK_ACCOUNT.TAXPAYER_IDENTIFICATION_NUMBER IS 'Идентиф
COMMENT ON COLUMN BANK_ACCOUNT.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки';
-COMMENT ON COLUMN BANK_ACCOUNT._сORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
+COMMENT ON COLUMN BANK_ACCOUNT.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
-- Update log of bankAccount - Банковские счета
-CREATE TABLE IF NOT EXISTS BANK_ACCOUNT_UPDATE(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), _сORRESPONDENT_ACCOUNT varchar(255));
+CREATE TABLE IF NOT EXISTS BANK_ACCOUNT_UPDATE(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), CORRESPONDENT_ACCOUNT varchar(255));
COMMENT ON TABLE BANK_ACCOUNT_UPDATE IS 'Журнал изменений таблицы bankAccount';
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.BANK_ACCOUNT_ID IS 'Идентификатор записи в таблице BANK_ACCOUNT';
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.EVENT_TIME IS 'Дата и время изменения';
@@ -610,7 +610,7 @@ COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.TAXPAYER_IDENTIFICATION_NUMBER IS 'Иде
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки';
-COMMENT ON COLUMN BANK_ACCOUNT_UPDATE._сORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
+COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
-- clearingAccount - Клиринговые счета
CREATE TABLE IF NOT EXISTS CLEARING_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, CASH_ACCOUNT_ID bigint, DEPO_ACCOUNT_ID bigint, SETTLEMENT_CODE varchar(255));
@@ -753,7 +753,7 @@ COMMENT ON COLUMN CURRENCY_UPDATE.COUNTRY_CODE IS 'Идентификатор к
COMMENT ON COLUMN CURRENCY_UPDATE.CURRENCY_CODE IS 'Идентификатор кода валюты (linked to currencyCode)';
-- moneyMarketSecurity - Инструменты Денежного рынка
-CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY(ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), ID numeric(72,2) PRIMARY KEY);
+CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY(ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255));
COMMENT ON TABLE MONEY_MARKET_SECURITY IS 'Инструменты Денежного рынка';
COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Идентификатор записи';
@@ -776,8 +776,6 @@ COMMENT ON COLUMN MONEY_MARKET_SECURITY.FULL_NAME IS 'Полное наимен
COMMENT ON COLUMN MONEY_MARKET_SECURITY.SECURITY_SYMBOL IS 'Код инструмента';
-COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Размер лота (linked to listing)';
-
-- Update log of moneyMarketSecurity - Инструменты Денежного рынка
CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY_UPDATE(MONEY_MARKET_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), ID numeric(72,2) PRIMARY KEY);
diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml
index f465c5845..b3bd2cfea 100644
--- a/clearing-parent/imdg/pom.xml
+++ b/clearing-parent/imdg/pom.xml
@@ -69,6 +69,12 @@
platform-imdg-api-hazelcast-impl
+
+
+ org.testng
+ testng
+ test
+
jar/${project.artifactId}
diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java
new file mode 100644
index 000000000..23eefe7b5
--- /dev/null
+++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java
@@ -0,0 +1,7 @@
+package ru.spcex.clearing.imdg.base;
+
+public interface AutoconfiguredMap {
+ String getMapName();
+
+ String[] getIndexingField();
+}
diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateMapStore.java
new file mode 100644
index 000000000..34120e399
--- /dev/null
+++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateMapStore.java
@@ -0,0 +1,89 @@
+package ru.spcex.clearing.imdg.base;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
+import ru.spcex.platform.classes.base.SpcexObjectBase;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
+/**
+ * MapStore для шаблонных бизнес-объектов
+ * @Component
+ */
+public abstract class TemplateMapStore extends ObjectBaseMapStore implements AutoconfiguredMap {
+
+ protected final int validateSize = getFields().length;
+
+ protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id");
+
+ public TemplateMapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+// @Override
+// public String getTableName() {
+// return "COMPANY_ROLE_SET";
+// }
+//
+// @Override
+// public String[] getFields() {
+// return new String[]{"id", "roleid", "companyid"};
+// }
+
+// //todo TradingDay флаг
+// protected boolean useTradingDay() {
+// return false;
+// }
+
+ /**
+ *
+ * @return IMDGDistributedNames.*
+ */
+ public abstract String getMapName();
+
+ /**
+ * Список индексируемых полей, для быстрого поиска
+ * @return
+ */
+ public String[] getIndexingField() {
+ return null;
+ }
+
+ /**
+ * Десериализатор
+ * @param resultSet
+ * @return
+ */
+ protected abstract T objectReader(ResultSet resultSet) throws SQLException;
+
+ @Override
+ public Collection load(Collection keys) {
+ Map> paramMap = Collections.singletonMap("ids", keys);
+ return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap,
+ (resultSet, i) -> objectReader(resultSet));
+ }
+
+ /**
+ * Сериализатор
+ * @param resultSet
+ * @return Object[] args
+ */
+ protected abstract Object[] objectToField(T resultSet);
+
+ @Override
+ public void store(Map map) {
+ List