ialbert 2026-04-29 18:19:40 +03:00
parent 9d89f94dba
commit 18542d0672
8 changed files with 24 additions and 56 deletions

View file

@ -483,8 +483,7 @@ public class ValidationConfig {
cmpSymbCheck, cmpSymbCheck,
cmpCheck, cmpCheck,
accCheck, accCheck,
assetPresent, assetPresent
WithdrawalFundsValidationRule.TcrPresent
); );
}; };
} }

View file

@ -6,6 +6,7 @@ public enum ClearingMessage implements IEnumKey {
WithdrawalFreeFromTkr("payment-instruction.purpose.withdrawal.tcr"), WithdrawalFreeFromTkr("payment-instruction.purpose.withdrawal.tcr"),
WithdrawalOfFunds("payment-instruction.purpose.withdrawal"), WithdrawalOfFunds("payment-instruction.purpose.withdrawal"),
urgent("sdf54.urgent"), urgent("sdf54.urgent"),
withdrawalOfFundsDmau("withdrawal.funds.dmau"),
; ;
private final String key; private final String key;

View file

@ -12,10 +12,11 @@ import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.sdf.SDf54; import ru.clearing.classes.statics.data.sdf.SDf54;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.messages.ClearingMessage;
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.clearing.SdfClearingRequest; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest;
@ -28,6 +29,7 @@ import ru.spcex.clearing.service.SpecifUtil;
import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import ru.spcex.clearing.service.registry.DmiService; import ru.spcex.clearing.service.registry.DmiService;
import ru.spcex.clearing.service.validation.WithdrawalFundsValidationStore; import ru.spcex.clearing.service.validation.WithdrawalFundsValidationStore;
import ru.spcex.clearing.util.LocaleUtil;
import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.CurrencyCode;
@ -39,8 +41,8 @@ import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.localization.SpringPropertiesLocalizer;
import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.log.ExceptionUtils;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.time.TimeUtil;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
@ -52,24 +54,28 @@ public class WithdrawalFundsService {
private final Sdf54Creator sdf54Creator; private final Sdf54Creator sdf54Creator;
private final Imdg<SDf54> sdf54Imdg; private final Imdg<SDf54> sdf54Imdg;
private final Imdg<PaymentInstruction> pmtImdg; private final Imdg<PaymentInstruction> pmtImdg;
private final Imdg<Registry> rgsImdg;
private final KafkaSender kafkaSender; private final KafkaSender kafkaSender;
private final ImdgId idGen; private final ImdgId idGen;
private final RequestHelper reqHelp; private final RequestHelper reqHelp;
private final UserRoleVerification rights; private final UserRoleVerification rights;
private final IMessageResolver msgResolver; private final IMessageResolver msgResolver;
private final SpringPropertiesLocalizer localizer;
private final AssetTBFProcessing assetsMng; private final AssetTBFProcessing assetsMng;
private final DmiService dmiService; private final DmiService dmiService;
public WithdrawalFundsService(Function<DmauRegistryRequest, IValidator> withdrawalFundsVal, Sdf54Creator sdf54Creator, ImdgProvider imdgProvider, KafkaSender kafkaSender, RequestHelper reqHelp, UserRoleVerification rights, IMessageResolver msgResolver, AssetTBFProcessing assetsMng, DmiService dmiService) { public WithdrawalFundsService(Function<DmauRegistryRequest, IValidator> withdrawalFundsVal, Sdf54Creator sdf54Creator, ImdgProvider imdgProvider, KafkaSender kafkaSender, RequestHelper reqHelp, UserRoleVerification rights, IMessageResolver msgResolver, SpringPropertiesLocalizer localizer, AssetTBFProcessing assetsMng, DmiService dmiService) {
this.withdrawalFundsVal = withdrawalFundsVal; this.withdrawalFundsVal = withdrawalFundsVal;
this.sdf54Creator = sdf54Creator; this.sdf54Creator = sdf54Creator;
this.kafkaSender = kafkaSender; this.kafkaSender = kafkaSender;
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.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.idGen = imdgProvider.getImdgIdGenerator(); this.idGen = imdgProvider.getImdgIdGenerator();
this.reqHelp = reqHelp; this.reqHelp = reqHelp;
this.rights = rights; this.rights = rights;
this.msgResolver = msgResolver; this.msgResolver = msgResolver;
this.localizer = localizer;
this.assetsMng = assetsMng; this.assetsMng = assetsMng;
this.dmiService = dmiService; this.dmiService = dmiService;
} }
@ -93,7 +99,6 @@ public class WithdrawalFundsService {
Company cmp = validator.getStored(WithdrawalFundsValidationStore.Company); Company cmp = validator.getStored(WithdrawalFundsValidationStore.Company);
Account acc = validator.getStored(WithdrawalFundsValidationStore.Account); Account acc = validator.getStored(WithdrawalFundsValidationStore.Account);
AssetTrio assets = validator.getStored(WithdrawalFundsValidationStore.AssetTrio); AssetTrio assets = validator.getStored(WithdrawalFundsValidationStore.AssetTrio);
TradingClearingRegistry tcr = validator.getStored(WithdrawalFundsValidationStore.TCR);
String curr = TextUtil.isEmpty(payload.getSecuritySymbol()) ? CurrencyCode.RUB.getKey() : payload.getSecuritySymbol(); String curr = TextUtil.isEmpty(payload.getSecuritySymbol()) ? CurrencyCode.RUB.getKey() : payload.getSecuritySymbol();
Instant now = Instant.now(); Instant now = Instant.now();
@ -152,11 +157,10 @@ public class WithdrawalFundsService {
sdf54Imdg.insert(sDf54); sdf54Imdg.insert(sDf54);
log.info("created sdf54.id={}", sDf54.getId()); log.info("created sdf54.id={}", sDf54.getId());
dmiService.setProcComment(tcr.getId(), Registry d__i = dmiService.createDmi(payload.getAmount(), assets.a__t());
curr, d__i.setComment(sDf54.getDocnm_ref());
safeBD(payload.getAmount()).negate(), rgsImdg.insert(d__i);
sDf54.getDocnm_ref()); log.debug("created {}.id={}; recalculating assests...", d__i.getRegistryCode(), d__i.getId());
log.debug("recalculating assests...");
assetsMng.process(assets.a__b(), assets.a__t(), assets.a__f(), BigDecimal.ZERO); assetsMng.process(assets.a__b(), assets.a__t(), assets.a__f(), BigDecimal.ZERO);
SdfClearingRequest exp = new SdfClearingRequest(); SdfClearingRequest exp = new SdfClearingRequest();
@ -180,11 +184,9 @@ public class WithdrawalFundsService {
return payload.getPaymentPurpose(); return payload.getPaymentPurpose();
} }
if (CurrencyCode.RUB.equalsByKey(payload.getSecuritySymbol())) { if (CurrencyCode.RUB.equalsByKey(payload.getSecuritySymbol())) {
return "Вывод средств с регистра невыясненных денежных средств по %s" return localizer.resolve(ClearingMessage.withdrawalOfFundsDmau, LocaleUtil.ru, payload.getSecuritySymbol());
.formatted(payload.getSecuritySymbol());
} else { } else {
return "Withdrawal of funds from the register %s of unidentified funds" return localizer.resolve(ClearingMessage.withdrawalOfFundsDmau, LocaleUtil.eng, payload.getSecuritySymbol());
.formatted(payload.getSecuritySymbol());
} }
} }

View file

@ -1,20 +1,11 @@
package ru.spcex.clearing.service.validation; package ru.spcex.clearing.service.validation;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.DmauRegistryRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.DmauRegistryRequest;
import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.clearing.service.TcrSearcher;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidationRule;
@ -33,33 +24,7 @@ public enum WithdrawalFundsValidationRule implements IValidationRule<ImdgValidat
return empty(); return empty();
} }
}, },
TcrPresent() { ;
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<DmauRegistryRequest> context) {
Account accCred = context.getStoredObject(WithdrawalFundsValidationStore.Account);
Company addressee = context.getStoredObject(WithdrawalFundsValidationStore.Company);
Imdg<TradingClearingRegistry> tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
Imdg<TradingClearingRegistryList> tcrListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
TcrSearcher tcrSearcher = new TcrSearcher(tcrImdg, tcrListImdg, companyImdg, accountImdg);
AnltSearcher.AnltSearch srchRes = tcrSearcher.searchByAccountId(accCred.getId(), accCred.getCurrency());
if (!srchRes.isFound()) {
return Optional.of(srchRes.getError());
}
if (srchRes.getCompany() != null) {
if (!Objects.equals(srchRes.getCompany().getId(), addressee.getId())) {
return of(ClearingError.AccountIsNotMatchedWithCompany, accCred.getId(), addressee.getId());
}
}
TradingClearingRegistry tcr = srchRes.getTcr();
if (tcr == null) {
return of(ClearingError.RecordNotFound, "TCR");
}
context.storeObject(WithdrawalFundsValidationStore.TCR, tcr);
return Optional.empty();
}
};
private final static Logger log = LoggerFactory.getLogger(WithdrawalFundsValidationRule.class); private final static Logger log = LoggerFactory.getLogger(WithdrawalFundsValidationRule.class);
@Override @Override

View file

@ -5,6 +5,5 @@ public enum WithdrawalFundsValidationStore {
Company, Company,
Account, Account,
AssetTrio, AssetTrio,
TCR,
; ;
} }

View file

@ -5,8 +5,8 @@ import ru.clearing.classes.statics.data.account.Account;
import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.CurrencyCode;
public class LocaleUtil { public class LocaleUtil {
private static final Locale ru = new Locale("ru"); public static final Locale ru = new Locale("ru");
private static final Locale eng = new Locale("eng"); public static final Locale eng = new Locale("eng");
public static boolean isRus(Locale locale) { public static boolean isRus(Locale locale) {
return ru.equals(locale); return ru.equals(locale);

View file

@ -1,3 +1,4 @@
payment-instruction.purpose.withdrawal.tcr=Debt free cash withdrawal from TKR {0}. payment-instruction.purpose.withdrawal.tcr=Debt free cash withdrawal from TKR {0}.
payment-instruction.purpose.withdrawal=Debt free cash withdrawal. payment-instruction.purpose.withdrawal=Debt free cash withdrawal.
sdf54.urgent=urgent sdf54.urgent=urgent
withdrawal.funds.dmau=Withdrawal of funds from the register {0} of unidentified funds

View file

@ -1,3 +1,4 @@
payment-instruction.purpose.withdrawal.tcr=Возврат средств, свободных от обязательств с ТКР {0}. payment-instruction.purpose.withdrawal.tcr=Возврат средств, свободных от обязательств с ТКР {0}.
payment-instruction.purpose.withdrawal=Вывод средств. payment-instruction.purpose.withdrawal=Вывод средств.
sdf54.urgent=срочно sdf54.urgent=срочно
withdrawal.funds.dmau=Вывод средств с регистра невыясненных денежных средств по {0}