Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionCreator.java
This commit is contained in:
ialbert 2023-02-06 18:31:06 +03:00
commit 0e8ea7b595
4 changed files with 103 additions and 64 deletions

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?-->
<meta version="2.4.0.10">
<meta version="2.4.0.11">
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
<!--Здесь словари-->
<enums>
@ -1150,8 +1150,8 @@
<operationStatus type="12" name="Cтатус обработки" shortname="Статус" searchable="true" sortable="true" link="operationStatus"/>
</operation>
<paymentInstruction name="Платежные поручения" destination="payment-instructions" class="ru.clearing.classes.statics.data.payment.PaymentInstruction" table="payment_instruction">
<senderId type="1" name="Наименование участника отправителя" shortname="Отправитель" searchable="true" sortable="true" link="company"/>
<addresseeId type="1" name="Наименование участника получателя" shortname="Получатель" searchable="true" sortable="true" link="company"/>
<senderId type="1" name="Наименование участника отправителя" shortname="Отправитель" searchable="true" sortable="true" link="company" linkCode="shortName"/>
<addresseeId type="1" name="Наименование участника получателя" shortname="Получатель" searchable="true" sortable="true" link="company" linkCode="shortName"/>
<adresseeBic type="2" length="255" name="Банковский идентификационный код (БИК) получателя" shortname="БИК получателя" searchable="true" sortable="true" visible="true"/>
<payeeBankName type="2" length="255" name="Наименование банка отправителя" shortname="Банк отправителя" searchable="true" sortable="true" visible="true"/>
<payeeBic type="2" length="255" name="Банковский идентификационный код (БИК) отправителя" shortname="БИК отправителя" searchable="true" sortable="true" visible="true"/>
@ -1171,7 +1171,7 @@
<debitLeg_direction field="debitLegDirection" type="1" name="Направление получателя" shortname="Направление получателя" searchable="true" sortable="true" link="inOutDirection" ignore="true"/>
<creditLeg_currencyCode field="creditLegCurrencyCode" type="12" name="Код валюты отправителя" shortname="Валюта отправителя" searchable="true" sortable="true" visible="true" link="currency"/>
<debitLeg_currencyCode field="debitLegCurrencyCode" type="12" name="Код валюты получателя" shortname="Валюта получателя" searchable="true" sortable="true" visible="true" link="currency"/>
<transactionStatus type="12" name="Cтатус транзакции" shortname="Статус" searchable="true" sortable="true" visible="true" link="transactionStatus"/>
<transactionStatus type="12" name="Cтатус транзакции" shortname="Статус" searchable="true" sortable="true" visible="true" link="transactionStatus" ignore="true"/>
<documentNumber type="2" length="255" name="Номер документа в сторонней системе" shortname="Номер РО" searchable="true" sortable="true"/>
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
<createdAt field="created" type="4" name="Дата и время создания записи" shortname="Создано" searchable="true" sortable="true" ignore="true"/>

View file

@ -125,4 +125,23 @@ public class LiabilitiesClaimsMoney extends BusinessObject {
public void setClearingDate(LocalDate clearingDate) {
this.clearingDate = clearingDate;
}
@Override
public String toString() {
return "LiabilitiesClaimsMoney{" +
"companyId=" + companyId +
", accountId=" + accountId +
", accountType='" + accountType + '\'' +
", account='" + account + '\'' +
", liabilitiesAmount=" + liabilitiesAmount +
", claimsAmount=" + claimsAmount +
", settlementDate=" + settlementDate +
", tradingDate=" + tradingDate +
", currency='" + currency + '\'' +
", tradingCode='" + tradingCode + '\'' +
", shortName='" + shortName + '\'' +
", fullName='" + fullName + '\'' +
", clearingDate=" + clearingDate +
'}';
}
}

View file

@ -208,6 +208,7 @@ public class Clearing {
wrapperFirstLegCreated.firstLegCreated = lcmFirstLeg;
});
Optional<LiabilitiesClaimsMoney> lcmSecondLegFound = lbltsClmsMoneyCreator.searchLcmByRefundDate(lca.getAccountId(), lca.getCompanyId(), lca.getRefundDate());
var wrapperSecondLegCreated = new Object() {LiabilitiesClaimsMoney secondLegCreated;};
lcmSecondLegFound.ifPresentOrElse(lcm -> {
log.trace("LiabilitiesClaimsMoney second leg {} was found", lcm.getId());
lbltsClmsMoneyCreator.updateSecondLegLcm(lcm, lca, category);
@ -216,6 +217,7 @@ public class Clearing {
LiabilitiesClaimsMoney lcmSecondLeg = lbltsClmsMoneyCreator.createSecondLegLcm(lca, category);
liabilitiesClaimsMoneyImdg.insert(lcmSecondLeg);
log.trace("LiabilitiesClaimsMoney second leg {} was created", lcmSecondLeg.getId());
wrapperSecondLegCreated.secondLegCreated = lcmSecondLeg;
});
lbltsClmsAssetsCreator.updateLca(lca, lcmFirstLegFound.orElse(wrapperFirstLegCreated.firstLegCreated));
liabilitiesClaimsAssetsImdg.update(lca);
@ -225,10 +227,15 @@ public class Clearing {
paymentInstructionCreator.updateFieldLiabilitiesClaimsAssetsByPayment(lca, paymentInstructions, Collections.singleton(category));
liabilitiesClaimsAssetsImdg.update(lca);
var firstLegLiabilitiesClaimsMoney = lcmFirstLegFound.orElseGet(() -> wrapperFirstLegCreated.firstLegCreated);
var secondLegLiabilitiesClaimsMoney = lcmSecondLegFound.orElseGet(() -> wrapperSecondLegCreated.secondLegCreated);
log.trace("updating LiabilitiesClaimsMoney by payment");
paymentInstructionCreator.updateFieldLiabilitiesClaimsMoneyByPayment(firstLegLiabilitiesClaimsMoney, paymentInstructions, Collections.singleton(category));
log.trace("firstLegLiabilitiesClaimsMoney: {}; secondLegLiabilitiesClaimsMoney: {}", firstLegLiabilitiesClaimsMoney, secondLegLiabilitiesClaimsMoney);
paymentInstructionCreator.updateFieldLiabilitiesClaimsMoneyByPayment(firstLegLiabilitiesClaimsMoney, true, paymentInstructions, Collections.singleton(category));
liabilitiesClaimsMoneyImdg.update(firstLegLiabilitiesClaimsMoney);
log.trace("LiabilitiesClaimsMoney first leg {} was updated", firstLegLiabilitiesClaimsMoney.getId());
paymentInstructionCreator.updateFieldLiabilitiesClaimsMoneyByPayment(secondLegLiabilitiesClaimsMoney, false, paymentInstructions, Collections.singleton(category));
liabilitiesClaimsMoneyImdg.update(secondLegLiabilitiesClaimsMoney);
log.trace("LiabilitiesClaimsMoney first leg {}, second leg {} was updated", firstLegLiabilitiesClaimsMoney.getId(), secondLegLiabilitiesClaimsMoney.getId());
log.trace("firstLegLiabilitiesClaimsMoney: {}; secondLegLiabilitiesClaimsMoney: {}", firstLegLiabilitiesClaimsMoney, secondLegLiabilitiesClaimsMoney);
execDeposit.setSessionId(clearingSessionId);
execDeposit.setUpdated(Instant.now());
executionDepositImdg.update(execDeposit);

View file

@ -7,6 +7,7 @@ import org.springframework.stereotype.Service;
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.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsMoney;
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
@ -28,6 +29,8 @@ import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
/*
todo использовать так:
paymentInstructionCreator.createAndSavePaymentInstructions()
@ -50,6 +53,7 @@ public class PaymentInstructionCreator {
protected final Imdg<Account> accountImdg;
protected final Imdg<PaymentInstruction> paymentInstructionImdg;
protected final Imdg<LiabilitiesClaimsMoney> liabilitiesClaimsMoneyImdg;
protected final Imdg<ExecutionDeposit> executionDepositImdg;
protected AtomicLong documentNumberId = new AtomicLong(0L); // порядковый номер (сквозной по всем компаниям за день
protected LocalDate documentNumberResetAt;
@ -62,11 +66,13 @@ public class PaymentInstructionCreator {
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.liabilitiesClaimsMoneyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsMoney, LiabilitiesClaimsMoney.class);
this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
this.idGenerator = imdgProvider.getImdgIdGenerator();
}
/**
* 2.2.2. Выполнить Создание paymentInstruction по liabilitiesClaimsAssets
*
* @return Созданные PaymentInstruction, может быть несколько. Они уже сохранены в IMDG.
*/
public List<PaymentInstruction> createAndSavePaymentInstructions(LiabilitiesClaimsAssets liabilitiesClaimsAssets,
@ -109,13 +115,13 @@ public class PaymentInstructionCreator {
payment2.setSenderId(SPVB_ID); // СПВБ
payment1.setAddresseeId(SPVB_ID); // СПВБ
String sqlLCA = String.format("securityId = %s and companyId <> %s",
String sqlLCA = String.format("securityId = %s and companyId != %s",
liabilitiesClaimsAssets.getSecurityId(), liabilitiesClaimsAssets.getCompanyId());
LiabilitiesClaimsAssets counterLiabilitiesClaimsAssets = liabilitiesClaimsAssetsImdg.getSingleObjectBySQL(sqlLCA);
if (counterLiabilitiesClaimsAssets == null) {
log.warn("Counter LiabilitiesClaimsAssets not found for : {}", sqlLCA);
ExecutionDeposit counterExecutionDeposit = executionDepositImdg.getSingleObjectBySQL(sqlLCA);
if (counterExecutionDeposit == null) {
log.warn("Counter ExecutionDeposit not found for : {}", sqlLCA);
} else {
payment2.setAddresseeId(counterLiabilitiesClaimsAssets.getCompanyId());
payment2.setAddresseeId(counterExecutionDeposit.getCompanyId());
}
String symbol1 = selectSymbolValue(payment1.getAddresseeId(), CompanySymbol.BIC);
@ -233,13 +239,13 @@ public class PaymentInstructionCreator {
payment1.setSenderId(SPVB_ID); // СПВБ
String sqlLCA = String.format("securityId = %s and companyId <> %s",
String sqlLCA = String.format("securityId = %s and companyId != %s",
liabilitiesClaimsAssets.getSecurityId(), liabilitiesClaimsAssets.getCompanyId());
LiabilitiesClaimsAssets counterLiabilitiesClaimsAssets = liabilitiesClaimsAssetsImdg.getSingleObjectBySQL(sqlLCA);
if (counterLiabilitiesClaimsAssets == null) {
log.warn("Counter LiabilitiesClaimsAssets not found for : {}", sqlLCA);
ExecutionDeposit counterExecutionDeposit = executionDepositImdg.getSingleObjectBySQL(sqlLCA);
if (counterExecutionDeposit == null) {
log.warn("Counter ExecutionDeposit not found for : {}", sqlLCA);
} else {
payment1.setAddresseeId(counterLiabilitiesClaimsAssets.getCompanyId());
payment1.setAddresseeId(counterExecutionDeposit.getCompanyId());
}
String symbol1 = selectSymbolValue(payment1.getAddresseeId(), CompanySymbol.BIC);
@ -414,6 +420,9 @@ public class PaymentInstructionCreator {
}
protected String selectSymbolValue(Long companyId, CompanySymbol symbol) {
if (companyId == null) {
return null;
}
CompanySymbols cSymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of(
"companyId", companyId,
"companySymbol", symbol.getKey()));
@ -425,6 +434,9 @@ public class PaymentInstructionCreator {
}
protected Account selectAccount(Long companyId, AccountType accountType, Status accountStatus, Allowed processingSign) {
if (companyId == null) {
return null;
}
Account account = accountImdg.getSingleObjectByFieldValues(Map.of(
"companyId", companyId,
"accountType", accountType.getKey(),
@ -439,29 +451,31 @@ public class PaymentInstructionCreator {
* 2.2.2.1. Выполнить Изменение liabilitiesClaimsAssets по paymentInstruction.
*/
public void updateFieldLiabilitiesClaimsAssetsByPayment(LiabilitiesClaimsAssets liabilitiesClaimsAssets,
List<PaymentInstruction> paymentInstructions,
Collection<ClearingCategory> clearingCategory) {
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, liabilitiesClaimsAssets.getAccountType());
PaymentInstruction paymentIAny=paymentInstructions.iterator().next();
List<PaymentInstruction> paymentInstructions,
Collection<ClearingCategory> clearingCategory) {
if ((clearingCategory.contains(ClearingCategory.I) && AccountType.Clrn.equals(accountType))
|| (clearingCategory.contains(ClearingCategory.V) && AccountType.Info.equals(accountType))) {
BigDecimal amount = paymentIAny.getCreditLegAmount() == null ? BigDecimal.ZERO : new BigDecimal(paymentIAny.getCreditLegAmount());
BigDecimal prevLQuantity = BigDecimalUtil.safeBD(liabilitiesClaimsAssets.getLiabilitiesQuantity());
liabilitiesClaimsAssets.setLiabilitiesQuantity(prevLQuantity.subtract(amount));
PaymentInstruction paymentIAny = paymentInstructions.iterator().next();
if (clearingCategory.contains(ClearingCategory.I) || clearingCategory.contains(ClearingCategory.V)) {
BigDecimal amount = bdFromLongSafe(paymentIAny.getCreditLegAmount());
// При обновлении (по paymentInstruction и категория I и счет CLRN):=liabilitiesClaimsAssets.liabilitiesQuantity - paymentInstruction.creditLeg_amount
// При обновлении (по paymentInstruction и категория V и счет INFO):=liabilitiesClaimsAssets.liabilitiesQuantity - paymentInstruction.creditLeg_amount
amount = liabilitiesClaimsAssets.getLiabilitiesQuantity().subtract(amount);
liabilitiesClaimsAssets.setLiabilitiesQuantity(amount);
}
if (clearingCategory.contains(ClearingCategory.B) && AccountType.Clrn.equals(accountType)) {
BigDecimal amount = paymentIAny.getCreditLegAmount() == null ? BigDecimal.ZERO : new BigDecimal(paymentIAny.getCreditLegAmount());
if (clearingCategory.contains(ClearingCategory.B)) {
BigDecimal amount = bdFromLongSafe(paymentIAny.getCreditLegAmount());
// При обновлении (по paymentInstruction и категория B и счет CLRN): из paymentInstruction.creditLeg_amount
liabilitiesClaimsAssets.setLiabilitiesQuantity(amount);
}
if (clearingCategory.contains(ClearingCategory.I) || clearingCategory.contains(ClearingCategory.V)) {
BigDecimal amount = new BigDecimal((Long)paymentIAny.getDebitLegAmount());
BigDecimal amount = bdFromLongSafe(paymentIAny.getDebitLegAmount());
liabilitiesClaimsAssets.setClaimsQuantity(amount);
}
if (clearingCategory.contains(ClearingCategory.B)) {
BigDecimal amount = new BigDecimal((Long)paymentIAny.getDebitLegAmount());
amount = liabilitiesClaimsAssets.getClaimsQuantity().subtract(amount);
BigDecimal amount = bdFromLongSafe(paymentIAny.getDebitLegAmount());
amount = safeBD(liabilitiesClaimsAssets.getClaimsQuantity()).subtract(amount);
liabilitiesClaimsAssets.setClaimsQuantity(amount);
}
@ -478,56 +492,55 @@ public class PaymentInstructionCreator {
/**
* 2.2.2.2. Выполнить Изменение liabilitiesClaimsMoney по paymentInstruction.
*/
public LiabilitiesClaimsMoney updateLiabilitiesClaimsMoneyByPaymentInstruction(LiabilitiesClaimsAssets liabilitiesClaimsAssets,
List<PaymentInstruction> paymentInstructions,
Collection<ClearingCategory> clearingCategory) {
Long lmId = liabilitiesClaimsAssets.getLiabilitiesClaimsMoneyId();
log.debug("Update LiabilitiesClaimsMoney[{}] by paymentInstructions {}", lmId, paymentInstructions.stream().map(SpcexObjectBase::getId).collect(Collectors.toList()));
LiabilitiesClaimsMoney liabilitiesClaimsMoney = liabilitiesClaimsMoneyImdg.getSingleObjectByID(lmId); // update data for update
if (liabilitiesClaimsMoney == null) {
throw new RuntimeException("IMDG not found LiabilitiesClaimsMoney.id=" + lmId);
}
if (!Objects.equals(liabilitiesClaimsMoney.getSettlementDate(), liabilitiesClaimsAssets.getSettlementDate())) {
log.warn("Date not match: LiabilitiesClaimsMoney[{}].settlementDate={} and LiabilitiesClaimsAssets[{}].settlementDate={}. It is first leg?",
liabilitiesClaimsMoney.getId(), liabilitiesClaimsMoney.getSettlementDate(), liabilitiesClaimsAssets.getId(), liabilitiesClaimsAssets.getSettlementDate()
);
}
updateFieldLiabilitiesClaimsMoneyByPayment(liabilitiesClaimsMoney, paymentInstructions, clearingCategory);
liabilitiesClaimsMoneyImdg.update(liabilitiesClaimsMoney);
return liabilitiesClaimsMoney;
}
/**
* Обновление liabilitiesClaimsMoney первой ноги по liabilitiesClaimsAssets
* Обновление liabilitiesClaimsMoney первой/второй ноги по liabilitiesClaimsAssets
*
* @param liabilitiesClaimsMoney обновить этот объект (firstLeg)
* @param isFirstLeg true - первая, false вторая
* @param paymentInstructions
* @param clearingCategory
* @return были внесены изменения в liabilitiesClaimsMoney
*/
public boolean updateFieldLiabilitiesClaimsMoneyByPayment(LiabilitiesClaimsMoney liabilitiesClaimsMoney,
List<PaymentInstruction> paymentInstructions,
Collection<ClearingCategory> clearingCategory) {
boolean isFirstLeg,
List<PaymentInstruction> paymentInstructions,
Collection<ClearingCategory> clearingCategory) {
final boolean isSecondLeg = !isFirstLeg;
boolean modified = false;
PaymentInstruction paymentIAny=paymentInstructions.iterator().next();
PaymentInstruction paymentIAny = paymentInstructions.iterator().next();
if ((clearingCategory.contains(ClearingCategory.I) || clearingCategory.contains(ClearingCategory.V))) {
BigDecimal amount = liabilitiesClaimsMoney.getLiabilitiesAmount().subtract(new BigDecimal((Long)paymentIAny.getCreditLegAmount()));
liabilitiesClaimsMoney.setLiabilitiesAmount(amount);
modified = true;
if (clearingCategory.contains(ClearingCategory.I) || clearingCategory.contains(ClearingCategory.V)) {
if (isFirstLeg) {
BigDecimal amount = safeBD(liabilitiesClaimsMoney.getLiabilitiesAmount()).subtract(bdFromLongSafe(paymentIAny.getCreditLegAmount()));
liabilitiesClaimsMoney.setLiabilitiesAmount(amount);
modified = true;
}
if (isSecondLeg) {
// liabilitiesAmount не меняется
}
}
if ((clearingCategory.contains(ClearingCategory.B))) {
BigDecimal amount = liabilitiesClaimsMoney.getClaimsAmount().subtract(new BigDecimal((Long)paymentIAny.getDebitLegAmount()));
liabilitiesClaimsMoney.setClaimsAmount(amount);
modified = true;
if (clearingCategory.contains(ClearingCategory.B)) {
if (isFirstLeg) {
// liabilitiesAmount не меняется ;
}
if (isSecondLeg) {
BigDecimal amount = safeBD(liabilitiesClaimsMoney.getClaimsAmount()).subtract(bdFromLongSafe(paymentIAny.getDebitLegAmount()));
liabilitiesClaimsMoney.setClaimsAmount(amount);
modified = true;
}
}
if (modified) {
liabilitiesClaimsMoney.setUpdated(Instant.now());
}
log.debug("updateFieldLiabilitiesClaimsMoneyByPayment: isFirstLeg={}, isSecondLeg={}, modified={}, LiabilitiesClaimsMoney.id={}",
isFirstLeg, isSecondLeg, modified, liabilitiesClaimsMoney.getId());
return modified;
}
private BigDecimal bdFromLongSafe(Long l) {
if (l == null) return BigDecimal.ZERO;
return new BigDecimal(l);
}
}