From 0b062fc97c791590c7a65b1269d0a761129a98ad Mon Sep 17 00:00:00 2001 From: psemenkov Date: Mon, 3 Apr 2023 13:21:27 +0300 Subject: [PATCH] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-258=20?= =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20MoneyMarketS?= =?UTF-8?q?ecurityService=20=D0=B8=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8E=20=D0=B2=20=D1=81=D0=BE=D0=BE=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B8=20=D1=81=20=D0=A2?= =?UTF-8?q?=D0=97.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20Mo?= =?UTF-8?q?neyMarketSecurityMapStore.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EquitySecurityMapStore.java | 8 +- .../object/MoneyMarketSecurityMapStore.java | 2 +- .../securities/component/ListingBuilder.java | 14 ++ .../securities/errors/SecuritiesError.java | 1 + .../service/cud/EquitySecurityService.java | 131 +++++++++++++++++ .../cud/MoneyMarketSecurityService.java | 20 ++- .../validation/ValidationProvider.java | 58 +++++++- .../validation/rule/EndDtAfterStartDt.java | 7 + .../rule/EquityNewValidationRule.java | 31 ++++ .../rule/IsValidInstrumentType.java | 32 +++++ .../validation/rule/MmsNewValidationRule.java | 31 ++-- .../rule/MmsUpdateValidationRule.java | 2 +- ...BySecuritySymbolAndWorkflowStatusActv.java | 44 ++++++ .../validation/rule/WorkflowStatusActv.java | 27 ++++ .../base/interfaces/WithInstrumentType.java | 5 + .../base/interfaces/WithWorkflowStatus.java | 5 + .../securitites/EquitySecurityNewRequest.java | 120 ++++++++++++++++ .../EquitySecurityUpdateRequest.java | 132 ++++++++++++++++++ .../MoneyMarketSecurityNewRequest.java | 84 ++++++++++- .../MoneyMarketSecurityUpdateRequest.java | 97 ++++++++++++- 20 files changed, 820 insertions(+), 31 deletions(-) create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/EquitySecurityService.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EquityNewValidationRule.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/IsValidInstrumentType.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/NotPresentBySecuritySymbolAndWorkflowStatusActv.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/WorkflowStatusActv.java create mode 100644 platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithInstrumentType.java create mode 100644 platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithWorkflowStatus.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/EquitySecurityNewRequest.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/EquitySecurityUpdateRequest.java diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/EquitySecurityMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/EquitySecurityMapStore.java index 5efde75e6..24cb7ac06 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/EquitySecurityMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/EquitySecurityMapStore.java @@ -7,9 +7,12 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.base.TemplateMapStore; import ru.spcex.platform.utils.time.TimeUtil; +import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; @Component public class EquitySecurityMapStore extends TemplateMapStore { @@ -31,7 +34,7 @@ public class EquitySecurityMapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "ID", "SECURITY_ID", "SHARE_TYPE" + "ID", "SECURITY_ID", "SHARE_TYPE", "LOT_SIZE" }; } @@ -55,6 +58,7 @@ public class EquitySecurityMapStore extends TemplateMapStore { object.setId(resultSet.getObject("ID", Long.class)); object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); object.setShareType(resultSet.getObject("SHARE_TYPE", String.class)); + object.setLotSize(resultSet.getObject("LOT_SIZE", BigDecimal.class)); fillBySecurity(object, object.getSecurityId()); return object; } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/MoneyMarketSecurityMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/MoneyMarketSecurityMapStore.java index 0d4fbadf7..48a96b428 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/MoneyMarketSecurityMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/MoneyMarketSecurityMapStore.java @@ -72,7 +72,7 @@ public class MoneyMarketSecurityMapStore extends TemplateMapStore equitySecurityImdg; + private final Imdg listingImdg; + private final ImdgProvider imdgProvider; + private final ImdgId idGenerator; + private final ValidationProvider validation; + private final IMessageResolver messageResolver; + private final ListingBuilder listingBuilder = new ListingBuilder(); + + @Autowired + public EquitySecurityService(Consumer kafkaQueue, + Producer kafkaProducer, + ImdgProvider imdgProvider, + ValidationProvider validation, + IMessageResolver messageResolver) { + super(kafkaQueue, kafkaProducer); + this.validation = validation; + this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); + this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); + this.imdgProvider = imdgProvider; + this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.messageResolver = messageResolver; + } + + @Override + public void afterPropertiesSet() { + callback(EquitySecurityNewRequest.class) + .setFunction(this::newEquity) + .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_NEW, callbacks::put); + callback(EquitySecurityUpdateRequest.class) + .setFunction(this::updateEquity) + .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, callbacks::put); + callback(CommonDeleteRequest.class) + .setFunction(this::deleteEquity) + .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, callbacks::put); + imdgProvider.waitAvailable(); + init(); + } + + private RequestInfoUpdate newEquity(BaseRequest userRequest){ + ImdgTransaction transaction = imdgProvider.newTransaction(); + EquitySecurityNewRequest req = userRequest.getRequestPayload(); + Optional validationError = validation.equityNewValidator() + .apply(req) + .tillFirstError(); + if (validationError.isPresent()) { + String errorMsg = messageResolver.resolve(validationError.get()); + log.error("cannot process EquitySecurityNewRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } + log.debug("EquitySecurityNewRequest received"); + EquitySecurity equity = new EquitySecurity(); + equity.setId(idGenerator.nextId()); + equity.setSecuritySymbol(req.getSecuritySymbol()); + equity.setShortName(req.getShortName()); + equity.setFullName(req.getFullName()); + equity.setIsin(req.getIsin()); + equity.setShareType(req.getShareType()); + equity.setLotSize(req.getLotSize() != null ? BigDecimal.valueOf(req.getLotSize()) : null); + equity.setIssuerId(req.getIssuerId()); + equity.setFullNameEng(req.getFullNameEng()); + equity.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Active.getKey()); + equity.setInstrumentType(req.getInstrumentType()); + equity.setSecurityId(equity.getId()); + equity.setCreated(Instant.now()); + try { + transaction.beginTransaction(); + Imdg equityImdg = transaction.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); + Imdg listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); + //одним скопом выполняем реквест + equityImdg.insert(equity); + Listing listing = listingBuilder.byNewEquity(equity, req); + listingMap.insert(listing); + //и сохраняем обновленный +// reqInfoMap.insert(reqInfo); + transaction.commitTransaction(); + } catch (Throwable e) { + transaction.rollbackTransaction(); +// RequestInfo.update(reqInfo, Status.Error, ExceptionUtils.getStackTrace(e)); +// requestInfoImdg.insert(reqInfo); + } + log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), equity.getId()); + return null; // default success + } + + private RequestInfoUpdate updateEquity(BaseRequest userRequest){ + return null; + } + + private RequestInfoUpdate deleteEquity(BaseRequest userRequest) { + return null; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java index ccf129c68..51190d495 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java @@ -111,11 +111,18 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial mms.setStartDate(req.getStartDate()); mms.setEndDate(req.getEndDate()); mms.setNominalValue(req.getNominalValue() != null ? BigDecimal.valueOf(req.getNominalValue()) : null); + mms.setLotSize(req.getLotSize() != null ? BigDecimal.valueOf(req.getLotSize()) : null); mms.setNominalCurrency(req.getNominalCurrency()); mms.setInstrumentType(req.getInstrumentType()); mms.setFullName(req.getFullName()); + mms.setShortName(req.getShortName()); + mms.setFullNameEng(req.getFullNameEng()); + mms.setShortNameEng(req.getShortNameEng()); mms.setSecuritySymbol(req.getSecuritySymbol()); + mms.setTermType(req.getTermType()); + mms.setIsin(req.getIsin()); mms.setSecurityId(mms.getId()); + mms.setDescription(mms.getDescription()); mms.setCreated(Instant.now()); mms.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Active.getKey()); try { @@ -157,16 +164,27 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial mms.setStartDate(req.getStartDate()); mms.setEndDate(req.getEndDate()); mms.setNominalValue(req.getNominalValue() != null ? BigDecimal.valueOf(req.getNominalValue()) : null); + mms.setLotSize(req.getLotSize() != null ? BigDecimal.valueOf(req.getLotSize()) : null); mms.setNominalCurrency(req.getNominalCurrency()); mms.setInstrumentType(req.getInstrumentType()); mms.setFullName(req.getFullName()); + mms.setShortName(req.getShortName()); + mms.setFullNameEng(req.getFullNameEng()); + mms.setShortNameEng(req.getShortNameEng()); + mms.setSecuritySymbol(req.getSecuritySymbol()); + mms.setTermType(req.getTermType()); + mms.setIsin(req.getIsin()); + mms.setSecurityId(mms.getId()); + mms.setDescription(mms.getDescription()); + mms.setCreated(Instant.now()); + moneyMarketSecurityMap.update(mms); Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); if (listing == null) { log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); return null; } - listing.setLotSize(BigDecimal.valueOf(req.getLotSize())); + listing.setLotSize(mms.getLotSize()); listing.setUpdated(updateTime); listingImdg.update(listing); return null; diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java index 481aec643..8f09e27c5 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java @@ -3,13 +3,12 @@ package ru.spcex.clearing.securities.validation; import org.springframework.stereotype.Component; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.EquitySecurityNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.EquitySecurityUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; import ru.spcex.clearing.securities.errors.SecuritiesError; -import ru.spcex.clearing.securities.validation.rule.EndDtAfterStartDt; -import ru.spcex.clearing.securities.validation.rule.MmsDeleteValidationRule; -import ru.spcex.clearing.securities.validation.rule.MmsNewValidationRule; -import ru.spcex.clearing.securities.validation.rule.MmsUpdateValidationRule; +import ru.spcex.clearing.securities.validation.rule.*; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -23,10 +22,12 @@ import java.util.function.Function; @Component public class ValidationProvider { private final Imdg mmsMap; + private final Imdg equityMap; public ValidationProvider(ImdgProvider imdgProvider) { this.mmsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class); + this.equityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, SpcexObjectBase.class); } public Function mmsNewValidator() { @@ -36,7 +37,9 @@ public class ValidationProvider { context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); return new ValidatorImpl<>(context, EndDtAfterStartDt.instance(MoneyMarketSecurityNewRequest.class), - MmsNewValidationRule.SecuritySymbolUniq + new NotPresentBySecuritySymbolAndWorkflowStatusActv(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentAlreadyExists, MoneyMarketSecurityNewRequest.class), + new IsValidInstrumentType(SecuritiesError.RequiredFieldIsEmpty, "RATE"), + MmsNewValidationRule.RequiredFieldIsNotEmpty ); }; } @@ -48,8 +51,9 @@ public class ValidationProvider { context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); return new ValidatorImpl<>(context, EndDtAfterStartDt.instance(MoneyMarketSecurityUpdateRequest.class), + new IsValidInstrumentType(SecuritiesError.InstrumentNotFound, "RATE"), new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true), - MmsUpdateValidationRule.StatusIsActive + new WorkflowStatusActv() ); }; } @@ -60,8 +64,48 @@ public class ValidationProvider { context.setValidatedObject(mmsRequest); context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); return new ValidatorImpl<>(context, + new IsValidInstrumentType(SecuritiesError.InstrumentNotFound, "RATE"), new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true), - MmsDeleteValidationRule.StatusIsActive + new WorkflowStatusActv() + ); + }; + } + + public Function equityNewValidator() { + return equityRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(equityRequest); + context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equityMap); + return new ValidatorImpl<>(context, + new NotPresentBySecuritySymbolAndWorkflowStatusActv(IMDGDistributedNames.Map_EquitySecurity, SecuritiesError.InstrumentAlreadyExists, EquitySecurityNewRequest.class), + new IsValidInstrumentType(SecuritiesError.RequiredFieldIsEmpty, "EQTY"), + EquityNewValidationRule.RequiredFieldIsNotEmpty + ); + }; + } + + public Function equityUpdateValidator() { + return equityRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(equityRequest); + context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equityMap); + return new ValidatorImpl<>(context, + new IsValidInstrumentType(SecuritiesError.InstrumentNotFound, "EQTY"), + new PresentById(IMDGDistributedNames.Map_EquitySecurity, SecuritiesError.InstrumentNotFound, true), + new WorkflowStatusActv() + ); + }; + } + + public Function equityDeleteValidator() { + return equityRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(equityRequest); + context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equityMap); + return new ValidatorImpl<>(context, + new IsValidInstrumentType(SecuritiesError.InstrumentNotFound, "EQTY"), + new PresentById(IMDGDistributedNames.Map_EquitySecurity, SecuritiesError.InstrumentNotFound, true), + new WorkflowStatusActv() ); }; } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java index c565f5f83..7bb343892 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java @@ -20,6 +20,13 @@ public class EndDtAfterStartDt implements IVa @Override public Optional validate(ImdgValidationContext context) { T validatedObject = context.getValidatedObject(); + if(validatedObject.getEndDate() == null && validatedObject.getStartDate() == null) { + return of(SecuritiesError.RequiredFieldIsEmpty, "endDate", "startDate"); + } + if(validatedObject.getEndDate() == null || validatedObject.getStartDate() == null){ + if(validatedObject.getStartDate() == null) return of(SecuritiesError.RequiredFieldIsEmpty, "startDate"); + return of(SecuritiesError.RequiredFieldIsEmpty, "endDate"); + } if (validatedObject.getEndDate().isBefore(validatedObject.getStartDate())) { return of(SecuritiesError.WrongFieldValue, "endDate"); } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EquityNewValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EquityNewValidationRule.java new file mode 100644 index 000000000..31d2cb36a --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EquityNewValidationRule.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.securities.validation.rule; + +import org.springframework.util.StringUtils; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.EquitySecurityNewRequest; +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public enum EquityNewValidationRule implements IValidationRule> { + RequiredFieldIsNotEmpty() { + @Override + public Optional validate(ImdgValidationContext context) { + EquitySecurityNewRequest action = context.getValidatedObject(); + if (StringUtils.hasText(action.getShortName())){ + return of(SecuritiesError.RequiredFieldIsEmpty, "shortName"); + } + if (action.getLotSize() == null) { + return of(SecuritiesError.RequiredFieldIsEmpty, "lotSize"); + } + return empty(); + } + }; + + @Override + public String ruleName() { + return "MmsNewValidationRule." + name(); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/IsValidInstrumentType.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/IsValidInstrumentType.java new file mode 100644 index 000000000..04c8878d7 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/IsValidInstrumentType.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.classes.base.interfaces.WithInstrumentType; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumId; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public class IsValidInstrumentType implements IValidationRule> { + private final IEnumId errorEnum; + private final String predictableInstrumentType; + + public IsValidInstrumentType(IEnumId errorEnum, String predictableInstrumentType) { + this.errorEnum = errorEnum; + this.predictableInstrumentType = predictableInstrumentType; + } + + @Override + public Optional validate(ImdgValidationContext context) { + WithInstrumentType action = context.getValidatedObject(); + if (action.getInstrumentType() == null) { + return of(SecuritiesError.RequiredFieldIsEmpty); + } else if (!predictableInstrumentType.equalsIgnoreCase(action.getInstrumentType())){ + return of(errorEnum); + }else { + return empty(); + } + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java index 550491385..de4eaff95 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java @@ -1,32 +1,35 @@ package ru.spcex.clearing.securities.validation.rule; -import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; -import ru.spcex.clearing.imdg.IMDGDistributedNames; +import org.springframework.util.StringUtils; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; import ru.spcex.clearing.securities.errors.SecuritiesError; -import ru.spcex.platform.enumeration.Status; -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; -import java.util.Map; import java.util.Optional; public enum MmsNewValidationRule implements IValidationRule> { - SecuritySymbolUniq() { + RequiredFieldIsNotEmpty() { @Override public Optional validate(ImdgValidationContext context) { MoneyMarketSecurityNewRequest action = context.getValidatedObject(); - Imdg mmsImdg = context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); - MoneyMarketSecurity mms = mmsImdg.getSingleObjectByFieldValues(Map.of( - "securitySymbol", action.getSecuritySymbol(), - "workflowStatus", Status.Active.getKey())); - if (mms != null) { - return of(SecuritiesError.InstrumentAlreadyExists); - } else { - return empty(); + if (StringUtils.hasText(action.getShortName())){ + return of(SecuritiesError.RequiredFieldIsEmpty, "shortName"); } + if (action.getLotSize() == null) { + return of(SecuritiesError.RequiredFieldIsEmpty, "lotSize"); + } + if (action.getNominalValue() == null) { + return of(SecuritiesError.RequiredFieldIsEmpty, "nominalValue"); + } + if (StringUtils.hasText(action.getNominalCurrency())) { + return of(SecuritiesError.RequiredFieldIsEmpty, "nominalCurrency"); + } + if (StringUtils.hasText(action.getTermType())) { + return of(SecuritiesError.RequiredFieldIsEmpty, "termType"); + } + return empty(); } }; diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java index 1d88b45bb..c2b681924 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java @@ -18,7 +18,7 @@ public enum MmsUpdateValidationRule implements IValidationRule implements IValidationRule> { + private final String mapName; + private final IEnumId errorEnum; + private final Class clazz; + + public NotPresentBySecuritySymbolAndWorkflowStatusActv(String mapName, IEnumId errorEnum, Class clazz) { + this.mapName = mapName; + this.errorEnum = errorEnum; + this.clazz = clazz; + } + + @Override + public Optional validate(ImdgValidationContext context) { + WithSecuritySymbol action = context.getValidatedObject(); + Imdg imdg = context.obtainMap(mapName, clazz); + if(StringUtils.hasText(action.getSecuritySymbol())) { + return of(SecuritiesError.RequiredFieldIsEmpty, "securitySymbole"); + } + T object = imdg.getSingleObjectByFieldValues(Map.of( + "securitySymbol", action.getSecuritySymbol(), + "workflowStatus", Status.Active.getKey())); + if (object != null) { + return of(errorEnum); + } else { + return empty(); + } + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/WorkflowStatusActv.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/WorkflowStatusActv.java new file mode 100644 index 000000000..e374c914d --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/WorkflowStatusActv.java @@ -0,0 +1,27 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.classes.base.interfaces.WithWorkflowStatus; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public class WorkflowStatusActv implements IValidationRule> { + + @Override + public Optional validate(ImdgValidationContext context) { + WithWorkflowStatus object = context.getStoredObject(Stored.PresentById); + //проверка только если PresentById найдет объект и сохранит его + if (object != null && object.getWorkflowStatus() == null) { + return of(SecuritiesError.RequiredFieldIsEmpty, "workflowStatus"); + }else if (object != null && !Status.Active.getKey().equals(object.getWorkflowStatus())) { + return of(SecuritiesError.InstrumentNotActive, object.getClass().getSimpleName()); + } else { + return empty(); + } + } +} diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithInstrumentType.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithInstrumentType.java new file mode 100644 index 000000000..20a18740b --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithInstrumentType.java @@ -0,0 +1,5 @@ +package ru.spcex.platform.classes.base.interfaces; + +public interface WithInstrumentType { + String getInstrumentType(); +} diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithWorkflowStatus.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithWorkflowStatus.java new file mode 100644 index 000000000..35de84fc8 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithWorkflowStatus.java @@ -0,0 +1,5 @@ +package ru.spcex.platform.classes.base.interfaces; + +public interface WithWorkflowStatus { + String getWorkflowStatus(); +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/EquitySecurityNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/EquitySecurityNewRequest.java new file mode 100644 index 000000000..909618598 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/EquitySecurityNewRequest.java @@ -0,0 +1,120 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.securitites; + +import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.platform.classes.base.interfaces.WithInstrumentType; +import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol; + +public class EquitySecurityNewRequest implements WithSecuritySymbol, WithInstrumentType { + @JsonProperty + public String securitySymbol; + @JsonProperty + public String shortName; + @JsonProperty + public String fullName; + @JsonProperty + public String isin; + @JsonProperty + public String shareType; + @JsonProperty + public Double lotSize; + @JsonProperty + public Long issuerId; + @JsonProperty + public String shortNameEng; + @JsonProperty + public String fullNameEng; + @JsonProperty + public String workflowStatus; + @JsonProperty + public String instrumentType; + + @Override + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String securitySymbol) { + this.securitySymbol = securitySymbol; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getIsin() { + return isin; + } + + public void setIsin(String isin) { + this.isin = isin; + } + + public String getShareType() { + return shareType; + } + + public void setShareType(String shareType) { + this.shareType = shareType; + } + + public Double getLotSize() { + return lotSize; + } + + public void setLotSize(Double lotSize) { + this.lotSize = lotSize; + } + + public Long getIssuerId() { + return issuerId; + } + + public void setIssuerId(Long issuerId) { + this.issuerId = issuerId; + } + + public String getShortNameEng() { + return shortNameEng; + } + + public void setShortNameEng(String shortNameEng) { + this.shortNameEng = shortNameEng; + } + + public String getFullNameEng() { + return fullNameEng; + } + + public void setFullNameEng(String fullNameEng) { + this.fullNameEng = fullNameEng; + } + + public String getWorkflowStatus() { + return workflowStatus; + } + + public void setWorkflowStatus(String workflowStatus) { + this.workflowStatus = workflowStatus; + } + + @Override + public String getInstrumentType() { + return instrumentType; + } + + public void setInstrumentType(String instrumentType) { + this.instrumentType = instrumentType; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/EquitySecurityUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/EquitySecurityUpdateRequest.java new file mode 100644 index 000000000..fb4806e79 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/EquitySecurityUpdateRequest.java @@ -0,0 +1,132 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.securitites; + +import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.platform.classes.base.interfaces.WithId; +import ru.spcex.platform.classes.base.interfaces.WithInstrumentType; +import ru.spcex.platform.classes.base.interfaces.WithWorkflowStatus; + +public class EquitySecurityUpdateRequest implements WithId, WithInstrumentType, WithWorkflowStatus { + @JsonProperty + public Long id; + @JsonProperty + public String securitySymbol; + @JsonProperty + public String shortName; + @JsonProperty + public String fullName; + @JsonProperty + public String isin; + @JsonProperty + public String shareType; + @JsonProperty + public Double lotSize; + @JsonProperty + public Long issuerId; + @JsonProperty + public String shortNameEng; + @JsonProperty + public String fullNameEng; + @JsonProperty + public String workflowStatus; + @JsonProperty + public String instrumentType; + + @Override + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String securitySymbol) { + this.securitySymbol = securitySymbol; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getIsin() { + return isin; + } + + public void setIsin(String isin) { + this.isin = isin; + } + + public String getShareType() { + return shareType; + } + + public void setShareType(String shareType) { + this.shareType = shareType; + } + + public Double getLotSize() { + return lotSize; + } + + public void setLotSize(Double lotSize) { + this.lotSize = lotSize; + } + + public Long getIssuerId() { + return issuerId; + } + + public void setIssuerId(Long issuerId) { + this.issuerId = issuerId; + } + + public String getShortNameEng() { + return shortNameEng; + } + + public void setShortNameEng(String shortNameEng) { + this.shortNameEng = shortNameEng; + } + + public String getFullNameEng() { + return fullNameEng; + } + + public void setFullNameEng(String fullNameEng) { + this.fullNameEng = fullNameEng; + } + + @Override + public String getWorkflowStatus() { + return workflowStatus; + } + + public void setWorkflowStatus(String workflowStatus) { + this.workflowStatus = workflowStatus; + } + + @Override + public String getInstrumentType() { + return instrumentType; + } + + public void setInstrumentType(String instrumentType) { + this.instrumentType = instrumentType; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java index 0527de865..44466ac0f 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java @@ -6,11 +6,13 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; import ru.spcex.platform.classes.base.interfaces.WithEndDt; +import ru.spcex.platform.classes.base.interfaces.WithInstrumentType; +import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol; import ru.spcex.platform.classes.base.interfaces.WithStartDt; import java.time.LocalDate; -public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt { +public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt, WithSecuritySymbol, WithInstrumentType { @JsonProperty @JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class) @@ -26,11 +28,27 @@ public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt { @JsonProperty public String instrumentType; @JsonProperty + public String shortName; + @JsonProperty public String fullName; @JsonProperty + public String shortNameEng; + @JsonProperty + public String fullNameEng; + @JsonProperty public String securitySymbol; @JsonProperty public Double lotSize; + @JsonProperty + public String termType; + @JsonProperty + public String description; + @JsonProperty + public Long issuerId; + @JsonProperty + public String isin; + @JsonProperty + public String workflowStatus; public LocalDate getStartDate() { return startDate; @@ -80,6 +98,14 @@ public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt { this.fullName = fullName; } + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + public String getSecuritySymbol() { return securitySymbol; } @@ -95,4 +121,60 @@ public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt { public void setLotSize(Double lotSize) { this.lotSize = lotSize; } + + public String getTermType() { + return termType; + } + + public void setTermType(String termType) { + this.termType = termType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Long getIssuerId() { + return issuerId; + } + + public void setIssuerId(Long issuerId) { + this.issuerId = issuerId; + } + + public String getShortNameEng() { + return shortNameEng; + } + + public void setShortNameEng(String shortNameEng) { + this.shortNameEng = shortNameEng; + } + + public String getFullNameEng() { + return fullNameEng; + } + + public void setFullNameEng(String fullNameEng) { + this.fullNameEng = fullNameEng; + } + + public String getIsin() { + return isin; + } + + public void setIsin(String isin) { + this.isin = isin; + } + + public String getWorkflowStatus() { + return workflowStatus; + } + + public void setWorkflowStatus(String workflowStatus) { + this.workflowStatus = workflowStatus; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java index 15b584b24..9778597b7 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java @@ -6,13 +6,11 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; -import ru.spcex.platform.classes.base.interfaces.WithEndDt; -import ru.spcex.platform.classes.base.interfaces.WithId; -import ru.spcex.platform.classes.base.interfaces.WithStartDt; +import ru.spcex.platform.classes.base.interfaces.*; import java.time.LocalDate; -public class MoneyMarketSecurityUpdateRequest implements WithId, WithStartDt, WithEndDt { +public class MoneyMarketSecurityUpdateRequest implements WithId, WithStartDt, WithEndDt, WithInstrumentType, WithWorkflowStatus { @JsonProperty public Long id; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow") @@ -32,9 +30,27 @@ public class MoneyMarketSecurityUpdateRequest implements WithId, WithStartDt, Wi @JsonProperty public String instrumentType; @JsonProperty + public String shortName; + @JsonProperty public String fullName; @JsonProperty + public String shortNameEng; + @JsonProperty + public String fullNameEng; + @JsonProperty + public String securitySymbol; + @JsonProperty public Double lotSize; + @JsonProperty + public String termType; + @JsonProperty + public String description; + @JsonProperty + public Long issuerId; + @JsonProperty + public String isin; + @JsonProperty + public String workflowStatus; public Long getId() { return id; @@ -84,6 +100,79 @@ public class MoneyMarketSecurityUpdateRequest implements WithId, WithStartDt, Wi this.fullName = fullName; } + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + + public String getShortNameEng() { + return shortNameEng; + } + + public void setShortNameEng(String shortNameEng) { + this.shortNameEng = shortNameEng; + } + + public String getFullNameEng() { + return fullNameEng; + } + + public void setFullNameEng(String fullNameEng) { + this.fullNameEng = fullNameEng; + } + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String securitySymbol) { + this.securitySymbol = securitySymbol; + } + + public String getTermType() { + return termType; + } + + public void setTermType(String termType) { + this.termType = termType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Long getIssuerId() { + return issuerId; + } + + public void setIssuerId(Long issuerId) { + this.issuerId = issuerId; + } + + public String getIsin() { + return isin; + } + + public void setIsin(String isin) { + this.isin = isin; + } + + public String getWorkflowStatus() { + return workflowStatus; + } + + public void setWorkflowStatus(String workflowStatus) { + this.workflowStatus = workflowStatus; + } + public Double getLotSize() { return lotSize; }