Merge branch 'master' into dev

This commit is contained in:
ialbert 2025-06-24 17:45:43 +03:00
commit ec3aa6a617
77 changed files with 401 additions and 218 deletions

View file

@ -24,6 +24,7 @@ preflight:
paths:
- clearing_test
only:
- master
- dev
- /^dev_.*$/
- new
@ -40,6 +41,7 @@ build:
paths:
- /builds/mfd/clearing/z-distr/target/clearing
only:
- master
- dev
- /^dev_.*$/
- new
@ -66,6 +68,7 @@ test:
paths:
- artifacts/logs
only:
- master
- dev
- /^dev_.*$/
- new

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -11,7 +11,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>

View file

@ -26,12 +26,15 @@ public class ChangeRefundDateActionNew implements IAction<RegistryChangeRefundDa
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
public LocalDate refundDate;
@JsonProperty
public String market;
@Override
public RegistryChangeRefundDateRequest toRequest() {
var req = new RegistryChangeRefundDateRequest();
req.setGroupId(groupId);
req.setRefundDate(refundDate);
req.setMarket(market);
return req;
}
@ -68,4 +71,12 @@ public class ChangeRefundDateActionNew implements IAction<RegistryChangeRefundDa
public void setRefundDate(LocalDate refundDate) {
this.refundDate = refundDate;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -4,21 +4,13 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDepositActionRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActionRequest> {
@ -39,6 +31,8 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
@ApiModelProperty(value = "Направление", example = "OUT")
@JsonProperty
public String direction;
@JsonProperty
public String market;
@Override
@ -49,6 +43,7 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
req.setRefundDate(this.refundDate);
req.setContract(this.contract);
req.setDirection(this.direction);
req.setMarket(this.market);
return req;
}
@ -97,4 +92,12 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
public void setDirection(String direction) {
this.direction = direction;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -22,12 +22,15 @@ public class ReturnDepositActionNew implements IAction<RegistryReturnDepositRequ
@ApiModelProperty(value = "Сумма", example = "1600.20")
@JsonProperty
public BigDecimal balance;
@JsonProperty
public String market;
@Override
public RegistryReturnDepositRequest toRequest() {
var req = new RegistryReturnDepositRequest();
req.setId(id);
req.setBalance(balance);
req.setMarket(market);
return req;
}
@ -65,4 +68,12 @@ public class ReturnDepositActionNew implements IAction<RegistryReturnDepositRequ
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -1,6 +1,6 @@
{
"version": "3.18.242.132",
"version": "3.18.244.133",
"enums": {
@ -4597,6 +4597,10 @@
{"code": "section",
"type": 12,"dbname": "Код секции","name": "Наименование секции","shortname": "Секция","searchable": true,"sortable": true,"visible": true,"link": "section"
}
,
{"code": "market",
"type": 2,"length": 8,"dbname": "Код класса инструмента","name": "Код класса","shortname": "Код","visible": false,"searchable": true,"sortable": true
}
]
,"actions":[
{"method":"post",
@ -4652,6 +4656,10 @@
{"code": "balance",
"type": 10,"name": "Сумма","shortname": "Сумма","required": true
}
,
{"code": "market",
"type": 2,"length": 8,"name": "Код класса","shortname": "Код","visible": false
}
]
}
,
@ -4710,6 +4718,10 @@
{"code": "refundDate",
"type": 6,"name": "Дата возврата депозита","shortname": "Возврат депозита","visible": true,"enabled": true
}
,
{"code": "market",
"type": 2,"length": 8,"name": "Код класса","shortname": "Код","visible": false
}
]
}
,
@ -6714,7 +6726,7 @@
}
,
{"code": "exchangeExecutionMicroseconds",
"type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true
"type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true,"ignore": true
}
,
{"code": "coverageStatus",
@ -6750,7 +6762,7 @@
}
,
{"code": "exchangeExecutionMicroseconds",
"type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true
"type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true,"ignore": true
}
,
{"code": "tradingDate",

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="3.18.242.132">
<meta version="3.18.244.133">
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
<!--Здесь словари-->
<enums>
@ -1070,6 +1070,7 @@
<updatedAt field="updated" type="4" name="Дата и время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
<securityId type="1" dbname="Идентификатор инструмента" name="Код инструмента" shortname="Код инструмента" searchable="false" sortable="true" visible="false" link="security" linkCode="shortName"/>
<section type="12" dbname="Код секции" name="Наименование секции" shortname="Секция" searchable="true" sortable="true" visible="true" link="section"/>
<market type="2" length="8" dbname="Код класса инструмента" name="Код класса" shortname="Код" visible="false" searchable="true" sortable="true"/>
<actions>
<post name="Разделение депозита" destination="registries/splitDeposit" confirmation="contract,outboundAmount,refundDate" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.RSplitDepositActionNew">
<companyId type="1" name="Наименование участника" shortname="Инициатор" link="company" linkCode="shortName" enabled="false"/>
@ -1082,6 +1083,7 @@
<post name="Отметить средства на возврат депозита" destination="registries/returnDeposit" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.ReturnDepositActionNew">
<id type="1" name="Регистр требований" shortname="Регистр требований" required="true" enabled="false" visible="false"/>
<balance type="10" name="Сумма" shortname="Сумма" required="true"/>
<market type="2" length="8" name="Код класса" shortname="Код" visible="false"/>
</post>
<post name="Идентификация неразмеченных средств" destination="registries/identificationFunds" confirmation="securitySymbol,balance,tradingClearingRegistryId" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.IdentificationFundsActionNew">
<id type="1" name="Идентификатор записи" shortname="ID" link="registry" linkCode="id" required="true"/>
@ -1094,6 +1096,7 @@
<groupId type="1" dbname="Идентификатор группы связанных регистров" name="Идентификатор группы" required="true" enabled="false" visible="false"/>
<contract type="2" length="255" name="Договор" shortname="Номер договора" required="true" enabled="false"/>
<refundDate type="6" name="Дата возврата депозита" shortname="Возврат депозита" visible="true" enabled="true"/>
<market type="2" length="8" name="Код класса" shortname="Код" visible="false"/>
</put>
<put name="Установить отметку о получении выписки" destination="registries/changeStatusExtract" confirmation="shortName,contract,balance" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeStatusExtractActionNew">
<id type="1" name="Идентификатор записи" shortname="ID" link="registry" linkCode="id" required="true"/>
@ -1557,14 +1560,14 @@
<securityFullName type="2" length="255" name="Наименование инструмента" shortname="Инструмент" visible="true" searchable="true" sortable="true"/>
<settlementDate type="6" name="Дата расчетов" shortname="Дата расчетов" visible="true" searchable="true" sortable="true"/>
<settlementCurrency type="12" dbname="Код валюты расчетов по инструменту" name="Валюта расчетов по инструменту" shortname="Валюта" visible="true" searchable="true" sortable="true" link="currencyCode" linkCode="code"/>
<exchangeExecutionMicroseconds type="4" name="Микросекунды заключения сделки в Торговой системе" shortname="Микросекунды заключения сделки" visible="true" searchable="true" sortable="true"/>
<exchangeExecutionMicroseconds type="4" name="Микросекунды заключения сделки в Торговой системе" shortname="Микросекунды заключения сделки" visible="true" searchable="true" sortable="true" ignore="true"/>
<coverageStatus type="12" dbname="Код статуса достаточности обеспечения" name="Статус достаточности обеспечения" shortname="Обеспеченность" searchable="true" sortable="true" link="allowed"/>
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/>
</executionFond>
<executionCurrency name="Сделки с валютными инструментами" destination="execution-currency" class="ru.clearing.classes.statics.data.execution.ExecutionCurrency" logUpdates="true" table="execution_currency">
<exchangeExecutionId type="1" name="Идентификационный номер сделки в Торговой системе" shortname="Номер сделки" visible="true" searchable="true" sortable="true"/>
<exchangeExecutionTime type="4" name="Время заключения сделки в Торговой системе" shortname="Время заключения сделки" visible="true" searchable="true" sortable="true"/>
<exchangeExecutionMicroseconds type="4" name="Микросекунды заключения сделки в Торговой системе" shortname="Микросекунды заключения сделки" visible="true" searchable="true" sortable="true"/>
<exchangeExecutionMicroseconds type="4" name="Микросекунды заключения сделки в Торговой системе" shortname="Микросекунды заключения сделки" visible="true" searchable="true" sortable="true" ignore="true"/>
<tradingDate type="6" name="Дата заключения сделки" shortname="Дата заключения сделки" visible="true" searchable="true" sortable="true"/>
<settlementDate type="6" name="Дата расчетов" shortname="Дата расчетов" visible="true" searchable="true" sortable="true"/>
<settlementCode type="2" length="12" name="Код расчетов при размещении" shortname="Код расчетов при размещении" visible="false" searchable="true" sortable="true" ignore="true"/>

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -12,7 +12,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<properties>

View file

@ -61,6 +61,7 @@ public class Registry extends BusinessObject implements Cloneable {
private String sessionType;
private Long paymentId;
private String section;
private String market;
public Long getCompanyId() {
return companyId;
@ -444,6 +445,14 @@ public class Registry extends BusinessObject implements Cloneable {
this.section = section;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
@Override
public Registry clone() {
try {

View file

@ -6,13 +6,13 @@
<parent>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<artifactId>cleaning-builders</artifactId>
<name>cleaning-builders</name>
<description>Cleaning builders module</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<packaging>jar</packaging>
@ -26,7 +26,7 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -0,0 +1,18 @@
package ru.spcex.clearing.component;
import java.util.Objects;
public record GroupRgsKey(Long groupId, String market) {
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GroupRgsKey that = (GroupRgsKey) o;
return Objects.equals(groupId, that.groupId) && Objects.equals(market, that.market);
}
@Override
public int hashCode() {
return Objects.hash(groupId, market);
}
}

View file

@ -0,0 +1,13 @@
package ru.spcex.clearing.component;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import ru.clearing.classes.statics.data.registry.Registry;
public class GroupRgsKeyComparator implements Comparator<Map.Entry<GroupRgsKey, List<Registry>>> {
@Override
public int compare(Map.Entry<GroupRgsKey, List<Registry>> o1, Map.Entry<GroupRgsKey, List<Registry>> o2) {
return o1.getKey().groupId().compareTo(o2.getKey().groupId());
}
}

View file

@ -4,14 +4,19 @@ import java.time.LocalDate;
import java.util.Objects;
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
public record ExecUploadKey(LocalDate tradeDate, Long exchangeExecutionId, String side) {
public record ExecUploadKey(LocalDate tradeDate, Long exchangeExecutionId, String market, String side) {
public static ExecUploadKey cash(LocalDate tradingDate, Long exchangeExecutionId, String side) {
return new ExecUploadKey(tradingDate, exchangeExecutionId, side);
public static ExecUploadKey cash(LocalDate tradingDate, Long exchangeExecutionId, String market, String side) {
return new ExecUploadKey(tradingDate, exchangeExecutionId, market, side);
}
public static ExecUploadKey cash(ExecutionCommon exec) {
return new ExecUploadKey(exec.getTradingDate(), exec.getExchangeExecutionId(), exec.getSide());
return new ExecUploadKey(
exec.getTradingDate(),
exec.getExchangeExecutionId(),
exec.getMarket(),
exec.getSide()
);
}
@Override

View file

@ -176,6 +176,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
// MoneyFlowSide excDepSide = sTrdSide == Side.BUY ? MoneyFlowSide.BUY : MoneyFlowSide.SELL;
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
sTrd.getTradeNum(),
sTrd.getClassCode(),
sTrdSide.getKey());
return cash.containsKey(excKey);
});

View file

@ -171,6 +171,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
MoneyFlowSide excDepSide = sTrdSide.equals(Side.BUY) ? MoneyFlowSide.BUY : MoneyFlowSide.SELL;
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
sTrd.getTradeNum(),
sTrd.getClassCode(),
excDepSide.getKey());
return cash.containsKey(excKey);
});

View file

@ -195,6 +195,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
Side excDepSide = sTrdSide.equals(Side.BUY) ? Side.BUY : Side.SELL;
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
sTrd.getTradeNum(),
sTrd.getClassCode(),
excDepSide.getKey());
return cash.containsKey(excKey);
});

View file

@ -14,6 +14,7 @@ import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanyRoleSet;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AssetTrio;
import ru.spcex.clearing.session.stage.util.RegistryUtil;
@ -56,15 +57,16 @@ public class PaymentStateMarkService {
pb.equals("registryStatus", RegistryStatus.OK.getKey())
);
Collection<Registry> claimsAndLiabilities = rgsImdg.getCollectionObjectsByPredicate(prdct);
Map<Long, List<Registry>> groups = claimsAndLiabilities
Map<GroupRgsKey, List<Registry>> groups = claimsAndLiabilities
.stream()
.filter(rgs -> rgs.getValueDate() != null)
.filter(rgs -> rgs.getSettlementDate() != null)
.filter(rgs -> rgs.getSettlementDate().equals(rgs.getValueDate()))
.collect(Collectors.groupingBy(Registry::getGroupId));
.collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())));
log.debug("found {} ({} groups) CM*T/LM*T by {}", claimsAndLiabilities.size(), groups.size(), prdct.toString());
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) {
Long groupId = group.getKey();
for (Map.Entry<GroupRgsKey, List<Registry>> group : groups.entrySet()) {
Long groupId = group.getKey().groupId();
String market = group.getKey().market();
Function<RegistryDesignation, Registry> findRgs = (rd) -> group.getValue()
.stream()
.filter(rgs -> rd.equalsByKey(rgs.getRegistryDesignation()))
@ -73,7 +75,7 @@ public class PaymentStateMarkService {
Registry cm_t = findRgs.apply(RegistryDesignation.T);
Registry lm_t = findRgs.apply(RegistryDesignation.O);
if (cm_t == null || lm_t == null) {
log.warn("groupId {}, coudn't find CM*T or LM*T", groupId);
log.warn("groupId/market {}/{}, coudn't find CM*T or LM*T", groupId, market);
continue;
}
CompanyRoleSet initRole = cmpRoleImdg.getFirstObjectBySQL(
@ -84,7 +86,8 @@ public class PaymentStateMarkService {
)
);
if (initRole == null) {
log.debug("groupId {}, initiator (lm*t.id={}) does not have ODEP role", groupId, lm_t.getId());
log.debug("groupId/market {}/{}, initiator (lm*t.id={}) does not have ODEP role", groupId,
market, lm_t.getId());
continue;
}
Registry dm_v = cm_t.clone();
@ -95,8 +98,8 @@ public class PaymentStateMarkService {
dm_v.setBalance(cm_t.getBalance());
dm_v.setRegistryStatus(RegistryStatus.PROC.getKey());
rgsImdg.insert(dm_v);
log.debug("groupId {}, lm*t.id={}, cm*t.id={} created dm*v.id={}",
groupId, lm_t.getId(), cm_t.getId(), dm_v.getId());
log.debug("groupId/market {}/{}, lm*t.id={}, cm*t.id={} created dm*v.id={}",
groupId, market, lm_t.getId(), cm_t.getId(), dm_v.getId());
Optional<AssetTrio> assetsFound = assets.searchMoneyByAccAndCompany(cm_t.getCompanyId(), cm_t.getAccountId());
assetsFound.ifPresent(assetTrio
-> assets.process(assetTrio.a__b(), assetTrio.a__t(), assetTrio.a__f(), BigDecimal.ZERO));

View file

@ -1,5 +1,9 @@
package ru.spcex.clearing.service.validation;
import java.util.Collection;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -12,11 +16,6 @@ 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
@ -39,6 +38,7 @@ public enum RefundDateValidationRule implements IValidationRule<ImdgValidationCo
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
ImdgPredicate prdct = pb.and(
pb.equals("groupId", validatedObject.getGroupId()),
pb.equals("market", validatedObject.getMarket()),
pb.or(
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
pb.equals("registryStatus", RegistryStatus.MNG.getKey()),
@ -55,8 +55,8 @@ public enum RefundDateValidationRule implements IValidationRule<ImdgValidationCo
.filter(rgs -> rgs.getRefundDate().equals(rgs.getSettlementDate()))
.collect(Collectors.toList());
if (rgss.size() < 1) {
return of(ClearingError.RecordNotFound, "groupId=" + validatedObject.getGroupId());
if (rgss.isEmpty()) {
return of(ClearingError.RecordNotFound, "groupId=%d; market=%s".formatted(validatedObject.getGroupId(), validatedObject.getMarket()));
}
for (Registry rgs : rgss) {
if (!validatedObject.getRefundDate().isAfter(rgs.getValueDate())) { // если request.RefundDate <= ValueDate - то ошибка

View file

@ -1,10 +1,14 @@
package ru.spcex.clearing.service.validation;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Optional;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
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.RegistryReturnDepositRequest;
import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryTradingParams;
@ -19,12 +23,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Optional;
import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode;
//1. Проверки
//1.1 Проверить, в запросе у регистра код:
// 1.1.1 Если регистр TM-T:
@ -67,7 +65,11 @@ public enum ReturnDepositValidationRule implements IValidationRule<ImdgValidatio
if (ctgr.get().equals(ClearingCategory.V)) {
Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
String mrkt = rgs.getMarket();
ImdgPredicate mrktCondition = TextUtil.isEmpty(mrkt) ?
pb.alwaysTrue() : pb.or(pb.equals("market", mrkt), pb.isNull("market"));
ImdgPredicate prdct = pb.and(
mrktCondition,
pb.equals("groupId", rgs.getGroupId()),
pb.equals("contract", rgs.getContract())
);

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.session.stage.impl;
import java.time.Instant;
import java.util.Collection;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -8,6 +11,8 @@ import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest;
@ -24,13 +29,6 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.time.Instant;
import java.util.Collection;
import java.util.Objects;
import java.util.stream.Collectors;
import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError;
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class EndStageNotification implements ISessionStage {
@ -83,25 +81,24 @@ public class EndStageNotification implements ISessionStage {
}
Collection<Registry> forRegistries = selectRegistry();
Collection<Long> groups = forRegistries.stream()
.map(Registry::getGroupId)
.filter(Objects::nonNull)
Collection<GroupRgsKey> groups = forRegistries.stream()
.map(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))
.distinct().collect(Collectors.toList());
log.debug("Sending notifications for {} groups ({} registers) on section {}",
groups, forRegistries.size(), section);
for (Long groupId : groups) {
log.trace("For registry group {} send notification",
groupId);
for (GroupRgsKey groupKey : groups) {
log.trace("For registry group/market {}/{} send notification",
groupKey.groupId(), groupKey.market());
StageResult sResult;
if (Section.FOND.equalsByKey(section)) {
sResult = notificationDF14(groupId);
sResult = notificationDF14(groupKey.groupId());
} else if (Section.MKR.equalsByKey(section)) {
sResult = notificationDF05(groupId);
sResult = notificationDF05(groupKey.groupId());
} else {
throw new IllegalArgumentException("Unsupported section " + section);
}
if (sResult.getError() != null) {
log.warn("When sending groupId={} has error: {}", groupId, msgResolver.resolve(sResult.getError()));
log.warn("When sending groupId={} has error: {}", groupKey, msgResolver.resolve(sResult.getError()));
}
}
StageResult<Collection<Registry>> res = new StageResult<>(null, true);

View file

@ -24,6 +24,7 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.sdf.SDf05;
import ru.spcex.clearing.component.GroupRgsKey;
import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -135,12 +136,13 @@ public class FinishingSession implements ISessionStage {
log.error("Session id={} not found. Can not update Execution's.", sessionId);
} else {
Collection<Registry> oRegs = findORegistryBySessionId(allLiabilitiesAndOKClaims);
Map<Long, RegistryStatus> obligationStatusByGroupId;
Map<GroupRgsKey, RegistryStatus> obligationStatusByGroupId;
obligationStatusByGroupId = oRegs.stream()
.map(rgs -> new Pair<>(rgs.getGroupId(), getEnumByKey(RegistryStatus.class, rgs.getRegistryStatus())))
.map(rgs -> new Pair<>(new GroupRgsKey(rgs.getGroupId(), rgs.getMarket()),
getEnumByKey(RegistryStatus.class, rgs.getRegistryStatus())))
.filter(pair -> pair.getSecond() != null)
.collect(Collectors.toMap(Pair::getFirst, Pair::getSecond, (o1, o2) -> o1));
Function<Long, CoverageStatus> statusByExchangeId = id-> {
Function<GroupRgsKey, CoverageStatus> statusByExchangeId = id-> {
RegistryStatus obligationStatus = obligationStatusByGroupId.get(id);
if (obligationStatus == null) return null;
return switch (obligationStatus) {
@ -164,7 +166,8 @@ public class FinishingSession implements ISessionStage {
Collection<ExecutionDeposit> executions = findExecutionDepositBySessionId(sessionId);
log.trace("loaded {} ExecutionDeposits for sessionId {}", executions.size(), sessionId);
for (ExecutionDeposit execution : executions) {
CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId());
CoverageStatus toStatus = statusByExchangeId.apply(
new GroupRgsKey(execution.getExchangeExecutionId(), execution.getMarket()));
if (toStatus == null) {
log.trace("CoverageStatus not defined for execution.id={}", execution.getId());
continue;
@ -194,7 +197,8 @@ public class FinishingSession implements ISessionStage {
Map<Long, ExecutionFond> execFond = new HashMap<>();
log.trace("loaded {} Executions for sessionId {}", executions.size(), sessionId);
for (ExecutionCommon execution : executions) {
CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId());
CoverageStatus toStatus = statusByExchangeId.apply(
new GroupRgsKey(execution.getExchangeExecutionId(), execution.getMarket()));
if (toStatus == null) {
log.trace("CoverageStatus not defined for execution.id={}", execution.getId());
continue;

View file

@ -23,6 +23,7 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.sdf.SDf03;
import ru.clearing.classes.statics.data.sdf.SDf12;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -126,18 +127,18 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
.filter(rgs -> rgs.getSettlementDate().isAfter(rgs.getValueDate()))
.toList();
Map<Long, List<Registry>> registriesByGroup = obligations
Map<GroupRgsKey, List<Registry>> registriesByGroup = obligations
.stream().
collect(Collectors.groupingBy(Registry::getGroupId));
collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())));
log.info("registry groups found {}", registriesByGroup.size());
ArrayList<PaymentInstruction> pmtCreated = new ArrayList<>();
for (Map.Entry<Long, List<Registry>> entry : registriesByGroup.entrySet()) {
for (Map.Entry<GroupRgsKey, List<Registry>> entry : registriesByGroup.entrySet()) {
List<Registry> groupRgs = entry.getValue();
Optional<Registry> lmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(RegistryTradingParams.OM_T, rgs)).findFirst();
Optional<Registry> cmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(RegistryTradingParams.TM_T, rgs)).findFirst();
if (lmtO.isEmpty() || cmtO.isEmpty()) {
log.error("groupId {} LM*T or CM*T not found", entry.getKey());
log.error("groupId/market {}/{} LM*T or CM*T not found", entry.getKey().groupId(), entry.getKey().market());
continue;
}
Registry lm_t = lmtO.get(); //obligation by money

View file

@ -23,6 +23,7 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.sdf.SDf03;
import ru.clearing.classes.statics.data.sdf.SDf12;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -151,16 +152,16 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
List<PaymentInstruction> pmtCreated = new ArrayList<>();
Map<Long, List<Registry>> registriesByGroup = rgsAll
Map<GroupRgsKey, List<Registry>> registriesByGroup = rgsAll
.stream().
collect(Collectors.groupingBy(Registry::getGroupId));
collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())));
log.info("registry groups found {}", registriesByGroup.size());
for (Map.Entry<Long, List<Registry>> entry : registriesByGroup.entrySet()) {
for (Map.Entry<GroupRgsKey, List<Registry>> entry : registriesByGroup.entrySet()) {
List<Registry> groupRgs = entry.getValue();
Optional<Registry> lmtO = groupRgs.stream().filter(rgs -> equalByRgs(RegistryTradingParams.OM_T, rgs)).findFirst();
Optional<Registry> cmtO = groupRgs.stream().filter(rgs -> equalByRgs(RegistryTradingParams.TM_T, rgs)).findFirst();
if (lmtO.isEmpty() || cmtO.isEmpty()) {
log.error("LM*T or CM*T not found for group {}", entry.getKey());
log.error("LM*T or CM*T not found for group/market {}/{}", entry.getKey().groupId(), entry.getKey().market());
continue;
}
Registry lm_t = lmtO.get(); //obligation by money

View file

@ -24,6 +24,7 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.sdf.SDf03;
import ru.clearing.classes.statics.data.sdf.SDf12;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -159,14 +160,16 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
{
Collection<Registry> registries = selectSecurityRegistries(sessionId);
log.debug("found registries.size() = {}", registries.size());
//группируем регистры по groupId
Map<Long, List<Registry>> groups = registries
.stream()
.collect(Collectors.groupingBy(Registry::getGroupId));
//группируем регистры по groupId и market
Map<GroupRgsKey, List<Registry>> groups = registries
.stream()
.collect(Collectors.groupingBy(r -> new GroupRgsKey(r.getGroupId(), r.getMarket())));
log.debug("groups.size = {}", groups.size());
Map<Long, PaymentGroup> lstGroups = RegistryLiabilitiesGroup.group(groups);
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) {
Long groupId = group.getKey();
for (Map.Entry<GroupRgsKey, List<Registry>> group : groups.entrySet()) {
Long groupId = group.getKey().groupId();
String market = group.getKey().market();
Function<RegistryTradingParams, Registry> findByCode = rgsCode -> group.getValue()
.stream()
.filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs))
@ -176,12 +179,12 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
Registry cs_t = findByCode.apply(RegistryTradingParams.TS_T);
Registry ls_t = findByCode.apply(RegistryTradingParams.OS_T);
if (cs_t == null || ls_t == null) {
log.error("groupId {} cmt_t {} ls_t {} - both must be present", groupId, cs_t, ls_t);
log.error("groupId/market {}/{} cmt_t {} ls_t {} - both must be present", groupId, market, cs_t, ls_t);
continue;
}
PaymentGroup ls_t_group = lstGroups.get(ls_t.getId());
if (ls_t_group == null) {
log.debug("groupId {} cmt_t {} ls_t {} were included in a group, skipping", groupId, cs_t, ls_t);
log.debug("groupId/market {}/{} cmt_t {} ls_t {} were included in a group, skipping", groupId, market, cs_t, ls_t);
continue;
}
@ -192,7 +195,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
AS_T
);
payerAstO.ifPresent(as_t -> {
log.debug("groupId {} cmt_t {} ls_t {} changing AS*T.id={} sender", groupId, cs_t, ls_t, as_t.getId());
log.debug("groupId/market {}/{} cmt_t {} ls_t {} changing AS*T.id={} sender", groupId, market, cs_t, ls_t, as_t.getId());
as_t.setSettledDebit(safeBD(as_t.getSettledDebit()).add(safeBD(ls_t_group.getSum())));
setUpdatedStoreInImdg(as_t, now);
});
@ -203,7 +206,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
AS_T
);
receiverAstO.ifPresent(as_t -> {
log.debug("groupId {} cmt_t {} ls_t {} changing AS*T.id={} receiver", groupId, cs_t, ls_t, as_t.getId());
log.debug("groupId/market {}/{} cmt_t {} ls_t {} changing AS*T.id={} receiver", groupId, market, cs_t, ls_t, as_t.getId());
as_t.setSettledCredit(safeBD(as_t.getSettledCredit()).add(safeBD(ls_t_group.getSum())));
setUpdatedStoreInImdg(as_t, now);
});
@ -236,7 +239,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
paymentInstructionImdg.insert(pmt);
paymentInstructionAll.add(pmt);
log.trace("generated PaymentInstructions for groupId {}: pmtInstr.id={}", groupId, pmt.getId());
log.trace("generated PaymentInstructions for groupId/market {}/{}: pmtInstr.id={}", groupId, market, pmt.getId());
}
}
{

View file

@ -18,12 +18,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionCurrency;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.session.stage.ISessionStage;
@ -129,17 +131,17 @@ public class InclusionObligations implements ISessionStage {
}
log.info("Inclusion to pool with predicate: {}", registryPredicate.toString());
Collection<Registry> obligations = registryImdg.getCollectionObjectsByPredicate(registryPredicate);
Map<Long, List<Registry>> registryByGroupId = obligations.stream()
Map<GroupRgsKey, List<Registry>> registryByGroupId = obligations.stream()
.filter(registry -> registry.getSettlementDate().isEqual(LocalDate.now()))
.collect(Collectors.groupingBy(Registry::getGroupId));
.collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())));
Optional<SessionType> ssnType = obtainSessionType(sessionId);
Map<Long, Registry> rgsToUpdate = new HashMap<>();
List<ExecutionCommon> execsToUpdate = new ArrayList<>();
boolean loadExecs = !IEnumKey.contains(sessionType,
SessionType.TRDT, SessionType.CURR, SessionType.UNIT, SessionType.IPOT);
for (Map.Entry<Long, List<Registry>> entrySet : registryByGroupId.entrySet()) {
log.debug("Processing set of registry with groupId: {}", entrySet.getKey());
for (Map.Entry<GroupRgsKey, List<Registry>> entrySet : registryByGroupId.entrySet()) {
log.debug("Processing set of registry with groupId/market: {}/{}", entrySet.getKey().groupId(), entrySet.getKey().market());
String rgsSection = null;
for (Registry registry : entrySet.getValue()) {
registry.setRegistryStatus(RegistryStatus.POOL.getKey());
@ -164,7 +166,7 @@ public class InclusionObligations implements ISessionStage {
}
@SuppressWarnings("unchecked")
private <T extends ExecutionCommon> Collection<ExecutionCommon> updateExecutions(Long sessionId, Long rgsGroupId, String rgsSection) {
private <T extends ExecutionCommon> Collection<ExecutionCommon> updateExecutions(Long sessionId, GroupRgsKey groupRgsKey, String rgsSection) {
Instant now = Instant.now();
SessionType ssnTpe = obtainSessionType(sessionId).orElse(null);
if (ssnTpe == null || sessionId == null) {
@ -193,7 +195,10 @@ public class InclusionObligations implements ISessionStage {
return Collections.emptyList();
}
ImdgPredicateBuilder pb = execImdg.predicateBuilder();
ImdgPredicate prdct = pb.equals("exchangeExecutionId", rgsGroupId);
ImdgPredicate prdct = pb.and(
pb.equals("exchangeExecutionId", groupRgsKey.groupId()),
StringUtils.hasText(groupRgsKey.market()) ? pb.equals("market", groupRgsKey.market()) : pb.alwaysTrue()
);
Collection<T> execs = execImdg.getCollectionObjectsByPredicate(prdct);
//Imdg<T> finalExecImdg = execImdg;
execs.forEach(e -> {

View file

@ -17,7 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.error.RgsError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -348,8 +350,8 @@ public class InspectionObligations implements ISessionStage {
private Collection<Registry> getRefundDateRgsIfPresent(List<Registry> registries) {
if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) {
Optional<Pair<Long, LocalDate>> groupIdAndSettleDate = registries.stream()
.map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate()))
Optional<Pair<GroupRgsKey, LocalDate>> groupIdAndSettleDate = registries.stream()
.map(rgs -> new Pair<>(new GroupRgsKey(rgs.getGroupId(),rgs.getMarket()), rgs.getSettlementDate()))
.filter(pair -> pair.getFirst() != null)
.filter(pair -> pair.getSecond() != null)
.findFirst();
@ -359,8 +361,12 @@ public class InspectionObligations implements ISessionStage {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
return registryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("groupId", groupIdAndSettleDate.get().getFirst()),
pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond()))
pb.and(
pb.equals("groupId", groupIdAndSettleDate.get().getFirst().groupId()),
StringUtils.hasText(groupIdAndSettleDate.get().getFirst().market()) ?
pb.equals("market", groupIdAndSettleDate.get().getFirst().market()) : pb.alwaysTrue()
),
pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond()))
)
);
} else return Collections.emptyList();

View file

@ -15,6 +15,8 @@ import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.component.GroupRgsKeyComparator;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AssetTrio;
import ru.spcex.clearing.service.integration.GatewayRequestCreator;
@ -53,6 +55,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
private final TradingTimeService tradingTimeService;
private final GatewayRequester gateway;
private final PlanBalanceCalc planBalanceCalc;
private static final GroupRgsKeyComparator groupRgsKeyComparator = new GroupRgsKeyComparator();
@Autowired
public InspectionObligationsDepositReturn(ImdgProvider imdgProvider, RegistryManager rgsMng, AssetTBFProcessing assets, TradingTimeService tradingTimeService, GatewayRequester gateway, PlanBalanceCalc planBalanceCalc) {
@ -97,27 +100,27 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(),
RegistryStatus.POOL.getKey());
List<Map.Entry<Long, List<Registry>>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition)
List<Map.Entry<GroupRgsKey, List<Registry>>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition)
.stream()
.collect(Collectors.groupingBy(Registry::getGroupId))
.collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())))
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.sorted(groupRgsKeyComparator)
.toList();
log.info("registry groups found {}", registriesByGroupSorted.size());
for (Map.Entry<Long, List<Registry>> entry : registriesByGroupSorted) {
for (Map.Entry<GroupRgsKey, List<Registry>> entry : registriesByGroupSorted) {
List<Registry> group = entry.getValue();
Optional<Registry> omtInGroupO = group.stream().filter(registry -> equalByRgs(OM_T, registry)).findFirst();
Optional<Registry> tmtInGroupO = group.stream().filter(registry -> equalByRgs(TM_T, registry)).findFirst();
if (omtInGroupO.isEmpty() || tmtInGroupO.isEmpty()) {
log.error("groupId {} failed to find OM*T/TM*T registry", entry.getKey());
log.error("groupId/market {}/{} failed to find OM*T/TM*T registry", entry.getKey().groupId(), entry.getKey().market());
group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG
continue;
}
Registry omtRgs = omtInGroupO.get();
Registry tmtRgs = tmtInGroupO.get();
log.debug("groupId={}, OM*T.id={}", entry.getKey(), omtRgs.getId());
log.debug("groupId={}, market={}, OM*T.id={}", entry.getKey().groupId(), entry.getKey().market(), omtRgs.getId());
BigDecimal omtBalance = safeBD(omtRgs.getBalance());
//первая часть сделки депозита
@ -150,18 +153,20 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
Optional<Registry> amfAssetO = searchAssetByOMT(omtRgs);
Optional<Registry> amfAssetReceiverO = searchAssetByOMT(tmtRgs);
if (amfAssetO.isEmpty()) {
log.error("OM*T register.id={} groupId={} failed to find AM*F asset", omtRgs.getId(), entry.getKey());
log.error("OM*T register.id={} groupId={}, market={} failed to find AM*F asset", omtRgs.getId(),
entry.getKey().groupId(), entry.getKey().market());
group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG
continue;
}
if (amfAssetReceiverO.isEmpty()) {
log.error("TM*T register.id={} groupId={} failed to find AM*F asset", tmtRgs.getId(), entry.getKey());
log.error("TM*T register.id={} groupId={}, market={} failed to find AM*F asset", tmtRgs.getId(),
entry.getKey().groupId(), entry.getKey().market());
group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG
continue;
}
Registry amfAsset = amfAssetO.get();
log.debug("groupId={}, AM*F.id={}", entry.getKey(), amfAsset.getId());
log.debug("groupId={}, market={}, AM*F.id={}", entry.getKey().groupId(), entry.getKey().market(), amfAsset.getId());
BigDecimal amfBalance = safeBD(amfAsset.getBalance());
BiConsumer<Registry, BigDecimal> processAssetsAndSetSessionId = (amf, amount) -> {
Optional<AssetTrio> asts = assets.processByAm_f(amf, amount);

View file

@ -18,7 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.component.predicate.cash.registry.AssetByTcrCompanyAccountCashedPredicate;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.error.RgsError;
@ -128,8 +130,8 @@ public class InspectionObligationsV2 implements ISessionStage {
Collection<Registry> registriesToProcess = registryImdg.getCollectionObjectsBySQL(sqlCondition);
Map<Long, Registry> rgssToStore = new HashMap<>(registriesToProcess.size()); //вторые ноги у сделок - нужна ли оптимизация?
List<Map.Entry<Long, List<Registry>>> registriesByGroupSorted = registriesToProcess.stream()
.collect(Collectors.groupingBy(Registry::getGroupId))
List<Map.Entry<GroupRgsKey, List<Registry>>> registriesByGroupSorted = registriesToProcess.stream()
.collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())))
.entrySet()
.stream()
.sorted((entry1, entry2) -> {
@ -150,15 +152,15 @@ public class InspectionObligationsV2 implements ISessionStage {
log.info("found {} ({} groups) registries by sql: {}", registriesToProcess.size(), registriesByGroupSorted.size(), sqlCondition);
ImdgPredicateBuilder rgsPb = registryImdg.predicateBuilder();
GROUP:
for (Map.Entry<Long, List<Registry>> entry : registriesByGroupSorted) {
for (Map.Entry<GroupRgsKey, List<Registry>> entry : registriesByGroupSorted) {
List<Registry> group = entry.getValue();
List<Registry> obligationsInGroup = group.stream().filter(registry ->
IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O).toList();
log.debug("Find {} obligation with ids: {} in group: {}", obligationsInGroup.size(),
log.debug("Find {} obligation with ids: {} in group/market: {}/{}", obligationsInGroup.size(),
obligationsInGroup.stream()
.map(Registry::getId).collect(Collectors.toList()),
entry.getKey());
entry.getKey().groupId(), entry.getKey().market());
boolean isUncovered = false;
List<CheckResult> checkResults = new ArrayList<>();
for (Registry obligation : obligationsInGroup) {
@ -191,7 +193,7 @@ public class InspectionObligationsV2 implements ISessionStage {
});
RegistryInstrumentType mOrS = IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType());
if (mOrS == null) {
log.error("RegistryInstrumentType is null for groupId {} {}.id={}", entry.getKey(),
log.error("RegistryInstrumentType is null for groupId/market {}/{} {}.id={}", entry.getKey().groupId(), entry.getKey().market(),
rgs.getRegistryCode(), rgs.getId());
failGroup.run();
continue;
@ -345,8 +347,9 @@ public class InspectionObligationsV2 implements ISessionStage {
private Collection<Registry> getRefundDateRgsIfPresent(List<Registry> registries) {
if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) {
Optional<Pair<Long, LocalDate>> groupIdAndSettleDate = registries.stream()
.map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate()))
//доп группировка по market не нужна, лист registries уже сгруппирован
Optional<Pair<GroupRgsKey, LocalDate>> groupIdAndSettleDate = registries.stream()
.map(rgs -> new Pair<>(new GroupRgsKey(rgs.getGroupId(),rgs.getMarket()), rgs.getSettlementDate()))
.filter(pair -> pair.getFirst() != null)
.filter(pair -> pair.getSecond() != null)
.findFirst();
@ -354,11 +357,17 @@ public class InspectionObligationsV2 implements ISessionStage {
return Collections.emptyList();
}
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String groupMarket = groupIdAndSettleDate.get().getFirst().market();
ImdgPredicate marketCondition = StringUtils.hasText(groupMarket) ?
pb.or(pb.equals("market", groupMarket), pb.isNull("market")) : pb.alwaysTrue();
return registryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.and(
pb.equals("groupId", groupIdAndSettleDate.get().getFirst()),
pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond()))
)
pb.equals("groupId", groupIdAndSettleDate.get().getFirst().groupId()),
marketCondition
),
pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond()))
)
);
} else return Collections.emptyList();
}

View file

@ -18,6 +18,7 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.validation.admission.AccountActiveValidationRule;
import ru.spcex.clearing.service.validation.admission.ClearingAvailableValidationRule;
@ -76,10 +77,11 @@ public class ObligationAdmission implements ISessionStage {
private StageResult<?> obligationAdmission(Long sessionId) {
Collection<Registry> registries = registryImdg.getCollectionObjectsBySQL("sessionId = " + sessionId);
Map<Long, List<Registry>> byGroups = registries.stream().collect(Collectors.groupingBy(Registry::getGroupId));
Map<GroupRgsKey, List<Registry>> byGroups = registries.stream()
.collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())));
log.info("found {} ({} groups) registries with sessionId {}", registries.size(), byGroups.size(), sessionId);
Map<Long, Registry> rgsToUpdate = new HashMap<>();
for (Map.Entry<Long, List<Registry>> grpEntry : byGroups.entrySet()) {
for (Map.Entry<GroupRgsKey, List<Registry>> grpEntry : byGroups.entrySet()) {
EnumMessage groupError = null;
List<Registry> rgsGroup = grpEntry.getValue();
for (Registry rgs : rgsGroup) {
@ -91,7 +93,8 @@ public class ObligationAdmission implements ISessionStage {
}
}
if (groupError != null) {
log.warn("error {} for registries groupId = {}", messageResolver.resolve(groupError), grpEntry.getKey());
log.warn("error {} for registries groupId/market = {}/{}", messageResolver.resolve(groupError),
grpEntry.getKey().groupId(), grpEntry.getKey().market());
for (Registry rgs : rgsGroup) {
rgs.setRegistryStatus(RegistryStatus.NACK.getKey());
rgsToUpdate.put(rgs.getId(), rgs);

View file

@ -210,6 +210,7 @@ public class RegistryCkBuilder implements IRegistryBuilder {
reg.setSessionId(exec.getSessionId());
reg.setSessionType(sessionType());
reg.setSection(Section.CURR.getKey());
reg.setMarket(exec.getMarket());
return reg;
}

View file

@ -213,6 +213,7 @@ public class RegistryCurrBuilder implements IRegistryBuilder {
reg.setSessionId(exec.getSessionId());
reg.setSessionType(sessionType());
reg.setSection(Section.CURR.getKey());
reg.setMarket(exec.getMarket());
return reg;
}

View file

@ -158,6 +158,7 @@ public class RegistryDepoBuilder implements IRegistryBuilder {
reg.setSessionId(exec.getSessionId());
reg.setSessionType(sessionType());
reg.setSection(Section.MKR.getKey());
reg.setMarket(exec.getMarket());
return reg;
}

View file

@ -239,6 +239,7 @@ public class RegistryFondBuilder implements IRegistryBuilder {
reg.setSessionId(exec.getSessionId());
reg.setSessionType(sessionType());
reg.setSection(Section.FOND.getKey());
reg.setMarket(exec.getMarket());
return reg;
}

View file

@ -363,7 +363,8 @@ public class RequirementsAndObligationCreation implements ISessionStage {
exec.getCompanyId(),
settlementDt(exec),
exec.getSessionId(),
exec.getExchangeExecutionId()
exec.getExchangeExecutionId(),
exec.getMarket()
);
}
@ -396,11 +397,12 @@ public class RequirementsAndObligationCreation implements ISessionStage {
exec.getCompanyId(),
((ExecutionDeposit) exec).getSecondLegSettlementDate(),
exec.getSessionId(),
exec.getExchangeExecutionId());
exec.getExchangeExecutionId(),
exec.getMarket());
}
public Optional<Registry> imdgRegSearch(RegistryTradingParams p, Long tcrId, Long companyId, LocalDate settlementDt,
Long sessionId, Long exchangeExecutionId) {
Long sessionId, Long exchangeExecutionId, String market) {
String sql = RegistryCodeSqlBuilder.getInstance(p).build();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql),
@ -408,7 +410,8 @@ public class RequirementsAndObligationCreation implements ISessionStage {
pb.equals("companyId", companyId),
pb.equals("settlementDate", settlementDt),
pb.equals("sessionId", sessionId),
pb.equals("groupId", exchangeExecutionId)
pb.equals("groupId", exchangeExecutionId),
pb.or(pb.equals("market", market), pb.isNull("market"))
);
Registry rgs = registryImdg.getSingleObjectByPredicate(rgstrPredicate);
log.trace("rgs.id={} found by: {}", rgs == null ? "'not found'" : rgs.getId(), rgstrPredicate.toString());

View file

@ -11,6 +11,7 @@ import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.service.registry.RegistryManager;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import static ru.spcex.platform.enumeration.RegistryTradingParams.OS_T;
@ -21,17 +22,18 @@ import ru.spcex.platform.utils.text.TextUtil;
public class RegistryLiabilitiesGroup {
private static final Logger log = LoggerFactory.getLogger(RegistryLiabilitiesGroup.class);
public static Map<Long, PaymentGroup> group(Map<Long, List<Registry>> registriesCollection) {
public static Map<Long, PaymentGroup> group(Map<GroupRgsKey, List<Registry>> registriesCollection) {
Map<Long, PaymentGroup> result = new HashMap<>();
List<Pair<Registry, Registry>> lstCstGroup = registriesCollection.entrySet()
.stream()
.map(entry -> {
Long groupId = entry.getKey();
Long groupId = entry.getKey().groupId();
String market = entry.getKey().market();
List<Registry> value = entry.getValue();
Registry ls_t = obtain(value, OS_T);
Registry cs_t = obtain(value, TS_T);
if (ls_t == null || cs_t == null) {
log.error("groupId {} registries {} failed to find LS_T/CS_T", groupId, value.stream()
log.error("groupId/market {}/{} registries {} failed to find LS_T/CS_T", groupId, market, value.stream()
.map(Registry::getId)
.map(Object::toString)
.collect(TextUtil.join));

View file

@ -57,17 +57,4 @@ public class RegistryUtil {
newRgsCde.setCharAt(2, '-');
return newRgsCde.toString();
}
public static Map<Long, List<Registry>> groupByGroupId(Collection<Registry> registries) {
HashMap<Long, List<Registry>> groups = new HashMap<>();
for (Registry reg : registries) {
List<Registry> lst = groups.get(reg.getGroupId());
if (lst == null) {
lst = new ArrayList<>();
groups.put(reg.getGroupId(), lst);
}
lst.add(reg);
}
return groups;
}
}

View file

@ -8,12 +8,12 @@
<name>clearing-validation</name>
<description>Clearing-module, dependency version of platform-utils</description>
<packaging>jar</packaging>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<properties>
@ -35,13 +35,13 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -7,12 +7,12 @@
<artifactId>db-scripts</artifactId>
<name>db-scripts</name>
<description>db-scripts for PostgreSQL</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<build>

View file

@ -2082,7 +2082,7 @@ GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_LIST_HISTORY TO clearing
-- registry - Регистр активов, обязательств и требований УК
DROP TABLE IF EXISTS REGISTRY;
CREATE TABLE REGISTRY(COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), BALANCE_RUB numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), REASON varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4));
CREATE TABLE REGISTRY(COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), BALANCE_RUB numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), REASON varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4), MARKET varchar(8));
COMMENT ON TABLE REGISTRY IS 'Регистр активов, обязательств и требований УК';
COMMENT ON COLUMN REGISTRY.COMPANY_ID IS 'Идентификатор участника (linked to company)';
@ -2185,12 +2185,14 @@ COMMENT ON COLUMN REGISTRY.SECURITY_ID IS 'Идентификатор инстр
COMMENT ON COLUMN REGISTRY.SECTION IS 'Код секции (linked to section)';
COMMENT ON COLUMN REGISTRY.MARKET IS 'Код класса инструмента';
GRANT ALL PRIVILEGES ON TABLE REGISTRY TO clearing;
-- History log of registry - Регистр активов, обязательств и требований УК
DROP TABLE IF EXISTS REGISTRY_HISTORY;
CREATE TABLE REGISTRY_HISTORY(REGISTRY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), BALANCE_RUB numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), REASON varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4));
CREATE TABLE REGISTRY_HISTORY(REGISTRY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), BALANCE_RUB numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), REASON varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4), MARKET varchar(8));
COMMENT ON TABLE REGISTRY_HISTORY IS 'История изменений таблицы registry';
COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_ID IS 'Идентификатор записи в таблице REGISTRY';
COMMENT ON COLUMN REGISTRY_HISTORY.EVENT_TIME IS 'Дата и время изменения';
@ -2296,6 +2298,7 @@ COMMENT ON COLUMN REGISTRY_HISTORY.UPDATED_AT IS 'Дата и время изм
COMMENT ON COLUMN REGISTRY_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)';
COMMENT ON COLUMN REGISTRY_HISTORY.SECTION IS 'Код секции (linked to section)';
COMMENT ON COLUMN REGISTRY_HISTORY.MARKET IS 'Код класса инструмента';
GRANT ALL PRIVILEGES ON TABLE REGISTRY_HISTORY TO clearing;

View file

@ -0,0 +1,9 @@
-- DB version: 3.18 -> 3.19
ALTER TABLE REGISTRY ADD COLUMN IF NOT EXISTS MARKET VARCHAR(8);
COMMENT ON COLUMN REGISTRY.MARKET IS 'Код класса инструмента';
ALTER TABLE REGISTRY_HISTORY ADD COLUMN IF NOT EXISTS MARKET VARCHAR(8);
COMMENT ON COLUMN REGISTRY_HISTORY.MARKET IS 'Код класса инструмента';
INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.19') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION

View file

@ -7,12 +7,12 @@
<artifactId>dbf-exporter</artifactId>
<name>dbf-exporter</name>
<description>DBF exporter for DBF files</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<dependencies>

View file

@ -8,12 +8,12 @@
<artifactId>dbf-importer</artifactId>
<name>dbf-importer</name>
<description>DBF loader for DBF files</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<dependencies>

View file

@ -8,12 +8,12 @@
<name>Clearing dictionary</name>
<description>Clearing dictionary</description>
<packaging>jar</packaging>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<properties>

View file

@ -4,12 +4,12 @@
<parent>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<artifactId>extdb-importer</artifactId>
<name>extdb-importer</name>
<description>Extdb importer module. Аналог trade-importer.</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<packaging>jar</packaging>
<properties>

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -5,12 +5,12 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>imdg-hist</artifactId>
<packaging>jar</packaging>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
@ -36,13 +36,13 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
@ -82,7 +82,7 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>cleaning-builders</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -7,12 +7,12 @@
<artifactId>imdg</artifactId>
<name>Clearing in memory data grid</name>
<packaging>jar</packaging>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<properties>
@ -32,13 +32,13 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
@ -89,7 +89,7 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>cleaning-builders</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -61,7 +61,7 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHisto
"CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE",
"BALANCE_DIMENSION", "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE",
"VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "REASON", "PARENT_ID", "GROUP_ID", "SESSION_ID",
"SESSION_TYPE", "PAYMENT_ID", "SECTION"
"SESSION_TYPE", "PAYMENT_ID", "SECTION", "MARKET"
};
}
@ -181,6 +181,7 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHisto
object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class));
object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class));
object.setSection(resultSet.getObject("SECTION", String.class));
object.setMarket(resultSet.getObject("MARKET", String.class));
registryHistory.setObject(object);
return registryHistory;
@ -244,7 +245,8 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHisto
object.getSessionId(),
object.getSessionType(),
object.getPaymentId(),
object.getSection()
object.getSection(),
object.getMarket()
};
return args;
}

View file

@ -68,7 +68,14 @@ public class RegistryMapStore extends TemplateMapStore<Registry> {
@Override
public String[] getFields() {
return new String[]{
"COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID", "ACCOUNT_TYPE", "ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY", "REGISTRY_UNIT", "REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY", "REGISTRY_STATUS", "SECURITY_SYMBOL", "BALANCE", "BALANCE_RUB", "OPEN_BALANCE", "CLOSE_BALANCE", "CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE", "BALANCE_DIMENSION", "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE", "VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "REASON", "PARENT_ID", "GROUP_ID", "SESSION_ID", "SESSION_TYPE", "PAYMENT_ID", "ID", "CREATED_AT", "UPDATED_AT", "SECURITY_ID", "SECTION"
"COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID", "ACCOUNT_TYPE",
"ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY", "REGISTRY_UNIT",
"REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY", "REGISTRY_STATUS",
"SECURITY_SYMBOL", "BALANCE", "BALANCE_RUB", "OPEN_BALANCE", "CLOSE_BALANCE", "CREDIT", "DEBIT",
"SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE", "BALANCE_DIMENSION",
"SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE", "VALUE_DATE", "PRICE",
"CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "REASON", "PARENT_ID", "GROUP_ID", "SESSION_ID", "SESSION_TYPE",
"PAYMENT_ID", "ID", "CREATED_AT", "UPDATED_AT", "SECURITY_ID", "SECTION", "MARKET"
};
}
@ -125,6 +132,7 @@ public class RegistryMapStore extends TemplateMapStore<Registry> {
object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT"));
object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
object.setSection(resultSet.getObject("SECTION", String.class));
object.setMarket(resultSet.getObject("MARKET", String.class));
return object;
}
@ -180,7 +188,8 @@ public class RegistryMapStore extends TemplateMapStore<Registry> {
TimeUtil.toDateFromInstant(object.getCreated()),
TimeUtil.toDateFromInstant(object.getUpdated()),
object.getSecurityId(),
object.getSection()
object.getSection(),
object.getMarket()
};
return args;
}

View file

@ -14,7 +14,7 @@ public class HazelcastLifecycleSupport extends AbstractHazelcastLifecycleSupport
/**
* Рабочая версия БД. Требуется вручную сверять с DDL.sql и накручивать эту переменную.
*/
public static final String CHECK_DB_VERSION = "3.18";
public static final String CHECK_DB_VERSION = "3.19";
private final Logger log = LoggerFactory.getLogger(this.getClass());

View file

@ -3,13 +3,13 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>lim-exporter</artifactId>
<name>Lim exporter</name>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<packaging>jar</packaging>
<parent>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<properties>
@ -35,7 +35,7 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -7,12 +7,12 @@
<name>_parent_clearing</name>
<description>Clearing parent module</description>
<packaging>pom</packaging>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modules>

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -8,12 +8,12 @@
<artifactId>reports-service</artifactId>
<name>reports-service</name>
<description>Service for creating reports</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<dependencies>
<!-- Spring boot -->

View file

@ -32,6 +32,7 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.text.TextUtil;
@Component
public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSCommissionTradesReport> {
@ -168,6 +169,8 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
Collection<ExecutionDeposit> executionDeposits = executionDepositImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("exchangeExecutionId", registry.getGroupId()),
TextUtil.isEmpty(registry.getMarket()) ?
pb.alwaysTrue() : pb.equals("market", registry.getMarket()),
pb.notNull("market")
)
);

View file

@ -144,13 +144,14 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
// Есть 2 пары Execution, SELL и BUY, статус определяем заранее по SELL и проставляем в BUY
if (coverage == CoverageStatus.DEND) {
if (execution instanceof ExecutionFond) {
ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams._S_T).buildPredicate(pbRegistry);
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams._S_T).buildPredicate(pb);
Collection<Registry> registryCollection = registryImdg.getCollectionObjectsByPredicate(
pbRegistry.and(
pbRegistry.equals("groupId", groupId),
pbRegistry.equals("companyId", execution.getCompanyId()),
pbRegistry.in("registryStatus",
pb.and(
pb.equals("groupId", groupId),
pb.or(pb.equals("market", execution.getMarket()), pb.isNull("market")),
pb.equals("companyId", execution.getCompanyId()),
pb.in("registryStatus",
RegistryStatus.NACC.getKey(),
RegistryStatus.NACK.getKey(),
RegistryStatus.FAIL.getKey(),
@ -170,7 +171,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
}
}
}
statusForExecution.put(new ExecutionKey(groupId, execution.getSessionId()), status);
statusForExecution.put(new ExecutionKey(groupId, execution.getMarket(), execution.getSessionId()), status);
}
}
}
@ -365,7 +366,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
status = "2";
} else if (execution instanceof ExecutionFond) {
Long groupId = execution.getExchangeExecutionId();
status = statusForExecution.get(new ExecutionKey(groupId, execution.getSessionId()));
status = statusForExecution.get(new ExecutionKey(groupId, execution.getMarket(), execution.getSessionId()));
if (status == null) {
log.warn(
"Broken execution (can't define status). Registry for groupId = {}, companyId = {} not found. Execution (id = {}) skipped",
@ -390,6 +391,6 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
}
}
private record ExecutionKey(Long groupId, Long sessionId) {
private record ExecutionKey(Long groupId, String market, Long sessionId) {
}
}

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@ -51,7 +51,7 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>cleaning-builders</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -26,7 +26,7 @@ public class LauncherValidationConfig {
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols);
return new ValidatorImpl<>(context,
ValidateSymbolsRule.notRequired("PaymentPurpose",
ValidateSymbolsRule.notRequired("Основание",
LauncherCommandRequest::getPaymentPurpose,
ValidationError.IncorrectPaymentPurpose)
);

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -8,12 +8,12 @@
<name>security-util clearing</name>
<description>Clearing misc util for verify user roles</description>
<packaging>jar</packaging>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<properties>
@ -35,13 +35,13 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -3,13 +3,13 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>swt-exporter</artifactId>
<name>Swt exporter</name>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<packaging>jar</packaging>
<parent>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<properties>
@ -35,7 +35,7 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -4,11 +4,11 @@
<parent>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<artifactId>test-clearing</artifactId>
<name>Test-clearing</name>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<dependencies>
<dependency>
<groupId>ru.spcex.platform</groupId>

View file

@ -4,12 +4,12 @@
<parent>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<artifactId>trade-importer</artifactId>
<name>trade-importer</name>
<description>Trade importer module</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<packaging>jar</packaging>
<properties>
@ -55,7 +55,7 @@
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<scope>compile</scope>
</dependency>
<dependency>

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View file

@ -7,12 +7,12 @@
<artifactId>xml-exporter</artifactId>
<name>xml-exporter</name>
<description>XML exporter for XML files</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<dependencies>

View file

@ -8,12 +8,12 @@
<artifactId>xml-importer</artifactId>
<name>xml-importer</name>
<description>XML loader for XML files</description>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<dependencies>

View file

@ -15,6 +15,8 @@ public class RegistryChangeRefundDateRequest {
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate refundDate;
@JsonProperty
public String market;
public Long getGroupId() {
return groupId;
@ -31,4 +33,12 @@ public class RegistryChangeRefundDateRequest {
public void setRefundDate(LocalDate refundDate) {
this.refundDate = refundDate;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -10,6 +10,8 @@ public class RegistryReturnDepositRequest implements WithId {
private Long id;
@JsonProperty
private BigDecimal balance;
@JsonProperty
public String market;
public Long getId() {
return id;
@ -26,4 +28,12 @@ public class RegistryReturnDepositRequest implements WithId {
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -23,6 +23,8 @@ public class RegistrySplitDepositActionRequest {
private String contract;
@JsonProperty
private String direction;
@JsonProperty
public String market;
public String getComment() {
return comment;
@ -63,4 +65,12 @@ public class RegistrySplitDepositActionRequest {
public void setDirection(String direction) {
this.direction = direction;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -14,7 +14,7 @@
<parent>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing</artifactId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modules>

View file

@ -9,7 +9,7 @@
<name>__parent_ROOT</name>
<description>Clearing main parent</description>
<packaging>pom</packaging>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
<modules>
<module>clearing-parent</module>
@ -24,7 +24,7 @@
<project.java.version>17</project.java.version>
<built.by>Maven</built.by>
<global.project.version>SPCEX-3.18.243</global.project.version>
<global.project.version>SPCEX-3.18.244</global.project.version>
<spring-boot.version>2.6.3</spring-boot.version>

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.243</version>
<version>SPCEX-3.18.244</version>
</parent>
<modelVersion>4.0.0</modelVersion>