1. paymentPurpose += " по итогу клиринга"
2. ТКР/TKR sdf57/sdf06 search 3. локализация рус/англ purpose для PaymentInstructionOutboundService 4. ошибка в допуске к CURR сессии 5. swt-exporter bugfix
This commit is contained in:
parent
ed010ad64e
commit
1037b27165
16 changed files with 231 additions and 109 deletions
|
|
@ -1,19 +1,18 @@
|
|||
package ru.spcex.clearing.config;
|
||||
|
||||
import java.util.Locale;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.support.ResourceBundleMessageSource;
|
||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||
import ru.spcex.platform.utils.enumeration.SpringPropertiesMessageResolver;
|
||||
import ru.spcex.platform.utils.localization.SpringPropertiesLocalizer;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
//@Configuration
|
||||
@Configuration
|
||||
public class MessagesConfig {
|
||||
@Bean("validation-error-messages")
|
||||
@Bean("clearing-messages")
|
||||
public ResourceBundleMessageSource messages() {
|
||||
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
|
||||
source.setBasenames("messages/error");
|
||||
source.setBasenames("messages/clearing");
|
||||
source.setUseCodeAsDefaultMessage(true);
|
||||
source.setDefaultEncoding("utf8");
|
||||
source.setDefaultLocale(Locale.ROOT);
|
||||
|
|
@ -21,9 +20,12 @@ public class MessagesConfig {
|
|||
}
|
||||
|
||||
@Bean
|
||||
public IMessageResolver errorResolver(@Qualifier("validation-error-messages") ResourceBundleMessageSource messageBundle) {
|
||||
SpringPropertiesMessageResolver resolver = new SpringPropertiesMessageResolver(messageBundle);
|
||||
resolver.setLocale("ru");
|
||||
public SpringPropertiesLocalizer localizer(
|
||||
@Qualifier("clearing-messages")
|
||||
ResourceBundleMessageSource messageBundle
|
||||
) {
|
||||
SpringPropertiesLocalizer resolver = new SpringPropertiesLocalizer(messageBundle);
|
||||
resolver.setDefaultLocale("ru");
|
||||
return resolver;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
package ru.spcex.clearing.messages;
|
||||
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
|
||||
public enum ClearingMessage implements IEnumKey {
|
||||
WithdrawalFreeFromTkr("payment-instruction.purpose.withdrawal.tcr"),
|
||||
WithdrawalOfFunds("payment-instruction.purpose.withdrawal"),
|
||||
urgent("sdf54.urgent"),
|
||||
;
|
||||
private final String key;
|
||||
|
||||
ClearingMessage(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
|
|
@ -116,7 +116,7 @@ public class AnltSearcher {
|
|||
return new AnltSearch(infoAcc, company, tcr, tcrList, currencyCode);
|
||||
}
|
||||
|
||||
private static final Pattern tcrPattern = Pattern.compile("ТКР.*?([0-9A-Z-]{12})");
|
||||
private static final Pattern tcrPattern = Pattern.compile("ТКР|TKR.*?([0-9A-Z-]{12})");
|
||||
|
||||
private static String getTkrCodeFromComment(String comment) {
|
||||
if (TextUtil.isEmpty(comment)) {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package ru.spcex.clearing.service;
|
|||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
|
@ -15,6 +16,8 @@ import ru.clearing.classes.statics.data.payment.PaymentInstruction;
|
|||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||
import ru.clearing.classes.statics.data.sdf.SDf54;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.messages.ClearingMessage;
|
||||
import ru.spcex.clearing.util.LocaleUtil;
|
||||
import ru.spcex.platform.enumeration.AccountStatus;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
import ru.spcex.platform.enumeration.CompanySymbol;
|
||||
|
|
@ -25,6 +28,7 @@ import ru.spcex.platform.imdg.api.ImdgId;
|
|||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
import ru.spcex.platform.utils.localization.SpringPropertiesLocalizer;
|
||||
import ru.spcex.platform.utils.number.BigDecimalUtil;
|
||||
import ru.spcex.platform.utils.time.TimeUtil;
|
||||
|
||||
|
|
@ -38,9 +42,10 @@ public class Sdf54Creator {
|
|||
private final Imdg<SDf54> sdf54Imdg;
|
||||
private final Imdg<BankAccount> bankAccountImdg;
|
||||
private final ImdgId idGenerator;
|
||||
private final SpringPropertiesLocalizer resolver;
|
||||
private static DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yy");
|
||||
|
||||
public Sdf54Creator(ImdgProvider imdgProvider) {
|
||||
public Sdf54Creator(ImdgProvider imdgProvider, SpringPropertiesLocalizer resolver) {
|
||||
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
||||
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
||||
|
|
@ -48,23 +53,25 @@ public class Sdf54Creator {
|
|||
this.bankAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
|
||||
this.sdf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class);
|
||||
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
||||
this.resolver = resolver;
|
||||
}
|
||||
|
||||
private final static DateTimeFormatter docnmRefFormatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
|
||||
|
||||
public SDf54 create(PaymentInstruction paymentInstruction) {
|
||||
public SDf54 create(PaymentInstruction pmt) {
|
||||
Instant now = Instant.now();
|
||||
String c_acc_cred = null;
|
||||
Account anltAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and currency = '%s'"
|
||||
.formatted(
|
||||
AccountType.Anlt.getKey(),
|
||||
Status.Active.getKey(),
|
||||
paymentInstruction.getCreditLeg_currencyCode()
|
||||
pmt.getCreditLeg_currencyCode()
|
||||
));
|
||||
// c_acc_deb = c_acc_deb == null ? paymentInstruction.getCreditLeg_account() : c_acc_deb;
|
||||
c_acc_cred = c_acc_cred == null ? paymentInstruction.getDebitLeg_account() : c_acc_cred;
|
||||
c_acc_cred = c_acc_cred == null ? pmt.getDebitLeg_account() : c_acc_cred;
|
||||
|
||||
|
||||
Locale locale = LocaleUtil.locale(pmt.getCreditLeg_currencyCode(), pmt.getDebitLeg_currencyCode());
|
||||
SDf54 sDf54 = new SDf54();
|
||||
sDf54.setId(idGenerator.nextId());
|
||||
sDf54.setSeg_type("V");
|
||||
|
|
@ -80,6 +87,9 @@ public class Sdf54Creator {
|
|||
String senderSbankName = "";
|
||||
if (prcCmp != null) {
|
||||
senderSbankName = prcCmp.getShortName();
|
||||
if (!LocaleUtil.isRus(locale) && prcCmp.getProfile() != null) {
|
||||
senderSbankName = prcCmp.getProfile().getShortNameEng();
|
||||
}
|
||||
}
|
||||
SpecifUtil.fillSegmentsBy35Symbols(senderSbankName,
|
||||
sDf54::setSbanknam1,
|
||||
|
|
@ -105,29 +115,27 @@ public class Sdf54Creator {
|
|||
if (anltAcc != null) {
|
||||
sDf54.setAcc_deb(anltAcc.getAccount());
|
||||
}
|
||||
Account accDebAcc = accountImdg.getSingleObjectByID(paymentInstruction.getDebitLeg_accountId());
|
||||
Account accDebAcc = accountImdg.getSingleObjectByID(pmt.getDebitLeg_accountId());
|
||||
if (accDebAcc == null || !AccountStatus.ACTIVE.equalsByKey(accDebAcc.getStatus())) {
|
||||
log.warn("paymentInstruction[{}].DebitLeg_accountId={} account not exist or not active.", paymentInstruction.getId(), paymentInstruction.getDebitLeg_accountId());
|
||||
log.warn("paymentInstruction[{}].DebitLeg_accountId={} account not exist or not active.", pmt.getId(), pmt.getDebitLeg_accountId());
|
||||
}
|
||||
BankAccount bnkAcc = bankAccountImdg.getFirstObjectBySQL("accountId = %d".formatted(paymentInstruction.getDebitLeg_accountId()));
|
||||
BankAccount bnkAcc = bankAccountImdg.getFirstObjectBySQL("accountId = %d".formatted(pmt.getDebitLeg_accountId()));
|
||||
if (bnkAcc != null) {
|
||||
sDf54.setInn_cred(bnkAcc.getTaxpayerIdentificationNumber());
|
||||
sDf54.setKpp_cred(bnkAcc.getTaxRegistrationReasonCode());
|
||||
c_acc_cred = bnkAcc.getCorrespondentAccount();
|
||||
sDf54.setSwift_ben(bnkAcc.getSwiftCode());
|
||||
if (!LocaleUtil.isRus(locale)) {
|
||||
sDf54.setSwift_ben(bnkAcc.getSwiftCode());
|
||||
sDf54.setSwift_int(bnkAcc.getIntermediarySwiftCode());
|
||||
}
|
||||
} else {
|
||||
log.warn("Bank account not found for DebitLeg_accountId={}", paymentInstruction.getDebitLeg_accountId());
|
||||
log.warn("Bank account not found for DebitLeg_accountId={}", pmt.getDebitLeg_accountId());
|
||||
}
|
||||
sDf54.setDoc_num(String.valueOf(nextDocNum()));
|
||||
BankAccount prcBankAcc = bankAccountImdg.getFirstObjectBySQL("companyId = %d and currency = '%s'"
|
||||
.formatted(Sender.Prc.getId(), paymentInstruction.getCreditLeg_currencyCode()));
|
||||
if (prcBankAcc != null) {
|
||||
sDf54.setSwift_int(prcBankAcc.getSwiftCode());
|
||||
}
|
||||
String today = payDateFormatter.format(LocalDate.now());
|
||||
sDf54.setDoc_date(today);
|
||||
sDf54.setValue_date(today);
|
||||
sDf54.setAcc_kr_1(paymentInstruction.getDebitLeg_account());
|
||||
sDf54.setAcc_kr_1(pmt.getDebitLeg_account());
|
||||
|
||||
{
|
||||
Account prcCorrAcc = accountImdg.getFirstObjectBySQL("companyId=%d and accountType = '%s' and status = '%s' and currency = '%s'"
|
||||
|
|
@ -135,7 +143,7 @@ public class Sdf54Creator {
|
|||
Sender.Prc.getId(),
|
||||
AccountType.Bank.getKey(),
|
||||
Status.Active.getKey(),
|
||||
paymentInstruction.getCreditLeg_currencyCode()
|
||||
pmt.getCreditLeg_currencyCode()
|
||||
));
|
||||
if (prcCorrAcc == null) {
|
||||
log.warn("Account for PRC CORR not found");
|
||||
|
|
@ -145,7 +153,7 @@ public class Sdf54Creator {
|
|||
}
|
||||
//**********************
|
||||
|
||||
sDf54.setSend_type("срочно");
|
||||
sDf54.setSend_type(resolver.resolve(ClearingMessage.urgent, locale));
|
||||
sDf54.setDoc_type("002");
|
||||
sDf54.setDocnm_ref(docnmRefFormatter.format(TimeUtil.toDateTime(now)));
|
||||
|
||||
|
|
@ -186,13 +194,13 @@ public class Sdf54Creator {
|
|||
}
|
||||
}
|
||||
|
||||
sDf54.setPay_date(payDateFormatter.format(TimeUtil.toLocalDate(paymentInstruction.getPaymentDate())));
|
||||
sDf54.setPay_val(paymentInstruction.getCreditLeg_currencyCode());
|
||||
String sumDeb = paymentInstruction.getDebitLeg_amount() != null ? paymentInstruction.getDebitLeg_amount().toString() : "";
|
||||
sDf54.setPay_date(payDateFormatter.format(TimeUtil.toLocalDate(pmt.getPaymentDate())));
|
||||
sDf54.setPay_val(pmt.getCreditLeg_currencyCode());
|
||||
String sumDeb = pmt.getDebitLeg_amount() != null ? pmt.getDebitLeg_amount().toString() : "";
|
||||
sDf54.setSum_deb(BigDecimalUtil.limitDecimalPlaces(sumDeb, 2));
|
||||
sDf54.setSpecif_1(paymentInstruction.getPaymentPurpose());
|
||||
sDf54.setSpecif_1(pmt.getPaymentPurpose());
|
||||
sDf54.setGenerationTime(now);
|
||||
log.debug("paymentInstruction.id={}, sdf54.id {}", paymentInstruction.getId(), sDf54.getId());
|
||||
log.debug("paymentInstruction.id={}, sdf54.id {}", pmt.getId(), sDf54.getId());
|
||||
return sDf54;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
package ru.spcex.clearing.service.builder;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import ru.clearing.classes.statics.data.account.Account;
|
||||
import ru.clearing.classes.statics.data.account.ClearingAccount;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
|
|
@ -8,28 +13,31 @@ import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
|
|||
import ru.clearing.classes.statics.data.misc.Currency;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||
import ru.clearing.classes.statics.data.sdf.SDf21;
|
||||
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
|
||||
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
|
||||
import ru.clearing.classes.statics.data.security.Security;
|
||||
import ru.clearing.classes.statics.data.statement.Statement;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.session.stage.util.RegistryUtil;
|
||||
import ru.spcex.platform.enumeration.*;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
import ru.spcex.platform.enumeration.RegistryDesignation;
|
||||
import ru.spcex.platform.enumeration.RegistryInstrumentType;
|
||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||
import ru.spcex.platform.enumeration.RegistryUnit;
|
||||
import ru.spcex.platform.enumeration.ServiceStatus;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import ru.spcex.platform.utils.number.BigDecimalUtil;
|
||||
|
||||
public class RegistrySecurityBuilder {
|
||||
private Statement statement;
|
||||
private Company company;
|
||||
private Account account;
|
||||
private RegistryDesignation designation;
|
||||
private SDf21 sdf21;
|
||||
|
||||
private final ImdgProvider imdgProvider;
|
||||
|
||||
private final Imdg<ClearingAccount> clearingAccountImdg;
|
||||
|
|
@ -92,19 +100,18 @@ public class RegistrySecurityBuilder {
|
|||
rgs.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
|
||||
|
||||
AccountType accType = IEnumKey.getEnumByKey(AccountType.class, account.getAccountType());
|
||||
if (AccountType.Clrn.equals(accType)) {
|
||||
ClearingAccount accountForStatement = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", statement.getAccountId()));
|
||||
if (accountForStatement != null) {
|
||||
rgs.setRegistryCapacity(accountForStatement.getClearingAccountType());
|
||||
}
|
||||
} else if (AccountType.Info.equals(accType) || AccountType.Anlt.equals(accType)) {
|
||||
rgs.setRegistryCapacity(RegistryCapacity.A.getKey());
|
||||
}
|
||||
//if (AccountType.Clrn.equals(accType)) {
|
||||
// ClearingAccount accountForStatement = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", statement.getAccountId()));
|
||||
// if (accountForStatement != null) {
|
||||
// rgs.setRegistryCapacity(accountForStatement.getClearingAccountType());
|
||||
// }
|
||||
//} else if (AccountType.Info.equals(accType) || AccountType.Anlt.equals(accType)) {
|
||||
// rgs.setRegistryCapacity(RegistryCapacity.A.getKey());
|
||||
//}
|
||||
rgs.setRegistryUnit(RegistryUnit.T.getKey());
|
||||
rgs.setRegistryCode(RegistryUtil.clearingCode(rgs));
|
||||
|
||||
Collection<TradingClearingRegistry> tcrsByAccount = tradingClearingRegistryImdg.getCollectionObjectsByFieldValues(Map.of(
|
||||
"moneyAccountId", account.getId(),
|
||||
"depoAccountId", account.getId(),
|
||||
"companyId", company.getId(),
|
||||
"status", ServiceStatus.Active.getKey()
|
||||
));
|
||||
|
|
@ -112,7 +119,9 @@ public class RegistrySecurityBuilder {
|
|||
TradingClearingRegistry tcr = tcrsByAccount.iterator().next();
|
||||
rgs.setTradingClearingRegistryId(tcr.getId());
|
||||
rgs.setTradingClearingRegistry(tcr.getCode());
|
||||
rgs.setRegistryCapacity(tcr.getTradingClearingRegistryType());
|
||||
}
|
||||
rgs.setRegistryCode(RegistryUtil.clearingCode(rgs));
|
||||
|
||||
rgs.setRegistryStatus(RegistryStatus.PROC.getKey());
|
||||
rgs.setSecurityId(statement.getSecurityId());
|
||||
|
|
@ -131,6 +140,7 @@ public class RegistrySecurityBuilder {
|
|||
rgs.setCreated(Instant.now());
|
||||
|
||||
//по дефолту создаем с балансом 0, а потом пересчитываем по необходимости
|
||||
rgs.setPlanBalance(BigDecimalUtil.parse(sdf21.getCloseBalance()));
|
||||
rgs.setBalance(BigDecimal.ZERO);
|
||||
rgs.setDebit(BigDecimal.ZERO);
|
||||
rgs.setCredit(BigDecimal.ZERO);
|
||||
|
|
@ -154,4 +164,9 @@ public class RegistrySecurityBuilder {
|
|||
if (currency != null) return currency.getCurrencyCode();
|
||||
return null;
|
||||
}
|
||||
|
||||
public RegistrySecurityBuilder sdf21(SDf21 sdf21) {
|
||||
this.sdf21 = sdf21;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,13 @@
|
|||
package ru.spcex.clearing.service.executors;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Collection;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Pattern;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
|
|
@ -26,7 +34,21 @@ import ru.spcex.clearing.service.model.Result;
|
|||
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
|
||||
import ru.spcex.clearing.service.validation.ValidationStored;
|
||||
import ru.spcex.clearing.session.stage.util.RegistryUtil;
|
||||
import ru.spcex.platform.enumeration.*;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
import ru.spcex.platform.enumeration.BalanceDimension;
|
||||
import ru.spcex.platform.enumeration.InOutDirection;
|
||||
import ru.spcex.platform.enumeration.InOutSDfType;
|
||||
import ru.spcex.platform.enumeration.OperationCode;
|
||||
import ru.spcex.platform.enumeration.OperationStatus;
|
||||
import ru.spcex.platform.enumeration.RegistryCapacity;
|
||||
import ru.spcex.platform.enumeration.RegistryDesignation;
|
||||
import ru.spcex.platform.enumeration.RegistryInstrumentType;
|
||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
||||
import ru.spcex.platform.enumeration.RegistryUnit;
|
||||
import ru.spcex.platform.enumeration.Sender;
|
||||
import ru.spcex.platform.enumeration.StatementType;
|
||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
|
|
@ -36,20 +58,10 @@ import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
|
|||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||
import ru.spcex.platform.utils.text.TextUtil;
|
||||
import ru.spcex.platform.utils.validation.IValidator;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Collection;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||
|
||||
@Service
|
||||
public class Sdf21Executor extends AbstractExecutor<SDf21> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
|
@ -193,6 +205,7 @@ public class Sdf21Executor extends AbstractExecutor<SDf21> {
|
|||
rgs.getCredit());
|
||||
}, () -> {
|
||||
Registry registry = RegistrySecurityBuilder.builder(imdgProvider)
|
||||
.sdf21(sdf21)
|
||||
.statement(stmt)
|
||||
.company(company)
|
||||
.account(account)
|
||||
|
|
@ -428,19 +441,6 @@ public class Sdf21Executor extends AbstractExecutor<SDf21> {
|
|||
}
|
||||
}
|
||||
|
||||
private static String getTkrCodeFromComment(String comment) {
|
||||
if (comment == null) {
|
||||
return null;
|
||||
}
|
||||
comment = comment.toUpperCase();
|
||||
int tcrIndex = comment.indexOf("ТКР");
|
||||
if (tcrIndex == -1) {
|
||||
return null;
|
||||
}
|
||||
comment = comment.substring(tcrIndex + 3);
|
||||
return comment.replaceAll("\\s+", "");
|
||||
}
|
||||
|
||||
private static String getContractFromSpecif(String specif) {
|
||||
if (specif == null) {
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -790,19 +790,6 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
return LocalDate.parse(payDate, payDateFormatter);
|
||||
}
|
||||
|
||||
private static String getTkrCodeFromComment(String comment) {
|
||||
if (comment == null) {
|
||||
return null;
|
||||
}
|
||||
comment = comment.toUpperCase();
|
||||
int tcrIndex = comment.indexOf("ТКР");
|
||||
if (tcrIndex == -1) {
|
||||
return null;
|
||||
}
|
||||
comment = comment.substring(tcrIndex + 3);
|
||||
return comment.replaceAll("\\s+", "");
|
||||
}
|
||||
|
||||
private String getContractFromSpecif(String specif) {
|
||||
if (TextUtil.isEmpty(specif)) {
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package ru.spcex.clearing.service.payment;
|
|||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
|
@ -19,6 +20,7 @@ import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
|||
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.notification.NotificationSender;
|
||||
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||
|
|
@ -39,6 +41,7 @@ import ru.spcex.clearing.service.schedule.TradingTimeService;
|
|||
import ru.spcex.clearing.service.validation.ValidationStored;
|
||||
import ru.spcex.clearing.session.stage.impl.GatewayRequester;
|
||||
import static ru.spcex.clearing.session.stage.impl.GatewayRequester.mapError;
|
||||
import ru.spcex.clearing.util.LocaleUtil;
|
||||
import ru.spcex.clearing.util.security.UserRoleVerification;
|
||||
import ru.spcex.platform.enumeration.CurrencyCode;
|
||||
import ru.spcex.platform.enumeration.ObjectType;
|
||||
|
|
@ -51,6 +54,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
|
|||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||
import ru.spcex.platform.utils.localization.SpringPropertiesLocalizer;
|
||||
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||
import ru.spcex.platform.utils.text.TextUtil;
|
||||
import ru.spcex.platform.utils.validation.IValidator;
|
||||
|
|
@ -78,12 +82,14 @@ public class PaymentInstructionOutboundService {
|
|||
private final TradingTimeService time;
|
||||
private final GatewayRequester gateway;
|
||||
private final NotificationSender notification;
|
||||
private final SpringPropertiesLocalizer resolver;
|
||||
|
||||
@Autowired
|
||||
public PaymentInstructionOutboundService(UserRoleVerification rights,
|
||||
IMessageResolver msgs,
|
||||
ImdgProvider imdgProvider,
|
||||
Function<PIClearingOutbondActionNewRequest, IValidator> validation, RegistryManager rgsMng, KafkaSender kafkaSender, AssetTBFProcessing assetsMng, DmiService dmiService, TradingTimeService time, GatewayRequester gateway, NotificationSender notification) {
|
||||
Function<PIClearingOutbondActionNewRequest, IValidator> validation, RegistryManager rgsMng, KafkaSender kafkaSender, AssetTBFProcessing assetsMng, DmiService dmiService, TradingTimeService time, GatewayRequester gateway, NotificationSender notification,
|
||||
SpringPropertiesLocalizer resolver) {
|
||||
this.imdgProvider = imdgProvider;
|
||||
this.rights = rights;
|
||||
this.msgs = msgs;
|
||||
|
|
@ -95,7 +101,7 @@ public class PaymentInstructionOutboundService {
|
|||
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
this.currImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
|
||||
this.sdf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class);
|
||||
this.sdf54Creator = new Sdf54Creator(imdgProvider);
|
||||
this.sdf54Creator = new Sdf54Creator(imdgProvider, resolver);
|
||||
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
||||
this.rgsMng = rgsMng;
|
||||
this.kafkaSender = kafkaSender;
|
||||
|
|
@ -103,6 +109,7 @@ public class PaymentInstructionOutboundService {
|
|||
this.dmiService = dmiService;
|
||||
this.time = time;
|
||||
this.gateway = gateway;
|
||||
this.resolver = resolver;
|
||||
this.gateway.setName("PaymentInstructionOutboundService|PI");
|
||||
this.notification = notification;
|
||||
}
|
||||
|
|
@ -128,7 +135,10 @@ public class PaymentInstructionOutboundService {
|
|||
log.debug("all checks passed, accCred.id={}, accDeb.id={}, addressee.id={}, sender.id={}, amount: {}",
|
||||
accCred.getId(), accDeb.getId(), addressee.getId(), sender.getId(), amount);
|
||||
|
||||
String purpose = tcr != null ? "Возврат денежных средств, свободных от обязательств с ТКР " + tcr.getCode() + " ." : "Вывод средств.";
|
||||
Locale locale = LocaleUtil.locale(accDeb);
|
||||
String purpose = tcr != null ?
|
||||
resolver.resolve(ClearingMessage.WithdrawalFreeFromTkr, locale, tcr.getCode()) :
|
||||
resolver.resolve(ClearingMessage.WithdrawalOfFunds, locale);
|
||||
if (payload.getPaymentPurpose() != null) {
|
||||
String reqPmtPrpse = payload.getPaymentPurpose();
|
||||
if (!(reqPmtPrpse.endsWith(".") || reqPmtPrpse.endsWith("!") || reqPmtPrpse.endsWith("?") || reqPmtPrpse.endsWith(";"))) {
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@ import java.util.Optional;
|
|||
import ru.clearing.classes.statics.data.account.Account;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.company.relation.Relation;
|
||||
import ru.clearing.classes.statics.data.misc.Session;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||
import ru.spcex.clearing.error.ClearingError;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.platform.enumeration.Section;
|
||||
import ru.spcex.platform.enumeration.ServiceStatus;
|
||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
|
|
@ -42,11 +42,14 @@ public enum RegistryStep3ValidationRule implements IValidationRule<ImdgValidatio
|
|||
return of(ClearingError.ClearingUnavailableForCompany, validatedObject.getSection());
|
||||
}
|
||||
Imdg<Relation> relationImdg = context.obtainMap(IMDGDistributedNames.Map_Relation, Relation.class);
|
||||
Imdg<Session> sessionImdg = context.obtainMap(IMDGDistributedNames.Map_Session, Session.class);
|
||||
//Session activeSession = sessionImdg.getSingleObjectByID(validatedObject.getSessionId());
|
||||
String section = validatedObject.getSection();
|
||||
Section sctn = IEnumKey.getEnumByKey(Section.class, validatedObject.getSection());
|
||||
if (Section.CURR.equals(sctn)) {
|
||||
section = Section.MKR.getKey();
|
||||
}
|
||||
Relation relation = relationImdg.getFirstObjectByFieldValues(Map.of(
|
||||
"consumerId", validatedObject.getCompanyId(),
|
||||
"service", validatedObject.getSection()));
|
||||
"service", section));
|
||||
if (relation == null || (!ServiceStatus.Active.equalsByKey(relation.getServiceStatus()) && !ServiceStatus.Reopened.equalsByKey(relation.getServiceStatus()))) {
|
||||
return of(ClearingError.ClearingUnavailableForCompany, validatedObject.getSection(), validatedObject.getCompanyId());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -171,8 +171,8 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
|
|||
.cm_t(cm_t)
|
||||
.tranAcc(tranAcc)
|
||||
.sessionId(sessionId)
|
||||
.paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry())
|
||||
.paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry())
|
||||
.paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry() + " по итогу клиринга")
|
||||
.paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry() + " по итогу клиринга")
|
||||
.currency(lm_t.getSecuritySymbol())
|
||||
.build();
|
||||
Pair.forEach(pmts, paymentInstructionImdg::insert);
|
||||
|
|
@ -231,8 +231,8 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
|
|||
.cm_t(cm_t)
|
||||
.tranAcc(tranAcc)
|
||||
.sessionId(sessionId)
|
||||
.paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry())
|
||||
.paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry())
|
||||
.paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry() + " по итогу клиринга")
|
||||
.paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry() + " по итогу клиринга")
|
||||
.currency(lm_t.getSecuritySymbol())
|
||||
.build();
|
||||
Pair.forEach(pmts, paymentInstructionImdg::insert);
|
||||
|
|
|
|||
|
|
@ -204,8 +204,8 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
|
|||
.cm_t(cm_t)
|
||||
.tranAcc(tranAcc)
|
||||
.sessionId(sessionId)
|
||||
.paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry())
|
||||
.paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry())
|
||||
.paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry() + " по итогу клиринга")
|
||||
.paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry() + " по итогу клиринга")
|
||||
.currency(lm_t.getSecuritySymbol())
|
||||
.build();
|
||||
Pair.forEach(pmts, paymentInstructionImdg::insert);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
package ru.spcex.clearing.util;
|
||||
|
||||
import java.util.Locale;
|
||||
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 boolean isRus(Locale locale) {
|
||||
return ru.equals(locale);
|
||||
}
|
||||
|
||||
public static Locale locale(Account acc) {
|
||||
if (CurrencyCode.isRub(acc.getCurrency())) {
|
||||
return ru;
|
||||
} else {
|
||||
return eng;
|
||||
}
|
||||
}
|
||||
|
||||
public static Locale locale(String... currencyCode) {
|
||||
for (String s : currencyCode) {
|
||||
if (CurrencyCode.isRub(s)) {
|
||||
return ru;
|
||||
}
|
||||
}
|
||||
return eng;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
payment-instruction.purpose.withdrawal.tcr=Debt free cash withdrawal from TKR {0}.
|
||||
payment-instruction.purpose.withdrawal=Debt free cash withdrawal.
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
payment-instruction.purpose.withdrawal.tcr=Возврат средств, свободных от обязательств с ТКР {0}.
|
||||
payment-instruction.purpose.withdrawal=Вывод средств.
|
||||
|
|
@ -1,5 +1,9 @@
|
|||
package ru.spcex.clearing.swt.exporter.services.exportimpl;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
import com.hazelcast.aws.utility.StringUtil;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.misc.Session;
|
||||
|
|
@ -15,11 +19,7 @@ import ru.spcex.platform.enumeration.Section;
|
|||
import ru.spcex.platform.enumeration.SessionType;
|
||||
import ru.spcex.platform.enumeration.SwtTable;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
|
||||
|
||||
@Service
|
||||
|
|
@ -41,10 +41,10 @@ public class DF12Exporter extends AbstractExporterService<SDf12> {
|
|||
@Override
|
||||
protected String sectionForFileName(SwtExporterRequest req) {
|
||||
Session session = session(req);
|
||||
if (!Section.FOND.equalsByKey(session.getSection())) {
|
||||
throw new IllegalStateException("%s is only processed for FOND section".formatted(typeForFileName()));
|
||||
if (!IEnumKey.contains(session.getSection(), Section.FOND, Section.MULT)) {
|
||||
throw new IllegalStateException("%s is only processed for FOND/MULT section".formatted(typeForFileName()));
|
||||
}
|
||||
if (SessionType.TRDT.equalsByKey(session.getSessionType())) {
|
||||
if (SessionType.TRDT.equalsByKey(session.getSessionType()) || SessionType.UNIT.equalsByKey(session.getSessionType())) {
|
||||
return "fund";
|
||||
}
|
||||
return "bond";
|
||||
|
|
|
|||
|
|
@ -0,0 +1,41 @@
|
|||
package ru.spcex.platform.utils.localization;
|
||||
|
||||
import java.util.Locale;
|
||||
import org.springframework.context.support.ResourceBundleMessageSource;
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
|
||||
/**
|
||||
* Если в зависимостях не будет spring-context, кинет NoClassDefFound
|
||||
*/
|
||||
public class SpringPropertiesLocalizer {
|
||||
private final ResourceBundleMessageSource errorMessages;
|
||||
private Locale defaultLocale;
|
||||
|
||||
public SpringPropertiesLocalizer(ResourceBundleMessageSource errorMessages) {
|
||||
this.errorMessages = errorMessages;
|
||||
this.defaultLocale = Locale.ENGLISH;
|
||||
}
|
||||
|
||||
public void setDefaultLocale(String defaultLocale) {
|
||||
this.defaultLocale = new Locale(defaultLocale);
|
||||
}
|
||||
|
||||
public String resolve(IEnumKey msg, Locale locale, Object... args) {
|
||||
return errorMessages.getMessage(msg.getKey(), args, locale);
|
||||
}
|
||||
|
||||
public String resolve(IEnumKey msg, Object... args) {
|
||||
return errorMessages.getMessage(msg.getKey(), args, defaultLocale);
|
||||
}
|
||||
|
||||
// public String resolve(EnumMessage errorMessage, Locale locale) {
|
||||
// Long id = errorMessage.getSubject().getId();
|
||||
// return errorMessages.getMessage(id.toString(), errorMessage.getArgs(), locale);
|
||||
//String messageTemplate =
|
||||
// if (errorMessage.getArgs().length > 0)
|
||||
// return String.format(messageTemplate, errorMessage.getArgs());
|
||||
// else {
|
||||
// return messageTemplate;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue