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,
cmpCheck,
accCheck,
assetPresent,
WithdrawalFundsValidationRule.TcrPresent
assetPresent
);
};
}

View file

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

View file

@ -1,20 +1,11 @@
package ru.spcex.clearing.service.validation;
import java.math.BigDecimal;
import java.util.Objects;
import java.util.Optional;
import org.slf4j.Logger;
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.imdg.IMDGDistributedNames;
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.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
@ -33,33 +24,7 @@ public enum WithdrawalFundsValidationRule implements IValidationRule<ImdgValidat
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);
@Override

View file

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

View file

@ -5,8 +5,8 @@ import ru.clearing.classes.statics.data.account.Account;
import ru.spcex.platform.enumeration.CurrencyCode;
public class LocaleUtil {
private static final Locale ru = new Locale("ru");
private static final Locale eng = new Locale("eng");
public static final Locale ru = new Locale("ru");
public static final Locale eng = new Locale("eng");
public static boolean isRus(Locale 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=Debt free cash withdrawal.
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=Вывод средств.
sdf54.urgent=срочно
withdrawal.funds.dmau=Вывод средств с регистра невыясненных денежных средств по {0}