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 new file mode 100644 index 000000000..ea1e205f5 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryInfo.java @@ -0,0 +1,12 @@ +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/service/EventsReceiver.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java index 9eb639b9c..19774c888 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java @@ -4,6 +4,7 @@ import org.apache.kafka.clients.consumer.Consumer; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Service; import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.Sdf04Request; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; @@ -13,9 +14,14 @@ import ru.spcex.platform.enumeration.Task; @Service public class EventsReceiver extends QueueConsumer implements InitializingBean { private final ClearingService clearingService; - public EventsReceiver(Consumer kafkaQueue, ClearingService clearingService) { + private final RegistryService registryService; + + public EventsReceiver(Consumer kafkaQueue, + ClearingService clearingService, + RegistryService registryService) { super(kafkaQueue); this.clearingService = clearingService; + this.registryService = registryService; } @Override @@ -41,6 +47,9 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { callback(Object.class) .setConsumer(event -> clearingService.executeSTrade()) .forDestination(Task.getOfTrades.topic(), callbacks::put); + callback(CreateRegistryRequest.class) + .setConsumer(event -> registryService.createRegistry(event.getRequestPayload())) + .forDestination(Consts.REGISTRY_NEW, callbacks::put); init(); } } 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 new file mode 100644 index 000000000..f6ab3915f --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -0,0 +1,76 @@ +package ru.spcex.clearing.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.platform.messaging.domain.cud.clearing.CreateRegistryRequest; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.IEnumKey; + +import java.math.BigDecimal; + +@Service +public class RegistryService { + private final Logger log = LoggerFactory.getLogger(getClass()); + + private final ImdgProvider imdgProvider; + private final Imdg tradingClearingRegistryImdg; + private final Imdg registryImdg; + + public RegistryService(ImdgProvider imdgProvider) { + this.imdgProvider = imdgProvider; + this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + } + + public void createRegistry(CreateRegistryRequest createRegistryRequest) { + Long companyId = createRegistryRequest.getCompanyId(); + log.trace("Try to find tradingClearingRegistry by companyId: {}", createRegistryRequest.getCompanyId()); + //todo может завести класс SqlFactory + String byCompanySqlPredicate = String.format("companyId=%s", companyId); + //todo для компани всегда один объект TradingClearingRegistry? пока предполагаю что да и нужно добавить такую проверку(в ТЗ ее нет); + //todo see TradingClearingRegistryService.tradingClearingRegistryNew + + TradingClearingRegistry tcrByCompanyId = tradingClearingRegistryImdg.getSingleObjectBySQL(byCompanySqlPredicate); + if (tcrByCompanyId != null) { + log.trace("Found tradingClearingRegistry with id: {}", tcrByCompanyId.getId()); + Registry registry = new Registry(); + tcrByCompanyId.getTradingClearingRegistryType(); + RegistryInfo registryInfo = createRegistryInfoByType(tcrByCompanyId.getTradingClearingRegistryType()); + registry.setRegistryDesignation(registryInfo.registryDesignation().getKey()); + registry.setRegistryInstrumentType(registryInfo.registryInstrumentType().getKey()); + registry.setRegistryCapacity(registryInfo.registryCapacity().getKey()); + registry.setRegistryUnit(registryInfo.registryUnit().getKey()); + //todo не понял формулировку При создании новой записи, необходимо установить значение 0 в множестве свойств balance* AND registryInstrumentType=M AND securitySymbol=RUB[registry.securityId=security.id] + registry.setBalance(BigDecimal.ZERO); + + registryImdg.insert(registry); + } + + } + + private RegistryInfo createRegistryInfoByType(String type){ + TradingClearingRegistryType registryType = IEnumKey.getEnumByKey(TradingClearingRegistryType.class, type); + RegistryInfo 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); + } + return registryInfo; + } + +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java new file mode 100644 index 000000000..c5a72059a --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java @@ -0,0 +1,4 @@ +package ru.spcex.clearing.service.builder; + +public class RegistryBuilder { +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryCapacity.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryCapacity.java new file mode 100644 index 000000000..48be59b1a --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryCapacity.java @@ -0,0 +1,24 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +//todo фиксированные ли это значения? расшифровки подъедут? +public enum RegistryCapacity implements IEnumKey { + A("A"), + B("B"), + Z("Z"), + C("C"), + E("E"), + ; + + private final String key; + + RegistryCapacity(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} 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 new file mode 100644 index 000000000..0d9420516 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryDesignation.java @@ -0,0 +1,19 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum RegistryDesignation implements IEnumKey { + A("A") + ; + + private final String key; + + RegistryDesignation(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryInstrumentType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryInstrumentType.java new file mode 100644 index 000000000..a321bcaec --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryInstrumentType.java @@ -0,0 +1,20 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum RegistryInstrumentType implements IEnumKey { + M("M"), + S("S"), + ; + + private final String key; + + RegistryInstrumentType(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryUnit.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryUnit.java new file mode 100644 index 000000000..e0d9856bb --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryUnit.java @@ -0,0 +1,21 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum RegistryUnit implements IEnumKey { + T("T"), + A("A"), + R("R"), + ; + + private final String key; + + RegistryUnit(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 9f08c39c7..6523560bc 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -127,4 +127,6 @@ public interface Consts { String REGISTRY_CLEAR_MEMBER_REGISTER_NEW = "registry-clear-member-register-new"; String REGISTRY_CLEAR_MEMBER_REGISTER_CHANGE_NEW = "registry-clear-member-register-change-new"; + String REGISTRY_NEW = "registry-new"; + } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/clearing/CreateRegistryRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/clearing/CreateRegistryRequest.java new file mode 100644 index 000000000..8b70c72f2 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/clearing/CreateRegistryRequest.java @@ -0,0 +1,16 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.clearing; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CreateRegistryRequest { + @JsonProperty + private Long companyId; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } +}