Merge branch 'dev' into execution_and_deals_status

# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java
This commit is contained in:
ialbert 2023-11-27 15:39:16 +03:00
commit 9b8e68a94c
24 changed files with 377 additions and 151 deletions

View file

@ -1,6 +1,6 @@
{
"version": "3.9.0.69",
"version": "3.9.0.70",
"enums": {
@ -3328,11 +3328,11 @@
"type": 3,"name": "Номер купона","shortname": "Номер","searchable": true,"sortable": true,"visible": true
}
,
{"code": "periodEndDate",
{"code": "periodStartDate",
"type": 6,"name": "Начало периода действия","shortname": "Начало","searchable": true,"sortable": true,"visible": true
}
,
{"code": "periodStartDate",
{"code": "periodEndDate",
"type": 6,"name": "Окончание периода действия","shortname": "Окончание","searchable": true,"sortable": true,"visible": true
}
,

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.9.0.69">
<meta version="3.9.0.70">
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
<!--Здесь словари-->
<enums>
@ -772,8 +772,8 @@
<securityId type="1" dbname="Идентификатор инструмента" name="Наименование инструмента" shortname="Инструмент" searchable="true" sortable="true" link="security" linkCode="shortName"/>
<couponRate type="11" name="Купонная ставка" shortname="Ставка" searchable="true" sortable="true" visible="true"/>
<number type="3" name="Номер купона" shortname="Номер" searchable="true" sortable="true" visible="true"/>
<periodEndDate type="6" name="Начало периода действия" shortname="Начало" searchable="true" sortable="true" visible="true"/>
<periodStartDate type="6" name="Окончание периода действия" shortname="Окончание" searchable="true" sortable="true" visible="true"/>
<periodStartDate type="6" name="Начало периода действия" shortname="Начало" searchable="true" sortable="true" visible="true"/>
<periodEndDate type="6" name="Окончание периода действия" shortname="Окончание" searchable="true" sortable="true" visible="true"/>
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
</couponPeriod>
<listing name="Инструменты на режимах" destination="listings" class="ru.clearing.classes.statics.data.misc.Listing" logUpdates="true" table="listing">

View file

@ -1,6 +1,6 @@
{
"version": "3.9.0.69",
"version": "3.9.0.70",
"enums": {
@ -3328,11 +3328,11 @@
"type": 3,"name": "Номер купона","shortname": "Номер","searchable": true,"sortable": true,"visible": true
}
,
{"code": "periodEndDate",
{"code": "periodStartDate",
"type": 6,"name": "Начало периода действия","shortname": "Начало","searchable": true,"sortable": true,"visible": true
}
,
{"code": "periodStartDate",
{"code": "periodEndDate",
"type": 6,"name": "Окончание периода действия","shortname": "Окончание","searchable": true,"sortable": true,"visible": true
}
,

View file

@ -14,6 +14,9 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
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.time.TimeUtil;
@ -21,6 +24,7 @@ import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
@ -30,6 +34,7 @@ public class PaymentInstructionBuilderV2 {
private ImdgProvider imdgProvider;
private Imdg<Company> companyImdg;
private Imdg<CompanySymbols> companySymbolsImdg;
private Imdg<Registry> rgsImdg;
private final Imdg<ClearingMemberCategory> clearingCategoryImdg;
private final Imdg<CompanyRoleSet> cmpRoleImdg;
private Long sessionId;
@ -44,6 +49,8 @@ public class PaymentInstructionBuilderV2 {
private Long addresseeId;
private boolean useCS_BLKD = false;
private Registry am_b;
public static PaymentInstructionBuilderV2 builder(ImdgProvider imdgProvider) {
return new PaymentInstructionBuilderV2(imdgProvider);
}
@ -52,12 +59,17 @@ public class PaymentInstructionBuilderV2 {
this.imdgProvider = imdgProvider;
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.clearingCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
this.cmpRoleImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class);
}
public PaymentInstructionBuilderV2 useCS_BLKD(boolean useCS_BLKD) {
this.useCS_BLKD = useCS_BLKD;
public PaymentInstructionBuilderV2 checkBLKD(Registry rgs) {
if (rgs == null) {
return this;
}
this.useCS_BLKD = true;
this.am_b = rgs;
return this;
}
@ -142,8 +154,8 @@ public class PaymentInstructionBuilderV2 {
payment.setSettlementDate(LocalDate.now());
}
if (useCS_BLKD && categoryVInitiator(senderId) && companyRoleODEPPresent(senderId)) {
payment.setPaymentPurpose(SpecifFlag.CS_BLKD.getKey() + " " + purpose);
if (useCS_BLKD && checkAgent()) {
payment.setPaymentPurpose(SpecifFlag.CS_BLKD.getKey() + "_" + sessionId + " " + purpose);
} else {
payment.setPaymentPurpose(purpose);
}
@ -212,6 +224,26 @@ public class PaymentInstructionBuilderV2 {
}
}
private boolean checkAgent() {
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
ImdgPredicate prdct = pb.and(
pb.equals("sessionId", sessionId),
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM__).build()),
pb.equals("companyId", addresseeId),
pb.equals("accountId", am_b.getAccountId())
);
Collection<Registry> claims = rgsImdg.getCollectionObjectsByPredicate(prdct);
boolean hasCounterPartyInitiator = false;
for (Registry claim : claims) {
Long counterPartyId = claim.getCounterPartyId();
if (categoryVInitiator(counterPartyId) && companyRoleODEPPresent(counterPartyId)) {
hasCounterPartyInitiator = true;
break;
}
}
return hasCounterPartyInitiator;
}
public boolean categoryVInitiator(Long companyId) {
ClearingMemberCategory category = clearingCategoryImdg.getFirstObjectByFieldValues(
Map.of("companyId", companyId));

View file

@ -48,6 +48,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidator;
@ -62,6 +63,7 @@ import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static ru.spcex.platform.enumeration.RegistryTradingParams.D__V;
@ -364,10 +366,11 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
} else if (TextUtil.isEmpty(sdf57.getSpecif())
|| !sdf57.getSpecif().contains(SpecifFlag.CS_BLKD.getKey())) {
log.trace("sending gateway request for stmt.id={}", stmt.getId());
kafka.sendRequestToQueue(Consts.ASSET_OPERATION,
gatewayRequest(stmt,
company.getTradingCode(),
asts.a__t().getTradingClearingRegistry()));
Optional<AssetOperationListRequest> gtwReq = gatewayRequest(stmt,
company,
account,
asts.a__t().getTradingClearingRegistry());
gtwReq.ifPresent(r -> kafka.sendRequestToQueue(Consts.ASSET_OPERATION, r));
}
}
return Optional.of(asts);
@ -735,25 +738,56 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
R apply(T1 arg1, T2 arg2, T3 arg3);
}
private AssetOperationListRequest gatewayRequest(Statement stmt, String tradingCode, String tcrCode) {
private static final Pattern csBlkd = Pattern.compile(SpecifFlag.CS_BLKD.getKey() + "_(\\d+).*");
private Optional<AssetOperationListRequest> gatewayRequest(Statement stmt, Company company, Account account, String tcrCode) {
if (AccountType.Anlt.equalsByKey(account.getAccountType())) {
return Optional.empty();
}
String tradingCode = company.getTradingCode();
AssetOperationListRequest gatewayRequest = new AssetOperationListRequest();
AssetOperationRequest req = GatewayRequestCreator.from(stmt, tradingCode, tcrCode);
Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of(
"workflowStatus", SessionStatus.ACTV.getKey()
));
if (existActiveSession != null) {
log.debug("active session.id={} type {}", existActiveSession.getId(), existActiveSession.getSessionType());
List<Registry> d__vs = assets.searchByParams(stmt.getAccount(), CurrencyCode.RUB.getKey(), stmt.getSenderId(), D__V)
String specif = stmt.getComment();
Matcher m;
if (!TextUtil.isEmpty(specif) && (m = csBlkd.matcher(specif)).find()) {
try {
Long sessionId = Long.valueOf(m.group(1));
List<Registry> d__vs = assets.searchByParams(account.getAccount(), CurrencyCode.RUB.getKey(), company.getId(), D__V)
.stream()
.filter(rgs -> existActiveSession.getId().equals(rgs.getSessionId()))
.filter(rgs -> sessionId.equals(rgs.getSessionId()))
.toList();
BigDecimal d__vSum = d__vs.stream()
.map(rgs -> safeBD(rgs.getBalance()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal amount = req.getAmount();
req.setAmount(safeBD(amount).subtract(d__vSum));
} catch (NumberFormatException e) {
log.error("stmt.id={} failed to parse specif {} {}",
stmt.getId(),
specif,
ExceptionUtils.getStackTrace(e));
}
}
//Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of(
// "workflowStatus", SessionStatus.ACTV.getKey()
//));
//if (existActiveSession != null) {
// log.debug("active session.id={} type {}", existActiveSession.getId(), existActiveSession.getSessionType());
// List<Registry> d__vs = assets.searchByParams(stmt.getAccount(), CurrencyCode.RUB.getKey(), stmt.getSenderId(), D__V)
// .stream()
// .filter(rgs -> existActiveSession.getId().equals(rgs.getSessionId()))
// .toList();
// BigDecimal d__vSum = d__vs.stream()
// .map(rgs -> safeBD(rgs.getBalance()))
// .reduce(BigDecimal.ZERO, BigDecimal::add);
// BigDecimal amount = req.getAmount();
// req.setAmount(safeBD(amount).subtract(d__vSum));
//}
if (req.getAmount().compareTo(BigDecimal.ZERO) == 0) {
return Optional.empty();
}
gatewayRequest.setAssetOperationRequests(List.of(req));
return gatewayRequest;
return Optional.of(gatewayRequest);
}
}

View file

@ -215,7 +215,8 @@ public class FormingPaymentInstructionAssets implements ISessionStage {
.creditLegAccount(creditLegAccount)
.amount(amount)
.sessionId(sessionId)
.useCS_BLKD(SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType))
.checkBLKD((SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType))
&& !isPositiveBalance ? registry : null)
.purpose(String.format("Перевод по итогу клиринга по ТКР %s", registry.getTradingClearingRegistry()));
PaymentInstruction paymentInstruction = paymentInstructionBuilder.build();
log.debug("Created paymentInstruction by registry.id: {}", registry.getId());
@ -282,7 +283,6 @@ public class FormingPaymentInstructionAssets implements ISessionStage {
.sender(senderId)
.addressee(addresseeId)
.debitLegAccount(debitLegAccount)
.useCS_BLKD(SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType))
.creditLegAccount(creditLegAccount)
.amount(amount)
.sessionId(sessionId)

View file

@ -154,7 +154,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
.stream()
.collect(Collectors.groupingBy(Registry::getGroupId));
log.debug("groups.size = {}", groups.size());
Map<Long, PaymentGroup> lstGroups = RegistryLiabilitiesGroup.group(registries);
Map<Long, PaymentGroup> lstGroups = RegistryLiabilitiesGroup.group(groups);
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) {
Long groupId = group.getKey();
Function<RegistryTradingParams, Registry> findByCode = rgsCode -> group.getValue()

View file

@ -4,44 +4,56 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.service.registry.RegistryManager;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.utils.collection.Pair;
import ru.spcex.platform.utils.text.TextUtil;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import static ru.spcex.platform.enumeration.RegistryTradingParams.CS_T;
import static ru.spcex.platform.enumeration.RegistryTradingParams.LS_T;
public class RegistryLiabilitiesGroup {
private Logger log = LoggerFactory.getLogger(getClass());
private static final Logger log = LoggerFactory.getLogger(RegistryLiabilitiesGroup.class);
public static RegistryLiabilitiesGroup builder() {
return new RegistryLiabilitiesGroup();
}
private RegistryLiabilitiesGroup() {
}
public static Map<Long, PaymentGroup> group(Collection<Registry> registriesCollection) {
public static Map<Long, PaymentGroup> group(Map<Long, List<Registry>> registriesCollection) {
Map<Long, PaymentGroup> result = new HashMap<>();
List<Registry> registries = registriesCollection
List<Pair<Registry, Registry>> lstCstGroup = registriesCollection.entrySet()
.stream()
.filter(rgs -> RegistryManager.equalsByCode(LS_T, rgs))
.map(entry -> {
Long groupId = entry.getKey();
List<Registry> value = entry.getValue();
Registry ls_t = obtain(value, LS_T);
Registry cs_t = obtain(value, CS_T);
if (ls_t == null || cs_t == null) {
log.error("groupId {} registries {} failed to find LS_T/CS_T", groupId, value.stream()
.map(Registry::getId)
.map(Object::toString)
.collect(TextUtil.join));
return null;
}
return new Pair<>(ls_t, cs_t);
})
.collect(Collectors.toList());
for (int i = 0; i < registries.size(); i++) {
Registry ls_t = registries.get(i);
if (ls_t == null) {
for (int i = 0; i < lstCstGroup.size(); i++) {
var pair = lstCstGroup.get(i);
if (pair == null) {
continue;
}
Registry ls_t = pair.getFirst();
LinkedList<Registry> relatedLiabilities = new LinkedList<>();
relatedLiabilities.add(ls_t);
for (int j = i + 1; j < registries.size(); j++) {
Registry related = registries.get(j);
if (related == null) {
for (int j = i + 1; j < lstCstGroup.size(); j++) {
var anotherGroup = lstCstGroup.get(j);
if (anotherGroup == null) {
continue;
}
if (rgsOfTheSameAgents(ls_t, related)) {
Registry related = anotherGroup.getFirst();
if (rgsOfTheSameAgents(pair.getFirst(), pair.getSecond(), anotherGroup.getFirst(), anotherGroup.getSecond())) {
relatedLiabilities.add(related);
registries.set(j, null);
lstCstGroup.set(j, null);
}
}
PaymentGroup paymentGroup = new PaymentGroup();
@ -57,10 +69,25 @@ public class RegistryLiabilitiesGroup {
return result;
}
private static boolean rgsOfTheSameAgents(Registry ls_t1, Registry ls_t2) {
private static boolean rgsOfTheSameAgents(Registry ls_t1, Registry cs_t1, Registry ls_t2, Registry cs_t2) {
return Objects.equals(ls_t1.getSecurityId(), ls_t2.getSecurityId())
&& Objects.equals(ls_t1.getTradingClearingRegistryId(), ls_t2.getTradingClearingRegistryId())
&& Objects.equals(cs_t1.getTradingClearingRegistryId(), cs_t2.getTradingClearingRegistryId())
&& Objects.equals(ls_t1.getCompanyId(), ls_t2.getCompanyId())
&& Objects.equals(ls_t1.getCounterPartyId(), ls_t2.getCounterPartyId());
}
private static Registry obtain(Collection<Registry> group, RegistryTradingParams cde) {
List<Registry> allRegistries = group
.stream()
.filter(rgs -> RegistryManager.equalsByCode(cde, rgs))
.toList();
if (allRegistries.size() > 1) {
throw new IllegalStateException("more than one " + cde + " entry in group " + group.iterator().next().getGroupId());
}
if (allRegistries.size() == 1) {
return allRegistries.iterator().next();
}
return null;
}
}

View file

@ -47,9 +47,8 @@ public class PlannerAllTodayMaker {
public void makeSchedulerAllTodayMap() {
LocalDate currentDate = LocalDate.now();
List<PlannerAllToday> listOfPlannerAllToday = new ArrayList<>();
if (!plannerMap.isEmpty()) listOfPlannerAllToday.addAll(getPlannersAllTodayToDate(currentDate));
List<PlannerAllToday> listOfPlannerAllToday = getPlannersAllTodayToDate(currentDate);
log.info("For today find {} plannerTemplates satisfying rules", listOfPlannerAllToday.size());
plannerMap.values().stream()

View file

@ -1,12 +1,13 @@
package ru.spcex.clearing.reports.builders;
import com.opencsv.CSVWriterBuilder;
import com.opencsv.CSVWriter;
import com.opencsv.ICSVWriter;
import com.opencsv.bean.*;
import com.opencsv.exceptions.CsvBadConverterException;
import com.opencsv.exceptions.CsvChainedException;
import com.opencsv.exceptions.CsvFieldAssignmentException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.misc.Session;
@ -91,23 +92,6 @@ public abstract class CSVReportBuilder<P, R> {
*/
protected abstract void collect(P params);
/**
* Создает CSVWriter. Если требуется изменить параметры выходного CSV файла, этот метод следует переопределить.
*
* @param file Файл отчета
* @return Созданный CSVWriter
* <p>
* todo check it
*/
protected ICSVWriter createCsvWriter(File file) throws IOException {
Writer writer = new FileWriter(file);
CSVWriterBuilder csvWriterBuilder = new CSVWriterBuilder(writer)
.withLineEnd("\n")
.withSeparator(',')
.withQuoteChar('\"');
return csvWriterBuilder.build();
}
public File createReport(P params, File outFolder) {
assert outFolder != null && outFolder.isDirectory();
@ -118,10 +102,11 @@ public abstract class CSVReportBuilder<P, R> {
assert rows != null;
try (Writer writer = new FileWriter(reportFile)) {
try (Writer writer = new FileWriter(reportFile);
ICSVWriter icsvWriter = new CustomCSVWriter(writer)) {
CustomStrategy<R> customStrategy = new CustomStrategy<>();
customStrategy.setType(getReportClass());
StatefulBeanToCsv<R> sbc = new StatefulBeanToCsvBuilder<R>(writer)
StatefulBeanToCsv<R> sbc = new StatefulBeanToCsvBuilder<R>(icsvWriter)
.withMappingStrategy(customStrategy)
.withLineEnd("\n")
.withSeparator(',')
@ -160,6 +145,24 @@ public abstract class CSVReportBuilder<P, R> {
return sessionIds.stream().toList();
}
static class CustomCSVWriter extends CSVWriter {
public CustomCSVWriter(Writer writer) {
super(writer);
}
@Override
protected void writeNext(String[] nextLine, boolean applyQuotesToAll, Appendable appendable) throws IOException {
if (nextLine != null) {
for (int i = 0; i < nextLine.length; i++) {
if (StringUtils.isEmpty(nextLine[i])) {
nextLine[i] = null;
}
}
}
super.writeNext(nextLine, applyQuotesToAll, appendable);
}
}
static class CustomStrategy<T> extends ColumnPositionMappingStrategy<T> {
public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
super.generateHeader(bean);

View file

@ -57,6 +57,22 @@ public class KSCommissionTradesReport {
@CsvBindByPosition(position = 10)
private String execStatus;
@CsvBindByName(column = "TR_ID")
@CsvBindByPosition(position = 11)
private Long trId;
@CsvBindByName(column = "TKR")
@CsvBindByPosition(position = 12)
private String tkr;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 13)
private String account;
@CsvBindByName(column = "SESSION_ID")
@CsvBindByPosition(position = 14)
private Long sessionId;
public String getFirmId() {
return firmId;
@ -145,4 +161,36 @@ public class KSCommissionTradesReport {
public void setAgreementSettlementDate(LocalDate agreementSettlementDate) {
this.agreementSettlementDate = agreementSettlementDate;
}
public Long getTrId() {
return trId;
}
public void setTrId(Long trId) {
this.trId = trId;
}
public String getTkr() {
return tkr;
}
public void setTkr(String tkr) {
this.tkr = tkr;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public Long getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
this.sessionId = sessionId;
}
}

View file

@ -1,6 +1,7 @@
package ru.spcex.clearing.reports.builders.ks;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.registry.Registry;
@ -16,12 +17,12 @@ 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 java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Component
public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSCommissionTradesReport> {
@ -30,6 +31,7 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final Imdg<ExecutionDeposit> executionDepositImdg;
private final Imdg<Account> accountImdg;
private List<KSCommissionTradesReport> rows = null;
@ -37,6 +39,7 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
}
@Override
@ -105,8 +108,8 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
continue;
}
String firmId = "";
String firmIdInitiator = "";
String firmId = null;
String firmIdInitiator = null;
if (registryUnit == RegistryUnit.X) {
firmIdInitiator = registry.getTradingCode();
} else if (registryUnit == RegistryUnit.T) {
@ -122,12 +125,21 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
}
}
String execStatus = "";
String execStatus = null;
RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus());
if (registryStatus == RegistryStatus.CLRD) execStatus = "Исполнен";
else if (registryStatus == RegistryStatus.FAIL) execStatus = "Не исполнен";
else if (registryStatus == RegistryStatus.MNG || registryStatus == RegistryStatus.PROC)
else if (registryStatus == RegistryStatus.MNG || registryStatus == RegistryStatus.PROC) {
if (registry.getSettlementDate() == null) {
log.warn("Can't define status: registry.settlementDate is null. Registry was skipped");
continue;
}
if (registry.getSettlementDate().isAfter(nowDate)) {
execStatus = "Срок исполнения не наступил";
} else {
execStatus = "Ожидает исполнения";
}
}
String agreementNumber = registry.getContract();
if (agreementNumber != null && agreementNumber.contains("~"))
@ -149,6 +161,18 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
if (executionDeposits.size() > 1) log.warn("ExecutionDeposit[exchangeExecutionId = {}].size > 1, use first", registry.getGroupId());
ExecutionDeposit executionDeposit = executionDeposits.iterator().next();
String account = null;
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
if (accountType == AccountType.Clrn) {
account = registry.getAccount();
} else if (accountType == AccountType.Info) {
Account accountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of(
"accountType", AccountType.Anlt.getKey(),
"companyId", 1L
));
account = accountFromImdg.getAccount();
}
KSCommissionTradesReport ksCommissionTradesReport = new KSCommissionTradesReport();
ksCommissionTradesReport.setFirmId(firmId);
ksCommissionTradesReport.setFirmIdInitiator(firmIdInitiator);
@ -160,10 +184,14 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
ksCommissionTradesReport.setAgreementNumber(agreementNumber);
ksCommissionTradesReport.setAgreementNumberPostfix(agreementNumberPostfix);
ksCommissionTradesReport.setAgreementDate(registry.getTradingDate());
ksCommissionTradesReport.setSum(registry.getBalance() != null ? registry.getBalance().negate() : BigDecimal.ZERO);
ksCommissionTradesReport.setSum(registry.getBalance() != null ? registry.getBalance().negate() : null);
ksCommissionTradesReport.setRepaymDate(registry.getRefundDate());
ksCommissionTradesReport.setExecStatus(execStatus);
ksCommissionTradesReport.setAgreementSettlementDate(registry.getValueDate());
ksCommissionTradesReport.setTrId(registry.getGroupId());
ksCommissionTradesReport.setTkr(registry.getTradingClearingRegistry());
ksCommissionTradesReport.setAccount(account);
ksCommissionTradesReport.setSessionId(registry.getSessionId());
rows.add(ksCommissionTradesReport);
} catch (Throwable e) {

View file

@ -111,8 +111,8 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
boolean invalid = false;
if (!cmtRegistries.isEmpty() || !lmtRegistries.isEmpty()) {
String sourceTradingCode = "";
String sourceTkr = "";
String sourceTradingCode = null;
String sourceTkr = null;
if (!cmtRegistries.isEmpty()) {
Registry next = cmtRegistries.iterator().next();
sourceTradingCode = next.getTradingCode();
@ -124,24 +124,24 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
sourceTkr = next.getTradingClearingRegistry();
}
for (Registry currRegistry : cmtRegistries) {
if (!sourceTradingCode.equals(currRegistry.getTradingCode())) {
if (!Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) {
invalid = true;
log.warn("Invalid CM_T registries set, tradingCode not equals. Registries was skipped");
break;
}
if (!sourceTkr.equals(currRegistry.getTradingClearingRegistry())) {
if (!Objects.equals(sourceTkr, currRegistry.getTradingClearingRegistry())) {
invalid = true;
log.warn("Invalid CM_T registries set, tradingClearingRegistry not equals. Registries was skipped");
break;
}
}
for (Registry currRegistry : lmtRegistries) {
if (!sourceTradingCode.equals(currRegistry.getTradingCode())) {
if (!Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) {
invalid = true;
log.warn("Invalid LM_T registries set, tradingCode not equals. Registries was skipped");
break;
}
if (!sourceTkr.equals(currRegistry.getTradingClearingRegistry())) {
if (!Objects.equals(sourceTkr, currRegistry.getTradingClearingRegistry())) {
invalid = true;
log.warn("Invalid CM_T registries set, tradingClearingRegistry not equals. Registries was skipped");
break;
@ -160,7 +160,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
ksRepCashNettoReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), getReportZoneId()));
String account = "";
String account = null;
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
if (accountType == AccountType.Clrn) {
account = registry.getAccount();
@ -179,6 +179,8 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
BigDecimal lmtBalance = BigDecimal.ZERO;
BigDecimal oblValue = BigDecimal.ZERO;
BigDecimal reqValue = BigDecimal.ZERO;
boolean withValue = false;
boolean withOblReqValue = false;
Set<SessionType> sessionTypeForValue = Set.of(
SessionType.IPOT,
SessionType.TRDT,
@ -195,21 +197,35 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
if (cmtRegistry.getBalance() != null) {
SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, cmtRegistry.getSessionType());
if (sessionType == null) continue;
if (sessionTypeForValue.contains(sessionType)) cmtBalance = cmtBalance.add(cmtRegistry.getBalance());
if (sessionTypeForOblReqValue.contains(sessionType)) reqValue = reqValue.add(cmtRegistry.getBalance());
if (sessionTypeForValue.contains(sessionType)) {
cmtBalance = cmtBalance.add(cmtRegistry.getBalance());
withValue = true;
}
if (sessionTypeForOblReqValue.contains(sessionType)) {
reqValue = reqValue.add(cmtRegistry.getBalance());
withOblReqValue = true;
}
}
}
for (Registry lmtRegistry : lmtRegistries) {
if (lmtRegistry.getBalance() != null) {
SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, lmtRegistry.getSessionType());
if (sessionType == null) continue;
if (sessionTypeForValue.contains(sessionType)) lmtBalance = lmtBalance.add(lmtRegistry.getBalance());
if (sessionTypeForOblReqValue.contains(sessionType)) oblValue = oblValue.add(lmtRegistry.getBalance());
if (sessionTypeForValue.contains(sessionType)) {
lmtBalance = lmtBalance.add(lmtRegistry.getBalance());
withValue = true;
}
if (sessionTypeForOblReqValue.contains(sessionType)) {
oblValue = oblValue.add(lmtRegistry.getBalance());
withOblReqValue = true;
}
}
ksRepCashNettoReport.setValue(cmtBalance.subtract(lmtBalance));
ksRepCashNettoReport.setOblValue(oblValue);
ksRepCashNettoReport.setReqValue(reqValue);
}
BigDecimal value;
value = cmtBalance.subtract(lmtBalance);
ksRepCashNettoReport.setValue(withValue ? value : null);
ksRepCashNettoReport.setOblValue(withOblReqValue ? oblValue : null);
ksRepCashNettoReport.setReqValue(withOblReqValue ? reqValue : null);
rows.add(ksRepCashNettoReport);
} catch (Throwable e) {

View file

@ -110,7 +110,7 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
pairRegistry.getId());
}
String account = "";
String account = null;
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
if (accountType == AccountType.Clrn) {
account = registry.getAccount();
@ -124,7 +124,7 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
String firmId = registry.getTradingCode();
String tkr = registry.getTradingClearingRegistry();
String tradeNum = "";
String tradeNum = null;
String registerCode = pairRegistry != null ? pairRegistry.getRegistryCode() : "";
BigDecimal addSum = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO;
Instant addTime = registry.getUpdated();

View file

@ -100,7 +100,7 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
}
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String account = "";
String account = null;
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
if (accountType == AccountType.Clrn) {
account = registry.getAccount();
@ -110,7 +110,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
"accountType", AccountType.Anlt.getKey()
));
if (accountFromIMDG != null) account = accountFromIMDG.getAccount();
} KSRepCashRegistersReport ksRepCashRegistersReport = new KSRepCashRegistersReport();
}
KSRepCashRegistersReport ksRepCashRegistersReport = new KSRepCashRegistersReport();
ksRepCashRegistersReport.setFirmId(registry.getTradingCode());
ksRepCashRegistersReport.setAccount(account);
@ -121,7 +122,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
BigDecimal openBalance = registry.getOpenBalance() != null ? registry.getOpenBalance() : BigDecimal.ZERO;
ksRepCashRegistersReport.setOpenBalance(openBalance);
ksRepCashRegistersReport.setRemarks("");
ksRepCashRegistersReport.setRemarks(null);
ksRepCashRegistersReport.setTradeNum(null);
RegistryCodeDictionary registryCodeDictionary = registryCodeDictionaryImdg.getFirstObjectByFieldValues(Map.of("code", registry.getRegistryCode()));
if (registryCodeDictionary != null) ksRepCashRegistersReport.setRegisterName(registryCodeDictionary.getName());
@ -170,7 +172,9 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
)
);
BigDecimal addWithdraw = BigDecimal.ZERO;
for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance());
for (Registry currRegistry : registriesForAddWithdraw) {
addWithdraw = addWithdraw.add(currRegistry.getBalance());
}
ksRepCashRegistersReport.setAddWithdraw(addWithdraw);
BigDecimal closeBalance = ksRepCashRegistersReport.getOpenBalance()

View file

@ -20,10 +20,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Component
@ -90,9 +87,8 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
List<Registry> groupedRegistry = entry.getValue();
try {
if (groupedRegistry.isEmpty()) {
log.warn("Empty LS_T and CS_T registries for {}. Registries with id = [{}] was skipped",
pairRegistryId,
groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", "))
log.warn("Empty LS_T and CS_T registries for {}",
pairRegistryId
);
continue;
}
@ -110,17 +106,17 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
boolean invalid = false;
if (!cstRegistries.isEmpty() || !lstRegistries.isEmpty()) {
String sourceTradingCode = "";
String sourceTradingCode = null;
if (!cstRegistries.isEmpty()) sourceTradingCode = cstRegistries.iterator().next().getTradingCode();
if (!lstRegistries.isEmpty()) sourceTradingCode = lstRegistries.iterator().next().getTradingCode();
for (Registry currRegistry : cstRegistries) {
if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue;
if (Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) continue;
invalid = true;
log.warn("Invalid CS_T registries set, tradingCode not equals. Registries was skipped");
break;
}
for (Registry currRegistry : lstRegistries) {
if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue;
if (Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) continue;
invalid = true;
log.warn("Invalid LS_T registries set, tradingCode not equals. Registries was skipped");
break;

View file

@ -120,10 +120,10 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
String firmId = registry.getTradingCode();
String tkr = registry.getTradingClearingRegistry();
String tradeNum = "";
String tradeNum = null;
String securityId = registry.getSecuritySymbol();
String registerCode = pairRegistry != null ? pairRegistry.getRegistryCode() : "";
BigDecimal addQuantity = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO;
String registerCode = pairRegistry != null ? pairRegistry.getRegistryCode() : null;
BigDecimal addQuantity = registry.getBalance();
Instant addTime = registry.getUpdated();
LocalDate addDate = LocalDate.now();

View file

@ -108,10 +108,11 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
ksRepDepoRegistersReport.setSecurityId(registry.getSecuritySymbol());
ksRepDepoRegistersReport.setRegisterCode(registry.getRegistryCode());
BigDecimal openBalance = registry.getOpenBalance() != null ? registry.getOpenBalance() : BigDecimal.ZERO;
BigDecimal openBalance = registry.getOpenBalance();
ksRepDepoRegistersReport.setOpenQuantity(openBalance);
ksRepDepoRegistersReport.setRemarks(null);
ksRepDepoRegistersReport.setTradeNum(null);
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getFirstObjectByFieldValues(Map.of("code", registry.getRegistryCode()));
if (registryCodeDescription != null) ksRepDepoRegistersReport.setRegisterName(registryCodeDescription.getName());
@ -137,7 +138,7 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance());
ksRepDepoRegistersReport.setAddWithdrawDepo(addWithdraw);
BigDecimal closeBalance = ksRepDepoRegistersReport.getOpenQuantity()
BigDecimal closeBalance = (ksRepDepoRegistersReport.getOpenQuantity() != null ? ksRepDepoRegistersReport.getOpenQuantity() : BigDecimal.ZERO)
.add(ksRepDepoRegistersReport.getChangeQuantity())
.add(ksRepDepoRegistersReport.getAddWithdrawDepo());
ksRepDepoRegistersReport.setCloseQuantity(closeBalance);

View file

@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.builders.ks;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
@ -37,6 +38,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
private final Imdg<Company> companyImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Account> accountImdg;
private final Imdg<AccountSymbols> accountSymbolsImdg;
private List<KSRepTradesReport> rows = null;
@ -48,6 +50,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
}
@Override
@ -96,7 +99,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
Map<ExecutionKey, String> statusForExecution = new HashMap<>();
executions.forEach(execution -> {
if (Set.of("S", "SELL").contains(execution.getSide())) {
String status = "";
String status = null;
if (execution.getCoverageStatus() != null) {
Long groupId = execution.getExchangeExecutionId();
String coverageStatus = execution.getCoverageStatus().toUpperCase();
@ -153,7 +156,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
ksRepTradesReport.setTkr(tkr.getCode());
String account = "";
String account = null;
if (tkr.getMoneyAccountId() != null) {
Account moneyAccountFromImdg = accountImdg.getSingleObjectByID(tkr.getMoneyAccountId());
if (moneyAccountFromImdg != null) {
@ -168,12 +171,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
}
ksRepTradesReport.setAccount(account);
String depoAccount = "";
if (tkr.getDepoAccountId() != null) {
Account depoAccountFromImdg = accountImdg.getSingleObjectByID(tkr.getDepoAccountId());
if (depoAccountFromImdg != null) depoAccount = depoAccountFromImdg.getAccount();
}
ksRepTradesReport.setDepoAccount(depoAccount);
if (execution.getCompanyId() != null) {
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
@ -192,7 +190,8 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
continue;
}
String agreementNumber = "";
String depoAccount = null;
String agreementNumber = null;
if (execution instanceof ExecutionDeposit executionDeposit) {
agreementNumber = executionDeposit.getContract();
BigDecimal firstLegAmount = executionDeposit.getFirstLegAmount() != null ? executionDeposit.getFirstLegAmount() : BigDecimal.ZERO;
@ -212,6 +211,18 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
ksRepTradesReport.setDepoLiability(BigDecimal.ZERO);
} else if (execution instanceof ExecutionFond executionFond) {
if (tkr.getDepoAccountId() != null) {
AccountSymbols accountSymbols = accountSymbolsImdg.getFirstObjectByFieldValues(Map.of(
"accountId", tkr.getDepoAccountId()
));
if (accountSymbols != null) {
depoAccount = accountSymbols.getAccountSymbolValue();
} else {
Account depoAccountFromImdg = accountImdg.getSingleObjectByID(tkr.getDepoAccountId());
if (depoAccountFromImdg != null) depoAccount = depoAccountFromImdg.getAccount();
}
}
Company company = null;
BigDecimal settlementAmount = executionFond.getSettlementAmount() != null ? executionFond.getSettlementAmount() : BigDecimal.ZERO;
if (Arrays.asList(Side.BUY.getKey(), "B","BUY").contains(executionFond.getSide())) {
@ -242,13 +253,13 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
executionFond.getExchangeExecutionId());
continue;
}
agreementNumber = null;
BigDecimal quantity = executionFond.getQuantity() != null ? executionFond.getQuantity() : BigDecimal.ZERO;
if (Arrays.asList(Side.SELL.getKey(), "S", "SELL").contains((executionFond.getSide())))
quantity = quantity.negate();
ksRepTradesReport.setDepoLiability(quantity);
}
ksRepTradesReport.setDepoAccount(depoAccount);
ksRepTradesReport.setAgreementNumber(agreementNumber);
ksRepTradesReport.setTradeNum(execution.getExchangeExecutionId());

View file

@ -586,8 +586,23 @@ public class ReportServiceTest_KS {
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setCode("TKR");
tradingClearingRegistry.setDepoAccountId(777L);
Long tkrId = tradingClearingRegistryImdg.insert(tradingClearingRegistry);
Account account = new Account();
account.setAccount("ACCOUNT");
Long accountId = accountImdg.insert(account);
TradingClearingRegistry tradingClearingRegistry_1 = new TradingClearingRegistry();
tradingClearingRegistry_1.setCode("TKR");
tradingClearingRegistry_1.setDepoAccountId(accountId);
Long tkrId_1 = tradingClearingRegistryImdg.insert(tradingClearingRegistry_1);
AccountSymbols accountSymbols = new AccountSymbols();
accountSymbols.setAccountId(777L);
accountSymbols.setAccountSymbolValue("ACC_SYMBOL_VALUE");
accountSymbolsImdg.insert(accountSymbols);
Session session_1 = new Session();
session_1.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2023, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC)));
Long sessionId_1 = sessionImdg.insert(session_1);
@ -604,7 +619,7 @@ public class ReportServiceTest_KS {
executionFond_2.setTradingDate(LocalDate.now());
executionFond_2.setSide(MoneyFlowSide.BUY.getKey());
executionFond_2.setSessionId(sessionId_1);
executionFond_2.setTradingClearingRegistryId(tkrId);
executionFond_2.setTradingClearingRegistryId(tkrId_1);
executionFond_2.setSettlementAmount(BigDecimal.valueOf(8888.888888));
executionFond_2.setQuantity(BigDecimal.valueOf(123.456789));
executionFond_2.setExchangeExecutionId(222L);
@ -707,6 +722,8 @@ public class ReportServiceTest_KS {
registryImdg.delete(registry);
registryImdg.delete(registry_2);
tradingClearingRegistryImdg.delete(tradingClearingRegistry);
accountSymbolsImdg.delete(accountSymbols);
accountImdg.delete(account);
}
@Test
@ -1033,6 +1050,10 @@ public class ReportServiceTest_KS {
registry.setSessionType(SessionType.XDEP.getKey());
registry.setValueDate(LocalDate.now().minusDays(10));
registry.setSettlementDate(LocalDate.of(2022, 1, 2));
registry.setTradingClearingRegistry("TRADING_CLEARING_REGISTRY");
registry.setAccountType(AccountType.Clrn.getKey());
registry.setAccount("ACCOUNT");
registry.setSessionId(1L);
registryImdg.insert(registry);
Registry omtRegistry = new Registry();

View file

@ -1,2 +1,2 @@
"FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","AGREEMENT_SETTLEMENT_DATE","SUM","REPAYM_DATE","EXEC_STATUS"
"CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","06.11.2023","-77.78","16.11.2023","Исполнен"
"FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","AGREEMENT_SETTLEMENT_DATE","SUM","REPAYM_DATE","EXEC_STATUS","TR_ID","TKR","ACCOUNT","SESSION_ID"
"CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","14.11.2023","-77.78","24.11.2023","Исполнен","23071812300","TRADING_CLEARING_REGISTRY","ACCOUNT","1"

1 FIRM_ID FIRM_ID_INITIATOR SECCODE CLASS_CODE AGREEMENT_NUMBER AGREEMENT_NUMBER_POSTFIX AGREEMENT_DATE AGREEMENT_SETTLEMENT_DATE SUM REPAYM_DATE EXEC_STATUS TR_ID TKR ACCOUNT SESSION_ID
2 CLEARING_CODE TRADING_CODE CONT~RACT market CONT CONT~RACT 01.01.1991 06.11.2023 14.11.2023 -77.78 16.11.2023 24.11.2023 Исполнен 23071812300 TRADING_CLEARING_REGISTRY ACCOUNT 1

View file

@ -1,3 +1,3 @@
"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE","OBL_VALUE","REQ_VALUE"
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","16.11.2023","0.00","0.00"
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR","0.00","16.11.2023","22.22","44.44"
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","16.11.2023","",""
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR","","16.11.2023","22.22","44.44"
1 FIRMID SESSION_ID SESSION_DATE ACCOUNT TKR VALUE DATE OBL_VALUE REQ_VALUE
2 TRADING_CODE 2 20.01.1970T02:49:58 ACCOUNT TKR 22.22 16.11.2023 0.00 0.00
3 TRADING_CODE 2 20.01.1970T02:49:58 ACCOUNT_FROM_ACCOUNT TKR 0.00 16.11.2023 22.22 44.44

View file

@ -1,5 +1,5 @@
"SESSION_ID","SESSION_DATE","TR_ID","AGREEMENT_NUMBER","FIRM_ID","TKR","ACCOUNT","DEPO_ACCOUNT","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS"
"4","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR","","","8888.89","0","222","3333","20.01.1970T02:49:58","2"
"3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","-8888.89","123","222","3333","20.01.1970T02:49:58","1"
"3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","-8888.89","123","222","3333","20.01.1970T02:49:58","2"
"3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","8888.89","-123","222","3333","20.01.1970T02:49:58","2"
"7","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR","","","8888.89","0","222","3333","20.01.1970T02:49:58","2"
"6","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","ACCOUNT","-8888.89","123","222","3333","20.01.1970T02:49:58","1"
"6","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","ACC_SYMBOL_VALUE","8888.89","-123","222","3333","20.01.1970T02:49:58","2"
"6","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","ACC_SYMBOL_VALUE","-8888.89","123","222","3333","20.01.1970T02:49:58","2"

1 SESSION_ID SESSION_DATE TR_ID AGREEMENT_NUMBER FIRM_ID TKR ACCOUNT DEPO_ACCOUNT CASH_LIABILITY DEPO_LIABILITY TRADE_NUM CLASS_CODE TRADE_DATE STATUS
2 4 7 20.01.1970T07:09:07 222 CONTRACT TRADING_CODE TKR 8888.89 0 222 3333 20.01.1970T02:49:58 2
3 3 6 20.01.1970T15:54:43 222 TRADING_CODE TKR ACCOUNT -8888.89 123 222 3333 20.01.1970T02:49:58 1
4 3 6 20.01.1970T15:54:43 222 TRADING_CODE TKR ACC_SYMBOL_VALUE -8888.89 8888.89 123 -123 222 3333 20.01.1970T02:49:58 2
5 3 6 20.01.1970T15:54:43 222 TRADING_CODE TKR ACC_SYMBOL_VALUE 8888.89 -8888.89 -123 123 222 3333 20.01.1970T02:49:58 2

View file

@ -77,18 +77,23 @@ public class UserRoleVerification {
public void validateRoleAndThrow(BaseRequest<?> req) throws ValidationException {
Objects.requireNonNull(roleForVerification);
Long requesterId = req.getUserId();
if (requesterId != null && !userHasRole(requesterId, roleForVerification)) {
if (requesterId == null) {
log.trace("Request without userId");
} else {
if (!userHasRole(requesterId, roleForVerification)) {
log.trace("User {} has no role to allow this action", requesterId);
throw new ValidationException(roleVerificationError);
} else {
log.trace("Request without userId");
}
}
}
public RequestInfoUpdate validateRoleAndGetResult(BaseRequest<?> req) {
Objects.requireNonNull(roleForVerification);
Long requesterId = req.getUserId();
if (requesterId != null && !userHasRole(requesterId, roleForVerification)) {
if (requesterId == null) {
log.debug("Request without userId");
} else {
if (!userHasRole(requesterId, roleForVerification)) {
String errMsg = messageResolver.resolve(new EnumMessage(roleVerificationError, requesterId));
log.info("User {} has no role: {}", requesterId, errMsg);
return new RequestInfoUpdate()
@ -96,7 +101,8 @@ public class UserRoleVerification {
.setStatus(ru.spcex.clearing.platform.messaging.service.Status.Error)
.setMessage(errMsg);
} else {
log.debug("Request without userId");
log.trace("Request validateRoleAndGetResult for userId={} success", requesterId);
}
}
return null;
}