This commit is contained in:
AKurakin 2024-03-21 19:51:04 +03:00
parent d1cf6da58e
commit b6ff7b091d
15 changed files with 504 additions and 9 deletions

View file

@ -48,6 +48,9 @@ public class SecurityController {
all.addAll(stateLoader.getAllMetaTransformSpecificClass( all.addAll(stateLoader.getAllMetaTransformSpecificClass(
IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class
)); ));
all.addAll(stateLoader.getAllMetaTransformSpecificClass(
IMDGDistributedNames.Map_CurrencyPairSecurity, EquitySecurity.class
));
CommonGetAllResponse response = new CommonGetAllResponse(); CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all); response.fromEntity(all);
return response; return response;

View file

@ -29,6 +29,7 @@ import ru.clearing.classes.statics.data.sdf.SDf21;
import ru.clearing.classes.statics.data.sdf.SDf54; import ru.clearing.classes.statics.data.sdf.SDf54;
import ru.clearing.classes.statics.data.sdf.SDf55; import ru.clearing.classes.statics.data.sdf.SDf55;
import ru.clearing.classes.statics.data.sdf.SDf57; import ru.clearing.classes.statics.data.sdf.SDf57;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement; import ru.clearing.classes.statics.data.statement.Statement;
@ -88,6 +89,7 @@ public class ValidationConfig {
Imdg<Company> imdgCompany; Imdg<Company> imdgCompany;
Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg; Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
Imdg<EquitySecurity> equitySecurityImdg; Imdg<EquitySecurity> equitySecurityImdg;
Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
Imdg<CompanySymbols> imdgCompanySymbols; Imdg<CompanySymbols> imdgCompanySymbols;
Imdg<Registry> imdgRegistry; Imdg<Registry> imdgRegistry;
@ -130,6 +132,7 @@ public class ValidationConfig {
this.sDf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class); this.sDf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class);
this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.ctgrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); this.ctgrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
this.currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class);
this.imdgProvider = imdgProvider; this.imdgProvider = imdgProvider;
} }
@ -170,6 +173,7 @@ public class ValidationConfig {
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg); context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg);
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity); context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity);
context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg); context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg);
context.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityImdg);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
STradesValidationRule.SecurityPresentFond, STradesValidationRule.SecurityPresentFond,
@ -261,6 +265,7 @@ public class ValidationConfig {
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity); context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity);
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg); context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg);
context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg); context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg);
context.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityImdg);
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
context.addImdg(IMDGDistributedNames.Map_SDf20, imdgSdf20); context.addImdg(IMDGDistributedNames.Map_SDf20, imdgSdf20);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
@ -344,6 +349,7 @@ public class ValidationConfig {
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity , fixedIncomeSecurityImdg); context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity , fixedIncomeSecurityImdg);
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity , imdgMoneyMarketSecurity); context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity , imdgMoneyMarketSecurity);
context.addImdg(IMDGDistributedNames.Map_EquitySecurity , equitySecurityImdg); context.addImdg(IMDGDistributedNames.Map_EquitySecurity , equitySecurityImdg);
context.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityImdg);
context.addImdg(IMDGDistributedNames.Map_CompanySymbols, imdgCompanySymbols); context.addImdg(IMDGDistributedNames.Map_CompanySymbols, imdgCompanySymbols);
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
@ -498,6 +504,7 @@ public class ValidationConfig {
ctx.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity , fixedIncomeSecurityImdg); ctx.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity , fixedIncomeSecurityImdg);
ctx.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity , imdgMoneyMarketSecurity); ctx.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity , imdgMoneyMarketSecurity);
ctx.addImdg(IMDGDistributedNames.Map_EquitySecurity , equitySecurityImdg); ctx.addImdg(IMDGDistributedNames.Map_EquitySecurity , equitySecurityImdg);
ctx.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityImdg);
return new ValidatorImpl<>(ctx, return new ValidatorImpl<>(ctx,
Sdf20ValidationRule.Fields, Sdf20ValidationRule.Fields,
Sdf20ValidationRule.AccountPresent, Sdf20ValidationRule.AccountPresent,

View file

@ -8,6 +8,7 @@ import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Currency; import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement; import ru.clearing.classes.statics.data.statement.Statement;
@ -37,6 +38,7 @@ public class RegistryBuilder {
private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg; private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg; private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg;
private final Imdg<EquitySecurity> equitySecurityImdg; private final Imdg<EquitySecurity> equitySecurityImdg;
private final Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
private final Imdg<Currency> currencyImdg; private final Imdg<Currency> currencyImdg;
@ -52,6 +54,7 @@ public class RegistryBuilder {
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
this.currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class);
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class); this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
} }
@ -138,12 +141,15 @@ public class RegistryBuilder {
} }
private String obtainSecuritySymbol(Long securityId) { private String obtainSecuritySymbol(Long securityId) {
// похожий код есть в SecuritySelector
Security security = fixedIncomeSecurityImdg.getSingleObjectByID(securityId); Security security = fixedIncomeSecurityImdg.getSingleObjectByID(securityId);
if (security != null) return security.getSecuritySymbol(); if (security != null) return security.getSecuritySymbol();
security = moneyMarketSecurityImdg.getSingleObjectByID(securityId); security = moneyMarketSecurityImdg.getSingleObjectByID(securityId);
if (security != null) return security.getSecuritySymbol(); if (security != null) return security.getSecuritySymbol();
security = equitySecurityImdg.getSingleObjectByID(securityId); security = equitySecurityImdg.getSingleObjectByID(securityId);
if (security != null) return security.getSecuritySymbol(); if (security != null) return security.getSecuritySymbol();
security = currencyPairSecurityImdg.getSingleObjectByID(securityId);
if (security != null) return security.getSecuritySymbol();
Currency currency = currencyImdg.getSingleObjectByID(securityId); Currency currency = currencyImdg.getSingleObjectByID(securityId);
if (currency != null) return currency.getCurrencyCode(); if (currency != null) return currency.getCurrencyCode();
return null; return null;

View file

@ -8,6 +8,7 @@ import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Currency; import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement; import ru.clearing.classes.statics.data.statement.Statement;
@ -37,6 +38,7 @@ public class RegistrySecurityBuilder {
private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg; private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg; private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg;
private final Imdg<EquitySecurity> equitySecurityImdg; private final Imdg<EquitySecurity> equitySecurityImdg;
private final Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
private final Imdg<Currency> currencyImdg; private final Imdg<Currency> currencyImdg;
@ -52,6 +54,7 @@ public class RegistrySecurityBuilder {
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
this.currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class);
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class); this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
} }
@ -138,12 +141,15 @@ public class RegistrySecurityBuilder {
} }
private String obtainSecuritySymbol(Long securityId) { private String obtainSecuritySymbol(Long securityId) {
// похожий код есть в SecuritySelector
Security security = fixedIncomeSecurityImdg.getSingleObjectByID(securityId); Security security = fixedIncomeSecurityImdg.getSingleObjectByID(securityId);
if (security != null) return security.getSecuritySymbol(); if (security != null) return security.getSecuritySymbol();
security = moneyMarketSecurityImdg.getSingleObjectByID(securityId); security = moneyMarketSecurityImdg.getSingleObjectByID(securityId);
if (security != null) return security.getSecuritySymbol(); if (security != null) return security.getSecuritySymbol();
security = equitySecurityImdg.getSingleObjectByID(securityId); security = equitySecurityImdg.getSingleObjectByID(securityId);
if (security != null) return security.getSecuritySymbol(); if (security != null) return security.getSecuritySymbol();
security = currencyPairSecurityImdg.getSingleObjectByID(securityId);
if (security != null) return security.getSecuritySymbol();
Currency currency = currencyImdg.getSingleObjectByID(securityId); Currency currency = currencyImdg.getSingleObjectByID(securityId);
if (currency != null) return currency.getCurrencyCode(); if (currency != null) return currency.getCurrencyCode();
return null; return null;

View file

@ -33,7 +33,8 @@ public enum STradesValidationRule implements IValidationRule<ImdgValidationConte
SecuritySelector<Security> slctr = new SecuritySelector<>( SecuritySelector<Security> slctr = new SecuritySelector<>(
context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class) context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_CurrencyPairSecurity, Security.class)
); );
Security security = slctr.selectSecurityBySymbol(validatedObject.getSecCode().trim()); Security security = slctr.selectSecurityBySymbol(validatedObject.getSecCode().trim());
if (security == null) { if (security == null) {

View file

@ -7,6 +7,7 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf20; import ru.clearing.classes.statics.data.sdf.SDf20;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -107,7 +108,8 @@ public enum Sdf20ValidationRule implements IValidationRule<ImdgValidationContext
SecuritySelector<Security> slctr = new SecuritySelector<>( SecuritySelector<Security> slctr = new SecuritySelector<>(
context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class) context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_CurrencyPairSecurity, Security.class)
); );
Security securityFound = slctr.selectSecurityBySymbol(security); Security securityFound = slctr.selectSecurityBySymbol(security);
if (securityFound == null) { if (securityFound == null) {

View file

@ -36,7 +36,8 @@ public class SecurityBySecurityCodeValidationRule<T> implements IValidationRule<
SecuritySelector<Security> secSel = new SecuritySelector<>( SecuritySelector<Security> secSel = new SecuritySelector<>(
context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class) context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_CurrencyPairSecurity, Security.class)
); );
Security security = secSel.selectSecurityBySymbol(securitySymbol); Security security = secSel.selectSecurityBySymbol(securitySymbol);
if (security == null) { if (security == null) {

View file

@ -7,10 +7,12 @@ import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithSecurityId;
import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.*; import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.*;
import ru.spcex.clearing.gatewayapi.service.adapter.SecurityRequestAdapter; import ru.spcex.clearing.gatewayapi.service.adapter.SecurityRequestAdapter;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CurrencyPairSecurityGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.EquitySecurityGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.EquitySecurityGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.FixedIncomeGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.FixedIncomeGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.SecurityFondGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.SecurityFondGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.InstrumentType; import ru.spcex.platform.enumeration.InstrumentType;
import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.log.ExceptionUtils;
@ -68,13 +70,22 @@ public class SecurityService {
fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests); fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests);
log.debug("Send request to DESTINATION_SECURITY_BOND_GATEWAY"); log.debug("Send request to DESTINATION_SECURITY_BOND_GATEWAY");
kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_BOND_GATEWAY, securityGatewayRequest); kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_BOND_GATEWAY, securityGatewayRequest);
} else { } else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) {
EquitySecurityNewRequest equitySecurityNewRequest = securityRequestAdapter.toEquitySecurityNewRequest(security); EquitySecurityNewRequest equitySecurityNewRequest = securityRequestAdapter.toEquitySecurityNewRequest(security);
securityGatewayRequest = new EquitySecurityGatewayRequest(equitySecurityNewRequest); securityGatewayRequest = new EquitySecurityGatewayRequest(equitySecurityNewRequest);
fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests); fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests);
log.debug("Send request to DESTINATION_SECURITY_BOND_GATEWAY"); log.debug("Send request to DESTINATION_SECURITY_BOND_GATEWAY");
kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_EQTY_GATEWAY, securityGatewayRequest); kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_EQTY_GATEWAY, securityGatewayRequest);
// } else if (InstrumentType.CRNC.equalsByKey(security.getInstrumentType())) { // todo будет отдельная задача
// CurrencyPairSecurityNewRequest currencyPairSecurityNewRequest = securityRequestAdapter.toCurrencyPairSecurityNewRequest(security);
// securityGatewayRequest = new CurrencyPairSecurityGatewayRequest(currencyPairSecurityNewRequest);
// fillRequest(securityGatewayRequest, security, listingRequests, couponPeriodRequests, cashFlowRequests);
// log.debug("Send request to DESTINATION_SECURITY_BOND_GATEWAY");
// kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_CURRENCY_GATEWAY, securityGatewayRequest);
} else {
log.error("Unknown instrumentType={}", security.getInstrumentType());
} }
} catch (Throwable e) { } catch (Throwable e) {
log.error("{}", ExceptionUtils.getStackTrace(e)); log.error("{}", ExceptionUtils.getStackTrace(e));
} }

View file

@ -6,6 +6,7 @@ import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.Fond
import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.IncomeListing; import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.IncomeListing;
import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.Nominal; import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.Nominal;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest;
import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.text.TextUtil;
@Service @Service
@ -46,6 +47,25 @@ public class SecurityRequestAdapter {
return equitySecurityNewRequest; return equitySecurityNewRequest;
} }
public CurrencyPairSecurityNewRequest toCurrencyPairSecurityNewRequest(FondSecurity fondSecurity) {
// CurrencyPairSecurityNewRequest currencyPairSecurityNewRequest = new CurrencyPairSecurityNewRequest();
// currencyPairSecurityNewRequest.setInstrumentType(fondSecurity.getInstrumentType());
// currencyPairSecurityNewRequest.setSecuritySymbol(fondSecurity.getSecuritySymbol());
// currencyPairSecurityNewRequest.setShortName(fondSecurity.getShortName());
// currencyPairSecurityNewRequest.setFullName(fondSecurity.getFullName());
// currencyPairSecurityNewRequest.setMarket(fondSecurity.getMarket());
// currencyPairSecurityNewRequest.setCurrencyPairId(fondSecurity.getCurrencyPairId());
// currencyPairSecurityNewRequest.setLotSize(fondSecurity.getLotSize());
// currencyPairSecurityNewRequest.setMinStep(fondSecurity.getMinStep());
// currencyPairSecurityNewRequest.setBaseUnitSize(fondSecurity.getBaseUnitSize());
// currencyPairSecurityNewRequest.setSettlementType(fondSecurity.getSettlementType());
// currencyPairSecurityNewRequest.setWorkflowStatus(fondSecurity.getWorkflowStatus());
// currencyPairSecurityNewRequest.setSettlementOrganization(fondSecurity.getSettlementOrganization());
// currencyPairSecurityNewRequest.setClearingOrganization(fondSecurity.getClearingOrganization());
// return currencyPairSecurityNewRequest;
throw new IllegalStateException("TODO currency pair");
}
public ListingNewRequest toIncomeListing(IncomeListing incomeListing) { public ListingNewRequest toIncomeListing(IncomeListing incomeListing) {
ListingNewRequest listingNewRequest = new ListingNewRequest(); ListingNewRequest listingNewRequest = new ListingNewRequest();
String code = incomeListing.getCode(); String code = incomeListing.getCode();
@ -56,6 +76,7 @@ public class SecurityRequestAdapter {
listingNewRequest.setSymbolCode(incomeListing.getSymbolCode()); listingNewRequest.setSymbolCode(incomeListing.getSymbolCode());
listingNewRequest.setSymbolName(incomeListing.getSymbolName()); listingNewRequest.setSymbolName(incomeListing.getSymbolName());
listingNewRequest.setLotSize(incomeListing.getLotSize()); listingNewRequest.setLotSize(incomeListing.getLotSize());
// listingNewRequest.setMinStep(incomeListing.getMinStep());
listingNewRequest.setTradingCurrency(incomeListing.getTradingCurrency()); listingNewRequest.setTradingCurrency(incomeListing.getTradingCurrency());
listingNewRequest.setWorkflowStatus(incomeListing.getWorkflowStatus()); listingNewRequest.setWorkflowStatus(incomeListing.getWorkflowStatus());
return listingNewRequest; return listingNewRequest;

View file

@ -0,0 +1,201 @@
package ru.spcex.clearing.securities.service.cud;
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.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
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.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.securities.validation.ValidationProvider;
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.UserRole;
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.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.error.ValidationException;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.Optional;
@Service
public class CurrencyPairSecurityService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
private final ImdgProvider imdgProvider;
private final ImdgId idGenerator;
private final ValidationProvider validation;
private final UserRoleVerification userRoleVerification;
private final ValidationHelper validationHelper;
private final RequestHelper requestHelper;
@Autowired
public CurrencyPairSecurityService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
ValidationProvider validation,
UserRoleVerification userRoleVerification,
ValidationHelper validationHelper,
RequestHelper requestHelper) {
super(kafkaQueue, kafkaProducer);
this.validation = validation;
this.currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class);
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.userRoleVerification = userRoleVerification.setRoleForVerification(UserRole.Admin);
this.validationHelper = validationHelper;
this.requestHelper = requestHelper.setLogger(log);
}
@Override
public void afterPropertiesSet() {
callback(CurrencyPairSecurityNewRequest.class)
.setFunction(this::newCurrencyPairSecurity)
.forDestination(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_NEW, callbacks::put);
callback(CurrencyPairSecurityUpdateRequest.class)
.setFunction(this::updateCurrencyPairSecurity)
.forDestination(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_UPDATE, callbacks::put);
callback(CommonDeleteRequest.class)
.setFunction(this::deleteCurrencyPairSecurity)
.forDestination(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_DELETE, callbacks::put);
imdgProvider.waitAvailable();
init();
}
protected RequestInfoUpdate newCurrencyPairSecurity(BaseRequest<CurrencyPairSecurityNewRequest> userRequest) {
log.debug("CurrencyPairSecurityNewRequest received, id={}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
CurrencyPairSecurity currencyPair = null;
try {
currencyPair = newCurrencyPairSecurity0(userRequest.getRequestPayload());
log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), currencyPair.getId());
return null;
} catch (ValidationException e) {
return requestHelper.makeErrorResponse(userRequest, e.getEnumMsg());
}
}
protected synchronized CurrencyPairSecurity newCurrencyPairSecurity0(CurrencyPairSecurityNewRequest req) throws ValidationException {
IValidator validator = validation.currencyPairSecurityNewValidator().apply(req);
Optional<EnumMessage> validationError = validator.tillFirstError();
if (validationError.isPresent()) {
throw new ValidationException(validationError.get());
}
CurrencyPairSecurity currencyPairSecurity = new CurrencyPairSecurity();
currencyPairSecurity.setId(idGenerator.nextId());
currencyPairSecurity.setInstrumentType(req.getInstrumentType());
currencyPairSecurity.setSecuritySymbol(StringUtils.hasText(req.getSecuritySymbol()) ? req.getSecuritySymbol().trim() : null);
currencyPairSecurity.setBaseUnitSize(req.getBaseUnitSize());
currencyPairSecurity.setCurrencyPairId(req.getCurrencyPairId());
//todo currencyPairSecurity.setCode(req.getCode());
currencyPairSecurity.setSettlementType(req.getSettlementType());
currencyPairSecurity.setClearingOrganization(req.getClearingOrganization());
currencyPairSecurity.setSettlementOrganization(req.getSettlementOrganization());
currencyPairSecurity.setSecurityId(currencyPairSecurity.getId());
currencyPairSecurity.setSecuritySymbol(req.getSecuritySymbol());
currencyPairSecurity.setShortName(req.getShortName());
currencyPairSecurity.setFullName(req.getFullName());
// currencyPairSecurity.setShortNameEng(req.getShortNameEng());
// currencyPairSecurity.setFullNameEng(req.getFullNameEng());
if (req.getWorkflowStatus() == null) {
currencyPairSecurity.setWorkflowStatus(WorkflowStatus.Active.getKey());
} else {
currencyPairSecurity.setWorkflowStatus(req.getWorkflowStatus());
}
currencyPairSecurity.setCreated(Instant.now());
currencyPairSecurity.setUpdated(currencyPairSecurity.getCreated());
currencyPairSecurityImdg.insert(currencyPairSecurity);
//todo listing update: listing (добавлены поля minStep и precision) см. ListingBuilder
return currencyPairSecurity;
}
protected RequestInfoUpdate updateCurrencyPairSecurity(BaseRequest<CurrencyPairSecurityUpdateRequest> userRequest) {
log.debug("CurrencyPairSecurityUpdateRequest received id = {} (update object id={})", userRequest.getId(), userRequest.getRequestPayload() == null ? null : userRequest.getRequestPayload().getId());
try {
userRoleVerification.validateRoleAndThrow(userRequest);
CurrencyPairSecurity currencyPairSecurity = updateCurrencyPairSecurity0(userRequest.getRequestPayload());
log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), currencyPairSecurity.getId());
return null;
} catch (ValidationException e) {
return requestHelper.makeErrorResponse(userRequest, e.getEnumMsg());
}
}
protected synchronized CurrencyPairSecurity updateCurrencyPairSecurity0(CurrencyPairSecurityUpdateRequest req) throws ValidationException {
validationHelper.validateTillFirstErrorAndThrow(req, validation.currencyPairSecurityUpdateValidator());
CurrencyPairSecurity currencyPairSecurity = currencyPairSecurityImdg.getSingleObjectByID(req.getId());
Instant updateTime = Instant.now();
currencyPairSecurity.setUpdated(updateTime);
// currencyPairSecurity.setInstrumentType(req.getInstrumentType());
currencyPairSecurity.setSecuritySymbol(StringUtils.hasText(req.getSecuritySymbol()) ? req.getSecuritySymbol().trim() : null);
currencyPairSecurity.setBaseUnitSize(req.getBaseUnitSize());
currencyPairSecurity.setCurrencyPairId(req.getCurrencyPairId());
//todo currencyPairSecurity.setCode(req.getCode());
currencyPairSecurity.setSettlementType(req.getSettlementType());
currencyPairSecurity.setClearingOrganization(req.getClearingOrganization());
currencyPairSecurity.setSettlementOrganization(req.getSettlementOrganization());
currencyPairSecurity.setSecurityId(currencyPairSecurity.getId());
currencyPairSecurity.setSecuritySymbol(req.getSecuritySymbol());
currencyPairSecurity.setShortName(req.getShortName());
currencyPairSecurity.setFullName(req.getFullName());
// currencyPairSecurity.setShortNameEng(req.getShortNameEng());
// currencyPairSecurity.setFullNameEng(req.getFullNameEng());
if (req.getWorkflowStatus() == null) {
currencyPairSecurity.setWorkflowStatus(req.getWorkflowStatus());
}
currencyPairSecurityImdg.update(currencyPairSecurity);
return currencyPairSecurity;
}
protected RequestInfoUpdate deleteCurrencyPairSecurity(BaseRequest<CommonDeleteRequest> userRequest) {
log.debug("CommonDeleteRequest received id = {} (object id={})", userRequest.getId(), userRequest.getRequestPayload() == null ? null : userRequest.getRequestPayload().getId());
try {
userRoleVerification.validateRoleAndThrow(userRequest);
Long id = deleteCurrencyPairSecurity0(userRequest.getRequestPayload());
log.debug("successfully processed, request id {}, delete object id {}", userRequest.getId(), id);
return null;
} catch (ValidationException e) {
return requestHelper.makeErrorResponse(userRequest, e.getEnumMsg());
}
}
protected synchronized Long deleteCurrencyPairSecurity0(CommonDeleteRequest req) throws ValidationException {
validationHelper.validateTillFirstErrorAndThrow(req, validation.currencyPairSecurityDeleteValidator());
Instant updateTime = Instant.now();
CurrencyPairSecurity equity = currencyPairSecurityImdg.getSingleObjectByID(req.getId());
equity.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
equity.setUpdated(updateTime);
currencyPairSecurityImdg.update(equity);
return null;
}
}

View file

@ -1,6 +1,7 @@
package ru.spcex.clearing.securities.service.cud; package ru.spcex.clearing.securities.service.cud;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -20,10 +21,12 @@ import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CurrencyPairSecurityGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.EquitySecurityGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.EquitySecurityGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.FixedIncomeGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.FixedIncomeGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.SecurityFondGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.SecurityFondGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.securities.validation.ValidationProvider; import ru.spcex.clearing.securities.validation.ValidationProvider;
@ -61,6 +64,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
private final FixedIncomeSecurityService fixedIncomeSecurityService; private final FixedIncomeSecurityService fixedIncomeSecurityService;
private final EquitySecurityService equitySecurityService; private final EquitySecurityService equitySecurityService;
private final MoneyMarketSecurityService moneyMarketSecurityService; private final MoneyMarketSecurityService moneyMarketSecurityService;
private final CurrencyPairSecurityService currencyPairSecurityService;
private final ListingService listingService; private final ListingService listingService;
private final CouponPeriodService couponPeriodService; private final CouponPeriodService couponPeriodService;
private final FixedIncomeCashFlowService fixedIncomeCashFlowService; private final FixedIncomeCashFlowService fixedIncomeCashFlowService;
@ -84,6 +88,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
FixedIncomeSecurityService fixedIncomeSecurityService, FixedIncomeSecurityService fixedIncomeSecurityService,
EquitySecurityService equitySecurityService, EquitySecurityService equitySecurityService,
MoneyMarketSecurityService moneyMarketSecurityService, MoneyMarketSecurityService moneyMarketSecurityService,
CurrencyPairSecurityService currencyPairSecurityService,
ListingService listingService, ListingService listingService,
CouponPeriodService couponPeriodService, CouponPeriodService couponPeriodService,
FixedIncomeCashFlowService fixedIncomeCashFlowService) { FixedIncomeCashFlowService fixedIncomeCashFlowService) {
@ -92,6 +97,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
this.currencyPairSecurityService = currencyPairSecurityService;
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
this.couponPeriodImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CouponPeriod, CouponPeriod.class); this.couponPeriodImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CouponPeriod, CouponPeriod.class);
this.fixedIncomeCashFlowImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class); this.fixedIncomeCashFlowImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class);
@ -123,6 +129,10 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
callback(MoneyMarketSecurityNewGatewayRequest.class) callback(MoneyMarketSecurityNewGatewayRequest.class)
.setFunction(this::newMoneyMarketSecurity) .setFunction(this::newMoneyMarketSecurity)
.forDestination(Consts.DESTINATION_GATEWAY_MONEY_MARKET_SECURITY, callbacks::put); .forDestination(Consts.DESTINATION_GATEWAY_MONEY_MARKET_SECURITY, callbacks::put);
callback(CurrencyPairSecurityGatewayRequest.class)
.setFunction(this::newSecurities)
.forDestination(Consts.DESTINATION_SECURITY_CURRENCY_GATEWAY, callbacks::put);
imdgProvider.waitAvailable(); imdgProvider.waitAvailable();
init(); init();
} }
@ -226,6 +236,28 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
security = equitySecurityService.updateEquity0(updateRequest); security = equitySecurityService.updateEquity0(updateRequest);
} }
} }
if (InstrumentType.CRNC.equalsByKey(req.getSecurityType())) {
// CurrencyPairSecurityGatewayRequest currencyPairSecurityGatewayRequest = (CurrencyPairSecurityGatewayRequest) req;
// CurrencyPairSecurityNewRequest currencyPairRequest = currencyPairSecurityGatewayRequest.getSecurity();
// if (StringUtils.isEmpty(currencyPairRequest.getSecuritySymbol())) {
// log.warn("Skip creating CurrencyPairSecurity without securityId: uuid: {}", req.getUuid());
// return null;
// }
// log.debug("Processed request with securitySymbol: {}", currencyPairRequest.getSecuritySymbol());
// currencyPairRequest.setIssuerId(companyId);
// log.trace("EquitySecurityNewRequest - FOND");
// String securitySymbol = currencyPairRequest.getSecuritySymbol();
// security = findSecurityBySecuritySymbol(currencyPairSecurityImdg, securitySymbol);
//
// if (security == null) {
// security = currencyPairSecurityService.newEquity0(currencyPairRequest);
// } else {
// EquitySecurityUpdateRequest updateRequest = toUpdateRequest(security, currencyPairRequest);
// security = currencyPairSecurityService.updateEquity0(updateRequest);
// }
// //fixme currencypair будет отдельная задача
throw new IllegalStateException("todo CRNC");
}
} catch (ValidationException expected) { } catch (ValidationException expected) {
if (security == null) { if (security == null) {
log.error("Error create or update issue: {}", messageResolver.resolve(expected.getEnumMsg())); log.error("Error create or update issue: {}", messageResolver.resolve(expected.getEnumMsg()));

View file

@ -1,17 +1,26 @@
package ru.spcex.clearing.securities.validation; package ru.spcex.clearing.securities.validation;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Market;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.platform.dictionary.InstrumentTypeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountSymbolsNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityUpdateRequest;
import ru.spcex.clearing.securities.errors.SecuritiesError; import ru.spcex.clearing.securities.errors.SecuritiesError;
import ru.spcex.clearing.securities.validation.rule.*; import ru.spcex.clearing.securities.validation.rule.*;
import ru.spcex.clearing.validation.common.rules.EndDtAfterStartDtRule; import ru.spcex.clearing.validation.common.rules.*;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithInstrumentType;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.InstrumentType; import ru.spcex.platform.enumeration.InstrumentType;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
@ -20,6 +29,8 @@ import ru.spcex.platform.imdg.validation.rule.PresentById;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl; import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.HashMap;
import java.util.function.Function; import java.util.function.Function;
@Component @Component
@ -36,6 +47,7 @@ public class ValidationProvider {
private final Imdg<SpcexObjectBase> companyImdg; private final Imdg<SpcexObjectBase> companyImdg;
private final Imdg<SpcexObjectBase> currencyImdg; private final Imdg<SpcexObjectBase> currencyImdg;
private final Imdg<SpcexObjectBase> couponPeriodImdg; private final Imdg<SpcexObjectBase> couponPeriodImdg;
private final Imdg<CurrencyPairSecurity> currencyPairSecurityMap;
public ValidationProvider(ImdgProvider imdgProvider) { public ValidationProvider(ImdgProvider imdgProvider) {
@ -51,6 +63,7 @@ public class ValidationProvider {
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, SpcexObjectBase.class); this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, SpcexObjectBase.class);
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, SpcexObjectBase.class); this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, SpcexObjectBase.class);
this.couponPeriodImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CouponPeriod, SpcexObjectBase.class); this.couponPeriodImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CouponPeriod, SpcexObjectBase.class);
this.currencyPairSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class);
} }
public Function<MoneyMarketSecurityNewRequest, IValidator> mmsNewValidator() { public Function<MoneyMarketSecurityNewRequest, IValidator> mmsNewValidator() {
@ -204,7 +217,6 @@ public class ValidationProvider {
context.setValidatedObject(equityRequest); context.setValidatedObject(equityRequest);
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeMap); context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeMap);
context.addImdg(IMDGDistributedNames.Map_Company, companyImdg); context.addImdg(IMDGDistributedNames.Map_Company, companyImdg);
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeMap);
context.addImdg(IMDGDistributedNames.Map_InstrumentTypeDictionary, instrumentTypeDictionaryImdg); context.addImdg(IMDGDistributedNames.Map_InstrumentTypeDictionary, instrumentTypeDictionaryImdg);
context.addImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, workflowStatusDictionaryImdg); context.addImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, workflowStatusDictionaryImdg);
context.addImdg(IMDGDistributedNames.Map_BondTypeDictionary, bondTypeDictionaryImdg); context.addImdg(IMDGDistributedNames.Map_BondTypeDictionary, bondTypeDictionaryImdg);
@ -226,7 +238,6 @@ public class ValidationProvider {
ImdgValidationContext<CommonDeleteRequest> context = new ImdgValidationContext<>(); ImdgValidationContext<CommonDeleteRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(equityRequest); context.setValidatedObject(equityRequest);
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeMap); context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeMap);
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeMap);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
new PresentById(IMDGDistributedNames.Map_FixedIncomeSecurity, SecuritiesError.InstrumentNotFound, true), new PresentById(IMDGDistributedNames.Map_FixedIncomeSecurity, SecuritiesError.InstrumentNotFound, true),
new IsValidInstrumentTypeById(SecuritiesError.InstrumentNotFound, "BOND"), new IsValidInstrumentTypeById(SecuritiesError.InstrumentNotFound, "BOND"),
@ -294,4 +305,166 @@ public class ValidationProvider {
); );
}; };
} }
public Function<CurrencyPairSecurityNewRequest, IValidator> currencyPairSecurityNewValidator() {
return equityRequest -> {
ImdgValidationContext<CurrencyPairSecurityNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(equityRequest);
context.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityMap);
context.addImdg(IMDGDistributedNames.Map_Company, companyImdg);
context.addImdg(IMDGDistributedNames.Map_InstrumentTypeDictionary, instrumentTypeDictionaryImdg);
context.addImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, workflowStatusDictionaryImdg);
context.addImdg(IMDGDistributedNames.Map_BondTypeDictionary, bondTypeDictionaryImdg);
context.addImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, currencyCodeDictionaryImdg);
return new ValidatorImpl<>(context,
DictionaryPresentRule.instance("instrumentType",
WithInstrumentType::getInstrumentType, IMDGDistributedNames.Map_InstrumentTypeDictionary,
InstrumentTypeDictionary.class,
SecuritiesError.RequiredFieldIsEmpty, SecuritiesError.DictionaryNotFound,
true),
new IsValidInstrumentTypeFromRequest(SecuritiesError.RequiredFieldIsEmpty, InstrumentType.CRNC.getKey()),
FieldRequiredRule.instance("securitySymbol",
CurrencyPairSecurityNewRequest::getSecuritySymbol,
SecuritiesError.RequiredFieldIsEmpty,
true
// securitySymbol -> {
// Imdg<CurrencyPairSecurity> currencyPairImdg = context.obtainMap(
// IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class
// );
// Long securityId = Long.valueOf(securitySymbol);
// Collection<CurrencyPairSecurity> currencyPairs = currencyPairImdg.getCollectionObjectsByFieldValues(query);
// if (!currencyPairs.isEmpty()) return SecuritiesError.CouponPeriodAlreadyExists;
// return null;
// }
),
FieldNotBlankRequiredRule.instance("shortName",
CurrencyPairSecurityNewRequest::getShortName,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldNotBlankRequiredRule.instance("fullName",
CurrencyPairSecurityNewRequest::getFullName,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldRequiredRule.instance("market",
CurrencyPairSecurityNewRequest::getMarket,
SecuritiesError.RequiredFieldIsEmpty, true),// todo verify in MarketMap?
IdPresentRule.instance("currencyPairId",
CurrencyPairSecurityNewRequest::getCurrencyPairId,
IMDGDistributedNames.Map_CurrencyPairDictionary,
Market.class,
SecuritiesError.RequiredFieldIsEmpty,
SecuritiesError.MarketNotFound
),
FieldRequiredRule.instance("lotSize",
CurrencyPairSecurityNewRequest::getLotSize,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldRequiredRule.instance("minStep",
CurrencyPairSecurityNewRequest::getMinStep,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldRequiredRule.instance("baseUnitSize",
CurrencyPairSecurityNewRequest::getBaseUnitSize,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldRequiredRule.instance("settlementType",
CurrencyPairSecurityNewRequest::getSettlementType,
SecuritiesError.RequiredFieldIsEmpty, true),
DictionaryPresentRule.instance("workflowStatus",
CurrencyPairSecurityNewRequest::getWorkflowStatus, IMDGDistributedNames.Map_WorkflowStatusDictionary,
InstrumentTypeDictionary.class,
SecuritiesError.RequiredFieldIsEmpty, SecuritiesError.DictionaryNotFound,
true)
// FieldRequiredRule.instance("settlementOrganization",
// CurrencyPairSecurityNewRequest::getSettlementOrganization,
// SecuritiesError.RequiredFieldIsEmpty, true),
// FieldRequiredRule.instance("clearingOrganization",
// CurrencyPairSecurityNewRequest::getClearingOrganization,
// SecuritiesError.RequiredFieldIsEmpty, true),
);
};
}
public Function<CurrencyPairSecurityUpdateRequest, IValidator> currencyPairSecurityUpdateValidator() {
return equityRequest -> {
ImdgValidationContext<CurrencyPairSecurityUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(equityRequest);
context.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityMap);
context.addImdg(IMDGDistributedNames.Map_Company, companyImdg);
context.addImdg(IMDGDistributedNames.Map_InstrumentTypeDictionary, instrumentTypeDictionaryImdg);
context.addImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, workflowStatusDictionaryImdg);
context.addImdg(IMDGDistributedNames.Map_BondTypeDictionary, bondTypeDictionaryImdg);
context.addImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, currencyCodeDictionaryImdg);
return new ValidatorImpl<>(context,
DictionaryPresentRule.instance("instrumentType",
CurrencyPairSecurityUpdateRequest::getInstrumentType, IMDGDistributedNames.Map_InstrumentTypeDictionary,
InstrumentTypeDictionary.class,
SecuritiesError.RequiredFieldIsEmpty, SecuritiesError.DictionaryNotFound,
true),
FieldRequiredRule.instance("securitySymbol",
CurrencyPairSecurityUpdateRequest::getSecuritySymbol,
SecuritiesError.RequiredFieldIsEmpty,
true
// securitySymbol -> {
// Imdg<CurrencyPairSecurity> currencyPairImdg = context.obtainMap(
// IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class
// );
// Long securityId = Long.valueOf(securitySymbol);
// Collection<CurrencyPairSecurity> currencyPairs = currencyPairImdg.getCollectionObjectsByFieldValues(query);
// if (!currencyPairs.isEmpty()) return SecuritiesError.CouponPeriodAlreadyExists;
// return null;
// }
),
FieldNotBlankRequiredRule.instance("shortName",
CurrencyPairSecurityUpdateRequest::getShortName,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldNotBlankRequiredRule.instance("fullName",
CurrencyPairSecurityUpdateRequest::getFullName,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldRequiredRule.instance("market",
CurrencyPairSecurityUpdateRequest::getMarket,
SecuritiesError.RequiredFieldIsEmpty, true),// todo verify in MarketMap?
IdPresentRule.instance("currencyPairId",
CurrencyPairSecurityUpdateRequest::getCurrencyPairId,
IMDGDistributedNames.Map_CurrencyPairDictionary,
Market.class,
SecuritiesError.RequiredFieldIsEmpty,
SecuritiesError.MarketNotFound
),
FieldRequiredRule.instance("lotSize",
CurrencyPairSecurityUpdateRequest::getLotSize,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldRequiredRule.instance("minStep",
CurrencyPairSecurityUpdateRequest::getMinStep,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldRequiredRule.instance("baseUnitSize",
CurrencyPairSecurityUpdateRequest::getBaseUnitSize,
SecuritiesError.RequiredFieldIsEmpty, true),
FieldRequiredRule.instance("settlementType",
CurrencyPairSecurityUpdateRequest::getSettlementType,
SecuritiesError.RequiredFieldIsEmpty, true),
DictionaryPresentRule.instance("workflowStatus",
CurrencyPairSecurityUpdateRequest::getWorkflowStatus, IMDGDistributedNames.Map_WorkflowStatusDictionary,
InstrumentTypeDictionary.class,
SecuritiesError.RequiredFieldIsEmpty, SecuritiesError.DictionaryNotFound,
true)
// FieldRequiredRule.instance("settlementOrganization",
// CurrencyPairSecurityNewRequest::getSettlementOrganization,
// SecuritiesError.RequiredFieldIsEmpty, true),
// FieldRequiredRule.instance("clearingOrganization",
// CurrencyPairSecurityNewRequest::getClearingOrganization,
// SecuritiesError.RequiredFieldIsEmpty, true),
);
};
}
public Function<CommonDeleteRequest, IValidator> currencyPairSecurityDeleteValidator() {
return equityRequest -> {
ImdgValidationContext<CommonDeleteRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(equityRequest);
context.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityMap);
return new ValidatorImpl<>(context,
new PresentById(IMDGDistributedNames.Map_CurrencyPairSecurity, SecuritiesError.InstrumentNotFound, true),
new IsValidInstrumentTypeById(SecuritiesError.InstrumentNotFound, InstrumentType.CRNC.getKey()),
new WorkflowStatusActv()
);
};
}
} }

View file

@ -13,19 +13,23 @@ public class SecuritySelector<T extends SpcexObjectBase> {
private final Imdg<T> fixedIncomeSecurityImdg; private final Imdg<T> fixedIncomeSecurityImdg;
private final Imdg<T> moneyMarketSecurityImdg; private final Imdg<T> moneyMarketSecurityImdg;
private final Imdg<T> equitySecurity; private final Imdg<T> equitySecurity;
private final Imdg<T> currencyPairSecurity;
public SecuritySelector(ImdgProvider imdgProvider, Class<T> clazz) { public SecuritySelector(ImdgProvider imdgProvider, Class<T> clazz) {
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, clazz); this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, clazz);
this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, clazz); this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, clazz);
this.equitySecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, clazz); this.equitySecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, clazz);
this.currencyPairSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, clazz);
} }
public SecuritySelector(Imdg<T> fixedIncomeSecurityImdg, public SecuritySelector(Imdg<T> fixedIncomeSecurityImdg,
Imdg<T> moneyMarketSecurityImdg, Imdg<T> moneyMarketSecurityImdg,
Imdg<T> equitySecurity) { Imdg<T> equitySecurity,
Imdg<T> currencyPairSecurity) {
this.fixedIncomeSecurityImdg = fixedIncomeSecurityImdg; this.fixedIncomeSecurityImdg = fixedIncomeSecurityImdg;
this.moneyMarketSecurityImdg = moneyMarketSecurityImdg; this.moneyMarketSecurityImdg = moneyMarketSecurityImdg;
this.equitySecurity = equitySecurity; this.equitySecurity = equitySecurity;
this.currencyPairSecurity = currencyPairSecurity;
} }
public T selectSecurityById(Long securityId) { public T selectSecurityById(Long securityId) {
@ -43,6 +47,8 @@ public class SecuritySelector<T extends SpcexObjectBase> {
security = retriever.apply(moneyMarketSecurityImdg); security = retriever.apply(moneyMarketSecurityImdg);
if (security != null) return security; if (security != null) return security;
security = retriever.apply(equitySecurity); security = retriever.apply(equitySecurity);
if (security != null) return security;
security = retriever.apply(currencyPairSecurity);
return security;// null return security;// null
} }
} }

View file

@ -16,6 +16,7 @@ public interface Consts {
String DESTINATION_SECURITY_BOND_GATEWAY = "security-bond-gateway-request-new"; String DESTINATION_SECURITY_BOND_GATEWAY = "security-bond-gateway-request-new";
String DESTINATION_SECURITY_EQTY_GATEWAY = "security-eqty-gateway-request-new"; String DESTINATION_SECURITY_EQTY_GATEWAY = "security-eqty-gateway-request-new";
String DESTINATION_SECURITY_CURRENCY_GATEWAY = "security-currency-pair-gateway-request-new";
String DESTINATION_FIXED_INCOME_CASH_FLOW_NEW = "fixed-income-cash-flow-new"; String DESTINATION_FIXED_INCOME_CASH_FLOW_NEW = "fixed-income-cash-flow-new";
String DESTINATION_FIXED_INCOME_CASH_FLOW_UPDATE = "fixed-income-cash-flow-update"; String DESTINATION_FIXED_INCOME_CASH_FLOW_UPDATE = "fixed-income-cash-flow-update";

View file

@ -0,0 +1,24 @@
package ru.spcex.clearing.platform.messaging.domain.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest;
public class CurrencyPairSecurityGatewayRequest extends SecurityFondGatewayRequest {
@JsonProperty
private CurrencyPairSecurityNewRequest security;
public CurrencyPairSecurityGatewayRequest() {
}
public CurrencyPairSecurityGatewayRequest(CurrencyPairSecurityNewRequest security) {
this.security = security;
}
public CurrencyPairSecurityNewRequest getSecurity() {
return security;
}
public void setSecurity(CurrencyPairSecurityNewRequest security) {
this.security = security;
}
}