Compare commits

..

No commits in common. "dev" and "10_01_2024_hotfix" have entirely different histories.

1507 changed files with 20698 additions and 201885 deletions

View file

@ -1,79 +0,0 @@
image:
name: ${DOCKER_PROXY}/docker:latest
pull_policy: if-not-present
variables:
GIT_SUBMODULE_STRATEGY: recursive
DOCKER_PROXY: "mirror.gcr.io"
ACCESS_TOKEN: "glpat-t_i_xh-qo58ud2hT5vxj"
stages:
- preflight
- build
- test
preflight:
image: ${DOCKER_PROXY}/bitnami/git:latest
stage: preflight
script:
- pwd
- git clone -b xml-files "http://gitlab-ci-token:$ACCESS_TOKEN@git.mfd.msk/mfd/clearing_test.git"
- find /builds/mfd/clearing/clearing_test -name ".gitkeep" -type f -delete
artifacts:
name: "$CI_COMMIT_REF_NAME"
expire_in: 1 day
paths:
- clearing_test
only:
- master
- /^master_.*$/
- dev
- /^dev_.*$/
- new
resource_group: clearing-test
build:
image: ${DOCKER_PROXY}/maven:latest
stage: build
script:
- mvn clean package -DskipTests -Pdistributive
artifacts:
name: "$CI_COMMIT_REF_NAME"
expire_in: 1 day
paths:
- /builds/mfd/clearing/z-distr/target/clearing
only:
- master
- /^master_.*$/
- dev
- /^dev_.*$/
- new
resource_group: clearing-test
test:
stage: test
variables:
CLEARING_TEST_DIR: "/builds/mfd/clearing/clearing_test"
CLR_TEST_DIR: "/builds/mfd/clearing/clr_test"
RESULT_FILES_DIR: "/builds/mfd/clearing/clr_test/result-files"
script:
- echo "Installing maven and python" && apk update && apk add maven python3
- echo "Copying jar files to clearing-all/bin" && cp -r /builds/mfd/clearing/z-distr/target/clearing/bin ./clr_test/clearing-all/bin
- echo "Copying ddl files to clearing-all/db" && cp -r /builds/mfd/clearing/z-distr/target/clearing/db ./clr_test/clearing-all/db
- echo "Removing old logs folder artifacts/logs" && rm -rf artifacts/logs
- python3 clr_test/run_test_docker_containers.py
- echo "Copying logs" && mkdir -p artifacts/logs && docker run --rm -v clr_test_logs_volume:/logs alpine tar -C /logs -cf - . | tar -C artifacts/logs -xf -
- echo "Cleaning up log volume" && docker volume rm clr_test_logs_volume
- cat clr_test/results.txt && ! grep -q "failed" clr_test/results.txt
artifacts:
expire_in: 7 day
when: always
paths:
- artifacts/logs
only:
- master
- /^master_.*$/
- dev
- /^dev_.*$/
- new
resource_group: clearing-test

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.27.307</version>
<version>SPCEX-1.0.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@ -48,12 +48,6 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- special logging -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0.1</version>
</dependency>
<!-- TEST -->
<dependency>
<groupId>ru.spcex.clearing</groupId>

View file

@ -3,7 +3,6 @@ package ru.spcex.clearing.account.config.settings;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.account.config.settings.elem.AppSettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
@ -15,7 +14,6 @@ public class AccountServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaConsumerSettings kafkaConsumer;
private KafkaProducerSettings kafkaProducer;
private AppSettings app;
public HazelcastClientParams getHazelcast() {
return hazelcast;
@ -40,12 +38,4 @@ public class AccountServiceSettings {
public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
this.kafkaProducer = kafkaProducer;
}
public AppSettings getApp() {
return app;
}
public void setApp(AppSettings app) {
this.app = app;
}
}

View file

@ -1,13 +0,0 @@
package ru.spcex.clearing.account.config.settings.elem;
public class AppSettings {
private String registryUnit = "T";
public String getRegistryUnit() {
return registryUnit;
}
public void setRegistryUnit(String registryUnit) {
this.registryUnit = registryUnit;
}
}

View file

@ -1,10 +1,5 @@
package ru.spcex.clearing.account.config.validation;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
@ -27,12 +22,17 @@ 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.validation.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.rule.CurrencyCodeValidationRule;
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.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class AccountValidationConfig {
@ -48,8 +48,6 @@ public class AccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_Currency);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
CorrespondentAccountNewRequest::getCompanyId,
@ -100,7 +98,7 @@ public class AccountValidationConfig {
AccountError.DictionaryNotFound,
accountType -> {
if (IEnumKey.contains(accountType.getCode(), AccountType.Corr, AccountType.Info)) return null;
return new EnumMessage(AccountError.WrongFieldValue, "accountType");
return AccountError.WrongFieldValue;
}).withMessageDecorator((causeEmpty, errorCode, fieldName, fieldValue) -> {
if (errorCode == AccountError.WrongFieldValue)
return DictionaryPresentRule.FIELD_NOT_FOUND_DECORATOR_1.decorator(causeEmpty, errorCode, fieldName, fieldValue);
@ -108,16 +106,6 @@ public class AccountValidationConfig {
return DictionaryPresentRule.DICTIONARY_NOT_FOUND_DECORATOR_2.decorator(causeEmpty, errorCode, fieldName, fieldValue);
}
),
DictionaryPresentRule.instance("currency",
CorrespondentAccountNewRequest::getCurrency,
IMDGDistributedNames.Map_CurrencyCodeDictionary,
ServiceStatusDictionary.class,
null,
AccountError.DictionaryNotFound,
false
),
CurrencyCodeValidationRule.get(AccountError.CurrencyNotFound),
new SameAccountValidationRule<>(AccountType.Corr, CorrespondentAccountNewRequest::getAccount)
);
};

View file

@ -1,8 +1,5 @@
package ru.spcex.clearing.account.config.validation;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
@ -16,9 +13,10 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldNotBlankRequiredRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.clearing.validation.common.rules.ValidateSymbolsRule;
import ru.spcex.clearing.validation.common.rules.specific.FieldRequiredSpecificRule;
import ru.spcex.clearing.validation.common.rules.specific.IdPresentSpecificRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountStatus;
@ -29,6 +27,11 @@ import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class BankAccountValidationConfig {
@ -45,7 +48,6 @@ public class BankAccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
BankAccountNewRequest::getCompanyId,
@ -54,6 +56,10 @@ public class BankAccountValidationConfig {
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound,
false),
FieldNotBlankRequiredRule.instance("account",
BankAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty
),
new SameAccountValidationRule<>(AccountType.Bank, BankAccountNewRequest::getAccount),
DictionaryPresentRule.instance("currency",
BankAccountNewRequest::getCurrency,
@ -61,6 +67,9 @@ public class BankAccountValidationConfig {
CurrencyCodeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound),
FieldRequiredRule.instance("bankIdentificationCode",
BankAccountNewRequest::getBankIdentificationCode,
AccountError.RequiredFieldEmpty),
FieldRequiredRule.instance("bankName",
BankAccountNewRequest::getBankName,
AccountError.RequiredFieldEmpty),
@ -70,40 +79,8 @@ public class BankAccountValidationConfig {
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
ValidateSymbolsRule.notRequired("БИК",
BankAccountNewRequest::getBankIdentificationCode,
AccountError.BadSymbol),
ValidateSymbolsRule.required("Наименование компании",
BankAccountNewRequest::getBankName,
AccountError.RequiredFieldEmpty,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Корр. счет",
BankAccountNewRequest::getCorrespondentAccount,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Наименование корр. счета",
BankAccountNewRequest::getCorrespondentAccountName,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Назначение платежа",
BankAccountNewRequest::getDestination,
AccountError.BadSymbol),
ValidateSymbolsRule.required("Счет",
BankAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("ИНН",
BankAccountNewRequest::getTaxpayerIdentificationNumber,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("КПП",
BankAccountNewRequest::getTaxRegistrationReasonCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("SWIFT",
BankAccountNewRequest::getSwiftCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("SWIFT посредника",
BankAccountNewRequest::getIntermediarySwiftCode,
AccountError.BadSymbol)
);
false)
);
};
}
@ -119,7 +96,6 @@ public class BankAccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_BankAccount);
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
BankAccountUpdateRequest::getId,
@ -143,37 +119,7 @@ public class BankAccountValidationConfig {
CurrencyCodeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
ValidateSymbolsRule.notRequired("БИК",
BankAccountUpdateRequest::getBankIdentificationCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Наименование компании",
BankAccountUpdateRequest::getBankName,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Корр. счет",
BankAccountUpdateRequest::getCorrespondentAccount,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Наименование корр. счета",
BankAccountUpdateRequest::getCorrespondentAccountName,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Назначение платежа",
BankAccountUpdateRequest::getDestination,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Счет",
BankAccountUpdateRequest::getAccount,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("ИНН",
BankAccountUpdateRequest::getTaxpayerIdentificationNumber,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("КПП",
BankAccountUpdateRequest::getTaxRegistrationReasonCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("SWIFT",
BankAccountUpdateRequest::getSwiftCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("SWIFT посредника",
BankAccountUpdateRequest::getIntermediarySwiftCode,
AccountError.BadSymbol)
false)
);
};
}

View file

@ -1,22 +1,15 @@
package ru.spcex.clearing.account.config.validation;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.account.validation.BackendClientCodeValidationRule;
import ru.spcex.clearing.account.validation.GatewayClientCodeValidationRule;
import ru.spcex.clearing.account.validation.GatewayEksClientCodeValidationRule;
import ru.spcex.clearing.account.validation.GatewayUpdateEksClientCodeValidationRule;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
@ -27,6 +20,11 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class ClientCodeValidationConfig {
@ -39,24 +37,45 @@ public class ClientCodeValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<>(context,
FieldRequiredRule.instance("companyId", ClientCodeNewRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
BackendClientCodeValidationRule.TcrIsPresentByAccount,
DictionaryPresentRule.instance("status",
ClientCodeNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
FieldRequiredRule.instance("companyId", ClientCodeNewRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
IdPresentRule.instance("moneyAccountId",
ClientCodeNewRequest::getMoneyAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
IdPresentRule.instance("depoAccountId",
ClientCodeNewRequest::getDepoAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
DictionaryPresentRule.instance("stauts",
ClientCodeNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@ -72,28 +91,51 @@ public class ClientCodeValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
ClientCodeUpdateRequest::getId,
IMDGDistributedNames.Map_ClientCode,
ClientCode.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound
),
FieldRequiredRule.instance("companyId", ClientCodeUpdateRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeUpdateRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
DictionaryPresentRule.instance("status",
ClientCodeUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
return new ValidatorImpl<ImdgValidationContext<ClientCodeUpdateRequest>>(context,
IdPresentRule.instance("id",
ClientCodeUpdateRequest::getId,
IMDGDistributedNames.Map_ClientCode,
ClientCode.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound
),
FieldRequiredRule.instance("companyId", ClientCodeUpdateRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeUpdateRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
IdPresentRule.instance("moneyAccountId",
ClientCodeUpdateRequest::getMoneyAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
IdPresentRule.instance("depoAccountId",
ClientCodeUpdateRequest::getDepoAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
DictionaryPresentRule.instance("stauts",
ClientCodeUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@ -106,88 +148,13 @@ public class ClientCodeValidationConfig {
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_ClientCode);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
CommonDeleteRequest::getId,
IMDGDistributedNames.Map_ClientCode,
ClientCode.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound)
);
};
}
@Bean("tkrAccountsGatewayValidator")
public Function<TkrAccount, IValidator> newTkrAccountsGatewayValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return tkrGatewayRequest -> {
ImdgValidationContext<TkrAccount> context = new ImdgValidationContext<>();
context.setValidatedObject(tkrGatewayRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_CompanySymbols);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols);
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
return new ValidatorImpl<>(context,
FieldRequiredRule.instance("client_code", TkrAccount::getClientCode, AccountError.RequiredFieldEmpty),
GatewayClientCodeValidationRule.CompanyPresent,
GatewayClientCodeValidationRule.AllAccountsPresent,
GatewayClientCodeValidationRule.DepoAccountsPresent,
GatewayClientCodeValidationRule.TcrIsNotPresent,
GatewayClientCodeValidationRule.TcrListIsNotPresent
);
};
}
@Bean("tkrEksAccountsGatewayValidator")
public Function<TkrAccount, IValidator> newTkrEksAccountsGatewayValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return tkrGatewayRequest -> {
ImdgValidationContext<TkrAccount> context = new ImdgValidationContext<>();
context.setValidatedObject(tkrGatewayRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_CompanySymbols);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols);
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
return new ValidatorImpl<>(context,
FieldRequiredRule.instance("client_code", TkrAccount::getClientCode, AccountError.RequiredFieldEmpty),
GatewayEksClientCodeValidationRule.RequiredAndCorrectsFields,
GatewayEksClientCodeValidationRule.RubAccountPresent,
GatewayEksClientCodeValidationRule.CompanyPresent,
GatewayEksClientCodeValidationRule.DepoAccountsPresent,
GatewayEksClientCodeValidationRule.DepoAccountsNotLinkedToTkr,
GatewayEksClientCodeValidationRule.ClsAccountsPresent,
GatewayEksClientCodeValidationRule.AnltAccountPresent,
GatewayEksClientCodeValidationRule.TcrIsNotPresent
);
};
}
@Bean("updateTkrEksAccountsGatewayValidator")
public Function<TkrAccount, IValidator> updateTkrEksAccountsGatewayValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return tkrGatewayRequest -> {
ImdgValidationContext<TkrAccount> context = new ImdgValidationContext<>();
context.setValidatedObject(tkrGatewayRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_CompanySymbols);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList);
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols);
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
addImdg.accept(IMDGDistributedNames.Map_ClientCode);
return new ValidatorImpl<>(context,
GatewayUpdateEksClientCodeValidationRule.RequiredAndCorrectsFields,
GatewayUpdateEksClientCodeValidationRule.CompanyPresent,
GatewayUpdateEksClientCodeValidationRule.TkrIsPresent,
GatewayUpdateEksClientCodeValidationRule.DepoAccountIsValid,
GatewayUpdateEksClientCodeValidationRule.NewForRubNotAllowed,
GatewayUpdateEksClientCodeValidationRule.ClientCodeIsPresent,
GatewayUpdateEksClientCodeValidationRule.ClrnAccountsNotLinkedToTkr,
GatewayUpdateEksClientCodeValidationRule.AnltAccountsNotLinkedToTkr
// FieldRequiredRule.instance("id", CommonDeleteRequest::getId, CompanyErrors.RequiredFieldEmpty),
IdPresentRule.instance("id",
CommonDeleteRequest::getId,
IMDGDistributedNames.Map_ClientCode,
ClientCode.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound)
);
};
}

View file

@ -38,7 +38,6 @@ public class InformationAccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_InformationAccount);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_Account);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
@ -60,10 +59,6 @@ public class InformationAccountValidationConfig {
DictionaryPresentRule.instance("accountType", InformationAccountNewRequest::getAccountType,
IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class,
AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false),
DictionaryPresentRule.instance("currency", InformationAccountNewRequest::getCurrency,
IMDGDistributedNames.Map_CurrencyCodeDictionary, ServiceStatusDictionary.class,
null, AccountError.DictionaryNotFound,false
),
new SameAccountValidationRule<>(AccountType.Info, InformationAccountNewRequest::getAccount)
);
};

View file

@ -31,12 +31,8 @@ class SameAccountValidationRule<R> implements IValidationRule<ImdgValidationCont
R req = context.getValidatedObject();
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
String account = accountGetter.apply(req); // req.getAccount()
if (account == null) {
return empty();
}
ImdgPredicate query = pb.and(
pb.equals("account", account),
pb.equals("account", accountGetter.apply(req)), // req.getAccount()
// pb.equals("accountType", accountType), имена всех счетов уникальны, вне зависимости от типа
pb.in("status", ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey(), ServiceStatus.Appl.getKey())
);

View file

@ -1,254 +0,0 @@
package ru.spcex.clearing.account.config.validation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
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.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.validation.IValidationRule;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
@Configuration
public class TradingClearingRegistryListValidationConfig {
@Bean("tradingClearingRegistryListNewRequestValidator")
public Function<TradingClearingRegistryListNewRequest, IValidator> tradingClearingRegistryListNewRequestValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return tradingClearingRegistryListUpdateRequest -> {
ImdgValidationContext<TradingClearingRegistryListNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(tradingClearingRegistryListUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<>(context,
IdPresentRule.instance("tradingClearingRegistryId",
TradingClearingRegistryListNewRequest::getTradingClearingRegistryId,
IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class,
AccountError.RequiredFieldEmpty,
AccountError.TradingClearingRegistryNotFound,
false),
new ExistAllAccountId<>("accountId",
TradingClearingRegistryListNewRequest::getCurrencyAccountList,
TradingClearingRegistryListNewRequest::getAccountId,
TradingClearingRegistryListNewRequest::getTradingClearingRegistryId,
false,
null),
DictionaryPresentRule.instance("stauts",
TradingClearingRegistryListNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
NotAlreadyPresent.instance
);
};
}
@Bean("tradingClearingRegistryListUpdateRequestValidator")
public Function<TradingClearingRegistryListUpdateRequest, IValidator> tradingClearingRegistryListUpdateRequestValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return tradingClearingRegistryListUpdateRequest -> {
ImdgValidationContext<TradingClearingRegistryListUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(tradingClearingRegistryListUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<ImdgValidationContext<TradingClearingRegistryListUpdateRequest>>(context,
IdPresentRule.instance2("id",
TradingClearingRegistryListUpdateRequest::getId,
IMDGDistributedNames.Map_TradingClearingRegistryList,
TradingClearingRegistryList.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound,
true,
(tcrList) -> {
Long accountId = tcrList.getAccountId();
if (accountId == null)
return null;
if (!IEnumKey.contains(context.getValidatedObject().getStatus(),
ServiceStatus.Active, ServiceStatus.Reopened))
return null;
Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder();
ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()),
pb.equals("accountId", accountId));
query = pb.and(query, pb.not(pb.equals("id", tcrList.getId())));
Collection<TradingClearingRegistryList> inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query);
if (!inOtherLists.isEmpty()) {
Collection<Long> duplicateAccounts = inOtherLists.stream()
.map(TradingClearingRegistryList::getAccountId)
.filter(accountId::equals)
.collect(Collectors.toSet());
return new EnumMessage(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, "accountId"); // (5023) «Счет %s уже используется»
}
return null;
}),
DictionaryPresentRule.instance("status",
TradingClearingRegistryListUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
true)
);
};
}
public static class NotAlreadyPresent implements IValidationRule<ImdgValidationContext<TradingClearingRegistryListNewRequest>> {
private static final NotAlreadyPresent instance = new NotAlreadyPresent();
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TradingClearingRegistryListNewRequest> ctx) {
TradingClearingRegistryListNewRequest tcrListReq = ctx.getValidatedObject();
Long accountId = tcrListReq.getAccountId();
Imdg<TradingClearingRegistryList> tcrListImdg = ctx.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
ImdgPredicateBuilder pb = tcrListImdg.predicateBuilder();
Collection<TradingClearingRegistryList> tcrLists = tcrListImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("tradingClearingRegistryId", tcrListReq.getTradingClearingRegistryId()),
pb.equals("status", WorkflowStatus.Active.getKey())
)
);
if (tcrLists.stream().anyMatch(tcrList -> Objects.equals(accountId, tcrList.getAccountId()))) {
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, accountId);
}
return empty();
}
@Override
public String ruleName() {
return "TradingClearingRegistryList.AlreadyPresent";
}
}
public static class ExistAllAccountId<R> implements IValidationRule<ImdgValidationContext<R>> {
String fieldName;
Function<R, List<Long>> accountIdListGetter;
Function<R, Long> accountIdGetter;
Function<R, Long> tkrIdGetter;
boolean required;
Function<R, Long> idGetter;
public ExistAllAccountId(String fieldName,
Function<R, List<Long>> accountIdListGetter,
Function<R, Long> accountIdGetter,
Function<R, Long> tkrIdGetter,
boolean required, Function<R, Long> idGetter) {
this.fieldName = fieldName;
this.accountIdListGetter = accountIdListGetter;
this.accountIdGetter = accountIdGetter;
this.tkrIdGetter = tkrIdGetter;
this.required = required;
this.idGetter = idGetter;
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<R> context) {
R validatedObject = context.getValidatedObject();
List<Long> accounts = accountIdListGetter.apply(validatedObject);
if (accounts == null) {
accounts = new ArrayList<>();
}
Long singleAccountId = accountIdGetter.apply(validatedObject);
if (singleAccountId != null) {
accounts.add(singleAccountId);
}
if (accounts.isEmpty()) {
if (required)
return of(AccountError.RequiredFieldEmpty, fieldName); // обязательное поле
else
return Optional.empty();
}
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
// Проверить существование счетов
{
for (Long accountId : accounts) {
Account byIdObject = accountImdg.getSingleObjectByID(accountId);
if (byIdObject == null)
return of(AccountError.AccountNotFound, accountId, fieldName);
if (!IEnumKey.contains(byIdObject.getAccountType(), AccountType.Clrn, AccountType.Info)) {
return of(AccountError.AccountIsNotACurrency, accountId,
fieldName, "expected: CLRN/INFO but is " + byIdObject.getAccountType()); // Счет %S не
}
if (CurrencyCode.isRub(byIdObject.getCurrency()) || StringUtils.isEmpty(byIdObject.getCurrency())) {
return of(AccountError.AccountIsNotACurrency, accountId, fieldName); // Счет %S не валютный
}
// Проверка отсутствия других TradingClearingRegistryList с этими счетами
Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder();
Collection<TradingClearingRegistryList> listWithAccountId = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("accountId", accountId),
pb.equals("status", WorkflowStatus.Active.getKey())
));
if (!listWithAccountId.isEmpty()){
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, byIdObject.getAccount(), fieldName); // (5023) «Данная счет %s уже используется»
}
Long tkrId = tkrIdGetter.apply(validatedObject);
ImdgPredicate query = pb.and(
pb.equals("tradingClearingRegistryId", tkrId),
pb.equals("status", WorkflowStatus.Active.getKey()),
pb.equals("currency", byIdObject.getCurrency()));
if (idGetter != null) {
Long id = idGetter.apply(validatedObject);
if (id == null) // never
return of(AccountError.RequiredFieldEmpty, "id");
query = pb.and(query, pb.not(pb.equals("id", id)));
}
Collection<TradingClearingRegistryList> inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query);
if (!inOtherLists.isEmpty()) {
// Collection<String> duplicateAccounts = inOtherLists.stream()
// .map(tradingClearingRegistryList ->
// accountImdg.getSingleObjectByID(tradingClearingRegistryList.getAccountId()).getAccount())
// .collect(Collectors.toSet());
return of(AccountError.CurrencyForTradingClearingRegistryListAlreadyUsed, byIdObject.getCurrency(), fieldName); // (5023) «Данная валюта %s уже используется»
}
}
}
return empty();
}
@Override
public String ruleName() {
return getClass().getSimpleName() + "{" + fieldName + "}";
}
}
}

View file

@ -1,11 +1,5 @@
package ru.spcex.clearing.account.config.validation;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
@ -14,7 +8,6 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.clearing.platform.dictionary.TradingClearingRegistryTypeDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
@ -36,6 +29,12 @@ import ru.spcex.platform.utils.validation.IValidationRule;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class TradingClearingRegistryValidationConfig {
@ -54,7 +53,6 @@ public class TradingClearingRegistryValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
addImdg.accept(IMDGDistributedNames.Map_InformationAccount);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
return new ValidatorImpl<>(context,
IdPresentSpecificRule.instance("companyId",
@ -128,13 +126,6 @@ public class TradingClearingRegistryValidationConfig {
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
DictionaryPresentRule.instance("tradingClearingRegistryType",
TradingClearingRegistryNewRequest::getTradingClearingRegistryType,
IMDGDistributedNames.Map_TradingClearingRegistryTypeDictionary,
TradingClearingRegistryTypeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
new newTCRDuplicateCheck()
);
};
@ -149,6 +140,11 @@ public class TradingClearingRegistryValidationConfig {
if (validatedObject.getMoneyAccountId() == null) {
return of(AccountError.RequiredFieldEmpty, "MoneyAccountId");
}
//Map<String, Comparable<?>> query = new HashMap<>();
// query.put("moneyAccountId", validatedObject.getMoneyAccountId());
// if (validatedObject.getDepoAccountId() != null) {
// query.put("depoAccountId", validatedObject.getDepoAccountId());
// }
ImdgPredicateBuilder pb = tcrMap.predicateBuilder();
ImdgPredicate query = pb.equals("moneyAccountId", validatedObject.getMoneyAccountId());
if (validatedObject.getDepoAccountId() != null) {
@ -161,68 +157,11 @@ public class TradingClearingRegistryValidationConfig {
return empty();
} else {
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account dubAcc = null;
for (TradingClearingRegistry duplicate : existTCR) {
if (Objects.equals(duplicate.getMoneyAccountId(), validatedObject.getMoneyAccountId())) {
dubAcc = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId());
}
if (validatedObject.getDepoAccountId() != null &&
validatedObject.getDepoAccountId().equals(duplicate.getDepoAccountId())) {
dubAcc = accountImdg.getSingleObjectByID(validatedObject.getDepoAccountId());
}
if (dubAcc != null) {
break;
}
}
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed,
dubAcc != null ? dubAcc.getAccount() : "null");
}
}
}
static class updateTCRDepoCheck implements IValidationRule<ImdgValidationContext<TradingClearingRegistryUpdateRequest>> {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TradingClearingRegistryUpdateRequest> context) {
TradingClearingRegistryUpdateRequest validatedObject = context.getValidatedObject();
Long depoAccountId = validatedObject.getDepoAccountId();
if (depoAccountId == null) // необязательное поле
return empty();
// Проверка типа счёта ДЕПО, что существует
Imdg<DepoAccount> depoAccountImdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
DepoAccount depoAccount = depoAccountImdg.getFirstObjectByFieldValues(
Map.of("accountId", depoAccountId)
);
if (depoAccount == null)
return of(AccountError.AccountNotFound, depoAccountId);
// Проверка компании ТКР и счёта
Imdg<TradingClearingRegistry> tcrMap = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account account = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId());
if (account == null) { // never
return of(AccountError.AccountNotFound, validatedObject.getMoneyAccountId());
}
TradingClearingRegistry updateObject = tcrMap.getSingleObjectByID(validatedObject.getId());
if (!Objects.equals(account.getCompanyId(), updateObject.getCompanyId())) {
return of(AccountError.AccountNotFound, validatedObject.getMoneyAccountId()); // или UserVerifyDenial
}
// Проверка использования счёта в других ТКР
ImdgPredicateBuilder pb = tcrMap.predicateBuilder();
ImdgPredicate query = pb.and(pb.equals("depoAccountId", validatedObject.getDepoAccountId()),
pb.not(pb.equals("id", validatedObject.getId()))
);
Collection<TradingClearingRegistry> existTCR = tcrMap.getCollectionObjectsByPredicate(query);
if (existTCR.isEmpty()) {
return empty();
} else {
String depoAccountValue = Optional
.ofNullable(depoAccount.getAccountId())
.map(accountImdg::getSingleObjectByID)
.map(Account::getAccount)
.orElse("null");
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, depoAccountValue);
Account account = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId());
if (account == null && validatedObject.getDepoAccountId() != null) account = accountImdg.getSingleObjectByID(validatedObject.getDepoAccountId());
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, account.getAccount());
// String tcrIds = existTCR.stream().map(tcr -> String.valueOf(tcr.getId())).collect(Collectors.joining(";"));
// return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, tcrIds);
}
}
}
@ -238,8 +177,6 @@ public class TradingClearingRegistryValidationConfig {
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
TradingClearingRegistryUpdateRequest::getId,
@ -253,9 +190,7 @@ public class TradingClearingRegistryValidationConfig {
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
new updateTCRDepoCheck()
false)
);
};
}

View file

@ -1,30 +1,14 @@
package ru.spcex.clearing.account.config.validation;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.account.BankAccount;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.account.*;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.misc.ValidationSymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary;
import ru.clearing.platform.dictionary.CurrencyCodeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.clearing.platform.dictionary.TradingClearingRegistryTypeDictionary;
import ru.clearing.platform.dictionary.*;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.classes.base.SpcexObjectBase;
@ -32,6 +16,10 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
@Configuration
public class ValidationConfig {
@ -54,10 +42,6 @@ public class ValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
addImdg.accept(IMDGDistributedNames.Map_Currency, Currency.class);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryTypeDictionary, TradingClearingRegistryTypeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols, ValidationSymbols.class);
//for ClientCodeValidationConfig
addImdg.accept(IMDGDistributedNames.Map_ClientCode, ClientCode.class);

View file

@ -23,18 +23,7 @@ public enum AccountError implements IErrorEnumId {
AccountForTradingClearingRegistryAlreadyUsed(5023L),
AccountFieldNotSet(5024L),
AccountDepoTypeRequired(5025L),
AccountIsNotACurrency(5026L), // Счет %S не валютный
CompanyHasNotClearingMemberCategory(5027L),
//ошибки для трансляции в модуль gateway
TCR_NOT_FOUND_GTW(5028L),
ACCOUNT_NOT_FOUND_GTW(5029L),
COMPANY_NOT_FOUND_GTW(5030L),
CurrencyForTradingClearingRegistryListAlreadyUsed(5031L),
BadSymbol(5032L),
TradingClearingRegistryNotFound(3022L),
DepoAccountChangeNotAllowed(5033L),
ClientCodeNotFound(5034L),
CurrencyNotFound(1016L),
;
private final Long id;

View file

@ -1,28 +0,0 @@
package ru.spcex.clearing.account.model;
import java.util.List;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.platform.enumeration.Status;
public class ClientCodeBusiness {
private Status code;
private Company company;
private Account moneyAccount;
private Account depoAccount;
private List<Account> currentAccounts;
private TradingClearingRegistry tradingClearingRegistry;
private Status status;
public ClientCodeBusiness(Status code,
Company company, Account moneyAccount, Account depoAccount, List<Account> currentAccounts, TradingClearingRegistry tradingClearingRegistry, Status status) {
this.code = code;
this.company = company;
this.moneyAccount = moneyAccount;
this.depoAccount = depoAccount;
this.currentAccounts = currentAccounts;
this.tradingClearingRegistry = tradingClearingRegistry;
this.status = status;
}
}

View file

@ -1,79 +0,0 @@
package ru.spcex.clearing.account.model;
import java.util.Optional;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
public class TradingClearingRegistryBusiness {
private Company company;
private Account moneyAccount;
private Status status;
private Optional<DepoAccount> depoAccount;
private Optional<TradingClearingRegistryType> tradingClearingRegistryType;
private TradingClearingRegistryBusiness() {
this.depoAccount = Optional.empty();
this.tradingClearingRegistryType = Optional.empty();
}
public static TradingClearingRegistryBusiness builder() {
return new TradingClearingRegistryBusiness();
}
public TradingClearingRegistryBusiness company(Company company) {
this.company = company;
return this;
}
public TradingClearingRegistryBusiness moneyAccount(Account moneyAccount) {
this.moneyAccount = moneyAccount;
return this;
}
public TradingClearingRegistryBusiness depoAccount(DepoAccount depoAccount) {
this.depoAccount = Optional.of(depoAccount);
return this;
}
public TradingClearingRegistryBusiness status(Status status) {
this.status = status;
return this;
}
public TradingClearingRegistryBusiness tradingClearingRegistryType(TradingClearingRegistryType type) {
this.tradingClearingRegistryType = Optional.of(type);
return this;
}
public TradingClearingRegistryBusiness build() {
TradingClearingRegistryBusiness tradingClearingRegistryBusiness = new TradingClearingRegistryBusiness();
tradingClearingRegistryBusiness.company = this.company;
tradingClearingRegistryBusiness.status = this.status;
tradingClearingRegistryBusiness.depoAccount = this.depoAccount;
tradingClearingRegistryBusiness.moneyAccount = this.moneyAccount;
tradingClearingRegistryBusiness.tradingClearingRegistryType = this.tradingClearingRegistryType;
return tradingClearingRegistryBusiness;
}
public Company getCompany() {
return company;
}
public Account getMoneyAccount() {
return moneyAccount;
}
public Optional<DepoAccount> getDepoAccount() {
return depoAccount;
}
public Status getStatus() {
return status;
}
public Optional<TradingClearingRegistryType> getTradingClearingRegistryType() {
return tradingClearingRegistryType;
}
}

View file

@ -1,7 +0,0 @@
package ru.spcex.clearing.account.model;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
public record TrkCreationResult(ClientCode clientCode, TradingClearingRegistry tradingClearingRegistry) {
}

View file

@ -1,12 +0,0 @@
package ru.spcex.clearing.account.model;
import java.util.Optional;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidator;
public record ValidationResult(IValidator validator, Optional<EnumMessage> error, Optional<String> errorMsg) {
public boolean isValid() {
return error.isEmpty();
}
}

View file

@ -1,10 +1,5 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import org.apache.commons.lang3.StringUtils;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
@ -19,7 +14,6 @@ import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
@ -34,22 +28,22 @@ import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.DepoAccountType;
import ru.spcex.platform.enumeration.Sender;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
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.ImdgTransaction;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.Stored;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
@Service
public class AccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
@ -57,7 +51,6 @@ public class AccountService extends QueueConsumer implements InitializingBean {
private final Imdg<Account> accountMap;
private final Imdg<ClearingMemberCategory> clearingMemberCategoryMap;
private final Imdg<Relation> relationMap;
private final Imdg<Currency> currencyMap;
private final KafkaSender kafkaSender;
private final IMessageResolver messageResolver;
private final UserRoleVerification userRoleVerification;
@ -79,25 +72,22 @@ public class AccountService extends QueueConsumer implements InitializingBean {
AccountHelper accountHelper,
InformationAccountService informationAccountService,
@Qualifier("correspondentAccountNewRequestValidator")
Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator,
Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator,
@Qualifier("correspondentAccountUpdateRequestValidator")
Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator,
Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator,
@Qualifier("correspondentAccountBlockRequestValidator")
Function<CommonIdRequest, IValidator> accountBlockRequestValidator) {
Function<CommonIdRequest, IValidator> accountBlockRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.accountHelper = accountHelper;
this.imdgProvider = imdgProvider;
this.accountMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Account, Account.class
IMDGDistributedNames.Map_Account, Account.class
);
this.clearingMemberCategoryMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
this.relationMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
this.currencyMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Currency, Currency.class
IMDGDistributedNames.Map_Relation, Relation.class
);
this.kafkaSender = kafkaSender;
this.messageResolver = messageResolver;
@ -113,18 +103,18 @@ public class AccountService extends QueueConsumer implements InitializingBean {
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
callback(CorrespondentAccountNewRequest.class)
.setFunction(this::accountCorrespondentNew)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, callbacks::put);
.setFunction(this::accountCorrespondentNew)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, callbacks::put);
callback(CorrespondentAccountUpdateRequest.class)
.setFunction(this::correspondentAccountUpdate)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE, callbacks::put);
.setFunction(this::correspondentAccountUpdate)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE, callbacks::put);
callback(CommonIdRequest.class)
.setFunction(this::correspondentAccountBlock)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, callbacks::put);
.setFunction(this::correspondentAccountBlock)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, callbacks::put);
callback(AccountTerminationRequest.class)
.setFunction(this::accountTerminationForCompany)
.forDestination(Consts.ACCOUNT_TERMINATION, callbacks::put);
.setFunction(this::accountTerminationForCompany)
.forDestination(Consts.ACCOUNT_TERMINATION, callbacks::put);
init();
}
@ -135,47 +125,22 @@ public class AccountService extends QueueConsumer implements InitializingBean {
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
IValidator validator = accountNewRequestValidator.apply(userRequest.getRequestPayload());
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, (r) -> validator);
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
CorrespondentAccountNewRequest req = userRequest.getRequestPayload();
Currency currency = validator.getStored(Stored.currency);
String currencyCode = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency();
Long currencyCodeId = CurrencyCode.RUB.getKey().equals(currencyCode) ? 810 : currency.getId();
Instant now = Instant.now();
Account account = new Account();
account.setCompanyId(req.getCompanyId());
account.setAccount(req.getAccount());
if (AccountType.Info.equalsByKey(req.getAccountType())) {
Account anltAccount;
{
ImdgPredicateBuilder pb = accountMap.predicateBuilder();
ImdgPredicate andPredicate = pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("currency", currency.getCurrencyCode())
);
Collection<Account> accountsAnlt = accountMap.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
log.warn("Account with {} not exist.", andPredicate);
} else if (accountsAnlt.size() > 1) {
log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first");
}
anltAccount = accountsAnlt.iterator().next();
}
String specialAnltAccId = "7000";
if (anltAccount != null && StringUtils.isNotEmpty(anltAccount.getAccount()) && anltAccount.getAccount().length() >= 4) {
specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4);
}
Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId);
String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId, specialAnltAccId);
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.setCurrency(currencyCode);
if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey());
log.trace("Status not set in request. Use default: {}", account.getStatus());
@ -232,12 +197,11 @@ public class AccountService extends QueueConsumer implements InitializingBean {
InformationAccount infoAcc = new InformationAccount();
infoAcc.setAccountId(account.getId());
Account firstAccountAntl = accountMap.getFirstObjectByFieldValues(Map.of(
"companyId", Sender.One.getId(),
"accountType", AccountType.Anlt.getKey(),
"currency", account.getCurrency()
"companyId", Sender.One.getId(),
"accountType", AccountType.Anlt.getKey()
));
if (firstAccountAntl == null) {
log.warn("Can not find 1 ANTL {} account for fill information ClearingAccountId.", account.getCurrency());
log.warn("Can not find 1 ANTL account for fill information ClearingAccountId.");
} else {
infoAcc.setClearingAccountId(firstAccountAntl.getId());
}
@ -353,7 +317,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
Long reqId = kafkaSender.sendRequestToQueue(Consts.ACCOUNT_TERMINATION_STEP2, req);
log.info("On termination request id={} send to next step {} new request id={}",
userRequest.getId(), Consts.ACCOUNT_TERMINATION_STEP2, reqId);
userRequest.getId(), Consts.ACCOUNT_TERMINATION_STEP2, reqId);
log.debug("successfully processed, account termination");
return null;
@ -362,9 +326,9 @@ public class AccountService extends QueueConsumer implements InitializingBean {
private 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);
.setId(reqId)
.setStatus(Status.Error)
.setMessage(errMsg);
}
}

View file

@ -109,7 +109,6 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
account.setStatus(req.getStatus());
}
account.setCompanyId(req.getCompanyId());
account.setCurrency(req.getCurrency());
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), false);
@ -137,8 +136,6 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
bankAccount.setAccount(req.getAccount());
bankAccount.setCompanyId(req.getCompanyId());
bankAccount.setAccountId(accountId);
bankAccount.setSwiftCode(req.getSwiftCode());
bankAccount.setIntermediarySwiftCode(req.getIntermediarySwiftCode());
bankAccountId = bankAccountMap.insert(bankAccount);
txOk = true;
@ -176,12 +173,9 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
bankAccount.setTaxpayerIdentificationNumber(req.getTaxpayerIdentificationNumber());
bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode());
bankAccount.setAccount(req.getAccount());
bankAccount.setSwiftCode(req.getSwiftCode());
bankAccount.setIntermediarySwiftCode(req.getIntermediarySwiftCode());
Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId());
account.setAccount(req.account);
account.setCurrency(req.getCurrency());
account.setUpdated(Instant.now());
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();

View file

@ -1,14 +1,5 @@
package ru.spcex.clearing.account.service;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import org.apache.commons.lang3.tuple.MutableTriple;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.kafka.clients.consumer.Consumer;
@ -19,18 +10,14 @@ import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.misc.Notification;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf52;
import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary;
import ru.clearing.platform.dictionary.ClearingCategoryDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -51,31 +38,23 @@ import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.AccountStatus;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.ClearingAccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.NotificationStatus;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.SdfTable;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
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.ImdgTransaction;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.collection.Pair;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IErrorEnumId;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
@Service
public class ClearingAccountService extends QueueConsumer implements InitializingBean {
@ -91,16 +70,13 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
private final Function<ClearingAccountUpdateRequest, IValidator> clearingAccountUpdateRequestValidator;
private final Imdg<Account> accountImdg;
private final Imdg<Currency> currImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<Company> companyImdg;
private final Imdg<Registry> rgsImdg;
private final Imdg<Relation> relationImdg;
private final Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private final Imdg<ClearingCategoryDictionary> clearingCategoryImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Notification> notificationImdg;
private final Imdg<ClearingAccountTypeDictionary> clearingAccountTypeDictionaryImdg;
@Autowired
public ClearingAccountService(Consumer<String, Object> kafkaQueue,
@ -128,7 +104,6 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
this.clearingAccountUpdateRequestValidator = clearingAccountUpdateRequestValidator;
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.currImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
@ -136,8 +111,6 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
this.clearingCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.notificationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Notification, Notification.class);
this.clearingAccountTypeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class);
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
}
@Override
@ -162,7 +135,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
init();
}
public synchronized RequestInfoUpdate clearingAccountNew(BaseRequest<ClearingAccountNewRequest> userRequest) {
public RequestInfoUpdate clearingAccountNew(BaseRequest<ClearingAccountNewRequest> userRequest) {
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(
userRequest, clearingAccountNewRequestValidator
);
@ -214,14 +187,10 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
imdgTransaction.rollbackTransaction();
}
}
if (txOk && account != null) {
sendNotificationAccountNewRequest(account);
}
return null;
}
public synchronized RequestInfoUpdate clearingAccountUpdate(BaseRequest<ClearingAccountUpdateRequest> userRequest) {
public RequestInfoUpdate clearingAccountUpdate(BaseRequest<ClearingAccountUpdateRequest> userRequest) {
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(
userRequest, clearingAccountUpdateRequestValidator
);
@ -268,12 +237,11 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
public synchronized RequestInfoUpdate accountNewSdf01(BaseRequest<AccountSdf01Request> userRequest) {
public RequestInfoUpdate accountNewSdf01(BaseRequest<AccountSdf01Request> userRequest) {
log.debug("AccountSdf01Request received, id={}", userRequest.getId());
AccountSdf01Request req = userRequest.getRequestPayload();
List<AccountSdfToStatementRequestPart> accountToStatement = new ArrayList<>();
List<Account> accountsToNotification = new ArrayList<>();
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
@ -286,37 +254,10 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
for (AccountSdfRequestPart accountReq : req.getAccounts()) {
Instant now = Instant.now();
Account account = new Account();
try {
Long currencyId = Long.valueOf(accountReq.getAccount().substring(5, 8));
String currencyCode = CurrencyCode.RUB.getKey();
if (!currencyId.equals(810L)){
Currency currency = currImdg.getSingleObjectByID(currencyId);
currencyCode = currency != null ? currency.getCurrencyCode() : null;
}
if (currencyCode == null){
throw new IllegalArgumentException("Not found currency by id " + currencyId);
}
account.setCurrency(currencyCode);
} catch (Throwable e) {
AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart();
responsePart.setSdfId(accountReq.getSdfId());
responsePart.setErrorCode(AccountError.DictionaryNotFound.getId()); // see accountService.fillAccountFromRelation
responsePart.setErrorText("couldn't extract currency from '%s' account".formatted(accountReq.getAccount()));
accountToStatement.add(responsePart);
log.info("sdf.id={} companyId={} accountType={} couldn't find currency for account {}",
accountReq.getSdfId(),
accountReq.getCompanyId(),
accountReq.getAccountType(),
accountReq.getAccount());
continue accountsLoop;
}
account.setAccount(accountReq.getAccount());
account.setAccountType(AccountType.Clrn.getKey());
account.setStatus(ServiceStatus.Active.getKey());
account.setCompanyId(accountReq.getCompanyId());
if (TextUtil.isEmpty(account.getCurrency())) {
log.warn("Sdf52: Wrong accountValue=\"{}\" - can not parse for get currency", accountReq.getAccount());
}
account.setCreated(now);
account.setUpdated(now);
RequestInfoUpdate requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true);
@ -348,7 +289,6 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
Long accountId = -1L;
ClearingAccount clearingAccount = null;
accountId = accountImdg.insert(account);
accountsToNotification.add(account);
clearingAccount = new ClearingAccount();
clearingAccount.setCompanyId(accountReq.getCompanyId());
@ -377,115 +317,11 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
sendStatementRequestBack(req.getGroupingSdf01Id(), req.getGroupingSdf02Id(), accountToStatement);
if (txOk) {
for (Account account : accountsToNotification)
sendNotificationAccountNewRequest(account);
}
log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size());
return null;
}
/**
* Логика похожа на SDF01
*
* @param accountValue account
* @param companyId
* @param userRequestId для лога
* @return
*/
private synchronized Account createSdf52Account(String accountValue, String acctType, Long companyId, Long userRequestId) {
{ // Валидация
boolean existClearingAccountTypeDictionary;
if (!StringUtils.hasText(acctType)) {
existClearingAccountTypeDictionary = false;
} else {
ClearingAccountTypeDictionary catd = clearingAccountTypeDictionaryImdg.getFirstObjectByFieldValues(
Map.of("code", acctType));
existClearingAccountTypeDictionary = catd != null;
}
if (!existClearingAccountTypeDictionary) {
String errMsg = messageResolver.resolve(new EnumMessage(AccountError.DictionaryNotFound, acctType, clearingAccountTypeDictionaryImdg.getMapName()));
log.warn(errMsg);
return null;
}
ClearingMemberCategory companyAnyCMC = clearingMemberCategoryImdg.getFirstObjectByFieldValues(Map.of(
"companyId", companyId
));
if (companyAnyCMC == null) {
String errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyHasNotClearingMemberCategory, companyId));
log.warn(errMsg);
}
}
Instant now = Instant.now();
Account account = new Account();
account.setAccount(accountValue);
account.setAccountType(AccountType.Clrn.getKey());
account.setStatus(ServiceStatus.Active.getKey());
if (accountValue.length() >= 7) {
try {
Long currencyId = Long.valueOf(accountValue.substring(5, 8));
String currencyCode = CurrencyCode.RUB.getKey();
if (!currencyId.equals(810L)){
Currency currency = currImdg.getSingleObjectByID(currencyId);
currencyCode = currency != null ? currency.getCurrencyCode() : null;
}
if (currencyCode == null){
throw new IllegalArgumentException("Not found currency by id " + currencyId);
}
account.setCurrency(currencyCode);
} catch (Throwable e) {
log.trace("When obtain currency from accountValue: {}", e.toString());
return null;
}
}
if (TextUtil.isEmpty(account.getCurrency())) {
log.warn("Sdf52: Wrong accountValue=\"{}\" - can not parse for get currency", accountValue);
}
account.setCompanyId(companyId);
account.setCreated(now);
account.setUpdated(now);
RequestInfoUpdate requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequestId, true);
if (requestInfoUpdate != null) {
log.warn("Error fill new account from relation. {}", /*account.getId(),*/ requestInfoUpdate.getMessage());
return null;
}
Account existAccount = accountImdg.getFirstObjectBySQL("account = '%s' and accountType='%s'"
.formatted(accountValue, AccountType.Clrn.getKey()));
if (existAccount != null) {
log.debug("Sdf52: Account {} already exists", accountValue);
if (companyId.equals(existAccount.getCompanyId())) {
return existAccount;
} else {
log.debug("Sdf52: Account {} already exists for other companyId={}, do not apply for companyId={}",
accountValue, existAccount.getCompanyId(), companyId);
return null;
}
}
Long clearingAccountId = -1L;
Long accountId = -1L;
ClearingAccount clearingAccount = null;
accountId = accountImdg.insert(account);
clearingAccount = new ClearingAccount();
clearingAccount.setCompanyId(companyId);
clearingAccount.setAccountId(accountId);
ClearingAccountType caType = IEnumKey.getEnumByKey(ClearingAccountType.class, acctType);
if (caType == null) {
log.warn("Wrong ClearingAccountType=\"{}\" for account \"{}\"", acctType, accountValue);
}
clearingAccount.setClearingAccountType(acctType);
clearingAccountId = clearingAccountImdg.insert(clearingAccount);
log.debug("New account {}, clearingAccount {} was created.", accountId, clearingAccountId);
return account;
}
public RequestInfoUpdate accountUpdateSdf52(BaseRequest<StatementRequest> systemRequest) {
log.debug("accountUpdateSdf52 StatementRequest received, id={}", systemRequest.getId());
@ -529,16 +365,8 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
Account account = sDf52.getAccount() == null ? null : accountImdg.getFirstObjectByFieldValues(accountQuery);
if (account == null) {
if (SDFProcessService.SDF52_STATUS_3Open.equals(sDf52.getStatus())) {
log.trace("By generationId={} s_df52[{}].status={}, account not found (query: {}). Try create new account.",
log.debug("By generationId={} s_df52[{}].status={}, but account not found (query: {}). COntinuse with result OK for status 3",
groupId, sDf52.getId(), sDf52.getStatus(), accountQuery);
account = createSdf52Account(sDf52.getAccount(),sDf52.getAcc_type(), company.getId(), systemRequest.getId());
if (account == null) {
log.info("Can not create account: \"{}\", companyId={}. Ignore SDF52.id={}",
sDf52.getAccount(), company.getId(), sDf52.getId());
// continue;
} else {
sendNotificationAccountNewRequest(account);
}
} else {
String msg = messageResolver.resolve(new EnumMessage(AccountError.AccountNotFound, sDf52.getAccount()));
log.warn("By generationId={} s_df52[{}] (query: {}) error: {}", groupId, sDf52.getId(), accountQuery, msg);
@ -548,9 +376,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
}
toProcessSDF53.add(new MutableTriple<>(sDf52, account, SDFProcessService.SDF_STATUS_OK));
if (account != null) {
toUpdate.add(new Pair<>(sDf52, account));
}
toUpdate.add(new Pair<>(sDf52, account));
}
}
log.debug("Selected to update {} account's", toUpdate.size());
@ -566,23 +392,9 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
if (newStatus.equalsByKey(account.getStatus())) {
// одинаковых обычно не бывает.
log.trace("In sDF_52[{}] for account [{}] status {} not changed.", sdf.getId(), account.getId(), newStatus);
continue;
}
ImdgPredicateBuilder rgsPb = rgsImdg.predicateBuilder();
Registry rgs = rgsImdg.getSingleObjectByPredicate(
rgsPb.and(
rgsPb.equals("account", account.getAccount()),
rgsPb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).build())
)
);
boolean rgsBalanceNotZero = rgs == null || rgs.getBalance().compareTo(BigDecimal.ZERO) != 0;
boolean wasBlocked = AccountStatus.BLOCKED == newStatus || AccountStatus.CLOSE == newStatus;
if (rgsBalanceNotZero && wasBlocked) {
sendNotificationNonZeroBalanceClosed(ObjectType.account_block, account, newStatus);
notificationAccountIds.add(account.getId());
putNotificationWaiting(systemRequest, item.getFirst(), item.getSecond());
} else if (wasBlocked) { // статус 0/2
if (AccountStatus.BLOCKED == newStatus || AccountStatus.CLOSE == newStatus) { // статус 0/2
sendNotificationRequest(ObjectType.account_block, account, newStatus);
notificationAccountIds.add(account.getId());
putNotificationWaiting(systemRequest, item.getFirst(), item.getSecond());
@ -623,9 +435,9 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
}
protected synchronized RequestInfoUpdate accountUpdateSdf52_part2(BaseRequest<StatementRequest> systemRequest1,
SDf52 sdf, Account account,
BaseRequest<NotificationFeedbackRequest> secondSystemRequest2) {
protected RequestInfoUpdate accountUpdateSdf52_part2(BaseRequest<StatementRequest> systemRequest1,
SDf52 sdf, Account account,
BaseRequest<NotificationFeedbackRequest> secondSystemRequest2) {
// 5. from notification:
StatementRequest req = systemRequest1.getRequestPayload();
Long groupId = req.getGroupId();
@ -694,7 +506,6 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
request.setGroupId(groupingSdf01Id);
request.setChildGenerationId(groupSdf02Id);
request.setAccountCreationResults(results);
request.setFromAccount(true);
request.setContinueSdf(true);
request.setTable(SdfTable.SDF_01); // по нему запрос получили
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
@ -719,41 +530,6 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
return rKey;
}
public Long sendNotificationNonZeroBalanceClosed(ObjectType objectType, Account account, AccountStatus status) {
String statusText = AccountStatus.BLOCKED == status ? "заблокировать"
: AccountStatus.CLOSE == status ? "закрыть" :
status.getKey();
String message = String.format("Попытка %s ненулевой счет %s", statusText, account.getAccount());
final String destination = Consts.NOTIFICATION_NEW;
NotificationNewRequest request = new NotificationNewRequest();
request.setObjectType(objectType.getKey());
request.setObjectId(account.getId());
request.setPriority(Priority.HIGH.getKey());
request.setComment(message);
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
Long rKey = kafkaSender.sendRequestToQueue(destination, request);
log.trace("About account.id={} send notification request id={}", account.getId(), rKey);
return rKey;
}
/**
* Формирование уведомления о добавлении счёта
*/
public Long sendNotificationAccountNewRequest(Account account) {
String message = String.format("Добавлен новый счет %s", account.getAccount());
final String destination = Consts.NOTIFICATION_NEW;
NotificationNewRequest request = new NotificationNewRequest();
//request.setObjectId(account.getId());
request.setObjectType(ObjectType.rgst.getKey());
request.setPriority(Priority.HIGH.getKey());
request.setComment(message);
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
Long rKey = kafkaSender.sendRequestToQueue(destination, request);
log.trace("About account.id={} send notification request id={}", account.getId(), rKey);
return rKey;
}
// --------- notification apply system -----------
public static class SDF52WaitingData {
@ -831,7 +607,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
if (returnTrigger) {
log.debug("Remove from waiting list accountId={} (list groupId={})", accountId, inWaitingLst.getGroupId());
waitingList.remove(accountId);
waitingList.remove(inWaitingLst);
}
if (returnTrigger)
return inWaitingLst;

View file

@ -1,14 +1,5 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
@ -18,11 +9,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -31,20 +19,13 @@ import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
@ -58,6 +39,13 @@ import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.Function;
@Service
public class ClientCodeService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
@ -66,79 +54,63 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
private final ImdgProvider imdgProvider;
private final Imdg<ClientCode> clientCodeMap;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryMap;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<Account> accountImdg;
private final Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator;
private final Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator;
private final Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator;
private final Function<TkrAccount, IValidator> tkrAccountsGatewayValidator;
private final ValidationHelper validationHelper;
private final UserRoleVerification userRoleVerification;
private final IMessageResolver messageResolver;
private final RequestHelper requestHelper;
protected TradingClearingRegistryService tradingClearingRegistryService;
protected ConfigurableApplicationContext context;
private final KafkaSender kafkaSender;
//protected TradingClearingRegistryListService tradingClearingRegistryListService;
@Autowired
public ClientCodeService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ImdgProvider imdgProvider,
ValidationHelper validationHelper,
IMessageResolver messageResolver,
RequestHelper requestHelper,
TradingClearingRegistryService tradingClearingRegistryService,
ConfigurableApplicationContext context, //TradingClearingRegistryListService tradingClearingRegistryListService,
UserRoleVerification userRoleVerification,
@Qualifier("clientCodeNewRequestValidator") Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator,
@Qualifier("clientCodeUpdateRequestValidator") Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator,
@Qualifier("clientCodeDeleteRequestValidator") Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator,
@Qualifier("tkrAccountsGatewayValidator") Function<TkrAccount, IValidator> tkrAccountsGatewayValidator) {
@Qualifier("clientCodeDeleteRequestValidator") Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.clientCodeMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.clientCodeNewRequestValidator = clientCodeNewRequestValidator;
this.clientCodeUpdateRequestValidator = clientCodeUpdateRequestValidator;
this.clientCodeDeleteRequestValidator = clientCodeDeleteRequestValidator;
this.tkrAccountsGatewayValidator = tkrAccountsGatewayValidator;
this.validationHelper = validationHelper;
this.requestHelper = requestHelper;
this.messageResolver = messageResolver;
this.userRoleVerification = userRoleVerification;
this.tradingClearingRegistryService = tradingClearingRegistryService;
this.context = context; // TradingClearingRegistryListService
}
@Override
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
// callback(ClientCodeNewRequest.class)
// .setFunction(this::clientCodeNew)
// .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put);
//note переехало в ClientCodeMessageListener[новая версия сервиса]
// callback(TkrAccountsGatewayRequest.class)
// .setFunction(this::clientCodeNewFromGateway)
// .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY, callbacks::put);
callback(ClientCodeNewRequest.class)
.setFunction(this::clientCodeNewFromApiUmCompany)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, callbacks::put);
.setFunction(this::clientCodeNew)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put);
callback(ClientCodeNewRequest.class)
.setFunction(this::clientCodeNewFromApiUmCompany)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, callbacks::put);
callback(ClientCodeUpdateRequest.class)
.setFunction(this::clientCodeUpdate)
.forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE, callbacks::put);
.setFunction(this::clientCodeUpdate)
.forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE, callbacks::put);
callback(CommonDeleteRequest.class)
.setFunction(this::clientCodeDelete)
.forDestination(Consts.DESTINATION_CLIENT_CODE_DELETE, callbacks::put);
.setFunction(this::clientCodeDelete)
.forDestination(Consts.DESTINATION_CLIENT_CODE_DELETE, callbacks::put);
init();
}
@ -147,11 +119,10 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
* Проверки
* 3.5.1 если не была найдена запись в tradingClearingRegistry по companyId, moneyAccountId, depoAccountId и tradingClearingRegistryType=B (п 3.5.1)
* 3.5.2 если не заполнены поля moneyAccountId ИЛИ moneyAccountId и depoAccountId
*
* @param userRequest
* @param moneyAccountId req.getMoneyAccountId()
* @param depoAccountId req.getDepoAccountId()
* @param companyId req.getCompanyId()
* @param moneyAccountId req.getMoneyAccountId()
* @param depoAccountId req.getDepoAccountId()
* @param companyId req.getCompanyId()
* @return
*/
RequestInfoUpdate crossValidate(BaseRequest<?> userRequest, Long moneyAccountId, Long depoAccountId, Long companyId) {
@ -161,8 +132,8 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
error = new EnumMessage(AccountError.RequiredFieldEmpty, "companyId");
} else {
TradingClearingRegistry tcr = tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("companyId", companyId));
if (tcr == null) {
error = new EnumMessage(AccountError.TradingClearingRegistryNotFound, companyId);
if (tcr==null) {
error=new EnumMessage(AccountError.TradingClearingRegistryNotFound, companyId);
}
}
if (error != null) {
@ -172,7 +143,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
return null;
}
protected RequestInfoUpdate clientCodeNew0(BaseRequest<ClientCodeNewRequest> userRequest, boolean fromTCRList) {
protected RequestInfoUpdate clientCodeNew(BaseRequest<ClientCodeNewRequest> userRequest) {
log.debug("ClientCodeNewRequest received {}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
@ -190,67 +161,25 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), null,
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
if (req.getCurrencyAccountList() == null || req.getCurrencyAccountList().isEmpty()) {
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
} else {//fixme transaction!
if (!fromTCRList) {
if (req.getMoneyAccountId() != null /*&& currencyAccountId != null*/) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента
TradingClearingRegistry tcr = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
TradingClearingRegistryListNewRequest tcrListNewR = new TradingClearingRegistryListNewRequest();
tcrListNewR.setTradingClearingRegistryId(tcr == null ? null : tcr.getId());
tcrListNewR.setCurrencyAccountList(req.getCurrencyAccountList());
tcrListNewR.setStatus(req.getStatus());
TradingClearingRegistryListService tradingClearingRegistryListService = context.getBean(TradingClearingRegistryListService.class);
try {
BaseRequest<TradingClearingRegistryListNewRequest> request2 = new BaseRequest<>();
request2.setId(idGenerator.nextId());
request2.setActionType(ActionType.NEW);
request2.setRequestPayload(tcrListNewR);
requestInfoUpdate = tradingClearingRegistryListService.tradingClearingRegistryListNew0(request2, true);
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}",
userRequest.getId(),
ExceptionUtils.getStackTrace(e));
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
}
List<Long> newClientCodeIds = new ArrayList<>();
for (Long currencyAccountId : req.getCurrencyAccountList()) {
ClientCode newClientCode = buildClientCode(req);
newClientCode.setCurrencyAccountId(currencyAccountId);
clientCodeMap.insert(newClientCode);
newClientCodeIds.add(newClientCode.getId());
log.trace("ClientCode.id={} for currencyAccountId={} created", newClientCode.getId(), currencyAccountId);
}
log.debug("successfully processed, new clientCode id {}", newClientCodeIds);
}
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
return null;
}
protected RequestInfoUpdate clientCodeNewFromApiUmCompany(BaseRequest<ClientCodeNewRequest> userRequest) {
return clientCodeNewFromApiUmCompany0(userRequest, false);
}
protected RequestInfoUpdate clientCodeNewFromApiUmCompany0(BaseRequest<ClientCodeNewRequest> userRequest, boolean fromTCRList) {
protected RequestInfoUpdate clientCodeNewFromApiUmCompany(BaseRequest<ClientCodeNewRequest> userRequest) {
log.debug("ClientCodeNewRequest (UM_COMPANY) received {}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
@ -269,57 +198,19 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), null,
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR at this moment" + e.getMessage());
}
}
if (req.getCurrencyAccountList() == null || req.getCurrencyAccountList().isEmpty()) {
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
} else {//fixme transaction!
if (!fromTCRList) {
if (req.getMoneyAccountId() != null /*&& currencyAccountId != null*/) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента
TradingClearingRegistry tcr = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
TradingClearingRegistryListUpdateRequest tcrListUpdateR = new TradingClearingRegistryListUpdateRequest();
tcrListUpdateR.setTradingClearingRegistryId(tcr == null ? null : tcr.getId());
tcrListUpdateR.setCurrencyAccountList(req.getCurrencyAccountList());
TradingClearingRegistryListService tradingClearingRegistryListService = context.getBean(TradingClearingRegistryListService.class);
try {
BaseRequest<TradingClearingRegistryListUpdateRequest> request2 = new BaseRequest<>();
request2.setId(idGenerator.nextId());
request2.setActionType(ActionType.NEW);
request2.setRequestPayload(tcrListUpdateR);
requestInfoUpdate = tradingClearingRegistryListService.tradingClearingRegistryListUpdate0(request2, true);
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}",
userRequest.getId(),
ExceptionUtils.getStackTrace(e));
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
}
List<Long> newClientCodeIds = new ArrayList<>();
for (Long currencyAccountId : req.getCurrencyAccountList()) {
ClientCode newClientCode = buildClientCode(req);
newClientCode.setCurrencyAccountId(currencyAccountId);
clientCodeMap.insert(newClientCode);
newClientCodeIds.add(newClientCode.getId());
log.trace("ClientCode.id={} for currencyAccountId={} created", newClientCode.getId(), currencyAccountId);
}
log.debug("successfully processed, new clientCode id {}", newClientCodeIds);
}
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
return null;
}
@ -344,7 +235,22 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
return makeErrorResponse(userRequest, AccountError.RecordNotFound, req.getId());
}
boolean doCreateTCR = checkNeedCreateTCR(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), clientCode.getId(),
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
updateClientCode(clientCode, req);
clientCodeMap.update(clientCode);
log.debug("successfully processed update, id {}", clientCode.getId());
return null;
@ -377,7 +283,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
return null;
}
protected TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) {
TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) {
Map<String, Comparable<?>> query = new HashMap<>();
query.put("companyId", companyId);
query.put("moneyAccountId", moneyAccountId);
@ -386,7 +292,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
query.put("depoAccountId", depoAccountId);
}
TradingClearingRegistry result = tradingClearingRegistryMap.getFirstObjectByFieldValues(query);
log.trace("TradingClearingRegistry by: {}; {} found", query, result == null ? "not" : "");
log.trace("TradingClearingRegistry by: {}; {}found", query, result == null ? "not " : "");
return result;
}
@ -404,10 +310,10 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
}
protected RequestInfoUpdate createAndWaitTCR(Long reqId, Long clientCode,
Long companyId, Long moneyAccountId, Long depoAccountId) {
Long companyId, Long moneyAccountId, Long depoAccountId) {
log.debug("For request {}, clientCode={} need create TCR: companyId={}, moneyAccountId={}, depoAccountId={}",
reqId, clientCode == null ? "new" : clientCode,
companyId, moneyAccountId, depoAccountId);
reqId, clientCode == null ? "new" : clientCode,
companyId, moneyAccountId, depoAccountId);
BaseRequest<TradingClearingRegistryNewRequest> request = new BaseRequest<>();
request.setId(idGenerator.nextId());
request.setActionType(ActionType.NEW);
@ -420,7 +326,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
request.setRequestPayload(requestPayload);
// Следующий вызываемый метод обязательно должен быть synchronized.
RequestInfoUpdate reply = tradingClearingRegistryService.tradingClearingRegistryNew(request, true);
RequestInfoUpdate reply = tradingClearingRegistryService.tradingClearingRegistryNew(request);
if (reply != null && Status.Error.equals(reply.getStatus())) {
log.warn("tradingClearingRegistryService return error: " + reply.getMessage());
}
@ -494,7 +400,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (tradingClearingRegistry == null) {
log.warn("TCR not found: CompanyId {}, MoneyAccountId {}, DepoAccountId {}",
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
} else {
clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId());
}
@ -509,28 +415,26 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
private void updateClientCode(ClientCode clientCode, ClientCodeUpdateRequest req) {
assert clientCode.getId() != null && clientCode.getId().equals(req.getId());
clientCode.setCompanyId(req.getCompanyId());
clientCode.setCode(req.getCode());
if (req.getMoneyAccountId() != null) {
TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (tradingClearingRegistry == null) {
log.warn("TCR not found: CompanyId {}, MoneyAccountId {}, DepoAccountId {}",
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
} else {
clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId());
}
}
clientCode.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
clientCode.setMoneyAccountId(req.getMoneyAccountId());
clientCode.setDepoAccountId(req.getDepoAccountId());
clientCode.setStatus(req.getStatus());
clientCode.setUpdated(Instant.now());
}
private Tkr crateErrorTkrToGateway(TkrAccount tkrAccount, Optional<String> errorMsg) {
Tkr tkr = new Tkr();
tkr.setTkrCode(tkrAccount.getTkrCode());
tkr.setClientCode(tkrAccount.getClientCode());
tkr.setCompanyId(tkrAccount.getCompanyId());
tkr.setDepoAccount(tkrAccount.getDepoAccount());
errorMsg.ifPresent(tkr::setErrorMessage);
return tkr;
}
private MoneyAccountMsgResponse convertAccountToResponse(MoneyAccountMsgRequest moneyAccountMsgRequest) {
MoneyAccountMsgResponse msgResponse = new MoneyAccountMsgResponse();
msgResponse.setAccount(moneyAccountMsgRequest.getAccount());
msgResponse.setCurrCode(moneyAccountMsgRequest.getCurrCode());
return msgResponse;
}
}

View file

@ -1,9 +1,5 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
@ -22,24 +18,22 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf0
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationNewRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.DepoAccountType;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.SdfTable;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
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.ImdgTransaction;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
@Service
public class DepoAccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
@ -135,9 +129,6 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
imdgTransaction.rollbackTransaction();
}
}
if (txOk && depoAccount != null) {
sendNotificationAccountNewRequest(account);
}
return null;
}
@ -146,7 +137,6 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
AccountSdf01Request req = userRequest.getRequestPayload();
List<AccountSdfToStatementRequestPart> accountToStatement = new ArrayList<>();
List<Account> accountsToNotification = new ArrayList<>();
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
@ -194,8 +184,7 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
Long depoAccountId = -1L;
Long accountId = -1L;
accountId = accountImdg.insert(account);
accountsToNotification.add(account);
accountId = accountImdg.insert(account);
DepoAccount depoAccount = new DepoAccount();
depoAccount.setCompanyId(accountReq.getCompanyId());
@ -230,11 +219,6 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
}
sendStatementRequestBack(req.getGroupingSdf01Id(), req.getGroupingSdf02Id(), accountToStatement);
if (txOk) {
for (Account account : accountsToNotification)
sendNotificationAccountNewRequest(account);
}
log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size());
return null;
@ -244,28 +228,10 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
StatementRequest request = new StatementRequest();
request.setGroupId(groupingSdf01Id);
request.setChildGenerationId(groupingSdf02Id);
request.setContinueSdf(true);
request.setContinueSdf(true); //fixme????
request.setAccountCreationResults(results);
request.setFromAccount(true);
request.setTable(SdfTable.SDF_08); // по нему запрос получили
log.debug("Send message to kafka \"{}\": {}", Consts.STATEMENT_PROCESS, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.STATEMENT_PROCESS, request);
}
/**
* Формирование уведомления о добавлении счёта
*/
public Long sendNotificationAccountNewRequest(Account account) {
String message = String.format("Добавлен новый счет %s", account.getAccount());
final String destination = Consts.NOTIFICATION_NEW;
NotificationNewRequest request = new NotificationNewRequest();
//request.setObjectId(account.getId());
request.setObjectType(ObjectType.rgst.getKey());
request.setPriority(Priority.HIGH.getKey());
request.setComment(message);
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
Long rKey = kafkaSender.sendRequestToQueue(destination, request);
log.trace("About account.id={} send notification request id={}", account.getId(), rKey);
return rKey;
}
}

View file

@ -16,6 +16,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
@ -25,7 +26,6 @@ import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
@ -40,7 +40,6 @@ import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
@ -64,7 +63,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
* Кэш-счётчик сквозных номеров счетов.
* См. accountNextId()
*/
protected Map<String, AtomicLong> infoCounterByCurrency = new HashMap<>();
protected AtomicLong infoCounter;
@Autowired
public InformationAccountService(Consumer<String, Object> kafkaQueue,
@ -77,7 +76,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
AccountHelper accountHelper,
RequestHelper requestHelper,
@Qualifier("informationAccountNewRequestValidator")
Function<InformationAccountNewRequest, IValidator> infoAccountNewRequestValidator) {
Function<InformationAccountNewRequest, IValidator> infoAccountNewRequestValidator) {
super(kafkaQueue, kafkaResponseQueue);
this.kafkaSender = kafkaSender;
this.messageResolver = messageResolver;
@ -88,21 +87,21 @@ public class InformationAccountService extends QueueConsumer implements Initiali
this.requestHelper = requestHelper;
this.infoAccountNewRequestValidator = infoAccountNewRequestValidator;
this.informationAccountImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_InformationAccount, InformationAccount.class
IMDGDistributedNames.Map_InformationAccount, InformationAccount.class
);
this.accountImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_Account, Account.class
IMDGDistributedNames.Map_Account, Account.class
);
}
@Override
public void afterPropertiesSet() throws Exception {
callback(InformationAccountNewRequest.class)
.setFunction(this::informationAccountNew)
.forDestination(Consts.DESTINATION_INFORMATION_ACCOUNT_NEW, callbacks::put);
.setFunction(this::informationAccountNew)
.forDestination(Consts.DESTINATION_INFORMATION_ACCOUNT_NEW, callbacks::put);
callback(InformationAccountNewRequest.class)
.setFunction(this::informationAccountSystemNew)
.forDestination(Consts.INFORMATION_ACCOUNT_SYSTEM_NEW, callbacks::put);
.setFunction(this::informationAccountSystemNew)
.forDestination(Consts.INFORMATION_ACCOUNT_SYSTEM_NEW, callbacks::put);
init();
}
@ -116,14 +115,15 @@ public class InformationAccountService extends QueueConsumer implements Initiali
if (requestInfoUpdate != null) return requestInfoUpdate;
InformationAccountNewRequest req = userRequest.getRequestPayload();
String currency = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency(); //userRequest.getRequestPayload().getCurrency();
Long newId = informationAccountImdg.nextIDSequenceFor();
Long infoSequenceId = accountNextId();
String accountValue = generateInfoAccount(infoSequenceId);
log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue);
ImdgPredicateBuilder accountPredicateBuilder = accountImdg.predicateBuilder();
ImdgPredicate companyIdPredicate = accountPredicateBuilder.equals("companyId", 1L);
ImdgPredicate accountTypePredicate = accountPredicateBuilder.and(accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey()),
accountPredicateBuilder.equals("currency", currency));
ImdgPredicate accountTypePredicate = accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey());
ImdgPredicate andPredicate = accountPredicateBuilder.and(companyIdPredicate, accountTypePredicate);
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
@ -173,12 +173,12 @@ public class InformationAccountService extends QueueConsumer implements Initiali
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new information account id {}, new account id {}",
informationAccountId,
accountId);
informationAccountId,
accountId);
} else {
log.debug("failed insert, new information account id {}, new account id {} (if id = -1 then insert is failed)",
informationAccountId,
accountId);
informationAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
@ -198,8 +198,8 @@ public class InformationAccountService extends QueueConsumer implements Initiali
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
{ // Проверка существования счёта
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByFieldValues(Map.of(
"companyId", forCompanyId,
"accountType", AccountType.Info.getKey()
"companyId", forCompanyId,
"accountType", AccountType.Info.getKey()
));
if (!accountsAnlt.isEmpty()) {
String trueMessage = messageResolver.resolve(new EnumMessage(AccountError.InfoAccountAlreadyExist, forCompanyId));
@ -209,16 +209,16 @@ public class InformationAccountService extends QueueConsumer implements Initiali
}
String currency = userRequest.getRequestPayload().getCurrency();
if (currency == null)
currency = CurrencyCode.RUB.getKey();
Long newId = informationAccountImdg.nextIDSequenceFor();
Long infoSequenceId = accountNextId(); // требуется последовательность n+1
String accountValue = generateInfoAccount(infoSequenceId);
log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue);
Long anltAccountId = null;
Account anltAccount;
{
ImdgPredicate andPredicate = pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("currency", currency)
pb.equals("companyId", 1L),
pb.equals("accountType", AccountType.Anlt.getKey())
);
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
@ -227,20 +227,10 @@ public class InformationAccountService extends QueueConsumer implements Initiali
} else if (accountsAnlt.size() > 1) {
log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first");
}
anltAccount = accountsAnlt.iterator().next();
Account anltAccount = accountsAnlt.iterator().next();
anltAccountId = anltAccount.getId();
}
String specialAnltAccId = "7000";
if (anltAccount != null && StringUtils.isNotEmpty(anltAccount.getAccount()) && anltAccount.getAccount().length() >= 4) {
specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4);
}
Long newId = informationAccountImdg.nextIDSequenceFor();
Long infoSequenceId = accountNextId(currency, 810L); // требуется последовательность n+1
String accountValue = generateInfoAccount(810L, infoSequenceId, specialAnltAccId);
log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue);
Instant now = Instant.now();
Account account = new Account();
account.setAccount(accountValue);
@ -277,12 +267,12 @@ public class InformationAccountService extends QueueConsumer implements Initiali
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new information account id {}, new account id {}",
informationAccountId,
accountId);
informationAccountId,
accountId);
} else {
log.debug("failed insert, new information account id {}, new account id {} (if id = -1 then insert is failed)",
informationAccountId,
accountId);
informationAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
@ -304,45 +294,26 @@ public class InformationAccountService extends QueueConsumer implements Initiali
kafkaSender.sendRequestToQueue(Consts.CREATE_NOTIFICATION_NCMP, request);
}
public String generateInfoAccount(Long currencyCodeId, Long id, String specialAnltAccId) {
return "%d%03d%08d%s".formatted(39911, currencyCodeId, id, specialAnltAccId);
public String generateInfoAccount(Long id) {
return "%d%d%08d%d".formatted(39911, 810, id, 7000);
}
public synchronized Long accountNextId(String currency) {
return accountNextId(currency, 810L);
}
/**
* Сквозной номер инфо-счетов
*
* @param
* @return infoCounter++
*/
public synchronized Long accountNextId(String currency, Long currencyCodeId) {
String idWithTrailingZero = String.format("%03d", currencyCodeId);
if (currency == null)
currency = CurrencyCode.RUB.getKey(); // default
AtomicLong infoCounter = infoCounterByCurrency.get(currency);
public synchronized Long accountNextId() {
if (infoCounter == null) synchronized (this) {
if (infoCounter == null) {
log.debug("Init account-information counter.");
ImdgPredicateBuilder predicateBuilder = accountImdg.predicateBuilder();
ImdgPredicate currencyPredicate = predicateBuilder.equals("currency", currency);
if (CurrencyCode.RUB.equalsByKey(currency)) {
currencyPredicate = predicateBuilder.or(
currencyPredicate,
predicateBuilder.isNull("currency")
);
}
Collection<Account> allInfoAcc = accountImdg.getCollectionObjectsByPredicate(predicateBuilder.and(
predicateBuilder.equals("accountType", AccountType.Info.getKey()),
currencyPredicate
));
Collection<Account> allInfoAcc = accountImdg.getCollectionObjectsByFieldValues(Map.of("accountType", AccountType.Info.getKey()));
if (allInfoAcc.isEmpty()) {
infoCounter = new AtomicLong(1);
log.debug("No account information on map. n={}", infoCounter.get());
} else {
Pattern accPattern = Pattern.compile("39911%s([0-9]{8})\\d{4}".formatted(idWithTrailingZero));
Pattern accPattern = Pattern.compile("39911810([0-9]{8})7000");
int maxN = 1;
int parsedCount = 0;
String lastAccount = null; // for debug
@ -366,11 +337,10 @@ public class InformationAccountService extends QueueConsumer implements Initiali
}
infoCounter = new AtomicLong(maxN);
log.debug("Parsed {} information accounts ({} pattern match) in map. n={}",
allInfoAcc.size(), parsedCount, infoCounter.get());
allInfoAcc.size(), parsedCount, infoCounter.get());
if (parsedCount == 0 && lastAccount != null)
log.debug("Last unparseable account: {}", lastAccount);
}
infoCounterByCurrency.put(currency, infoCounter);
}
}
return infoCounter.incrementAndGet();

View file

@ -1,30 +1,33 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.misc.Notification;
import ru.clearing.classes.statics.data.sdf.SDf52;
import ru.clearing.classes.statics.data.sdf.SDf53;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationFeedbackRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.AccountStatus;
import ru.spcex.platform.enumeration.NotificationStatus;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.utils.collection.Pair;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
@Service
public class SDFProcessService {
@ -77,13 +80,12 @@ public class SDFProcessService {
boolean txOk = false;
imdgTransaction.beginTransaction();
HashSet<String> fileNames = new HashSet<>();
String messageId = String.valueOf(UUID.randomUUID()).replaceAll("-", "");
try { // 2. обновление данных, в транзакции
Imdg<SDf53> sdf53Imdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_SDf53, SDf53.class);
Instant now = Instant.now();
for (Triple<SDf52, Account, String> item : toProcessSDF53) {
SDf53 sDf53 = createBy(item.getLeft(), item.getRight(), now, generationId, messageId);
SDf53 sDf53 = createBy(item.getLeft(), item.getRight(), now, generationId);
sdf53Imdg.insert(sDf53);
fileNames.add(item.getLeft().getFileName());
}
@ -106,7 +108,7 @@ public class SDFProcessService {
messageStatementToExport53(generationId, fileNameSingle);
}
SDf53 createBy(SDf52 sdf52, String result, Instant now, Long newGenerationId, String messageId) {
SDf53 createBy(SDf52 sdf52, String result, Instant now, Long newGenerationId) {
SDf53 newSdf = new SDf53();
newSdf.setId(idGenerator.nextId());
newSdf.setAccName(sdf52.getAcc_name());
@ -114,12 +116,9 @@ public class SDFProcessService {
newSdf.setDeal(sdf52.getDeal());
newSdf.setDate(sdf52.getDate());
newSdf.setStatus(sdf52.getStatus());
newSdf.setAccType(sdf52.getAcc_type());
newSdf.setResult(result);
newSdf.setGenerationTime(now);
newSdf.setGenerationId(sdf52.getGenerationId());
newSdf.setMessageId(messageId);
newSdf.setParentId(sdf52.getMessageId());
if (!Objects.equals(newGenerationId, newSdf.getGenerationId())) { // never
log.warn("Different GenerationId={} for sdf53[{}] and GenerationId={} for group of sdf52",
newSdf.getGenerationId(), newSdf.getId(), newGenerationId

View file

@ -1,317 +0,0 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
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.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class TradingClearingRegistryListService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ValidationHelper validationHelper;
private final UserRoleVerification userRoleVerification;
protected ClientCodeService clientCodeService;
private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<DepoAccount> depoAccountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<InformationAccount> informationAccountImdg;
private final Imdg<Account> accountImdg;
private final Imdg<Company> companyImdg;
private final Imdg<Relation> relationImdg;
private final Function<TradingClearingRegistryListUpdateRequest, IValidator> tradingClearingRegistryListUpdateRequestValidator;
private final RequestHelper requestHelper;
private final Function<TradingClearingRegistryListNewRequest, IValidator> tradingClearingRegistryListNewRequestValidator;
// private final Function<CommonIdRequest, IValidator> tradingClearingRegistryListBlockRequestValidator;
private final IMessageResolver messageResolver;
private final Producer<String, Object> kafkaProducer;
private final KafkaSender kafkaSender;
public TradingClearingRegistryListService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ImdgProvider imdgProvider,
ClientCodeService clientCodeService,
ValidationHelper validationHelper,
UserRoleVerification userRoleVerification,
IMessageResolver messageResolver,
RequestHelper requestHelper,
@Qualifier("tradingClearingRegistryListNewRequestValidator")
Function<TradingClearingRegistryListNewRequest, IValidator> tradingClearingRegistryListNewRequestValidator,
@Qualifier("tradingClearingRegistryListUpdateRequestValidator")
Function<TradingClearingRegistryListUpdateRequest, IValidator> tradingClearingRegistryListUpdateRequestValidator
) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
this.validationHelper = validationHelper;
this.userRoleVerification = userRoleVerification;
this.requestHelper = requestHelper;
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
this.tradingClearingRegistryListNewRequestValidator = tradingClearingRegistryListNewRequestValidator;
this.tradingClearingRegistryListUpdateRequestValidator = tradingClearingRegistryListUpdateRequestValidator;
// this.tradingClearingRegistryListBlockRequestValidator = tradingClearingRegistryListBlockRequestValidator;
this.messageResolver = messageResolver;
this.clientCodeService = clientCodeService;
}
@Override
public void afterPropertiesSet() throws Exception {
imdgProvider.waitAvailable();
callback(TradingClearingRegistryListNewRequest.class)
.setFunction(this::tradingClearingRegistryListNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_NEW, callbacks::put);
callback(TradingClearingRegistryListUpdateRequest.class)
.setFunction(this::tradingClearingRegistryListUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_UPDATE, callbacks::put);
init();
}
public RequestInfoUpdate tradingClearingRegistryListNew(BaseRequest<TradingClearingRegistryListNewRequest> userRequest) {
return tradingClearingRegistryListNew1(userRequest, false);
}
@Deprecated
protected RequestInfoUpdate tradingClearingRegistryListNew0(BaseRequest<TradingClearingRegistryListNewRequest> userRequest, boolean innerCall) {
// fixme объединить с путом а то лист может быть пустой. и чистить...
log.debug("TradingClearingRegistryListNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListNewRequestValidator);
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(userRequest
.getRequestPayload()
.getTradingClearingRegistryId());
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload();
Instant now = Instant.now();
List<Long> newIds=new ArrayList<>();
for (Long currAccId: req.getCurrencyAccountList()) {
Long id = tradingClearingRegistryListImdg.nextIDSequenceFor();
TradingClearingRegistryList tradingClearingRegistryList = new TradingClearingRegistryList();
tradingClearingRegistryList.setId(id);
tradingClearingRegistryList.setCreated(now);
tradingClearingRegistryList.setUpdated(now);
tradingClearingRegistryList.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
tradingClearingRegistryList.setAccountId(currAccId);
Account account = accountImdg.getSingleObjectByID(currAccId);
tradingClearingRegistryList.setCurrency(account.getCurrency());
if (req.getStatus() == null) {
tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey());
log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus());
} else {
tradingClearingRegistryList.setStatus(req.getStatus());
}
tradingClearingRegistryListImdg.insert(tradingClearingRegistryList);
newIds.add(id);
}
log.info("New TCRList.id={} has created.", newIds);
if (!innerCall) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента, т.е. у одного клиента может быть несколько валютных счетов.
try {
ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest();
cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
cCodeReq.setDepoAccountId(tcr.getDepoAccountId());
cCodeReq.setMoneyAccountId(tcr.getMoneyAccountId());
cCodeReq.setCompanyId(tcr.getCompanyId());
cCodeReq.setCurrencyAccountList(req.getCurrencyAccountList());
cCodeReq.setStatus(req.getStatus());
//todo cCodeReq.setCode();
BaseRequest<ClientCodeNewRequest> request2 = new BaseRequest<>();
request2.setRequestPayload(cCodeReq);
requestInfoUpdate = clientCodeService.clientCodeNew0(request2, true);
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}",
userRequest.getId(),
ExceptionUtils.getStackTrace(e));
return requestHelper.makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
sendNotificationToClearingSvc(newIds, tcr);
log.debug("successfully processed, id {}", newIds);
return null;
}
protected RequestInfoUpdate tradingClearingRegistryListNew1(BaseRequest<TradingClearingRegistryListNewRequest> userRequest, boolean innerCall) {
log.debug("TradingClearingRegistryListNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListNewRequestValidator);
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload();
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId());
Account account = accountImdg.getSingleObjectByID(req.getAccountId());
Instant now = Instant.now();
Long id = tradingClearingRegistryListImdg.nextIDSequenceFor();
TradingClearingRegistryList tradingClearingRegistryList = new TradingClearingRegistryList();
tradingClearingRegistryList.setId(id);
tradingClearingRegistryList.setCreated(now);
tradingClearingRegistryList.setUpdated(now);
tradingClearingRegistryList.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
tradingClearingRegistryList.setAccountId(req.getAccountId());
tradingClearingRegistryList.setCurrency(account.getCurrency());
if (req.getStatus() == null) {
tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey());
log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus());
} else {
tradingClearingRegistryList.setStatus(req.getStatus());
}
tradingClearingRegistryListImdg.insert(tradingClearingRegistryList);
log.info("New TCRList.id={} has created.", id);
if (!innerCall) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента, т.е. у одного клиента может быть несколько валютных счетов.
// try {
// TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId());
// ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest();
// cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
// cCodeReq.setDepoAccountId(tcr.getDepoAccountId());
// cCodeReq.setMoneyAccountId(tcr.getMoneyAccountId());
// cCodeReq.setCompanyId(tcr.getCompanyId());
// cCodeReq.setCurrencyAccountList(Arrays.asList(req.getAccountId())); // todo rewrite API
// cCodeReq.setStatus(tradingClearingRegistryList.getStatus());
// //todo cCodeReq.setCode();
// BaseRequest<ClientCodeNewRequest> request2 = new BaseRequest<>();
// request2.setRequestPayload(cCodeReq);
// requestInfoUpdate = clientCodeService.clientCodeNew0(request2, true);
// if (requestInfoUpdate != null) return requestInfoUpdate;
// } catch (Exception e) {
// log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}",
// userRequest.getId(),
// ExceptionUtils.getStackTrace(e));
// return requestHelper.makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
// }
}
sendNotificationToClearingSvc(id, tcr);
log.debug("successfully processed, id {}", id);
return null;
}
public RequestInfoUpdate tradingClearingRegistryListUpdate(BaseRequest<TradingClearingRegistryListUpdateRequest> userRequest) {
return tradingClearingRegistryListUpdate0(userRequest, false);
}
public RequestInfoUpdate tradingClearingRegistryListUpdate0(BaseRequest<TradingClearingRegistryListUpdateRequest> userRequest, boolean innerCall) {
log.debug("TradingClearingRegistryListUpdateRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListUpdateRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
TradingClearingRegistryListUpdateRequest req = userRequest.getRequestPayload();
TradingClearingRegistryList tradingClearingRegistryList = tradingClearingRegistryListImdg.getSingleObjectByID(req.getId());
if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistryList.getStatus())) {
Instant now = Instant.now();
tradingClearingRegistryList.setUpdated(now);
tradingClearingRegistryList.setStatus(req.getStatus());
tradingClearingRegistryListImdg.update(tradingClearingRegistryList);
log.debug("Update TCRList.id={}.", tradingClearingRegistryList.getId());
} else {
log.debug("Nothing to update TCRList.id={}.", tradingClearingRegistryList.getId());
}
//todo нужно ли слать уведомления sendNotificationToClearingSvc?
log.debug("successfully processed, id {}", tradingClearingRegistryList.getId());
return null;
}
@Deprecated
protected void sendNotificationToClearingSvc(List<Long> tradingClearingRegistries, TradingClearingRegistry tcr) {
for (Long tradingClearingRegistryId:tradingClearingRegistries)
sendNotificationToClearingSvc(tradingClearingRegistryId, tcr);
}
/**
* clearing-service сообщение на открытие клиринговых регистров;
*/
protected void sendNotificationToClearingSvc(Long tradingClearingRegistryId, TradingClearingRegistry tcr) {
CreateRegistryRequest request = new CreateRegistryRequest();
request.setTcrListId(tradingClearingRegistryId);
request.setCompanyId(tcr.getCompanyId());
request.setTradingClearingRegistryId(tcr.getId());
log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request);
}
}

View file

@ -1,13 +1,5 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
@ -15,35 +7,23 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.config.settings.AccountServiceSettings;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
@ -51,12 +31,7 @@ import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.Status;
import static ru.spcex.platform.enumeration.Task.makeFiles_MTCR;
import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
@ -65,6 +40,10 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.*;
import java.util.function.Function;
@Service
public class TradingClearingRegistryService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
@ -74,16 +53,12 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
private final Imdg<DepoAccount> depoAccountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<InformationAccount> informationAccountImdg;
private final Imdg<Account> accountImdg;
private final Imdg<AccountSymbols> accountSymbolsImdg;
private final Imdg<Company> companyImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<Relation> relationImdg;
private final Imdg<ClientCode> clientCodeImdg;
private final Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator;
private final RequestHelper requestHelper;
@ -94,7 +69,6 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
private final IMessageResolver messageResolver;
private final Producer<String, Object> kafkaProducer;
private final KafkaSender kafkaSender;
private final AccountServiceSettings accountServiceSettings;
public TradingClearingRegistryService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
@ -105,11 +79,11 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
IMessageResolver messageResolver,
RequestHelper requestHelper,
@Qualifier("tradingClearingRegistryNewRequest")
Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator,
Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator,
@Qualifier("tradingClearingRegistryUpdateRequest")
Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator,
Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator,
@Qualifier("tradingClearingRegistryBlockRequest")
Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator, AccountServiceSettings accountServiceSettings) {
Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
@ -118,45 +92,34 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
this.requestHelper = requestHelper;
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.tradingClearingRegistryNewRequestValidator = tradingClearingRegistryNewRequestValidator;
this.tradingClearingRegistryAutoNewRequestValidator = tradingClearingRegistryNewRequestValidator; // без relation.
this.tradingClearingRegistryUpdateRequestValidator = tradingClearingRegistryUpdateRequestValidator;
this.tradingClearingRegistryBlockRequestValidator = tradingClearingRegistryBlockRequestValidator;
this.messageResolver = messageResolver;
this.accountServiceSettings = accountServiceSettings;
}
@Override
public void afterPropertiesSet() throws Exception {
imdgProvider.waitAvailable();
callback(TradingClearingRegistryNewRequest.class) // todo deprecated - unused.
.setFunction(this::tradingClearingRegistryAutoNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put);
.setFunction(this::tradingClearingRegistryAutoNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put);
callback(TradingClearingRegistryNewRequest.class)
.setFunction(tkrReq -> tradingClearingRegistryNew(tkrReq, true))
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put);
.setFunction(this::tradingClearingRegistryNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put);
callback(TradingClearingRegistryUpdateRequest.class)
.setFunction(this::tradingClearingRegistryUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put);
.setFunction(this::tradingClearingRegistryUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put);
callback(CommonIdRequest.class)
.setFunction(this::tradingClearingRegistryBlock)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put);
callback(TkrAccountsGatewayRequest.class)
.setFunction(this::tradingClearingRegistryCheck)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_CHECK, callbacks::put);
callback(LauncherCommandRequest.class)
.setConsumer(this::sendAllTkrToGateway)
.forDestination(makeFiles_MTCR.topic(), callbacks::put);
.setFunction(this::tradingClearingRegistryBlock)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put);
init();
}
@ -196,10 +159,10 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (registryByCompany == null) {
log.trace("Not found registry with companyId={}",
req.getCompanyId());
req.getCompanyId());
return requestHelper.makeErrorResponse(userRequest,
AccountError.TradingClearingRegistryNotFound,
req.getCompanyId());
AccountError.TradingClearingRegistryNotFound,
req.getCompanyId());
}
}
@ -244,12 +207,6 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
targetExistTradingClearingRegistry.setUpdated(Instant.now());
tradingClearingRegistryImdg.update(targetExistTradingClearingRegistry);
log.debug("successfully processed, id {}. Updated exist TradingClearingRegistry.id={}", id, targetExistTradingClearingRegistry.getId());
Optional<Tkr> tkr = createRequestToGateway(tradingClearingRegistry);
if (tkr.isPresent()) {
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.getTkrs().add(tkr.get());
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
return null;
}
}
@ -280,20 +237,17 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
tradingClearingRegistry.setStatus(status);
String tradingRegistryType;
if (req.getTradingClearingRegistryType() != null) {
tradingRegistryType = req.getTradingClearingRegistryType();
if (depoAccount != null) {
tradingRegistryType = depoAccount.getDepoAccountType();
} else {
if (depoAccount != null) {
tradingRegistryType = depoAccount.getDepoAccountType();
} else {
if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType();
else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
}
if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType();
else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
}
tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C;
//http://jira.mfd.msk:8088/browse/CLS-631#comment-60200
TradingClearingRegistryPurpose registryPurpose;
if (req.getDepoAccountId() != null) registryPurpose = TradingClearingRegistryPurpose.C;
else registryPurpose = TradingClearingRegistryPurpose.M;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = companyImdg.getSingleObjectByID(req.getCompanyId());
@ -318,8 +272,7 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
return null;
}
public synchronized RequestInfoUpdate tradingClearingRegistryNew(BaseRequest<TradingClearingRegistryNewRequest> userRequest,
boolean sentToGateway) {
public synchronized RequestInfoUpdate tradingClearingRegistryNew(BaseRequest<TradingClearingRegistryNewRequest> userRequest) {
log.debug("TradingClearingRegistryNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) {
@ -337,30 +290,11 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (registryByCompany == null) {
return requestHelper.makeErrorResponse(userRequest,
AccountError.TradingClearingRegistryNotFound,
"companyId=" + req.getCompanyId());
AccountError.TradingClearingRegistryNotFound,
"companyId=" + req.getCompanyId());
}
}
TradingClearingRegistry tradingClearingRegistry = createTkr(req);
if (sentToGateway) {
Optional<Tkr> tkr = createRequestToGateway(tradingClearingRegistry);
if (tkr.isPresent()) {
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.getTkrs().add(tkr.get());
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
}
log.debug("successfully processed, id {}", tradingClearingRegistry.getId());
return null;
}
public TradingClearingRegistry createTkr(TradingClearingRegistryNewRequest req) {
// Дополнительная проверка
Long id = tradingClearingRegistryImdg.nextIDSequenceFor();
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(id);
@ -390,8 +324,9 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
}
tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
//http://jira.mfd.msk:8088/browse/CLS-631#comment-60200
TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C;
TradingClearingRegistryPurpose registryPurpose;
if (req.getDepoAccountId() != null) registryPurpose = TradingClearingRegistryPurpose.C;
else registryPurpose = TradingClearingRegistryPurpose.M;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = companyImdg.getSingleObjectByID(req.getCompanyId());
@ -406,16 +341,22 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.info("New TCR.id={} was created.", tradingClearingRegistry.getId());
return tradingClearingRegistry;
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("successfully processed, id {}", id);
return null;
}
protected Long companySequenceNextId(Long companyId, TradingClearingRegistryPurpose registryPurpose, String tradingRegistryType) {
ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder();
Collection<TradingClearingRegistry> existTCR = tradingClearingRegistryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("companyId", companyId),
pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()),
pb.equals("tradingClearingRegistryType", tradingRegistryType)
)
pb.and(
pb.equals("companyId", companyId),
pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()),
pb.equals("tradingClearingRegistryType", tradingRegistryType)
)
);
if (existTCR.isEmpty()) {
log.trace("For company id={} not found exist TCR.", companyId);
@ -453,16 +394,14 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
if (code.length() > 4)
code = code.substring(code.length() - 4);
code = "%4s".formatted(code).replace(' ', '0');
// code += registryPurpose.getKey(); // C / M / ...
code += "C";//пока ставим всегда С, возможно придется откатить
String registryUnit = accountServiceSettings.getApp() != null ? accountServiceSettings.getApp().getRegistryUnit() : "T";
String trType = tradingRegistryType + registryUnit; // 2 символа
code += registryPurpose.getKey(); // C / M / ...
String trType = tradingRegistryType + "T"; // 2 символа
code += trType;
String sId = "%5s".formatted(id).replace(' ', '0');
if (sId.length() > 5)
sId = sId.substring(sId.length() - 5);
code += sId;
return code; // 12 символов
return code; // 12 имволов
}
public RequestInfoUpdate tradingClearingRegistryUpdate(BaseRequest<TradingClearingRegistryUpdateRequest> userRequest) {
@ -480,30 +419,18 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
if (req.getMoneyAccountId() != null && !req.getMoneyAccountId().equals(tradingClearingRegistry.getMoneyAccountId())) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "MoneyAccountId", req.getMoneyAccountId());
}
if (tradingClearingRegistry.getDepoAccountId() != null) {
if (req.getDepoAccountId() == null) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "DepoAccountId", req.getDepoAccountId());
} else if (req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "DepoAccountId", req.getDepoAccountId());
}
if (req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "DepoAccountId", req.getDepoAccountId());
}
// tradingClearingRegistry.setMoneyAccountId(req.getMoneyAccountId());
// tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistry.getStatus())
|| req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())
) {
if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistry.getStatus())) {
Instant now = Instant.now();
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistry.setStatus(req.getStatus());
tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
tradingClearingRegistryImdg.update(tradingClearingRegistry);
Optional<Tkr> tkr = createRequestToGateway(tradingClearingRegistry);
if (tkr.isPresent()) {
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.getTkrs().add(tkr.get());
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("Update TCR.id={}.", tradingClearingRegistry.getId());
} else {
log.debug("Nothing to update TCR.id={}.", tradingClearingRegistry.getId());
@ -533,127 +460,6 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
return null;
}
public RequestInfoUpdate tradingClearingRegistryCheck(BaseRequest<TkrAccountsGatewayRequest> gatewayRequest) {
TkrAccountsGatewayRequest req = gatewayRequest.getRequestPayload();
log.debug("TradingClearingRegistryCheckRequest received with requestId : {}", req.getRequestId());
for (TkrAccount accountForCheck : req.getAccounts()) {
log.debug("Checking TKR with code: {}", accountForCheck.getTkrCode());
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByFieldValues(
Map.of("code", accountForCheck.getTkrCode())
);
Optional<Tkr> tkr = createRequestToGateway(tradingClearingRegistry);
if (tkr.isPresent()) {
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.getTkrs().add(tkr.get());
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
}
return null;
}
public RequestInfoUpdate sendAllTkrToGateway(BaseRequest<?> gatewayRequest) {
Collection<TradingClearingRegistry> tkrs = tradingClearingRegistryImdg.getAllValues();
SendTkrRequest sendTkrRequest = new SendTkrRequest();
for (TradingClearingRegistry tkr : tkrs) {
log.debug("Create TKR request with id: {}", tkr.getId());
Optional<Tkr> tkrRequest = createRequestToGateway(tkr);
tkrRequest.ifPresent(value -> sendTkrRequest.getTkrs().add(value));
}
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
return null;
}
private Optional<Tkr> createRequestToGateway(TradingClearingRegistry tradingClearingRegistry) {
if (tradingClearingRegistry != null) {
Tkr tkr = new Tkr();
log.debug("Found TKR with id: {} and code: {}", tradingClearingRegistry.getId(), tradingClearingRegistry.getCode());
Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId());
CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.UUID.getKey(),
"companyId", company.getId()
)
);
if (companySymbols == null) {
log.warn("CompanySymbols is null, searched by company.id: {}, skip this tkr", company.getId());
return Optional.empty();
}
ClientCode clientCode = clientCodeImdg.getFirstObjectByFieldValues(
Map.of("tradingClearingRegistryId", tradingClearingRegistry.getId())
);
tkr.setCompanyId(companySymbols.getCompanySymbolValue());
tkr.setTradingCode(Long.valueOf(company.getTradingCode()));
tkr.setTkrCode(tradingClearingRegistry.getCode());
tkr.setTkrType(tradingClearingRegistry.getTradingClearingRegistryPurpose());
tkr.setActive(Status.Active.equalsByKey(tradingClearingRegistry.getStatus()));
String accountType;
if (clientCode == null) {
if (TradingClearingRegistryType.Client_B.equalsByKey(
tradingClearingRegistry.getTradingClearingRegistryType())) {
accountType = "Клиентский общий";
} else {
accountType = "Общий";
}
} else {
tkr.setClientCode(clientCode.getCode());
accountType = "Клиентский обособленный";
}
tkr.setAccountTypeName(accountType);
if (tradingClearingRegistry.getDepoAccountId() != null) {
AccountSymbols depoAccountSymbol = accountSymbolsImdg.getFirstObjectByFieldValues(
Map.of("accountId", tradingClearingRegistry.getDepoAccountId())
);
if (depoAccountSymbol != null) {
tkr.setDepoAccount(depoAccountSymbol.getAccountSymbolValue());
}
}
{
if (tradingClearingRegistry.getMoneyAccountId() != null) {
Account moneyAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getMoneyAccountId());
MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse();
moneyAccountMsg.setAccount(moneyAccount.getAccount());
moneyAccountMsg.setCurrCode(StringUtils.hasText(moneyAccount.getCurrency()) ? moneyAccount.getCurrency() : "RUB");
getEksAccount(moneyAccount).ifPresent(moneyAccountMsg::setEksAccount);
moneyAccountMsg.setActive(Status.Active.equalsByKey(moneyAccount.getStatus()));
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
{
Collection<TradingClearingRegistryList> tradingClearingRegistries = tradingClearingRegistryListImdg.getCollectionObjectsByFieldValues(
Map.of(
"tradingClearingRegistryId", tradingClearingRegistry.getId()
)
);
for (TradingClearingRegistryList tkrList : tradingClearingRegistries) {
Account additionalAcc = accountImdg.getSingleObjectByID(tkrList.getAccountId());
MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse();
moneyAccountMsg.setAccount(additionalAcc.getAccount());
getEksAccount(additionalAcc).ifPresent(moneyAccountMsg::setEksAccount);
moneyAccountMsg.setCurrCode(StringUtils.hasText(additionalAcc.getCurrency()) ? additionalAcc.getCurrency() : "RUB");
moneyAccountMsg.setActive(Status.Active.equalsByKey(additionalAcc.getStatus()));
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
return Optional.of(tkr);
}
return Optional.empty();
}
private Optional<String> getEksAccount(Account account) {
if (AccountType.Info.equalsByKey(account.getAccountType())) {
String currency = StringUtils.hasText(account.getCurrency()) ? account.getCurrency() : CurrencyCode.RUB.getKey();
Account anltAcc = accountImdg.getFirstObjectByFieldValues(
Map.of(
"currency", currency,
"accountType", AccountType.Anlt.getKey()
)
);
if (anltAcc != null) {
return Optional.of(anltAcc.getAccount());
}
}
return Optional.empty();
}
/**
* company-service сообщение об успешном добавлении ТКР клиента с параметром tradingClearingRegistry.code

View file

@ -1,161 +0,0 @@
package ru.spcex.clearing.account.service.v2;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Service
public class GatewayRequestCreator {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final Imdg<Company> companyImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<ClientCode> clientCodeImdg;
private final Imdg<Account> accountImdg;
private final Imdg<AccountSymbols> accountSymbolsImdg;
private final Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
public GatewayRequestCreator(ImdgProvider imdgProvider) {
this.imdgProvider = imdgProvider;
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
}
public Tkr crateErrorTkrToGateway(TkrAccount tkrAccount, Optional<String> errorMsg) {
Tkr tkr = new Tkr();
tkr.setTkrCode(tkrAccount.getTkrCode());
tkr.setClientCode(tkrAccount.getClientCode());
tkr.setCompanyId(tkrAccount.getCompanyId());
tkr.setDepoAccount(tkrAccount.getDepoAccount());
tkr.setMoneyAccounts(tkrAccount.getMoneyAccounts()
.stream()
.map(this::convertAccountToResponse)
.collect(Collectors.toList()));
errorMsg.ifPresent(tkr::setErrorMessage);
return tkr;
}
public Optional<Tkr> createTkrGatewayReq(TradingClearingRegistry tradingClearingRegistry) {
Tkr tkr = new Tkr();
log.debug("Found TKR with id: {} and code: {}", tradingClearingRegistry.getId(), tradingClearingRegistry.getCode());
Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId());
CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.UUID.getKey(),
"companyId", company.getId()
)
);
if (companySymbols == null) {
log.warn("CompanySymbols is null, searched by company.id: {}, skip this tkr", company.getId());
return Optional.empty();
}
ClientCode clientCode = clientCodeImdg.getFirstObjectByFieldValues(
Map.of("tradingClearingRegistryId", tradingClearingRegistry.getId())
);
tkr.setCompanyId(companySymbols.getCompanySymbolValue());
tkr.setTradingCode(Long.valueOf(company.getTradingCode()));
tkr.setTkrCode(tradingClearingRegistry.getCode());
tkr.setTkrType(tradingClearingRegistry.getTradingClearingRegistryPurpose());
tkr.setActive(Status.Active.equalsByKey(tradingClearingRegistry.getStatus()));
String accountType;
if (clientCode == null) {
if (TradingClearingRegistryType.Client_B.equalsByKey(
tradingClearingRegistry.getTradingClearingRegistryType())) {
accountType = "Клиентский общий";
} else {
accountType = "Общий";
}
} else {
tkr.setClientCode(clientCode.getCode());
accountType = "Клиентский обособленный";
}
tkr.setAccountTypeName(accountType);
if (tradingClearingRegistry.getDepoAccountId() != null) {
AccountSymbols depoAccountSymbol = accountSymbolsImdg.getFirstObjectByFieldValues(
Map.of("accountId", tradingClearingRegistry.getDepoAccountId())
);
if (depoAccountSymbol != null) {
tkr.setDepoAccount(depoAccountSymbol.getAccountSymbolValue());
}
}
{
if (tradingClearingRegistry.getMoneyAccountId() != null) {
Account moneyAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getMoneyAccountId());
MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse();
moneyAccountMsg.setAccount(moneyAccount.getAccount());
moneyAccountMsg.setCurrCode(StringUtils.hasText(moneyAccount.getCurrency()) ? moneyAccount.getCurrency() : "RUB");
getEksAccount(moneyAccount).ifPresent(moneyAccountMsg::setEksAccount);
moneyAccountMsg.setActive(Status.Active.equalsByKey(moneyAccount.getStatus()));
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
{
Collection<TradingClearingRegistryList> tradingClearingRegistries = tradingClearingRegistryListImdg.getCollectionObjectsByFieldValues(
Map.of(
"tradingClearingRegistryId", tradingClearingRegistry.getId()
)
);
for (TradingClearingRegistryList tkrList : tradingClearingRegistries) {
Account additionalAcc = accountImdg.getSingleObjectByID(tkrList.getAccountId());
MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse();
moneyAccountMsg.setAccount(additionalAcc.getAccount());
getEksAccount(additionalAcc).ifPresent(moneyAccountMsg::setEksAccount);
moneyAccountMsg.setCurrCode(StringUtils.hasText(additionalAcc.getCurrency()) ? additionalAcc.getCurrency() : "RUB");
moneyAccountMsg.setActive(Status.Active.equalsByKey(additionalAcc.getStatus()));
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
return Optional.of(tkr);
}
private Optional<String> getEksAccount(Account account) {
if (AccountType.Info.equalsByKey(account.getAccountType())) {
String currency = StringUtils.hasText(account.getCurrency()) ? account.getCurrency() : CurrencyCode.RUB.getKey();
Account anltAcc = accountImdg.getFirstObjectByFieldValues(
Map.of(
"currency", currency,
"accountType", AccountType.Anlt.getKey()
)
);
if (anltAcc != null) {
return Optional.of(anltAcc.getAccount());
}
}
return Optional.empty();
}
private MoneyAccountMsgResponse convertAccountToResponse(MoneyAccountMsgRequest moneyAccountMsgRequest) {
MoneyAccountMsgResponse msgResponse = new MoneyAccountMsgResponse();
msgResponse.setAccount(moneyAccountMsgRequest.getAccount());
msgResponse.setCurrCode(moneyAccountMsgRequest.getCurrCode());
return msgResponse;
}
}

View file

@ -1,145 +0,0 @@
package ru.spcex.clearing.account.service.v2.facade;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.spcex.clearing.account.service.AccountHelper;
import ru.spcex.clearing.account.service.InformationAccountService;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.platform.classes.base.interfaces.IClearingFacade;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.Sender;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
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.collection.Pair;
@Service
public class AccountFacade implements IClearingFacade {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgId idGenerator;
private final ImdgProvider imdgProvider;
private final Imdg<Account> accountImdg;
private final Imdg<InformationAccount> informationAccountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<Currency> currencyImdg;
private final InformationAccountService informationAccountService;
private final AccountHelper accountHelper;
private final TradingClearingRegistryFacade tradingClearingRegistryFacade;
private final TradingClearingRegistryListFacade tradingClearingRegistryListFacade;
public AccountFacade(ImdgProvider imdgProvider,
InformationAccountService informationAccountService,
AccountHelper accountHelper,
TradingClearingRegistryFacade tradingClearingRegistryFacade,
TradingClearingRegistryListFacade tradingClearingRegistryListFacade) {
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.imdgProvider = imdgProvider;
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
this.informationAccountService = informationAccountService;
this.accountHelper = accountHelper;
this.tradingClearingRegistryFacade = tradingClearingRegistryFacade;
this.tradingClearingRegistryListFacade = tradingClearingRegistryListFacade;
}
public Pair<Long, String> createAccountInfo(MoneyAccountMsgRequest moneyAccountMsgRequest, Company company) {
String currencyCode = moneyAccountMsgRequest.getCurrCode() == null ? CurrencyCode.RUB.getKey() : moneyAccountMsgRequest.getCurrCode();
Instant now = Instant.now();
String accountValue = defineAccountValForInfo(currencyCode, moneyAccountMsgRequest.getEks_account());
Account account = new Account();
account.setCompanyId(company.getId());
account.setAccount(accountValue);
account.setAccountType(AccountType.Info.getKey());
account.setCurrency(currencyCode);
account.setStatus(WorkflowStatus.Active.getKey());
account.setCreated(now);
account.setUpdated(now);
accountHelper.fillAccountFromRelation(account, null, false);
accountImdg.insert(account);
Long specificAccId = makeInfoPart(account).getAccountId();
return new Pair<>(specificAccId, currencyCode);
}
private String defineAccountValForInfo(String currencyCode, String eksAccount) {
ImdgPredicateBuilder predicateBuilder = currencyImdg.predicateBuilder();
Currency currency = currencyImdg.getFirstObjectByPredicate(
predicateBuilder.equals("currencyCode", currencyCode)
);
Long currencyCodeId = CurrencyCode.RUB.getKey().equals(currencyCode) ? 810 : currency.getId();
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
ImdgPredicate andPredicate = pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("currency", currencyCode),
pb.equals("account", eksAccount)
);
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
log.warn("Account with {} not exist.", andPredicate);
} else if (accountsAnlt.size() > 1) {
log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first");
}
Account anltAccount = accountsAnlt.iterator().next();
String specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4);
Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId);
String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId, specialAnltAccId);
log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue);
return accountValue;
}
private InformationAccount makeInfoPart(Account account) {
InformationAccount infoAcc = new InformationAccount();
infoAcc.setAccountId(account.getId());
Account firstAccountAntl = accountImdg.getFirstObjectByFieldValues(Map.of(
"companyId", Sender.One.getId(),
"accountType", AccountType.Anlt.getKey(),
"currency", account.getCurrency()
));
if (firstAccountAntl == null) {
log.warn("Can not find 1 ANTL {} account for fill information ClearingAccountId.", account.getCurrency());
} else {
infoAcc.setClearingAccountId(firstAccountAntl.getId());
}
infoAcc.setCompanyId(account.getCompanyId());
Long infoId = informationAccountImdg.insert(infoAcc);
log.debug("For account id={} make InformationAccount id={}", account.getId(), infoId);
return infoAcc;
}
protected ClearingAccount makeClrnPart(Account account) {
ClearingAccount clnrAcc = new ClearingAccount();
clnrAcc.setAccountId(account.getId());
clnrAcc.setCompanyId(account.getCompanyId());
Long clrnId = clearingAccountImdg.insert(clnrAcc);
log.debug("For account id={} make ClearingAccount id={}", account.getId(), clrnId);
return clnrAcc;
}
public void lock() {
// tradingClearingRegistryFacade.lock()
// tradingClearingRegistryListFacade.lock()
}
public void unlock() {
// tradingClearingRegistryFacade.lock()
// tradingClearingRegistryListFacade.lock()
}
}

View file

@ -1,115 +0,0 @@
package ru.spcex.clearing.account.service.v2.facade;
import java.time.Instant;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.model.TrkCreationResult;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.platform.classes.base.interfaces.IClearingFacade;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class ClientCodeFacade implements IClearingFacade {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgId idGenerator;
private final ImdgProvider imdgProvider;
private final Imdg<ClientCode> clientCodeImdg;
private final TradingClearingRegistryFacade tradingClearingRegistryFacade;
private final TradingClearingRegistryListFacade tradingClearingRegistryListFacade;
public ClientCodeFacade(ImdgProvider imdgProvider,
TradingClearingRegistryFacade tradingClearingRegistryFacade, TradingClearingRegistryListFacade tradingClearingRegistryListFacade) {
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.imdgProvider = imdgProvider;
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.tradingClearingRegistryFacade = tradingClearingRegistryFacade;
this.tradingClearingRegistryListFacade = tradingClearingRegistryListFacade;
}
/**
* Создает clientCode, TCR и опционально TCRList, если указаны валюты.
*/
public TrkCreationResult createClientCodeWithTkr(ClientCodeNewRequest request, IValidator validator, boolean isClearingAcc) {
log.trace("Start process creating new client code");
TradingClearingRegistry tradingClearingRegistry;
{
log.debug("Trading Clearing Registry is not exist, creating...");
TradingClearingRegistryNewRequest creationTcrRequest = new TradingClearingRegistryNewRequest();
creationTcrRequest.setCompanyId(request.getCompanyId());
creationTcrRequest.setMoneyAccountId(request.getMoneyAccountId());
creationTcrRequest.setDepoAccountId(request.getDepoAccountId());
creationTcrRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey());
tradingClearingRegistry = tradingClearingRegistryFacade.createTradingClearingRegistry(creationTcrRequest, null, isClearingAcc);
}
{
if (request.getCurrencyAccountList() != null && !request.getCurrencyAccountList().isEmpty()) {
TradingClearingRegistryListNewRequest tcrListNew = new TradingClearingRegistryListNewRequest();
tcrListNew.setTradingClearingRegistryId(tradingClearingRegistry.getId());
tcrListNew.setCurrencyAccountList(request.getCurrencyAccountList());
List<Long> tkrListIds = tradingClearingRegistryListFacade.createTradingClearingRegistryList(tcrListNew, null);
}
}
ClientCode clientCode;
{
ImdgPredicateBuilder predicateBuilder = clientCodeImdg.predicateBuilder();
clientCode = clientCodeImdg.getFirstObjectByPredicate(
predicateBuilder.and(
predicateBuilder.equals("companyId", request.getCompanyId()),
predicateBuilder.equals("code", request.getCode()),
predicateBuilder.equals("tradingClearingRegistryId", tradingClearingRegistry.getId()),
predicateBuilder.equals("status", Status.Active.getKey())
)
);
if (clientCode == null) {
clientCode = new ClientCode();
clientCode.setCreated(Instant.now());
clientCode.setUpdated(clientCode.getCreated());
clientCode.setCompanyId(request.getCompanyId());
clientCode.setCode(request.getCode());
clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId());
clientCode.setStatus(Status.Active.getKey());
clientCodeImdg.insert(clientCode);
log.debug("successfully processed, new clientCode id {}", clientCode.getId());
}
}
return new TrkCreationResult(clientCode, tradingClearingRegistry);
}
public void createClientCode(ClientCodeNewRequest request) {
log.trace("Start process creating new client code");
ClientCode clientCode = new ClientCode();
clientCode.setCreated(Instant.now());
clientCode.setUpdated(clientCode.getCreated());
clientCode.setCompanyId(request.getCompanyId());
clientCode.setCode(request.getCode());
clientCode.setTradingClearingRegistryId(request.getTradingClearingRegistryId());
clientCode.setStatus(request.getStatus());
clientCodeImdg.insert(clientCode);
log.debug("successfully processed, new clientCode id {}", clientCode.getId());
}
public void lock() {
// tradingClearingRegistryFacade.lock()
// tradingClearingRegistryListFacade.lock()
}
public void unlock() {
// tradingClearingRegistryFacade.lock()
// tradingClearingRegistryListFacade.lock()
}
}

View file

@ -1,255 +0,0 @@
package ru.spcex.clearing.account.service.v2.facade;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.model.TradingClearingRegistryBusiness;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class TradingClearingRegistryFacade {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final KafkaSender kafkaSender;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<DepoAccount> depoAccountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<InformationAccount> informationAccountImdg;
private final Imdg<Company> companyImdg;
public TradingClearingRegistryFacade(ImdgProvider imdgProvider,
KafkaSender kafkaSender) {
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.kafkaSender = kafkaSender;
}
public TradingClearingRegistry createTradingClearingRegistry(TradingClearingRegistryNewRequest request,
IValidator validator,
boolean isClearingAcc) {
Long id = tradingClearingRegistryImdg.nextIDSequenceFor();
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(id);
tradingClearingRegistry.setCompanyId(request.getCompanyId());
tradingClearingRegistry.setMoneyAccountId(request.getMoneyAccountId());
tradingClearingRegistry.setDepoAccountId(request.getDepoAccountId());
DepoAccount depoAccount = request.getDepoAccountId() != null ?
depoAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getDepoAccountId())) : null;
String tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
if (isClearingAcc) {
ClearingAccount clearingAccount = request.getMoneyAccountId() != null ?
clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getMoneyAccountId())) : null;
if (clearingAccount != null) {
tradingRegistryType = clearingAccount.getClearingAccountType();
}
}
if (request.getStatus() == null) {
tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
log.trace("TCR status in request not set. Use default: {}", tradingClearingRegistry.getStatus());
} else {
tradingClearingRegistry.setStatus(request.getStatus());
log.trace("TCR status in request set: {}", tradingClearingRegistry.getStatus());
}
if (request.getTradingClearingRegistryType() != null) {
tradingRegistryType = request.getTradingClearingRegistryType();
} else if (depoAccount != null) {
tradingRegistryType = depoAccount.getDepoAccountType();
}
tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
//http://jira.mfd.msk:8088/browse/CLS-631#comment-60200
TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = companyImdg.getSingleObjectByID(request.getCompanyId());
Long seqId = companySequenceNextId(request.getCompanyId(), registryPurpose, tradingRegistryType);
String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId);
log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, request.getCompanyId(), seqId, code);
tradingClearingRegistry.setCode(code);
Instant now = Instant.now();
tradingClearingRegistry.setCreated(now);
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.info("New TCR.id={} was created.", tradingClearingRegistry.getId());
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("successfully processed, id {}", id);
return tradingClearingRegistry;
}
public TradingClearingRegistry createTradingClearingRegistry(TradingClearingRegistryBusiness businessRequest) {
Long id = tradingClearingRegistryImdg.nextIDSequenceFor();
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(id);
tradingClearingRegistry.setCompanyId(businessRequest.getCompany().getId());
tradingClearingRegistry.setMoneyAccountId(businessRequest.getMoneyAccount().getId());
businessRequest.getDepoAccount().ifPresent(depoAccount ->
tradingClearingRegistry.setDepoAccountId(depoAccount.getId()));
;
if (businessRequest.getTradingClearingRegistryType().isEmpty()){
if (businessRequest.getDepoAccount().isPresent()){
}
}
// ClearingAccount clearingAccount = request.getMoneyAccountId() != null ?
// clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getMoneyAccountId())) : null;
//
// if (request.getStatus() == null) {
// tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
// log.trace("TCR status in request not set. Use default: {}", tradingClearingRegistry.getStatus());
// } else {
// tradingClearingRegistry.setStatus(request.getStatus());
// log.trace("TCR status in request set: {}", tradingClearingRegistry.getStatus());
// }
//
// String tradingRegistryType;
// if (request.getTradingClearingRegistryType() != null) {
// tradingRegistryType = request.getTradingClearingRegistryType();
// } else if (depoAccount != null) {
// tradingRegistryType = depoAccount.getDepoAccountType();
// } else {
// if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType();
// else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
// }
// tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
//http://jira.mfd.msk:8088/browse/CLS-631#comment-60200
TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = businessRequest.getCompany();
// Long seqId = companySequenceNextId(company.getId(), registryPurpose, tradingRegistryType);
// String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId);
// log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, company.getId(), seqId, code);
// tradingClearingRegistry.setCode(code);
Instant now = Instant.now();
tradingClearingRegistry.setCreated(now);
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.info("New TCR.id={} was created.", tradingClearingRegistry.getId());
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("successfully processed, id {}", id);
return tradingClearingRegistry;
}
private Long companySequenceNextId(Long companyId,
TradingClearingRegistryPurpose registryPurpose,
String tradingRegistryType) {
Imdg<TradingClearingRegistry> tradingClearingRegistryImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class
);
ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder();
Collection<TradingClearingRegistry> existTCR = tradingClearingRegistryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("companyId", companyId),
pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()),
pb.equals("tradingClearingRegistryType", tradingRegistryType)
)
);
if (existTCR.isEmpty()) {
log.trace("For company id={} not found exist TCR.", companyId);
return 1L;
}
log.trace("For company id={} found {} exist TCR.", companyId, existTCR.size());
long maxN = 0;
for (TradingClearingRegistry tcr : existTCR) {
Long codeN = parseCodeSeqId(tcr.getCode());
if (codeN != null) {
if (maxN < codeN)
maxN = codeN;
}
}
return maxN + 1;
}
private Long parseCodeSeqId(String code) {
if (code == null || code.isBlank())
return null;
try {
String toParse = code.trim();
if (toParse.length() > 5)
toParse = toParse.substring(toParse.length() - 5);
return Long.parseLong(toParse);
} catch (NumberFormatException nan) {
log.warn("Can not parse number from TCR code \"{}\": {}", code, nan.getMessage());
}
return null;
}
private String makeCode(String companyClearingCode,
TradingClearingRegistryPurpose registryPurpose,
String tradingRegistryType,
Long id) {
String code;
code = companyClearingCode;
if (code.length() > 4)
code = code.substring(code.length() - 4);
code = "%4s".formatted(code).replace(' ', '0');
// code += registryPurpose.getKey(); // C / M / ...
code += "C";//пока ставим всегда С, возможно придется откатить
String trType = tradingRegistryType + "T"; // 2 символа
code += trType;
String sId = "%5s".formatted(id).replace(' ', '0');
if (sId.length() > 5)
sId = sId.substring(sId.length() - 5);
code += sId;
return code; // 12 символов
}
private void sendNotificationToClearingSvc(TradingClearingRegistry tradingClearingRegistry) {
CreateRegistryRequest request = new CreateRegistryRequest();
request.setCompanyId(tradingClearingRegistry.getCompanyId());
request.setTradingClearingRegistryId(tradingClearingRegistry.getId());
log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request);
}
/**
* report-service сообщение на формирование уведомления о создании нового ТКР
*/
private void sendNotificationToReportSvc(TradingClearingRegistry tradingClearingRegistry) {
NotificationRequest request = new NotificationRequest();
request.setConsumerId(tradingClearingRegistry.getCompanyId());
log.debug("Send message to kafka \"{}\": {}", Consts.CREATE_NOTIFICATION_NTCR, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.CREATE_NOTIFICATION_NTCR, request);
}
}

View file

@ -1,87 +0,0 @@
package ru.spcex.clearing.account.service.v2.facade;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Service
public class TradingClearingRegistryListFacade {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final KafkaSender kafkaSender;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
private final Imdg<Account> accountImdg;
public TradingClearingRegistryListFacade(ImdgProvider imdgProvider,
KafkaSender kafkaSender) {
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList,
TradingClearingRegistryList.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.kafkaSender = kafkaSender;
}
public static class Stored {
TradingClearingRegistry tcr;
Account account;
}
public List<Long> createTradingClearingRegistryList(TradingClearingRegistryListNewRequest request,
Stored stored) {
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(request.getTradingClearingRegistryId());
Instant now = Instant.now();
List<Long> newIds = new ArrayList<>();
for (Long currAccId : request.getCurrencyAccountList()) {
Long id = tradingClearingRegistryListImdg.nextIDSequenceFor();
TradingClearingRegistryList tradingClearingRegistryList = new TradingClearingRegistryList();
tradingClearingRegistryList.setId(id);
tradingClearingRegistryList.setCreated(now);
tradingClearingRegistryList.setUpdated(now);
tradingClearingRegistryList.setTradingClearingRegistryId(tcr.getId());
tradingClearingRegistryList.setAccountId(currAccId);
Account account = accountImdg.getSingleObjectByID(currAccId);
tradingClearingRegistryList.setCurrency(account.getCurrency());
if (request.getStatus() == null) {
tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey());
log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus());
} else {
tradingClearingRegistryList.setStatus(request.getStatus());
}
tradingClearingRegistryListImdg.insert(tradingClearingRegistryList);
newIds.add(id);
}
log.info("New TCRList.id={} has created.", newIds);
newIds.forEach(listId -> sendNotificationToClearingSvc(listId, tcr));
return newIds;
}
private void sendNotificationToClearingSvc(Long tradingClearingRegistryId, TradingClearingRegistry tcr) {
CreateRegistryRequest request = new CreateRegistryRequest();
request.setTcrListId(tradingClearingRegistryId);
request.setCompanyId(tcr.getCompanyId());
request.setTradingClearingRegistryId(tcr.getId());
log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request);
}
}

View file

@ -1,312 +0,0 @@
package ru.spcex.clearing.account.service.v2.listeners;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.model.TrkCreationResult;
import ru.spcex.clearing.account.model.ValidationResult;
import ru.spcex.clearing.account.service.TradingClearingRegistryService;
import ru.spcex.clearing.account.service.v2.GatewayRequestCreator;
import ru.spcex.clearing.account.service.v2.facade.AccountFacade;
import ru.spcex.clearing.account.service.v2.facade.ClientCodeFacade;
import ru.spcex.clearing.account.service.v2.facade.TradingClearingRegistryListFacade;
import ru.spcex.clearing.account.service.v2.validators.ClientCodeValidator;
import ru.spcex.clearing.account.validation.ClientCodeStoreObjects;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.collection.Pair;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class ClientCodeMessageListener extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final KafkaSender kafkaSender;
private final ImdgProvider imdgProvider;
private final ClientCodeFacade clientCodeFacade;
private final ClientCodeValidator clientCodeValidator;
private final GatewayRequestCreator gatewayRequestCreator;
private final UserRoleVerification userRoleVerification;
private final AccountFacade accountFacade;
private final TradingClearingRegistryService tradingClearingRegistryService;
private final TradingClearingRegistryListFacade tradingClearingRegistryListFacade;
public ClientCodeMessageListener(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ImdgProvider imdgProvider,
ClientCodeFacade clientCodeFacade,
ClientCodeValidator clientCodeValidator,
GatewayRequestCreator gatewayRequestCreator,
UserRoleVerification userRoleVerification,
AccountFacade accountFacade,
TradingClearingRegistryService tradingClearingRegistryService,
TradingClearingRegistryListFacade tradingClearingRegistryListFacade) {
super(kafkaQueue, kafkaProducer);
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
this.clientCodeFacade = clientCodeFacade;
this.clientCodeValidator = clientCodeValidator;
this.gatewayRequestCreator = gatewayRequestCreator;
this.userRoleVerification = userRoleVerification;
this.accountFacade = accountFacade;
this.tradingClearingRegistryService = tradingClearingRegistryService;
this.tradingClearingRegistryListFacade = tradingClearingRegistryListFacade;
}
@Override
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
//from backend-api requests
callback(ClientCodeNewRequest.class)
.setFunction(this::clientCodeNewFromBackend)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put);
//from gateway requests
callback(TkrAccountsGatewayRequest.class)
.setFunction(this::clientCodeNewFromGateway)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY, callbacks::put);
callback(TkrAccountsGatewayRequest.class)
.setFunction(this::clientCodeUpdateFromGateway)
.forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE_FROM_GATEWAY, callbacks::put);
init();
}
private RequestInfoUpdate clientCodeNewFromGateway(BaseRequest<TkrAccountsGatewayRequest> tkrRequest) {
clientCodeFacade.lock();
//валидация запроса
TkrAccountsGatewayRequest gatewayRequest = tkrRequest.getRequestPayload();
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.setRequestId(gatewayRequest.getRequestId());
AtomicBoolean isAnyoneInvalid = new AtomicBoolean(false);
Map<TkrAccount, ValidationResult> eksAccountsAfterValidation = new HashMap<>();
Map<TkrAccount, ValidationResult> accountsAfterValidation = new HashMap<>();
gatewayRequest.getAccounts().forEach(tkrAccount -> {
ValidationResult validationResult = clientCodeValidator.checkGatewayRequestWithEksAcc(tkrAccount);
if (!validationResult.isValid()) {
log.debug("Validation failed for tkr.client_code {}", tkrAccount.getClientCode());
isAnyoneInvalid.set(true);
}
eksAccountsAfterValidation.put(tkrAccount, validationResult);
});
if (isAnyoneInvalid.get()) {
log.debug("Create error request to gateway service");
List<Tkr> eksTkrs = makeErrorTkrResponse(eksAccountsAfterValidation);
sendTkrRequest.getTkrs().addAll(eksTkrs);
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
return null;
}
processEksAccount(eksAccountsAfterValidation, sendTkrRequest);
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
return null;
}
private RequestInfoUpdate clientCodeUpdateFromGateway(BaseRequest<TkrAccountsGatewayRequest> tkrRequest) {
TkrAccountsGatewayRequest gatewayRequest = tkrRequest.getRequestPayload();
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.setRequestId(gatewayRequest.getRequestId());
AtomicBoolean isAnyoneInvalid = new AtomicBoolean(false);
Map<TkrAccount, ValidationResult> eksAccountsAfterValidation = new HashMap<>();
gatewayRequest.getAccounts().forEach(tkrAccount -> {
ValidationResult validationResult = clientCodeValidator.checkGatewayUpdateRequestWithEksAcc(tkrAccount);
if (!validationResult.isValid()) {
log.debug("Validation failed for tkr.client_code {}", tkrAccount.getClientCode());
isAnyoneInvalid.set(true);
}
eksAccountsAfterValidation.put(tkrAccount, validationResult);
});
if (isAnyoneInvalid.get()) {
log.debug("Create error request to gateway service");
List<Tkr> eksTkrs = makeErrorTkrResponse(eksAccountsAfterValidation);
sendTkrRequest.getTkrs().addAll(eksTkrs);
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
return null;
}
processUpdateEksAccount(eksAccountsAfterValidation, sendTkrRequest);
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
return null;
}
private void processEksAccount(Map<TkrAccount, ValidationResult> accountsAfterValidation, SendTkrRequest tkrRequest) {
for (Map.Entry<TkrAccount, ValidationResult> entry : accountsAfterValidation.entrySet()) {
TkrAccount tkrAccount = entry.getKey();
ValidationResult validationResult = entry.getValue();
IValidator validator = validationResult.validator();
Company company = validator.getStored(ClientCodeStoreObjects.COMPANY);
Optional<DepoAccount> depoAccount = validator.getStored(ClientCodeStoreObjects.DEPO_ACCOUNT);
Long depoAccountId = depoAccount.map(DepoAccount::getAccountId).orElse(null);
List<Pair<Long, String>> accountIds = new ArrayList<>();
for (MoneyAccountMsgRequest account : tkrAccount.getMoneyAccounts()) {
if (StringUtils.hasText(account.getEks_account())) {
log.debug("eks_account is filled, creating info account: {}", account.getEks_account());
Pair<Long, String> accId = accountFacade.createAccountInfo(account, company);
accountIds.add(accId);
}
}
List<Account> clrnAccs = validator.getStored(ClientCodeStoreObjects.CLRN_ACCS);
clrnAccs.forEach(acc -> accountIds.add(new Pair<>(acc.getId(), acc.getCurrency())));
Long rubMoneyAcc = accountIds.stream()
.filter(pair -> CurrencyCode.RUB.equalsByKey(pair.getSecond()))
.findFirst()
.map(Pair::getFirst)
.orElse(null);
List<Long> accIds = accountIds.stream()
.filter(pair -> !CurrencyCode.RUB.equalsByKey(pair.getSecond()))
.map(Pair::getFirst)
.toList();
ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest();
log.debug("Creating new clientCode by tkr account: {}", tkrAccount.getClientCode());
clientCodeNewRequest.setCompanyId(company.getId());
clientCodeNewRequest.setCode(tkrAccount.getClientCode());
clientCodeNewRequest.setMoneyAccountId(rubMoneyAcc);
clientCodeNewRequest.setDepoAccountId(depoAccountId);
clientCodeNewRequest.setCurrencyAccountList(accIds);
TrkCreationResult result = clientCodeFacade.createClientCodeWithTkr(clientCodeNewRequest, validator, false);
Optional<Tkr> tkrReq = gatewayRequestCreator.createTkrGatewayReq(result.tradingClearingRegistry());
tkrReq.ifPresent(tkr -> tkrRequest.getTkrs().add(tkr));
}
}
private void processUpdateEksAccount(Map<TkrAccount, ValidationResult> accountsAfterValidation, SendTkrRequest tkrRequest) {
Imdg<Registry> registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
for (Map.Entry<TkrAccount, ValidationResult> entry : accountsAfterValidation.entrySet()) {
TkrAccount tkrAccount = entry.getKey();
ValidationResult validationResult = entry.getValue();
IValidator validator = validationResult.validator();
Company company = validator.getStored(ClientCodeStoreObjects.COMPANY);
List<Account> clrnAccs = validator.getStored(ClientCodeStoreObjects.CLRN_ACCS);
List<Account> anltAccs = validator.getStored(ClientCodeStoreObjects.ANLT_ACCS);
TradingClearingRegistry tradingClearingRegistry = validator.getStored(ClientCodeStoreObjects.TRADING_CLEARING_REGISTRY);
List<Long> accIds = new ArrayList<>();
for (MoneyAccountMsgRequest account : tkrAccount.getMoneyAccounts()) {
if (account.getStatus().equals("NOW")) {
continue;
}
if (StringUtils.hasText(account.getEks_account())) {
log.debug("eks_account is filled, creating info account: {}", account.getEks_account());
Pair<Long, String> accId = accountFacade.createAccountInfo(account, company);
accIds.add(accId.getFirst());
}
}
clrnAccs.forEach(account -> accIds.add(account.getId()));
TradingClearingRegistryListNewRequest tcrListNew = new TradingClearingRegistryListNewRequest();
tcrListNew.setTradingClearingRegistryId(tradingClearingRegistry.getId());
tcrListNew.setCurrencyAccountList(accIds);
List<Long> tkrListIds = tradingClearingRegistryListFacade.createTradingClearingRegistryList(tcrListNew, null);
for (Long accId : accIds) {
log.debug("Registries updated for account {}", accId);
ImdgPredicateBuilder predicateBuilder = registryImdg.predicateBuilder();
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(
predicateBuilder.equals("accountId", accId)
);
registries.forEach(registry -> {
registry.setTradingClearingRegistryId(tradingClearingRegistry.getId());
registry.setTradingClearingRegistry(tradingClearingRegistry.getCode());
registry.setUpdated(Instant.now());
registryImdg.update(registry);
});
}
Optional<Tkr> tkrReq = gatewayRequestCreator.createTkrGatewayReq(tradingClearingRegistry);
tkrReq.ifPresent(tkr -> tkrRequest.getTkrs().add(tkr));
}
}
private RequestInfoUpdate clientCodeNewFromBackend(BaseRequest<ClientCodeNewRequest> clientCodeNewRequest) {
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(clientCodeNewRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
ClientCodeNewRequest request = clientCodeNewRequest.getRequestPayload();
ValidationResult validationResult = clientCodeValidator.checkBackendNewRequest(request);
if (!validationResult.isValid()) {
return makeErrorResponse(clientCodeNewRequest, validationResult);
}
clientCodeFacade.createClientCode(request);
return null;
}
private List<Tkr> makeErrorTkrResponse(Map<TkrAccount, ValidationResult> eksAccountsAfterValidation) {
return eksAccountsAfterValidation.entrySet()
.stream()
.map(tkrAccountValidationResultEntry ->
gatewayRequestCreator.crateErrorTkrToGateway(
tkrAccountValidationResultEntry.getKey(),
tkrAccountValidationResultEntry.getValue().errorMsg()
))
.toList();
}
private RequestInfoUpdate makeErrorResponse(BaseRequest<ClientCodeNewRequest> clientCodeNewRequest,
ValidationResult validationResult) {
RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate();
requestInfoUpdate.setId(clientCodeNewRequest.getId());
requestInfoUpdate.setStatus(Status.Error);
validationResult.errorMsg().ifPresent(requestInfoUpdate::setMessage);
return requestInfoUpdate;
}
private TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) {
Map<String, Comparable<?>> query = new HashMap<>();
query.put("companyId", companyId);
query.put("moneyAccountId", moneyAccountId);
query.put("tradingClearingRegistryType", TradingClearingRegistryType.Client_B.getKey());
if (depoAccountId != null) {
query.put("depoAccountId", depoAccountId);
}
Imdg<TradingClearingRegistry> tradingClearingRegistryImdg = imdgProvider
.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
TradingClearingRegistry result = tradingClearingRegistryImdg.getFirstObjectByFieldValues(query);
log.trace("TradingClearingRegistry by: {}; {} found", query, result == null ? "not" : "");
return result;
}
}

View file

@ -1,73 +0,0 @@
package ru.spcex.clearing.account.service.v2.validators;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.spcex.clearing.account.model.ValidationResult;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class ClientCodeValidator {
private final Logger log = LoggerFactory.getLogger(getClass());
private final UserRoleVerification userRoleVerification;
private final Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator;
private final Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator;
private final Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator;
private final Function<TkrAccount, IValidator> tkrAccountsGatewayValidator;
private final Function<TkrAccount, IValidator> tkrEksAccountsGatewayValidator;
private final Function<TkrAccount, IValidator> updateTkrEksAccountsGatewayValidator;
private final IMessageResolver messageResolver;
public ClientCodeValidator(UserRoleVerification userRoleVerification,
Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator,
Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator,
Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator,
Function<TkrAccount, IValidator> tkrAccountsGatewayValidator,
Function<TkrAccount, IValidator> tkrEksAccountsGatewayValidator,
@Qualifier("updateTkrEksAccountsGatewayValidator") Function<TkrAccount, IValidator> updateTkrEksAccountsGatewayValidator,
IMessageResolver messageResolver) {
this.userRoleVerification = userRoleVerification;
this.clientCodeNewRequestValidator = clientCodeNewRequestValidator;
this.clientCodeUpdateRequestValidator = clientCodeUpdateRequestValidator;
this.clientCodeDeleteRequestValidator = clientCodeDeleteRequestValidator;
this.tkrAccountsGatewayValidator = tkrAccountsGatewayValidator;
this.tkrEksAccountsGatewayValidator = tkrEksAccountsGatewayValidator;
this.updateTkrEksAccountsGatewayValidator = updateTkrEksAccountsGatewayValidator;
this.messageResolver = messageResolver;
}
public ValidationResult checkGatewayRequest(TkrAccount gatewayAccountRequest) {
return standardValidation(tkrAccountsGatewayValidator, gatewayAccountRequest);
}
public ValidationResult checkGatewayRequestWithEksAcc(TkrAccount gatewayAccountRequest) {
return standardValidation(tkrEksAccountsGatewayValidator, gatewayAccountRequest);
}
public ValidationResult checkGatewayUpdateRequestWithEksAcc(TkrAccount gatewayAccountRequest) {
return standardValidation(updateTkrEksAccountsGatewayValidator, gatewayAccountRequest);
}
public ValidationResult checkBackendNewRequest(ClientCodeNewRequest clientCodeNewRequest) {
return standardValidation(clientCodeNewRequestValidator, clientCodeNewRequest);
}
private <T> ValidationResult standardValidation(Function<T, IValidator> requestValidator, T request) {
IValidator validator = requestValidator.apply(request);
Optional<EnumMessage> error = validator.tillFirstError();
AtomicReference<Optional<String>> errorMsg = new AtomicReference<>();
error.ifPresent(err -> errorMsg.set(Optional.of(messageResolver.resolve(err))));
return new ValidationResult(validator, error, errorMsg.get());
}
}

View file

@ -1,7 +1,5 @@
package ru.spcex.clearing.account.validation;
import java.util.Map;
import java.util.Optional;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
@ -14,6 +12,9 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Map;
import java.util.Optional;
public enum AccountValidationRule implements IValidationRule<ImdgValidationContext<BankAccountNewRequest>> {
CompanyPresent() {

View file

@ -1,51 +0,0 @@
package ru.spcex.clearing.account.validation;
import java.util.List;
import java.util.Optional;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
public enum BackendClientCodeValidationRule implements IValidationRule<ImdgValidationContext<ClientCodeNewRequest>> {
AllAccountsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<ClientCodeNewRequest> context) {
ClientCodeNewRequest validatedObject = context.getValidatedObject();
List<Long> ids = validatedObject.getCurrencyAccountList();
if (ids == null || ids.isEmpty()) {
return empty(); // необязательное поле
}
Imdg<Account> imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
for (Long id : ids) {
if (id == null) { // null значения в массиве не ожидаются
return of(AccountError.RequiredFieldEmpty, "accountId");
}
Account byIdObject = imdg.getSingleObjectByID(id);
if (byIdObject == null)
return of(AccountError.AccountNotFound, id, "accountId");
}
return empty();
}
},
TcrIsPresentByAccount() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<ClientCodeNewRequest> context) {
ClientCodeNewRequest validatedObject = context.getValidatedObject();
Imdg<TradingClearingRegistry> tradingClearingRegistryImdg =
context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
TradingClearingRegistry tcrByMoneyAccount = tradingClearingRegistryImdg.getSingleObjectByID(validatedObject.getTradingClearingRegistryId());
if (tcrByMoneyAccount == null) {
return of(AccountError.TradingClearingRegistryNotFound);
}
return empty();
}
}
}

View file

@ -1,12 +0,0 @@
package ru.spcex.clearing.account.validation;
public enum ClientCodeStoreObjects {
COMPANY,
MONEY_ACCOUNT,
DEPO_ACCOUNT,
CLRN_ACCS,
ANLT_ACCS,
MAPPED_TO_CURRENCY_ACCOUNTS,
TRADING_CLEARING_REGISTRY,
CLIENT_CODE
}

View file

@ -1,160 +0,0 @@
package ru.spcex.clearing.account.validation;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.Status;
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.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
public enum GatewayClientCodeValidationRule implements IValidationRule<ImdgValidationContext<TkrAccount>> {
CompanyPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
Long tradingCode = validatedObject.getTradingCode();
if (tradingCode == null) {
return of(AccountError.RequiredFieldEmpty, "trading_code");
}
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Company company = companyImdg.getFirstObjectByFieldValues(
Map.of("tradingCode", String.valueOf(tradingCode))
);
if (company == null) {
return of(AccountError.COMPANY_NOT_FOUND_GTW, tradingCode);
}
context.storeObject(ClientCodeStoreObjects.COMPANY, company);
return Optional.empty();
}
},
AllAccountsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
List<MoneyAccountMsgRequest> accountList = validatedObject.getMoneyAccounts();
if (accountList == null || accountList.isEmpty()) {
return of(AccountError.RequiredFieldEmpty, "money_account");
}
List<String> currencies = accountList.stream().map(MoneyAccountMsgRequest::getCurrCode).toList();
if (!currencies.contains(CurrencyCode.RUB.getKey())) {
return of(AccountError.RequiredFieldEmpty, "money_account");
}
Imdg<Account> imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Map<String, Account> accountByCurrency = new HashMap<>();
for (MoneyAccountMsgRequest moneyAccountMsg : accountList) {
ImdgPredicateBuilder predicateBuilder = imdg.predicateBuilder();
ImdgPredicate currencyPredicate;
if (!StringUtils.hasText(moneyAccountMsg.getAccount())){
return of(AccountError.RequiredFieldEmpty, "account");
}
ImdgPredicate accountPredicate = predicateBuilder.equals("account", moneyAccountMsg.getAccount());
if (moneyAccountMsg.getCurrCode().equals(CurrencyCode.RUB.getKey())) {
currencyPredicate = predicateBuilder.or(
predicateBuilder.equals("currency", CurrencyCode.RUB.getKey()),
predicateBuilder.isNull("currency")
);
} else {
currencyPredicate = predicateBuilder.equals("currency", moneyAccountMsg.getCurrCode());
}
Account account = imdg.getFirstObjectByPredicate(
predicateBuilder.and(accountPredicate, currencyPredicate)
);
if (account == null) {
return of(AccountError.ACCOUNT_NOT_FOUND_GTW, moneyAccountMsg.getAccount(), "money_account");
}
accountByCurrency.put(moneyAccountMsg.getCurrCode(), account);
}
context.storeObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS, accountByCurrency);
return Optional.empty();
}
},
DepoAccountsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
String depoAccountVal = validatedObject.getDepoAccount();
if (!StringUtils.hasText(depoAccountVal)) {
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty());
return empty();
}
Imdg<Account> imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account depoAccount = imdg.getFirstObjectByFieldValues(
Map.of("account", depoAccountVal)
);
if (depoAccount == null) {
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty());
return of(AccountError.DepoAccountNotFound, "depo_account");
}
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, depoAccount);
return Optional.empty();
}
},
TcrIsNotPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
Map<String, Account> accountByCurrency = context.getStoredObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS);
Account moneyAccount = accountByCurrency.get(CurrencyCode.RUB.getKey());
if (moneyAccount == null) {
return of(AccountError.AccountNotFound);
}
Imdg<TradingClearingRegistry> imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
TradingClearingRegistry tcr = imdg.getFirstObjectByFieldValues(
Map.of(
"moneyAccountId", moneyAccount.getId(),
"status", Status.Active.getKey()
)
);
if (tcr != null) {
return of(AccountError.TradingClearingRegistryAlreadyExist, tcr.getCode(), "code");
}
return Optional.empty();
}
},
TcrListIsNotPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
Map<String, Account> accountByCurrency = context.getStoredObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS);
List<Account> currencyAccounts = accountByCurrency.entrySet().stream()
.filter(stringAccountEntry -> !stringAccountEntry.getKey().equals(CurrencyCode.RUB.getKey()))
.map(Map.Entry::getValue).toList();
if (currencyAccounts.isEmpty()) {
return empty();
}
List<String> currencies = currencyAccounts.stream().map(Account::getCurrency).toList();
Imdg<TradingClearingRegistryList> imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList,
TradingClearingRegistryList.class);
ImdgPredicateBuilder predicateBuilder = imdg.predicateBuilder();
Collection<TradingClearingRegistryList> tcrList = imdg.getCollectionObjectsByPredicate(
predicateBuilder.and(
predicateBuilder.in("currency", currencies.toArray(new String[0])),
predicateBuilder.equals("status", Status.Active.getKey())
));
if (!tcrList.isEmpty()) {
return of(AccountError.TradingClearingRegistryAlreadyExist, tcrList.iterator().next().getCurrency(), "currency");
}
return Optional.empty();
}
}
}

View file

@ -1,240 +0,0 @@
package ru.spcex.clearing.account.validation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
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.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
public enum GatewayEksClientCodeValidationRule implements IValidationRule<ImdgValidationContext<TkrAccount>> {
RequiredAndCorrectsFields() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
if (!StringUtils.hasText(validatedObject.getCompanyId())) {
return of(AccountError.RequiredFieldEmpty, "companyId");
}
if (!StringUtils.hasText(validatedObject.getTypeOperationClient())) {
return of(AccountError.RequiredFieldEmpty, "typeOperationClient");
}
for (MoneyAccountMsgRequest msg : validatedObject.getMoneyAccounts()) {
if (!StringUtils.hasText(msg.getAccount()) && !StringUtils.hasText(msg.getEks_account())) {
return of(AccountError.RequiredFieldEmpty, "account+eks_account");
}
if (!StringUtils.hasText(msg.getStatus())) {
return of(AccountError.RequiredFieldEmpty, "status");
}
if (!msg.getStatus().equals("NEW")) {
return of(AccountError.WrongFieldValue, "status");
}
}
return empty();
}
},
CompanyPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
Long tradingCode = validatedObject.getTradingCode();
if (tradingCode == null) {
return of(AccountError.RequiredFieldEmpty, "trading_code");
}
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Company company = companyImdg.getFirstObjectByFieldValues(
Map.of("tradingCode", String.valueOf(tradingCode))
);
if (company == null) {
return of(AccountError.COMPANY_NOT_FOUND_GTW, tradingCode);
}
context.storeObject(ClientCodeStoreObjects.COMPANY, company);
return Optional.empty();
}
},
RubAccountPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
List<MoneyAccountMsgRequest> accountList = validatedObject.getMoneyAccounts();
if (accountList == null || accountList.isEmpty()) {
return of(AccountError.RequiredFieldEmpty, "money_account");
}
List<String> currencies = accountList.stream().map(MoneyAccountMsgRequest::getCurrCode).toList();
if (!currencies.contains(CurrencyCode.RUB.getKey())) {
return of(AccountError.RequiredFieldEmpty, "money_account");
}
return Optional.empty();
}
},
DepoAccountsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
String depoAccountVal = validatedObject.getDepoAccount();
if (!StringUtils.hasText(depoAccountVal)) {
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty());
return empty();
}
Imdg<AccountSymbols> accountSymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
ImdgPredicateBuilder predicateBuilder = accountSymbolsImdg.predicateBuilder();
AccountSymbols accountSymbols = accountSymbolsImdg.getSingleObjectByPredicate(
predicateBuilder.equals("accountSymbolValue", depoAccountVal)
);
if (accountSymbols == null) {
return of(AccountError.DepoAccountNotFound, "depo_account");
}
Company company = context.getStoredObject(ClientCodeStoreObjects.COMPANY);
Imdg<DepoAccount> imdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
DepoAccount depoAccount = imdg.getFirstObjectByPredicate(
predicateBuilder.and(
predicateBuilder.equals("accountId", accountSymbols.getAccountId()),
predicateBuilder.equals("companyId", company.getId())
)
);
if (depoAccount == null) {
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty());
return of(AccountError.DepoAccountNotFound, "depo_account");
}
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.of(depoAccount));
return Optional.empty();
}
},
DepoAccountsNotLinkedToTkr() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
Optional<DepoAccount> depoAccount = context.getStoredObject(ClientCodeStoreObjects.DEPO_ACCOUNT);
if (depoAccount.isPresent()) {
Imdg<TradingClearingRegistry> tradingClearingRegistryImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
ImdgPredicateBuilder predicateBuilder = tradingClearingRegistryImdg.predicateBuilder();
Collection<Long> tkrIds = tradingClearingRegistryImdg.getCollectionIdsByPredicate(
predicateBuilder.equals("depoAccountId", depoAccount.get().getAccountId())
);
if (tkrIds != null && !tkrIds.isEmpty()) {
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, depoAccount.get().getId());
}
}
return Optional.empty();
}
},
ClsAccountsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
List<MoneyAccountMsgRequest> moneyAccounts = validatedObject.getMoneyAccounts().stream()
.filter(account -> StringUtils.hasText(account.getAccount()))
.toList();
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
List<Account> validClrnAccs = new ArrayList<>();
Company company = context.getStoredObject(ClientCodeStoreObjects.COMPANY);
for (MoneyAccountMsgRequest moneyAccount : moneyAccounts) {
ImdgPredicateBuilder predicateBuilder = accountImdg.predicateBuilder();
Account clrnAcc = accountImdg.getFirstObjectByPredicate(
predicateBuilder.and(
predicateBuilder.equals("account", moneyAccount.getAccount()),
predicateBuilder.equals("accountType", AccountType.Clrn.getKey()),
predicateBuilder.equals("companyId", company.getId())
));
if (clrnAcc == null) {
return of(AccountError.AccountNotFound, moneyAccount.getAccount());
}
validClrnAccs.add(clrnAcc);
}
context.storeObject(ClientCodeStoreObjects.CLRN_ACCS, validClrnAccs);
return Optional.empty();
}
},
AnltAccountPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
List<MoneyAccountMsgRequest> moneyAccounts = validatedObject.getMoneyAccounts().stream()
.filter(account -> StringUtils.hasText(account.getEks_account()))
.toList();
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
for (MoneyAccountMsgRequest moneyAccount : moneyAccounts) {
ImdgPredicateBuilder predicateBuilder = accountImdg.predicateBuilder();
Account anltAcc = accountImdg.getFirstObjectByPredicate(
predicateBuilder.and(
predicateBuilder.equals("accountType", AccountType.Anlt.getKey()),
predicateBuilder.equals("currency", moneyAccount.getCurrCode()),
predicateBuilder.equals("account", moneyAccount.getEks_account())
));
if (anltAcc == null) {
return of(AccountError.AccountNotFound, moneyAccount.getAccount());
}
}
return Optional.empty();
}
},
TcrIsNotPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
Optional<DepoAccount> depoAccountOpt = context.getStoredObject(ClientCodeStoreObjects.DEPO_ACCOUNT);
List<Account> clrnAccs = context.getStoredObject(ClientCodeStoreObjects.CLRN_ACCS);
Imdg<TradingClearingRegistry> imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account,
Account.class);
ImdgPredicateBuilder pb = imdg.predicateBuilder();
for (Account clrnAcc : clrnAccs) {
ImdgPredicate query = pb.equals("moneyAccountId", clrnAcc.getId());
if (depoAccountOpt.isPresent()) {
ImdgPredicate depoCondition = pb.equals("depoAccountId", depoAccountOpt.get().getAccountId());
query = pb.or(query, depoCondition);
}
Collection<TradingClearingRegistry> tcr = imdg.getCollectionObjectsByPredicate(query);
if (!tcr.isEmpty()) {
Account dubAcc = null;
for (TradingClearingRegistry duplicate : tcr) {
if (Objects.equals(duplicate.getMoneyAccountId(), clrnAcc.getId())) {
dubAcc = clrnAcc;
}
if (depoAccountOpt.isPresent() &&
depoAccountOpt.get().getAccountId().equals(duplicate.getDepoAccountId())) {
dubAcc = accountImdg.getSingleObjectByID(depoAccountOpt.get().getAccountId());
}
if (dubAcc != null) {
break;
}
}
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed,
dubAcc != null ? dubAcc.getAccount() : "null");
}
}
return empty();
}
};
private static final Logger log = LoggerFactory.getLogger(GatewayEksClientCodeValidationRule.class);
}

View file

@ -1,307 +0,0 @@
package ru.spcex.clearing.account.validation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.MoneyAccountStatus;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.validation.IValidationRule;
public enum GatewayUpdateEksClientCodeValidationRule implements IValidationRule<ImdgValidationContext<TkrAccount>> {
CompanyPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
Long tradingCode = validatedObject.getTradingCode();
if (tradingCode == null) {
return of(AccountError.RequiredFieldEmpty, "trading_code");
}
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Company company = companyImdg.getFirstObjectByFieldValues(
Map.of("tradingCode", String.valueOf(tradingCode))
);
if (company == null) {
return of(AccountError.COMPANY_NOT_FOUND_GTW, tradingCode);
}
context.storeObject(ClientCodeStoreObjects.COMPANY, company);
return Optional.empty();
}
},
RequiredAndCorrectsFields() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
if (!StringUtils.hasText(validatedObject.getCompanyId())) {
return of(AccountError.RequiredFieldEmpty, "companyId");
}
if (!StringUtils.hasText(validatedObject.getTypeOperationClient())) {
return of(AccountError.RequiredFieldEmpty, "typeOperationClient");
}
List<MoneyAccountMsgRequest> moneyAccounts = validatedObject.getMoneyAccounts();
if (moneyAccounts == null) moneyAccounts = Collections.emptyList();
for (MoneyAccountMsgRequest moneyAccount : moneyAccounts) {
if (!StringUtils.hasText(moneyAccount.getStatus())) {
return of(AccountError.RequiredFieldEmpty, "status");
}
if (!IEnumKey.contains(moneyAccount.getStatus(), MoneyAccountStatus.NEW, MoneyAccountStatus.NOW)) {
return of(AccountError.WrongFieldValue, "status");
}
if (!StringUtils.hasText(moneyAccount.getAccount())
&& !StringUtils.hasText(moneyAccount.getEks_account())) {
return of(AccountError.RequiredFieldEmpty, "account & eks_account");
}
}
return Optional.empty();
}
},
TkrIsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
Company company = context.getStoredObject(ClientCodeStoreObjects.COMPANY);
Imdg<TradingClearingRegistry> tkrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
ImdgPredicateBuilder predicate = tkrImdg.predicateBuilder();
String trkCode = validatedObject.getTkrCode();
TradingClearingRegistry existTkr = tkrImdg.getSingleObjectByPredicate(
predicate.and(
predicate.equals("code", trkCode),
predicate.equals("companyId", company.getId())
)
);
if (existTkr == null) {
return of(AccountError.TradingClearingRegistryNotFound, trkCode);
}
context.storeObject(ClientCodeStoreObjects.TRADING_CLEARING_REGISTRY, existTkr);
return empty();
}
},
DepoAccountIsValid() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
TradingClearingRegistry tkr = context.getStoredObject(ClientCodeStoreObjects.TRADING_CLEARING_REGISTRY);
if (StringUtils.hasText(validatedObject.getDepoAccount())) {
String depoAccountVal = validatedObject.getDepoAccount();
Imdg<AccountSymbols> accountSymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
ImdgPredicateBuilder predicateBuilder = accountSymbolsImdg.predicateBuilder();
AccountSymbols accountSymbols = accountSymbolsImdg.getSingleObjectByPredicate(
predicateBuilder.equals("accountSymbolValue", depoAccountVal)
);
if (accountSymbols == null) {
return of(AccountError.AccountNotFound, depoAccountVal);
}
Company company = context.getStoredObject(ClientCodeStoreObjects.COMPANY);
Imdg<DepoAccount> imdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
DepoAccount depoAccount = imdg.getFirstObjectByPredicate(
predicateBuilder.and(
predicateBuilder.equals("accountId", accountSymbols.getAccountId()),
predicateBuilder.equals("companyId", company.getId())
)
);
if (depoAccount == null) {
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty());
return of(AccountError.AccountNotFound, depoAccountVal);
}
if (!depoAccount.getAccountId().equals(tkr.getDepoAccountId())) {
return of(AccountError.DepoAccountChangeNotAllowed, tkr.getCode());
}
}
return empty();
}
},
NewForRubNotAllowed(){
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
List<MoneyAccountMsgRequest> accounts = validatedObject.getMoneyAccounts().stream()
.filter(moneyAccountMsgRequest ->
moneyAccountMsgRequest.getStatus().equals("NEW")
&& CurrencyCode.RUB.equalsByKey(moneyAccountMsgRequest.getCurrCode()))
.toList();
if (!accounts.isEmpty()) {
return of(AccountError.CurrencyForTradingClearingRegistryListAlreadyUsed, accounts.stream().findFirst().get().getAccount());
}
return empty();
}
},
ClientCodeIsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
if (!StringUtils.hasText(validatedObject.getClientCode())) {
return empty();
}
TradingClearingRegistry tkr = context.getStoredObject(ClientCodeStoreObjects.TRADING_CLEARING_REGISTRY);
Imdg<ClientCode> clientCodeImdg = context.obtainMap(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
ImdgPredicateBuilder predicate = clientCodeImdg.predicateBuilder();
String clientCode = validatedObject.getClientCode();
ClientCode existClientCode = clientCodeImdg.getSingleObjectByPredicate(
predicate.and(
predicate.equals("code", clientCode),
predicate.equals("tradingClearingRegistryId", tkr.getId()),
predicate.equals("status", Status.Active.getKey())
)
);
if (existClientCode == null) {
return of(AccountError.ClientCodeNotFound, clientCode);
}
context.storeObject(ClientCodeStoreObjects.CLIENT_CODE, existClientCode);
return empty();
}
},
ClrnAccountsNotLinkedToTkr() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
TradingClearingRegistry tkr = context.getStoredObject(ClientCodeStoreObjects.TRADING_CLEARING_REGISTRY);
Company company = context.getStoredObject(ClientCodeStoreObjects.COMPANY);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Imdg<TradingClearingRegistryList> tkrList = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
ImdgPredicateBuilder predicateBuilder = accountImdg.predicateBuilder();
List<MoneyAccountMsgRequest> accounts = validatedObject.getMoneyAccounts().stream()
.filter(moneyAccountMsgRequest ->
StringUtils.hasText(moneyAccountMsgRequest.getAccount()) && moneyAccountMsgRequest.getStatus().equals("NEW")
&& !CurrencyCode.RUB.equalsByKey(moneyAccountMsgRequest.getCurrCode()))
.toList();
List<MoneyAccountMsgRequest> existAccounts = validatedObject.getMoneyAccounts().stream()
.filter(moneyAccountMsgRequest ->
StringUtils.hasText(moneyAccountMsgRequest.getAccount()) && moneyAccountMsgRequest.getStatus().equals("NOW")
&& !CurrencyCode.RUB.equalsByKey(moneyAccountMsgRequest.getCurrCode()))
.toList();
List<Account> clrnAccounts = new ArrayList<>();
for (MoneyAccountMsgRequest request : accounts) {
Account account = accountImdg.getFirstObjectByPredicate(
predicateBuilder.and(
predicateBuilder.equals("account", request.getAccount()),
predicateBuilder.equals("accountType", AccountType.Clrn.getKey()),
predicateBuilder.equals("companyId", company.getId())
)
);
if (account == null) {
return of(AccountError.AccountNotFound, request.getAccount());
}
Collection<Long> tkrListByCurrency = tkrList.getCollectionIdsByPredicate(
predicateBuilder.and(
predicateBuilder.equals("currency", account.getCurrency()),
predicateBuilder.equals("tradingClearingRegistryId", tkr.getId())
)
);
if (tkrListByCurrency != null && !tkrListByCurrency.isEmpty()) {
return of(AccountError.CurrencyForTradingClearingRegistryListAlreadyUsed, account.getId());
}
Collection<Long> tkrListByAccount = tkrList.getCollectionIdsByPredicate(
predicateBuilder.and(
predicateBuilder.equals("accountId", account.getId())
)
);
if (tkrListByAccount != null && !tkrListByAccount.isEmpty()) {
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, account.getId());
}
clrnAccounts.add(account);
}
for (MoneyAccountMsgRequest request : existAccounts) {
Account account = accountImdg.getFirstObjectByPredicate(
predicateBuilder.and(
predicateBuilder.equals("account", request.getAccount()),
predicateBuilder.equals("accountType", AccountType.Clrn.getKey()),
predicateBuilder.equals("companyId", company.getId())
)
);
if (account == null) {
return of(AccountError.AccountNotFound, request.getAccount());
}
Collection<Long> tkrListByAccount = tkrList.getCollectionIdsByPredicate(
predicateBuilder.and(
predicateBuilder.equals("accountId", account.getId()),
predicateBuilder.equals("tradingClearingRegistryId", tkr.getId())
)
);
if (tkrListByAccount == null || tkrListByAccount.isEmpty()) {
return of(AccountError.AccountNotFound, account.getId());
}
}
context.storeObject(ClientCodeStoreObjects.CLRN_ACCS, clrnAccounts);
return empty();
}
},
AnltAccountsNotLinkedToTkr() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
TradingClearingRegistry tkr = context.getStoredObject(ClientCodeStoreObjects.TRADING_CLEARING_REGISTRY);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Imdg<TradingClearingRegistryList> tkrList = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
ImdgPredicateBuilder predicateBuilder = accountImdg.predicateBuilder();
List<MoneyAccountMsgRequest> newAccounts = validatedObject.getMoneyAccounts().stream()
.filter(moneyAccountMsgRequest ->
StringUtils.hasText(moneyAccountMsgRequest.getEks_account()) && moneyAccountMsgRequest.getStatus().equals("NEW")
&& !CurrencyCode.RUB.equalsByKey(moneyAccountMsgRequest.getCurrCode()))
.toList();
List<Account> anltAccounts = new ArrayList<>();
for (MoneyAccountMsgRequest request : newAccounts) {
Account account = accountImdg.getFirstObjectByPredicate(
predicateBuilder.and(
predicateBuilder.equals("accountType", AccountType.Anlt.getKey()),
predicateBuilder.equals("currency", request.getCurrCode()),
predicateBuilder.equals("account", request.getEks_account())
)
);
if (account == null) {
return of(AccountError.AccountNotFound, request.getEks_account());
}
Collection<Long> tkrListByAccount = tkrList.getCollectionIdsByPredicate(
predicateBuilder.and(
predicateBuilder.equals("currency", account.getCurrency()),
predicateBuilder.equals("tradingClearingRegistryId", tkr.getId())
)
);
if (tkrListByAccount != null && !tkrListByAccount.isEmpty()) {
return of(AccountError.CurrencyForTradingClearingRegistryListAlreadyUsed, account.getId());
}
anltAccounts.add(account);
}
context.storeObject(ClientCodeStoreObjects.ANLT_ACCS, anltAccounts);
return empty();
}
}
;
private static final Logger log = LoggerFactory.getLogger(GatewayUpdateEksClientCodeValidationRule.class);
}

View file

@ -16,6 +16,4 @@ account-service.kafka-producer.acks=all
account-service.kafka-producer.retries=0
account-service.kafka-producer.batch-size=16384
account-service.kafka-producer.linger-ms=1
account-service.kafka-producer.buffer-memory=33554432
account-service.app.registry-unit=L
account-service.kafka-producer.buffer-memory=33554432

View file

@ -1,56 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="./log" />
<property name="FILE_NAME" value="account-service" />
<property name="CONSOLE_LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n" />
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<Pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n</Pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- first FILE TEXT appender -->
<appender name="TEXT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${FILE_NAME}-text.log</file>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/account-service.log</file>
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>${FILE_LOG_PATTERN}</Pattern>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n</Pattern>
<charset>utf8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${FILE_NAME}-text.%d{yyyy-MM-dd}.%i.gz
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>
./logs/account-service.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
</appender>
<!-- second FILE JSON appender -->
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${FILE_NAME}-json.log</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${FILE_NAME}-json.%d{yyyy-MM-dd}.%i.gz
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>500MB</maxFileSize>
</triggeringPolicy>
</appender>
<root level="info">
<!-- <appender-ref ref="CONSOLE"/> -->
<appender-ref ref="TEXT_FILE"/>
<appender-ref ref="JSON_FILE" />
<root level="warn">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<logger name="ru.spcex" level="debug" additivity="false">
<appender-ref ref="TEXT_FILE"/>
<appender-ref ref="JSON_FILE" />
<!-- <appender-ref ref="CONSOLE"/> -->
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>

View file

@ -1,16 +1,11 @@
package ru.spcex.clearing.account.service;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.PostConstruct;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
@ -20,7 +15,6 @@ import ru.clearing.classes.statics.data.account.BankAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.misc.ValidationSymbols;
import ru.clearing.platform.dictionary.CurrencyCodeDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig;
@ -35,25 +29,27 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import static ru.spcex.clearing.platform.messaging.service.Status.Error;
import ru.spcex.clearing.test.MatcherFactory.Matcher;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import ru.spcex.clearing.test.TestObjectCreator;
import static ru.spcex.clearing.test.TestUtils.*;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.Allowed;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.Service;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import javax.annotation.PostConstruct;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static ru.spcex.clearing.platform.messaging.service.Status.Error;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.test.TestUtils.*;
import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
AccountHelper.class,
@ -83,7 +79,6 @@ public class BankAccountServiceTest {
private static final String correspondentAccountName = "BIK OF TINKOFF";
private static final String taxpayerIdentificationNumber = "848484848484";
private static final String taxRegistrationReasonCode = "886886";
private static final String swiftCode = "SWIFT_code";
protected final Long addresseeIdNew = 2L;
protected final String deal = "111111111";
private final String acc = "0123456789";
@ -93,7 +88,6 @@ public class BankAccountServiceTest {
private Imdg<CurrencyCodeDictionary> currencyCodeDictionaryImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<Relation> relationImdg;
private Imdg<ValidationSymbols> validationSymbolsImdg;
@Autowired
private IMessageResolver messageResolver;
@ -124,26 +118,10 @@ public class BankAccountServiceTest {
relationImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
validationSymbolsImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ValidationSymbols, ValidationSymbols.class
);
CurrencyCodeDictionary currencyCodeDictionary = new CurrencyCodeDictionary();
currencyCodeDictionary.setCode("RUB");
currencyCodeDictionary.setName("RUB");
currencyCodeDictionaryImdg.insert(currencyCodeDictionary);
ValidationSymbols validationSymbols = new ValidationSymbols();
validationSymbols.setId(1L);
validationSymbols.setSymbols("а-яА-ЯёЁ");
validationSymbolsImdg.insert(validationSymbols);
validationSymbols.setId(2L);
validationSymbols.setSymbols("a-zA-Z");
validationSymbolsImdg.insert(validationSymbols);
validationSymbols.setId(3L);
validationSymbols.setSymbols("0-9");
validationSymbolsImdg.insert(validationSymbols);
validationSymbols.setId(4L);
validationSymbols.setSymbols("-_., ;\"%");
validationSymbolsImdg.insert(validationSymbols);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@ -336,7 +314,6 @@ public class BankAccountServiceTest {
predictableUpdateBankAccount.setTaxpayerIdentificationNumber("65468461321");
predictableUpdateBankAccount.setTaxRegistrationReasonCode("532137");
predictableUpdateBankAccount.setAccount(acc);
predictableUpdateBankAccount.setSwiftCode("SWIFT_2");
predictableUpdateBankAccount.setId(ID);
BankAccountUpdateRequest bankAccountUpdateRequest = new BankAccountUpdateRequest();
@ -350,7 +327,6 @@ public class BankAccountServiceTest {
bankAccountUpdateRequest.setTaxpayerIdentificationNumber(predictableUpdateBankAccount.getTaxpayerIdentificationNumber());
bankAccountUpdateRequest.setTaxRegistrationReasonCode(predictableUpdateBankAccount.getTaxRegistrationReasonCode());
bankAccountUpdateRequest.setAccount(predictableUpdateBankAccount.getAccount());
bankAccountUpdateRequest.setSwiftCode(predictableUpdateBankAccount.getSwiftCode());
String jsonString = getJsonStringForUpdate(bankAccountUpdateRequest, ID);
@ -416,7 +392,6 @@ public class BankAccountServiceTest {
account.setAccountType(AccountType.Bank.getKey());
account.setStatus(Status.Active.getKey());
account.setProcessingSign(Allowed.ALLOWED.getKey());
account.setCurrency(currency);
return account;
}
@ -440,8 +415,6 @@ public class BankAccountServiceTest {
bankAccount.setDestination(destination);
bankAccount.setTaxpayerIdentificationNumber(taxpayerIdentificationNumber);
bankAccount.setTaxRegistrationReasonCode(taxRegistrationReasonCode);
bankAccount.setCurrency(currency);
bankAccount.setSwiftCode(swiftCode);
return bankAccount;
}
@ -457,8 +430,6 @@ public class BankAccountServiceTest {
bankAccountNewRequest.setTaxRegistrationReasonCode(bankAccount.getTaxRegistrationReasonCode());
bankAccountNewRequest.setAccount(bankAccount.getAccount());
bankAccountNewRequest.setCompanyId(bankAccount.getCompanyId());
bankAccountNewRequest.setCurrency(bankAccount.getCurrency());
bankAccountNewRequest.setSwiftCode(bankAccount.getSwiftCode());
return bankAccountNewRequest;
}

View file

@ -19,11 +19,9 @@ import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.profile.CompanyInfo;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.clearing.platform.dictionary.*;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.ClientCodeValidationConfig;
import ru.spcex.clearing.account.config.validation.TradingClearingRegistryListValidationConfig;
import ru.spcex.clearing.account.config.validation.TradingClearingRegistryValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -37,8 +35,6 @@ import ru.spcex.clearing.test.TestObjectCreator;
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.AccountType;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
@ -46,8 +42,6 @@ import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.*;
import static ru.spcex.clearing.test.TestUtils.waitingSendAndCheckRecord;
@ -59,9 +53,6 @@ import static ru.spcex.clearing.test.TestUtils.waitingSendAndCheckRecord;
TradingClearingRegistryService.class,
TradingClearingRegistryValidationConfig.class,
TradingClearingRegistryListService.class,
TradingClearingRegistryListValidationConfig.class,
ValidationConfig.class,
BeanConfiguration.class,
@ -88,7 +79,6 @@ class ClientCodeServiceTest {
protected Producer<String, Object> mockProducer;
private Imdg<ClientCode> clientCodeImdg;
private Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
// ****************************-*******************
@ -97,11 +87,9 @@ class ClientCodeServiceTest {
private void init() {
hazelcastServiceTest.waitAvailable();
clientCodeImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
tradingClearingRegistryListImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
// Словари для теста, применяются в ValidationConfig
putToDictionary(IMDGDistributedNames.Map_WorkflowStatusDictionary, new WorkflowStatusDictionary(), "ACTV");
putToDictionary(IMDGDistributedNames.Map_ServiceStatusDictionary, new ServiceStatusDictionary(), ServiceStatus.Active.getKey());
putToDictionary(IMDGDistributedNames.Map_CompanySymbolDictionary, new CompanySymbolDictionary(), "CLRC");
putToDictionary(IMDGDistributedNames.Map_CorporationSoleTypeDictionary, new CorporationSoleTypeDictionary(), "GDIR");
putToDictionary(IMDGDistributedNames.Map_CountryCodeDictionary, new CountryCodeDictionary(), "RUS");
@ -161,14 +149,6 @@ class ClientCodeServiceTest {
depoAcc.setAccountId(depoAccount.getId());
depoAccounts.insert(depoAcc);
Account c2Account = new Account();
c2Account.setId(133L);
c2Account.setAccount("AAAX-44654-CURR");
c2Account.setStatus("ACTV");
c2Account.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
c2Account.setAccountType(AccountType.Curr.getKey());
accounts.insert(c2Account);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@ -227,7 +207,7 @@ class ClientCodeServiceTest {
TestUtils.addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_NEW, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultNew = clientCodeImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultNew.getId());
CLIENT_CODE_MATCHER.assertMatch(resultNew, predictableClientCode);
@ -312,52 +292,6 @@ class ClientCodeServiceTest {
assertNotNull(resultNew.getCreated());
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет создание {@link ClientCode} в IMDG при передаче из Apache Kafka (очередь 4).<br>
* Входной запрос {@link ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest}:<br>
* С дополнительным заполнением TradingClearingRegistryList id's. С одним.
**/
@Test
void clientCodeNew4() {
//ARRANGE
final String ccCode = "Lucky";
ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest();
clientCodeNewRequest.setCompanyId(COMPANY_ID);
clientCodeNewRequest.setCode(ccCode);
clientCodeNewRequest.setTradingClearingRegistryId(TCR_ID);
clientCodeNewRequest.setMoneyAccountId(131L);
clientCodeNewRequest.setDepoAccountId(132L);
clientCodeNewRequest.setCurrencyAccountList(Arrays.asList(133L));
clientCodeNewRequest.setStatus("ACTV");
ClientCode predictableClientCode = new ClientCode();
predictableClientCode.setCode(ccCode);
predictableClientCode.setStatus("ACTV");
predictableClientCode.setCompanyId(COMPANY_ID);
predictableClientCode.setMoneyAccountId(131L);
predictableClientCode.setDepoAccountId(132L);
predictableClientCode.setCurrencyAccountId(133L);
predictableClientCode.setTradingClearingRegistryId(TCR_ID);
//ACT
String jsonString = TestUtils.getJsonStringForNew(clientCodeNewRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_NEW, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultNew = clientCodeImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultNew.getId());
CLIENT_CODE_MATCHER.assertMatch(resultNew, predictableClientCode);
assertNotNull(resultNew.getCreated());
TradingClearingRegistryList newTCRList = tradingClearingRegistryListImdg.getFirstObjectBySQL("accountId=" + predictableClientCode.getCurrencyAccountId());
assertNotNull(newTCRList);
assertEquals(TCR_ID, newTCRList.getTradingClearingRegistryId());
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет обновление сущности {@link ClientCode} в IMDG при передаче из Apache Kafka.<br>

View file

@ -124,7 +124,6 @@ class InformationAccountServiceTest {
Account accountAnlt = new Account();
accountAnlt.setAccountType(AccountType.Anlt.getKey());
accountAnlt.setCompanyId(1L);
accountAnlt.setCurrency("RUB");
anltAccountId = accountImdg.insert(accountAnlt);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
@ -135,7 +134,6 @@ class InformationAccountServiceTest {
InformationAccountNewRequest InformationAccountNewRequest = new InformationAccountNewRequest();
InformationAccountNewRequest.setCompanyId(companyId);
InformationAccountNewRequest.setAccount(account);
InformationAccountNewRequest.setCurrency(null);
String jsonString = getJsonStringForNew(InformationAccountNewRequest, 0L);
@ -180,13 +178,11 @@ class InformationAccountServiceTest {
Account account = new Account();
account.setId(120L);
account.setAccountType(AccountType.Info.getKey());
account.setCurrency(CurrencyCode.RUB.getKey());
account.setCompanyId(10L);
account.setAccount("39911810000000127000");
accountImdg.insert(account);
InformationAccount accountInfo = new InformationAccount();
accountInfo.setId(121L);
account.setCurrency(CurrencyCode.RUB.getKey());
accountInfo.setAccountId(account.getId());
accountInfo.setCompanyId(account.getCompanyId());
accountInfoImdg.insert(accountInfo);
@ -194,17 +190,9 @@ class InformationAccountServiceTest {
UserRoleVerification userRoleVerification = Mockito.mock(UserRoleVerification.class);
InformationAccountService infoAccSvc=new InformationAccountService(null,null,null,
null, userRoleVerification, hazelcastServiceTest, null, null, null, null);
Long n = infoAccSvc.accountNextId(null);
Long n = infoAccSvc.accountNextId();
Assertions.assertEquals(13L, n);
n = infoAccSvc.accountNextId(null);
n = infoAccSvc.accountNextId();
Assertions.assertEquals(14L, n);
// Другие валюты
n = infoAccSvc.accountNextId(CurrencyCode.RUB.getKey());
Assertions.assertEquals(15L, n);
n = infoAccSvc.accountNextId("CNY");
Assertions.assertEquals(2L, n);
n = infoAccSvc.accountNextId("CNY");
Assertions.assertEquals(3L, n);
}
}

View file

@ -1,284 +0,0 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
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.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.profile.CompanyInfo;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.clearing.platform.dictionary.*;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.ClientCodeValidationConfig;
import ru.spcex.clearing.account.config.validation.TradingClearingRegistryListValidationConfig;
import ru.spcex.clearing.account.config.validation.TradingClearingRegistryValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.test.MatcherFactory;
import ru.spcex.clearing.test.TestObjectCreator;
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.AccountType;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.*;
import static ru.spcex.clearing.test.TestUtils.waitingSendAndCheckRecord;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
TradingClearingRegistryListService.class,
TradingClearingRegistryListValidationConfig.class,
ClientCodeService.class,
ClientCodeValidationConfig.class,
TradingClearingRegistryService.class,
TradingClearingRegistryValidationConfig.class,
ValidationConfig.class,
BeanConfiguration.class,
KafkaTestConfig.class,
ImdgTestConfig.class})
class TradingClearingRegistryListServiceTest {
private static final int PARTITION = 0;
private static final Long ID = 4L;
public static final MatcherFactory.Matcher<ClientCode> CLIENT_CODE_MATCHER = MatcherFactory.usingIgnoringFieldsComparator("created", "updated");
public static final MatcherFactory.Matcher<TradingClearingRegistryList> TRADING_CLEARING_REGISTRY_LIST_MATCHER = MatcherFactory.usingIgnoringFieldsComparator("created", "updated");
private static final Long TCR_ID = 41L;
private static final Long COMPANY_ID = 42L;
@Autowired
TradingClearingRegistryListService tradingClearingRegistryListService;
@Autowired
@Qualifier("hazelcastServiceTest")
private HazelcastService hazelcastServiceTest;
@Captor
private ArgumentCaptor<ProducerRecord> producerRecord;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
private Imdg<ClientCode> clientCodeImdg;
private Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
// ****************************-*******************
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
clientCodeImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
tradingClearingRegistryListImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
// Словари для теста, применяются в ValidationConfig
putToDictionary(IMDGDistributedNames.Map_WorkflowStatusDictionary, new WorkflowStatusDictionary(), "ACTV");
putToDictionary(IMDGDistributedNames.Map_ServiceStatusDictionary, new ServiceStatusDictionary(), ServiceStatus.Active.getKey());
putToDictionary(IMDGDistributedNames.Map_CompanySymbolDictionary, new CompanySymbolDictionary(), "CLRC");
putToDictionary(IMDGDistributedNames.Map_CorporationSoleTypeDictionary, new CorporationSoleTypeDictionary(), "GDIR");
putToDictionary(IMDGDistributedNames.Map_CountryCodeDictionary, new CountryCodeDictionary(), "RUS");
putToDictionary(IMDGDistributedNames.Map_AllowedDictionary, new AllowedDictionary(), "ALWD");
putToDictionary(IMDGDistributedNames.Map_LegalKindDictionary, new LegalKindDictionary(), "JURD");
putToDictionary(IMDGDistributedNames.Map_OrganizationTypeDictionary, new OrganizationTypeDictionary(), "NCRD");
Imdg<Company> companyImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Company, Company.class);
Company company1 = new Company();
company1.setId(COMPANY_ID);
company1.setWorkflowStatus(WorkflowStatus.Active.getKey());
company1.setFullName("Company prime");
company1.setShortName("Seizwell");
company1.setProfile(new CompanyInfo());
company1.getProfile().setCompanyId(COMPANY_ID);
company1.getProfile().setCountryCode("TLDI");
company1.getProfile().setDescription("Big profit from TLD Company Prime.");
company1.getProfile().setLegalKind("TLDI");
company1.getProfile().setResidence("TLDI");
companyImdg.insert(company1);
Imdg<TradingClearingRegistry> tcrImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
TradingClearingRegistry registry1 = new TradingClearingRegistry();
registry1.setId(TCR_ID);
registry1.setCompanyId(COMPANY_ID);
registry1.setCode("code-120-101");
registry1.setMoneyAccountId(131L);
registry1.setDepoAccountId(132L);
registry1.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey());
registry1.setStatus(WorkflowStatus.Active.getKey());
tcrImdg.insert(registry1);
Imdg<Account> accounts = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Account, Account.class);
Imdg<ClearingAccount> clsAccounts = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
Account moneyAccount = new Account();
moneyAccount.setId(131L);
moneyAccount.setAccount("AAAA-4444");
moneyAccount.setStatus("ACTV");
moneyAccount.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
accounts.insert(moneyAccount);
ClearingAccount clsAcc = new ClearingAccount();
clsAcc.setId(moneyAccount.getId());
clsAcc.setCompanyId(COMPANY_ID);
clsAcc.setAccountId(moneyAccount.getId());
clsAccounts.insert(clsAcc);
Imdg<DepoAccount> depoAccounts = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
Account depoAccount = new Account();
depoAccount.setId(132L);
depoAccount.setAccount("AAAB-44654");
depoAccount.setStatus("ACTV");
depoAccount.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
accounts.insert(depoAccount);
DepoAccount depoAcc = new DepoAccount();
depoAcc.setId(depoAccount.getId());
depoAcc.setCompanyId(COMPANY_ID);
depoAcc.setAccountId(depoAccount.getId());
depoAccounts.insert(depoAcc);
Account c2Account = new Account();
c2Account.setId(133L);
c2Account.setAccount("AAAX-44654-CURR");
c2Account.setStatus("ACTV");
c2Account.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
c2Account.setAccountType(AccountType.Info.getKey());
c2Account.setCurrency("USD");
accounts.insert(c2Account);
Account c3Account = new Account();
c3Account.setId(134L);
c3Account.setAccount("AAAX-12654-CURR");
c3Account.setStatus("ACTV");
c3Account.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
c3Account.setAccountType(AccountType.Info.getKey());
c3Account.setCurrency("USD");
accounts.insert(c3Account);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
private <D extends AbstractDictionary> void putToDictionary(String mapName, D object, String code) {
Imdg<D> dMap = (Imdg) hazelcastServiceTest.getImdg(mapName, object.getClass());
object.setId(2L);
object.setCode(code);
object.setName("name of " + code);
dMap.insert(object);
}
/**
* {@link TradingClearingRegistryListService#tradingClearingRegistryListNew(BaseRequest)}<br>
* Тест проверяет создание {@link TradingClearingRegistryList} в IMDG при передаче из Apache Kafka (очередь 1).<br>
* Входной запрос {@link TradingClearingRegistryListNewRequest}:<br>
**/
@Test
void tradingClearingRegistryListNew() {
//ARRANGE
final String ccCode = null;
TradingClearingRegistryListNewRequest tcrlNewRequest = new TradingClearingRegistryListNewRequest();
tcrlNewRequest.setTradingClearingRegistryId(TCR_ID);
tcrlNewRequest.setAccountId(134L);
tcrlNewRequest.setStatus("ACTV");
ClientCode predictableClientCode = new ClientCode();
predictableClientCode.setCode(ccCode);
predictableClientCode.setStatus("ACTV");
predictableClientCode.setCompanyId(COMPANY_ID);
TradingClearingRegistryList predictableTradingClearingRegistryList = new TradingClearingRegistryList();
predictableTradingClearingRegistryList.setAccountId(134L);
predictableTradingClearingRegistryList.setStatus("ACTV");
predictableTradingClearingRegistryList.setCurrency("USD");
//ACT
String jsonString = TestUtils.getJsonStringForNew(tcrlNewRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) tradingClearingRegistryListService.getConsumer(), Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_NEW, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultCCNew = clientCodeImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultCCNew.getId());
CLIENT_CODE_MATCHER.assertMatch(resultCCNew, predictableClientCode);
assertNotNull(resultCCNew.getCreated());
TradingClearingRegistryList resultTCRLNew = tradingClearingRegistryListImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultTCRLNew.getId());
TRADING_CLEARING_REGISTRY_LIST_MATCHER.assertMatch(resultTCRLNew, predictableTradingClearingRegistryList);
assertNotNull(resultTCRLNew.getCreated());
// CLEAN UP
tradingClearingRegistryListImdg.delete(resultTCRLNew);
}
/**
* {@link TradingClearingRegistryListService#tradingClearingRegistryListUpdate(BaseRequest)}<br>
* Тест проверяет обновление сущности {@link TradingClearingRegistryList} в IMDG при передаче из Apache Kafka.<br>
* Входной запрос {@link TradingClearingRegistryListUpdateRequest}:<br>
**/
@Test
void tradingClearingRegistryListUpdate() {
//ARRANGE
TradingClearingRegistryList existsTradingClearingRegistryList = new TradingClearingRegistryList();
existsTradingClearingRegistryList.setId(ID);
existsTradingClearingRegistryList.setTradingClearingRegistryId(TCR_ID);
existsTradingClearingRegistryList.setCurrency("BTC");
existsTradingClearingRegistryList.setAccountId(133L);
tradingClearingRegistryListImdg.insert(existsTradingClearingRegistryList);
TradingClearingRegistryListUpdateRequest tradingClearingRegistryListUpdateRequest = new TradingClearingRegistryListUpdateRequest();
tradingClearingRegistryListUpdateRequest.setId(ID);
tradingClearingRegistryListUpdateRequest.setTradingClearingRegistryId(TCR_ID);
tradingClearingRegistryListUpdateRequest.setStatus("ACTV");
tradingClearingRegistryListUpdateRequest.setCurrencyAccountList(Arrays.asList(134L));
TradingClearingRegistryList predictableTradingClearingRegistryList = new TradingClearingRegistryList();
predictableTradingClearingRegistryList.setId(ID);
predictableTradingClearingRegistryList.setTradingClearingRegistryId(TCR_ID);
predictableTradingClearingRegistryList.setCurrency("BTC");
predictableTradingClearingRegistryList.setAccountId(133L);
predictableTradingClearingRegistryList.setStatus("ACTV");
//ACT
String jsonString = TestUtils.getJsonStringForUpdate(tradingClearingRegistryListUpdateRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) tradingClearingRegistryListService.getConsumer(), Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_UPDATE, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
TradingClearingRegistryList resultUpdating = tradingClearingRegistryListImdg.getSingleObjectByID(ID);
TRADING_CLEARING_REGISTRY_LIST_MATCHER.assertMatch(resultUpdating, predictableTradingClearingRegistryList);
assertNotNull(resultUpdating.getUpdated());
// CLEAN UP
tradingClearingRegistryListImdg.delete(resultUpdating);
}
}

View file

@ -11,7 +11,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.27.307</version>
<version>SPCEX-1.0.0.0</version>
</parent>
@ -61,17 +61,6 @@
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-enum</artifactId>
</dependency>
<!-- special logging -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- TEST -->
<dependency>
<groupId>org.springframework</groupId>
@ -111,7 +100,6 @@
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
@ -186,7 +174,7 @@
</configuration>
</execution>
<execution>
<!-- Generate dictionaries.sql from META and DATA file
<!-- Generate Data.sql from META and DATA file
command: mvn xml:transform@data -->
<id>data</id>
<goals>
@ -197,13 +185,13 @@
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>dictionaries.xml</include>
<include>data.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/data.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>dictionaries.sql</targetExtension>
<targetExtension>data.sql</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
@ -220,32 +208,6 @@
</fileMapper>
</fileMappers>
</transformationSet>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>market.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/data.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>market.sql</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
<!-- <transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>data_register_code.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/data.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>data_register_code.sql</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet> -->
</transformationSets>
</configuration>
</execution>

View file

@ -1,22 +1,18 @@
package ru.spcex.clearing.backendapi.config;
import java.util.LinkedList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.HistorySubscription;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.ClearingDateFromCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.ClearingDateToCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.CreatedFromCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.CreatedToCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.TradingDateFromCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.TradingDateToCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.*;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.LinkedList;
import java.util.List;
@Configuration
public class HistoryConfig {
@ -44,8 +40,6 @@ public class HistoryConfig {
hst.add(excludeLiabilitiesRegister());
hst.add(liabilitiesRegister());
hst.add(executionRegister());
hst.add(session());
hst.add(orderCurrency());
return hst;
}
@ -180,29 +174,4 @@ public class HistoryConfig {
));
return sbscr;
}
private HistorySubscription session() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("sessions");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchSession);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_Session);
sbscr.setConditions(List.of(
new ClearingDateFromCondition(pb),
new ClearingDateToCondition(pb)
));
return sbscr;
}
private HistorySubscription orderCurrency() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("order-currency");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchOrderCurrency);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_OrderCurrency);
sbscr.setConditions(List.of(
new CreatedFromCondition(pb),
new CreatedToCondition(pb)
));
return sbscr;
}
}

View file

@ -4,8 +4,6 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.nio.file.Files;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
@ -14,6 +12,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import ru.spcex.clearing.backendapi.meta.MetaServer;
import java.io.IOException;
import java.nio.file.Files;
@Configuration
public class MetaConfiguration {
@Value("file:${spring.config.location}/meta.json")

View file

@ -1,66 +0,0 @@
package ru.spcex.clearing.backendapi.config;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Configuration
public class RegistriesFilterConfig {
@Bean
public Map<String, ImdgPredicate> registriesFilterByName(ImdgProvider imdgProvider) {
ImdgPredicateBuilder predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_Registry, ExecutionDeposit.class)
.predicateBuilder();
return new HashMap<>() {{
put("fulfilledLiabilities", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[OT].*"),
predicateBuilder.in("registryStatus", Arrays.asList(RegistryStatus.OK.getKey(), RegistryStatus.CLRD.getKey()).toArray(new String[0])),
predicateBuilder.equals("settlementDate", LocalDate.now()))
);
put("unfulfilledLiabilities", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[OT].*"),
predicateBuilder.in("registryStatus", Arrays.asList(
RegistryStatus.FAIL.getKey(),
RegistryStatus.UNCV.getKey(),
RegistryStatus.NACK.getKey(),
RegistryStatus.NACC.getKey()).toArray(new String[0])),
predicateBuilder.equals("settlementDate", LocalDate.now()))
);
put("clearingLiabilities", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[OT].*"),
predicateBuilder.in("registryStatus", Arrays.asList(
RegistryStatus.PROC.getKey(),
RegistryStatus.POOL.getKey(),
RegistryStatus.MNG.getKey(),
RegistryStatus.SPLT.getKey()).toArray(new String[0])),
predicateBuilder.greatEqual("settlementDate", LocalDate.now()))
);
put("balanceOfFinancialAssets", predicateBuilder.regex("registryCode", "^[AD]S[A-Z]{2}$"));
put("balanceOfCashAssets", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[AD]M.*"),
predicateBuilder.equals("securitySymbol", "RUB"))
);
put("balanceOfCurrencyAssets", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[AD]M.*"),
predicateBuilder.not(predicateBuilder.equals("securitySymbol", "RUB")))
);
put("outvBalance", predicateBuilder.regex("registryCode", "^AM.*"));
put("assetDeficitRegistries",
predicateBuilder.and(
predicateBuilder.regex("registryCode", "^PM.*T"),
predicateBuilder.equals("clearingDate", LocalDate.now())
)
);
}};
}
}

View file

@ -3,7 +3,6 @@ package ru.spcex.clearing.backendapi.config.element;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.backendapi.security.element.JsConfigSettings;
import ru.spcex.clearing.backendapi.security.element.SecuritySettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
@ -18,7 +17,6 @@ public class BackendApiSettings {
private KafkaProducerSettings kafkaProducer;
private KafkaConsumerSettings kafkaConsumer;
private SecuritySettings security;
private JsConfigSettings jsConfig;
private String exampleSetting;
public HazelcastClientParams getHazelcast() {
@ -61,14 +59,6 @@ public class BackendApiSettings {
this.security = security;
}
public JsConfigSettings getJsConfig() {
return jsConfig;
}
public void setJsConfig(JsConfigSettings jsConfig) {
this.jsConfig = jsConfig;
}
public HazelcastClientParams getHazelcastSearch() {
return hazelcastSearch;
}

View file

@ -4,22 +4,10 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.account.Account;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountNewAction;
@ -32,46 +20,30 @@ import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/accounting/accounts")
public class AccountController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder predicateBuilder;
@Autowired
public AccountController(IOperator operator,
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
public AccountController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
this.predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_Account, Account.class)
.predicateBuilder();
}
@ApiOperation(value = "get all accounts.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Account, Account.class);
CommonGetAllResponse response = new CommonGetAllResponse();
if (StringUtils.isEmpty(kind)) {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Account, Account.class);
response.fromEntity(all);
} else if (kind.equals("BLKD")) {
ImdgPredicate predicate = predicateBuilder.in("status",
Arrays.asList(Status.Blocked.getKey(), Status.Close.getKey()).toArray(new String[0]));
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_Account, Account.class, predicate);
response.fromEntity(allByStatus);
} else {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
}
response.fromEntity(all);
return response;
}

View file

@ -4,21 +4,10 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
@ -30,26 +19,21 @@ import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/companies")
public class CompanyController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder predicateBuilder;
@Autowired
public CompanyController(IOperator operator,
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
this.predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_Company, Company.class)
.predicateBuilder();
}
@ApiOperation(value = "delete company.")
@ -67,19 +51,10 @@ public class CompanyController extends AbstractQueueController {
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Company, Company.class);
CommonGetAllResponse response = new CommonGetAllResponse();
if (StringUtils.isEmpty(kind)) {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Company, Company.class);
response.fromEntity(all);
} else if (kind.equals("BLKD")){
ImdgPredicate predicate = predicateBuilder.equals("workflowStatus", WorkflowStatus.Blocked.getKey());
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_Company, Company.class, predicate);
response.fromEntity(allByStatus);
} else {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
}
response.fromEntity(all);
return response;
}

View file

@ -12,7 +12,6 @@ import ru.clearing.classes.statics.data.company.CompanyRoleSet;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.CompanyRoleSetNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.CompanyRoleSetUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
@ -31,35 +30,35 @@ public class CompanyRoleSetController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CompanyRoleSetController(IOperator operator, IStateLoader stateLoader) {
public CompanyRoleSetController(IOperator operator,
IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "new company-role-set.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ApiOperation(value = "get all CompanyRoleSet's.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_CompanyRoleSet,
CompanyRoleSet.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create CompanyRoleSet.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody CompanyRoleSetNewAction companyRoleSetNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SETS_NEW, companyRoleSetNewAction);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SET_NEW, companyRoleSetNewAction);
}
@ApiOperation(value = "update company-role-set.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody CompanyRoleSetUpdateAction companyRoleSetUpdateAction) throws ExecutionException, InterruptedException {
companyRoleSetUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SETS_UPDATE, companyRoleSetUpdateAction);
}
@ApiOperation(value = "delete company-role-set.")
@ApiOperation(value = "delete CompanyRoleSet.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
@ -67,17 +66,7 @@ public class CompanyRoleSetController extends AbstractQueueController {
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SETS_DELETE, deleteAction);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SET_DELETE, deleteAction);
}
@ApiOperation(value = "get all company-role-sets.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -1,83 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.company.SettlementHouseProperties;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.SettlementHousePropertiesNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.SettlementHousePropertiesUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/settlement-house-properties")
public class SettlementHousePropertiesController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public SettlementHousePropertiesController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "new settlement-house-property.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody SettlementHousePropertiesNewAction settlementHousePropertiesNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_SETTLEMENT_HOUSE_PROPERTY_NEW, settlementHousePropertiesNewAction);
}
@ApiOperation(value = "update settlement-house-property.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody SettlementHousePropertiesUpdateAction settlementHousePropertyUpdateAction) throws ExecutionException, InterruptedException {
settlementHousePropertyUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_SETTLEMENT_HOUSE_PROPERTY_UPDATE, settlementHousePropertyUpdateAction);
}
@ApiOperation(value = "delete settlement-house-property.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_SETTLEMENT_HOUSE_PROPERTY_DELETE, deleteAction);
}
@ApiOperation(value = "get all SettlementHouseProperties.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_SettlementHouseProperties, SettlementHouseProperties.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -1,85 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.execution;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.execution.ExecutionCurrency;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
@Controller
@RequestMapping("/execution-currency")
public class ExecutionCurrencyController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder imdgPredicateBuilder;
@Autowired
public ExecutionCurrencyController(IOperator operator,
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
super(operator);
this.stateLoader = stateLoader;
this.imdgPredicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class)
.predicateBuilder();
}
@ApiOperation(value = "get all ExecutionCurrency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
ImdgPredicate imdgPredicate = imdgPredicateBuilder.greatEqual("settlementDate", LocalDate.now());
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_ExecutionCurrency,
ExecutionCurrency.class,
imdgPredicate);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "get ExecutionCurrency by filter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "/filter", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getByFilter(@RequestParam(name = "pageSize", required = false) Optional<Integer> pageSize,
@RequestParam(name = "pageIndex", required = false) Optional<Integer> pageIndex,
@RequestParam(name = "cck", required = false) Optional<Boolean> cck) {
ImdgPredicate settlementDateFilter = imdgPredicateBuilder.greatEqual("settlementDate", LocalDate.now());
ImdgPredicate sideFilter;
if (cck.isPresent() && cck.get()) {
sideFilter = imdgPredicateBuilder.alwaysTrue();
} else {
sideFilter = imdgPredicateBuilder.equals("side", Side.SELL.getKey());
}
ImdgPredicate filter = imdgPredicateBuilder.and(settlementDateFilter, sideFilter);
AtomicReference<Collection<Map<String, Object>>> all = new AtomicReference<>();
pageIndex.ifPresentOrElse(index ->
all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class, filter,
pageSize.orElse(10_000), index)),
() -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class, filter)));
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all.get());
return response;
}
}

View file

@ -7,7 +7,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
@ -15,8 +14,6 @@ import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllRespo
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@ -24,8 +21,6 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
@Controller
@RequestMapping("/execution-deposits")
@ -57,23 +52,4 @@ public class ExecutionDepositController extends AbstractQueueController {
response.fromEntity(all);
return response;
}
@ApiOperation(value = "get ExecutionDeposits by filter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "/filter", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getByFilter(@RequestParam(name = "pageSize", required = false) Optional<Integer> pageSize,
@RequestParam(name = "pageIndex", required = false) Optional<Integer> pageIndex) {
ImdgPredicate filter = imdgPredicateBuilder.and(
imdgPredicateBuilder.greatEqual("firstLegSettlementDate", LocalDate.now()),
imdgPredicateBuilder.equals("side", MoneyFlowSide.SELL.getKey()));
AtomicReference<Collection<Map<String, Object>>> all = new AtomicReference<>();
pageIndex.ifPresentOrElse(index ->
all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class, filter,
pageSize.orElse(10_000), index)),
() -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class, filter)));
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all.get());
return response;
}
}

View file

@ -7,7 +7,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
@ -15,7 +14,6 @@ import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllRespo
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@ -23,8 +21,6 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
@Controller
@RequestMapping("/execution-fonds")
@ -57,23 +53,4 @@ public class ExecutionFondController extends AbstractQueueController {
response.fromEntity(all);
return response;
}
@ApiOperation(value = "get ExecutionCurrency by filter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "/filter", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getByFilter(@RequestParam(name = "pageSize", required = false) Optional<Integer> pageSize,
@RequestParam(name = "pageIndex", required = false) Optional<Integer> pageIndex) {
ImdgPredicate filter = imdgPredicateBuilder.and(
imdgPredicateBuilder.greatEqual("settlementDate", LocalDate.now()),
imdgPredicateBuilder.equals("side", Side.SELL.getKey()));
AtomicReference<Collection<Map<String, Object>>> all = new AtomicReference<>();
pageIndex.ifPresentOrElse(index ->
all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class, filter,
pageSize.orElse(10_000), index)),
() -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class, filter)));
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all.get());
return response;
}
}

View file

@ -4,10 +4,6 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
@ -27,6 +23,11 @@ import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
@Controller
@RequestMapping("/history")
public class HistController {
@ -43,16 +44,6 @@ public class HistController {
this.conditionProvider = conditionProvider;
}
/**
* Поиск исторических данных по параметру destination
* Если в IMDG загружены данные за сегодня, то с помощью данного метода можно запросить данные за прошлое
* Не касается таблиц *_history
*
* @param destination
* @param from
* @param to
* @return
*/
@ApiOperation(value = "Get history")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)

View file

@ -1,39 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.spcex.clearing.backendapi.config.element.BackendApiSettings;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.security.element.JsConfigSettings;
@Controller
@RequestMapping("/")
public class JsConfigController {
private final BackendApiSettings backendApiSettings;
public JsConfigController(BackendApiSettings backendApiSettings) {
this.backendApiSettings = backendApiSettings;
}
@ApiOperation(value = "get js config.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(path = "/spcexConfig.js", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> getJsConfig() {
Map<String, Object> result = new HashMap<>();
String title = new String(backendApiSettings.getJsConfig().getServerTitle().getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
result.put(JsConfigSettings.SERVER_TITLE_PARAM_NAME, title);
result.put(JsConfigSettings.IS_CENTRAL_COUNTER_PARTY_PARAM_NAME, backendApiSettings.getJsConfig().getCentralCounterPartyEnable());
return result;
}
}

View file

@ -1,77 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.OvernightSettings;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.misc.OvernightNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.misc.OvernightUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@Controller
@RequestMapping("/overnight-settings")
public class OvernightSettingsController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public OvernightSettingsController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all overnight settings.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class
);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create overnight settings.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody OvernightNewAction overnightNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.OVERNIGHT_SETTINGS_NEW, overnightNewAction);
}
@ApiOperation(value = "update overnight settings.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody OvernightUpdateAction overnightUpdateAction) throws ExecutionException, InterruptedException {
overnightUpdateAction.setId(id);
return processRequest(Consts.OVERNIGHT_SETTINGS_UPDATE, overnightUpdateAction);
}
}

View file

@ -1,75 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.SCrossRate;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.SCrossRateNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.SCrossRateUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@Controller
@RequestMapping("/cross-rate")
public class SCrossRateController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public SCrossRateController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all cross-rate's.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_SCrossRate, SCrossRate.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create sCrossRates.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody SCrossRateNewAction ratesNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_S_CROSS_RATES_NEW, ratesNewAction);
}
@ApiOperation(value = "update sCrossRates.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody SCrossRateUpdateAction ratesUpdateAction) throws ExecutionException, InterruptedException {
ratesUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_S_CROSS_RATES_UPDATE, ratesUpdateAction);
}
}

View file

@ -1,30 +1,22 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.Session;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.session.ContinueSessionAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/sessions")
@ -47,22 +39,4 @@ public class SessionController extends AbstractQueueController {
response.fromEntity(all);
return response;
}
@ApiOperation(value = "Continue session")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{event_type}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse repeatSession(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@PathVariable("event_type") String eventType,
@RequestBody ContinueSessionAction continueSessionAction) throws ExecutionException, InterruptedException {
if ("REPT".equals(eventType)) {
return processRequest(Consts.REPEAT_SESSION, continueSessionAction);
} else if ("NEXT".equals(eventType)){
return processRequest(Consts.CONTINUE_SESSION, continueSessionAction);
} else {
throw new UnsupportedOperationException("Unsupported event type: " + eventType);
}
}
}

View file

@ -1,50 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Controller
@RequestMapping("/sessionHistory")
public class SessionHistoryController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgProvider imdgProvider;
@Autowired
public SessionHistoryController(IOperator operator,
ImdgProvider imdgProvider,
IStateLoader stateLoader) {
super(operator);
this.imdgProvider = imdgProvider;
this.stateLoader = stateLoader;
}
@ApiOperation(value = "Get history of change by id and destination")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getHistory(
@ApiParam(value = "Id объекта", example = "123")
@RequestParam(name = "id")
Long id
) {
Collection<Map<String, Object>> sessionHistories = stateLoader.getSessionHistoryById(id);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(sessionHistories);
return response;
}
}

View file

@ -1,84 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.ValidationSymbols;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.settings.ValidationSymbolsNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.settings.ValidationSymbolsUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@Controller
@RequestMapping("/settings/validation-symbols")
public class ValidationSymbolsController extends AbstractQueueController {
private final IStateLoader stateLoader;
public ValidationSymbolsController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "create validation symbol.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ValidationSymbolsNewAction validationSymbolsNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_VALIDATE_SYMBOLS_NEW, validationSymbolsNewAction);
}
@ApiOperation(value = "update validation symbol.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody ValidationSymbolsUpdateAction validationSymbolsUpdateAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_VALIDATE_SYMBOLS_UPDATE, validationSymbolsUpdateAction);
}
@ApiOperation(value = "delete validation symbol.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_VALIDATE_SYMBOLS_DELETE, deleteAction);
}
@ApiOperation(value = "get all validation symbols.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ValidationSymbols,
ValidationSymbols.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -1,139 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.order;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.OrderCurrency;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonCheckAction;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.order.OrderCompanyNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.order.OrderCompanyUpdateAction;
import ru.spcex.clearing.backendapi.controller.request.cud.order.OrderCurrencyUpdateAction;
import ru.spcex.clearing.backendapi.controller.request.cud.order.OrderCurrencyUpdateStatusAction;
import ru.spcex.clearing.backendapi.controller.request.cud.order.OrderOvernightTypeUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@Controller
@RequestMapping("/order-currency")
public class OrderCurrencyController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public OrderCurrencyController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all order currency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "update order currency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody OrderCurrencyUpdateAction orderCurrencyUpdateAction) throws ExecutionException, InterruptedException {
orderCurrencyUpdateAction.setId(id);
return processRequest(Consts.ORDER_CURRENCY_UPDATE, orderCurrencyUpdateAction);
}
@ApiOperation(value = "update order currency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "status/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse updateStatus(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody OrderCurrencyUpdateStatusAction orderCurrencyUpdateStatusAction) throws ExecutionException, InterruptedException {
orderCurrencyUpdateStatusAction.setId(id);
return processRequest(Consts.ORDER_CURRENCY_STATUS_UPDATE, orderCurrencyUpdateStatusAction);
}
@ApiOperation(value = "update overnight type for order currency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(path = "/overnightType/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse updateOvernightType(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody OrderOvernightTypeUpdateAction orderOvernightTypeUpdateAction) throws ExecutionException, InterruptedException {
orderOvernightTypeUpdateAction.setId(id);
return processRequest(Consts.ORDER_OVERNIGHT_TYPE_UPDATE, orderOvernightTypeUpdateAction);
}
@ApiOperation(value = "create company for order currency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(path = "/company", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse createCompany(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody OrderCompanyNewAction orderCompanyNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.ORDER_CURRENCY_COMPANY_NEW, orderCompanyNewAction);
}
@ApiOperation(value = "update company for order currency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(path = "/company/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse updateCompany(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody OrderCompanyUpdateAction orderCompanyUpdateAction) throws ExecutionException, InterruptedException {
orderCompanyUpdateAction.setId(id);
return processRequest(Consts.ORDER_CURRENCY_COMPANY_UPDATE, orderCompanyUpdateAction);
}
@ApiOperation(value = "delete company for order currency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.ORDER_CURRENCY_COMPANY_DELETE, deleteAction);
}
@ApiOperation(value = "create company for order currency.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(path = "/checkOrders", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse check() throws ExecutionException, InterruptedException {
CommonCheckAction checkAction = new CommonCheckAction();
return processRequest(Consts.ORDER_CURRENCY_CHECK, checkAction);
}
}

View file

@ -1,41 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.register;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.register.GatewayResult;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/gateway-result")
public class GatewayResultController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public GatewayResultController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all pair-sdf.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_GatewayResult, GatewayResult.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -1,41 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.register;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.register.PairSdf;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/pair-sdf")
public class PairSdfController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public PairSdfController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all pair-sdf.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_PairSdf, PairSdf.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -4,36 +4,13 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeRefundDateActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeStatusExtractActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.DmauRegistryActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.IdentificationFundsActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.RSplitDepositActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.ReturnDepositActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.*;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
@ -41,29 +18,20 @@ import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/registries")
public class RegistryController extends AbstractQueueController {
protected final Logger log = LoggerFactory.getLogger(getClass());
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder predicateBuilder;
private final Map<String, ImdgPredicate> filterByName;
@Autowired
public RegistryController(IOperator operator, IStateLoader stateLoader,
ImdgProvider imdgProvider,
Map<String, ImdgPredicate> filterByName) {
public RegistryController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
this.predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class)
.predicateBuilder();
this.filterByName = filterByName;
}
@ApiOperation(value = "get all registries.")
@ -71,60 +39,9 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
// long t1 = System.currentTimeMillis();
ImdgPredicate filter = predicateBuilder.or(
predicateBuilder.equals("registryDesignation", RegistryDesignation.A.getKey()),
predicateBuilder.equals("registryDesignation", RegistryDesignation.D.getKey()),
predicateBuilder.and(
predicateBuilder.or(
predicateBuilder.equals("registryDesignation", RegistryDesignation.O.getKey()),
predicateBuilder.equals("registryDesignation", RegistryDesignation.T.getKey())
),
predicateBuilder.greatEqual("settlementDate", LocalDate.now())
)
);
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class,
filter);
// long t2 = System.currentTimeMillis();
// log.info("Info select and format {} data {}", all.size(), t2 - t1);
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
// log.info("Info select and format {} data {}", all.size(), System.currentTimeMillis() - t2);
return response;
}
@ApiOperation(value = "get registries by filter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "/filter", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getByFilter(@RequestParam(name = "kind", required = false) String kind,
@RequestParam(name = "pageSize", required = false) Optional<Integer> pageSize,
@RequestParam(name = "pageIndex", required = false) Optional<Integer> pageIndex) {
if (!StringUtils.hasText(kind)) {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Request should have at least one of the parameters: designation, status");
}
if (!filterByName.containsKey(kind)) {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
}
StopWatch sw = new StopWatch("registry-controller-stopwatch");
sw.start();
ImdgPredicate filter = predicateBuilder.and(filterByName.get(kind));
AtomicReference<Collection<Map<String, Object>>> all = new AtomicReference<>();
pageIndex.ifPresentOrElse(index ->
all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_Registry, Registry.class, filter,
pageSize.orElse(10_000), index)),
() -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class, filter)));
sw.stop();
log.info("Info select and format {} data took {} ms", all.get().size(), sw.getLastTaskTimeMillis());
sw.start();
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all.get());
sw.stop();
log.info("Info select and format {} data {}", all.get().size(), sw.getLastTaskTimeMillis());
return response;
}
@ -133,8 +50,8 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/splitDeposit", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse splitDepositAction(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody RSplitDepositActionNew rSplitDepositActionNew) throws ExecutionException, InterruptedException {
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody RSplitDepositActionNew rSplitDepositActionNew) throws ExecutionException, InterruptedException {
return processRequest(Consts.REGISTRY_SPLIT_DEPOSIT_ACTION, rSplitDepositActionNew);
}
@ -143,10 +60,10 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/returnDeposit/{id}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse returnDepositAction(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ReturnDepositActionNew returnDepositAction) throws ExecutionException, InterruptedException {
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ReturnDepositActionNew returnDepositAction) throws ExecutionException, InterruptedException {
returnDepositAction.setId(id);
return processRequest(Consts.REGISTRY_RETURN_DEPOSIT_ACTION, returnDepositAction);
}
@ -156,10 +73,10 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/identificationFunds/{id}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse identificationFundsAction(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody IdentificationFundsActionNew identificationFundsActionNew) throws ExecutionException, InterruptedException {
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody IdentificationFundsActionNew identificationFundsActionNew) throws ExecutionException, InterruptedException {
identificationFundsActionNew.setId(id);
return processRequest(Consts.REGISTRY_IDENTIFICATION_FUNDS, identificationFundsActionNew);
}
@ -169,10 +86,10 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/changeRefundDate/{groupId}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse changeRefundDate(
@ApiParam(value = "Идентификатор группы связанных регистров.", required = true, example = "1234")
@PathVariable("groupId") Long groupId,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ChangeRefundDateActionNew returnDepositAction) throws ExecutionException, InterruptedException {
@ApiParam(value = "Идентификатор группы связанных регистров.", required = true, example = "1234")
@PathVariable("groupId") Long groupId,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ChangeRefundDateActionNew returnDepositAction) throws ExecutionException, InterruptedException {
returnDepositAction.setGroupId(groupId);
return processRequest(Consts.REGISTRY_CHANGE_REFUND_DATE_ACTION, returnDepositAction);
}
@ -182,21 +99,12 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/changeStatusExtract/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse changeStatusExtract(
@ApiParam(value = "Идентификатор регистра.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ChangeStatusExtractActionNew changeStatusExtractAction) throws ExecutionException, InterruptedException {
@ApiParam(value = "Идентификатор регистра.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ChangeStatusExtractActionNew changeStatusExtractAction) throws ExecutionException, InterruptedException {
changeStatusExtractAction.setId(id);
return processRequest(Consts.REGISTRY_CHANGE_STATUS_EXTRACT_ACTION, changeStatusExtractAction);
}
@ApiOperation(value = "Вывод средств с регистра невыясненных активов")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/withdrawalFunds", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse dmauRegistryNew(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody DmauRegistryActionNew dmauRegistryActionNew) throws ExecutionException, InterruptedException {
return processRequest(Consts.REGISTRY_DMAU_CREATE_ACTION, dmauRegistryActionNew);
}
}

View file

@ -4,23 +4,10 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
@ -34,26 +21,21 @@ import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/trading-clearing-registries")
public class TradingClearingRegistryController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder predicateBuilder;
@Autowired
public TradingClearingRegistryController(IOperator operator,
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
public TradingClearingRegistryController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
this.predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class)
.predicateBuilder();
}
@ApiOperation(value = "create TradingClearingRegistry.")
@ -106,21 +88,10 @@ public class TradingClearingRegistryController extends AbstractQueueController {
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
CommonGetAllResponse response = new CommonGetAllResponse();
if (StringUtils.isEmpty(kind)) {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
response.fromEntity(all);
} else if (kind.equals("BLKD")) {
ImdgPredicate predicate = predicateBuilder.in("status",
Arrays.asList(Status.Blocked.getKey(), Status.Close.getKey()).toArray(new String[0]));
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, predicate);
response.fromEntity(allByStatus);
} else {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
}
response.fromEntity(all);
return response;
}
}

View file

@ -1,74 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.registry;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.TradingClearingRegistryListNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.TradingClearingRegistryListUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
// todo unittest for TradingClearingRegistryListController
@Controller
@RequestMapping("/trading-clearing-registries-list")
public class TradingClearingRegistryListController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public TradingClearingRegistryListController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all TradingClearingRegistryList's")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_TradingClearingRegistryList,
TradingClearingRegistryList.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "Добавление списка счетов ТКР")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody TradingClearingRegistryListNewAction tradingClearingRegistryListNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_NEW, tradingClearingRegistryListNewAction);
}
@ApiOperation(value = "Изменение списка счетов ТКР")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody TradingClearingRegistryListUpdateAction tradingClearingRegistryListUpdateAction) throws ExecutionException, InterruptedException {
tradingClearingRegistryListUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_UPDATE, tradingClearingRegistryListUpdateAction);
}
}

View file

@ -104,7 +104,7 @@ public class LauncherController extends AbstractQueueController {
if (taskEnum == null) {
throw new NotFound404Exception("task dictionary element with code '" + launcherNew.getTask() + "'");
}
if (!IEnumKey.contains(taskEnum.getCode(), Task.startOfClearing, Task.dbfExport_OUTV, Task.getAllBalance, Task.createRegistry_GBRR)) {
if (!IEnumKey.contains(taskEnum.getCode(), Task.startOfClearing, Task.dbfExport_OUTV)) {
log.warn(String.format("Task %s not support request with body", taskEnum.getCode()));
} // else В мете эти модели с дополнительными параметрами (OUTV).
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

View file

@ -237,19 +237,6 @@ public class SdfsController extends AbstractQueueController {
return response;
}
@ApiOperation(value = "get all S_DF51")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "s-df51", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAllSdf51() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_SDf51,
SDf51.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "get all S_DF52")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "s-df52", method = RequestMethod.GET)

View file

@ -1,84 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.CurrencyPairSecurityNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.CurrencyPairSecurityUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/securities/currency-pair-securities")
public class CurrencyPairSecurityController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CurrencyPairSecurityController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "create currencyPairSecurity.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody CurrencyPairSecurityNewAction currencyPairSecurityNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_NEW, currencyPairSecurityNewAction);
}
@ApiOperation(value = "update currencyPairSecurity.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody CurrencyPairSecurityUpdateAction currencyPairSecurityUpdateAction) throws ExecutionException, InterruptedException {
currencyPairSecurityUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_UPDATE, currencyPairSecurityUpdateAction);
}
@ApiOperation(value = "delete currency pair securities.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_DELETE, deleteAction);
}
@ApiOperation(value = "get all equity securities.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_CurrencyPairSecurity,
CurrencyPairSecurity.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -1,87 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.security.DigitalCertificateSecurity;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.DigitalCertificateSecurityNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.DigitalCertificateSecurityUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@Controller
@RequestMapping("/securities/digital-certificate-securities")
public class DigitalCertificateSecuritiesController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public DigitalCertificateSecuritiesController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "create digital certificate security.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody DigitalCertificateSecurityNewAction digitalCertificateSecurityNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_DIGITAL_CERTIFICATE_SECURITY_NEW, digitalCertificateSecurityNewAction);
}
@ApiOperation(value = "update digital certificate security.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody DigitalCertificateSecurityUpdateAction digitalCertificateSecurityUpdateAction) throws ExecutionException, InterruptedException {
digitalCertificateSecurityUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_DIGITAL_CERTIFICATE_SECURITY_UPDATE, digitalCertificateSecurityUpdateAction);
}
@ApiOperation(value = "delete currency pair securities.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_DIGITAL_CERTIFICATE_SECURITY_DELETE, deleteAction);
}
@ApiOperation(value = "get all equity securities.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_DigitalCertificateSecurity,
DigitalCertificateSecurity.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -1,74 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.security.Rates;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.RatesNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.RatesUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@Controller
@RequestMapping("/rates")
public class RatesController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public RatesController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all rates.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Rates, Rates.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create rates.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody RatesNewAction ratesNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_RATES_NEW, ratesNewAction);
}
@ApiOperation(value = "update risk_parameter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody RatesUpdateAction ratesUpdateAction) throws ExecutionException, InterruptedException {
ratesUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_RATES_UPDATE, ratesUpdateAction);
}
}

View file

@ -1,74 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.security.RiskParameter;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@Controller
@RequestMapping("/risk-parameter")
public class RiskParameterController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public RiskParameterController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all risk_parameter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_RiskParameter, RiskParameter.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create risk_parameter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody RiskParameterNewAction riskParameterNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_RISK_PARAMETER_NEW, riskParameterNewAction);
}
@ApiOperation(value = "update risk_parameter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody RiskParameterUpdateAction riskParameterUpdateAction) throws ExecutionException, InterruptedException {
riskParameterUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_RISK_PARAMETER_UPDATE, riskParameterUpdateAction);
}
}

View file

@ -3,9 +3,6 @@ package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@ -13,12 +10,16 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.security.DigitalCertificateSecurity;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
/**
* SecurityController и MoneyMarketSecurityController разные контроллеры, не путать.
*/
@ -47,12 +48,6 @@ public class SecurityController {
all.addAll(stateLoader.getAllMetaTransformSpecificClass(
IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class
));
all.addAll(stateLoader.getAllMetaTransformSpecificClass(
IMDGDistributedNames.Map_CurrencyPairSecurity, EquitySecurity.class
));
all.addAll(stateLoader.getAllMetaTransformSpecificClass(
IMDGDistributedNames.Map_DigitalCertificateSecurity, DigitalCertificateSecurity.class
));
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;

View file

@ -1,41 +0,0 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.security.UtilitarianDigitalRight;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@Controller
@RequestMapping("/securities/utilitarian-digital-rights")
public class UtilitarianDigitalRightController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public UtilitarianDigitalRightController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all Utilitarian Digital Rights.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_UtilitarianDigitalRight, UtilitarianDigitalRight.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -17,9 +17,6 @@ public class AccountInformationNewAction implements IAction<InformationAccountNe
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String status;
@ApiModelProperty(value = "Код валюты", example = "RUB")
@JsonProperty
public String currency;
@ApiModelProperty(value = "Наименование типа счета", example = "INFO")
@JsonProperty
private String accountType;
@ -29,7 +26,6 @@ public class AccountInformationNewAction implements IAction<InformationAccountNe
var req = new InformationAccountNewRequest();
req.setCompanyId(this.companyId);
req.setAccount(this.account);
req.setCurrency(this.currency);
req.setStatus(this.status);
req.setAccountType(this.accountType);
return req;

View file

@ -29,9 +29,6 @@ public class AccountNewAction implements IAction<AccountNewRequest> {
@ApiModelProperty(value = "Наименование типа счета", example = "CLRN")
@JsonProperty
private String accountType;
@ApiModelProperty(value = "Код валюты", example = "RUB")
@JsonProperty
private String currency;
@Override
public AccountNewRequest toRequest() {
@ -40,7 +37,6 @@ public class AccountNewAction implements IAction<AccountNewRequest> {
req.setAccount(this.account);
req.setStatus(this.status);
req.setAccountType(this.accountType);
req.setCurrency(this.currency);
return req;
}
@ -81,12 +77,4 @@ public class AccountNewAction implements IAction<AccountNewRequest> {
public void setAccountType(String accountType) {
this.accountType = accountType;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
}

View file

@ -47,57 +47,6 @@ public class BankAccountNewAction implements IAction<BankAccountNewRequest> {
@ApiModelProperty(value = "Компания", example = "1234")
@JsonProperty
private Long companyId;
@ApiModelProperty(value = "SWIFT", example = "ABCDE")
@JsonProperty
private String swiftCode;
@ApiModelProperty(value = "Код SWIFT посредника", example = "ABCDE")
@JsonProperty
private String intermediarySwiftCode;
@ApiModelProperty(value = "Наименование владельца счета", example = "ABCDE")
@JsonProperty
private String name;
@ApiModelProperty(value = "Адрес владельца счета", example = "ABCDE")
@JsonProperty
private String address;
@ApiModelProperty(value = "Место нахождения банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankAddress;
@ApiModelProperty(value = "SWIFT банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankSwiftCode;
@ApiModelProperty(value = "Номер счета банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankAccount;
@ApiModelProperty(value = "Наименование банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankName1;
@ApiModelProperty(value = "Место нахождения банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankAddress1;
@ApiModelProperty(value = "Номер счета банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankAccount1;
@ApiModelProperty(value = "Наименование банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankName2;
@ApiModelProperty(value = "Место нахождения банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankAddress2;
@ApiModelProperty(value = "SWIFT банка-посредника 2", example = "ABCDE")
@JsonProperty
private String intermediarySwiftCode2;
@ApiModelProperty(value = "Номер счета банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankAccount2;
@ApiModelProperty(value = "Лицевой счет получателя", example = "ABCDE")
@JsonProperty
private String personalAccount;
@ApiModelProperty(value = "КБК", example = "ABCDE")
@JsonProperty
private String budgetClassificationCode;
@ApiModelProperty(value = "ОКТМО получателя средств", example = "ABCDE")
@JsonProperty
private String oktmo;
@Override
public BankAccountNewRequest toRequest() {
@ -112,23 +61,6 @@ public class BankAccountNewAction implements IAction<BankAccountNewRequest> {
req.setTaxRegistrationReasonCode(this.taxRegistrationReasonCode);
req.setAccount(this.account);
req.setCompanyId(this.companyId);
req.setSwiftCode(swiftCode);
req.setIntermediarySwiftCode(intermediarySwiftCode);
req.setName(name);
req.setAddress(address);
req.setBankAddress(bankAddress);
req.setBankSwiftCode(bankSwiftCode);
req.setBankAccount(bankAccount);
req.setBankName1(bankName1);
req.setBankAddress1(bankAddress1);
req.setBankAccount1(bankAccount1);
req.setBankName2(bankName2);
req.setBankAddress2(bankAddress2);
req.setIntermediarySwiftCode2(intermediarySwiftCode2);
req.setBankAccount2(bankAccount2);
req.setPersonalAccount(personalAccount);
req.setBudgetClassificationCode(budgetClassificationCode);
req.setOktmo(oktmo);
return req;
}
@ -217,140 +149,4 @@ public class BankAccountNewAction implements IAction<BankAccountNewRequest> {
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getSwiftCode() {
return swiftCode;
}
public void setSwiftCode(String swiftCode) {
this.swiftCode = swiftCode;
}
public String getIntermediarySwiftCode() {
return intermediarySwiftCode;
}
public void setIntermediarySwiftCode(String intermediarySwiftCode) {
this.intermediarySwiftCode = intermediarySwiftCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBankAddress() {
return bankAddress;
}
public void setBankAddress(String bankAddress) {
this.bankAddress = bankAddress;
}
public String getBankSwiftCode() {
return bankSwiftCode;
}
public void setBankSwiftCode(String bankSwiftCode) {
this.bankSwiftCode = bankSwiftCode;
}
public String getBankAccount() {
return bankAccount;
}
public void setBankAccount(String bankAccount) {
this.bankAccount = bankAccount;
}
public String getBankName1() {
return bankName1;
}
public void setBankName1(String bankName1) {
this.bankName1 = bankName1;
}
public String getBankAddress1() {
return bankAddress1;
}
public void setBankAddress1(String bankAddress1) {
this.bankAddress1 = bankAddress1;
}
public String getBankAccount1() {
return bankAccount1;
}
public void setBankAccount1(String bankAccount1) {
this.bankAccount1 = bankAccount1;
}
public String getBankName2() {
return bankName2;
}
public void setBankName2(String bankName2) {
this.bankName2 = bankName2;
}
public String getBankAddress2() {
return bankAddress2;
}
public void setBankAddress2(String bankAddress2) {
this.bankAddress2 = bankAddress2;
}
public String getIntermediarySwiftCode2() {
return intermediarySwiftCode2;
}
public void setIntermediarySwiftCode2(String intermediarySwiftCode2) {
this.intermediarySwiftCode2 = intermediarySwiftCode2;
}
public String getBankAccount2() {
return bankAccount2;
}
public void setBankAccount2(String bankAccount2) {
this.bankAccount2 = bankAccount2;
}
public String getPersonalAccount() {
return personalAccount;
}
public void setPersonalAccount(String personalAccount) {
this.personalAccount = personalAccount;
}
public String getBudgetClassificationCode() {
return budgetClassificationCode;
}
public void setBudgetClassificationCode(String budgetClassificationCode) {
this.budgetClassificationCode = budgetClassificationCode;
}
public String getOktmo() {
return oktmo;
}
public void setOktmo(String oktmo) {
this.oktmo = oktmo;
}
}

View file

@ -38,62 +38,10 @@ public class BankAccountUpdateAction implements IAction<BankAccountUpdateRequest
@ApiModelProperty(value = "Код причины постановки (КПП)", example = "01")
@JsonProperty
private String taxRegistrationReasonCode;
@ApiModelProperty(value = "SWIFT", example = "ABCDE")
@JsonProperty
private String swiftCode;
@ApiModelProperty(value = "Код SWIFT посредника", example = "ABCDE")
@JsonProperty
private String intermediarySwiftCode;
@ApiModelProperty(value = "Номер счета", example = "11111222223333344444")
private String account;
@ApiModelProperty(value = "Наименование владельца счета", example = "ABCDE")
@JsonProperty
private String name;
@ApiModelProperty(value = "Адрес владельца счета", example = "ABCDE")
@JsonProperty
private String address;
@ApiModelProperty(value = "Место нахождения банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankAddress;
@ApiModelProperty(value = "SWIFT банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankSwiftCode;
@ApiModelProperty(value = "Номер счета банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankAccount;
@ApiModelProperty(value = "Наименование банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankName1;
@ApiModelProperty(value = "Место нахождения банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankAddress1;
@ApiModelProperty(value = "Номер счета банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankAccount1;
@ApiModelProperty(value = "Наименование банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankName2;
@ApiModelProperty(value = "Место нахождения банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankAddress2;
@ApiModelProperty(value = "SWIFT банка-посредника 2", example = "ABCDE")
@JsonProperty
private String intermediarySwiftCode2;
@ApiModelProperty(value = "Номер счета банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankAccount2;
@ApiModelProperty(value = "Лицевой счет получателя", example = "ABCDE")
@JsonProperty
private String personalAccount;
@ApiModelProperty(value = "КБК", example = "ABCDE")
@JsonProperty
private String budgetClassificationCode;
@ApiModelProperty(value = "ОКТМО получателя средств", example = "ABCDE")
@JsonProperty
private String oktmo;
@Override
public BankAccountUpdateRequest toRequest() {
var req = new BankAccountUpdateRequest();
@ -107,23 +55,6 @@ public class BankAccountUpdateAction implements IAction<BankAccountUpdateRequest
req.setTaxpayerIdentificationNumber(this.taxpayerIdentificationNumber);
req.setTaxRegistrationReasonCode(this.taxRegistrationReasonCode);
req.setAccount(this.account);
req.setSwiftCode(swiftCode);
req.setIntermediarySwiftCode(intermediarySwiftCode);
req.setName(name);
req.setAddress(address);
req.setBankAddress(bankAddress);
req.setBankSwiftCode(bankSwiftCode);
req.setBankAccount(bankAccount);
req.setBankName1(bankName1);
req.setBankAddress1(bankAddress1);
req.setBankAccount1(bankAccount1);
req.setBankName2(bankName2);
req.setBankAddress2(bankAddress2);
req.setIntermediarySwiftCode2(intermediarySwiftCode2);
req.setBankAccount2(bankAccount2);
req.setPersonalAccount(personalAccount);
req.setBudgetClassificationCode(budgetClassificationCode);
req.setOktmo(oktmo);
return req;
}
@ -212,140 +143,4 @@ public class BankAccountUpdateAction implements IAction<BankAccountUpdateRequest
public void setAccount(String account) {
this.account = account;
}
public String getSwiftCode() {
return swiftCode;
}
public void setSwiftCode(String swiftCode) {
this.swiftCode = swiftCode;
}
public String getIntermediarySwiftCode() {
return intermediarySwiftCode;
}
public void setIntermediarySwiftCode(String intermediarySwiftCode) {
this.intermediarySwiftCode = intermediarySwiftCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBankAddress() {
return bankAddress;
}
public void setBankAddress(String bankAddress) {
this.bankAddress = bankAddress;
}
public String getBankSwiftCode() {
return bankSwiftCode;
}
public void setBankSwiftCode(String bankSwiftCode) {
this.bankSwiftCode = bankSwiftCode;
}
public String getBankAccount() {
return bankAccount;
}
public void setBankAccount(String bankAccount) {
this.bankAccount = bankAccount;
}
public String getBankName1() {
return bankName1;
}
public void setBankName1(String bankName1) {
this.bankName1 = bankName1;
}
public String getBankAddress1() {
return bankAddress1;
}
public void setBankAddress1(String bankAddress1) {
this.bankAddress1 = bankAddress1;
}
public String getBankAccount1() {
return bankAccount1;
}
public void setBankAccount1(String bankAccount1) {
this.bankAccount1 = bankAccount1;
}
public String getBankName2() {
return bankName2;
}
public void setBankName2(String bankName2) {
this.bankName2 = bankName2;
}
public String getBankAddress2() {
return bankAddress2;
}
public void setBankAddress2(String bankAddress2) {
this.bankAddress2 = bankAddress2;
}
public String getIntermediarySwiftCode2() {
return intermediarySwiftCode2;
}
public void setIntermediarySwiftCode2(String intermediarySwiftCode2) {
this.intermediarySwiftCode2 = intermediarySwiftCode2;
}
public String getBankAccount2() {
return bankAccount2;
}
public void setBankAccount2(String bankAccount2) {
this.bankAccount2 = bankAccount2;
}
public String getPersonalAccount() {
return personalAccount;
}
public void setPersonalAccount(String personalAccount) {
this.personalAccount = personalAccount;
}
public String getBudgetClassificationCode() {
return budgetClassificationCode;
}
public void setBudgetClassificationCode(String budgetClassificationCode) {
this.budgetClassificationCode = budgetClassificationCode;
}
public String getOktmo() {
return oktmo;
}
public void setOktmo(String oktmo) {
this.oktmo = oktmo;
}
}

View file

@ -31,9 +31,6 @@ public class ClientCodeNewAction implements IAction<ClientCodeNewRequest> {
@ApiModelProperty(value = "Номер депозитарного счета", example = "1234")
@JsonProperty
private Long depoAccountId;
@ApiModelProperty(value = "Список валютных счетов", example = "[1234,5678]")
@JsonProperty
private List<Long> currencyAccountList;
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String status;
@ -46,7 +43,6 @@ public class ClientCodeNewAction implements IAction<ClientCodeNewRequest> {
req.setTradingClearingRegistryId(this.tradingClearingRegistryId);
req.setMoneyAccountId(this.moneyAccountId);
req.setDepoAccountId(this.depoAccountId);
req.setCurrencyAccountList(this.currencyAccountList);
req.setStatus(this.status);
return req;
}
@ -97,14 +93,6 @@ public class ClientCodeNewAction implements IAction<ClientCodeNewRequest> {
this.depoAccountId = depoAccountId;
}
public List<Long> getCurrencyAccountList() {
return currencyAccountList;
}
public void setCurrencyAccountList(List<Long> currencyAccountList) {
this.currencyAccountList = currencyAccountList;
}
public String getStatus() {
return status;
}

View file

@ -32,9 +32,6 @@ public class ClientCodeUpdateAction implements IAction<ClientCodeUpdateRequest>
@ApiModelProperty(value = "Номер депозитарного счета", example = "1234")
@JsonProperty
private Long depoAccountId;
@ApiModelProperty(value = "Список валютных счетов", example = "[1234,5678]")
@JsonProperty
private List<Long> currencyAccountList;
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String status;
@ -49,7 +46,6 @@ public class ClientCodeUpdateAction implements IAction<ClientCodeUpdateRequest>
req.setTradingClearingRegistryId(this.tradingClearingRegistryId);
req.setMoneyAccountId(this.moneyAccountId);
req.setDepoAccountId(this.depoAccountId);
req.setCurrencyAccountList(this.currencyAccountList);
req.setStatus(this.status);
return req;
}
@ -108,14 +104,6 @@ public class ClientCodeUpdateAction implements IAction<ClientCodeUpdateRequest>
this.depoAccountId = depoAccountId;
}
public List<Long> getCurrencyAccountList() {
return currencyAccountList;
}
public void setCurrencyAccountList(List<Long> currencyAccountList) {
this.currencyAccountList = currencyAccountList;
}
public String getStatus() {
return status;
}

View file

@ -1,26 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.common;
import java.util.Collection;
import java.util.Collections;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.platform.utils.enumeration.EnumMessage;
public class CommonCheckAction implements IAction<CommonDeleteRequest>{
@Override
public Collection<EnumMessage> validate() {return Collections.emptyList();
}
@Override
public CommonDeleteRequest toRequest() {
var req = new CommonDeleteRequest();
return req;
}
@Override
public ActionType getActionType() {
return ActionType.CHECK;
}
}

View file

@ -1,15 +1,10 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyInfoUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class CompanyInfoUpdateAction implements IAction<CompanyInfoUpdateRequest> {
@ApiModelProperty(hidden = true)
@ -52,17 +47,6 @@ public class CompanyInfoUpdateAction implements IAction<CompanyInfoUpdateRequest
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String workflowStatus;
@ApiModelProperty(value = "Налоговый номер", example = "ACTV")
@JsonProperty
private String taxNumber;
@ApiModelProperty(value = "Дата гос. регистрации", example = "2022-12-25")
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate registrationDate;
@ApiModelProperty(value = "Страна резидентства", example = "RUS")
@JsonProperty
private String residenceCode;
@Override
public CompanyInfoUpdateRequest toRequest() {
@ -79,10 +63,7 @@ public class CompanyInfoUpdateAction implements IAction<CompanyInfoUpdateRequest
request.setFullNameEng(this.fullNameEng);
request.setShortName(this.shortName);
request.setFullName(this.fullName);
request.setWorkflowStatus(this.workflowStatus);
request.setTaxNumber(this.taxNumber);
request.setRegistrationDate(this.registrationDate);
request.setResidenceCode(this.residenceCode);
request.setWorkflowStatus(workflowStatus);
return request;
}
@ -195,28 +176,4 @@ public class CompanyInfoUpdateAction implements IAction<CompanyInfoUpdateRequest
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public String getTaxNumber() {
return taxNumber;
}
public void setTaxNumber(String taxNumber) {
this.taxNumber = taxNumber;
}
public LocalDate getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(LocalDate registrationDate) {
this.registrationDate = registrationDate;
}
public String getResidenceCode() {
return residenceCode;
}
public void setResidenceCode(String residenceCode) {
this.residenceCode = residenceCode;
}
}

View file

@ -1,71 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyRoleSetUpdateRequest;
public class CompanyRoleSetUpdateAction implements IAction<CompanyRoleSetUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
public Long id;
@ApiModelProperty(value = "Наименование компании", example = "1234")
@JsonProperty
Long companyId;
@ApiModelProperty(value = "Код роли компании", example = "ABCD")
@JsonProperty
String companyRole;
@ApiModelProperty(value = "Код статуса", example = "ACTV")
@JsonProperty
String workflowStatus;
@Override
public CompanyRoleSetUpdateRequest toRequest() {
var request = new CompanyRoleSetUpdateRequest();
request.setId(this.id);
request.setCompanyId(this.companyId);
request.setCompanyRole(this.companyRole);
request.setWorkflowStatus(this.workflowStatus);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getCompanyRole() {
return companyRole;
}
public void setCompanyRole(String companyRole) {
this.companyRole = companyRole;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
}

View file

@ -1,12 +1,13 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingNewRequest;
import java.math.BigDecimal;
public class ListingNewAction implements IAction<ListingNewRequest> {
@ApiModelProperty(value = "Наименование инструмента", example = "1234")
@JsonProperty
@ -23,12 +24,6 @@ public class ListingNewAction implements IAction<ListingNewRequest> {
@ApiModelProperty(value = "Наименование статуса листинга в системе", example = "ACTV")
@JsonProperty
private String workflowStatus;
@ApiModelProperty(value = "Шаг цены", example = "1234.56")
@JsonProperty
private BigDecimal minStep;
@ApiModelProperty(value = "Точность", example = "1234.56")
@JsonProperty
private BigDecimal precision;
@Override
public ListingNewRequest toRequest() {
@ -38,8 +33,6 @@ public class ListingNewAction implements IAction<ListingNewRequest> {
request.setLotSize(this.lotSize);
request.setTradingCurrency(this.tradingCurrency);
request.setWorkflowStatus(this.workflowStatus);
request.setMinStep(this.minStep);
request.setPrecision(this.precision);
return request;
}

View file

@ -1,12 +1,14 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.ContactUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingUpdateRequest;
import java.math.BigDecimal;
public class ListingUpdateAction implements IAction<ListingUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
@ -26,12 +28,6 @@ public class ListingUpdateAction implements IAction<ListingUpdateRequest> {
@ApiModelProperty(value = "Наименование статуса листинга в системе", example = "ACTV")
@JsonProperty
private String workflowStatus;
@ApiModelProperty(value = "Шаг цены", example = "1234.56")
@JsonProperty
private BigDecimal minStep;
@ApiModelProperty(value = "Точность", example = "1234.56")
@JsonProperty
private BigDecimal precision;
@Override
public ListingUpdateRequest toRequest() {
@ -42,8 +38,6 @@ public class ListingUpdateAction implements IAction<ListingUpdateRequest> {
request.setLotSize(this.lotSize);
request.setTradingCurrency(this.tradingCurrency);
request.setWorkflowStatus(this.workflowStatus);
request.setMinStep(this.minStep);
request.setPrecision(this.precision);
return request;
}

View file

@ -1,46 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.SettlementHousePropertyNewRequest;
public class SettlementHousePropertiesNewAction implements IAction<SettlementHousePropertyNewRequest> {
@ApiModelProperty(value = "Наименование компании", example = "1234")
@JsonProperty
Long companyId;
@ApiModelProperty(value = "Код валюты", example = "RUB")
@JsonProperty
String currencyCode;
@Override
public SettlementHousePropertyNewRequest toRequest() {
SettlementHousePropertyNewRequest request = new SettlementHousePropertyNewRequest();
request.setCompanyId(this.companyId);
request.setCurrencyCode(this.currencyCode);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getCurrencyCode() {
return currencyCode;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
}

View file

@ -1,60 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.SettlementHousePropertyUpdateRequest;
public class SettlementHousePropertiesUpdateAction implements IAction<SettlementHousePropertyUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
private Long id;
@ApiModelProperty(value = "Наименование компании", example = "1234")
@JsonProperty
Long companyId;
@ApiModelProperty(value = "Код валюты", example = "RUB")
@JsonProperty
String currencyCode;
@Override
public SettlementHousePropertyUpdateRequest toRequest() {
SettlementHousePropertyUpdateRequest request = new SettlementHousePropertyUpdateRequest();
request.setId(this.id);
request.setCompanyId(this.companyId);
request.setCurrencyCode(this.currencyCode);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
@ApiModelProperty(hidden = true)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getCurrencyCode() {
return currencyCode;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
}

View file

@ -1,58 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.misc;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.misc.OvernightSettingsNewRequest;
public class OvernightNewAction implements IAction<OvernightSettingsNewRequest> {
@ApiModelProperty(value = "Идентификатор участника", example = "123")
@JsonProperty
public Long companyId;
@ApiModelProperty(value = "Код рынка", example = "TVAF")
@JsonProperty
public String market;
@ApiModelProperty(value = "Тип сделок переноса компании", example = "ASD")
@JsonProperty
public String overnightType;
@Override
public OvernightSettingsNewRequest toRequest() {
var req = new OvernightSettingsNewRequest();
req.setCompanyId(this.companyId);
req.setMarket(this.market);
req.setOvernightType(this.overnightType);
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
public String getOvernightType() {
return overnightType;
}
public void setOvernightType(String overnightType) {
this.overnightType = overnightType;
}
}

View file

@ -1,70 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.misc;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.misc.OvernightSettingsUpdateRequest;
public class OvernightUpdateAction implements IAction<OvernightSettingsUpdateRequest> {
@ApiModelProperty(value = "Идентификатор записи", example = "122")
@JsonProperty
public Long id;
@ApiModelProperty(value = "Идентификатор участника", example = "123")
@JsonProperty
public Long companyId;
@ApiModelProperty(value = "Код рынка", example = "TVAF")
@JsonProperty
public String market;
@ApiModelProperty(value = "Тип сделок переноса компании", example = "ASD")
@JsonProperty
public String overnightType;
@Override
public OvernightSettingsUpdateRequest toRequest() {
var req = new OvernightSettingsUpdateRequest();
req.setId(this.id);
req.setCompanyId(this.companyId);
req.setMarket(this.market);
req.setOvernightType(this.overnightType);
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
public String getOvernightType() {
return overnightType;
}
public void setOvernightType(String overnightType) {
this.overnightType = overnightType;
}
}

View file

@ -1,70 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.order;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.order.OrderCompanyNewRequest;
public class OrderCompanyNewAction implements IAction<OrderCompanyNewRequest> {
@ApiModelProperty(value = "Идентификатор записи", example = "12")
@JsonProperty
private Long orderId;
@ApiModelProperty(value = "Тип сделок переноса компании", example = "ASDF")
@JsonProperty
private Long companyId;
@ApiModelProperty(value = "Торгово-клиринговый регистр", example = "ASDF")
@JsonProperty
private Long tradingClearingRegistryId;
@ApiModelProperty(value = "Объем заявки в лотах", example = "ASDF")
@JsonProperty
private Long quantityLot;
@Override
public OrderCompanyNewRequest toRequest() {
OrderCompanyNewRequest request = new OrderCompanyNewRequest();
request.setOrderId(orderId);
request.setCompanyId(companyId);
request.setTradingClearingRegistryId(tradingClearingRegistryId);
request.setQuantityLot(quantityLot);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getTradingClearingRegistryId() {
return tradingClearingRegistryId;
}
public void setTradingClearingRegistryId(Long tradingClearingRegistryId) {
this.tradingClearingRegistryId = tradingClearingRegistryId;
}
public Long getQuantityLot() {
return quantityLot;
}
public void setQuantityLot(Long quantityLot) {
this.quantityLot = quantityLot;
}
}

View file

@ -1,70 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.order;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.order.OrderCompanyUpdateRequest;
public class OrderCompanyUpdateAction implements IAction<OrderCompanyUpdateRequest> {
@ApiModelProperty(value = "Идентификатор записи", example = "12")
@JsonProperty
private Long id;
@ApiModelProperty(value = "Тип сделок переноса компании", example = "ASDF")
@JsonProperty
private Long companyId;
@ApiModelProperty(value = "Торгово-клиринговый регистр", example = "ASDF")
@JsonProperty
private Long tradingClearingRegistryId;
@ApiModelProperty(value = "Объем заявки в лотах", example = "ASDF")
@JsonProperty
private Long quantityLot;
@Override
public OrderCompanyUpdateRequest toRequest() {
OrderCompanyUpdateRequest request = new OrderCompanyUpdateRequest();
request.setId(id);
request.setCompanyId(companyId);
request.setTradingClearingRegistryId(tradingClearingRegistryId);
request.setQuantityLot(quantityLot);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getTradingClearingRegistryId() {
return tradingClearingRegistryId;
}
public void setTradingClearingRegistryId(Long tradingClearingRegistryId) {
this.tradingClearingRegistryId = tradingClearingRegistryId;
}
public Long getQuantityLot() {
return quantityLot;
}
public void setQuantityLot(Long quantityLot) {
this.quantityLot = quantityLot;
}
}

View file

@ -1,111 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.order;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.order.OrderCurrencyUpdateRequest;
public class OrderCurrencyUpdateAction implements IAction<OrderCurrencyUpdateRequest> {
@ApiModelProperty(value = "Идентификатор записи", example = "12")
@JsonProperty
private Long id;
@ApiModelProperty(value = "Наименование инструмента", example = "333")
@JsonProperty
private Long securityId;
@ApiModelProperty(value = "Маркет", example = "333")
@JsonProperty
private String market;
@ApiModelProperty(value = "Цена заявки", example = "12.33")
@JsonProperty
private BigDecimal price;
@ApiModelProperty(value = "Объем заявки в лотах", example = "21")
@JsonProperty
private Long quantityLot;
@ApiModelProperty(value = "Направление заявки", example = "BUY")
@JsonProperty
private String side;
@ApiModelProperty(value = "Статус заявки", example = "ACT")
@JsonProperty
private String status;
@ApiModelProperty(value = "Комментарий", example = "asd")
@JsonProperty
private String comment;
@Override
public OrderCurrencyUpdateRequest toRequest() {
OrderCurrencyUpdateRequest request = new OrderCurrencyUpdateRequest();
request.setId(id);
request.setSecurityId(securityId);
request.setMarket(market);
request.setPrice(price);
request.setQuantityLot(quantityLot);
request.setSide(side);
request.setStatus(status);
request.setComment(comment);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getSecurityId() {
return securityId;
}
public void setSecurityId(Long securityId) {
this.securityId = securityId;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Long getQuantityLot() {
return quantityLot;
}
public void setQuantityLot(Long quantityLot) {
this.quantityLot = quantityLot;
}
public String getSide() {
return side;
}
public void setSide(String side) {
this.side = side;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}

View file

@ -1,47 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.order;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.order.OrderCurrencyUpdateRequest;
public class OrderCurrencyUpdateStatusAction implements IAction<OrderCurrencyUpdateRequest> {
@ApiModelProperty(value = "Идентификатор записи", example = "12")
@JsonProperty
private Long id;
@ApiModelProperty(value = "Статус заявки", example = "ACT")
@JsonProperty
private String status;
@Override
public OrderCurrencyUpdateRequest toRequest() {
OrderCurrencyUpdateRequest request = new OrderCurrencyUpdateRequest();
request.setId(id);
request.setStatus(status);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View file

@ -1,46 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.order;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.order.OrderCurrencyUpdateRequest;
public class OrderOvernightTypeUpdateAction implements IAction<OrderCurrencyUpdateRequest> {
@ApiModelProperty(value = "Идентификатор записи", example = "12")
@JsonProperty
private Long id;
@ApiModelProperty(value = "Тип сделок переноса компании", example = "ASDF")
@JsonProperty
private String overnightType;
@Override
public OrderCurrencyUpdateRequest toRequest() {
OrderCurrencyUpdateRequest request = new OrderCurrencyUpdateRequest();
request.setId(id);
request.setOvernightType(overnightType);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getOvernightType() {
return overnightType;
}
public void setOvernightType(String overnightType) {
this.overnightType = overnightType;
}
}

View file

@ -26,15 +26,12 @@ public class ChangeRefundDateActionNew implements IAction<RegistryChangeRefundDa
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
public LocalDate refundDate;
@JsonProperty
public String market;
@Override
public RegistryChangeRefundDateRequest toRequest() {
var req = new RegistryChangeRefundDateRequest();
req.setGroupId(groupId);
req.setRefundDate(refundDate);
req.setMarket(market);
return req;
}
@ -71,12 +68,4 @@ public class ChangeRefundDateActionNew implements IAction<RegistryChangeRefundDa
public void setRefundDate(LocalDate refundDate) {
this.refundDate = refundDate;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -1,68 +0,0 @@
package ru.spcex.clearing.backendapi.controller.request.cud.registry;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.DmauRegistryRequest;
public class DmauRegistryActionNew implements IAction<DmauRegistryRequest> {
@JsonProperty
private BigDecimal balance;
@JsonProperty
private Long securityId;
@JsonProperty
private String securitySymbol;
@JsonProperty
private BigDecimal amount;
@JsonProperty
private String paymentPurpose;
@JsonProperty
private Long senderId;
@JsonProperty
private Long creditLegAccountId;
@JsonProperty
private String debitCorrAccount;
@JsonProperty
private String debitLegAccount;
@JsonProperty
private String debitCompanyName;
@JsonProperty
private String debitBankName;
@JsonProperty
private String debitBIC;
@JsonProperty
private String debitSwiftCode;
@JsonProperty
private String debitIntSwiftCode;
@JsonProperty
private String debitINN;
@JsonProperty
private String debitKPP;
@Override
public DmauRegistryRequest toRequest() {
DmauRegistryRequest request = new DmauRegistryRequest();
request.setBalance(balance);
request.setSecurityId(securityId);
request.setSecuritySymbol(securitySymbol);
request.setAmount(amount);
request.setPaymentPurpose(paymentPurpose);
request.setSenderId(senderId);
request.setCreditLegAccountId(creditLegAccountId);
request.setDebitCorrAccount(debitCorrAccount);
request.setDebitLegAccount(debitLegAccount);
request.setDebitCompanyName(debitCompanyName);
request.setDebitBankName(debitBankName);
request.setDebitBIC(debitBIC);
request.setDebitSwiftCode(debitSwiftCode);
request.setDebitIntSwiftCode(debitIntSwiftCode);
request.setDebitINN(debitINN);
request.setDebitKPP(debitKPP);
return request;
}
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
}

Some files were not shown because too many files have changed in this diff Show more