Merge branch 'dev' into tmp_testutil

This commit is contained in:
AKurakin 2023-10-02 20:39:22 +03:00
commit b15334d8ac
94 changed files with 2228 additions and 1361 deletions

View file

@ -59,10 +59,14 @@ public class AccountValidationConfig {
),
FieldRequiredSpecificRule.instance("account",
CorrespondentAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty,
AccountError.AccountFieldNotSet,
false,
accountValue -> {
if (accountValue.isBlank())
return new EnumMessage(AccountError.RequiredFieldEmpty, "account");
if ((accountValue == null || accountValue.isBlank()) && AccountType.Info.equalsByKey(context.getValidatedObject().getAccountType())) {
return null;
}
if (accountValue == null || accountValue.isBlank())
return new EnumMessage(AccountError.AccountFieldNotSet, "account");
Imdg<Account> accountImdg = context.obtainMap(
IMDGDistributedNames.Map_Account, Account.class
);

View file

@ -21,6 +21,7 @@ public enum AccountError implements IErrorEnumId {
ClearingCategoryNotFound(5019L),
ClearingCompanySymbolNotFound(5022L), // Для компании %s отсутствует клиринговый код».
AccountForTradingClearingRegistryAlreadyUsed(5023L),
AccountFieldNotSet(5024L),
TradingClearingRegistryNotFound(3022L),
;

View file

@ -0,0 +1,106 @@
package ru.spcex.clearing.account.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.platform.enumeration.*;
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 ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.util.Collection;
@Service
public class AccountHelper {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<ClearingMemberCategory> clearingMemberCategoryMap;
private final Imdg<Relation> relationMap;
private final IMessageResolver messageResolver;
@Autowired
public AccountHelper(ImdgProvider imdgProvider,
IMessageResolver messageResolver) {
this.clearingMemberCategoryMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
this.relationMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
this.messageResolver = messageResolver;
}
/**
* Заполняет поля relationId и companyId из соответствующей записи Relation
*
* @param requestId Идентификатор запроса для вывода лога
*/
public RequestInfoUpdate fillAccountFromRelation(Account account, Long requestId, boolean checkClearingMemberCategory) {
Long companyId = account.getCompanyId();
Collection<Relation> relations;
ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder();
ImdgPredicate finalRelationPredicate;
if (checkClearingMemberCategory) {
ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder();
ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId);
Collection<ClearingMemberCategory> clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals);
if (clearingMemberCategories.isEmpty())
return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, "(any)");
if (clearingMemberCategories.size() > 1)
log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId);
ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next();
ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId);
ImdgPredicate servicePredicate;
String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory();
if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) {
servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey());
} else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) {
servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey());
} else {
log.info("ClearingCategoryNotFound with clearingCategoryValue={} not implemented. Do not search Relation.", clearingCategoryValue);
return null;
//return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, clearingCategoryValue + " (case not implemented)");
}
finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate);
relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate);
} else {
finalRelationPredicate = relationPredicateBuilder.equals("consumerId", companyId);
relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate);
}
if (relations.isEmpty()) {
//return makeError(requestId, AccountError.WrongFieldValue, "companyId", finalRelationPredicate.toString());
log.info("Relation not found: {}", finalRelationPredicate.toString());
return null;
}
if (relations.size() > 1)
log.warn("Relation for consumerId {} contains multiply elements, use first", companyId);
Relation relation = relations.iterator().next();
account.setRelationId(relation.getId());
return null;
}
public RequestInfoUpdate makeError(Long reqId, AccountError accountError, Object... args) {
String errMsg = messageResolver.resolve(new EnumMessage(accountError, args));
return new RequestInfoUpdate()
.setId(reqId)
.setStatus(Status.Error)
.setMessage(errMsg);
}
}

View file

@ -55,6 +55,8 @@ public class AccountService extends QueueConsumer implements InitializingBean {
private final IMessageResolver messageResolver;
private final UserRoleVerification userRoleVerification;
private final ValidationHelper validationHelper;
private final AccountHelper accountHelper;
private final InformationAccountService informationAccountService;
private final Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator;
private final Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator;
private final Function<CommonIdRequest, IValidator> accountBlockRequestValidator;
@ -67,6 +69,8 @@ public class AccountService extends QueueConsumer implements InitializingBean {
IMessageResolver messageResolver,
UserRoleVerification userRoleVerification,
ValidationHelper validationHelper,
AccountHelper accountHelper,
InformationAccountService informationAccountService,
@Qualifier("correspondentAccountNewRequestValidator")
Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator,
@Qualifier("correspondentAccountUpdateRequestValidator")
@ -74,6 +78,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
@Qualifier("correspondentAccountBlockRequestValidator")
Function<CommonIdRequest, IValidator> accountBlockRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.accountHelper = accountHelper;
this.imdgProvider = imdgProvider;
this.accountMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Account, Account.class
@ -88,6 +93,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
this.messageResolver = messageResolver;
this.userRoleVerification = userRoleVerification;
this.validationHelper = validationHelper;
this.informationAccountService = informationAccountService;
this.accountNewRequestValidator = accountNewRequestValidator;
this.accountUpdateRequestValidator = accountUpdateRequestValidator;
this.accountBlockRequestValidator = accountBlockRequestValidator;
@ -128,6 +134,12 @@ public class AccountService extends QueueConsumer implements InitializingBean {
Account account = new Account();
account.setCompanyId(req.getCompanyId());
account.setAccount(req.getAccount());
if (AccountType.Info.equalsByKey(req.getAccountType())) {
Long infoSequenceId = informationAccountService.accountNextId();
String accountValue = informationAccountService.generateInfoAccount(infoSequenceId);
log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue);
account.setAccount(accountValue);
}
account.setAccountType(req.getAccountType());
if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey());
@ -138,7 +150,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = fillAccountFromRelation(account, userRequest.getId(), false);
requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), false);
if (requestInfoUpdate != null) return requestInfoUpdate;
Long newId = null;
@ -306,60 +318,6 @@ public class AccountService extends QueueConsumer implements InitializingBean {
return null;
}
/**
* Заполняет поля relationId и companyId из соответствующей записи Relation
*
* @param requestId Идентификатор запроса для вывода лога
*/
public RequestInfoUpdate fillAccountFromRelation(Account account, Long requestId, boolean checkClearingMemberCategory) {
Long companyId = account.getCompanyId();
Collection<Relation> relations;
ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder();
ImdgPredicate finalRelationPredicate;
if (checkClearingMemberCategory) {
ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder();
ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId);
Collection<ClearingMemberCategory> clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals);
if (clearingMemberCategories.isEmpty())
return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, "(any)");
if (clearingMemberCategories.size() > 1)
log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId);
ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next();
ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId);
ImdgPredicate servicePredicate;
String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory();
if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) {
servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey());
} else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) {
servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey());
} else {
log.info("ClearingCategoryNotFound with clearingCategoryValue={} not implemented. Do not search Relation.", clearingCategoryValue);
return null;
//return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, clearingCategoryValue + " (case not implemented)");
}
finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate);
relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate);
} else {
finalRelationPredicate = relationPredicateBuilder.equals("consumerId", companyId);
relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate);
}
if (relations.isEmpty()) {
//return makeError(requestId, AccountError.WrongFieldValue, "companyId", finalRelationPredicate.toString());
log.info("Relation not found: {}", finalRelationPredicate.toString());
return null;
}
if (relations.size() > 1)
log.warn("Relation for consumerId {} contains multiply elements, use first", companyId);
Relation relation = relations.iterator().next();
account.setRelationId(relation.getId());
return null;
}
private RequestInfoUpdate makeError(Long reqId, AccountError accountError, Object... args) {
String errMsg = messageResolver.resolve(new EnumMessage(accountError, args));
return new RequestInfoUpdate()

View file

@ -41,7 +41,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
private final UserRoleVerification userRoleVerification;
private final ValidationHelper validationHelper;
private final AccountService accountService;
private final AccountHelper accountService;
private final Function<BankAccountNewRequest, IValidator> bankAccountNewRequestValidator;
private final Function<BankAccountUpdateRequest, IValidator> bankAccountUpdateRequestValidator;
@ -53,7 +53,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
ImdgProvider imdgProvider,
UserRoleVerification userRoleVerification,
ValidationHelper validationHelper,
AccountService accountService,
AccountHelper accountService,
@Qualifier("bankAccountNewRequestValidator")
Function<BankAccountNewRequest, IValidator> bankAccountNewRequestValidator,
@Qualifier("bankAccountUpdateRequestValidator")

View file

@ -60,7 +60,7 @@ import java.util.function.Function;
public class ClearingAccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final KafkaSender kafkaSender;
private final AccountService accountService;
private final AccountHelper accountService;
private final SDFProcessService sdfProcessService;
private final ValidationHelper validationHelper;
private final ImdgProvider imdgProvider;
@ -81,7 +81,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
public ClearingAccountService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaResponseQueue,
KafkaSender kafkaSender,
AccountService accountService,
AccountHelper accountService,
SDFProcessService sdfProcessService,
ValidationHelper validationHelper,
ImdgProvider imdgProvider,

View file

@ -44,7 +44,7 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
private final KafkaSender kafkaSender;
private final ValidationHelper validationHelper;
private final ImdgProvider imdgProvider;
private final AccountService accountService;
private final AccountHelper accountService;
private final Function<DepoAccountNewRequest, IValidator> depoAccountNewRequestValidator;
public DepoAccountService(Consumer<String, Object> kafkaQueue,
@ -52,7 +52,7 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
KafkaSender kafkaSender,
ValidationHelper validationHelper,
ImdgProvider imdgProvider,
AccountService accountService,
AccountHelper accountService,
@Qualifier("depoAccountNewRequestValidator")
Function<DepoAccountNewRequest, IValidator> depoAccountNewRequestValidator) {
super(kafkaQueue, kafkaProducer);

View file

@ -54,7 +54,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
private final UserRoleVerification userRoleVerification;
private final ImdgProvider imdgProvider;
private final ValidationHelper validationHelper;
private final AccountService accountService;
private final AccountHelper accountHelper;
private final RequestHelper requestHelper;
private final Function<InformationAccountNewRequest, IValidator> infoAccountNewRequestValidator;
private final Imdg<InformationAccount> informationAccountImdg;
@ -73,7 +73,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
UserRoleVerification userRoleVerification,
ImdgProvider imdgProvider,
ValidationHelper validationHelper,
AccountService accountService,
AccountHelper accountHelper,
RequestHelper requestHelper,
@Qualifier("informationAccountNewRequestValidator")
Function<InformationAccountNewRequest, IValidator> infoAccountNewRequestValidator) {
@ -83,7 +83,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
this.userRoleVerification = userRoleVerification;
this.imdgProvider = imdgProvider;
this.validationHelper = validationHelper;
this.accountService = accountService;
this.accountHelper = accountHelper;
this.requestHelper = requestHelper;
this.infoAccountNewRequestValidator = infoAccountNewRequestValidator;
this.informationAccountImdg = imdgProvider.getImdg(
@ -147,7 +147,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true);
requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), true);
if (requestInfoUpdate != null) return requestInfoUpdate;
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
@ -239,7 +239,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
account.setCompanyId(forCompanyId);
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), false);
requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), false);
if (requestInfoUpdate != null) {
log.debug("Stop make new account, cause error: {}", requestInfoUpdate.getMessage());
return requestInfoUpdate;
@ -304,7 +304,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
*
* @return infoCounter++
*/
protected Long accountNextId() {
public synchronized Long accountNextId() {
if (infoCounter == null) synchronized (this) {
if (infoCounter == null) {
log.debug("Init account-information counter.");

View file

@ -23,6 +23,7 @@ import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig;
import ru.spcex.clearing.account.config.validation.InformationAccountValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.account.utils.MatcherFactory;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -64,6 +65,9 @@ import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID;
ValidationConfig.class,
AccountValidationConfig.class,
AccountService.class,
AccountHelper.class,
InformationAccountService.class,
InformationAccountValidationConfig.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
class AccountServiceTest {
@ -209,8 +213,16 @@ class AccountServiceTest {
waitingSendAndCheckRecord(0L, mockProducer);
Account resultUpdating = accountImdg.getSingleObjectByID(accountId);
existAccount.setUpdated(resultUpdating.getUpdated());
ACCOUNT_MATCHER.assertMatch(resultUpdating, existAccount);
Account expectAccount = new Account();
expectAccount.setId(existAccount.getId());
expectAccount.setAccount(account);
expectAccount.setAccountType(AccountType.Corr.getKey());
expectAccount.setStatus(ServiceStatus.Closed.getKey());
expectAccount.setCompanyId(companyId);
expectAccount.setCreated(existAccount.getCreated());
expectAccount.setUpdated(resultUpdating.getUpdated());
expectAccount.setStatus(ServiceStatus.Active.getKey());
ACCOUNT_MATCHER.assertMatch(resultUpdating, expectAccount);
accountImdg.delete(resultUpdating);
}

View file

@ -55,7 +55,7 @@ import static ru.spcex.clearing.test.TestUtils.*;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
AccountService.class,
AccountHelper.class,
BankAccountService.class,
ValidationConfig.class,
BankAccountValidationConfig.class,

View file

@ -52,7 +52,7 @@ import static ru.spcex.clearing.test.TestUtils.*;
ValidationConfig.class,
ClearingAccountValidationConfig.class,
AccountValidationConfig.class,
AccountService.class,
AccountHelper.class,
ClearingAccountService.class,
SDFProcessService.class,
ImdgTestConfig.class,

View file

@ -50,7 +50,7 @@ import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew;
ValidationConfig.class,
DepoAccountValidationConfig.class,
AccountValidationConfig.class,
AccountService.class,
AccountHelper.class,
DepoAccountService.class,
ImdgTestConfig.class,
KafkaTestConfig.class})

View file

@ -53,7 +53,7 @@ import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew;
ValidationConfig.class,
InformationAccountValidationConfig.class,
AccountValidationConfig.class,
AccountService.class,
AccountHelper.class,
InformationAccountService.class,
ImdgTestConfig.class,
KafkaTestConfig.class})

View file

@ -103,8 +103,9 @@ class SDFProcessServiceTest {
void parseSdf52Status() {
Assertions.assertEquals(AccountStatus.BLOCKED, sdfProcessService.parseSdf52Status(0L));
Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(1L));
Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(3L));
Assertions.assertEquals(AccountStatus.CLOSE, sdfProcessService.parseSdf52Status(2L));
Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(3L));
Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(4705211956118233163L));
Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(null));
}
}

View file

@ -13,8 +13,9 @@ public class NotificationUpdateAction implements IAction<NotificationUpdateReque
@ApiModelProperty(value = "Наименование статуса сообщения", example = "ACTV")
@JsonProperty
public String notificationStatus;
@ApiModelProperty(value = "Наименование отправителя", example = "1234")
@JsonProperty
@ApiModelProperty(value = "Наименование отправителя (не исопльзуется)", example = "1234")
@JsonProperty(required = false)
@Deprecated
public Long senderId;
@Override
@ -22,7 +23,6 @@ public class NotificationUpdateAction implements IAction<NotificationUpdateReque
var req = new NotificationUpdateRequest();
req.setId(this.id);
req.setNotificationStatus(this.notificationStatus);
req.setSenderId(this.senderId);
return req;
}

View file

@ -246,6 +246,8 @@
<task id="23" code="GRET" name="Формирование отчетности по сделкам"/>
<task id="24" code="GREF" name="Формирование итоговой отчетности"/>
<task id="25" code="FDFF" name="Формирование ДФ-05 с кодом 9 (финальный)"/>
<task id="26" code="SDEP" name="Время начала возврата депозитов"/>
<task id="27" code="EDEP" name="Время завершения возврата депозитов"/>
<taskStatus id="1" code="ACTV" name="Активна"/>
<taskStatus id="2" code="BLKD" name="Не активна"/>
<taskStatus id="3" code="CNCL" name="Отмена расписания"/>
@ -425,6 +427,7 @@
<errorCode id="5019" code="ACNT" name="Для компании %s отсутствует категория %s."/>
<errorCode id="5022" code="ACNT" name="Для компании %s отсутствует клиринговый код."/>
<errorCode id="5023" code="ACNT" name="Счет %s уже используется."/>
<errorCode id="5024" code="ACNT" name="Не указан номер счета."/>
<!-- error code for balance-service -->
<errorCode id="5200" code="BLNC" name="Общая ошибка модуля balance-service."/>
<errorCode id="5210" code="BLNC" name="Клиринговая сессия неактивна."/>
@ -473,6 +476,7 @@
<errorCode id="5430" code="CLRN" name="Неверный код регистра: %s"/>
<errorCode id="5431" code="CLRN" name="Дата возврата для депозита с разделением не может быть изменена"/>
<errorCode id="5432" code="CLRN" name="После сверки обнаружена разница между плановым и фактическим балансом"/>
<errorCode id="5433" code="CLRN" name="Сессия по возврату депозита не может исполняться вне временного интервала, установленного в системе"/>
<!-- error code for dbf-importer -->
<errorCode id="5600" code="DBFI" name="Общая ошибка модуля dbf-importer."/>
<!-- error code for dbf-exporter -->
@ -528,7 +532,7 @@
<companySymbols id="1" companyId="1" companySymbol="BIC" companySymbolValue="044030920"/>
<companySymbols id="2" companyId="2" companySymbol="BIC" companySymbolValue="044030505"/>
<currency id="643" currency_code="RUB"/>
<security instrumentType="CRNC" shortName="RUB" fullName="Российский рубль" securitySymbol="RUB" workflowStatus="ACTV" id="643"/>
<security id="643" instrumentType="CRNC" shortName="RUB" fullName="Российский рубль" securitySymbol="RUB" workflowStatus="ACTV"/>
<account id="1" companyId="1" account="30414810300000006000" accountType="TRAN" status="ACTV" processingSign="ALWD"/>
<account id="2" companyId="1" account="30414810600000007000" accountType="ANLT" status="ACTV" processingSign="ALWD"/>
<account id="3" companyId="1" account="700100000AT0" accountType="DTRN" status="ACTV" processingSign="ALWD"/>

View file

@ -1,6 +1,6 @@
{
"version": "3.8.0.56",
"version": "3.8.0.58",
"enums": {
@ -4263,7 +4263,7 @@
}
,
{"code": "account",
"type": 2,"length": 50,"name": "Номер счета","shortname": "Счет","required": true
"type": 2,"length": 50,"name": "Номер счета","shortname": "Счет"
}
,
{"code": "status",
@ -7007,10 +7007,6 @@
{"code": "notificationStatus",
"type": 12,"name": "Наименование статуса сообщения","shortname": "Статус","link": "notificationStatus","required": true
}
,
{"code": "senderId",
"type": 1,"name": "Наименование отправителя","shortname": "Отправитель","visible": false,"required": true
}
]
}
]

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?-->
<meta version="3.8.0.56">
<meta version="3.8.0.58">
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
<!--Здесь словари-->
<enums>
@ -988,7 +988,7 @@
<actions>
<post name="Добавление счета" confirmation="companyId,account,status" class="ru.spcex.clearing.backendapi.controller.request.cud.account.AccountNewAction">
<companyId type="1" name="Наименование компании" shortname="Компания" link="company" linkCode="shortName" required="true"/>
<account type="2" length="50" name="Номер счета" shortname="Счет" required="true"/>
<account type="2" length="50" name="Номер счета" shortname="Счет"/>
<status type="12" name="Наименование статуса" shortname="Статус" link="serviceStatus"/>
<accountType type="12" name="Наименование типа счета" shortname="Тип" link="accountType" required="true" visible="false"/>
</post>
@ -1622,7 +1622,6 @@
<put name="Изменение статуса сообщения" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.NotificationUpdateAction">
<id type="1" name="Идентификатор записи" shortname="ID" link="notification" linkCode="id" required="true"/>
<notificationStatus type="12" name="Наименование статуса сообщения" shortname="Статус" link="notificationStatus" required="true"/>
<senderId type="1" name="Наименование отправителя" shortname="Отправитель" visible="false" required="true" />
</put>
</actions>
</notification>

View file

@ -1,6 +1,6 @@
{
"version": "3.8.0.56",
"version": "3.8.0.58",
"enums": {
@ -4263,7 +4263,7 @@
}
,
{"code": "account",
"type": 2,"length": 50,"name": "Номер счета","shortname": "Счет","required": true
"type": 2,"length": 50,"name": "Номер счета","shortname": "Счет"
}
,
{"code": "status",
@ -7007,10 +7007,6 @@
{"code": "notificationStatus",
"type": 12,"name": "Наименование статуса сообщения","shortname": "Статус","link": "notificationStatus","required": true
}
,
{"code": "senderId",
"type": 1,"name": "Наименование отправителя","shortname": "Отправитель","visible": false,"required": true
}
]
}
]

View file

@ -5,6 +5,7 @@ import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountBalance;
import ru.clearing.classes.statics.data.account.DepoAccount;
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.relation.Relation;
@ -69,6 +70,7 @@ public class ValidationConfig {
Imdg<SDf55> sDf55Imdg;
Imdg<SDf54> sDf54Imdg;
Imdg<PaymentInstruction> pmtImdg;
Imdg<ClearingMemberCategory> ctgrImdg;
ImdgProvider imdgProvider;
public ValidationConfig(ImdgProvider imdgProvider) {
@ -91,6 +93,7 @@ public class ValidationConfig {
this.sDf55Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf55, SDf55.class);
this.sDf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class);
this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.ctgrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
this.imdgProvider = imdgProvider;
}
@ -326,12 +329,14 @@ public class ValidationConfig {
ImdgValidationContext<RegistryReturnDepositRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(returnDepositRequest);
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
context.addImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ctgrImdg);
context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context,
new PresentById(IMDGDistributedNames.Map_Registry, ClearingError.RecordNotFound, true),
ReturnDepositValidationRule.RegistryCodeCheck,
ReturnDepositValidationRule.RgsWronCodeCheck,
ReturnDepositValidationRule.CategoryCheck,
ReturnDepositValidationRule.BalanceCheck,
ReturnDepositValidationRule.DmxCheck
ReturnDepositValidationRule.Dm_Check
);
};
}
@ -407,7 +412,8 @@ public class ValidationConfig {
IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class,
ClearingError.RequiredFieldEmpty, ClearingError.DictionaryNotFound, false),
SplitDepositRequestValidationRule.PositiveAmount,
SplitDepositRequestValidationRule.CrossvalidateByRegistry
SplitDepositRequestValidationRule.CrossvalidateByRegistry,
SplitDepositRequestValidationRule.LoadContractIndexes
);
};
}

View file

@ -23,6 +23,7 @@ public enum ClearingError implements IErrorEnumId {
SuchRecordAlreadyExists(5405L),
TradingClearingRegistryNotFound(5418L),
TradingClearingRegistryNotActive(5419L),
CategoryNotFound(5420L),
ClearingUnavailableForCompany(5421L),
InsecurityObligation(5422L),
NewDealsNotFound(5423L),
@ -34,6 +35,7 @@ public enum ClearingError implements IErrorEnumId {
RgsWrongCode(5430L),
RefundDateCannotBeChanged(5431L),
PlanBalanceReviseError(5432L),
XdepTimeIntervalNotMatch(5433L),
//ошибки "перенесенные" из balance-service,
CompanyNotFoundB(5211L),
CurrencyNotFound(5213L),

View file

@ -52,7 +52,10 @@ public class AnltSearcher {
ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder();
ImdgPredicate tcrPredicate = pb.and(
pb.equals("code", commentTcrStripped),
pb.equals("status", ServiceStatus.Active.getKey())
pb.or(
pb.equals("status", ServiceStatus.Active.getKey()),
pb.equals("status", ServiceStatus.Reopened.getKey())
)
);
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByPredicate(tcrPredicate);

View file

@ -5,6 +5,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
@ -12,14 +14,18 @@ import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.notification.NotificationSender;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationListRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.*;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.builder.PaymentInstructionBuilderV2;
import ru.spcex.clearing.service.integration.GatewayRequestCreator;
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import ru.spcex.clearing.service.registry.RegistryManager;
import ru.spcex.clearing.service.schedule.TradingTimeService;
import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.clearing.session.stage.impl.GatewayRequester;
@ -42,12 +48,12 @@ import ru.spcex.platform.utils.validation.IValidator;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Stream;
import static ru.spcex.clearing.session.stage.impl.GatewayRequester.mapError;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Service
@ -57,6 +63,9 @@ public class RegistryService {
private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Registry> registryImdg;
private final Imdg<Account> accImdg;
private final Imdg<Currency> currImdg;
private final Imdg<Company> cmpImdg;
private final Imdg<PaymentInstruction> pmtImdg;
private final Function<RegistryReturnDepositRequest, IValidator> returnDepositVal;
private final Function<RegistryChangeRefundDateRequest, IValidator> refundDateVal;
@ -66,6 +75,7 @@ public class RegistryService {
private final GatewayRequester gateway;
private final TradingTimeService trdTime;
private final NotificationSender notification;
private final KafkaSender kafkaSender;
private final IMessageResolver msgResolver;
private final RequestHelper reqHelp;
@ -81,7 +91,7 @@ public class RegistryService {
GatewayRequester gateway,
TradingTimeService tradingTimeService,
NotificationSender notification,
IMessageResolver msgResolver,
KafkaSender kafkaSender, IMessageResolver msgResolver,
RequestHelper reqHelp,
UserRoleVerification rights,
AssetTBFProcessing assets) {
@ -89,6 +99,9 @@ public class RegistryService {
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.accImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.currImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
this.cmpImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.returnDepositVal = returnDepositVal;
this.refundDateVal = refundDateVal;
this.identificationFundsVal = identificationFundsVal;
@ -97,6 +110,7 @@ public class RegistryService {
this.gateway = gateway;
this.trdTime = tradingTimeService;
this.notification = notification;
this.kafkaSender = kafkaSender;
this.assets = assets;
this.gateway.setName("RgsService|DM*V");
this.msgResolver = msgResolver;
@ -154,6 +168,52 @@ public class RegistryService {
registryImdg.update(rgs);
log.trace("TCR#id={} registry#id={} updated", tcr.getId(), rgs.getId());
});
if (registries.size() > 0) {
log.info("assets size {} updated by TCR#id={}, will not create new assets",
registries.size(), tcr.getId());
return;
}
Account acc = accImdg.getSingleObjectByID(tcr.getMoneyAccountId());
Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey()));
Company cmp = cmpImdg.getSingleObjectByID(tcr.getCompanyId());
if (acc == null) {
log.warn("TCR#id={} account {} not found", tcr.getId(), tcr.getMoneyAccountId());
return;
}
if (currency == null) {
log.warn("TCR#id={} currency {} not found", tcr.getId(), CurrencyCode.RUB.getKey());
return;
}
if (cmp == null) {
log.warn("TCR#id={} company {} not found", tcr.getId(), tcr.getCompanyId());
return;
}
log.debug("TCR#id={} account#id={} company#id={}, creating assets", tcr.getId(), acc.getId(), cmp.getId());
AssetTrio assets = this.assets.createMAssets(acc,
CurrencyCode.RUB.getKey(),
currency.getId(),
tcr.getTradingClearingRegistryType(),
tcr.getId(),
tcr.getCode(),
cmp);
Stream.of(assets.a__t(), assets.a__b(), assets.a__f())
.forEach(a -> {
a.setRegistryStatus(RegistryStatus.PROC.getKey());
registryImdg.insert(a);
});
log.debug("TCR#id={} created {}#id={} {}#id={} {}#id={}",
tcr.getId(),
assets.a__f().getRegistryCode(), assets.a__f().getId(),
assets.a__t().getRegistryCode(), assets.a__t().getId(),
assets.a__b().getRegistryCode(), assets.a__b().getId());
}
public RequestInfoUpdate returnDeposit(BaseRequest<RegistryReturnDepositRequest> req) {
@ -166,28 +226,37 @@ public class RegistryService {
msgResolver.resolve(err.get()));
return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(err.get()));
}
Registry tm_t = validator.getStored(Stored.PresentById);
Registry dm_x = validator.getStored(ValidationStored.ReturnDepositDmx);
if (dm_x != null) {
dm_x.setSessionId(null);
dm_x.setSessionType(null);
dm_x.setBalance(requestPayload.getBalance());
dm_x.setUpdated(Instant.now());
registryImdg.update(dm_x);
log.debug("updated dm*x.id={} by RegistryReturnDepositRequest.id={}",
dm_x.getId(),
Registry _m_t = validator.getStored(ValidationStored.ReturnDepositOm_t);
if (_m_t == null) _m_t = validator.getStored(Stored.PresentById);
Registry dm__ = validator.getStored(ValidationStored.ReturnDepositDm__);
if (dm__ != null) {
dm__.setSessionId(null);
dm__.setSessionType(null);
dm__.setBalance(safeBD(dm__.getBalance()).add(requestPayload.getBalance()));
dm__.setUpdated(Instant.now());
registryImdg.update(dm__);
log.debug("updated {}.id={} by RegistryReturnDepositRequest.id={}",
dm__.getRegistryCode(),
dm__.getId(),
req.getId());
} else {
dm_x = tm_t.clone();
dm_x.setRegistryDesignation(RegistryDesignation.D.getKey());
dm_x.setRegistryUnit(RegistryUnit.X.getKey());
dm_x.setRegistryCode(RegistryUtil.clearingCode(dm_x));
dm_x.setBalance(requestPayload.getBalance());
dm_x.setSessionId(null);
dm_x.setSessionType(null);
registryImdg.insert(dm_x);
log.debug("created dm*x.id={} by RegistryReturnDepositRequest.id={}",
dm_x.getId(),
dm__ = _m_t.clone();
dm__.setRegistryDesignation(RegistryDesignation.D.getKey());
RegistryManager.zeroState(dm__);
if (RegistryDesignation.T.equalsByKey(_m_t.getRegistryDesignation())) {
dm__.setRegistryUnit(RegistryUnit.X.getKey());
} else {
dm__.setRegistryUnit(RegistryUnit.T.getKey());
}
dm__.setRegistryCode(RegistryUtil.clearingCode(dm__));
dm__.setBalance(safeBD(dm__.getBalance()).add(requestPayload.getBalance()));
dm__.setSessionId(null);
dm__.setSessionType(null);
registryImdg.insert(dm__);
log.debug("created {}.id={} by RegistryReturnDepositRequest.id={}",
dm__.getRegistryCode(),
dm__.getId(),
req.getId());
}
return new RequestInfoUpdate(req.getId(), Status.Success, null);
@ -207,24 +276,24 @@ public class RegistryService {
return reqHelp.error(req.getId(), err.get());
}
Registry rgs = validator.getStored(Stored.PresentById);
Supplier<AssetOperationRequest> gtwBuilder = () -> GatewayRequestCreator.from(rgs);
Optional<Boolean> gatewayOk;
if (trdTime.isTradingTime()) {
gatewayOk = gateway.gatewayRequestAndWait(gtwBuilder);
} else {
log.debug("RegistryChangeStatusExtractRequest rgs.id={} not sending gateway request", rgs.getId());
gatewayOk = Optional.of(true);
}
if (gatewayOk.isEmpty() || !gatewayOk.get()) {
String gtwErr = msgResolver.resolve(mapError(gatewayOk));
log.error("{}.id={} {}",
rgs.getRegistryCode(),
rgs.getId(),
gtwErr);
notification.sendNotification(ObjectType.rgst,
"Отметка о получении выписки: %s".formatted(gtwErr),
Priority.HIGH);
}
//Supplier<AssetOperationRequest> gtwBuilder = () -> GatewayRequestCreator.from(rgs, InOutDirection.in);
//Optional<Boolean> gatewayOk;
//if (trdTime.isTradingTime()) {
// gatewayOk = gateway.gatewayRequestAndWait(gtwBuilder);
//} else {
// log.debug("RegistryChangeStatusExtractRequest rgs.id={} not sending gateway request", rgs.getId());
// gatewayOk = Optional.of(true);
//}
//if (gatewayOk.isEmpty() || !gatewayOk.get()) {
// String gtwErr = msgResolver.resolve(mapError(gatewayOk));
// log.error("{}.id={} {}",
// rgs.getRegistryCode(),
// rgs.getId(),
// gtwErr);
// notification.sendNotification(ObjectType.rgst,
// "Отметка о получении выписки: %s".formatted(gtwErr),
// Priority.HIGH);
//}
rgs.setRegistryStatus(payload.getRegistryStatus());
log.debug("changing registry.id={} status to {}", rgs.getId(), payload.getRegistryStatus());
registryImdg.update(rgs);
@ -281,22 +350,19 @@ public class RegistryService {
.build();
pmt.setTransactionStatus(TransactionStatus.ok.getKey());
pmtImdg.insert(pmt);
//BankAccount bnkAcc = bnkAccImdg.getFirstObjectBySQL("accountId = %d".formatted(accDeb.getId()));
// if (bnkAcc != null) {
// pmt.setAddresseeBankName(bnkAcc.getBankIdentificationCode());
// pmt.setDebit_csAccount(bnkAcc.getCorrespondentAccount());
// }
// Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey()));
// if (currency != null) {
// pmt.setCreditLeg_securityId(currency.getId());
// pmt.setDebitLeg_securityId(currency.getId());
// }
// pmt.setTransactionStatus(TransactionStatus.stld.getKey());
registryImdg.update(dmau);
registryImdg.update(asts.a__t());
assets.process(asts.a__b(), asts.a__t(), asts.a__f(), BigDecimal.ZERO);
log.debug("IdentificationFundsRequest.id={} dmau.id={} am*t.id={} payment_instruction.id={}",
req.getId(), dmau.getId(), asts.a__t().getId(), pmt.getId());
if (trdTime.isTradingTime()) {
log.trace("sending gateway request for IdentificationFundsRequest.id={} dmau.id={}",
req.getId(), dmau.getId());
kafkaSender.sendRequestToQueue(Consts.ASSET_OPERATION,
gatewayRequest(dmau, payload.getBalance(),
accCompTcr.getCompany().getTradingCode(),
asts.a__t().getTradingClearingRegistry()));
}
return reqHelp.success(req.getId());
}
@ -431,6 +497,7 @@ public class RegistryService {
return roleCheck;
}
Collection<Registry> baseRegistrys;
Integer index;
{
IValidator validator = splitDepositActionVal.apply(requestPayload);
Optional<EnumMessage> err = validator.tillFirstError();
@ -441,6 +508,8 @@ public class RegistryService {
return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(err.get()));
}
baseRegistrys = validator.getStored(ValidationStored.RegistrysByContract);
index = validator.getStored(ValidationStored.SplitDepositMaxNumber);
if (index == null) index = 0;
}
ImdgTransaction txCtx = imdgProvider.newTransaction();
@ -457,6 +526,13 @@ public class RegistryService {
log.debug("Process {} for {} registry", direction, baseRegistrys.size());
Long groupId = null;
for (Registry baseRegistry : baseRegistrys) {
String cntrctWithoutTilda;
{
cntrctWithoutTilda = baseRegistry.getContract();
if (cntrctWithoutTilda.contains("~")) {
cntrctWithoutTilda = cntrctWithoutTilda.substring(0, cntrctWithoutTilda.indexOf("~"));
}
}
log.trace("Registry[{}], groupId={}, ClearingCode={}", baseRegistry.getId(), baseRegistry.getGroupId(), baseRegistry.getClearingCode());
if (groupId == null)
groupId = baseRegistry.getGroupId();
@ -475,9 +551,9 @@ public class RegistryService {
} else {
log.warn("Direction not set, do not change Balance");
}
firstRegistry.setContract(baseRegistry.getContract() + "~1");
firstRegistry.setContract(cntrctWithoutTilda + "~" + (index + 1));
firstRegistry.setParentId(baseRegistry.getId());
registryTMap.insert(firstRegistry);
// 2. Вторая группа
Registry secondRegistry = null;
if (InOutDirection.out == direction) {
@ -486,9 +562,10 @@ public class RegistryService {
secondRegistry.setCreated(now);
secondRegistry.setUpdated(null);
secondRegistry.setBalance(requestPayload.getOutboundAmount());
secondRegistry.setContract(baseRegistry.getContract() + "~2");
secondRegistry.setContract(cntrctWithoutTilda + "~" + (index + 2));
secondRegistry.setRefundDate(requestPayload.getRefundDate());
secondRegistry.setSettlementDate(requestPayload.getRefundDate());
secondRegistry.setParentId(baseRegistry.getId());
registryTMap.insert(secondRegistry);
}
@ -516,4 +593,16 @@ public class RegistryService {
return new RequestInfoUpdate(req.getId(), Status.Success, null);
}
private AssetOperationListRequest gatewayRequest(Registry dmau, BigDecimal balance, String tradingCode, String tcrCode) {
AssetOperationListRequest gatewayRequest = new AssetOperationListRequest();
AssetOperationRequest req = GatewayRequestCreator.from(
dmau.getId(),
null,
balance,
InOutDirection.in,
tradingCode,
tcrCode);
gatewayRequest.setAssetOperationRequests(List.of(req));
return gatewayRequest;
}
}

View file

@ -211,6 +211,9 @@ public class Sdf06Executor {
if (ClearingError.WrongField.equals(err.getSubject())) {
result = errorResult4;
}
if (ClearingError.ActiveSessionIsPresent.equals(err.getSubject())) {
result = errorResult1;
}
if (result == null) {
result = errorResult4;
}

View file

@ -320,26 +320,51 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
registryD.getId());
sessionIsNeededFlag.set(true);
} else if (tm_tFound.isPresent()) {
Registry tm_t = tm_tFound.get();
Registry registryD = copyRegD(tm_t, stmt, RegistryUnit.X);
registryImdg.insert(registryD);
log.debug("stmt.id={}, sdf57.specif={} found TM*T.id={} new DM*X.id={}. Return money identification for Initiator account based on TM*T registry searchin on companyId, accountId, contract and registry_status=PROC|MGN",
stmt.getId(),
sdf57.getSpecif(),
tm_t.getId(),
registryD.getId());
sessionIsNeededFlag.set(true);
Optional<Registry> dm_xFound = RegistrySearch.builder(registryImdg)
.rgsCode(RegistryTradingParams.DM_X)
.companyId(company.getId())
.accountId(account.getId())
.contract(stmt.getContract())
.statusNotOk()
.find();
if (dm_xFound.isEmpty()) {
Registry tm_t = tm_tFound.get();
Registry registryD = copyRegD(tm_t, stmt, RegistryUnit.X);
registryImdg.insert(registryD);
log.debug("stmt.id={}, sdf57.specif={} found TM*T.id={} new DM*X.id={}. Return money identification for Initiator account based on TM*T registry searchin on companyId, accountId, contract and registry_status=PROC|MGN",
stmt.getId(),
sdf57.getSpecif(),
tm_t.getId(),
registryD.getId());
sessionIsNeededFlag.set(true);
} else {
Registry dm_x = dm_xFound.get();
dm_x.setBalance(safeBD(dm_x.getBalance()).add(safeBD(stmt.getAmount())));
dm_x.setUpdated(Instant.now());
registryImdg.update(dm_x);
log.debug("stmt.id={}, sdf57.specif={} updated {}.id={}",
stmt.getId(),
sdf57.getSpecif(),
dm_x.getRegistryCode(),
dm_x.getId());
sessionIsNeededFlag.set(true);
}
}
}
stmt.setOperationStatus(OperationStatus.Executed.getKey());
statementImdg.update(stmt);
log.debug("stmt.id={} status -> {}", stmt.getId(), OperationStatus.Executed.getKey());
if (!dm_tWasCreated && timeService.isTradingTime() && InOutDirection.in.equalsByKey(stmt.getInOutDirection())) {
log.trace("sending gateway request for stmt.id={}", stmt.getId());
kafka.sendRequestToQueue(Consts.ASSET_OPERATION,
gatewayRequest(stmt,
company.getTradingCode(),
asts.a__t().getTradingClearingRegistry()));
if (TextUtil.isEmpty(asts.a__t().getTradingClearingRegistry())) {
log.trace("stmt.id={} {}.id={} TCR is empty, skipping gateway request",
stmt.getId(), asts.a__t().getRegistryCode(), asts.a__t().getId());
} else {
log.trace("sending gateway request for stmt.id={}", stmt.getId());
kafka.sendRequestToQueue(Consts.ASSET_OPERATION,
gatewayRequest(stmt,
company.getTradingCode(),
asts.a__t().getTradingClearingRegistry()));
}
}
return Optional.of(asts);
} else {
@ -610,6 +635,14 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
return this;
}
private RegistrySearch statusNotOk() {
predicate = pb.and(predicate, pb.or(
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
pb.equals("registryStatus", RegistryStatus.UNCV.getKey())
));
return this;
}
private Optional<Registry> find() {
return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(predicate));
}

View file

@ -23,10 +23,14 @@ public class GatewayRequestCreator {
}
public static AssetOperationRequest from(Registry rgs) {
return from(rgs, InOutDirection.out);
}
public static AssetOperationRequest from(Registry rgs, InOutDirection dir) {
return from(rgs.getId(),
null,
BigDecimalUtil.safeBD(rgs.getBalance()).abs(),
InOutDirection.out,
dir,
rgs.getTradingCode(),
rgs.getTradingClearingRegistry());
}

View file

@ -65,7 +65,8 @@ public class AssetTBFProcessing {
.map(rgs -> safeBD(rgs.getBalance()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
Instant now = Instant.now();
BigDecimal am_fBalanceForLoging = am_f.getBalance();
BigDecimal am_bBalanceForLoging = am_b.getBalance();
am_b.setBalance(am_b.getBalance().subtract(sum));
am_f.setBalance(am_t.getBalance().subtract(am_b.getBalance()).add(d__iSum).subtract(d__vSum));
am_b.setUpdated(now);
@ -73,6 +74,14 @@ public class AssetTBFProcessing {
rgsImdg.update(am_b);
rgsImdg.update(am_f);
log.debug("assets processing [{}#id={}#balance={} | {}#id={}#balance={} | {}#id={}#balance={}] " +
"D**I.size={} D**V.size={}. {}.balance -> {}, {}.balance -> {}",
am_f.getRegistryCode(), am_f.getId(), am_fBalanceForLoging,
am_t.getRegistryCode(), am_t.getId(), am_t.getBalance(),
am_b.getRegistryCode(), am_b.getId(), am_bBalanceForLoging,
d__is.size(), d__vs.size(),
am_b.getRegistryCode(), am_b.getBalance(),
am_f.getRegistryCode(), am_f.getBalance());
}
public Collection<Registry> searchByParams(String account,
@ -162,6 +171,46 @@ public class AssetTBFProcessing {
return new AssetTrio(asf, asb, ast);
}
public AssetTrio createMAssets(Account acc,
String securitySymbol,
Long securityId,
String tcrType,
Long tcrId,
String tcr,
Company company) {
Registry ast = new Registry();
ast.setCreated(Instant.now());
ast.setSecuritySymbol(securitySymbol);
ast.setSecurityId(securityId);
ast.setAccountId(acc.getId());
ast.setAccount(acc.getAccount());
ast.setAccountType(acc.getAccountType());
ast.setRegistryDesignation(RegistryDesignation.A.getKey());
ast.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
ast.setRegistryCapacity(tcrType);
ast.setRegistryUnit(RegistryUnit.T.getKey());
ast.setRegistryCode(RegistryUtil.clearingCode(ast));
ast.setClearingCode(company.getClearingCode());
ast.setTradingCode(company.getClearingCode());
ast.setCompanyId(company.getId());
ast.setShortName(company.getShortName());
ast.setFullName(company.getFullName());
ast.setTradingClearingRegistryId(tcrId);
ast.setTradingClearingRegistry(tcr);
ast.setRegistryStatus(RegistryStatus.OK.getKey());
ast.setBalanceDimension(BalanceDimension.MONY.getKey());
RegistryManager.zeroState(ast);
Registry asf = ast.clone();
asf.setRegistryUnit(RegistryUnit.F.getKey());
asf.setRegistryCode(RegistryUtil.clearingCode(asf));
RegistryManager.zeroState(asf);
Registry asb = ast.clone();
asb.setRegistryUnit(RegistryUnit.B.getKey());
asb.setRegistryCode(RegistryUtil.clearingCode(asb));
RegistryManager.zeroState(asb);
return new AssetTrio(asf, asb, ast);
}
public Optional<Registry> searchByTcrCompanyAccount(Registry rgs,
RegistryTradingParams params) {
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
@ -169,7 +218,8 @@ public class AssetTBFProcessing {
pb.sql(RegistryCodeSqlBuilder.getInstance(params).build()),
pb.equals("tradingClearingRegistryId", rgs.getTradingClearingRegistryId()),
pb.equals("companyId", rgs.getCompanyId()),
pb.equals("accountId", rgs.getAccountId())
pb.equals("accountId", rgs.getAccountId()),
pb.equals("securityId", rgs.getSecurityId())
);
return Optional.ofNullable(rgsImdg.getFirstObjectByPredicate(prdct));
}

View file

@ -183,6 +183,8 @@ public class RegistryManager {
//балансы
rgs.setBalance(BigDecimal.ZERO);
rgs.setDebit(BigDecimal.ZERO);
rgs.setSettledDebit(BigDecimal.ZERO);
rgs.setSettledCredit(BigDecimal.ZERO);
rgs.setCredit(BigDecimal.ZERO);
rgs.setDiffBalance(BigDecimal.ZERO);
rgs.setCheckBalance(BigDecimal.ZERO);

View file

@ -25,7 +25,7 @@ public class TradingTimeService {
this.plannerAllTodayImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class);
}
public boolean isTradingTime() {
private boolean isTradingTime(Task startTime, Task endTime) {
ImdgPredicateBuilder pb = plannerAllTodayImdg.predicateBuilder();
Function<Task, Optional<PlannerAllToday>> plannerByTask = task -> {
ImdgPredicate plannerPrdct = pb.and(
@ -34,19 +34,28 @@ public class TradingTimeService {
);
return Optional.ofNullable(plannerAllTodayImdg.getFirstObjectByPredicate(plannerPrdct));
};
LocalTime startTradingTime = plannerByTask.apply(Task.createRegistry_STRS)
LocalTime startTradingTime = plannerByTask.apply(startTime)
.map(PlannerAllToday::getTaskTime)
.orElse(null);
LocalTime endTradingTime = plannerByTask.apply(Task.createRegistry_ETRS)
LocalTime endTradingTime = plannerByTask.apply(endTime)
.map(PlannerAllToday::getTaskTime)
.orElse(null);
if (startTradingTime == null || endTradingTime == null) {
log.warn("startTradingTime or endTradingTime is null");
log.warn("{} or {} not found in planner all today", startTime.getKey(), endTime.getKey());
return false;
}
LocalTime now = LocalTime.now();
boolean isTradingTime = !now.isBefore(startTradingTime) && !now.isAfter(endTradingTime);
log.debug("now: {}, startTradingTime: {}, endTradingTime: {}. trading time: {}", now, startTradingTime, endTradingTime, isTradingTime);
log.debug("now: {}, {}: {}, {}: {}. period check in: {}",
now, startTime.getKey(), startTradingTime, endTime.getKey(), endTradingTime, isTradingTime);
return isTradingTime;
}
public boolean isTradingTime() {
return isTradingTime(Task.createRegistry_STRS, Task.createRegistry_ETRS);
}
public boolean timeForXdep() {
return isTradingTime(Task.startTime_SDEP, Task.endTime_EDEP);
}
}

View file

@ -84,7 +84,7 @@ public enum IdentificationFundsValidationRule implements IValidationRule<ImdgVal
if (tcr == null) {
return of(ClearingError.TCRegistryNotFound, validatedObject.getTradingClearingRegistryId());
}
if (!ServiceStatus.Active.equalsByKey(tcr.getStatus())) {
if (!ServiceStatus.Active.equalsByKey(tcr.getStatus()) && !ServiceStatus.Reopened.equalsByKey(tcr.getStatus())) {
return of(ClearingError.TradingClearingRegistryNotActive, tcr.getCode());
}

View file

@ -1,56 +1,122 @@
package ru.spcex.clearing.service.validation;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
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.domain.cud.registry.RegistryReturnDepositRequest;
import ru.spcex.clearing.service.registry.RegistryManager;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.Stored;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Optional;
import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode;
//1. Проверки
//1.1 Проверить, в запросе у регистра код:
// 1.1.1 Если регистр TM-T:
// Проверить, что у registry.companyId существует категория I, иначе ошибка: 5420 - "Доступ к клирингу на «%s» не найден для компании %s."/> Где %s = категории И
// Проверить, что найденного регистра DM*X: registry.status!=OK, иначе ошибка: 5425 - "Запрещена идентификация средства по рассчитанным обязательствам".
// Создать/добавить в баланс DM-X на базе TM-T
// 1.1.2 Если регистр OM-T:
// Проверить, что у registry.companyId существует категория V, иначе ошибка: 5420 - "Доступ к клирингу на «%s» не найден для компании %s."/> Где %s = категории В
// Проверить, что найденного регистра DM*T: registry.status!=OK, иначе ошибка: 5425 - "Запрещена идентификация средства по рассчитанным обязательствам".
// Создать/добавить в баланс DM-T на базе OM-T
//1.2 Проверить, баланс в запросе
// Баланс должен быть положительный
public enum ReturnDepositValidationRule implements IValidationRule<ImdgValidationContext<RegistryReturnDepositRequest>> {
RegistryCodeCheck() {
RgsWronCodeCheck() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) {
Registry rgs = context.getStoredObject(Stored.PresentById);
if (!RegistryDesignation.T.equalsByKey(rgs.getRegistryDesignation())
|| !RegistryInstrumentType.M.equalsByKey(rgs.getRegistryInstrumentType())
|| !RegistryUnit.T.equalsByKey(rgs.getRegistryUnit())) {
return of(ClearingError.RecordNotFoundInDictionary, "TM*T", "Registry");
if (!equalsByCode(RegistryTradingParams.TM_T, rgs)) { //!equalsByCode(RegistryTradingParams.OM_T, rgs)
return of(ClearingError.RgsWrongCode, "{}.id={}", rgs.getRegistryCode(), rgs.getId());
}
return empty();
}
}, BalanceCheck() {
},
CategoryCheck() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) {
Registry rgs = context.getStoredObject(Stored.PresentById);
Imdg<ClearingMemberCategory> ctgImdg = context.obtainMap(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
Collection<ClearingMemberCategory> category = ctgImdg.getCollectionObjectsBySQL(
"companyId = %d".formatted(rgs.getCompanyId()));
Optional<ClearingCategory> ctgr = category.stream()
.map(c -> IEnumKey.getEnumByKey(ClearingCategory.class, c.getClearingMemberCategory()))
.filter(c -> ClearingCategory.V.equals(c) || ClearingCategory.I.equals(c))
.findFirst();
if (ctgr.isEmpty()) {
return of(ClearingError.CategoryNotFound, "I/V", rgs.getCompanyId());
}
if (ctgr.get().equals(ClearingCategory.V)) {
Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
Collection<Registry> group = rgsImdg.getCollectionObjectsBySQL("groupId = %d".formatted(rgs.getGroupId()));
Optional<Registry> om_t = group.stream()
.filter(r -> r.getSettlementDate() != null)
.filter(r -> r.getValueDate() != null)
.filter(r -> r.getSettlementDate().isAfter(r.getValueDate()))
.filter(r -> equalsByCode(RegistryTradingParams.OM_T, r))
.findFirst();
if (om_t.isEmpty()) return of(ClearingError.RecordNotFound, "OM*T.groupId=%d".formatted(rgs.getGroupId()));
context.storeObject(ValidationStored.ReturnDepositOm_t, om_t.get());
}
return empty();
}
},
BalanceCheck() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) {
Registry rgs = context.getStoredObject(Stored.PresentById);
RegistryReturnDepositRequest request = context.getValidatedObject();
if (request.getBalance() == null || request.getBalance().compareTo(rgs.getBalance()) > 0) {
if (request.getBalance() == null || request.getBalance().compareTo(BigDecimal.ZERO) < 0) {
return of(ClearingError.WrongField, "balance");
}
if (request.getBalance().compareTo(rgs.getBalance()) > 0) {
return of(ClearingError.IdentifiedFundsExceedObligations);
}
return Optional.empty();
}
}, DmxCheck() {
}, Dm_Check() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) {
Registry rgs = context.getStoredObject(Stored.PresentById);
Registry rgs = context.getStoredObject(ValidationStored.ReturnDepositOm_t);
if (rgs == null) rgs = context.getStoredObject(Stored.PresentById);
Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
RegistryManager rgsMng = new RegistryManager(rgsImdg);
Optional<Registry> dmx = rgsMng.searchDmxByCompanyId(rgs);
if (dmx.isPresent() && RegistryStatus.OK.equalsByKey(dmx.get().getRegistryStatus()) ) {
if (TextUtil.isEmpty(rgs.getContract())) {
return empty();
}
RegistryTradingParams rgsCode;
if (equalsByCode(RegistryTradingParams.TM_T, rgs)) {
rgsCode = RegistryTradingParams.DM_X;
} else {
rgsCode = RegistryTradingParams.DM_T;
}
String sqlCondition = String.format("(%s) and companyId = %d and contract = '%s'",
RegistryCodeSqlBuilder.getInstance(rgsCode).build(),
rgs.getCompanyId(),
rgs.getContract());
Registry dm__ = rgsImdg.getFirstObjectBySQL(sqlCondition);
if (dm__ != null && RegistryStatus.OK.equalsByKey(dm__.getRegistryStatus()) ) {
return of(ClearingError.ObligationsAlreadyCalculated);
}
dmx.ifPresent(dmxRgs -> context.storeObject(ValidationStored.ReturnDepositDmx, dmxRgs));
return Optional.empty();
if (dm__ != null) {
context.storeObject(ValidationStored.ReturnDepositDm__, dm__);
}
return empty();
}
};

View file

@ -14,12 +14,14 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public enum SplitDepositRequestValidationRule implements IValidationRule<ImdgValidationContext<RegistrySplitDepositActionRequest>> {
PositiveAmount() {
@ -78,6 +80,51 @@ public enum SplitDepositRequestValidationRule implements IValidationRule<ImdgVal
return Optional.of(new EnumMessage(ClearingError.WrongFieldValue, "RefundDate"));
}
return empty();
}
},
LoadContractIndexes() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistrySplitDepositActionRequest> context) {
Imdg<Registry> registryImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
RegistrySplitDepositActionRequest validatedObject = context.getValidatedObject();
String contract = validatedObject.getContract();
if (TextUtil.isEmpty(contract)) {
return of(ClearingError.WrongField, "contract");
}
String cntrSrch;
int i = contract.indexOf("~");
if (i == -1) {
context.storeObject(ValidationStored.SplitDepositMaxNumber, 0);
return empty();
} else {
cntrSrch = contract.substring(0, i);
}
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate allContracts = pb.and(
pb.or(pb.equals("registryStatus", RegistryStatus.PROC.getKey()), pb.equals("registryStatus", RegistryStatus.MNG.getKey())),
pb.or(pb.equals("registryDesignation", RegistryDesignation.O.getKey()), pb.equals("registryDesignation", RegistryDesignation.T.getKey())),
pb.equals("registryUnit", RegistryUnit.T.getKey()),
pb.regex("contract", cntrSrch + ".*")
);
Collection<Registry> rgss = registryImdg.getCollectionObjectsByPredicate(allContracts);
Integer maxContractNumber = rgss.stream()
.map(Registry::getContract)
.filter(c -> c.contains("~"))
.map(c -> c.substring(c.lastIndexOf("~") + 1))
.flatMap(number -> {
try {
return Stream.of(Integer.valueOf(number));
} catch (NumberFormatException e) {
return Stream.empty();
}
})
.max(Integer::compareTo)
.orElse(0);
if (maxContractNumber == 0) {
log.warn("contract {} contains '~' but no maximum number was extracted", contract);
}
context.storeObject(ValidationStored.SplitDepositMaxNumber, maxContractNumber);
return empty();
}
};

View file

@ -18,7 +18,7 @@ public enum ValidationStored {
Sdf06Company, Sdf06Account, Sdf06Tcr,
ReturnDepositDmx,
ReturnDepositDm__, ReturnDepositOm_t,
IdentificationFundsTcrSearch, IdentificationFundsAssetTrio,
@ -32,5 +32,5 @@ public enum ValidationStored {
SecurityBySecurityCode,
RegistrysByContract
RegistrysByContract, SplitDepositMaxNumber
}

View file

@ -105,6 +105,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
inspectionObligations.setSessionType(sessionType());
inspectionObligations.setSection(section());
formingPaymentInstructionDeals.setSection(section());
formingPaymentInstructionDeals.setSessionType(sessionType());
imdgProvider.waitAvailable();
initSessionIfPresent();
}

View file

@ -214,16 +214,16 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali
public void finishPart() {
try {
//stage 9 continue revision
{
StageResult<Object> reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false);
if (!reviseRes.isSuccess()) {
this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section());
log.warn("{} stage error, created monitor for {}",
TaskType.AgainRevise,
afterReviseErrorMonitor.allConditions());
return;
}
}
//{
// StageResult<Object> reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false);
// if (!reviseRes.isSuccess()) {
// this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section());
// log.warn("{} stage error, created monitor for {}",
// TaskType.AgainRevise,
// afterReviseErrorMonitor.allConditions());
// return;
// }
//}
//stage 10
{
FinishingSessionPayload payload = new FinishingSessionPayload();

View file

@ -160,6 +160,7 @@ public class ReturnDepositSession extends AbstractSession implements Initializin
{
InspectionPoolPayload companyIdPayload = new InspectionPoolPayload();
companyIdPayload.setProcessedCompanyId(currSession.getCompanyId());
companyIdPayload.setSessionId(currSession.getId());
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligationsDepositReturn);
}

View file

@ -9,6 +9,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.notification.NotificationSender;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.service.schedule.TradingTimeService;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -33,13 +34,14 @@ public class SessionManager {
private final IntermediateMkrSession intermediateMkrSession;
private final FinalMkrSession finalMkrSession;
private final ReturnDepositSession returnDepositSession;
private final TradingTimeService time;
public SessionManager(ImdgProvider imdgProvider,
NotificationSender notification, IMessageResolver msgs, PrimaryAuctionT0Session primaryAuctionT0Session,
PrimaryAuctionBnSession primaryAuctionBnSession,
PrimaryAuctionB0Session primaryAuctionB0Session,
SecondaryAuctionT0Session secondaryAuctionT0Session,
IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession) {
IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, TradingTimeService time) {
this.notification = notification;
this.msgs = msgs;
this.primaryAuctionT0Session = primaryAuctionT0Session;
@ -51,6 +53,7 @@ public class SessionManager {
this.returnDepositSession = returnDepositSession;
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.time = time;
}
public void defineAndStartSession(BaseRequest<LauncherCommandRequest> r) throws ValidationException { //task sclr section fond sessiontype trdt
@ -76,19 +79,27 @@ public class SessionManager {
if (session != null) {
//checkActive
checkActiveSession();
checkAllowSessionStart(sessionType);
session.runSession(baseRequest);
}
}
protected void checkActiveSession() throws ValidationException {
Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of(
"workflowStatus", SessionStatus.ACTV.getKey()
));
if (existActiveSession != null) {
log.warn("Can not start new session, cause exist active session.id={}", existActiveSession.getId());
EnumMessage err = new EnumMessage(ClearingError.ActiveSessionIsPresent, String.valueOf(existActiveSession.getId()));
protected void checkAllowSessionStart(SessionType sessionType) throws ValidationException {
EnumMessage err = null;
if (sessionType.equals(SessionType.XDEP) && !time.timeForXdep()) {
log.warn("cannot launch {} reason: time interval not matched", sessionType);
err = new EnumMessage(ClearingError.XdepTimeIntervalNotMatch);
} else {
Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of(
"workflowStatus", SessionStatus.ACTV.getKey()
));
if (existActiveSession != null) {
log.warn("Can not start new session, cause exist active session.id={}", existActiveSession.getId());
err = new EnumMessage(ClearingError.ActiveSessionIsPresent, String.valueOf(existActiveSession.getId()));
}
}
if (err != null) {
notification.sendNotification(ObjectType.session, msgs.resolve(err), Priority.HIGH);
throw new ValidationException(err);
}

View file

@ -130,7 +130,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage {
private StageResult<?> formingPaymentInstructions(FormingPaymentInstructionPayload payload) {
Long sessionId = payload.getSessionId();
if (SessionType.FINL.equals(sessionType)) {
if (SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) {
dmvSrv.createDmv(sessionId);
}
Collection<Registry> AMBregistries = selectAMBRegistries(sessionId);

View file

@ -1,7 +1,5 @@
package ru.spcex.clearing.session.stage.impl;
import org.apache.commons.lang3.tuple.MutableTriple;
import org.apache.commons.lang3.tuple.Triple;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -55,16 +53,18 @@ public class InspectionObligations implements ISessionStage {
private final AssetTBFProcessing assets;
private final GatewayRequester gateway;
private final TradingTimeService tradingTimeService;
private final PlanBalanceCalc planBalanceCalc;
@Autowired
public InspectionObligations(ImdgProvider imdgProvider,
RegistryManager registryManager,
AssetTBFProcessing assets,
GatewayRequester gateway) {
GatewayRequester gateway, PlanBalanceCalc planBalanceCalc) {
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.registryManager = registryManager;
this.assets = assets;
this.gateway = gateway;
this.planBalanceCalc = planBalanceCalc;
this.gateway.setName("InspectionObligations|OM*T");
this.tradingTimeService = new TradingTimeService(imdgProvider);
}
@ -204,52 +204,11 @@ public class InspectionObligations implements ISessionStage {
}
}
stageRevision2(sessionId);
planBalanceCalc.stageRevision2(sessionId);
return new StageResult(null, true);
}
protected void stageRevision2(Long sessionId) {
/* todo logic
Collection rgsAT = findRegistryATBySession // registry_disignation=A and registry_unit=T
Collection rgsAB = findRegistryATBySession // registry_disignation=A and registry_unit=B and sessionId = current
foreach( at: rgsAT)
foreach (ab: rgsAB)
if (at.companyId=ab.companyId and at.accountId=ab.accountId and at.securityId=ab.securityId)
at.plannecBallance -= ab.balance
*/
String sqlAT = RegistryCodeSqlBuilder.getInstance(A__T).build();
String sqlAB = String.format("(%s) and sessionId = %d",
RegistryCodeSqlBuilder.getInstance(A__B).build(),
sessionId
);
Collection<Registry> registriesAT = registryImdg.getCollectionObjectsBySQL(sqlAT);
Collection<Registry> registriesAB = registryImdg.getCollectionObjectsBySQL(sqlAB);
log.debug("Select {} registers by \"{}\", {} registers by \"{}\" for revision step 2",
registriesAT.size(), sqlAT, registriesAB.size(), sqlAB);
Map<Triple<Long, Long, Long>, List<Registry>> regABIndex = registriesAB.stream().collect(Collectors.groupingBy(
(Registry reg) -> new MutableTriple(reg.getCompanyId(), reg.getAccountId(), reg.getSecurityId())
));
int updateCount = 0;
Instant now = Instant.now();
for (Registry regT : registriesAT) {
Triple<Long, Long, Long> key = new MutableTriple(regT.getCompanyId(), regT.getAccountId(), regT.getSecurityId());
List<Registry> regsB = regABIndex.get(key);
if (regsB == null) {
log.debug("Registry A__B for registry[{}] (A__T key {}) not found", regT, key);
} else {
for (Registry regB : regsB) {
regT.setPlanBalance(safeBD(regT.getPlanBalance()).subtract(safeBD(regB.getBalance())));
}
regT.setUpdated(now);
registryImdg.update(regT);
updateCount++;
}
}
log.debug("Updated {} registers A__T with planBalance at {}", updateCount, now);
}
private String searchAssetsByObligationSql(Registry obligation) {
RegistryTradingParams counterRegistryTradingParams = null;
if (IEnumKey.getEnumByKey(RegistryInstrumentType.class, obligation.getRegistryInstrumentType()) == RegistryInstrumentType.S) {

View file

@ -16,6 +16,7 @@ import ru.spcex.clearing.service.schedule.TradingTimeService;
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.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -44,23 +45,26 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
private final AssetTBFProcessing assets;
private final TradingTimeService tradingTimeService;
private final GatewayRequester gateway;
private final PlanBalanceCalc planBalanceCalc;
@Autowired
public InspectionObligationsDepositReturn(ImdgProvider imdgProvider, RegistryManager rgsMng, AssetTBFProcessing assets, TradingTimeService tradingTimeService, GatewayRequester gateway) {
public InspectionObligationsDepositReturn(ImdgProvider imdgProvider, RegistryManager rgsMng, AssetTBFProcessing assets, TradingTimeService tradingTimeService, GatewayRequester gateway, PlanBalanceCalc planBalanceCalc) {
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.categoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
this.rgsMng = rgsMng;
this.assets = assets;
this.tradingTimeService = tradingTimeService;
this.gateway = gateway;
this.planBalanceCalc = planBalanceCalc;
this.gateway.setName("InspectionObligationsDepositReturn|OM*T");
}
@Override
public StageResult<?> submit(Task<?> task) {
InspectionPoolPayload payload = (InspectionPoolPayload) task.getData();
switch (task.getTaskType()) {
case InspectionObligations -> {
return inspectionObligations();
return inspectionObligations(payload.getSessionId());
}
default -> throw new IllegalStateException("Unknown task type: " + task.getTaskType());
}
@ -81,7 +85,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
}
}
private StageResult<?> inspectionObligations() {
private StageResult<?> inspectionObligations(Long sessionId) {
String sqlCondition = String.format("(%s) and registryStatus = '%s'",
RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(),
RegistryStatus.POOL.getKey());
@ -152,7 +156,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
dmtInfo.get().getId(),
dmtBalance, omtBalance, amfBalance
);
if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >=0 && gatewayIfNeeded(omtRgs)) {
if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >=0) {
group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK));
assets.processByAm_f(amfAsset, omtBalance.negate());
// updateStatus(dmtInfo.get(), RegistryStatus.POOL);
@ -171,7 +175,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
dmtClnr.get().getId(),
dmtBalance, omtBalance, amfBalance
);
if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0 && gatewayIfNeeded(omtRgs)) {
if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0) {
group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK));
assets.processByAm_f(amfAsset, omtBalance.negate());
continue;
@ -196,6 +200,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
group.forEach(rgs -> updateStatus(rgs, registryStatusFailed(rgs)));
}
}
planBalanceCalc.stageRevision2(sessionId);
return new StageResult<>(null, true);
}

View file

@ -0,0 +1,73 @@
package ru.spcex.clearing.session.stage.impl;
import org.apache.commons.lang3.tuple.MutableTriple;
import org.apache.commons.lang3.tuple.Triple;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.time.Instant;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static ru.spcex.platform.enumeration.RegistryTradingParams.A__B;
import static ru.spcex.platform.enumeration.RegistryTradingParams.A__T;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Component
public class PlanBalanceCalc {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Registry> rgsImdg;
public PlanBalanceCalc(ImdgProvider imdgProvider) {
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
}
public void stageRevision2(Long sessionId) {
/* todo logic
Collection rgsAT = findRegistryATBySession // registry_disignation=A and registry_unit=T
Collection rgsAB = findRegistryATBySession // registry_disignation=A and registry_unit=B and sessionId = current
foreach( at: rgsAT)
foreach (ab: rgsAB)
if (at.companyId=ab.companyId and at.accountId=ab.accountId and at.securityId=ab.securityId)
at.plannecBallance -= ab.balance
*/
String sqlAT = RegistryCodeSqlBuilder.getInstance(A__T).build();
String sqlAB = String.format("(%s) and sessionId = %d",
RegistryCodeSqlBuilder.getInstance(A__B).build(),
sessionId
);
Collection<Registry> registriesAT = rgsImdg.getCollectionObjectsBySQL(sqlAT);
Collection<Registry> registriesAB = rgsImdg.getCollectionObjectsBySQL(sqlAB);
log.debug("Select {} registers by \"{}\", {} registers by \"{}\" for revision step 2",
registriesAT.size(), sqlAT, registriesAB.size(), sqlAB);
Map<Triple<Long, Long, Long>, List<Registry>> regABIndex = registriesAB.stream().collect(Collectors.groupingBy(
(Registry reg) -> new MutableTriple(reg.getCompanyId(), reg.getAccountId(), reg.getSecurityId())
));
int updateCount = 0;
Instant now = Instant.now();
for (Registry regT : registriesAT) {
Triple<Long, Long, Long> key = new MutableTriple(regT.getCompanyId(), regT.getAccountId(), regT.getSecurityId());
List<Registry> regsB = regABIndex.get(key);
if (regsB == null) {
log.debug("Registry A__B for registry[{}] (A__T key {}) not found", regT, key);
} else {
for (Registry regB : regsB) {
regT.setPlanBalance(safeBD(regT.getPlanBalance()).subtract(safeBD(regB.getBalance())));
}
regT.setUpdated(now);
rgsImdg.update(regT);
updateCount++;
}
}
log.debug("Updated {} registers A__T with planBalance at {}", updateCount, now);
}
}

View file

@ -25,6 +25,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.collection.Pair;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@ -58,6 +59,7 @@ public class RequirementsAndObligationCreation implements ISessionStage {
}
private StageResult<?> createRegisters(List<ExecutionCommon> data) {
data.sort(Comparator.comparing(ExecutionCommon::getExchangeExecutionId));
//см. описание к #matchExecutions
for (int i = 0; i < data.size(); ) {
Pair<ExecutionCommon, ExecutionCommon> matched = matchExecutions(data, i);
@ -230,6 +232,7 @@ public class RequirementsAndObligationCreation implements ISessionStage {
}
if (invalid != null) {
log.error("FATAL couldn't match Execution#id({}) with Execution#id({}) error: {}", exec1.getId(), exec2.getId(), invalid);
return null;
}
return new Pair<>(exec1, exec2);
}

View file

@ -53,10 +53,10 @@ public class ProfileDocumentValidationConfig {
FieldRequiredRule.instance("issueDate",
ProfileDocumentNewRequest::getIssueDate,
CompanyErrors.RequiredFieldEmpty),
FieldRequiredRule.instance("issuer",
FieldNotBlankRequiredRule.instance("issuer",
ProfileDocumentNewRequest::getIssuer,
CompanyErrors.RequiredFieldEmpty),
FieldRequiredRule.instance("number",
FieldNotBlankRequiredRule.instance("number",
ProfileDocumentNewRequest::getNumber,
CompanyErrors.RequiredFieldEmpty),
FieldRequiredRule.instance("validToDate",

View file

@ -179,7 +179,11 @@ public class ClearingMemberCategoryService extends QueueConsumer implements Init
try {
Imdg<ClearingMemberCategory> txClearingMemberCategoryMap = transaction.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
txClearingMemberCategoryMap.delete(clearingMemberCategory); // далить до cancelRelation внутри транзакции
companyService.relationService.cancelRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory);
if (clearingMemberCategory.getCompanyId() == null) { // never, только тестовые данные
log.warn("Deleted clearingMemberCategory[{}] has not companyId", clearingMemberCategory.getId());
} else {
companyService.relationService.cancelRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory);
}
txOk = true;
} finally {
if (txOk)

View file

@ -27,6 +27,7 @@ import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.error.ValidationException;
import ru.spcex.platform.utils.log.ExceptionUtils;
@ -48,7 +49,7 @@ public class MultiCompanyService
private final RequestHelper requestHelper;
protected UserRoleVerification userRoleVerification;
// private final ValidationHelper validationHelper;
// private final ValidationHelper validationHelper;
protected IMessageResolver messageResolver;
final CompanyService companyService;
@ -128,12 +129,8 @@ public class MultiCompanyService
req.setCompanySymbols(
Stream.concat(req.getCompanySymbols().stream(), additionalSymbols(req.getCompany())).collect(Collectors.toList())
);
companyId = getCompanyIdForCompanySymbols(req.getUuid(), req.getCompany());
companyId = getCompanyIdForCompanySymbols(req.getUuid(), req.getCompany(), req.getCompanySymbols());
log.debug("For request {} (uuid {}) company {}.", baseRequest.getId(), req.getUuid(), companyId == null ? "not found" : ("found, id=" + companyId));
if (companyId == null) {
log.debug("For request {} (uuid {}) company not found. Try find by other symbols.", baseRequest.getId(), req.getUuid());
companyId = getCompanyIdForCompanySymbols(req.getCompanySymbols());
}
if (companyId == null) {
companyId = companyService.create(req.getCompany());
@ -334,7 +331,7 @@ public class MultiCompanyService
return r;
}
Long getCompanyIdForCompanySymbols(String uuid, CompanyNewRequest cnr) {
Long getCompanyIdForCompanySymbols(String uuid, CompanyNewRequest cnr, Collection<CompanySymbolNewRequest> companySymbols) {
CompanySymbols companySymbol = null;
if (StringUtils.isNotEmpty(uuid)) {
log.trace("Search company by companySymbol uuid={}", uuid);
@ -351,10 +348,12 @@ public class MultiCompanyService
}
}
}
if (companySymbol == null && StringUtils.isNotEmpty(cnr.getCompanySymbolValue())) {
for (String companySymbolType : Arrays.asList(
cnr.getCompanySymbol(), CompanySymbol.INN.getKey(), CompanySymbol.CIO.getKey()
)) {
if (companySymbol == null && StringUtils.isNotEmpty(cnr.getCompanySymbolValue())
&& IEnumKey.contains(cnr.getCompanySymbol(), CompanySymbol.UUID, CompanySymbol.INN, CompanySymbol.CIO)) { // вероятно там будет только UUID
{
String companySymbolType = cnr.getCompanySymbol();
log.debug("Company not found by UUID=\"{}\", try find by {}={}",
uuid, companySymbolType, cnr.getCompanySymbolValue());
log.trace("Search company by companySymbol {}={}", companySymbolType, cnr.getCompanySymbolValue());
Collection<CompanySymbols> companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues(
Map.of(
@ -367,36 +366,32 @@ public class MultiCompanyService
if (companySymbolsFromImdg.size() > 1) {
log.warn("For {} found > 1 company_symbols, use first (id = {})", companySymbolType, cnr.getCompanySymbolValue());
}
break;
}
}
}
if (companySymbol != null)
return companySymbol.getCompanyId();
else
return null;
}
if (companySymbol == null && companySymbols != null) {
for (CompanySymbolNewRequest cSymbolReq : companySymbols) {
if (IEnumKey.contains(cSymbolReq.getCompanySymbol(), CompanySymbol.INN, CompanySymbol.CIO)) {
String companySymbolType = cSymbolReq.getCompanySymbol();
log.debug("Company not found by UUID=\"{}\", try find by {}", uuid, companySymbolType);
log.trace("Search company by companySymbol {}={}", companySymbolType, cSymbolReq.getCompanySymbolValue());
Collection<CompanySymbols> companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues(
Map.of(
"companySymbol", companySymbolType,
"companySymbolValue", cSymbolReq.getCompanySymbolValue()
)
);
if (!companySymbolsFromImdg.isEmpty()) {
companySymbol = companySymbolsFromImdg.iterator().next();
if (companySymbolsFromImdg.size() > 1) {
log.warn("For {} found > 1 company_symbols, use first (id = {})", companySymbolType, cSymbolReq.getCompanySymbolValue());
}
break;
}
}
}
}
Long getCompanyIdForCompanySymbols(List<CompanySymbolNewRequest> otherRequests) {
CompanySymbols companySymbol = null;
for (CompanySymbolNewRequest req : otherRequests) {
if (req.getCompanySymbol() == null) continue;
log.trace("Search company by companySymbol {}={}", req.getCompanySymbol(), req.getCompanySymbolValue());
Collection<CompanySymbols> companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues(
Map.of(
"companySymbol", req.getCompanySymbol(),
"companySymbolValue", req.getCompanySymbolValue()
)
);
if (!companySymbolsFromImdg.isEmpty()) {
companySymbol = companySymbolsFromImdg.iterator().next();
if (companySymbolsFromImdg.size() > 1) {
log.warn("For {} found > 1 company_symbols, use first (id = {})", req.getCompanySymbol(), req.getCompanySymbolValue());
}
log.debug("Found by company symbol {} {}", req.getCompanySymbol(), req.getCompanySymbolValue());
break;
}
}
if (companySymbol != null)
return companySymbol.getCompanyId();
else

View file

@ -168,6 +168,7 @@ class ClearingMemberCategoryServiceTest {
String clearingMemberCategory = "0000";
ClearingMemberCategory existsClearingMemberCategory = new ClearingMemberCategory();
existsClearingMemberCategory.setClearingMemberCategory(clearingMemberCategory);
existsClearingMemberCategory.setCompanyId(COMPANY_ID);
Long id = memberCategoryImdg.insert(existsClearingMemberCategory);
CommonDeleteRequest memberCategoryDeleteRequest = new CommonDeleteRequest();

View file

@ -26,6 +26,8 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId;
@ -48,6 +50,8 @@ import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProv
ProfileDocumentValidationConfig.class,
ContactService.class,
ContactValidationConfig.class,
ClearingMemberCategoryService.class,
ClearingMemberCategoryValidationConfig.class,
KafkaTestConfig.class,
ImdgTestConfig.class,
@ -101,8 +105,8 @@ class MultiCompanyServiceTest {
CompanySymbols companySymbol = new CompanySymbols();
companySymbol.setId(222L);
companySymbol.setCompanyId(company.getId());
companySymbol.setCompanySymbol(CompanySymbol.CLRC.getKey());
companySymbol.setCompanySymbolValue("CL-VALUE");
companySymbol.setCompanySymbol(CompanySymbol.INN.getKey());
companySymbol.setCompanySymbolValue("INN-VALUE");
companySymbolsImdg.insert(companySymbol);
Imdg<ProfileDocument> profileDocumentImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
@ -130,9 +134,13 @@ class MultiCompanyServiceTest {
req.setCompanyId(COMPANY_ID);
req.setCompanySymbol(CompanySymbol.CLRC.getKey());
req.setCompanySymbolValue("CL-VALUE-2");
assertNull(multiCompanyService.findCompanySymbols(req));
req.setCompanySymbol(CompanySymbol.INN.getKey());
req.setCompanySymbolValue("INN-VALUE");
CompanySymbols symbol = multiCompanyService.findCompanySymbols(req);
assertNotNull(symbol);
assertEquals("CL-VALUE", symbol.getCompanySymbolValue());
assertEquals("INN-VALUE", symbol.getCompanySymbolValue());
}
@Test
@ -151,8 +159,32 @@ class MultiCompanyServiceTest {
CompanyNewRequest req = new CompanyNewRequest();
req.setCompanySymbol(CompanySymbol.CLRC.getKey());
req.setCompanySymbolValue("CL-VALUE");
Long theId = multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req);
assertEquals(COMPANY_ID, theId);
assertNull(multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req, null));
req.setCompanySymbolValue("INN-VALUE");
assertNull(multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req, null));
req.setCompanySymbol(CompanySymbol.INN.getKey());
assertEquals(COMPANY_ID, multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req, null));
req.setCompanySymbol(null);
req.setCompanySymbolValue(null);
assertNull(multiCompanyService.getCompanyIdForCompanySymbols(null, req, null));
List<CompanySymbolNewRequest> csReq=new ArrayList<>();
assertNull(multiCompanyService.getCompanyIdForCompanySymbols(null, req, null));
assertNull(multiCompanyService.getCompanyIdForCompanySymbols(null, req, csReq));
{
CompanySymbolNewRequest cs=new CompanySymbolNewRequest();
cs.setCompanySymbol(CompanySymbol.CLRC.getKey());
cs.setCompanySymbolValue("INN-VALUE");
csReq.add(cs);
}
assertNull(multiCompanyService.getCompanyIdForCompanySymbols(null, req, csReq));
{
CompanySymbolNewRequest cs=new CompanySymbolNewRequest();
cs.setCompanySymbol(CompanySymbol.INN.getKey());
cs.setCompanySymbolValue("INN-VALUE");
csReq.add(cs);
}
assertEquals(COMPANY_ID, multiCompanyService.getCompanyIdForCompanySymbols(null, req, csReq));
}
@Test

View file

@ -11,6 +11,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.platform.dictionary.ClearingCategoryDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.clearing.platform.dictionary.WorkflowStatusDictionary;
import ru.spcex.clearing.company.config.BeanConfiguration;
import ru.spcex.clearing.company.config.validation.RelationValidationConfig;
@ -92,6 +93,18 @@ class RelationServiceTest {
workflowStatusDictionary.setName("not active");
workflowStatusDictionaryImdg.insert(workflowStatusDictionary);
{
Imdg<ServiceStatusDictionary> serviceStatusDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class
);
ServiceStatusDictionary status=new ServiceStatusDictionary();
status.setId(1L);
status.setCode("ACTV");
status.setName("\"ACTV\"");
serviceStatusDictionaryImdg.insert(status);
}
Imdg<ClearingCategoryDictionary> clearingCategoryDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingCategoryDictionary,
ClearingCategoryDictionary.class

View file

@ -1,4 +1,4 @@
-- DB version: 3.8.0.55
-- DB version: 3.8.0.58
-- DATA version: 3.5.0.13
@ -492,6 +492,10 @@ INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (24, 'GREF', 'Формиро
INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (25, 'FDFF', 'Формирование ДФ-05 с кодом 9 (финальный)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (26, 'SDEP', 'Время начала возврата депозитов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (27, 'EDEP', 'Время завершения возврата депозитов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Активна') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'BLKD', 'Не активна') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
@ -824,6 +828,8 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5022, 'ACNT', 'Для
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5023, 'ACNT', 'Счет %s уже используется.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5024, 'ACNT', 'Не указан номер счета.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5200, 'BLNC', 'Общая ошибка модуля balance-service.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5210, 'BLNC', 'Клиринговая сессия неактивна.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
@ -916,6 +922,8 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5431, 'CLRN', 'Дат
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5432, 'CLRN', 'После сверки обнаружена разница между плановым и фактическим балансом') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5433, 'CLRN', 'Сессия по возврату депозита не может исполняться вне временного интервала, установленного в системе') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5600, 'DBFI', 'Общая ошибка модуля dbf-importer.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5800, 'DBFE', 'Общая ошибка модуля dbf-exporter.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;

View file

@ -87,7 +87,7 @@ public class CompanyRequestAdapter {
log.warn("Money account \"{}\" not found", client.getMoneyAccount());
} else {
log.debug("Money account \"{}\" found with id={}", client.getMoneyAccount(), mAccount.getId());
client.setDepoAccountId(mAccount.getId());
client.setMoneyAccountId(mAccount.getId());
}
} catch (Exception e) {
log.warn("Error happened when search money account \"{}\": {}", client.getMoneyAccount(), ExceptionUtils.getStackTrace(e));

View file

@ -53,6 +53,8 @@ public class CompanyProcessor {
map(companyRequestAdapter::toCategoryRequest).toList();
CompanyGatewayRequest companyGatewayRequest = new CompanyGatewayRequest();
if (companyId != null)
companyGatewayRequest.setUuid(companyId.toString());
companyGatewayRequest.setCompany(companyRequestAdapter.toCompanyRequest(memberCompany));
request.getCompanyInfoList()
.stream()

View file

@ -46,6 +46,11 @@
<groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>test-clearing</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View file

@ -17,16 +17,16 @@ import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.AdmittedLiabilitiesRegisterNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.util.PreClearMap;
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.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
import ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
@ -42,8 +42,9 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements
private final Imdg<AdmittedLiabilitiesRegister> admittedLiabilitiesRegisterMap;
private final Imdg<Registry> registryMap;
private final Imdg<Company> companyMap;
private final Imdg<Security> securityMap;
private final SecuritySelector<Security> securitySelector;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<AdmittedLiabilitiesRegister> preClearMap;
@Autowired
public AdmittedLiabilitiesRegisterService(Consumer<String, Object> kafkaQueue,
@ -54,8 +55,9 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements
this.admittedLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_AdmittedLiabilitiesRegister, AdmittedLiabilitiesRegister.class);
this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.securityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class);
this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForLocalDateField(admittedLiabilitiesRegisterMap, "clearingDate");
}
@Override
@ -73,10 +75,12 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements
log.debug("AdmittedLiabilitiesRegisterNewRequest received from {}", Consts.REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW);
String sqlConditionForRegistry = getSqlForRegistries();
Collection<Registry> registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry);
if (registries == null) {
if (registries.isEmpty()) {
log.debug("No registry with such conditions {}", sqlConditionForRegistry);
return;
}
log.debug("Select {} Registry by query {}", registries.size(), registries);
preClearMap.preClearMap();
registries.forEach((registry -> {
if (isDuplicateInMap(registry).isEmpty()) {
insertAdmittedLiabilitiesRegister(registry);
@ -90,13 +94,12 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements
log.trace("Started generating AdmittedLiabilitiesRegister entity...");
AdmittedLiabilitiesRegister admittedLiabilitiesRegister = new AdmittedLiabilitiesRegister();
Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 1L));
Security security = securityMap.getFirstObjectByFieldValues(Map.of("id", registry.getSecurityId()));
String securitySymbol = security != null ? security.getSecuritySymbol() : null;
String securityFullName = security != null ? security.getShortName() : null;
String companyFullName = security != null ? company.getFullName() : null;
Security security = securitySelector.selectSecurityById(registry.getSecurityId());
String securityFullName = security != null ? security.getFullName() : null;
String companyFullName = company != null ? company.getFullName() : null;
admittedLiabilitiesRegister.setCompanyFullName(companyFullName);
admittedLiabilitiesRegister.setSessionId(registry.getSessionId());
admittedLiabilitiesRegister.setSecuritySymbol(securitySymbol);
admittedLiabilitiesRegister.setSecuritySymbol(registry.getSecuritySymbol());
admittedLiabilitiesRegister.setSecurityFullName(securityFullName);
admittedLiabilitiesRegister.setCompanyId(registry.getCompanyId());
admittedLiabilitiesRegister.setClearingCode(registry.getClearingCode());
@ -113,7 +116,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements
return String.format("registryDesignation = '%s' and " +
"registryInstrumentType in ('%s','%s') and " +
"registryUnit = '%s' and " +
"registryStatus in ('%s','%s','%s','%s','%s')"
"registryStatus in ('%s','%s','%s','%s','%s', '%s')"
,
RegistryDesignation.O.getKey(),
RegistryInstrumentType.S.getKey(),
@ -123,19 +126,28 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements
RegistryStatus.NACK.getKey(),
RegistryStatus.UNCV.getKey(),
RegistryStatus.NACC.getKey(),
RegistryStatus.FAIL.getKey()
RegistryStatus.FAIL.getKey(),
RegistryStatus.CLRD.getKey()
);
}
@Override
public Optional<AdmittedLiabilitiesRegister> isDuplicateInMap(Registry entity) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(admittedLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues));
return Optional.empty();
//для всех isDuplicateInMap: пока не используется, надо по критерию чистить мапу перед вставкой записей, preClearMap.
// Map<String, ? extends Comparable<?>> fieldValues = Map.of(
// "companyId", entity.getRegistryCode(),
// "sessionId", entity.getSessionId(),
// "securitySymbol", entity.getSecuritySymbol(),
// "clearingDate", entity.getClearingDate(),
// "account", entity.getAccount()
// );
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(admittedLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues));
}
}

View file

@ -17,16 +17,16 @@ import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.CoveredLiabilitiesRegisterNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.util.PreClearMap;
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.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
import ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
@ -42,8 +42,9 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements
private final Imdg<CoveredLiabilitiesRegister> coveredLiabilitiesRegisterMap;
private final Imdg<Registry> registryMap;
private final Imdg<Company> companyMap;
private final Imdg<Security> securityMap;
private final SecuritySelector<Security> securitySelector;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<CoveredLiabilitiesRegister> preClearMap;
@Autowired
public CoveredLiabilitiesRegisterService(Consumer<String, Object> kafkaQueue,
@ -54,8 +55,9 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements
this.coveredLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CoveredLiabilitiesRegister, CoveredLiabilitiesRegister.class);
this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.securityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class);
this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForLocalDateField(coveredLiabilitiesRegisterMap, "clearingDate");
}
@Override
@ -74,10 +76,12 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements
log.debug("CoveredLiabilitiesRegisterNew received");
String sqlConditionForRegistry = getSqlForRegistries();
Collection<Registry> registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry);
if (registries == null) {
if (registries.isEmpty()) {
log.debug("No registry with such conditions {}", sqlConditionForRegistry);
return;
}
log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry);
preClearMap.preClearMap();
registries.forEach((registry -> {
if (isDuplicateInMap(registry).isEmpty()) {
insertCoveredLiabilitiesRegister(registry);
@ -91,13 +95,12 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements
log.trace("insert CoveredLiabilitiesRegister in map...");
CoveredLiabilitiesRegister coveredLiabilitiesRegister = new CoveredLiabilitiesRegister();
Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 1L));
Security security = securityMap.getFirstObjectByFieldValues(Map.of("id", registry.getSecurityId()));
String securitySymbol = security != null ? security.getSecuritySymbol() : null;
String securityFullName = security != null ? security.getShortName() : null;
String companyFullName = security != null ? company.getFullName() : null;
Security security = securitySelector.selectSecurityById(registry.getSecurityId());
String securityFullName = security != null ? security.getFullName() : null;
String companyFullName = company != null ? company.getFullName() : null;
coveredLiabilitiesRegister.setCompanyFullName(companyFullName);
coveredLiabilitiesRegister.setSessionId(registry.getSessionId());
coveredLiabilitiesRegister.setSecuritySymbol(securitySymbol);
coveredLiabilitiesRegister.setSecuritySymbol(registry.getSecuritySymbol());
coveredLiabilitiesRegister.setSecurityFullName(securityFullName);
coveredLiabilitiesRegister.setCompanyId(registry.getCompanyId());
coveredLiabilitiesRegister.setClearingCode(registry.getClearingCode());
@ -114,22 +117,25 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements
return String.format("registryDesignation = '%s' and " +
"registryInstrumentType in ('%s','%s') and " +
"registryUnit = '%s' and " +
"registryStatus = '%s'",
"registryStatus in ('%s', '%s')",
RegistryDesignation.O.getKey(),
RegistryInstrumentType.S.getKey(),
RegistryInstrumentType.M.getKey(),
RegistryUnit.T.getKey(),
RegistryStatus.OK.getKey());
RegistryStatus.OK.getKey(),
RegistryStatus.CLRD.getKey()
);
}
@Override
public Optional<CoveredLiabilitiesRegister> isDuplicateInMap(Registry entity) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(coveredLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues));
return Optional.empty();
// Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(coveredLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues));
}
}

View file

@ -13,16 +13,16 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.util.PreClearMap;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
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 ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
@ -38,6 +38,7 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial
private final Imdg<DepoBalanceRegister> depoBalanceRegisterMap;
private final Imdg<Registry> registryMap;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<DepoBalanceRegister> preClearMap;
@Autowired
public DepoBalanceRegisterService(Consumer<String, Object> kafkaQueue,
@ -48,6 +49,7 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial
this.depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class);
this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForInstantField(depoBalanceRegisterMap, "created");
}
@Override
@ -60,17 +62,15 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial
public void depoBalanceRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic());
if (userRequest.getRequestPayload().getCompanyId() == null) {
log.debug("No companyId in LauncherCommandRequest.id={}", userRequest.getId());
return;
}
ImdgPredicate prdctForRegistries = getPredicateForRegistries(userRequest.getRequestPayload().getCompanyId());
Collection<Registry> registries = registryMap.getCollectionObjectsByPredicate(prdctForRegistries);
log.trace("Started searching depoBalanceRegister in register by '{}'", prdctForRegistries);
if (registries == null) {
if (registries.isEmpty()) {
log.debug("No registry with such conditions '{}'", prdctForRegistries);
return;
}
log.debug("Select {} Registry by query {}", registries.size(), prdctForRegistries);
preClearMap.preClearMap();
registries.forEach((registry -> {
if (isDuplicateInMap(registry).isEmpty()) {
insertDepoBalanceRegister(registry);
@ -84,14 +84,16 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial
log.trace("Started generating DepoBalanceRegister entity...");
DepoBalanceRegister depoBalanceRegister = new DepoBalanceRegister();
depoBalanceRegister.setUpdated(Instant.now());
depoBalanceRegister.setCreated(Instant.now());
depoBalanceRegister.setCreated(depoBalanceRegister.getUpdated());
depoBalanceRegister.setCompanyId(registry.getCompanyId());
depoBalanceRegister.setSessionId(registry.getSessionId());
depoBalanceRegister.setDepoCode(registry.getAccountType());
depoBalanceRegister.setQuantity(registry.getCloseBalance());
if (AccountType.Depo.equalsByKey(registry.getAccountType())) {
depoBalanceRegister.setDepoCode(registry.getAccount());
} else if (registry.getAccountType() != null) {
log.warn("Unexpected registry[{}].accountType={}", registry.getId(), registry.getAccountType());
}
depoBalanceRegister.setQuantity(registry.getBalance());
depoBalanceRegister.setSecuritySymbol(registry.getSecuritySymbol());
depoBalanceRegister.setCreated(Instant.now());
depoBalanceRegister.setUpdated(Instant.now());
depoBalanceRegisterMap.insert(depoBalanceRegister);
log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoBalanceRegister.getId());
}
@ -99,20 +101,24 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial
private ImdgPredicate getPredicateForRegistries(Long companyId) {
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T);
return pb.and(
pb.equals("companyId", companyId),
pb.sql(codeSql.build())
);
if (companyId == null) // default use case
return pb.sql(codeSql.build());
else
return pb.and(
pb.equals("companyId", companyId),
pb.sql(codeSql.build())
);
}
@Override
public Optional<DepoBalanceRegister> isDuplicateInMap(Registry entity) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(depoBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues));
return Optional.empty();
// Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(depoBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues));
}
}

View file

@ -16,12 +16,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.util.PreClearMap;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
@ -41,6 +40,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme
private final Imdg<TradingClearingRegistry> tradingClearingRegistryMap;
private final Imdg<InOutDirectionDictionary> InOutDirectionDictionaryMap;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<DepoPaymentInstructionRegister> preClearMap;
@Autowired
public DepoPaymentInstructionRegisterService(Consumer<String, Object> kafkaQueue,
@ -54,6 +54,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme
this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.InOutDirectionDictionaryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForInstantField(depoPaymentInstructionRegisterMap, "created");
}
@Override
@ -67,15 +68,19 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme
public void depoPaymentInstructionRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
log.debug("LauncherCommandRequest received from {}", createRegistry_GORR.topic());
Collection<Session> actualSessions = sessionMap.getCollectionObjectsByFieldValues(Map.of("section", "FOND"));
if (actualSessions == null) {
Map<String, String> sessionQuery = Map.of("section", "FOND");
Collection<Session> actualSessions = sessionMap.getCollectionObjectsByFieldValues(sessionQuery);
if (actualSessions.isEmpty()) {
log.debug("No Session with such conditions section = FOND");
return;
}
log.debug("Select {} Session by query {}", actualSessions.size(), sessionQuery);
preClearMap.preClearMap();
for (Session session : actualSessions) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("sessionId", session.getId());
Collection<PaymentInstruction> paymentInstructionBySessionId =
paymentInstructionMap.getCollectionObjectsByFieldValues(fieldValues);
log.debug("Select {} PaymentInstruction by query {}", paymentInstructionBySessionId.size(), fieldValues);
for (PaymentInstruction paymentInstruction : paymentInstructionBySessionId) {
if (isDuplicateInMap(paymentInstruction).isEmpty()) {
insertDepoPaymentInstructionRegister(paymentInstruction);
@ -89,34 +94,39 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme
private void insertDepoPaymentInstructionRegister(PaymentInstruction paymentInstruction) {
log.trace("Started generating DepoPaymentInstructionRegister entity...");
DepoPaymentInstructionRegister depoPaymentInstructionRegister = new DepoPaymentInstructionRegister();
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("depoAccountId", paymentInstruction.getCreditLeg_accountId()));
TradingClearingRegistry tradingClearingRegistry = paymentInstruction.getCreditLeg_accountId() == null ? null :
tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("depoAccountId", paymentInstruction.getCreditLeg_accountId()));
InOutDirectionDictionary inOutDirectionDictionary = InOutDirectionDictionaryMap.getFirstObjectByFieldValues(Map.of("code", paymentInstruction.getCreditLeg_direction()));
depoPaymentInstructionRegister.setCreated(Instant.now());
depoPaymentInstructionRegister.setUpdated(Instant.now());
depoPaymentInstructionRegister.setCompanyId(paymentInstruction.getSenderId());
depoPaymentInstructionRegister.setTradingClearingRegistryType(tradingClearingRegistry.getTradingClearingRegistryType());
depoPaymentInstructionRegister.setTradingClearingRegistry(tradingClearingRegistry.getCode());
if (tradingClearingRegistry == null) {
log.warn("For paymentInstruction[{}].CreditLeg_accountId={} can not find TradingClearingRegistry.",
paymentInstruction.getId(), paymentInstruction.getCreditLeg_accountId());
} else {
depoPaymentInstructionRegister.setTradingClearingRegistryType(tradingClearingRegistry.getTradingClearingRegistryType());
depoPaymentInstructionRegister.setTradingClearingRegistry(tradingClearingRegistry.getCode());
}
depoPaymentInstructionRegister.setCbCode("RNCB-BE-01");
depoPaymentInstructionRegister.setQuantity(paymentInstruction.getCreditLeg_amount());
depoPaymentInstructionRegister.setDirection(inOutDirectionDictionary.getId());
depoPaymentInstructionRegister.setSessionId(paymentInstruction.getSessionId());
depoPaymentInstructionRegister.setCreated(Instant.now());
depoPaymentInstructionRegister.setUpdated(Instant.now());
depoPaymentInstructionRegisterMap.insert(depoPaymentInstructionRegister);
log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoPaymentInstructionRegister.getId());
}
@Override
public Optional<DepoPaymentInstructionRegister> isDuplicateInMap(PaymentInstruction entity) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of(
"companyId", entity.getSenderId(),
"sessionId", entity.getSessionId()
);
Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(depoPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValues));
return Optional.empty();
// Map<String, ? extends Comparable<?>> fieldValues = Map.of(
// "companyId", entity.getSenderId(),
// "sessionId", entity.getSessionId()
// );
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(depoPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValues));
}
}

View file

@ -7,24 +7,26 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExcludeLiabilitiesRegisterNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.util.PreClearMap;
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.EnumMessage;
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
import ru.spcex.platform.utils.time.TimeUtil;
import ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collection;
@ -42,8 +44,9 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements
private final Imdg<Registry> registryMap;
private final Imdg<Session> sessionMap;
private final Imdg<ru.clearing.classes.statics.data.company.CompanySymbols> companySymbolMap;
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityMap;
private final SecuritySelector<Security> securitySelector;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<ExcludeLiabilitiesRegister> preClearMap;
@Autowired
public ExcludeLiabilitiesRegisterService(Consumer<String, Object> kafkaQueue,
@ -55,8 +58,9 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements
this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.companySymbolMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, ru.clearing.classes.statics.data.company.CompanySymbols.class);
this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForInstantField(excludeLiabilitiesRegisterMap, "created");
}
@Override
@ -75,10 +79,12 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements
log.debug("ExcludeLiabilitiesRegisterNew received");
String sqlForRegistries = getSqlForRegistries();
Collection<Registry> registries = registryMap.getCollectionObjectsBySQL(sqlForRegistries);
if (registries == null) {
if (registries.isEmpty()) {
log.debug("No registry with such conditions {}", sqlForRegistries);
return;
}
log.debug("Select {} Registry by query {}", registries.size(), sqlForRegistries);
preClearMap.preClearMap();
registries.forEach((registry -> {
if (isDuplicateInMap(registry).isEmpty()) {
insertExcludeLiabilitiesRegister(registry);
@ -93,49 +99,69 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements
ExcludeLiabilitiesRegister excludeLiabilitiesRegister = new ExcludeLiabilitiesRegister();
//hz communicating
Session sessionBySessionId = sessionMap.getSingleObjectByID(registry.getSessionId());
LocalDate validToDate = TimeUtil.toLocalDate(sessionBySessionId.getUpdated());
Map<String, ? extends Comparable<?>> innPredicates = Map.of("companySymbol", CompanySymbol.INN.getKey(),
"companyId", registry.getCompanyId());
Map<String, ? extends Comparable<?>> innPredicates = Map.of(
"companySymbol", CompanySymbol.INN.getKey(),
"companyId", registry.getCompanyId()
);
ru.clearing.classes.statics.data.company.CompanySymbols companySymbol = companySymbolMap.getFirstObjectByFieldValues(innPredicates);
MoneyMarketSecurity moneyMarketSecurity = moneyMarketSecurityMap.getFirstObjectByFieldValues(Map.of("securityId", registry.getSecurityId()));
Security security = securitySelector.selectSecurityById(registry.getSecurityId());
excludeLiabilitiesRegister.setSessionId(registry.getSessionId());
excludeLiabilitiesRegister.setValidFromDate(sessionBySessionId.getClearingDate());
LocalDate validToDate = TimeUtil.toLocalDate(sessionBySessionId.getUpdated());
excludeLiabilitiesRegister.setValidToDate(validToDate);
excludeLiabilitiesRegister.setCompanyId(registry.getCompanyId());
excludeLiabilitiesRegister.setInn(companySymbol.getCompanySymbolValue());
excludeLiabilitiesRegister.setCompanyFullName(registry.getFullName());
if (companySymbol != null) {
excludeLiabilitiesRegister.setInn(companySymbol.getCompanySymbolValue());
}
excludeLiabilitiesRegister.setRegistryCode(registry.getRegistryCode());
excludeLiabilitiesRegister.setAccount(registry.getAccount());
excludeLiabilitiesRegister.setRegistryStatus(registry.getRegistryStatus());
excludeLiabilitiesRegister.setCurrency(moneyMarketSecurity.getNominalCurrency());
if (security == null) {
log.warn("Security id={} not found for registry id={}", registry.getSecurityId(), registry.getId());
} else {
if (InstrumentType.RATE.equalsByKey(security.getInstrumentType())) {
excludeLiabilitiesRegister.setCurrency(((MoneyMarketSecurity) security).getNominalCurrency());
} else if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) {
excludeLiabilitiesRegister.setCurrency(((FixedIncomeSecurity) security).getNominalCurrency());
} else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) {
// не заполняется Currency
} else { // never
log.warn("Unexpected security[{}] type {}", security.getId(), security.getInstrumentType());
}
}
excludeLiabilitiesRegister.setSumLiabilities(registry.getBalance());
excludeLiabilitiesRegister.setSettlementDate(registry.getSettlementDate());
excludeLiabilitiesRegister.setCreated(Instant.now());
excludeLiabilitiesRegister.setUpdated(Instant.now());
excludeLiabilitiesRegister.setUpdated(excludeLiabilitiesRegister.getCreated());
excludeLiabilitiesRegisterMap.insert(excludeLiabilitiesRegister);
log.debug("inserted successfully ExcludeLiabilitiesRegister entity with id: {}", excludeLiabilitiesRegister.getId());
}
private String getSqlForRegistries() {
protected String getSqlForRegistries() {
return String.format("registryDesignation = '%s' and " +
"registryInstrumentType in ('%s','%s') and " +
"registryUnit = '%s' and " +
"registryStatus = '%s'",
"registryStatus in ('%s', '%s')",
RegistryDesignation.O.getKey(),
RegistryInstrumentType.S.getKey(),
RegistryInstrumentType.M.getKey(),
RegistryUnit.T.getKey(),
RegistryStatus.FAIL.getKey());
RegistryStatus.FAIL.getKey(),
RegistryStatus.UNCV.getKey()
);
}
@Override
public Optional<ExcludeLiabilitiesRegister> isDuplicateInMap(Registry entity) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(excludeLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues));
return Optional.empty();
// Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(excludeLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues));
}
}

View file

@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
@ -14,18 +15,19 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.register.ExecutionRegister;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionRegisterOnSaveRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.util.PreClearMap;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.Imdg;
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.validation.IValidator;
import java.text.MessageFormat;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collection;
@ -45,7 +47,9 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
private final Imdg<ExecutionFond> executionFondMap;
private final Imdg<ExecutionDeposit> executionDepositMap;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryMap;
private final Imdg<Account> accountImdg;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<ExecutionRegister> preClearMap;
@Autowired
public ExecutionRegisterService(Consumer<String, Object> kafkaQueue,
@ -58,7 +62,9 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
this.executionFondMap = imdgProvider.getImdg(Map_ExecutionFond, ExecutionFond.class);
this.executionDepositMap = imdgProvider.getImdg(Map_ExecutionDeposit, ExecutionDeposit.class);
this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.accountImdg = imdgProvider.getImdg(Map_Account, Account.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForLocalDateField(executionRegisterMap, "clearingDate");
}
@Override
@ -66,9 +72,13 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
callback(LauncherCommandRequest.class)
.setConsumer(this::executionRegisterNew)
.forDestination(createRegistry_ECNR.topic(), callbacks::put);
callback(ExecutionRegisterOnSaveRequest.class)
.setConsumer(this::executionRegisterOnSavingOfTrade)
.forDestination(Consts.REGISTRY_EXECUTION_REGISTER_ON_SAVE, callbacks::put);
// TODO возможно deprecated
// callback(ExecutionRegisterOnSaveRequest.class)
// .setConsumer(this::executionRegisterOnSavingOfTrade)
// .forDestination(Consts.REGISTRY_EXECUTION_REGISTER_ON_SAVE, callbacks::put);
init();
}
@ -77,19 +87,152 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
log.debug("ExecutionRegisterNewRequest received");
Collection<ExecutionFond> collectionFond = executionFondMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow));
Collection<ExecutionDeposit> collectionDeposit = executionDepositMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow));
log.debug("Found {} ExecutionFond and {} ExecutionDeposit on clearingDate={}",
collectionFond.size(), collectionDeposit.size(), localDateNow);
preClearMap.preClearMap();
collectionFond.forEach(x -> {
if (isDuplicateInMap(x).isEmpty()) {
insertExecutionRegister(true, x);
}
insertExecutionRegister(true, x);
});
collectionDeposit.forEach(x -> {
if (isDuplicateInMap(x).isPresent()) {
insertExecutionRegister(false, x);
}
insertExecutionRegister(false, x);
});
log.debug("successfully processed...");
}
private void insertExecutionRegister(Boolean isFond, ExecutionCommon common) {
log.trace("Started generating ExecutionRegister entity...");
LocalDate tradingDate = common.getTradingDate();
Long exchangeExecutionId = common.getExchangeExecutionId();
Instant exchangeExecutionTime = common.getExchangeExecutionTime();
Long securityId = common.getSecurityId();
LocalDate clearingDate = common.getClearingDate();
Long sellerId;
String sellerClearingCode = null;
String sellerTradingClearingRegister;
String sellerMoneyAccount = null;
String sellerDepoAccount = null;
Long buyerId;
String buyerClearingCode = null;
String buyerTradingClearingRegister;
String buyerMoneyAccount = null;
String buyerDepoAccount = null;
BigDecimal amount;
BigDecimal quantity = null;
if (isFond) {
ExecutionFond executionFond = (ExecutionFond) common;
amount = executionFond.getSettlementAmount();
quantity = executionFond.getQuantity();
} else {
ExecutionDeposit executionDeposit = (ExecutionDeposit) common;
amount = executionDeposit.getFirstLegAmount();
}
TradingClearingRegistry tkrForCounterPartyTkrId = null;
if (common.getCounterPartyTradingClearingRegistryId() != null) {
tkrForCounterPartyTkrId = tradingClearingRegistryMap.getSingleObjectByID(
common.getCounterPartyTradingClearingRegistryId()
);
}
TradingClearingRegistry tkrForTkrId = null;
if (common.getTradingClearingRegistryId() != null) {
tkrForTkrId = tradingClearingRegistryMap.getSingleObjectByID(
common.getTradingClearingRegistryId()
);
}
Account moneyAccountForCounterPartyTkrId = null;
Account depoAccountForCounterPartyTkrId = null;
if (tkrForCounterPartyTkrId != null) {
if (tkrForCounterPartyTkrId.getMoneyAccountId() != null)
moneyAccountForCounterPartyTkrId = accountImdg.getSingleObjectByID(tkrForCounterPartyTkrId.getMoneyAccountId());
if (tkrForCounterPartyTkrId.getDepoAccountId() != null)
depoAccountForCounterPartyTkrId = accountImdg.getSingleObjectByID(tkrForCounterPartyTkrId.getDepoAccountId());
}
Account moneyAccountForTkrId = null;
Account depoAccountForTkrId = null;
if (tkrForTkrId != null) {
if (tkrForTkrId.getMoneyAccountId() != null)
moneyAccountForTkrId = accountImdg.getSingleObjectByID(tkrForTkrId.getMoneyAccountId());
if (tkrForTkrId.getDepoAccountId() != null)
depoAccountForTkrId = accountImdg.getSingleObjectByID(tkrForTkrId.getDepoAccountId());
}
CompanySymbols companySymbolsForCompanyId = companySymbolsMap.getFirstObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.CLRC.getKey(),
"companyId", common.getCompanyId()
)
);
CompanySymbols companySymbolsForCounterPartyId = companySymbolsMap.getFirstObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.CLRC.getKey(),
"companyId", common.getCounterPartyId()
)
);
String sideStr = common.getSide();
MoneyFlowSide moneyFlowSide = IEnumKey.getEnumByKey(MoneyFlowSide.class, sideStr);
Side side = IEnumKey.getEnumByKey(Side.class, sideStr);
if (moneyFlowSide == MoneyFlowSide.BUY || side == Side.BUY) {
sellerId = common.getCounterPartyId();
buyerId = common.getCompanyId();
if (companySymbolsForCounterPartyId != null) sellerClearingCode = companySymbolsForCounterPartyId.getCompanySymbolValue();
sellerTradingClearingRegister = common.getCounterPartyTradingClearingRegistry();
if (moneyAccountForCounterPartyTkrId != null) sellerMoneyAccount = moneyAccountForCounterPartyTkrId.getAccount();
if (depoAccountForCounterPartyTkrId != null) sellerDepoAccount = depoAccountForCounterPartyTkrId.getAccount();
if (companySymbolsForCompanyId != null) buyerClearingCode = companySymbolsForCompanyId.getCompanySymbolValue();
buyerTradingClearingRegister = common.getPartyTradingClearingRegistry();
if (moneyAccountForTkrId != null) buyerMoneyAccount = moneyAccountForTkrId.getAccount();
if (depoAccountForTkrId != null) buyerDepoAccount = depoAccountForTkrId.getAccount();
} else {
sellerId = common.getCompanyId();
buyerId = common.getCounterPartyId();
if (companySymbolsForCompanyId != null) sellerClearingCode = companySymbolsForCompanyId.getCompanySymbolValue();
sellerTradingClearingRegister = common.getPartyTradingClearingRegistry();
if (moneyAccountForTkrId != null) sellerMoneyAccount = moneyAccountForTkrId.getAccount();
if (depoAccountForTkrId != null) sellerDepoAccount = depoAccountForTkrId.getAccount();
if (companySymbolsForCounterPartyId != null) buyerClearingCode = companySymbolsForCounterPartyId.getCompanySymbolValue();
buyerTradingClearingRegister = common.getCounterPartyTradingClearingRegistry();
if (moneyAccountForCounterPartyTkrId != null) buyerMoneyAccount = moneyAccountForCounterPartyTkrId.getAccount();
if (depoAccountForCounterPartyTkrId != null) buyerDepoAccount = depoAccountForCounterPartyTkrId.getAccount();
}
ExecutionRegister executionRegister = new ExecutionRegister();
executionRegister.setTradingDate(tradingDate);
executionRegister.setExchangeExecutionId(exchangeExecutionId);
executionRegister.setExchangeExecutionTime(exchangeExecutionTime);
executionRegister.setSecurityId(securityId);
executionRegister.setSellerId(sellerId);
executionRegister.setSellerClearingCode(sellerClearingCode);
executionRegister.setSellerTradingClearingRegister(sellerTradingClearingRegister);
executionRegister.setSellerMoneyAccount(sellerMoneyAccount);
executionRegister.setSellerDepoAccount(sellerDepoAccount);
executionRegister.setBuyerId(buyerId);
executionRegister.setBuyerClearingCode(buyerClearingCode);
executionRegister.setBuyerTradingClearingRegister(buyerTradingClearingRegister);
executionRegister.setBuyerMoneyAccount(buyerMoneyAccount);
executionRegister.setBuyerDepoAccount(buyerDepoAccount);
executionRegister.setAmount(amount);
executionRegister.setQuantity(quantity);
executionRegister.setClearingDate(clearingDate);
executionRegister.setCreated(Instant.now());
executionRegisterMap.insert(executionRegister);
log.debug("inserted successfully ExecutionRegister entity with id: {}", executionRegister.getId());
}
// TODO возможно deprecated
public void executionRegisterOnSavingOfTrade(BaseRequest<ExecutionRegisterOnSaveRequest> userRequest) {
ExecutionRegisterOnSaveRequest request = userRequest.getRequestPayload();
ExecutionCommon common = setUpExecutionCommon(request);
@ -102,6 +245,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
}
}
// TODO возможно deprecated
private void updateExecutionRegister(boolean isFond, ExecutionCommon common, ExecutionRegister registerToUpdate) {
log.trace("Started updating ExecutionRegister entity...");
registerToUpdate.setSecurityId(common.getSecurityId());
@ -113,102 +257,8 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
log.debug("Updated successfully ExecutionRegister entity with id: {}", registerToUpdate.getId());
}
private void insertExecutionRegister(Boolean isFond, ExecutionCommon common) {
log.trace("Started generating ExecutionRegister entity...");
String sellerClearingCode = null;
String sellerTradingClearingRegister = null;
String sellerMoneyAccount = null;
String sellerDepoAccount = null;
Long buyerId = common.getSide().equalsIgnoreCase(MoneyFlowSide.BUY.getKey()) ? common.getCompanyId() : common.getCounterPartyId();
Long sellerId = common.getSide().equalsIgnoreCase(MoneyFlowSide.BUY.getKey()) ? common.getCounterPartyId() : common.getCompanyId();
String buyerClearingCode = null;
String buyerTradingClearingRegister = null;
String buyerMoneyAccount = null;
String buyerDepoAccount = null;
String side = common.getSide();
Optional<CompanySymbols> companySymbolsByCLRSandCompanyId = getCompanySymbolsByCompanyIdAndCompanySymbol(CompanySymbol.CLRC.getKey(), common.getCompanyId());
Optional<TradingClearingRegistry> tradingClearingRegistryByCodeOfCompanyId = getTradingClearingRegistryByCode(common.getCompanyId().toString());
Optional<CompanySymbols> companySymbolsByCLRSandCounterPartyId = getCompanySymbolsByCompanyIdAndCompanySymbol(CompanySymbol.CLRC.getKey(), common.getCounterPartyId());
Optional<TradingClearingRegistry> tradingClearingRegistryByCodeOfCounterPartyId = getTradingClearingRegistryByCode(common.getCounterPartyId().toString());
Optional<TradingClearingRegistry> tradingClearingRegistryByCompanyIdOfCounterPartyId = getTradingClearingRegistryByCompanyId(common.getCounterPartyId());
if (side.equalsIgnoreCase(MoneyFlowSide.BUY.getKey())) {
if (companySymbolsByCLRSandCounterPartyId.isPresent()) {
sellerClearingCode = companySymbolsByCLRSandCounterPartyId.get().getCompanySymbolValue();
}
if (tradingClearingRegistryByCompanyIdOfCounterPartyId.isPresent()) {
sellerTradingClearingRegister = tradingClearingRegistryByCompanyIdOfCounterPartyId.get().getCode();
}
if (tradingClearingRegistryByCodeOfCounterPartyId.isPresent()) {
TradingClearingRegistry clearingRegistry = tradingClearingRegistryByCodeOfCounterPartyId.get();
sellerMoneyAccount = clearingRegistry.getMoneyAccountId().toString();
if (isFond) {
sellerDepoAccount = clearingRegistry.getDepoAccountId().toString();
}
}
if (companySymbolsByCLRSandCompanyId.isPresent()) {
buyerClearingCode = companySymbolsByCLRSandCompanyId.get().getCompanySymbolValue();
}
buyerTradingClearingRegister = common.getTradingClearingRegistryId().toString();
if (tradingClearingRegistryByCodeOfCompanyId.isPresent()) {
TradingClearingRegistry clearingRegistry = tradingClearingRegistryByCodeOfCompanyId.get();
buyerMoneyAccount = clearingRegistry.getMoneyAccountId().toString();
if (isFond) {
buyerDepoAccount = clearingRegistry.getDepoAccountId().toString();
}
}
} else if (side.equalsIgnoreCase(MoneyFlowSide.SELL.getKey())) {
if (companySymbolsByCLRSandCompanyId.isPresent()) {
sellerClearingCode = companySymbolsByCLRSandCompanyId.get().getCompanySymbolValue();
}
sellerTradingClearingRegister = common.getTradingClearingRegistryId().toString();
if (tradingClearingRegistryByCodeOfCompanyId.isPresent()) {
TradingClearingRegistry clearingRegistry = tradingClearingRegistryByCodeOfCompanyId.get();
sellerMoneyAccount = clearingRegistry.getMoneyAccountId().toString();
if (isFond) {
sellerDepoAccount = clearingRegistry.getDepoAccountId().toString();
}
}
if (companySymbolsByCLRSandCounterPartyId.isPresent()) {
buyerClearingCode = companySymbolsByCLRSandCounterPartyId.get().getCompanySymbolValue();
}
if (tradingClearingRegistryByCodeOfCounterPartyId.isPresent()) {
TradingClearingRegistry clearingRegistry = tradingClearingRegistryByCodeOfCounterPartyId.get();
buyerMoneyAccount = clearingRegistry.getMoneyAccountId().toString();
if (isFond) {
buyerDepoAccount = clearingRegistry.getDepoAccountId().toString();
}
}
if (tradingClearingRegistryByCompanyIdOfCounterPartyId.isPresent()) {
buyerTradingClearingRegister = tradingClearingRegistryByCompanyIdOfCounterPartyId.get().getId().toString();
}
}
ExecutionRegister executionRegister = new ExecutionRegister();
executionRegister.setTradingDate(common.getTradingDate());
executionRegister.setExchangeExecutionId(common.getExchangeExecutionId());
executionRegister.setExchangeExecutionTime(common.getExchangeExecutionTime());
executionRegister.setSecurityId(common.getSecurityId());
executionRegister.setSellerId(sellerId);
executionRegister.setSellerClearingCode(sellerClearingCode);
executionRegister.setSellerTradingClearingRegister(sellerTradingClearingRegister);
executionRegister.setSellerMoneyAccount(sellerMoneyAccount);
executionRegister.setSellerDepoAccount(sellerDepoAccount);
executionRegister.setBuyerId(buyerId);
executionRegister.setBuyerClearingCode(buyerClearingCode);
executionRegister.setBuyerTradingClearingRegister(buyerTradingClearingRegister);
executionRegister.setBuyerMoneyAccount(buyerMoneyAccount);
executionRegister.setBuyerDepoAccount(buyerDepoAccount);
if (isFond) {
executionRegister.setQuantity(common.getQuantity());
executionRegister.setAmount(((ExecutionFond) common).getSettlementAmount());
} else {
executionRegister.setAmount(((ExecutionDeposit) common).getFirstLegAmount());
}
executionRegister.setClearingDate(common.getClearingDate());
executionRegister.setCreated(Instant.now());
executionRegisterMap.insert(executionRegister);
log.debug("inserted successfully ExecutionRegister entity with id: {}", executionRegister.getId());
}
// todo возможно deprecated
private ExecutionCommon setUpExecutionCommon(ExecutionRegisterOnSaveRequest request) {
ExecutionFond fond = null;
ExecutionDeposit deposit = null;
@ -257,40 +307,18 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
return common;
}
private Optional<CompanySymbols> getCompanySymbolsByCompanyIdAndCompanySymbol(String companySymbol, Long companyId) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("companySymbol", companySymbol, "companyId", companyId);
CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues(fieldValues);
return Optional.ofNullable(companySymbols);
}
private Optional<CompanySymbols> getCompanySymbolsByCompanyId(Long companyId) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", companyId);
CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues(fieldValues);
return Optional.ofNullable(companySymbols);
}
private Optional<TradingClearingRegistry> getTradingClearingRegistryByCompanyId(Long companyId) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", companyId);
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(fieldValues);
return Optional.ofNullable(tradingClearingRegistry);
}
private Optional<TradingClearingRegistry> getTradingClearingRegistryByCode(String code) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("code", code);
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(fieldValues);
return Optional.ofNullable(tradingClearingRegistry);
}
@Deprecated
@Override
public Optional<ExecutionRegister> isDuplicateInMap(ExecutionCommon entity) {
Map<String, ? extends Comparable<?>> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(),
"tradingDate", LocalDate.now()); //clarify timezone
Optional<EnumMessage> message = fieldValuesValidator.apply(map).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(executionRegisterMap.getSingleObjectByFieldValues(map));
return Optional.empty();
// Map<String, ? extends Comparable<?>> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(),
// "tradingDate", LocalDate.now()); //clarify timezone
// Optional<EnumMessage> message = fieldValuesValidator.apply(map).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(executionRegisterMap.getSingleObjectByFieldValues(map));
}
}

View file

@ -8,27 +8,28 @@ import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.register.LiabilitiesRegister;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.LiabilitiesRegisterNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.clearing.registry.util.PreClearMap;
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.EnumMessage;
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
import ru.spcex.platform.utils.time.TimeUtil;
import ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
@ -44,8 +45,9 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial
private final Imdg<Registry> registryMap;
private final Imdg<Session> sessionMap;
private final Imdg<CompanySymbols> companySymbolsMap;
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityMap;
private final SecuritySelector<Security> securitySelector;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<LiabilitiesRegister> preClearMap;
@Autowired
public LiabilitiesRegisterService(Consumer<String, Object> kafkaQueue,
@ -57,8 +59,9 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial
this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForInstantField(liabilitiesRegisterMap, "created");
}
@Override
@ -77,7 +80,8 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial
log.debug("LiabilitiesRegisterNewRequest received from {}", Consts.REGISTRY_LIABILITIES_REGISTER_NEW);
String sqlConditionForRegistry = getSqlForRegistries();
Collection<Registry> registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry);
//checking for duplicates
log.debug("Found {} Registry by query {}", registries.size(), sqlConditionForRegistry);
preClearMap.preClearMap();
registries.forEach((registry -> {
if (isDuplicateInMap(registry).isEmpty()) {
insertLiabilitiesRegister(registry);
@ -90,25 +94,13 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial
private void insertLiabilitiesRegister(Registry registry) {
log.trace("Started generating LiabilitiesRegister entity...");
LiabilitiesRegister liabilitiesRegister = new LiabilitiesRegister();
Session session = sessionMap.getFirstObjectByFieldValues(
Map.of(
"id",
registry.getCompanyId()
)
);
Session session = sessionMap.getSingleObjectByID(registry.getSessionId());
CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues(
Map.of("companyId",
registry.getCompanyId(),
"companySymbol",
"INN"
)
);
MoneyMarketSecurity moneyMarketSecurity = moneyMarketSecurityMap.getFirstObjectByFieldValues(
Map.of(
"securityId",
registry.getSecurityId()
Map.of("companyId", registry.getCompanyId(),
"companySymbol", CompanySymbol.INN.getKey()
)
);
Security security = securitySelector.selectSecurityById(registry.getSecurityId());
if (session == null) {
log.warn("Session is empty!");
} else {
@ -116,29 +108,41 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial
liabilitiesRegister.setValidToDate(TimeUtil.toLocalDate(session.getUpdated()));
}
if (companySymbols == null) {
log.warn("CompanySymbols is empty!");
log.warn("CompanySymbols not found, for companyId={}", registry.getCompanyId());
} else {
liabilitiesRegister.setInn(companySymbols.getCompanySymbolValue());
}
if (moneyMarketSecurity == null) {
log.warn("MoneyMarketSecurity is empty!");
if (security == null) {
log.warn("Security id={} not found for registry id={}", registry.getSecurityId(), registry.getId());
} else {
liabilitiesRegister.setCurrency(moneyMarketSecurity.getNominalCurrency());
if (InstrumentType.RATE.equalsByKey(security.getInstrumentType())) {
liabilitiesRegister.setCurrency(((MoneyMarketSecurity) security).getNominalCurrency());
} else if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) {
liabilitiesRegister.setCurrency(((FixedIncomeSecurity) security).getNominalCurrency());
} else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) {
// не заполняется Currency
} else { // never
log.warn("Unexpected security[{}] type {}", security.getId(), security.getInstrumentType());
}
}
liabilitiesRegister.setSessionId(registry.getSessionId());
liabilitiesRegister.setValidFromDate(session.getClearingDate());
LocalDate validToDate = TimeUtil.toLocalDate(session.getUpdated());
liabilitiesRegister.setValidToDate(validToDate);
liabilitiesRegister.setCompanyId(registry.getCompanyId());
liabilitiesRegister.setCompanyFullName(registry.getFullName());
liabilitiesRegister.setRegistryCode(registry.getRegistryCode());
liabilitiesRegister.setAccount(registry.getAccount());
liabilitiesRegister.setRegistryStatus(registry.getRegistryStatus());
liabilitiesRegister.setSumLiabilities(registry.getBalance());
liabilitiesRegister.setSettlementDate(registry.getSettlementDate());
liabilitiesRegister.setCreated(Instant.now());
liabilitiesRegister.setUpdated(Instant.now());
liabilitiesRegister.setUpdated(liabilitiesRegister.getCreated());
liabilitiesRegisterMap.insert(liabilitiesRegister);
log.debug("inserted successfully LiabilitiesRegister entity with id: {}", liabilitiesRegister.getId());
}
private String getSqlForRegistries() {
protected String getSqlForRegistries() {
return String.format("registryDesignation = '%s' and " +
"registryInstrumentType in ('%s','%s') and " +
"registryUnit = '%s'",
@ -150,12 +154,13 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial
@Override
public Optional<LiabilitiesRegister> isDuplicateInMap(Registry entity) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(liabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues));
return Optional.empty();
// Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(liabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues));
}
}

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.registry.service;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.MutableTriple;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
@ -16,21 +19,22 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.util.PreClearMap;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.RegistryTradingParams;
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 ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static ru.spcex.platform.enumeration.Task.createRegistry_GBRR;
@ -44,6 +48,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia
private final Imdg<Company> companyMap;
private final Imdg<Account> accountMap;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<MoneyBalanceRegister> preClearMap;
@Autowired
public MoneyBalanceRegisterService(Consumer<String, Object> kafkaQueue,
@ -57,6 +62,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia
this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForInstantField(moneyBalanceRegisterMap, "created");
}
@Override
@ -67,46 +73,76 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia
init();
}
protected List<List<Registry>> groupingRegistry(Collection<Registry> registries) {
Map<MutablePair<Long, Long>, List<Registry>> regGroups = registries.stream().collect(Collectors.groupingBy(
(Registry reg) -> new MutablePair(reg.getCompanyId(), reg.getAccountId())
));
List<List<Registry>> result = new ArrayList<>(regGroups.values());
if (result.size() > 3) {
log.warn("Found too many ({}) registries in group: {}", result.size(), result);
}
return result;
// return regGroups.values().stream().map((List<Registry> regLst) -> {
// for (Registry r : regLst)
// if (RegistryUnit.T.equalsByKey(r.getRegistryUnit())) {
// return r;// приоритетно нужен AM_T
// }
// return regLst.iterator().next();
// }).collect(Collectors.toList());
}
public void moneyBalanceRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic());
if (userRequest.getRequestPayload().getCompanyId() == null) {
log.warn("LauncherCommandRequest.id={} without companyId", userRequest.getId());
return;
}
ImdgPredicate sqlConditionForRegistry = getSqlForRegistries(userRequest.getRequestPayload().getCompanyId());
Collection<Registry> registries = registryMap.getCollectionObjectsByPredicate(sqlConditionForRegistry);
if (registries == null) {
if (registries.isEmpty()) {
log.debug("No registry with such conditions {}", sqlConditionForRegistry);
return;
}
registries.forEach((registry -> {
if (isDuplicateInMap(registry).isEmpty()) {
insertMoneyBalanceRegister(registry);
}
log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry);
List<List<Registry>> registerGroups = groupingRegistry(registries);
preClearMap.preClearMap();
registerGroups.forEach((registryItems -> {
// if (isDuplicateInMap(registry).isEmpty()) {
insertMoneyBalanceRegister(registryItems);
// }
}
));
log.debug("successfully processed");
}
private void insertMoneyBalanceRegister(Registry registry) {
private void insertMoneyBalanceRegister(List<Registry> registryGroup) {
log.trace("Started generating MoneyBalanceRegister entity...");
MoneyBalanceRegister moneyBalanceRegister = new MoneyBalanceRegister();
Registry registryForRemainderSum = registryMap.getFirstObjectByPredicate(getSqlForRemainderSum(registry.getCompanyId(), registry.getAccount()));
Registry registryForBlockedSum = registryMap.getFirstObjectByPredicate(getSqlForBlockedSum(registry.getCompanyId(), registry.getAccount()));
Registry registryForUnblockedSum = registryMap.getFirstObjectByPredicate(getSqlForUnblockedSum(registry.getCompanyId(), registry.getAccount()));
Registry registryForRemainderSum = registryGroup.stream()
.filter(r -> RegistryUnit.T.equalsByKey(r.getRegistryUnit()))
.findAny().orElse(null);
Registry registryForBlockedSum = registryGroup.stream()
.filter(r -> RegistryUnit.B.equalsByKey(r.getRegistryUnit()))
.findAny().orElse(null);
Registry registryForUnblockedSum = registryGroup.stream()
.filter(r -> RegistryUnit.F.equalsByKey(r.getRegistryUnit()))
.findAny().orElse(null);
Registry registry = registryForRemainderSum;
if (registry == null)
registry = registryGroup.iterator().next();
log.trace("Group of {} registries: T={}; B={}; F={}", registryGroup.size(), registryForRemainderSum, registryForBlockedSum, registryForUnblockedSum);
// Registry registryForRemainderSum = registryMap.getFirstObjectByPredicate(getSqlForRemainderSum(registry.getCompanyId(), registry.getAccount()));
// Registry registryForBlockedSum = registryMap.getFirstObjectByPredicate(getSqlForBlockedSum(registry.getCompanyId(), registry.getAccount()));
// Registry registryForUnblockedSum = registryMap.getFirstObjectByPredicate(getSqlForUnblockedSum(registry.getCompanyId(), registry.getAccount()));
Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 2L));
CompanySymbols companySymbol = companySymbolsMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId()));
CompanySymbols companySymbol = companySymbolsMap.getFirstObjectByFieldValues(Map.of("companySymbol", CompanySymbol.INN.getKey(), "companyId", registry.getCompanyId()));
String setHouseName = company != null ? company.getShortName() : null;
String inn = companySymbol != null ? companySymbol.getCompanySymbolValue() : null;
String accountType = registry.getAccountType();
String account = null;
String infoAccount = null;
if ("CLRN".equalsIgnoreCase(accountType)) {
Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", "INFO"));
Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", AccountType.Info.getKey()));
account = registry.getAccount();
infoAccount = accountValue != null ? accountValue.getAccount() : null;
} else if ("INFO".equalsIgnoreCase(accountType)) {
Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", "CLRN"));
Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", AccountType.Clrn.getKey()));
account = accountValue != null ? accountValue.getAccount() : null;
infoAccount = registry.getAccount();
}
@ -121,22 +157,27 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia
moneyBalanceRegister.setSessionId(registry.getSessionId());
moneyBalanceRegister.setCompanyId(registry.getCompanyId());
moneyBalanceRegister.setCreated(Instant.now());
moneyBalanceRegister.setUpdated(Instant.now());
moneyBalanceRegister.setUpdated(moneyBalanceRegister.getCreated());
moneyBalanceRegisterMap.insert(moneyBalanceRegister);
log.debug("inserted successfully MoneyBalanceRegister entity with id: {}", moneyBalanceRegister.getId());
}
private ImdgPredicate getSqlForRegistries(Long companyId) {
protected ImdgPredicate getSqlForRegistries(Long companyId) {
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
ImdgPredicate prdct = pb.and(
pb.equals("companyId", companyId),
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build())
);
ImdgPredicate prdct;
if (companyId == null) {
prdct = pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build());
} else {
prdct = pb.and(
pb.equals("companyId", companyId),
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build())
);
}
log.trace("sql predicate for registries {}", prdct);
return prdct;
}
private ImdgPredicate getSqlForRemainderSum(Long companyId, String account) {
protected ImdgPredicate getSqlForRemainderSum(Long companyId, String account) {
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
ImdgPredicate prdct = pb.and(
pb.equals("companyId", companyId),
@ -147,7 +188,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia
return prdct;
}
private ImdgPredicate getSqlForBlockedSum(Long companyId, String account) {
protected ImdgPredicate getSqlForBlockedSum(Long companyId, String account) {
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
ImdgPredicate prdct = pb.and(
pb.equals("companyId", companyId),
@ -158,7 +199,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia
return prdct;
}
private ImdgPredicate getSqlForUnblockedSum(Long companyId, String account) {
protected ImdgPredicate getSqlForUnblockedSum(Long companyId, String account) {
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
ImdgPredicate prdct = pb.and(
pb.equals("companyId", companyId),
@ -171,17 +212,15 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia
@Override
public Optional<MoneyBalanceRegister> isDuplicateInMap(Registry entity) {
Map<String, ? extends Comparable<?>> fieldValues = Map.of(
"companyId",
entity.getCompanyId(),
"sessionId",
entity.getSessionId()
);
Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(moneyBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues));
return Optional.empty();
// Map<String, Long> fieldValues = new HashMap<>();
// fieldValues.put("companyId", entity.getCompanyId());
// fieldValues.put("sessionId", entity.getSessionId());
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(moneyBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues));
}
}

View file

@ -14,12 +14,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.util.PreClearMap;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
@ -36,6 +35,7 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem
private final Imdg<PaymentInstruction> paymentInstructionMap;
private final Imdg<Session> sessionMap;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<MoneyPaymentInstructionRegister> preClearMap;
@Autowired
public MoneyPaymentInstructionRegisterService(Consumer<String, Object> kafkaQueue,
@ -47,6 +47,7 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem
this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForLocalDateField(moneyPaymentInstructionRegisterMap, "clearingDate");
}
@Override
@ -61,10 +62,13 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem
log.debug("LauncherCommandRequest received from {}", TOPIC_NAME);
Map<String, ? extends Comparable<?>> fieldValuesSectionMkr = Map.of("section", "MKR");
Collection<Session> actualSessions = sessionMap.getCollectionObjectsByFieldValues(fieldValuesSectionMkr);
log.debug("Selected {} Session by query {}", actualSessions.size(), fieldValuesSectionMkr);
preClearMap.preClearMap();
actualSessions.forEach(session -> {
Map<String, ? extends Comparable<?>> fieldValuesSessionId = Map.of("sessionId", session.getId());
Collection<PaymentInstruction> paymentInstructionBySessionId =
paymentInstructionMap.getCollectionObjectsByFieldValues(fieldValuesSessionId);
log.debug("Selected {} PaymentInstruction by query {}", paymentInstructionBySessionId.size(), fieldValuesSessionId);
for (PaymentInstruction paymentInstruction : paymentInstructionBySessionId) {
if (isDuplicateInMap(paymentInstruction).isEmpty()) {
insertMoneyPaymentInstructionRegister(paymentInstruction);
@ -81,23 +85,26 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem
moneyPaymentInstructionRegister.setCreditLegAmount(paymentInstruction.getCreditLeg_amount());
moneyPaymentInstructionRegister.setCreditLegCurrencyCode(paymentInstruction.getCreditLeg_currencyCode());
moneyPaymentInstructionRegister.setDebitLegAccount(paymentInstruction.getDebitLeg_account());
moneyPaymentInstructionRegister.setSender(paymentInstruction.getSenderId().toString());
moneyPaymentInstructionRegister.setAddressee(paymentInstruction.getAddresseeId().toString());
if (paymentInstruction.getSenderId()!=null)
moneyPaymentInstructionRegister.setSender(paymentInstruction.getSenderId().toString());
if (paymentInstruction.getAddresseeId()!=null)
moneyPaymentInstructionRegister.setAddressee(paymentInstruction.getAddresseeId().toString());
moneyPaymentInstructionRegister.setClearingDate(paymentInstruction.getClearingDate());
moneyPaymentInstructionRegister.setCreated(Instant.now());
moneyPaymentInstructionRegister.setUpdated(Instant.now());
moneyPaymentInstructionRegister.setUpdated(moneyPaymentInstructionRegister.getCreated());
moneyPaymentInstructionRegisterMap.insert(moneyPaymentInstructionRegister);
log.debug("inserted successfully PaymentInstruction entity with id: {}", paymentInstruction.getId());
}
@Override
public Optional<MoneyPaymentInstructionRegister> isDuplicateInMap(PaymentInstruction entity) {
Map<String, ? extends Comparable<?>> fieldValuesCompanyIdSessionId = Map.of("senderId", entity.getSenderId(), "date", entity.getClearingDate());
Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValuesCompanyIdSessionId).tillFirstError();
if (message.isPresent()) {
log.warn("Illegal value in map for request to imdg: {}", message.get());
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
}
return Optional.ofNullable(moneyPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValuesCompanyIdSessionId));
return Optional.empty();
// Map<String, ? extends Comparable<?>> fieldValuesCompanyIdSessionId = Map.of("senderId", entity.getSenderId(), "date", entity.getClearingDate());
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValuesCompanyIdSessionId).tillFirstError();
// if (message.isPresent()) {
// log.warn("Illegal value in map for request to imdg: {}", message.get());
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
// }
// return Optional.ofNullable(moneyPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValuesCompanyIdSessionId));
}
}

View file

@ -5,6 +5,7 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
@Deprecated
public class FieldValuesValidator {
public static List<String> delete2(Map<String, ?> map) {
List<String> errors = new ArrayList<>();

View file

@ -0,0 +1,79 @@
package ru.spcex.clearing.registry.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.clearing.classes.objects.BusinessObject;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.time.TimeUtil;
import java.time.Instant;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Collection;
import java.util.Objects;
public class PreClearMap<T extends BusinessObject> {
protected final Logger log = LoggerFactory.getLogger(getClass());
protected final Imdg<T> map;
protected final PredicateBuilder predicateBuilder;
public PreClearMap(Imdg<T> map, PredicateBuilder predicateBuilder) {
this.map = map;
this.predicateBuilder = predicateBuilder;
}
public void preClearMap() {
ImdgPredicate query = predicateBuilder.query(map.predicateBuilder(), LocalDate.now());
Collection<T> toDelete = map.getCollectionObjectsByPredicate(query);
log.debug("Prepare {} to delete by query \"{}\" from map {}", toDelete.size(), query, map.getMapName());
for (T item : toDelete)
map.delete(item);
}
public static <T extends BusinessObject> PreClearMap<T> instanceForLocalDateField(Imdg<T> map, String fieldName) {
Objects.requireNonNull(map);
Objects.requireNonNull(fieldName);
return new PreClearMap<>(map, new PredicateBuilder() {
@Override
public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) {
return pb.equals(fieldName, date);
}
@Override
public String toString() {
return "LocalDate predicate on " + fieldName;
}
});
}
public static <T extends BusinessObject> PreClearMap<T> instanceForInstantField(Imdg<T> map, String fieldName) {
Objects.requireNonNull(map);
Objects.requireNonNull(fieldName);
return new PreClearMap<>(map, new PredicateBuilder() {
@Override
public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) {
// Instant atFrom = TimeUtil.localDateToInstant(date);
// Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1));
Instant atFrom = TimeUtil.localDateToInstant(date).truncatedTo(ChronoUnit.DAYS);
Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)).plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS);
return pb.and(pb.greatEqual(fieldName, atFrom), pb.less(fieldName, atTill));
}
@Override
public String toString() {
return "Instant predicate on " + fieldName;
}
});
}
public interface PredicateBuilder {
ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate onDate);
}
@Override
public String toString() {
return "PreClearMap{map=" + map.getMapName() + ", predicateBuilder=" + predicateBuilder + "}";
}
}

View file

@ -3,10 +3,14 @@ package ru.spcex.clearing.registry.config;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.consumer.OffsetResetStrategy;
import org.apache.kafka.clients.producer.MockProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.boot.test.mock.mockito.MockReset;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@ -17,6 +21,10 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import static org.mockito.Mockito.mock;
import static ru.spcex.clearing.registry.utils.TestUtils.setFuture;
import static ru.spcex.clearing.test.config.KafkaTestConfig.producerCaptors;
@Configuration
public class KafkaConfigTest {
@ -41,4 +49,13 @@ public class KafkaConfigTest {
return new MockConsumer<>(OffsetResetStrategy.EARLIEST);
}
@Bean("mockProducer")
public Producer<String, Object> kafkaProducer() {
Producer<String, Object> mockProducer = mock(MockProducer.class, MockReset.withSettings(MockReset.AFTER));
ArgumentCaptor<ProducerRecord> recordArgumentCaptor = ArgumentCaptor.forClass(ProducerRecord.class);
setFuture(recordArgumentCaptor, mockProducer);
producerCaptors.put(mockProducer, recordArgumentCaptor);
return mockProducer;
}
}

View file

@ -0,0 +1,34 @@
package ru.spcex.clearing.registry.service;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister;
import ru.clearing.classes.statics.data.register.MoneyBalanceRegister;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast;
import static org.junit.jupiter.api.Assertions.*;
class ExcludeLiabilitiesRegisterServiceTest {
@Test
void getSqlForRegistries() {
ExcludeLiabilitiesRegisterService svc = instance();
assertEquals("registryDesignation = 'O' and registryInstrumentType in ('S','M') and registryUnit = 'T' and registryStatus in ('FAIL', 'UNCV')",
svc.getSqlForRegistries());
}
ExcludeLiabilitiesRegisterService instance() {
ImdgProvider imdg = Mockito.mock(ImdgProvider.class);
Imdg<ExcludeLiabilitiesRegister> map1 = Mockito.mock(Imdg.class);
Mockito.when(map1.predicateBuilder()).thenReturn(new ImdgPredicateBuilderHazelcast());
Mockito.when(imdg.getImdg(IMDGDistributedNames.Map_ExcludeLiabilitiesRegister, ExcludeLiabilitiesRegister.class)).thenReturn(map1);
return new ExcludeLiabilitiesRegisterService(null, null, imdg, null);
}
}

View file

@ -0,0 +1,259 @@
package ru.spcex.clearing.registry.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.register.ExecutionRegister;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.registry.config.ValidationConfig;
import ru.spcex.clearing.test.TestUtils;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.enumeration.Task;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.Collection;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
ValidationConfig.class,
ExecutionRegisterService.class,
ImdgTestConfig.class,
KafkaTestConfig.class,
})
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class ExecutionRegisterServiceTest {
LocalDate TRADING_DATE = LocalDate.of(2020, 1, 1);
Instant EXCHANGE_EXECUTION_TIME = LocalDate.of(2020, 1, 1).atStartOfDay().toInstant(ZoneOffset.UTC);
Long COUNTER_PARTY_ID = 888L;
Long COMPANY_ID = 777L;
Long EXCHANGE_EXECUTION_ID = 777L;
Long SECURITY_ID = 888L;
BigDecimal SETTLEMENT_AMOUNT = BigDecimal.valueOf(777L);
BigDecimal QUANTITY = BigDecimal.valueOf(888L);
String COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID = "COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID";
String COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID = "COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID";
Long MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID;
Long MONEY_ACCOUNT_FOR_TKR_ID;
Long DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID;
Long DEPO_ACCOUNT_FOR_TKR_ID;
Long TKR_FOR_COUNTER_PARTY_TKR_ID;
Long TKR_FOR_TKR_ID;
String MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR = "MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR";
String MONEY_ACCOUNT_FOR_TKR = "MONEY_ACCOUNT_FOR_TKR";
String DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR = "DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR";
String DEPO_ACCOUNT_FOR_TKR = "DEPO_ACCOUNT_FOR_TKR";
String COUNTER_PARTY_TKR = "COUNTER_PARTY_TKR";
String PARTY_TKR = "PARTY_TKR";
private static int requestCount = 0;
private Imdg<Account> accountImdg;
private Imdg<ExecutionDeposit> executionDepositImdg;
private Imdg<ExecutionFond> executionFondImdg;
private Imdg<CompanySymbols> companySymbolsImdg;
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private Imdg<ExecutionRegister> executionRegisterImdg;
@Autowired
private ExecutionRegisterService executionRegisterService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider imdgProvider;
@Autowired
@Qualifier("mockProducer")
private Producer<String, Object> producer;
@PostConstruct
private void init() {
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
executionRegisterImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionRegister, ExecutionRegister.class);
Account moneyAccountForCounterPartyTkr = new Account();
moneyAccountForCounterPartyTkr.setAccount(MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR);
MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID = accountImdg.insert(moneyAccountForCounterPartyTkr);
Account moneyAccountForTkr = new Account();
moneyAccountForTkr.setAccount(MONEY_ACCOUNT_FOR_TKR);
MONEY_ACCOUNT_FOR_TKR_ID = accountImdg.insert(moneyAccountForTkr);
Account depoAccountForCounterPartyTkr = new Account();
depoAccountForCounterPartyTkr.setAccount(DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR);
DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID = accountImdg.insert(depoAccountForCounterPartyTkr);
Account depoAccountForTkr = new Account();
depoAccountForTkr.setAccount(DEPO_ACCOUNT_FOR_TKR);
DEPO_ACCOUNT_FOR_TKR_ID = accountImdg.insert(depoAccountForTkr);
TradingClearingRegistry tkrForCounterPartyTkrId = new TradingClearingRegistry();
tkrForCounterPartyTkrId.setMoneyAccountId(MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID);
tkrForCounterPartyTkrId.setDepoAccountId(DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID);
TKR_FOR_COUNTER_PARTY_TKR_ID = tradingClearingRegistryImdg.insert(tkrForCounterPartyTkrId);
TradingClearingRegistry tkrForTkrId = new TradingClearingRegistry();
tkrForTkrId.setMoneyAccountId(MONEY_ACCOUNT_FOR_TKR_ID);
tkrForTkrId.setDepoAccountId(DEPO_ACCOUNT_FOR_TKR_ID);
TKR_FOR_TKR_ID = tradingClearingRegistryImdg.insert(tkrForTkrId);
CompanySymbols companySymbolsForCompanyId = new CompanySymbols();
companySymbolsForCompanyId.setCompanyId(COMPANY_ID);
companySymbolsForCompanyId.setCompanySymbol(CompanySymbol.CLRC.getKey());
companySymbolsForCompanyId.setCompanySymbolValue(COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID);
companySymbolsImdg.insert(companySymbolsForCompanyId);
CompanySymbols companySymbolsForCounterPartyId = new CompanySymbols();
companySymbolsForCounterPartyId.setCompanyId(COUNTER_PARTY_ID);
companySymbolsForCounterPartyId.setCompanySymbol(CompanySymbol.CLRC.getKey());
companySymbolsForCounterPartyId.setCompanySymbolValue(COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID);
companySymbolsImdg.insert(companySymbolsForCounterPartyId);
}
@Test
@Order(1)
void executionRegisterNewForClearingDate() {
ExecutionFond executionFond = new ExecutionFond();
executionFond.setClearingDate(LocalDate.now());
executionFond.setTradingDate(TRADING_DATE);
executionFond.setExchangeExecutionId(EXCHANGE_EXECUTION_ID);
executionFond.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME);
executionFond.setSecurityId(SECURITY_ID);
executionFond.setSettlementAmount(SETTLEMENT_AMOUNT);
executionFond.setQuantity(QUANTITY);
executionFond.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID);
executionFond.setTradingClearingRegistryId(TKR_FOR_TKR_ID);
executionFond.setCompanyId(COMPANY_ID);
executionFond.setCounterPartyId(COUNTER_PARTY_ID);
executionFond.setSide(Side.BUY.getKey());
executionFond.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR);
executionFond.setPartyTradingClearingRegistry(PARTY_TKR);
executionFondImdg.insert(executionFond);
LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest();
String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(),
Task.createRegistry_ECNR.topic(),
requestCount++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
Collection<ExecutionRegister> allValues = executionRegisterImdg.getAllValues();
ExecutionRegister executionRegister = allValues.iterator().next();
assertEquals(executionRegister.getTradingDate(), TRADING_DATE);
assertEquals(executionRegister.getExchangeExecutionId(), EXCHANGE_EXECUTION_ID);
assertEquals(executionRegister.getExchangeExecutionTime(), EXCHANGE_EXECUTION_TIME);
assertEquals(executionRegister.getSecurityId(), SECURITY_ID);
assertEquals(executionRegister.getSellerId(), COUNTER_PARTY_ID);
assertEquals(executionRegister.getSellerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID);
assertEquals(executionRegister.getSellerTradingClearingRegister(), COUNTER_PARTY_TKR);
assertEquals(executionRegister.getSellerMoneyAccount(), MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR);
assertEquals(executionRegister.getSellerDepoAccount(), DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR);
assertEquals(executionRegister.getBuyerId(), COMPANY_ID);
assertEquals(executionRegister.getBuyerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID);
assertEquals(executionRegister.getBuyerTradingClearingRegister(), PARTY_TKR);
assertEquals(executionRegister.getBuyerMoneyAccount(), MONEY_ACCOUNT_FOR_TKR);
assertEquals(executionRegister.getBuyerDepoAccount(), DEPO_ACCOUNT_FOR_TKR);
assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT);
assertEquals(executionRegister.getQuantity(), QUANTITY);
assertEquals(executionRegister.getClearingDate(), LocalDate.now());
executionFondImdg.delete(executionFond);
}
@Test
@Order(2)
void executionRegisterNewFromRequest() {
ExecutionDeposit executionDeposit = new ExecutionDeposit();
executionDeposit.setClearingDate(LocalDate.now());
executionDeposit.setTradingDate(TRADING_DATE);
executionDeposit.setExchangeExecutionId(EXCHANGE_EXECUTION_ID);
executionDeposit.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME);
executionDeposit.setSecurityId(SECURITY_ID);
executionDeposit.setFirstLegAmount(SETTLEMENT_AMOUNT);
executionDeposit.setQuantity(QUANTITY);
executionDeposit.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID);
executionDeposit.setTradingClearingRegistryId(TKR_FOR_TKR_ID);
executionDeposit.setCompanyId(COMPANY_ID);
executionDeposit.setCounterPartyId(COUNTER_PARTY_ID);
executionDeposit.setSide(Side.SELL.getKey());
executionDeposit.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR);
executionDeposit.setPartyTradingClearingRegistry(PARTY_TKR);
executionDepositImdg.insert(executionDeposit);
LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest();
String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(),
Task.createRegistry_ECNR.topic(),
requestCount++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
Collection<ExecutionRegister> allValues = executionRegisterImdg.getAllValues();
ExecutionRegister executionRegister = allValues.iterator().next();
assertEquals(executionRegister.getTradingDate(), TRADING_DATE);
assertEquals(executionRegister.getExchangeExecutionId(), EXCHANGE_EXECUTION_ID);
assertEquals(executionRegister.getExchangeExecutionTime(), EXCHANGE_EXECUTION_TIME);
assertEquals(executionRegister.getSecurityId(), SECURITY_ID);
assertEquals(executionRegister.getSellerId(), COMPANY_ID);
assertEquals(executionRegister.getSellerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID);
assertEquals(executionRegister.getSellerTradingClearingRegister(), PARTY_TKR);
assertEquals(executionRegister.getSellerMoneyAccount(), MONEY_ACCOUNT_FOR_TKR);
assertEquals(executionRegister.getSellerDepoAccount(), DEPO_ACCOUNT_FOR_TKR);
assertEquals(executionRegister.getBuyerId(), COUNTER_PARTY_ID);
assertEquals(executionRegister.getBuyerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID);
assertEquals(executionRegister.getBuyerTradingClearingRegister(), COUNTER_PARTY_TKR);
assertEquals(executionRegister.getBuyerMoneyAccount(), MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR);
assertEquals(executionRegister.getBuyerDepoAccount(), DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR);
assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT);
assertNull(executionRegister.getQuantity());
assertEquals(executionRegister.getClearingDate(), LocalDate.now());
executionDepositImdg.delete(executionDeposit);
}
}

View file

@ -0,0 +1,31 @@
package ru.spcex.clearing.registry.service;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import ru.clearing.classes.statics.data.register.LiabilitiesRegister;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast;
import static org.junit.jupiter.api.Assertions.*;
class LiabilitiesRegisterServiceTest {
@Test
void getSqlForRegistries() {
LiabilitiesRegisterService svc = instance();
assertEquals("registryDesignation = 'L' and registryInstrumentType in ('S','M') and registryUnit = 'T'",
svc.getSqlForRegistries());
}
LiabilitiesRegisterService instance() {
ImdgProvider imdg = Mockito.mock(ImdgProvider.class);
Imdg<LiabilitiesRegister> map1 = Mockito.mock(Imdg.class);
Mockito.when(map1.predicateBuilder()).thenReturn(new ImdgPredicateBuilderHazelcast());
Mockito.when(imdg.getImdg(IMDGDistributedNames.Map_LiabilitiesRegister, LiabilitiesRegister.class)).thenReturn(map1);
return new LiabilitiesRegisterService(null, null, imdg, null);
}
}

View file

@ -0,0 +1,123 @@
package ru.spcex.clearing.registry.service;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import ru.clearing.classes.statics.data.register.MoneyBalanceRegister;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.classes.base.SpcexObjectBase;
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.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.*;
class MoneyBalanceRegisterServiceTest {
@Test
void groupingRegistry() {
MoneyBalanceRegisterService svc = testInstance();
ArrayList<Registry> regs1 = new ArrayList<>();
assertEquals(0, svc.groupingRegistry(regs1).size());
{
Registry r = new Registry();
r.setId(1001L);
r.setCompanyId(10L);
r.setAccount("A100");
r.setAccountId(100L);
r.setRegistryUnit(RegistryUnit.T.getKey());
regs1.add(r);
}
{
Registry r = new Registry();
r.setId(1002L);
r.setCompanyId(10L);
r.setAccount("A100");
r.setAccountId(100L);
r.setRegistryUnit(RegistryUnit.B.getKey());
regs1.add(r);
}
{
Registry r = new Registry();
r.setId(1003L);
r.setCompanyId(10L);
r.setAccount("A100");
r.setAccountId(100L);
r.setRegistryUnit(RegistryUnit.F.getKey());
regs1.add(r);
}
{
Registry r = new Registry();
r.setId(1004L);
r.setCompanyId(110L);
r.setAccount("A103");
r.setAccountId(103L);
r.setRegistryUnit(RegistryUnit.F.getKey());
regs1.add(r);
}
{
Registry r = new Registry();
r.setId(1005L);
r.setCompanyId(10L);
r.setAccount("A101");
r.setAccountId(101L);
r.setRegistryUnit(RegistryUnit.F.getKey());
regs1.add(r);
}
List<List<Registry>> out = svc.groupingRegistry(regs1);
assertEquals("[[Registry{id=1004}], [Registry{id=1001}, Registry{id=1002}, Registry{id=1003}], [Registry{id=1005}]]",
"[" + out.stream().map(lst -> "[" + lst.stream().map(v -> v.toString()).collect(Collectors.joining(", ")) + "]")
.collect(Collectors.joining(", ")) + "]");
}
@Test
void getSqlForRegistries() {
MoneyBalanceRegisterService svc = testInstance();
assertEquals("(companyId=1000 AND (registryDesignation=A AND registryInstrumentType=M))",
svc.getSqlForRegistries(1000L).toString());
}
@Test
void getSqlForRemainderSum() {
MoneyBalanceRegisterService svc = testInstance();
assertEquals("(companyId=1000 AND account=ACC-2 AND (registryDesignation=A AND registryInstrumentType=M AND registryUnit=T))",
svc.getSqlForRemainderSum(1000L, "ACC-2").toString());
}
@Test
void getSqlForBlockedSum() {
MoneyBalanceRegisterService svc = testInstance();
assertEquals("(companyId=1000 AND account=ACC-2 AND (registryDesignation=A AND registryInstrumentType=M AND registryUnit=B))",
svc.getSqlForBlockedSum(1000L, "ACC-2").toString());
}
@Test
void getSqlForUnblockedSum() {
MoneyBalanceRegisterService svc = testInstance();
assertEquals("(companyId=1000 AND account=ACC-2 AND (registryDesignation=A AND registryInstrumentType=M AND registryUnit=F))",
svc.getSqlForUnblockedSum(1000L, "ACC-2").toString());
}
static MoneyBalanceRegisterService testInstance() {
ImdgProvider imdg = Mockito.mock(ImdgProvider.class);
Imdg<MoneyBalanceRegister> map1 = Mockito.mock(Imdg.class);
Mockito.when(map1.predicateBuilder()).thenReturn(new ImdgPredicateBuilderHazelcast());
Mockito.when(imdg.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class)).thenReturn(map1);
Imdg<Registry> map2 = Mockito.mock(Imdg.class);
Mockito.when(map2.predicateBuilder()).thenReturn(new ImdgPredicateBuilderHazelcast());
Mockito.when(imdg.getImdg(IMDGDistributedNames.Map_Registry, Registry.class)).thenReturn(map2);
MoneyBalanceRegisterService instance = new MoneyBalanceRegisterService(null, null, imdg, null);
return instance;
//todo тесты с выборкой с реальным тестовым Imdg, чтобы провалидировать типы данных в SQL
}
}

View file

@ -0,0 +1,50 @@
package ru.spcex.clearing.registry.util;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import ru.clearing.classes.objects.BusinessObject;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast;
import ru.spcex.platform.utils.time.TimeUtil;
import java.time.LocalDate;
import static org.junit.jupiter.api.Assertions.*;
class PreClearMapTest {
@Test
void instanceForLocalDateField() {
LocalDate dt = LocalDate.of(2023, 9, 29);
Imdg<BusinessObject> map = Mockito.mock(Imdg.class);
Mockito.when(map.getMapName()).thenReturn("Map_Test");
ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast();
Mockito.when(map.predicateBuilder()).thenReturn(pb);
PreClearMap<BusinessObject> pcm = PreClearMap.instanceForLocalDateField(map, "dateField");
assertEquals("PreClearMap{map=Map_Test, predicateBuilder=LocalDate predicate on dateField}", pcm.toString());
ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt);
assertEquals("dateField=2023-09-29", predicate.toString());
}
@Test
void instanceForInstantField() {
LocalDate dt = LocalDate.of(2023, 9, 29);
Imdg<BusinessObject> map = Mockito.mock(Imdg.class);
Mockito.when(map.getMapName()).thenReturn("Map_Test");
ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast();
Mockito.when(map.predicateBuilder()).thenReturn(pb);
PreClearMap<BusinessObject> pcm = PreClearMap.instanceForInstantField(map, "dateField");
assertEquals("PreClearMap{map=Map_Test, predicateBuilder=Instant predicate on dateField}", pcm.toString());
ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt);
assertEquals("(dateField>=2023-09-28T00:00:00Z AND dateField<2023-09-30T00:00:00Z)", predicate.toString());
// String expectedQuery = "(dateField>=" + TimeUtil.localDateToInstant(dt) + " AND dateField<" + TimeUtil.localDateToInstant(dt.plusDays(1)) + ")";
// assertEquals("(dateField>=2023-09-28T21:00:00Z AND dateField<2023-09-29T21:00:00Z)", predicate.toString());
// assertEquals(expectedQuery, predicate.toString());
}
}

View file

@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.MockProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.apache.kafka.common.TopicPartition;
@ -25,8 +26,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.*;
import static ru.spcex.clearing.platform.messaging.service.Status.Success;
import static ru.spcex.clearing.registry.utils.MatcherFactory.usingIgnoringFieldsComparator;
@ -89,6 +89,11 @@ public class TestUtils {
return jsonBaseRequest;
}
public static void setFuture(ArgumentCaptor<ProducerRecord> captor, Producer<String, Object> mockProducer){
TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata());
doReturn(future).when(mockProducer).send(captor.capture());
}
public static <T extends SpcexObjectBase> void clearAllInImdg(Imdg<T> imdg) {
Collection<T> values = imdg.getAllValues();
values.forEach(imdg::delete);

View file

@ -3,6 +3,8 @@ package ru.spcex.clearing.reports.reports.bp;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.enumeration.CoverageStatus;
import ru.spcex.platform.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.ReportKeys;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -36,7 +38,11 @@ public class ExecutedDealReportBuilder_INFTYPE_1 extends ExecutedDealReportBuild
pb.notNull("sessionId"),
pb.less("tradingDate", LocalDate.now()),
pb.equals("settlementDate", LocalDate.now()),
pb.equals("side", Side.SELL.getKey())
pb.or(
pb.equals("side", Side.SELL.getKey()),
pb.equals("side", MoneyFlowSide.SELL.getKey())
),
pb.equals("coverageStatus", CoverageStatus.ALWD)
)
);
}

View file

@ -3,6 +3,8 @@ package ru.spcex.clearing.reports.reports.bp;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.enumeration.CoverageStatus;
import ru.spcex.platform.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.ReportKeys;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -36,7 +38,11 @@ public class ExecutedDealReportBuilder_INFTYPE_2 extends ExecutedDealReportBuild
pb.notNull("sessionId"),
pb.equals("tradingDate", LocalDate.now()),
pb.equals("settlementDate", LocalDate.now()),
pb.equals("side", Side.SELL.getKey())
pb.or(
pb.equals("side", Side.SELL.getKey()),
pb.equals("side", MoneyFlowSide.SELL.getKey())
),
pb.equals("coverageStatus", CoverageStatus.ALWD)
)
);
}

View file

@ -3,6 +3,7 @@ package ru.spcex.clearing.reports.reports.bp;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.ReportKeys;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -34,7 +35,10 @@ public class ExecutedDealReportBuilder_INFTYPE_3 extends ExecutedDealReportBuild
return executionFondImdg.getCollectionObjectsByPredicate(
pb.and(
pb.greater("settlementDate", LocalDate.now()),
pb.equals("side", Side.SELL.getKey())
pb.or(
pb.equals("side", Side.SELL.getKey()),
pb.equals("side", MoneyFlowSide.SELL.getKey())
)
)
);
}

View file

@ -4,6 +4,7 @@ import org.springframework.stereotype.Component;
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.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.ReportKeys;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -36,7 +37,10 @@ public class ExecutedDealReportBuilder_INFTYPE_4 extends ExecutedDealReportBuild
pb.and(
pb.equals("coverageStatus", Allowed.DENIED.getKey()),
pb.equals("settlementDate", LocalDate.now()),
pb.equals("side", Side.SELL.getKey())
pb.or(
pb.equals("side", Side.SELL.getKey()),
pb.equals("side", MoneyFlowSide.SELL.getKey())
)
)
);
}

View file

@ -66,9 +66,13 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdPara
ImdgPredicate predicate = pb.and(
pb.notNull("sessionId"),
pb.equals("coverageStatus", Allowed.DENIED.getKey()),
pb.equals("side", Side.SELL.getKey())
pb.or(
pb.equals("side", Side.SELL.getKey()),
pb.equals("side", MoneyFlowSide.SELL.getKey())
)
);
Collection<ExecutionFond> executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate);
log.debug("Found {} ExecutionFond by query: {}", executionFonds.size(), predicate);
rows = new ArrayList<>(executionFonds.size());
for (ExecutionFond executionFond : executionFonds) {

View file

@ -66,14 +66,12 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
LocalDate nowDate = LocalDate.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TM_T, RegistryTradingParams.OM_T).build();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM_T, RegistryTradingParams.LM_T).build();
List<Long> sessionIds = params.getSessionId();
if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg);
ImdgPredicate finalPredicate = pb.and(
pb.not(pb.in("registryStatus",
RegistryStatus.CLRD.getKey(),
RegistryStatus.UNCV.getKey(),
RegistryStatus.FAIL.getKey(),
RegistryStatus.NACK.getKey(),
RegistryStatus.NACC.getKey())),
pb.in("sessionId", sessionIds.toArray(new Long[0])),
pb.equals("clearingDate", nowDate),
pb.sql(sql),
pb.or(
pb.equals("accountType", AccountType.Clrn.getKey()),
@ -91,7 +89,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
List<Registry> groupedRegistry = entry.getValue();
try {
if (groupedRegistry.isEmpty()) {
log.warn("Empty OM_T and TM_T registries for account = {} and session_id = {}. Registries with id = [{}] was skipped",
log.warn("Empty LM_T and CM_T registries for account = {} and session_id = {}. Registries with id = [{}] was skipped",
pairRegistryId.getAccount(),
pairRegistryId.getSessionId(),
groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", "))
@ -99,32 +97,32 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
continue;
}
List<Registry> tmtRegistries = new ArrayList<>();
List<Registry> omtRegistries = new ArrayList<>();
List<Registry> cmtRegistries = new ArrayList<>();
List<Registry> lmtRegistries = new ArrayList<>();
Registry registry = null;
for (Registry currRegistry : groupedRegistry) {
registry = currRegistry;
if (RegistryDesignation.O.equalsByKey(currRegistry.getRegistryDesignation()))
omtRegistries.add(currRegistry);
if (RegistryDesignation.T.equalsByKey(currRegistry.getRegistryDesignation()))
tmtRegistries.add(currRegistry);
if (RegistryDesignation.L.equalsByKey(currRegistry.getRegistryDesignation()))
lmtRegistries.add(currRegistry);
if (RegistryDesignation.C.equalsByKey(currRegistry.getRegistryDesignation()))
cmtRegistries.add(currRegistry);
}
boolean invalid = false;
if (!tmtRegistries.isEmpty() || !omtRegistries.isEmpty()) {
if (!cmtRegistries.isEmpty() || !lmtRegistries.isEmpty()) {
String sourceTradingCode = "";
if (!tmtRegistries.isEmpty()) sourceTradingCode = tmtRegistries.iterator().next().getTradingCode();
if (!omtRegistries.isEmpty()) sourceTradingCode = omtRegistries.iterator().next().getTradingCode();
for (Registry currRegistry : tmtRegistries) {
if (!cmtRegistries.isEmpty()) sourceTradingCode = cmtRegistries.iterator().next().getTradingCode();
if (!lmtRegistries.isEmpty()) sourceTradingCode = lmtRegistries.iterator().next().getTradingCode();
for (Registry currRegistry : cmtRegistries) {
if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue;
invalid = true;
log.warn("Invalid TM_T registries set, tradingCode not equals. Registries was skipped");
log.warn("Invalid CM_T registries set, tradingCode not equals. Registries was skipped");
break;
}
for (Registry currRegistry : omtRegistries) {
for (Registry currRegistry : lmtRegistries) {
if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue;
invalid = true;
log.warn("Invalid OM_T registries set, tradingCode not equals. Registries was skipped");
log.warn("Invalid LM_T registries set, tradingCode not equals. Registries was skipped");
break;
}
if (invalid) continue;
@ -142,15 +140,15 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
ksRepCashNettoReport.setAccount(registry.getAccount());
ksRepCashNettoReport.setDate(nowDate);
BigDecimal tmtBalance = BigDecimal.ZERO;
BigDecimal omtBalance = BigDecimal.ZERO;
for (Registry tmtRegistry : tmtRegistries) {
if (tmtRegistry.getBalance() != null) tmtBalance = tmtBalance.add(tmtRegistry.getBalance());
BigDecimal cmtBalance = BigDecimal.ZERO;
BigDecimal lmtBalance = BigDecimal.ZERO;
for (Registry cmtRegistry : cmtRegistries) {
if (cmtRegistry.getBalance() != null) cmtBalance = cmtBalance.add(cmtRegistry.getBalance());
}
for (Registry omtRegistry : omtRegistries) {
if (omtRegistry.getBalance() != null) omtBalance = omtBalance.add(omtRegistry.getBalance());
for (Registry lmtRegistry : lmtRegistries) {
if (lmtRegistry.getBalance() != null) lmtBalance = lmtBalance.add(lmtRegistry.getBalance());
}
ksRepCashNettoReport.setValue(tmtBalance.subtract(omtBalance));
ksRepCashNettoReport.setValue(cmtBalance.subtract(lmtBalance));
rows.add(ksRepCashNettoReport);
} catch (Throwable e) {

View file

@ -1,11 +1,8 @@
package ru.spcex.clearing.reports.reports.ks;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
@ -16,30 +13,26 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Component
public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyParams, KSRepCashRegisterSumsReport> {
private final Imdg<Statement> statementImdg;
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final Imdg<Account> accountImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Registry> registryImdg;
private List<KSRepCashRegisterSumsReport> rows = null;
public KSRepCashRegisterSumsReportBuilder(ImdgProvider imdgProvider) {
statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
}
@Override
@ -69,196 +62,51 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = statementImdg.predicateBuilder();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DM_I).buildPredicate(pb);
ImdgPredicate finalPredicate = pb.and(
pb.greatEqual("created", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("created", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("inOutSDfType", InOutSDfType.type57.getKey()),
pb.equals("operationStatus", OperationStatus.Executed.getKey())
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("registryStatus", RegistryStatus.OK.getKey()),
pb.notNull("tradingClearingRegistry"),
registryPredicate
);
Collection<Statement> statements = statementImdg.getCollectionObjectsByPredicate(finalPredicate);
log.debug("Found {} Statements by query: {}", statements.size(), finalPredicate);
rows = new ArrayList<>(statements.size());
for (Statement statement : statements) {
if (statement.getAmount() == null) {
log.warn("Statement id={} has null amount, statement was skipped", statement.getId());
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
log.debug("Found {} registries by query: {}", registries.size(), finalPredicate);
rows = new ArrayList<>(registries.size());
for (Registry registry : registries) {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (company == null) {
log.warn("For registry id = {} company with id = {} not found, registry was skipped",
registry.getId(),
registry.getCompanyId());
continue;
}
try {
boolean searchTCRAsInfo;
if (Arrays.asList(1L, 2L).contains(statement.getAccountId())) {
searchTCRAsInfo = true;
} else {
Account account = accountImdg.getSingleObjectByID(statement.getAccountId());
if (account == null) {
log.warn("Unexpected state: for statement (id = {}) not found account for accountId = {}. Statement was skipped",
statement.getId(),
statement.getAccountId());
continue;
}
searchTCRAsInfo = AccountType.Info.equalsByKey(account.getAccountType());
if (!searchTCRAsInfo && !AccountType.Clrn.equalsByKey(account.getAccountType())) {
log.warn("Unexpected account[{}] type {}", account.getId(), account.getAccountType());
}
}
TradingClearingRegistry tkr;
if (searchTCRAsInfo) {
String code = parseCodeFromStatementComment(statement.getComment());
if (code == null || code.isBlank()) {
log.warn("For statement id = {} empty or unparseable code=\"{}\" (comment \"{}\"), statement was skipped",
code, statement.getComment(), statement.getId());
continue;
}
log.debug("Search TradingClearingRegistry by code={}", code);
tkr = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("code", code));
if (tkr == null) {
log.warn(
"For statement id = {} and code = {} (or unparseable comment=\"{}\") not found TradingClearingRegistry, statement was skipped",
statement.getId(),
code, statement.getComment()
);
continue;
}
} else {
Long accountId = statement.getAccountId();
if (accountId == null) {
log.warn("For statement id = {} empty accountId, statement was skipped", statement.getId());
continue;
}
log.debug("Search TCR by moneyAccountId={}", accountId);
tkr = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("moneyAccountId", accountId));
if (tkr == null) {
log.warn(
"For statement id = {} and accountId = {} not found TradingClearingRegistry, statement was skipped",
statement.getId(),
accountId
);
continue;
}
}
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
Company company;
if (searchTCRAsInfo) {
company = companyImdg.getSingleObjectByID(tkr.getCompanyId());
if (company == null) {
log.warn("For statement id = {}, tcr.id={}, company with id = {} not found, statement was skipped",
statement.getId(),
tkr.getId(),
tkr.getCompanyId());
continue;
}
} else {
company = companyImdg.getSingleObjectByID(statement.getAddresseeId());
if (company == null) {
log.warn("For statement id = {}, company with id = {} not found, statement was skipped",
statement.getId(),
statement.getAddresseeId());
continue;
}
}
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) {
log.debug("For statement id = {}, company with id = {} not active",
statement.getId(), company.getId());
continue;
}
String firmId = registry.getTradingCode();
String account = registry.getAccount();
String tkr = registry.getTradingClearingRegistry();
String tradeNum = "";
String registerCode = registry.getRegistryCode();
BigDecimal addSum = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO;
Instant addTime = registry.getUpdated();
LocalDate addDate = LocalDate.now();
ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder();
ImdgPredicate registryQuery;
if (searchTCRAsInfo) {
registryQuery = pbRegistry.and(
pbRegistry.equals("tradingClearingRegistry", tkr.getCode()),
pbRegistry.in("accountType", AccountType.Clrn.getKey(), AccountType.Info.getKey()),
RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).buildPredicate(pbRegistry)
);
} else {
registryQuery = pbRegistry.and(
pbRegistry.equals("companyId", statement.getAddresseeId()),
pbRegistry.equals("account", statement.getAccount()),
pbRegistry.in("accountType", AccountType.Clrn.getKey(), AccountType.Info.getKey()),
RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).buildPredicate(pbRegistry)
);
}
log.trace("For statement id={} search registry query: {}", statement.getId(), registryQuery);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(registryQuery);
if (registries.isEmpty()) {
log.warn(
"Can't find registry for {}. Statement id = {} skipped",
registryQuery,
statement.getId()
);
continue;
} else if (registries.size() > 1) {
log.warn(
"More then one AM_T registry found for {}, statement id {}. Use first",
registryQuery,
statement.getId()
);
}
Registry registry = registries.iterator().next();
KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport();
ksRepCashRegisterSumsReport.setFirmId(company.getTradingCode());
if (searchTCRAsInfo) {
Account account = accountImdg.getSingleObjectByID(tkr.getMoneyAccountId());
if (account == null) {
log.debug("statement id={}, moneyAccount not found with id={}",
statement.getId(), tkr.getMoneyAccountId());
} else {
ksRepCashRegisterSumsReport.setAccount(account.getAccount());
}
} else {
ksRepCashRegisterSumsReport.setAccount(statement.getAccount());
}
ksRepCashRegisterSumsReport.setTkr(tkr.getCode());
ksRepCashRegisterSumsReport.setRegisterCode(registry.getRegistryCode());
ksRepCashRegisterSumsReport.setAddDate(nowDate);
if (statement.getCreated() != null)
ksRepCashRegisterSumsReport.setAddTime(LocalTime.ofInstant(statement.getCreated(), getReportZoneId()));
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
if (inOutDirection == InOutDirection.in) {
ksRepCashRegisterSumsReport.setAddSum(statement.getAmount());
} else if (inOutDirection == InOutDirection.out) {
ksRepCashRegisterSumsReport.setAddSum(statement.getAmount().negate());
} else {
log.warn(
"Invalid statement.in_out_direction ({}). Statement id = {} skipped",
statement.getInOutDirection(),
statement.getId()
);
continue;
}
rows.add(ksRepCashRegisterSumsReport);
} catch (Throwable e) {
log.error("Can't create report row for registry (id = %d), skipped".formatted(statement.getId()), e);
}
KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport();
ksRepCashRegisterSumsReport.setFirmId(firmId);
ksRepCashRegisterSumsReport.setAccount(account);
ksRepCashRegisterSumsReport.setTkr(tkr);
ksRepCashRegisterSumsReport.setTradeNum(tradeNum);
ksRepCashRegisterSumsReport.setRegisterCode(registerCode);
ksRepCashRegisterSumsReport.setAddSum(addSum);
ksRepCashRegisterSumsReport.setAddTime(LocalTime.ofInstant(addTime, getReportZoneId()));
ksRepCashRegisterSumsReport.setAddDate(addDate);
rows.add(ksRepCashRegisterSumsReport);
}
}
protected String parseCodeFromStatementComment(String comment) {
if (comment == null)
return null;
int i = comment.lastIndexOf("ТКР");
String code = comment;
if (i >= 0) {
code = code.substring(i + 3).trim();
} else {
return null;
}
i = -1;
for (String end : Arrays.asList(".", ";", " ")) {
int p = code.indexOf(end);
if (p > 0 && (i <= 0 || i > p)) i = p;
}
if (i > 0) {
code = code.substring(0, i);
}
return code;
}
}

View file

@ -114,9 +114,22 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
BigDecimal settleDebit = registry.getSettledDebit() != null ? registry.getSettledDebit() : BigDecimal.ZERO;
ksRepCashRegistersReport.setChangeBalance(settleCredit.subtract(settleDebit));
BigDecimal credit = registry.getCredit() != null ? registry.getCredit() : BigDecimal.ZERO;
BigDecimal debit = registry.getDebit() != null ? registry.getDebit() : BigDecimal.ZERO;
ksRepCashRegistersReport.setAddWithdraw(credit.subtract(debit));
registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DMAI).buildPredicate(pb);
Collection<Registry> registriesForAddWithdraw = registryImdg.getCollectionObjectsByPredicate(
pb.and(
registryPredicate,
pb.equals("securityId", registry.getSecurityId()),
pb.equals("accountId", registry.getAccountId()),
pb.equals("companyId", registry.getCompanyId()),
pb.equals("registryStatus", RegistryStatus.OK.getKey()),
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.notNull("balance")
)
);
BigDecimal addWithdraw = BigDecimal.ZERO;
for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance());
ksRepCashRegistersReport.setAddWithdraw(addWithdraw);
BigDecimal closeBalance = ksRepCashRegistersReport.getOpenBalance()
.add(ksRepCashRegistersReport.getChangeBalance())

View file

@ -66,14 +66,12 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
LocalDate nowDate = LocalDate.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TS_T, RegistryTradingParams.OS_T).build();
List<Long> sessionIds = params.getSessionId();
if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg);
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CS_T, RegistryTradingParams.LS_T).build();
ImdgPredicate finalPredicate = pb.and(
pb.not(pb.in("registryStatus",
RegistryStatus.CLRD.getKey(),
RegistryStatus.UNCV.getKey(),
RegistryStatus.FAIL.getKey(),
RegistryStatus.NACK.getKey(),
RegistryStatus.NACC.getKey())),
pb.in("sessionId", sessionIds.toArray(new Long[0])),
pb.equals("clearingDate", nowDate),
pb.sql(sql),
pb.equals("accountType", AccountType.Depo.getKey()),
pb.notNull("account")
@ -88,39 +86,39 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
List<Registry> groupedRegistry = entry.getValue();
try {
if (groupedRegistry.isEmpty()) {
log.warn("Empty OS_T and TS_T registries for {}. Registries with id = [{}] was skipped",
log.warn("Empty LS_T and CS_T registries for {}. Registries with id = [{}] was skipped",
pairRegistryId,
groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", "))
);
continue;
}
List<Registry> tstRegistries = new ArrayList<>();
List<Registry> ostRegistries = new ArrayList<>();
List<Registry> cstRegistries = new ArrayList<>();
List<Registry> lstRegistries = new ArrayList<>();
Registry registry = null;
for (Registry currRegistry : groupedRegistry) {
registry = currRegistry;
if (RegistryDesignation.O.equalsByKey(currRegistry.getRegistryDesignation()))
ostRegistries.add(currRegistry);
if (RegistryDesignation.T.equalsByKey(currRegistry.getRegistryDesignation()))
tstRegistries.add(currRegistry);
if (RegistryDesignation.L.equalsByKey(currRegistry.getRegistryDesignation()))
lstRegistries.add(currRegistry);
if (RegistryDesignation.C.equalsByKey(currRegistry.getRegistryDesignation()))
cstRegistries.add(currRegistry);
}
boolean invalid = false;
if (!tstRegistries.isEmpty() || !ostRegistries.isEmpty()) {
if (!cstRegistries.isEmpty() || !lstRegistries.isEmpty()) {
String sourceTradingCode = "";
if (!tstRegistries.isEmpty()) sourceTradingCode = tstRegistries.iterator().next().getTradingCode();
if (!ostRegistries.isEmpty()) sourceTradingCode = ostRegistries.iterator().next().getTradingCode();
for (Registry currRegistry : tstRegistries) {
if (!cstRegistries.isEmpty()) sourceTradingCode = cstRegistries.iterator().next().getTradingCode();
if (!lstRegistries.isEmpty()) sourceTradingCode = lstRegistries.iterator().next().getTradingCode();
for (Registry currRegistry : cstRegistries) {
if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue;
invalid = true;
log.warn("Invalid TS_T registries set, tradingCode not equals. Registries was skipped");
log.warn("Invalid CS_T registries set, tradingCode not equals. Registries was skipped");
break;
}
for (Registry currRegistry : ostRegistries) {
for (Registry currRegistry : lstRegistries) {
if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue;
invalid = true;
log.warn("Invalid OS_T registries set, tradingCode not equals. Registries was skipped");
log.warn("Invalid LS_T registries set, tradingCode not equals. Registries was skipped");
break;
}
if (invalid) continue;
@ -137,15 +135,15 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
if (session != null && session.getCreated() != null)
ksRepDepoNettoReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), getReportZoneId()));
BigDecimal tstBalance = BigDecimal.ZERO;
BigDecimal ostBalance = BigDecimal.ZERO;
for (Registry tstRegistry : tstRegistries) {
if (tstRegistry.getBalance() != null) tstBalance = tstBalance.add(tstRegistry.getBalance());
BigDecimal cstBalance = BigDecimal.ZERO;
BigDecimal lstBalance = BigDecimal.ZERO;
for (Registry cstRegistry : cstRegistries) {
if (cstRegistry.getBalance() != null) cstBalance = cstBalance.add(cstRegistry.getBalance());
}
for (Registry ostRegistry : ostRegistries) {
if (ostRegistry.getBalance() != null) ostBalance = ostBalance.add(ostRegistry.getBalance());
for (Registry lstRegistry : lstRegistries) {
if (lstRegistry.getBalance() != null) lstBalance = lstBalance.add(lstRegistry.getBalance());
}
ksRepDepoNettoReport.setValue(tstBalance.subtract(ostBalance));
ksRepDepoNettoReport.setValue(cstBalance.subtract(lstBalance));
rows.add(ksRepDepoNettoReport);
} catch (Throwable e) {

View file

@ -2,12 +2,7 @@ package ru.spcex.clearing.reports.reports.ks;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
@ -18,8 +13,8 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
@ -30,22 +25,14 @@ import java.util.List;
@Component
public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepDepoRegisterQuantitiesReport> {
private final Imdg<Statement> statementImdg;
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private final Imdg<EquitySecurity> equitySecurityImdg;
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg;
private List<KSRepDepoRegisterQuantitiesReport> rows = null;
public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) {
statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
}
@Override
@ -75,126 +62,55 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = statementImdg.predicateBuilder();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DS_I).buildPredicate(pb);
ImdgPredicate finalPredicate = pb.and(
pb.greatEqual("created", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("created", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("inOutSDfType", InOutSDfType.type21.getKey()),
pb.equals("operationStatus", OperationStatus.Executed.getKey()),
pb.notNull("amount")
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("registryStatus", RegistryStatus.OK.getKey()),
pb.notNull("tradingClearingRegistry"),
registryPredicate
);
Collection<Statement> statements = statementImdg.getCollectionObjectsByPredicate(finalPredicate);
log.debug("Found {} Statement by query: {}", statements.size(), finalPredicate);
rows = new ArrayList<>(statements.size());
for (Statement statement : statements) {
try {
Company company = companyImdg.getSingleObjectByID(statement.getAddresseeId());
if (company == null) {
log.warn("For statement id = {} company with id = {} not found, statement was skipped",
statement.getId(),
statement.getAddresseeId());
continue;
}
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder();
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(
pbRegistry.and(
pbRegistry.equals("companyId", statement.getAddresseeId()),
pbRegistry.equals("account", statement.getAccount()),
pbRegistry.equals("accountType", AccountType.Depo.getKey()),
RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T).buildPredicate(pbRegistry),
pbRegistry.equals("securityId", statement.getSecurityId())
)
);
if (registries.isEmpty()) {
log.warn(
"Can't find registry for companyId = {}, securityId = {} and account: {}. Statement id = {} skipped",
statement.getAddresseeId(),
statement.getSecurityId(),
statement.getAccount(),
statement.getId()
);
continue;
} else if (registries.size() > 1) {
log.warn(
"More then one AS_T registry found for companyId = {}, securityId = {} and account: {}, statement id {}. Use first",
statement.getAddresseeId(),
statement.getSecurityId(),
statement.getAccount(),
statement.getId()
);
}
Registry registry = registries.iterator().next();
Security security = getSecurityWithSecuritySymbolForId(statement.getSecurityId());
if (security == null) {
log.warn(
"Can't find security for securityId = {}. Statement id = {} skipped",
statement.getSecurityId(),
statement.getId()
);
continue;
}
KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport();
ksRepDepoRegisterQuantitiesReport.setFirmId(String.valueOf(statement.getAddresseeId()));
ksRepDepoRegisterQuantitiesReport.setAccount(statement.getAccount());
ksRepDepoRegisterQuantitiesReport.setTkr(registry.getTradingClearingRegistry());
ksRepDepoRegisterQuantitiesReport.setSecurityId(security.getSecuritySymbol());
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registry.getRegistryCode());
ksRepDepoRegisterQuantitiesReport.setAddDate(nowDate);
if (statement.getCreated() != null)
ksRepDepoRegisterQuantitiesReport.setAddTime(LocalTime.ofInstant(statement.getCreated(), getReportZoneId()));
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
if (inOutDirection == InOutDirection.in) {
ksRepDepoRegisterQuantitiesReport.setAddQuantity(statement.getAmount());
} else if (inOutDirection == InOutDirection.out) {
ksRepDepoRegisterQuantitiesReport.setAddQuantity(statement.getAmount().negate());
} else {
log.warn(
"Invalid statement.in_out_direction ({}). Statement id = {} skipped",
statement.getInOutDirection(),
statement.getId()
);
continue;
}
rows.add(ksRepDepoRegisterQuantitiesReport);
} catch (Throwable e) {
log.error("Can't create report row for registry (id = %d), skipped".formatted(statement.getId()), e);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
log.debug("Found {} registries by query: {}", registries.size(), finalPredicate);
rows = new ArrayList<>(registries.size());
for (Registry registry : registries) {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (company == null) {
log.warn("For registry id = {} company with id = {} not found, registry was skipped",
registry.getId(),
registry.getCompanyId());
continue;
}
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode();
String account = registry.getAccount();
String tkr = registry.getTradingClearingRegistry();
String tradeNum = "";
String securityId = registry.getSecuritySymbol();
String registerCode = registry.getRegistryCode();
BigDecimal addQuantity = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO;
Instant addTime = registry.getUpdated();
LocalDate addDate = LocalDate.now();
KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport();
ksRepDepoRegisterQuantitiesReport.setFirmId(firmId);
ksRepDepoRegisterQuantitiesReport.setAccount(account);
ksRepDepoRegisterQuantitiesReport.setTkr(tkr);
ksRepDepoRegisterQuantitiesReport.setTradeNum(tradeNum);
ksRepDepoRegisterQuantitiesReport.setSecurityId(securityId);
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registerCode);
ksRepDepoRegisterQuantitiesReport.setAddQuantity(addQuantity);
ksRepDepoRegisterQuantitiesReport.setAddTime(LocalTime.ofInstant(addTime, getReportZoneId()));
ksRepDepoRegisterQuantitiesReport.setAddDate(addDate);
rows.add(ksRepDepoRegisterQuantitiesReport);
}
}
private Security getSecurityWithSecuritySymbolForId(Long securityId) {
Security security;
security = equitySecurityImdg.getFirstObjectByPredicate(
equitySecurityImdg.predicateBuilder().and(
equitySecurityImdg.predicateBuilder().equals("securityId", securityId),
equitySecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
if (security == null) {
security = fixedIncomeSecurityImdg.getFirstObjectByPredicate(
fixedIncomeSecurityImdg.predicateBuilder().and(
fixedIncomeSecurityImdg.predicateBuilder().equals("securityId", securityId),
fixedIncomeSecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
}
if (security == null)
security = moneyMarketSecurityImdg.getFirstObjectByPredicate(
moneyMarketSecurityImdg.predicateBuilder().and(
moneyMarketSecurityImdg.predicateBuilder().equals("securityId", securityId),
moneyMarketSecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
return security;
}
}

View file

@ -69,9 +69,9 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T).build();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T).buildPredicate(pb);
ImdgPredicate finalPredicate = pb.and(
pb.sql(sql),
registryPredicate,
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("accountType", AccountType.Depo.getKey()),
@ -112,9 +112,22 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
BigDecimal settledDebit = registry.getSettledDebit() != null ? registry.getSettledDebit() : BigDecimal.ZERO;
ksRepDepoRegistersReport.setChangeQuantity(settledCredit.subtract(settledDebit));
BigDecimal credit = registry.getCredit() != null ? registry.getCredit() : BigDecimal.ZERO;
BigDecimal debit = registry.getDebit() != null ? registry.getDebit() : BigDecimal.ZERO;
ksRepDepoRegistersReport.setAddWithdrawDepo(credit.subtract(debit));
registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DMAI).buildPredicate(pb);
Collection<Registry> registriesForAddWithdraw = registryImdg.getCollectionObjectsByPredicate(
pb.and(
registryPredicate,
pb.equals("securityId", registry.getSecurityId()),
pb.equals("accountId", registry.getAccountId()),
pb.equals("companyId", registry.getCompanyId()),
pb.equals("registryStatus", RegistryStatus.OK.getKey()),
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.notNull("balance")
)
);
BigDecimal addWithdraw = BigDecimal.ZERO;
for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance());
ksRepDepoRegistersReport.setAddWithdrawDepo(addWithdraw);
BigDecimal closeBalance = ksRepDepoRegistersReport.getOpenQuantity()
.add(ksRepDepoRegistersReport.getChangeQuantity())

View file

@ -1,23 +0,0 @@
package ru.spcex.clearing.reports.reports.ks;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import ru.spcex.platform.imdg.api.ImdgProvider;
import static org.junit.jupiter.api.Assertions.*;
class KSRepCashRegisterSumsReportBuilderTest {
@Test
void parseCodeFromStatementComment() {
KSRepCashRegisterSumsReportBuilder reportB = new KSRepCashRegisterSumsReportBuilder(Mockito.mock(ImdgProvider.class));
assertNull(reportB.parseCodeFromStatementComment(null));
assertEquals(null, reportB.parseCodeFromStatementComment(""));
assertEquals(null, reportB.parseCodeFromStatementComment(" TTTAAA "));
assertEquals("0045CAT00001", reportB.parseCodeFromStatementComment("Возврат на депозит №DSTAA10S003/150923/45/23091500000008 по ТКР 0045CAT00001"));
assertEquals("0574MAT00001", reportB.parseCodeFromStatementComment("Вывод средств по ТКР 0574MAT00001. Поручения 777."));
assertEquals("0574MAT00001", reportB.parseCodeFromStatementComment("ТКР 0574MAT00001"));
assertEquals("0574MAT00001", reportB.parseCodeFromStatementComment("ТКР0574MAT00001"));
assertEquals("", reportB.parseCodeFromStatementComment("ТКР"));
}
}

View file

@ -129,6 +129,8 @@ public class ReportServiceTest_KS {
Registry registry = new Registry();
registry.setCompanyId(COMPANY_ID);
registry.setSecurityId(777L);
registry.setAccountId(888L);
registry.setRegistryCode("AM_T");
registry.setRegistryDesignation(RegistryDesignation.A.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
@ -146,6 +148,48 @@ public class ReportServiceTest_KS {
registry.setCloseBalance(BigDecimal.valueOf(11.11111111));
registryImdg.insert(registry);
Registry addWithdrawRegistry_1 = new Registry();
addWithdrawRegistry_1.setCompanyId(COMPANY_ID);
addWithdrawRegistry_1.setSecurityId(777L);
addWithdrawRegistry_1.setAccountId(888L);
addWithdrawRegistry_1.setRegistryStatus(RegistryStatus.OK.getKey());
addWithdrawRegistry_1.setRegistryCode("DMAI");
addWithdrawRegistry_1.setRegistryDesignation(RegistryDesignation.D.getKey());
addWithdrawRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
addWithdrawRegistry_1.setRegistryCapacity(RegistryCapacity.A.getKey());
addWithdrawRegistry_1.setRegistryUnit(RegistryUnit.I.getKey());
addWithdrawRegistry_1.setUpdated(Instant.now());
addWithdrawRegistry_1.setBalance(BigDecimal.TEN);
registryImdg.insert(addWithdrawRegistry_1);
Registry addWithdrawRegistry_2 = new Registry();
addWithdrawRegistry_2.setCompanyId(COMPANY_ID);
addWithdrawRegistry_2.setSecurityId(777L);
addWithdrawRegistry_2.setAccountId(888L);
addWithdrawRegistry_2.setRegistryStatus(RegistryStatus.OK.getKey());
addWithdrawRegistry_2.setRegistryCode("DMAI");
addWithdrawRegistry_2.setRegistryDesignation(RegistryDesignation.D.getKey());
addWithdrawRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
addWithdrawRegistry_2.setRegistryCapacity(RegistryCapacity.A.getKey());
addWithdrawRegistry_2.setRegistryUnit(RegistryUnit.I.getKey());
addWithdrawRegistry_2.setUpdated(Instant.now());
addWithdrawRegistry_2.setBalance(BigDecimal.ONE);
registryImdg.insert(addWithdrawRegistry_2);
Registry addWithdrawRegistry_3 = new Registry();
addWithdrawRegistry_3.setCompanyId(COMPANY_ID);
addWithdrawRegistry_3.setSecurityId(777L);
addWithdrawRegistry_3.setAccountId(888L);
addWithdrawRegistry_3.setRegistryStatus(RegistryStatus.OK.getKey());
addWithdrawRegistry_3.setRegistryCode("DMAI");
addWithdrawRegistry_3.setRegistryDesignation(RegistryDesignation.D.getKey());
addWithdrawRegistry_3.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
addWithdrawRegistry_3.setRegistryCapacity(RegistryCapacity.A.getKey());
addWithdrawRegistry_3.setRegistryUnit(RegistryUnit.I.getKey());
addWithdrawRegistry_3.setUpdated(Instant.now());
addWithdrawRegistry_3.setBalance(BigDecimal.valueOf(100L));
registryImdg.insert(addWithdrawRegistry_3);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -162,6 +206,9 @@ public class ReportServiceTest_KS {
registryCodeDictionaryImdg.delete(registryCodeDictionary);
registryImdg.delete(registry);
registryImdg.delete(addWithdrawRegistry_1);
registryImdg.delete(addWithdrawRegistry_2);
registryImdg.delete(addWithdrawRegistry_3);
}
@Test
@ -173,39 +220,18 @@ public class ReportServiceTest_KS {
reportRequest.setReportId(ReportBuilderType.KS_REP_CASH_REGISTER_SUMS.getKey());
Registry registry_1 = new Registry();
registry_1.setUpdated(Instant.now());
registry_1.setRegistryStatus(RegistryStatus.OK.getKey());
registry_1.setTradingCode("TRADING_CODE");
registry_1.setTradingClearingRegistry("0008CAT00001");
registry_1.setCompanyId(COMPANY_ID);
registry_1.setAccount("ACCOUNT");
registry_1.setAccountType(AccountType.Clrn.getKey());
registry_1.setRegistryCode("AM_T");
registry_1.setRegistryDesignation("A");
registry_1.setRegistryCode("DM_I");
registry_1.setRegistryDesignation("D");
registry_1.setRegistryInstrumentType("M");
registry_1.setRegistryUnit("T");
registry_1.setTradingClearingRegistry("0008CAT00001");
registry_1.setRegistryUnit("I");
registryImdg.insert(registry_1);
TradingClearingRegistry tkr = new TradingClearingRegistry();
tkr.setMoneyAccountId(777L);
tkr.setCode("0008CAT00001");
tkr.setCompanyId(COMPANY_ID);
tradingClearingRegistryImdg.insert(tkr);
Account account = new Account();
account.setAccountType(AccountType.Info.getKey());
account.setAccount("ACCOUNT");
Long accountId = accountImdg.insert(account);
Statement statement_1 = new Statement();
statement_1.setAddresseeId(COMPANY_ID);
statement_1.setAccount("ACCOUNT");
statement_1.setAccountId(accountId);
statement_1.setInOutDirection(InOutDirection.in.getKey());
statement_1.setInOutSDfType(InOutSDfType.type57.getKey());
statement_1.setOperationStatus(OperationStatus.Executed.getKey());
statement_1.setAmount(BigDecimal.valueOf(7777.777777777));
statement_1.setCreated(Instant.now());
statement_1.setComment("Зачислить на ТКР 0008CAT00001");
statementImdg.insert(statement_1);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -221,9 +247,6 @@ public class ReportServiceTest_KS {
compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME"));
registryImdg.delete(registry_1);
statementImdg.delete(statement_1);
tradingClearingRegistryImdg.delete(tkr);
accountImdg.delete(account);
}
@Test
@ -241,7 +264,10 @@ public class ReportServiceTest_KS {
Registry registry = new Registry();
registry.setCompanyId(COMPANY_ID);
registry.setSecurityId(777L);
registry.setAccountId(888L);
registry.setRegistryCode("AS_T");
registry.setSecuritySymbol("SECURITY_SYMBOL");
registry.setRegistryDesignation(RegistryDesignation.A.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry.setRegistryUnit(RegistryUnit.T.getKey());
@ -258,6 +284,48 @@ public class ReportServiceTest_KS {
registry.setCloseBalance(BigDecimal.valueOf(11.11111111));
registryImdg.insert(registry);
Registry addWithdrawRegistry_1 = new Registry();
addWithdrawRegistry_1.setCompanyId(COMPANY_ID);
addWithdrawRegistry_1.setSecurityId(777L);
addWithdrawRegistry_1.setAccountId(888L);
addWithdrawRegistry_1.setRegistryStatus(RegistryStatus.OK.getKey());
addWithdrawRegistry_1.setRegistryCode("DMAI");
addWithdrawRegistry_1.setRegistryDesignation(RegistryDesignation.D.getKey());
addWithdrawRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
addWithdrawRegistry_1.setRegistryCapacity(RegistryCapacity.A.getKey());
addWithdrawRegistry_1.setRegistryUnit(RegistryUnit.I.getKey());
addWithdrawRegistry_1.setUpdated(Instant.now());
addWithdrawRegistry_1.setBalance(BigDecimal.TEN);
registryImdg.insert(addWithdrawRegistry_1);
Registry addWithdrawRegistry_2 = new Registry();
addWithdrawRegistry_2.setCompanyId(COMPANY_ID);
addWithdrawRegistry_2.setSecurityId(777L);
addWithdrawRegistry_2.setAccountId(888L);
addWithdrawRegistry_2.setRegistryStatus(RegistryStatus.OK.getKey());
addWithdrawRegistry_2.setRegistryCode("DMAI");
addWithdrawRegistry_2.setRegistryDesignation(RegistryDesignation.D.getKey());
addWithdrawRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
addWithdrawRegistry_2.setRegistryCapacity(RegistryCapacity.A.getKey());
addWithdrawRegistry_2.setRegistryUnit(RegistryUnit.I.getKey());
addWithdrawRegistry_2.setUpdated(Instant.now());
addWithdrawRegistry_2.setBalance(BigDecimal.ONE);
registryImdg.insert(addWithdrawRegistry_2);
Registry addWithdrawRegistry_3 = new Registry();
addWithdrawRegistry_3.setCompanyId(COMPANY_ID);
addWithdrawRegistry_3.setSecurityId(777L);
addWithdrawRegistry_3.setAccountId(888L);
addWithdrawRegistry_3.setRegistryStatus(RegistryStatus.OK.getKey());
addWithdrawRegistry_3.setRegistryCode("DMAI");
addWithdrawRegistry_3.setRegistryDesignation(RegistryDesignation.D.getKey());
addWithdrawRegistry_3.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
addWithdrawRegistry_3.setRegistryCapacity(RegistryCapacity.A.getKey());
addWithdrawRegistry_3.setRegistryUnit(RegistryUnit.I.getKey());
addWithdrawRegistry_3.setUpdated(Instant.now());
addWithdrawRegistry_3.setBalance(BigDecimal.valueOf(100L));
registryImdg.insert(addWithdrawRegistry_3);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -274,6 +342,9 @@ public class ReportServiceTest_KS {
registryCodeDictionaryImdg.delete(registryCodeDictionary);
registryImdg.delete(registry);
registryImdg.delete(addWithdrawRegistry_1);
registryImdg.delete(addWithdrawRegistry_2);
registryImdg.delete(addWithdrawRegistry_3);
}
@Test
@ -285,34 +356,20 @@ public class ReportServiceTest_KS {
reportRequest.setReportId(ReportBuilderType.KS_REP_DEPO_REGISTER_QUANTITIES.getKey());
Registry registry_1 = new Registry();
registry_1.setUpdated(Instant.now());
registry_1.setSecuritySymbol("SECURITY_SYMBOL");
registry_1.setRegistryStatus(RegistryStatus.OK.getKey());
registry_1.setTradingCode("TRADING_CODE");
registry_1.setTradingClearingRegistry("0008CAT00001");
registry_1.setCompanyId(COMPANY_ID);
registry_1.setAccount("ACCOUNT");
registry_1.setTradingClearingRegistry("TRADING_CLEARING_REGISTRY");
registry_1.setAccountType(AccountType.Depo.getKey());
registry_1.setRegistryCode("AS_T");
registry_1.setRegistryDesignation("A");
registry_1.setRegistryCode("DS_I");
registry_1.setRegistryDesignation("D");
registry_1.setRegistryInstrumentType("S");
registry_1.setRegistryUnit("T");
registry_1.setSecurityId(777L);
registry_1.setRegistryUnit("I");
registry_1.setBalance(BigDecimal.TEN);
registryImdg.insert(registry_1);
EquitySecurity equitySecurity = new EquitySecurity();
equitySecurity.setSecuritySymbol("value");
equitySecurity.setSecurityId(777L);
equitySecurityImdg.insert(equitySecurity);
Statement statement_1 = new Statement();
statement_1.setAddresseeId(COMPANY_ID);
statement_1.setAccount("ACCOUNT");
statement_1.setInOutDirection(InOutDirection.in.getKey());
statement_1.setInOutSDfType(InOutSDfType.type21.getKey());
statement_1.setOperationStatus(OperationStatus.Executed.getKey());
statement_1.setAmount(BigDecimal.valueOf(7777.777777777));
statement_1.setCreated(Instant.now());
statement_1.setSecurityId(777L);
statementImdg.insert(statement_1);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -328,8 +385,6 @@ public class ReportServiceTest_KS {
compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME"));
registryImdg.delete(registry_1);
equitySecurityImdg.delete(equitySecurity);
statementImdg.delete(statement_1);
}
@Test
@ -434,9 +489,9 @@ public class ReportServiceTest_KS {
registry_1.setSettlementDate(LocalDate.now());
registry_1.setGroupId(Long.MAX_VALUE);
registry_1.setClearingDate(LocalDate.now());
registry_1.setRegistryCode("OM_T");
registry_1.setRegistryCode("LM_T");
registry_1.setRegistryStatus(RegistryStatus.PROC.getKey());
registry_1.setRegistryDesignation(RegistryDesignation.O.getKey());
registry_1.setRegistryDesignation(RegistryDesignation.L.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry_1.setRegistryUnit(RegistryUnit.T.getKey());
registry_1.setSessionId(sessionId);
@ -450,9 +505,9 @@ public class ReportServiceTest_KS {
registry_2.setSettlementDate(LocalDate.now());
registry_2.setGroupId(Long.MAX_VALUE);
registry_2.setClearingDate(LocalDate.now());
registry_2.setRegistryCode("TM_T");
registry_2.setRegistryCode("CM_T");
registry_2.setRegistryStatus(RegistryStatus.PROC.getKey());
registry_2.setRegistryDesignation(RegistryDesignation.T.getKey());
registry_2.setRegistryDesignation(RegistryDesignation.C.getKey());
registry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry_2.setRegistryUnit(RegistryUnit.T.getKey());
registry_2.setSessionId(sessionId);
@ -498,8 +553,8 @@ public class ReportServiceTest_KS {
registry_1.setClearingDate(LocalDate.now());
registry_1.setGroupId(Long.MAX_VALUE);
registry_1.setSettlementDate(LocalDate.now());
registry_1.setRegistryCode("TS_T");
registry_1.setRegistryDesignation(RegistryDesignation.T.getKey());
registry_1.setRegistryCode("CS_T");
registry_1.setRegistryDesignation(RegistryDesignation.C.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_1.setRegistryStatus(RegistryStatus.PROC.getKey());
registry_1.setRegistryUnit(RegistryUnit.T.getKey());
@ -515,8 +570,8 @@ public class ReportServiceTest_KS {
registry_2.setClearingDate(LocalDate.now());
registry_2.setGroupId(Long.MAX_VALUE);
registry_2.setSettlementDate(LocalDate.now());
registry_2.setRegistryCode("OS_T");
registry_2.setRegistryDesignation(RegistryDesignation.O.getKey());
registry_2.setRegistryCode("LS_T");
registry_2.setRegistryDesignation(RegistryDesignation.L.getKey());
registry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_2.setRegistryUnit(RegistryUnit.T.getKey());
registry_2.setRegistryStatus(RegistryStatus.PROC.getKey());

View file

@ -1,2 +1,2 @@
"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","VALUE","DATE"
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","22.22","07.07.2023"
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","22.22","02.10.2023"

1 FIRMID SESSION_ID SESSION_DATE ACCOUNT VALUE DATE
2 TRADING_CODE 2 20.01.1970T02:49:58 ACCOUNT 22.22 07.07.2023 02.10.2023

View file

@ -1,2 +1,2 @@
"FIRMID","ACCOUNT","TKR","DATE","REGISTER_CODE","REGISTER_NAME","OPEN_BALANCE","CHANGE_BALANCE","ADD_WITHDRAW","CLOSE_BALANCE","REMARKS","TRADE_NUM"
"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","01.08.2023","AM_T","AM_T_NAME","77.78","66.67","66.67","211.11","",""
"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","02.10.2023","AM_T","AM_T_NAME","77.78","66.67","111.00","255.44","",""

1 FIRMID ACCOUNT TKR DATE REGISTER_CODE REGISTER_NAME OPEN_BALANCE CHANGE_BALANCE ADD_WITHDRAW CLOSE_BALANCE REMARKS TRADE_NUM
2 TRADING_CODE ACCOUNT TRADING_CLEARING_REGISTRY 01.08.2023 02.10.2023 AM_T AM_T_NAME 77.78 66.67 66.67 111.00 211.11 255.44

View file

@ -1,2 +1,2 @@
"FIRMID","ACCOUNT","TKR","REGISTER_CODE","ADD_SUM","ADD_TIME","ADD_DATE","TRADE_NUM"
"1","","0008CAT00001","AM_T","7777.78","15:49:30","01.08.2023",""
"TRADING_CODE","ACCOUNT","0008CAT00001","DM_I","0.00","13:02:50","02.10.2023",""

1 FIRMID ACCOUNT TKR REGISTER_CODE ADD_SUM ADD_TIME ADD_DATE TRADE_NUM
2 1 TRADING_CODE ACCOUNT 0008CAT00001 AM_T DM_I 7777.78 0.00 15:49:30 13:02:50 01.08.2023 02.10.2023

View file

@ -1,2 +1,2 @@
"FIRMID","ACCOUNT","TKR","DATE","SECURITYID","REGISTER_CODE","REGISTER_NAME","OPEN_QUANTITY","CHANGE_QUANTITY","ADD_WITHDRAW_DEPO","CLOSE_QUANTITY","REMARKS","TRADE_NUM"
"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","01.08.2023","","AS_T","AS_T_NAME","78","67","67","211","",""
"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","02.10.2023","SECURITY_SYMBOL","AS_T","AS_T_NAME","78","67","111","255","",""

1 FIRMID ACCOUNT TKR DATE SECURITYID REGISTER_CODE REGISTER_NAME OPEN_QUANTITY CHANGE_QUANTITY ADD_WITHDRAW_DEPO CLOSE_QUANTITY REMARKS TRADE_NUM
2 TRADING_CODE ACCOUNT TRADING_CLEARING_REGISTRY 01.08.2023 02.10.2023 SECURITY_SYMBOL AS_T AS_T_NAME 78 67 67 111 211 255

View file

@ -1,2 +1,2 @@
"FIRMID","ACCOUNT","TKR","SECURITYID","REGISTER_CODE","ADD_QUANTITY","ADD_TIME","ADD_DATE","TRADE_NUM"
"1","ACCOUNT","TRADING_CLEARING_REGISTRY","value","AS_T","7778","15:52:33","01.08.2023",""
"TRADING_CODE","ACCOUNT","0008CAT00001","SECURITY_SYMBOL","DS_I","10","13:55:53","02.10.2023",""

1 FIRMID ACCOUNT TKR SECURITYID REGISTER_CODE ADD_QUANTITY ADD_TIME ADD_DATE TRADE_NUM
2 1 TRADING_CODE ACCOUNT TRADING_CLEARING_REGISTRY 0008CAT00001 value SECURITY_SYMBOL AS_T DS_I 7778 10 15:52:33 13:55:53 01.08.2023 02.10.2023

View file

@ -62,13 +62,13 @@ public class NotificationService extends QueueConsumer implements InitializingBe
private void notificationUpdateRequest(BaseRequest<NotificationUpdateRequest> notificationUpdateRequestBaseRequest) {
NotificationUpdateRequest request = notificationUpdateRequestBaseRequest.getRequestPayload();
Long id = request == null ? null : request.getId();
log.info("Starting notificationUpdateRequest {} processing by id: {} ...", notificationUpdateRequestBaseRequest.getId(), id);
log.info("Starting notificationUpdateRequest {} processing by id: {} from user {}", notificationUpdateRequestBaseRequest.getId(), id, notificationUpdateRequestBaseRequest.getUserId());
Notification notification = notificationMap.getSingleObjectByID(id);
if (notification == null) {
throw new NullPointerException("Notification by id:{" + id + "} is null!");
}
notification.setNotificationStatus(request.getNotificationStatus());
notification.setSenderId(request.getSenderId());
notification.setSenderId(notificationUpdateRequestBaseRequest.getUserId());
notification.setUpdated(Instant.now());
notificationMap.update(notification);
sendFeedbackString(notification);

View file

@ -105,6 +105,7 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation,
public final static RegistryTradingParams CM__;
public final static RegistryTradingParams LM__;
public final static RegistryTradingParams DMAU;
public final static RegistryTradingParams DMAI;
public final static RegistryTradingParams D__I;
public final static RegistryTradingParams D__V;
@ -218,6 +219,10 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation,
RegistryInstrumentType.M,
RegistryCapacity.A,
RegistryUnit.U);
DMAI = new RegistryTradingParams(RegistryDesignation.D,
RegistryInstrumentType.M,
RegistryCapacity.A,
RegistryUnit.I);
DS_I = new RegistryTradingParams(RegistryDesignation.D,
RegistryInstrumentType.S,
null,

View file

@ -25,6 +25,8 @@ public enum Task implements IEnumKey {
liquidationSession_LIQU("LIQU"),//Ликвидационная сессия по обязательтсвам участника
startSession_STRM("STRM"),//Начало торговой сессии секции МКР
terminationSession_ETRM("ETRM"),//Завершение торговой сессии секции МКР
startTime_SDEP("SDEP"),
endTime_EDEP("EDEP"),
startSession_SIPO("SIPO"),//Начало торговой сессии по первичным торгам
terminationSession_EIPO("EIPO"),//Завершение торговой сессии по первичным торгам
startSession_STRF("STRF"),//Начало торговой сессии по вторичным торгам

View file

@ -1,215 +0,0 @@
package ru.spcex.clearing.platform.messaging.domain.cud.registry;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.InstantDateTimeDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.InstantDateTimeSerializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
import java.time.Instant;
import java.time.LocalDate;
@Deprecated // Не используется. Возможно артефакт мёржа.
public class ContractRegisterNewRequest {
@JsonProperty
private String name;
@JsonProperty
private String number;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate issueDate;
@JsonProperty
private String companyFullName;
@JsonProperty
private Long companyId;
@JsonProperty
private String documentType;
@JsonProperty
private String issuePlace;
@JsonProperty
private String issuer;
@JsonProperty
private String issuerCode;
@JsonProperty
private String place;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate validFromDate;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate validToDate;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate closeDate;
@JsonProperty
private String comment;
@JsonProperty
private Long id;
@JsonSerialize(using = InstantDateTimeSerializer.class)
@JsonDeserialize(using = InstantDateTimeDeserializer.class)
@JsonProperty
private Instant createdAt;
@JsonSerialize(using = InstantDateTimeSerializer.class)
@JsonDeserialize(using = InstantDateTimeDeserializer.class)
@JsonProperty
private Instant updatedAt;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LocalDate getCloseDate() {
return closeDate;
}
public void setCloseDate(LocalDate closeDate) {
this.closeDate = closeDate;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Instant getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Instant createdAt) {
this.createdAt = createdAt;
}
public Instant getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Instant updatedAt) {
this.updatedAt = updatedAt;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public LocalDate getIssueDate() {
return issueDate;
}
public void setIssueDate(LocalDate issueDate) {
this.issueDate = issueDate;
}
public String getCompanyFullName() {
return companyFullName;
}
public void setCompanyFullName(String companyFullName) {
this.companyFullName = companyFullName;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getDocumentType() {
return documentType;
}
public void setDocumentType(String documentType) {
this.documentType = documentType;
}
public String getIssuePlace() {
return issuePlace;
}
public void setIssuePlace(String issuePlace) {
this.issuePlace = issuePlace;
}
public String getIssuer() {
return issuer;
}
public void setIssuer(String issuer) {
this.issuer = issuer;
}
public String getIssuerCode() {
return issuerCode;
}
public void setIssuerCode(String issuerCode) {
this.issuerCode = issuerCode;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public LocalDate getValidFromDate() {
return validFromDate;
}
public void setValidFromDate(LocalDate validFromDate) {
this.validFromDate = validFromDate;
}
public LocalDate getValidToDate() {
return validToDate;
}
public void setValidToDate(LocalDate validToDate) {
this.validToDate = validToDate;
}
}

View file

@ -1,5 +1,6 @@
package ru.spcex.clearing.platform.messaging.domain.cud.registry;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@ -103,6 +104,7 @@ public class ExecutionRegisterOnSaveRequest {
@JsonProperty
private Instant exchangeExecutionMicroseconds;
@JsonIgnore
public boolean isExecutionFond() {
return exchangeOrderId != null || settlementAmount != null || comment != null || clientCodeId != null || settlementCode != null || settlementDate != null || exchangeExecutionMicroseconds != null;
}

View file

@ -9,9 +9,6 @@ public class NotificationUpdateRequest {
@JsonProperty
public String notificationStatus;
@JsonProperty
public Long senderId;
public Long getId() {
return id;
}
@ -27,12 +24,4 @@ public class NotificationUpdateRequest {
public void setNotificationStatus(String notificationStatus) {
this.notificationStatus = notificationStatus;
}
public Long getSenderId() {
return senderId;
}
public void setSenderId(Long senderId) {
this.senderId = senderId;
}
}