clearing-service refund date change for registries

This commit is contained in:
ialbert 2023-08-23 18:38:45 +03:00
parent d14b49ce85
commit 79a6cc846f
5 changed files with 118 additions and 0 deletions

View file

@ -23,6 +23,7 @@ import ru.clearing.platform.dictionary.SectionDictionary;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.payment.PIClearingOutbondActionNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryChangeRefundDateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest;
import ru.spcex.clearing.service.validation.*;
import ru.spcex.clearing.util.security.UserRoleVerification;
@ -321,6 +322,20 @@ public class ValidationConfig {
};
}
@Bean("refundDateValidator")
public Function<RegistryChangeRefundDateRequest, IValidator> refundDateValidator() {
return refundDateRequest -> {
ImdgValidationContext<RegistryChangeRefundDateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(refundDateRequest);
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
context.setLogPrefix(r -> "groupId=%d refundDate=%s".formatted(r.getGroupId(), r.getRefundDate()));
return new ValidatorImpl<>(context,
RefundDateValidationRule.Fields,
RefundDateValidationRule.RegistriesPresent
);
};
}
@Bean
public Function<PIClearingOutbondActionNewRequest, IValidator> piOutboundValidation() {
return pmtOut -> {

View file

@ -15,6 +15,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SessionContinueE
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.AssetOperationApprovalRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.payment.PIClearingOutbondActionNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryChangeRefundDateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.STradesImportedRequest;
@ -131,6 +132,9 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
callback(RegistryReturnDepositRequest.class)
.setFunction(registryService::returnDeposit)
.forDestination(Consts.REGISTRY_RETURN_DEPOSIT_ACTION, callbacks::put);
callback(RegistryChangeRefundDateRequest.class)
.setFunction(registryService::changeRefundDate)
.forDestination(Consts.REGISTRY_CHANGE_REFUND_DATE_ACTION, callbacks::put);
callback(LauncherCommandRequest.class)
.setConsumer(event -> registryService.resetBalances())
.forDestination(Task.createRegistry_GRYT.topic(), callbacks::put);

View file

@ -9,6 +9,7 @@ import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryChangeRefundDateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
@ -41,15 +42,18 @@ public class RegistryService {
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Registry> registryImdg;
private final Function<RegistryReturnDepositRequest, IValidator> returnDepositVal;
private final Function<RegistryChangeRefundDateRequest, IValidator> refundDateVal;
private final IMessageResolver msgResolver;
public RegistryService(ImdgProvider imdgProvider,
@Qualifier("returnDepositValidator") Function<RegistryReturnDepositRequest, IValidator> returnDepositVal,
@Qualifier("refundDateValidator") Function<RegistryChangeRefundDateRequest, IValidator> refundDateVal,
IMessageResolver msgResolver) {
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.returnDepositVal = returnDepositVal;
this.refundDateVal = refundDateVal;
this.msgResolver = msgResolver;
}
@ -141,6 +145,34 @@ public class RegistryService {
return new RequestInfoUpdate(req.getId(), Status.Success, null);
}
public RequestInfoUpdate changeRefundDate(BaseRequest<RegistryChangeRefundDateRequest> req) {
RegistryChangeRefundDateRequest requestPayload = req.getRequestPayload();
IValidator validator = refundDateVal.apply(requestPayload);
Optional<EnumMessage> err = validator.tillFirstError();
if (err.isPresent()) {
log.error("RegistryChangeRefundDateRequest.id={} groupId={}, refundDate={} validation error: {}",
req.getId(),
requestPayload.getGroupId(),
requestPayload.getRefundDate(),
msgResolver.resolve(err.get()));
return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(err.get()));
}
Collection<Registry> registries = validator.getStored(ValidationStored.RefundDateChangeRegistries);
log.debug("RegistryChangeRefundDateRequest.id={} groupId={}, refundDate={} updating {} registries",
req.getId(),
requestPayload.getGroupId(),
requestPayload.getRefundDate(),
registries.size());
Instant now = Instant.now();
for (Registry rgs : registries) {
rgs.setSettlementDate(requestPayload.getRefundDate());
rgs.setRefundDate(requestPayload.getRefundDate());
rgs.setUpdated(now);
registryImdg.update(rgs);
}
return new RequestInfoUpdate(req.getId(), Status.Success, null);
}
/**
* находим все регистры AM__/AS__ по пришедшему ТКР
*/

View file

@ -0,0 +1,65 @@
package ru.spcex.clearing.service.validation;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryChangeRefundDateRequest;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Collection;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
public enum RefundDateValidationRule implements IValidationRule<ImdgValidationContext<RegistryChangeRefundDateRequest>> {
Fields() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryChangeRefundDateRequest> context) {
RegistryChangeRefundDateRequest validatedObject = context.getValidatedObject();
if (validatedObject.getRefundDate() == null) {
return of(ClearingError.WrongField, "refundDate");
}
if (validatedObject.getGroupId() == null) {
return of(ClearingError.WrongField, "groupId");
}
return empty();
}
},
RegistriesPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryChangeRefundDateRequest> context) {
RegistryChangeRefundDateRequest validatedObject = context.getValidatedObject();
Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
ImdgPredicate prdct = pb.and(
pb.equals("groupId", validatedObject.getGroupId()),
pb.or(
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
pb.equals("registryStatus", RegistryStatus.MNG.getKey())
)
);
Collection<Registry> rgss = rgsImdg.getCollectionObjectsByPredicate(prdct).stream()
.filter(rgs -> Objects.nonNull(rgs.getSettlementDate()))
.filter(rgs -> Objects.nonNull(rgs.getValueDate()))
.filter(rgs -> rgs.getValueDate().isBefore(rgs.getSettlementDate()))
.collect(Collectors.toList());
if (rgss.size() < 1) {
return of(ClearingError.RecordNotFound, "groupId=" + validatedObject.getGroupId());
}
context.storeObject(ValidationStored.RefundDateChangeRegistries, rgss);
return empty();
}
};
@Override
public String ruleName() {
return "RefundDateValidationRule." + name();
}
}

View file

@ -20,6 +20,8 @@ public enum ValidationStored {
ReturnDepositDmx,
RefundDateChangeRegistries,
CompanyByTradingCode,
Sdf20Account, Sdf20Company, Sdf20Tcr, Sdf20Dst, Sdf20Ast, Sdf20Security,