Поправил MoneyMarketSecurityService и валидацию в соответствии с ТЗ. Исправил MoneyMarketSecurityMapStore.
This commit is contained in:
psemenkov 2023-04-03 13:21:27 +03:00
parent 9e4b4fd7df
commit 0b062fc97c
20 changed files with 820 additions and 31 deletions

View file

@ -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<EquitySecurity> {
@ -31,7 +34,7 @@ public class EquitySecurityMapStore extends TemplateMapStore<EquitySecurity> {
@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<EquitySecurity> {
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;
}

View file

@ -72,7 +72,7 @@ public class MoneyMarketSecurityMapStore extends TemplateMapStore<MoneyMarketSec
object.setNominalValue(resultSet.getObject("NOMINAL_VALUE", BigDecimal.class));
object.setNominalCurrency(resultSet.getObject("NOMINAL_CURRENCY", String.class));
object.setTermType(resultSet.getObject("TERM_TYPE", String.class));
object.setTermType(resultSet.getObject("LOT_SIZE", String.class));
object.setLotSize(resultSet.getObject("LOT_SIZE", BigDecimal.class));
fillBySecurity(object, object.getSecurityId());
return object;
}

View file

@ -1,7 +1,9 @@
package ru.spcex.clearing.securities.component;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.EquitySecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest;
import ru.spcex.platform.enumeration.Market;
import ru.spcex.platform.enumeration.Status;
@ -21,4 +23,16 @@ public class ListingBuilder {
listing.setWorkflowStatus(Status.Active.getKey());
return listing;
}
public Listing byNewEquity(EquitySecurity equitySecurity, EquitySecurityNewRequest request) {
Listing listing = new Listing();
listing.setCreated(equitySecurity.getCreated());
listing.setSecurityId(equitySecurity.getId());
listing.setLotSize(BigDecimal.valueOf(request.getLotSize()));
listing.setMarket(Market.mkrs.getKey());
listing.setSymbolCode(equitySecurity.getSecuritySymbol());
listing.setSymbolName(equitySecurity.getFullName());
// listing.setTradingCurrency(equitySecurity.getNominalCurrency());
listing.setWorkflowStatus(Status.Active.getKey());
return listing;
}
}

View file

@ -3,6 +3,7 @@ package ru.spcex.clearing.securities.errors;
import ru.spcex.platform.utils.enumeration.IEnumId;
public enum SecuritiesError implements IEnumId {
RequiredFieldIsEmpty(1002L),
WrongFieldValue(1004L),
InstrumentAlreadyExists(1010L),
InstrumentNotActive(1012L),

View file

@ -0,0 +1,131 @@
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 ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.misc.Listing;
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.securitites.EquitySecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.EquitySecurityUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.securities.component.ListingBuilder;
import ru.spcex.clearing.securities.validation.ValidationProvider;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.Optional;
@Service
public class EquitySecurityService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<EquitySecurity> equitySecurityImdg;
private final Imdg<Listing> 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<String, Object> kafkaQueue,
Producer<String, Object> 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<EquitySecurityNewRequest> userRequest){
ImdgTransaction transaction = imdgProvider.newTransaction();
EquitySecurityNewRequest req = userRequest.getRequestPayload();
Optional<EnumMessage> 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<EquitySecurity> equityImdg = transaction.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
Imdg<Listing> 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<EquitySecurityUpdateRequest> userRequest){
return null;
}
private RequestInfoUpdate deleteEquity(BaseRequest<CommonDeleteRequest> userRequest) {
return null;
}
}

View file

@ -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;

View file

@ -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<SpcexObjectBase> mmsMap;
private final Imdg<SpcexObjectBase> 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<MoneyMarketSecurityNewRequest, IValidator> 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<EquitySecurityNewRequest, IValidator> equityNewValidator() {
return equityRequest -> {
ImdgValidationContext<EquitySecurityNewRequest> 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<EquitySecurityUpdateRequest, IValidator> equityUpdateValidator() {
return equityRequest -> {
ImdgValidationContext<EquitySecurityUpdateRequest> 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<CommonDeleteRequest, IValidator> equityDeleteValidator() {
return equityRequest -> {
ImdgValidationContext<CommonDeleteRequest> 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()
);
};
}

View file

@ -20,6 +20,13 @@ public class EndDtAfterStartDt<T extends WithStartDt & WithEndDt> implements IVa
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<T> 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");
}

View file

@ -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<ImdgValidationContext<EquitySecurityNewRequest>> {
RequiredFieldIsNotEmpty() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<EquitySecurityNewRequest> 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();
}
}

View file

@ -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<ImdgValidationContext<WithInstrumentType>> {
private final IEnumId errorEnum;
private final String predictableInstrumentType;
public IsValidInstrumentType(IEnumId errorEnum, String predictableInstrumentType) {
this.errorEnum = errorEnum;
this.predictableInstrumentType = predictableInstrumentType;
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<WithInstrumentType> 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();
}
}
}

View file

@ -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<ImdgValidationContext<MoneyMarketSecurityNewRequest>> {
SecuritySymbolUniq() {
RequiredFieldIsNotEmpty() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<MoneyMarketSecurityNewRequest> context) {
MoneyMarketSecurityNewRequest action = context.getValidatedObject();
Imdg<MoneyMarketSecurity> 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();
}
};

View file

@ -18,7 +18,7 @@ public enum MmsUpdateValidationRule implements IValidationRule<ImdgValidationCon
MoneyMarketSecurity mms = context.getStoredObject(Stored.PresentById);
//проверка только если PresentById найдет объект и сохранит его
if (mms != null && !Status.Active.getKey().equals(mms.getWorkflowStatus())) {
return of(SecuritiesError.InstrumentNotActive);
return of(SecuritiesError.InstrumentNotActive, mms.getClass().getSimpleName());
} else {
return empty();
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.securities.validation.rule;
import org.springframework.util.StringUtils;
import ru.spcex.clearing.securities.errors.SecuritiesError;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol;
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.enumeration.IEnumId;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Map;
import java.util.Optional;
public class NotPresentBySecuritySymbolAndWorkflowStatusActv<T extends SpcexObjectBase & WithSecuritySymbol> implements IValidationRule<ImdgValidationContext<WithSecuritySymbol>> {
private final String mapName;
private final IEnumId errorEnum;
private final Class<T> clazz;
public NotPresentBySecuritySymbolAndWorkflowStatusActv(String mapName, IEnumId errorEnum, Class<T> clazz) {
this.mapName = mapName;
this.errorEnum = errorEnum;
this.clazz = clazz;
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<WithSecuritySymbol> context) {
WithSecuritySymbol action = context.getValidatedObject();
Imdg<T> 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();
}
}
}

View file

@ -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<ImdgValidationContext<WithWorkflowStatus>> {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<WithWorkflowStatus> 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();
}
}
}

View file

@ -0,0 +1,5 @@
package ru.spcex.platform.classes.base.interfaces;
public interface WithInstrumentType {
String getInstrumentType();
}

View file

@ -0,0 +1,5 @@
package ru.spcex.platform.classes.base.interfaces;
public interface WithWorkflowStatus {
String getWorkflowStatus();
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}