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/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 c1fb4a584..6e60b79c5 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
@@ -16,4 +16,9 @@ public enum TaskType {
*/
InclusionToPool,
+ /**
+ * Step 6
+ */
+ CreateRegistryOnObligationsAndSettlementRequirements,
+
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/CreateRegistryOnObligationsAndSettlementRequirements.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/CreateRegistryOnObligationsAndSettlementRequirements.java
new file mode 100644
index 000000000..061c367cd
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/CreateRegistryOnObligationsAndSettlementRequirements.java
@@ -0,0 +1,118 @@
+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.execution.ExecutionDeposit;
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+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.DealsPreparePayload;
+import ru.spcex.clearing.session.stage.task.RegistryOnObligationsAndSettlementRequirementsPayload;
+import ru.spcex.clearing.session.stage.util.RegistryUtil;
+import ru.spcex.platform.classes.base.interfaces.IExecution;
+import ru.spcex.platform.classes.base.interfaces.WithExchangeExecutionId;
+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 CreateRegistryOnObligationsAndSettlementRequirements implements ISessionStage {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ private final ImdgId idSequence;
+ private final Imdg registryImdg;
+
+ @Autowired
+ public CreateRegistryOnObligationsAndSettlementRequirements(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 CreateRegistryOnObligationsAndSettlementRequirements -> {
+ return createRegistryOnObligationsAndSettlementRequirements(payload.getSessionId());
+ }
+ default -> {
+ throw new IllegalStateException("Unknown task type: " + task.getTaskType());
+ }
+ }
+ }
+
+ private 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() + ")";
+ // registryCode = [O/T][S/M][*][T] & registryStatus=OK
+ Collection result = registryImdg.getCollectionObjectsBySQL(registrySQL);
+ log.trace("Selected {} registry's by sql: {}", result.size(), registrySQL);
+ return result;
+ }
+
+ private StageResult> createRegistryOnObligationsAndSettlementRequirements(Long sessionId) {
+ Collection forRegistries = selectRegistry(sessionId);
+ ArrayList newRegistries = new ArrayList<>();
+
+ //todo oreder by обрабатываться группами по полю registry.groupId
+
+ 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/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/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/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/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryDesignation.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryDesignation.java
index 0d9420516..896e326af 100644
--- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryDesignation.java
+++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryDesignation.java
@@ -3,7 +3,11 @@ package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum RegistryDesignation implements IEnumKey {
- A("A")
+ A("A"),
+ O("O"),
+ T("T"),
+ L("L"),
+ C("C")
;
private final String key;
diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java
new file mode 100644
index 000000000..dd948e3b9
--- /dev/null
+++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java
@@ -0,0 +1,19 @@
+package ru.spcex.platform.enumeration;
+
+import ru.spcex.platform.utils.enumeration.IEnumKey;
+
+public enum RegistryStatus implements IEnumKey {
+ OK("OK"),
+ ;
+
+ private final String key;
+
+ RegistryStatus(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+}