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:
commit
9b8e68a94c
24 changed files with 377 additions and 151 deletions
|
|
@ -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
|
||||
}
|
||||
,
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
,
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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,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,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"
|
||||
|
|
|
|||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue