Merge branch 'dev' into tmp_testutil
This commit is contained in:
commit
b15334d8ac
94 changed files with 2228 additions and 1361 deletions
|
|
@ -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
|
||||
);
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ public enum AccountError implements IErrorEnumId {
|
|||
ClearingCategoryNotFound(5019L),
|
||||
ClearingCompanySymbolNotFound(5022L), // Для компании %s отсутствует клиринговый код».
|
||||
AccountForTradingClearingRegistryAlreadyUsed(5023L),
|
||||
AccountFieldNotSet(5024L),
|
||||
TradingClearingRegistryNotFound(3022L),
|
||||
;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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.");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<>();
|
||||
|
|
|
|||
|
|
@ -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 + "}";
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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("ТКР"));
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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,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,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,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,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",""
|
||||
|
|
|
|||
|
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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"),//Начало торговой сессии по вторичным торгам
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue