Merge branch 'dev' into tmp_testutil

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

View file

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

View file

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

View file

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

View file

@ -55,6 +55,8 @@ public class AccountService extends QueueConsumer implements InitializingBean {
private final IMessageResolver messageResolver; private final IMessageResolver messageResolver;
private final UserRoleVerification userRoleVerification; private final UserRoleVerification userRoleVerification;
private final ValidationHelper validationHelper; private final ValidationHelper validationHelper;
private final AccountHelper accountHelper;
private final InformationAccountService informationAccountService;
private final Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator; private final Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator;
private final Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator; private final Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator;
private final Function<CommonIdRequest, IValidator> accountBlockRequestValidator; private final Function<CommonIdRequest, IValidator> accountBlockRequestValidator;
@ -67,6 +69,8 @@ public class AccountService extends QueueConsumer implements InitializingBean {
IMessageResolver messageResolver, IMessageResolver messageResolver,
UserRoleVerification userRoleVerification, UserRoleVerification userRoleVerification,
ValidationHelper validationHelper, ValidationHelper validationHelper,
AccountHelper accountHelper,
InformationAccountService informationAccountService,
@Qualifier("correspondentAccountNewRequestValidator") @Qualifier("correspondentAccountNewRequestValidator")
Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator, Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator,
@Qualifier("correspondentAccountUpdateRequestValidator") @Qualifier("correspondentAccountUpdateRequestValidator")
@ -74,6 +78,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
@Qualifier("correspondentAccountBlockRequestValidator") @Qualifier("correspondentAccountBlockRequestValidator")
Function<CommonIdRequest, IValidator> accountBlockRequestValidator) { Function<CommonIdRequest, IValidator> accountBlockRequestValidator) {
super(kafkaQueue, kafkaProducer); super(kafkaQueue, kafkaProducer);
this.accountHelper = accountHelper;
this.imdgProvider = imdgProvider; this.imdgProvider = imdgProvider;
this.accountMap = imdgProvider.getImdg( this.accountMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Account, Account.class IMDGDistributedNames.Map_Account, Account.class
@ -88,6 +93,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
this.messageResolver = messageResolver; this.messageResolver = messageResolver;
this.userRoleVerification = userRoleVerification; this.userRoleVerification = userRoleVerification;
this.validationHelper = validationHelper; this.validationHelper = validationHelper;
this.informationAccountService = informationAccountService;
this.accountNewRequestValidator = accountNewRequestValidator; this.accountNewRequestValidator = accountNewRequestValidator;
this.accountUpdateRequestValidator = accountUpdateRequestValidator; this.accountUpdateRequestValidator = accountUpdateRequestValidator;
this.accountBlockRequestValidator = accountBlockRequestValidator; this.accountBlockRequestValidator = accountBlockRequestValidator;
@ -128,6 +134,12 @@ public class AccountService extends QueueConsumer implements InitializingBean {
Account account = new Account(); Account account = new Account();
account.setCompanyId(req.getCompanyId()); account.setCompanyId(req.getCompanyId());
account.setAccount(req.getAccount()); 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()); account.setAccountType(req.getAccountType());
if (req.getStatus() == null) { if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey()); account.setStatus(WorkflowStatus.Active.getKey());
@ -138,7 +150,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
account.setCreated(now); account.setCreated(now);
account.setUpdated(now); account.setUpdated(now);
requestInfoUpdate = fillAccountFromRelation(account, userRequest.getId(), false); requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), false);
if (requestInfoUpdate != null) return requestInfoUpdate; if (requestInfoUpdate != null) return requestInfoUpdate;
Long newId = null; Long newId = null;
@ -306,60 +318,6 @@ public class AccountService extends QueueConsumer implements InitializingBean {
return null; 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) { private RequestInfoUpdate makeError(Long reqId, AccountError accountError, Object... args) {
String errMsg = messageResolver.resolve(new EnumMessage(accountError, args)); String errMsg = messageResolver.resolve(new EnumMessage(accountError, args));
return new RequestInfoUpdate() return new RequestInfoUpdate()

View file

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

View file

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

View file

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

View file

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

View file

@ -23,6 +23,7 @@ import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig; 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.config.validation.ValidationConfig;
import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.account.utils.MatcherFactory;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -64,6 +65,9 @@ import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID;
ValidationConfig.class, ValidationConfig.class,
AccountValidationConfig.class, AccountValidationConfig.class,
AccountService.class, AccountService.class,
AccountHelper.class,
InformationAccountService.class,
InformationAccountValidationConfig.class,
ImdgTestConfig.class, ImdgTestConfig.class,
KafkaTestConfig.class}) KafkaTestConfig.class})
class AccountServiceTest { class AccountServiceTest {
@ -209,8 +213,16 @@ class AccountServiceTest {
waitingSendAndCheckRecord(0L, mockProducer); waitingSendAndCheckRecord(0L, mockProducer);
Account resultUpdating = accountImdg.getSingleObjectByID(accountId); Account resultUpdating = accountImdg.getSingleObjectByID(accountId);
existAccount.setUpdated(resultUpdating.getUpdated()); Account expectAccount = new Account();
ACCOUNT_MATCHER.assertMatch(resultUpdating, existAccount); 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); accountImdg.delete(resultUpdating);
} }

View file

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

View file

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

View file

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

View file

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

View file

@ -103,8 +103,9 @@ class SDFProcessServiceTest {
void parseSdf52Status() { void parseSdf52Status() {
Assertions.assertEquals(AccountStatus.BLOCKED, sdfProcessService.parseSdf52Status(0L)); Assertions.assertEquals(AccountStatus.BLOCKED, sdfProcessService.parseSdf52Status(0L));
Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(1L)); Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(1L));
Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(3L));
Assertions.assertEquals(AccountStatus.CLOSE, sdfProcessService.parseSdf52Status(2L)); 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)); Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(null));
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -52,7 +52,10 @@ public class AnltSearcher {
ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder(); ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder();
ImdgPredicate tcrPredicate = pb.and( ImdgPredicate tcrPredicate = pb.and(
pb.equals("code", commentTcrStripped), 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); TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByPredicate(tcrPredicate);

View file

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

View file

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

View file

@ -320,26 +320,51 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
registryD.getId()); registryD.getId());
sessionIsNeededFlag.set(true); sessionIsNeededFlag.set(true);
} else if (tm_tFound.isPresent()) { } else if (tm_tFound.isPresent()) {
Registry tm_t = tm_tFound.get(); Optional<Registry> dm_xFound = RegistrySearch.builder(registryImdg)
Registry registryD = copyRegD(tm_t, stmt, RegistryUnit.X); .rgsCode(RegistryTradingParams.DM_X)
registryImdg.insert(registryD); .companyId(company.getId())
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", .accountId(account.getId())
stmt.getId(), .contract(stmt.getContract())
sdf57.getSpecif(), .statusNotOk()
tm_t.getId(), .find();
registryD.getId()); if (dm_xFound.isEmpty()) {
sessionIsNeededFlag.set(true); 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()); stmt.setOperationStatus(OperationStatus.Executed.getKey());
statementImdg.update(stmt); statementImdg.update(stmt);
log.debug("stmt.id={} status -> {}", stmt.getId(), OperationStatus.Executed.getKey()); log.debug("stmt.id={} status -> {}", stmt.getId(), OperationStatus.Executed.getKey());
if (!dm_tWasCreated && timeService.isTradingTime() && InOutDirection.in.equalsByKey(stmt.getInOutDirection())) { if (!dm_tWasCreated && timeService.isTradingTime() && InOutDirection.in.equalsByKey(stmt.getInOutDirection())) {
log.trace("sending gateway request for stmt.id={}", stmt.getId()); if (TextUtil.isEmpty(asts.a__t().getTradingClearingRegistry())) {
kafka.sendRequestToQueue(Consts.ASSET_OPERATION, log.trace("stmt.id={} {}.id={} TCR is empty, skipping gateway request",
gatewayRequest(stmt, stmt.getId(), asts.a__t().getRegistryCode(), asts.a__t().getId());
company.getTradingCode(), } else {
asts.a__t().getTradingClearingRegistry())); 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); return Optional.of(asts);
} else { } else {
@ -610,6 +635,14 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
return this; 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() { private Optional<Registry> find() {
return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(predicate)); return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(predicate));
} }

View file

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

View file

@ -65,7 +65,8 @@ public class AssetTBFProcessing {
.map(rgs -> safeBD(rgs.getBalance())) .map(rgs -> safeBD(rgs.getBalance()))
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
Instant now = Instant.now(); 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_b.setBalance(am_b.getBalance().subtract(sum));
am_f.setBalance(am_t.getBalance().subtract(am_b.getBalance()).add(d__iSum).subtract(d__vSum)); am_f.setBalance(am_t.getBalance().subtract(am_b.getBalance()).add(d__iSum).subtract(d__vSum));
am_b.setUpdated(now); am_b.setUpdated(now);
@ -73,6 +74,14 @@ public class AssetTBFProcessing {
rgsImdg.update(am_b); rgsImdg.update(am_b);
rgsImdg.update(am_f); 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, public Collection<Registry> searchByParams(String account,
@ -162,6 +171,46 @@ public class AssetTBFProcessing {
return new AssetTrio(asf, asb, ast); 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, public Optional<Registry> searchByTcrCompanyAccount(Registry rgs,
RegistryTradingParams params) { RegistryTradingParams params) {
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
@ -169,7 +218,8 @@ public class AssetTBFProcessing {
pb.sql(RegistryCodeSqlBuilder.getInstance(params).build()), pb.sql(RegistryCodeSqlBuilder.getInstance(params).build()),
pb.equals("tradingClearingRegistryId", rgs.getTradingClearingRegistryId()), pb.equals("tradingClearingRegistryId", rgs.getTradingClearingRegistryId()),
pb.equals("companyId", rgs.getCompanyId()), 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)); return Optional.ofNullable(rgsImdg.getFirstObjectByPredicate(prdct));
} }

View file

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

View file

@ -25,7 +25,7 @@ public class TradingTimeService {
this.plannerAllTodayImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class); this.plannerAllTodayImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class);
} }
public boolean isTradingTime() { private boolean isTradingTime(Task startTime, Task endTime) {
ImdgPredicateBuilder pb = plannerAllTodayImdg.predicateBuilder(); ImdgPredicateBuilder pb = plannerAllTodayImdg.predicateBuilder();
Function<Task, Optional<PlannerAllToday>> plannerByTask = task -> { Function<Task, Optional<PlannerAllToday>> plannerByTask = task -> {
ImdgPredicate plannerPrdct = pb.and( ImdgPredicate plannerPrdct = pb.and(
@ -34,19 +34,28 @@ public class TradingTimeService {
); );
return Optional.ofNullable(plannerAllTodayImdg.getFirstObjectByPredicate(plannerPrdct)); return Optional.ofNullable(plannerAllTodayImdg.getFirstObjectByPredicate(plannerPrdct));
}; };
LocalTime startTradingTime = plannerByTask.apply(Task.createRegistry_STRS) LocalTime startTradingTime = plannerByTask.apply(startTime)
.map(PlannerAllToday::getTaskTime) .map(PlannerAllToday::getTaskTime)
.orElse(null); .orElse(null);
LocalTime endTradingTime = plannerByTask.apply(Task.createRegistry_ETRS) LocalTime endTradingTime = plannerByTask.apply(endTime)
.map(PlannerAllToday::getTaskTime) .map(PlannerAllToday::getTaskTime)
.orElse(null); .orElse(null);
if (startTradingTime == null || endTradingTime == 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; return false;
} }
LocalTime now = LocalTime.now(); LocalTime now = LocalTime.now();
boolean isTradingTime = !now.isBefore(startTradingTime) && !now.isAfter(endTradingTime); 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; return isTradingTime;
} }
public boolean isTradingTime() {
return isTradingTime(Task.createRegistry_STRS, Task.createRegistry_ETRS);
}
public boolean timeForXdep() {
return isTradingTime(Task.startTime_SDEP, Task.endTime_EDEP);
}
} }

View file

@ -84,7 +84,7 @@ public enum IdentificationFundsValidationRule implements IValidationRule<ImdgVal
if (tcr == null) { if (tcr == null) {
return of(ClearingError.TCRegistryNotFound, validatedObject.getTradingClearingRegistryId()); 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()); return of(ClearingError.TradingClearingRegistryNotActive, tcr.getCode());
} }

View file

@ -1,56 +1,122 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest;
import ru.spcex.clearing.service.registry.RegistryManager; import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryStatus; 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.Imdg;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.Stored; import ru.spcex.platform.imdg.validation.Stored;
import ru.spcex.platform.utils.enumeration.EnumMessage; 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 ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Optional; 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>> { public enum ReturnDepositValidationRule implements IValidationRule<ImdgValidationContext<RegistryReturnDepositRequest>> {
RegistryCodeCheck() { RgsWronCodeCheck() {
@Override @Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) { public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) {
Registry rgs = context.getStoredObject(Stored.PresentById); Registry rgs = context.getStoredObject(Stored.PresentById);
if (!RegistryDesignation.T.equalsByKey(rgs.getRegistryDesignation()) if (!equalsByCode(RegistryTradingParams.TM_T, rgs)) { //!equalsByCode(RegistryTradingParams.OM_T, rgs)
|| !RegistryInstrumentType.M.equalsByKey(rgs.getRegistryInstrumentType()) return of(ClearingError.RgsWrongCode, "{}.id={}", rgs.getRegistryCode(), rgs.getId());
|| !RegistryUnit.T.equalsByKey(rgs.getRegistryUnit())) {
return of(ClearingError.RecordNotFoundInDictionary, "TM*T", "Registry");
} }
return empty(); 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 @Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) { public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) {
Registry rgs = context.getStoredObject(Stored.PresentById); Registry rgs = context.getStoredObject(Stored.PresentById);
RegistryReturnDepositRequest request = context.getValidatedObject(); 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 of(ClearingError.IdentifiedFundsExceedObligations);
} }
return Optional.empty(); return Optional.empty();
} }
}, DmxCheck() { }, Dm_Check() {
@Override @Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryReturnDepositRequest> context) { 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); Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
RegistryManager rgsMng = new RegistryManager(rgsImdg); if (TextUtil.isEmpty(rgs.getContract())) {
Optional<Registry> dmx = rgsMng.searchDmxByCompanyId(rgs); return empty();
if (dmx.isPresent() && RegistryStatus.OK.equalsByKey(dmx.get().getRegistryStatus()) ) { }
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); return of(ClearingError.ObligationsAlreadyCalculated);
} }
dmx.ifPresent(dmxRgs -> context.storeObject(ValidationStored.ReturnDepositDmx, dmxRgs)); if (dm__ != null) {
return Optional.empty(); context.storeObject(ValidationStored.ReturnDepositDm__, dm__);
}
return empty();
} }
}; };

View file

@ -14,12 +14,14 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collection; import java.util.Collection;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
public enum SplitDepositRequestValidationRule implements IValidationRule<ImdgValidationContext<RegistrySplitDepositActionRequest>> { public enum SplitDepositRequestValidationRule implements IValidationRule<ImdgValidationContext<RegistrySplitDepositActionRequest>> {
PositiveAmount() { PositiveAmount() {
@ -78,6 +80,51 @@ public enum SplitDepositRequestValidationRule implements IValidationRule<ImdgVal
return Optional.of(new EnumMessage(ClearingError.WrongFieldValue, "RefundDate")); 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(); return empty();
} }
}; };

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,5 @@
package ru.spcex.clearing.session.stage.impl; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -55,16 +53,18 @@ public class InspectionObligations implements ISessionStage {
private final AssetTBFProcessing assets; private final AssetTBFProcessing assets;
private final GatewayRequester gateway; private final GatewayRequester gateway;
private final TradingTimeService tradingTimeService; private final TradingTimeService tradingTimeService;
private final PlanBalanceCalc planBalanceCalc;
@Autowired @Autowired
public InspectionObligations(ImdgProvider imdgProvider, public InspectionObligations(ImdgProvider imdgProvider,
RegistryManager registryManager, RegistryManager registryManager,
AssetTBFProcessing assets, AssetTBFProcessing assets,
GatewayRequester gateway) { GatewayRequester gateway, PlanBalanceCalc planBalanceCalc) {
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.registryManager = registryManager; this.registryManager = registryManager;
this.assets = assets; this.assets = assets;
this.gateway = gateway; this.gateway = gateway;
this.planBalanceCalc = planBalanceCalc;
this.gateway.setName("InspectionObligations|OM*T"); this.gateway.setName("InspectionObligations|OM*T");
this.tradingTimeService = new TradingTimeService(imdgProvider); this.tradingTimeService = new TradingTimeService(imdgProvider);
} }
@ -204,52 +204,11 @@ public class InspectionObligations implements ISessionStage {
} }
} }
stageRevision2(sessionId); planBalanceCalc.stageRevision2(sessionId);
return new StageResult(null, true); 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) { private String searchAssetsByObligationSql(Registry obligation) {
RegistryTradingParams counterRegistryTradingParams = null; RegistryTradingParams counterRegistryTradingParams = null;
if (IEnumKey.getEnumByKey(RegistryInstrumentType.class, obligation.getRegistryInstrumentType()) == RegistryInstrumentType.S) { if (IEnumKey.getEnumByKey(RegistryInstrumentType.class, obligation.getRegistryInstrumentType()) == RegistryInstrumentType.S) {

View file

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

View file

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

View file

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

View file

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

View file

@ -179,7 +179,11 @@ public class ClearingMemberCategoryService extends QueueConsumer implements Init
try { try {
Imdg<ClearingMemberCategory> txClearingMemberCategoryMap = transaction.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); Imdg<ClearingMemberCategory> txClearingMemberCategoryMap = transaction.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
txClearingMemberCategoryMap.delete(clearingMemberCategory); // далить до cancelRelation внутри транзакции 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; txOk = true;
} finally { } finally {
if (txOk) if (txOk)

View file

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

View file

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

View file

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

View file

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

View file

@ -1,4 +1,4 @@
-- DB version: 3.8.0.55 -- DB version: 3.8.0.58
-- DATA version: 3.5.0.13 -- 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 (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 (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; 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 (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 (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; 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 (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 (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; INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5800, 'DBFE', 'Общая ошибка модуля dbf-exporter.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; 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.company.CompanySymbols;
import ru.clearing.classes.statics.data.execution.ExecutionCommon; import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit; 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.register.ExecutionRegister;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; 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.registry.ExecutionRegisterOnSaveRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer; 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.CompanySymbol;
import ru.spcex.platform.enumeration.MoneyFlowSide; 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.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; 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 ru.spcex.platform.utils.validation.IValidator;
import java.text.MessageFormat; import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Collection; import java.util.Collection;
@ -45,7 +47,9 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
private final Imdg<ExecutionFond> executionFondMap; private final Imdg<ExecutionFond> executionFondMap;
private final Imdg<ExecutionDeposit> executionDepositMap; private final Imdg<ExecutionDeposit> executionDepositMap;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryMap; private final Imdg<TradingClearingRegistry> tradingClearingRegistryMap;
private final Imdg<Account> accountImdg;
private final Function<Map<String, ?>, IValidator> fieldValuesValidator; private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<ExecutionRegister> preClearMap;
@Autowired @Autowired
public ExecutionRegisterService(Consumer<String, Object> kafkaQueue, 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.executionFondMap = imdgProvider.getImdg(Map_ExecutionFond, ExecutionFond.class);
this.executionDepositMap = imdgProvider.getImdg(Map_ExecutionDeposit, ExecutionDeposit.class); this.executionDepositMap = imdgProvider.getImdg(Map_ExecutionDeposit, ExecutionDeposit.class);
this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class); this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.accountImdg = imdgProvider.getImdg(Map_Account, Account.class);
this.fieldValuesValidator = fieldValuesValidator; this.fieldValuesValidator = fieldValuesValidator;
preClearMap = PreClearMap.instanceForLocalDateField(executionRegisterMap, "clearingDate");
} }
@Override @Override
@ -66,9 +72,13 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
callback(LauncherCommandRequest.class) callback(LauncherCommandRequest.class)
.setConsumer(this::executionRegisterNew) .setConsumer(this::executionRegisterNew)
.forDestination(createRegistry_ECNR.topic(), callbacks::put); .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(); init();
} }
@ -77,19 +87,152 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
log.debug("ExecutionRegisterNewRequest received"); log.debug("ExecutionRegisterNewRequest received");
Collection<ExecutionFond> collectionFond = executionFondMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow)); Collection<ExecutionFond> collectionFond = executionFondMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow));
Collection<ExecutionDeposit> collectionDeposit = executionDepositMap.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 -> { collectionFond.forEach(x -> {
if (isDuplicateInMap(x).isEmpty()) { insertExecutionRegister(true, x);
insertExecutionRegister(true, x);
}
}); });
collectionDeposit.forEach(x -> { collectionDeposit.forEach(x -> {
if (isDuplicateInMap(x).isPresent()) { insertExecutionRegister(false, x);
insertExecutionRegister(false, x);
}
}); });
log.debug("successfully processed..."); 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) { public void executionRegisterOnSavingOfTrade(BaseRequest<ExecutionRegisterOnSaveRequest> userRequest) {
ExecutionRegisterOnSaveRequest request = userRequest.getRequestPayload(); ExecutionRegisterOnSaveRequest request = userRequest.getRequestPayload();
ExecutionCommon common = setUpExecutionCommon(request); 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) { private void updateExecutionRegister(boolean isFond, ExecutionCommon common, ExecutionRegister registerToUpdate) {
log.trace("Started updating ExecutionRegister entity..."); log.trace("Started updating ExecutionRegister entity...");
registerToUpdate.setSecurityId(common.getSecurityId()); 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()); 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) { private ExecutionCommon setUpExecutionCommon(ExecutionRegisterOnSaveRequest request) {
ExecutionFond fond = null; ExecutionFond fond = null;
ExecutionDeposit deposit = null; ExecutionDeposit deposit = null;
@ -257,40 +307,18 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
return common; return common;
} }
private Optional<CompanySymbols> getCompanySymbolsByCompanyIdAndCompanySymbol(String companySymbol, Long companyId) { @Deprecated
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);
}
@Override @Override
public Optional<ExecutionRegister> isDuplicateInMap(ExecutionCommon entity) { public Optional<ExecutionRegister> isDuplicateInMap(ExecutionCommon entity) {
Map<String, ? extends Comparable<?>> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(), return Optional.empty();
"tradingDate", LocalDate.now()); //clarify timezone // Map<String, ? extends Comparable<?>> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(),
Optional<EnumMessage> message = fieldValuesValidator.apply(map).tillFirstError(); // "tradingDate", LocalDate.now()); //clarify timezone
if (message.isPresent()) { // Optional<EnumMessage> message = fieldValuesValidator.apply(map).tillFirstError();
log.warn("Illegal value in map for request to imdg: {}", message.get()); // if (message.isPresent()) {
throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); // 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.ofNullable(executionRegisterMap.getSingleObjectByFieldValues(map));
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -4,6 +4,7 @@ import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam; import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.enumeration.Allowed;
import ru.spcex.platform.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.enumeration.ReportKeys;
import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
@ -36,7 +37,10 @@ public class ExecutedDealReportBuilder_INFTYPE_4 extends ExecutedDealReportBuild
pb.and( pb.and(
pb.equals("coverageStatus", Allowed.DENIED.getKey()), pb.equals("coverageStatus", Allowed.DENIED.getKey()),
pb.equals("settlementDate", 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())
)
) )
); );
} }

View file

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

View file

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

View file

@ -1,11 +1,8 @@
package ru.spcex.clearing.reports.reports.ks; package ru.spcex.clearing.reports.reports.ks;
import org.springframework.stereotype.Component; 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.company.Company;
import ru.clearing.classes.statics.data.registry.Registry; 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.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder; import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams; 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.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; 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.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Component @Component
public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyParams, KSRepCashRegisterSumsReport> { 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<Company> companyImdg;
private final Imdg<Account> accountImdg; private final Imdg<Registry> registryImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private List<KSRepCashRegisterSumsReport> rows = null; private List<KSRepCashRegisterSumsReport> rows = null;
public KSRepCashRegisterSumsReportBuilder(ImdgProvider imdgProvider) { 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); registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
} }
@Override @Override
@ -69,196 +62,51 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
@Override @Override
protected void collect(EmptyParams params) { protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.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( ImdgPredicate finalPredicate = pb.and(
pb.greatEqual("created", instantNow.truncatedTo(ChronoUnit.DAYS)), pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("created", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)), pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("inOutSDfType", InOutSDfType.type57.getKey()), pb.equals("registryStatus", RegistryStatus.OK.getKey()),
pb.equals("operationStatus", OperationStatus.Executed.getKey()) pb.notNull("tradingClearingRegistry"),
registryPredicate
); );
Collection<Statement> statements = statementImdg.getCollectionObjectsByPredicate(finalPredicate); Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
log.debug("Found {} Statements by query: {}", statements.size(), finalPredicate); log.debug("Found {} registries by query: {}", registries.size(), finalPredicate);
rows = new ArrayList<>(statements.size()); rows = new ArrayList<>(registries.size());
for (Statement statement : statements) { for (Registry registry : registries) {
if (statement.getAmount() == null) { Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
log.warn("Statement id={} has null amount, statement was skipped", statement.getId()); if (company == null) {
log.warn("For registry id = {} company with id = {} not found, registry was skipped",
registry.getId(),
registry.getCompanyId());
continue; continue;
} }
try { if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
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;
}
}
Company company; String firmId = registry.getTradingCode();
if (searchTCRAsInfo) { String account = registry.getAccount();
company = companyImdg.getSingleObjectByID(tkr.getCompanyId()); String tkr = registry.getTradingClearingRegistry();
if (company == null) { String tradeNum = "";
log.warn("For statement id = {}, tcr.id={}, company with id = {} not found, statement was skipped", String registerCode = registry.getRegistryCode();
statement.getId(), BigDecimal addSum = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO;
tkr.getId(), Instant addTime = registry.getUpdated();
tkr.getCompanyId()); LocalDate addDate = LocalDate.now();
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;
}
KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport();
ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder(); ksRepCashRegisterSumsReport.setFirmId(firmId);
ImdgPredicate registryQuery; ksRepCashRegisterSumsReport.setAccount(account);
if (searchTCRAsInfo) { ksRepCashRegisterSumsReport.setTkr(tkr);
registryQuery = pbRegistry.and( ksRepCashRegisterSumsReport.setTradeNum(tradeNum);
pbRegistry.equals("tradingClearingRegistry", tkr.getCode()), ksRepCashRegisterSumsReport.setRegisterCode(registerCode);
pbRegistry.in("accountType", AccountType.Clrn.getKey(), AccountType.Info.getKey()), ksRepCashRegisterSumsReport.setAddSum(addSum);
RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).buildPredicate(pbRegistry) ksRepCashRegisterSumsReport.setAddTime(LocalTime.ofInstant(addTime, getReportZoneId()));
); ksRepCashRegisterSumsReport.setAddDate(addDate);
} else { rows.add(ksRepCashRegisterSumsReport);
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);
}
} }
} }
protected String parseCodeFromStatementComment(String comment) {
if (comment == null)
return null;
int i = comment.lastIndexOf("ТКР");
String code = comment;
if (i >= 0) {
code = code.substring(i + 3).trim();
} else {
return null;
}
i = -1;
for (String end : Arrays.asList(".", ";", " ")) {
int p = code.indexOf(end);
if (p > 0 && (i <= 0 || i > p)) i = p;
}
if (i > 0) {
code = code.substring(0, i);
}
return code;
}
} }

View file

@ -114,9 +114,22 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
BigDecimal settleDebit = registry.getSettledDebit() != null ? registry.getSettledDebit() : BigDecimal.ZERO; BigDecimal settleDebit = registry.getSettledDebit() != null ? registry.getSettledDebit() : BigDecimal.ZERO;
ksRepCashRegistersReport.setChangeBalance(settleCredit.subtract(settleDebit)); ksRepCashRegistersReport.setChangeBalance(settleCredit.subtract(settleDebit));
BigDecimal credit = registry.getCredit() != null ? registry.getCredit() : BigDecimal.ZERO; registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DMAI).buildPredicate(pb);
BigDecimal debit = registry.getDebit() != null ? registry.getDebit() : BigDecimal.ZERO; Collection<Registry> registriesForAddWithdraw = registryImdg.getCollectionObjectsByPredicate(
ksRepCashRegistersReport.setAddWithdraw(credit.subtract(debit)); 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() BigDecimal closeBalance = ksRepCashRegistersReport.getOpenBalance()
.add(ksRepCashRegistersReport.getChangeBalance()) .add(ksRepCashRegistersReport.getChangeBalance())

View file

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

View file

@ -2,12 +2,7 @@ package ru.spcex.clearing.reports.reports.ks;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company; 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.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.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder; import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams; 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.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; 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.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
@ -30,22 +25,14 @@ import java.util.List;
@Component @Component
public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepDepoRegisterQuantitiesReport> { public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepDepoRegisterQuantitiesReport> {
private final Imdg<Statement> statementImdg;
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg; 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; private List<KSRepDepoRegisterQuantitiesReport> rows = null;
public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) { public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) {
statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.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 @Override
@ -75,126 +62,55 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
@Override @Override
protected void collect(EmptyParams params) { protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.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( ImdgPredicate finalPredicate = pb.and(
pb.greatEqual("created", instantNow.truncatedTo(ChronoUnit.DAYS)), pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("created", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)), pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("inOutSDfType", InOutSDfType.type21.getKey()), pb.equals("registryStatus", RegistryStatus.OK.getKey()),
pb.equals("operationStatus", OperationStatus.Executed.getKey()), pb.notNull("tradingClearingRegistry"),
pb.notNull("amount") registryPredicate
); );
Collection<Statement> statements = statementImdg.getCollectionObjectsByPredicate(finalPredicate); Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
log.debug("Found {} Statement by query: {}", statements.size(), finalPredicate); log.debug("Found {} registries by query: {}", registries.size(), finalPredicate);
rows = new ArrayList<>(registries.size());
rows = new ArrayList<>(statements.size()); for (Registry registry : registries) {
for (Statement statement : statements) { Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
try { if (company == null) {
Company company = companyImdg.getSingleObjectByID(statement.getAddresseeId()); log.warn("For registry id = {} company with id = {} not found, registry was skipped",
if (company == null) { registry.getId(),
log.warn("For statement id = {} company with id = {} not found, statement was skipped", registry.getCompanyId());
statement.getId(), continue;
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);
} }
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode();
String account = registry.getAccount();
String tkr = registry.getTradingClearingRegistry();
String tradeNum = "";
String securityId = registry.getSecuritySymbol();
String registerCode = registry.getRegistryCode();
BigDecimal addQuantity = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO;
Instant addTime = registry.getUpdated();
LocalDate addDate = LocalDate.now();
KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport();
ksRepDepoRegisterQuantitiesReport.setFirmId(firmId);
ksRepDepoRegisterQuantitiesReport.setAccount(account);
ksRepDepoRegisterQuantitiesReport.setTkr(tkr);
ksRepDepoRegisterQuantitiesReport.setTradeNum(tradeNum);
ksRepDepoRegisterQuantitiesReport.setSecurityId(securityId);
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registerCode);
ksRepDepoRegisterQuantitiesReport.setAddQuantity(addQuantity);
ksRepDepoRegisterQuantitiesReport.setAddTime(LocalTime.ofInstant(addTime, getReportZoneId()));
ksRepDepoRegisterQuantitiesReport.setAddDate(addDate);
rows.add(ksRepDepoRegisterQuantitiesReport);
} }
} }
private Security getSecurityWithSecuritySymbolForId(Long securityId) {
Security security;
security = equitySecurityImdg.getFirstObjectByPredicate(
equitySecurityImdg.predicateBuilder().and(
equitySecurityImdg.predicateBuilder().equals("securityId", securityId),
equitySecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
if (security == null) {
security = fixedIncomeSecurityImdg.getFirstObjectByPredicate(
fixedIncomeSecurityImdg.predicateBuilder().and(
fixedIncomeSecurityImdg.predicateBuilder().equals("securityId", securityId),
fixedIncomeSecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
}
if (security == null)
security = moneyMarketSecurityImdg.getFirstObjectByPredicate(
moneyMarketSecurityImdg.predicateBuilder().and(
moneyMarketSecurityImdg.predicateBuilder().equals("securityId", securityId),
moneyMarketSecurityImdg.predicateBuilder().notNull("securitySymbol")
)
);
return security;
}
} }

View file

@ -69,9 +69,9 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
Instant instantNow = Instant.now(); Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); 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( ImdgPredicate finalPredicate = pb.and(
pb.sql(sql), registryPredicate,
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)), pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("accountType", AccountType.Depo.getKey()), 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; BigDecimal settledDebit = registry.getSettledDebit() != null ? registry.getSettledDebit() : BigDecimal.ZERO;
ksRepDepoRegistersReport.setChangeQuantity(settledCredit.subtract(settledDebit)); ksRepDepoRegistersReport.setChangeQuantity(settledCredit.subtract(settledDebit));
BigDecimal credit = registry.getCredit() != null ? registry.getCredit() : BigDecimal.ZERO; registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DMAI).buildPredicate(pb);
BigDecimal debit = registry.getDebit() != null ? registry.getDebit() : BigDecimal.ZERO; Collection<Registry> registriesForAddWithdraw = registryImdg.getCollectionObjectsByPredicate(
ksRepDepoRegistersReport.setAddWithdrawDepo(credit.subtract(debit)); 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() BigDecimal closeBalance = ksRepDepoRegistersReport.getOpenQuantity()
.add(ksRepDepoRegistersReport.getChangeQuantity()) .add(ksRepDepoRegistersReport.getChangeQuantity())

View file

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

View file

@ -129,6 +129,8 @@ public class ReportServiceTest_KS {
Registry registry = new Registry(); Registry registry = new Registry();
registry.setCompanyId(COMPANY_ID); registry.setCompanyId(COMPANY_ID);
registry.setSecurityId(777L);
registry.setAccountId(888L);
registry.setRegistryCode("AM_T"); registry.setRegistryCode("AM_T");
registry.setRegistryDesignation(RegistryDesignation.A.getKey()); registry.setRegistryDesignation(RegistryDesignation.A.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
@ -146,6 +148,48 @@ public class ReportServiceTest_KS {
registry.setCloseBalance(BigDecimal.valueOf(11.11111111)); registry.setCloseBalance(BigDecimal.valueOf(11.11111111));
registryImdg.insert(registry); 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); String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -162,6 +206,9 @@ public class ReportServiceTest_KS {
registryCodeDictionaryImdg.delete(registryCodeDictionary); registryCodeDictionaryImdg.delete(registryCodeDictionary);
registryImdg.delete(registry); registryImdg.delete(registry);
registryImdg.delete(addWithdrawRegistry_1);
registryImdg.delete(addWithdrawRegistry_2);
registryImdg.delete(addWithdrawRegistry_3);
} }
@Test @Test
@ -173,39 +220,18 @@ public class ReportServiceTest_KS {
reportRequest.setReportId(ReportBuilderType.KS_REP_CASH_REGISTER_SUMS.getKey()); reportRequest.setReportId(ReportBuilderType.KS_REP_CASH_REGISTER_SUMS.getKey());
Registry registry_1 = new Registry(); 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.setCompanyId(COMPANY_ID);
registry_1.setAccount("ACCOUNT"); registry_1.setAccount("ACCOUNT");
registry_1.setAccountType(AccountType.Clrn.getKey()); registry_1.setRegistryCode("DM_I");
registry_1.setRegistryCode("AM_T"); registry_1.setRegistryDesignation("D");
registry_1.setRegistryDesignation("A");
registry_1.setRegistryInstrumentType("M"); registry_1.setRegistryInstrumentType("M");
registry_1.setRegistryUnit("T"); registry_1.setRegistryUnit("I");
registry_1.setTradingClearingRegistry("0008CAT00001");
registryImdg.insert(registry_1); 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); String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -221,9 +247,6 @@ public class ReportServiceTest_KS {
compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME")); compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME"));
registryImdg.delete(registry_1); registryImdg.delete(registry_1);
statementImdg.delete(statement_1);
tradingClearingRegistryImdg.delete(tkr);
accountImdg.delete(account);
} }
@Test @Test
@ -241,7 +264,10 @@ public class ReportServiceTest_KS {
Registry registry = new Registry(); Registry registry = new Registry();
registry.setCompanyId(COMPANY_ID); registry.setCompanyId(COMPANY_ID);
registry.setSecurityId(777L);
registry.setAccountId(888L);
registry.setRegistryCode("AS_T"); registry.setRegistryCode("AS_T");
registry.setSecuritySymbol("SECURITY_SYMBOL");
registry.setRegistryDesignation(RegistryDesignation.A.getKey()); registry.setRegistryDesignation(RegistryDesignation.A.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry.setRegistryUnit(RegistryUnit.T.getKey()); registry.setRegistryUnit(RegistryUnit.T.getKey());
@ -258,6 +284,48 @@ public class ReportServiceTest_KS {
registry.setCloseBalance(BigDecimal.valueOf(11.11111111)); registry.setCloseBalance(BigDecimal.valueOf(11.11111111));
registryImdg.insert(registry); 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); String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -274,6 +342,9 @@ public class ReportServiceTest_KS {
registryCodeDictionaryImdg.delete(registryCodeDictionary); registryCodeDictionaryImdg.delete(registryCodeDictionary);
registryImdg.delete(registry); registryImdg.delete(registry);
registryImdg.delete(addWithdrawRegistry_1);
registryImdg.delete(addWithdrawRegistry_2);
registryImdg.delete(addWithdrawRegistry_3);
} }
@Test @Test
@ -285,34 +356,20 @@ public class ReportServiceTest_KS {
reportRequest.setReportId(ReportBuilderType.KS_REP_DEPO_REGISTER_QUANTITIES.getKey()); reportRequest.setReportId(ReportBuilderType.KS_REP_DEPO_REGISTER_QUANTITIES.getKey());
Registry registry_1 = new Registry(); 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.setCompanyId(COMPANY_ID);
registry_1.setAccount("ACCOUNT"); registry_1.setAccount("ACCOUNT");
registry_1.setTradingClearingRegistry("TRADING_CLEARING_REGISTRY"); registry_1.setRegistryCode("DS_I");
registry_1.setAccountType(AccountType.Depo.getKey()); registry_1.setRegistryDesignation("D");
registry_1.setRegistryCode("AS_T");
registry_1.setRegistryDesignation("A");
registry_1.setRegistryInstrumentType("S"); registry_1.setRegistryInstrumentType("S");
registry_1.setRegistryUnit("T"); registry_1.setRegistryUnit("I");
registry_1.setSecurityId(777L); registry_1.setBalance(BigDecimal.TEN);
registryImdg.insert(registry_1); 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); String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
@ -328,8 +385,6 @@ public class ReportServiceTest_KS {
compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME")); compareCSVFiles(expectedFile, outFile, Arrays.asList("FIRMID", "ADD_DATE", "ADD_TIME"));
registryImdg.delete(registry_1); registryImdg.delete(registry_1);
equitySecurityImdg.delete(equitySecurity);
statementImdg.delete(statement_1);
} }
@Test @Test
@ -434,9 +489,9 @@ public class ReportServiceTest_KS {
registry_1.setSettlementDate(LocalDate.now()); registry_1.setSettlementDate(LocalDate.now());
registry_1.setGroupId(Long.MAX_VALUE); registry_1.setGroupId(Long.MAX_VALUE);
registry_1.setClearingDate(LocalDate.now()); registry_1.setClearingDate(LocalDate.now());
registry_1.setRegistryCode("OM_T"); registry_1.setRegistryCode("LM_T");
registry_1.setRegistryStatus(RegistryStatus.PROC.getKey()); 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.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry_1.setRegistryUnit(RegistryUnit.T.getKey()); registry_1.setRegistryUnit(RegistryUnit.T.getKey());
registry_1.setSessionId(sessionId); registry_1.setSessionId(sessionId);
@ -450,9 +505,9 @@ public class ReportServiceTest_KS {
registry_2.setSettlementDate(LocalDate.now()); registry_2.setSettlementDate(LocalDate.now());
registry_2.setGroupId(Long.MAX_VALUE); registry_2.setGroupId(Long.MAX_VALUE);
registry_2.setClearingDate(LocalDate.now()); registry_2.setClearingDate(LocalDate.now());
registry_2.setRegistryCode("TM_T"); registry_2.setRegistryCode("CM_T");
registry_2.setRegistryStatus(RegistryStatus.PROC.getKey()); 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.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry_2.setRegistryUnit(RegistryUnit.T.getKey()); registry_2.setRegistryUnit(RegistryUnit.T.getKey());
registry_2.setSessionId(sessionId); registry_2.setSessionId(sessionId);
@ -498,8 +553,8 @@ public class ReportServiceTest_KS {
registry_1.setClearingDate(LocalDate.now()); registry_1.setClearingDate(LocalDate.now());
registry_1.setGroupId(Long.MAX_VALUE); registry_1.setGroupId(Long.MAX_VALUE);
registry_1.setSettlementDate(LocalDate.now()); registry_1.setSettlementDate(LocalDate.now());
registry_1.setRegistryCode("TS_T"); registry_1.setRegistryCode("CS_T");
registry_1.setRegistryDesignation(RegistryDesignation.T.getKey()); registry_1.setRegistryDesignation(RegistryDesignation.C.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_1.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_1.setRegistryStatus(RegistryStatus.PROC.getKey());
registry_1.setRegistryUnit(RegistryUnit.T.getKey()); registry_1.setRegistryUnit(RegistryUnit.T.getKey());
@ -515,8 +570,8 @@ public class ReportServiceTest_KS {
registry_2.setClearingDate(LocalDate.now()); registry_2.setClearingDate(LocalDate.now());
registry_2.setGroupId(Long.MAX_VALUE); registry_2.setGroupId(Long.MAX_VALUE);
registry_2.setSettlementDate(LocalDate.now()); registry_2.setSettlementDate(LocalDate.now());
registry_2.setRegistryCode("OS_T"); registry_2.setRegistryCode("LS_T");
registry_2.setRegistryDesignation(RegistryDesignation.O.getKey()); registry_2.setRegistryDesignation(RegistryDesignation.L.getKey());
registry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_2.setRegistryUnit(RegistryUnit.T.getKey()); registry_2.setRegistryUnit(RegistryUnit.T.getKey());
registry_2.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_2.setRegistryStatus(RegistryStatus.PROC.getKey());

View file

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

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

View file

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

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

View file

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

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

View file

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

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

View file

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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