This commit is contained in:
akulikov 2023-07-05 21:48:19 +03:00
parent 810ebc3f58
commit 262166d470
30 changed files with 595 additions and 352 deletions

View file

@ -1,63 +1,163 @@
package ru.spcex.clearing.reports.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import ru.spcex.clearing.reports.reports.*;
import ru.spcex.clearing.reports.reports.bp.*;
import ru.spcex.clearing.reports.reports.ks.*;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Configuration
@ComponentScan(basePackages = "ru.spcex.clearing.reports.reports")
public class ReportBuildersConfig {
@Bean("reportBuildersWithoutParams")
public Map<ReportType, List<CSVReportBuilder<EmptyParams>>> reportBuildersWithoutParams(ImdgProvider imdgProvider) {
public Map<ReportType, List<CSVReportBuilder<EmptyParams>>> reportBuildersWithoutParams(
SummaryLiabilitiesClaimsReportBuilder summaryLiabilitiesClaimsReportBuilder,
SummaryMoneyChangeReportBuilder summaryMoneyChangeReportBuilder,
KSRepCashRegistersReportBuilder ksRepCashRegistersReportBuilder,
KSRepCashRegisterSumsReportBuilder ksRepCashRegisterSumsReportBuilder,
KSRepDepoRegistersReportBuilder ksRepDepoRegistersReportBuilder,
KSRepDepoRegisterQuantitiesReportBuilder ksRepDepoRegisterQuantitiesReportBuilder,
KSRepTradesReportBuilder ksRepTradesReportBuilder,
KSRepFirmDetailsReportBuilder ksRepFirmDetailsReportBuilder
) {
Map<ReportType, List<CSVReportBuilder<EmptyParams>>> resultMap = new HashMap<>();
resultMap.put(ReportType.SUMMARY_LIABILITIES_CLAIMS, List.of(new SummaryLiabilitiesClaimsReportBuilder(imdgProvider)));
resultMap.put(ReportType.SUMMARY_MONEY_CHANGE, List.of(new SummaryMoneyChangeReportBuilder(imdgProvider)));
resultMap.put(ReportType.KS_REP_CASH_REGISTERS, List.of(new KSRepCashRegistersReportBuilder(imdgProvider)));
resultMap.put(ReportType.KS_REP_CASH_REGISTER_SUMS, List.of(new KSRepCashRegisterSumsReportBuilder(imdgProvider)));
resultMap.put(ReportType.KS_REP_DEPO_REGISTERS, List.of(new KSRepDepoRegistersReportBuilder(imdgProvider)));
resultMap.put(ReportType.KS_REP_DEPO_REGISTER_QUANTITIES, List.of(new KSRepDepoRegisterQuantitiesReportBuilder(imdgProvider)));
resultMap.put(ReportType.KS_REP_TRADES, List.of(new KSRepTradesReportBuilder(imdgProvider)));
resultMap.put(ReportType.KS_REP_FIRM_DETAILS, List.of(new KSRepFirmDetailsReportBuilder(imdgProvider)));
resultMap.put(ReportType.SUMMARY_LIABILITIES_CLAIMS, List.of(summaryLiabilitiesClaimsReportBuilder));
resultMap.put(ReportType.SUMMARY_MONEY_CHANGE, List.of(summaryMoneyChangeReportBuilder));
resultMap.put(ReportType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder));
resultMap.put(ReportType.KS_REP_CASH_REGISTER_SUMS, List.of(ksRepCashRegisterSumsReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_REGISTERS, List.of(ksRepDepoRegistersReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_REGISTER_QUANTITIES, List.of(ksRepDepoRegisterQuantitiesReportBuilder));
resultMap.put(ReportType.KS_REP_TRADES, List.of(ksRepTradesReportBuilder));
resultMap.put(ReportType.KS_REP_FIRM_DETAILS, List.of(ksRepFirmDetailsReportBuilder));
return resultMap;
}
@Bean("reportBuildersWithSessionIdParam")
public Map<ReportType, List<CSVReportBuilder<SessionIdParam>>> reportBuildersWithSessionIdParam(ImdgProvider imdgProvider) {
public Map<ReportType, List<CSVReportBuilder<SessionIdParam>>> reportBuildersWithSessionIdParam(
OperationalLiabilitiesClaimsReportBuilder operationalLiabilitiesClaimsReportBuilder,
OperationalMoneyChangeReportBuilder operationalMoneyChangeReportBuilder,
ExecutedDealReportBuilder_INFTYPE_1 executedDealReportBuilder_inftype_1,
ExecutedDealReportBuilder_INFTYPE_2 executedDealReportBuilder_inftype_2,
ExecutedDealReportBuilder_INFTYPE_3 executedDealReportBuilder_inftype_3,
ExecutedDealReportBuilder_INFTYPE_4 executedDealReportBuilder_inftype_4,
UnfulfilledDealReportBuilder unfulfilledDealReportBuilder,
KSRepCashNettoReportBuilder ksRepCashNettoReportBuilder,
KSRepDepoNettoReportBuilder ksRepDepoNettoReportBuilder
) {
Map<ReportType, List<CSVReportBuilder<SessionIdParam>>> resultMap = new HashMap<>();
resultMap.put(ReportType.OPERATIONAL_LIABILITIES_CLAIMS, List.of(new OperationalLiabilitiesClaimsReportBuilder(imdgProvider)));
resultMap.put(ReportType.OPERATIONAL_MONEY_CHANGE, List.of(new OperationalMoneyChangeReportBuilder(imdgProvider)));
resultMap.put(ReportType.OPERATIONAL_LIABILITIES_CLAIMS, List.of(operationalLiabilitiesClaimsReportBuilder));
resultMap.put(ReportType.OPERATIONAL_MONEY_CHANGE, List.of(operationalMoneyChangeReportBuilder));
resultMap.put(ReportType.EXECUTED_DEAL_REPORT,
List.of(
new ExecutedDealReportBuilder_INFTYPE_1(imdgProvider),
new ExecutedDealReportBuilder_INFTYPE_2(imdgProvider),
new ExecutedDealReportBuilder_INFTYPE_3(imdgProvider),
new ExecutedDealReportBuilder_INFTYPE_4(imdgProvider)
executedDealReportBuilder_inftype_1,
executedDealReportBuilder_inftype_2,
executedDealReportBuilder_inftype_3,
executedDealReportBuilder_inftype_4
)
);
resultMap.put(ReportType.UNFULFILLED_DEAL_REPORT, List.of(new UnfulfilledDealReportBuilder(imdgProvider)));
resultMap.put(ReportType.KS_REP_CASH_NETTO, List.of(new KSRepCashNettoReportBuilder(imdgProvider)));
resultMap.put(ReportType.KS_REP_DEPO_NETTO, List.of(new KSRepDepoNettoReportBuilder(imdgProvider)));
resultMap.put(ReportType.UNFULFILLED_DEAL_REPORT, List.of(unfulfilledDealReportBuilder));
resultMap.put(ReportType.KS_REP_CASH_NETTO, List.of(ksRepCashNettoReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_NETTO, List.of(ksRepDepoNettoReportBuilder));
return resultMap;
}
@Bean("reportBuildersWithSessionIdListParam")
public Map<ReportType, List<CSVReportBuilder<SessionIdListParams>>> reportBuildersWithSessionIdListParams(ImdgProvider imdgProvider) {
public Map<ReportType, List<CSVReportBuilder<SessionIdListParams>>> reportBuildersWithSessionIdListParams(
PeriodLiabilitiesClaimsReportBuilder periodLiabilitiesClaimsReportBuilder
) {
Map<ReportType, List<CSVReportBuilder<SessionIdListParams>>> resultMap = new HashMap<>();
resultMap.put(ReportType.PERIOD_LIABILITIES_CLAIMS, List.of(new PeriodLiabilitiesClaimsReportBuilder(imdgProvider)));
resultMap.put(ReportType.PERIOD_LIABILITIES_CLAIMS, List.of(periodLiabilitiesClaimsReportBuilder));
return resultMap;
}
@Bean("reportBuildersWithPeriodParams")
public Map<ReportType, List<CSVReportBuilder<PeriodParams>>> reportBuildersWithPeriodParams(ImdgProvider imdgProvider) {
public Map<ReportType, List<CSVReportBuilder<PeriodParams>>> reportBuildersWithPeriodParams(
PeriodMoneyChangeReportBuilder periodMoneyChangeReportBuilder
) {
Map<ReportType, List<CSVReportBuilder<PeriodParams>>> resultMap = new HashMap<>();
resultMap.put(ReportType.PERIOD_MONEY_CHANGE, List.of(new PeriodMoneyChangeReportBuilder(imdgProvider)));
resultMap.put(ReportType.PERIOD_MONEY_CHANGE, List.of(periodMoneyChangeReportBuilder));
return resultMap;
}
@Bean("reportBuildersForGREP")
public Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGREP(
SummaryLiabilitiesClaimsReportBuilder summaryLiabilitiesClaimsReportBuilder,
SummaryMoneyChangeReportBuilder summaryMoneyChangeReportBuilder,
KSRepCashRegistersReportBuilder ksRepCashRegistersReportBuilder,
KSRepCashRegisterSumsReportBuilder ksRepCashRegisterSumsReportBuilder,
KSRepDepoRegistersReportBuilder ksRepDepoRegistersReportBuilder,
KSRepDepoRegisterQuantitiesReportBuilder ksRepDepoRegisterQuantitiesReportBuilder,
KSRepTradesReportBuilder ksRepTradesReportBuilder,
KSRepFirmDetailsReportBuilder ksRepFirmDetailsReportBuilder,
KSRepCashNettoReportBuilder ksRepCashNettoReportBuilder,
KSRepDepoNettoReportBuilder ksRepDepoNettoReportBuilder,
PeriodLiabilitiesClaimsReportBuilder periodLiabilitiesClaimsReportBuilder,
PeriodMoneyChangeReportBuilder periodMoneyChangeReportBuilder
) {
Map<ReportType, List<CSVReportBuilder<?>>> resultMap = new HashMap<>();
resultMap.put(ReportType.SUMMARY_LIABILITIES_CLAIMS, List.of(summaryLiabilitiesClaimsReportBuilder));
resultMap.put(ReportType.SUMMARY_MONEY_CHANGE, List.of(summaryMoneyChangeReportBuilder));
resultMap.put(ReportType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder));
resultMap.put(ReportType.KS_REP_CASH_REGISTER_SUMS, List.of(ksRepCashRegisterSumsReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_REGISTERS, List.of(ksRepDepoRegistersReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_REGISTER_QUANTITIES, List.of(ksRepDepoRegisterQuantitiesReportBuilder));
resultMap.put(ReportType.KS_REP_TRADES, List.of(ksRepTradesReportBuilder));
resultMap.put(ReportType.KS_REP_FIRM_DETAILS, List.of(ksRepFirmDetailsReportBuilder));
resultMap.put(ReportType.KS_REP_CASH_NETTO, List.of(ksRepCashNettoReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_NETTO, List.of(ksRepDepoNettoReportBuilder));
resultMap.put(ReportType.PERIOD_LIABILITIES_CLAIMS, List.of(periodLiabilitiesClaimsReportBuilder));
resultMap.put(ReportType.PERIOD_MONEY_CHANGE, List.of(periodMoneyChangeReportBuilder));
return resultMap;
}
@Bean("reportBuildersForGREF")
public Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGREF(
KSRepCashRegistersReportBuilder ksRepCashRegistersReportBuilder,
KSRepCashRegisterSumsReportBuilder ksRepCashRegisterSumsReportBuilder,
KSRepDepoRegistersReportBuilder ksRepDepoRegistersReportBuilder,
KSRepDepoRegisterQuantitiesReportBuilder ksRepDepoRegisterQuantitiesReportBuilder,
KSRepTradesReportBuilder ksRepTradesReportBuilder,
KSRepFirmDetailsReportBuilder ksRepFirmDetailsReportBuilder,
KSRepCashNettoReportBuilder ksRepCashNettoReportBuilder,
KSRepDepoNettoReportBuilder ksRepDepoNettoReportBuilder
) {
Map<ReportType, List<CSVReportBuilder<?>>> resultMap = new HashMap<>();
resultMap.put(ReportType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder));
resultMap.put(ReportType.KS_REP_CASH_REGISTER_SUMS, List.of(ksRepCashRegisterSumsReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_REGISTERS, List.of(ksRepDepoRegistersReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_REGISTER_QUANTITIES, List.of(ksRepDepoRegisterQuantitiesReportBuilder));
resultMap.put(ReportType.KS_REP_TRADES, List.of(ksRepTradesReportBuilder));
resultMap.put(ReportType.KS_REP_FIRM_DETAILS, List.of(ksRepFirmDetailsReportBuilder));
resultMap.put(ReportType.KS_REP_CASH_NETTO, List.of(ksRepCashNettoReportBuilder));
resultMap.put(ReportType.KS_REP_DEPO_NETTO, List.of(ksRepDepoNettoReportBuilder));
return resultMap;
}
@Bean("reportBuildersForGRET")
public Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGRET(
ExecutedDealReportBuilder_INFTYPE_1 executedDealReportBuilder_inftype_1,
ExecutedDealReportBuilder_INFTYPE_2 executedDealReportBuilder_inftype_2,
ExecutedDealReportBuilder_INFTYPE_3 executedDealReportBuilder_inftype_3,
ExecutedDealReportBuilder_INFTYPE_4 executedDealReportBuilder_inftype_4,
UnfulfilledDealReportBuilder unfulfilledDealReportBuilder
) {
Map<ReportType, List<CSVReportBuilder<?>>> resultMap = new HashMap<>();
resultMap.put(ReportType.EXECUTED_DEAL_REPORT,
List.of(
executedDealReportBuilder_inftype_1,
executedDealReportBuilder_inftype_2,
executedDealReportBuilder_inftype_3,
executedDealReportBuilder_inftype_4
)
);
resultMap.put(ReportType.UNFULFILLED_DEAL_REPORT, List.of(unfulfilledDealReportBuilder));
return resultMap;
}
}

View file

@ -155,7 +155,7 @@ public class ValidationConfig {
// todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту,
// запрос не проверяется: в случае если sessionId не указан отчеты не строятся
@Bean("reportRequestGREP")
@Bean("reportRequestGREPValidator")
public Function<LauncherCommandRequest, IValidator> reportRequestGREPValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
@ -174,7 +174,7 @@ public class ValidationConfig {
// todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту,
// запрос не проверяется: в случае если sessionId не указан отчеты не строятся
@Bean("reportRequestGRET")
@Bean("reportRequestGRETValidator")
public Function<LauncherCommandRequest, IValidator> reportRequestGRETValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
@ -193,7 +193,7 @@ public class ValidationConfig {
// todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту,
// запрос не проверяется: в случае если sessionId не указан отчеты не строятся
@Bean("reportRequestGREF")
@Bean("reportRequestGREFValidator")
public Function<LauncherCommandRequest, IValidator> reportRequestGREFValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {

View file

@ -53,6 +53,11 @@ public abstract class CSVReportBuilder<P> {
*/
public abstract ReportType getReportType();
/**
* Тип параметров для построения отчетов
*/
public abstract Class<P> getParamsType();
/**
* Формирование отчета на основе параметров
*

View file

@ -38,4 +38,12 @@ public class PairRegistryId {
public int hashCode() {
return Objects.hash(groupId, settlementDate);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PairRegistryId that = (PairRegistryId) o;
return Objects.equals(groupId, that.groupId) && Objects.equals(settlementDate, that.settlementDate);
}
}

View file

@ -14,7 +14,10 @@ import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilder<T> {
protected final DateTimeFormatter fileNameDateTimeFormatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
@ -55,17 +58,11 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
protected void collect(T params) {
Collection<ExecutionFond> executionFonds = getExecutionFondsForReport(params);
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
lines = new ArrayList<>(executionFonds.size());
for (ExecutionFond executionFond : executionFonds) {
try {
Boolean activeCompany = activeCompanyForId.get(executionFond.getCompanyId());
if (activeCompany == null) {
Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
activeCompanyForId.put(executionFond.getCompanyId(), activeCompany);
}
if (!activeCompany) continue;
Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
STrades sTrade = null;
if (executionFond.getSide() != null && executionFond.getExchangeExecutionId() != null) {

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -9,6 +12,8 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class ExecutedDealReportBuilder_INFTYPE_1 extends ExecutedDealReportBuilderCommon<SessionIdParam> {
public ExecutedDealReportBuilder_INFTYPE_1(ImdgProvider imdgProvider) {
@ -20,6 +25,11 @@ public class ExecutedDealReportBuilder_INFTYPE_1 extends ExecutedDealReportBuild
return "KS_BR_PFX64_INFTYPE_1_%s".formatted(fileNameDateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
@Override
protected Collection<ExecutionFond> getExecutionFondsForReport(SessionIdParam params) {
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -9,6 +12,8 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class ExecutedDealReportBuilder_INFTYPE_2 extends ExecutedDealReportBuilderCommon<SessionIdParam> {
public ExecutedDealReportBuilder_INFTYPE_2(ImdgProvider imdgProvider) {
@ -20,6 +25,11 @@ public class ExecutedDealReportBuilder_INFTYPE_2 extends ExecutedDealReportBuild
return "KS_BR_PFX64_INFTYPE_2_%s".formatted(fileNameDateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
@Override
protected Collection<ExecutionFond> getExecutionFondsForReport(SessionIdParam params) {
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -9,6 +12,8 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class ExecutedDealReportBuilder_INFTYPE_3 extends ExecutedDealReportBuilderCommon<SessionIdParam> {
public ExecutedDealReportBuilder_INFTYPE_3(ImdgProvider imdgProvider) {
@ -20,6 +25,11 @@ public class ExecutedDealReportBuilder_INFTYPE_3 extends ExecutedDealReportBuild
return "KS_BR_PFX64_INFTYPE_3_%s".formatted(fileNameDateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
@Override
protected Collection<ExecutionFond> getExecutionFondsForReport(SessionIdParam params) {
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.enumeration.Allowed;
@ -10,6 +13,8 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class ExecutedDealReportBuilder_INFTYPE_4 extends ExecutedDealReportBuilderCommon<SessionIdParam> {
public ExecutedDealReportBuilder_INFTYPE_4(ImdgProvider imdgProvider) {
@ -21,6 +26,11 @@ public class ExecutedDealReportBuilder_INFTYPE_4 extends ExecutedDealReportBuild
return "KS_BR_PFX64_INFTYPE_4_%s".formatted(fileNameDateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
@Override
protected Collection<ExecutionFond> getExecutionFondsForReport(SessionIdParam params) {
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdParam;
@ -10,6 +13,8 @@ import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Map;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class OperationalLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsReportBuilder<SessionIdParam> {
public OperationalLiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
super(imdgProvider);
@ -40,4 +45,9 @@ public class OperationalLiabilitiesClaimsReportBuilder extends LiabilitiesClaims
public ReportType getReportType() {
return ReportType.OPERATIONAL_LIABILITIES_CLAIMS;
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
}

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.enumeration.ReportType;
@ -9,6 +12,8 @@ import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Map;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class OperationalMoneyChangeReportBuilder extends MoneyChangeReportBuilder<SessionIdParam> {
public OperationalMoneyChangeReportBuilder(ImdgProvider imdgProvider) {
super(imdgProvider);
@ -30,4 +35,9 @@ public class OperationalMoneyChangeReportBuilder extends MoneyChangeReportBuilde
public ReportType getReportType() {
return ReportType.OPERATIONAL_MONEY_CHANGE;
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
}

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.SessionIdListParams;
@ -13,6 +16,8 @@ import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class PeriodLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsReportBuilder<SessionIdListParams> {
public PeriodLiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
@ -29,6 +34,11 @@ public class PeriodLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsRepor
return ReportType.PERIOD_LIABILITIES_CLAIMS;
}
@Override
public Class<SessionIdListParams> getParamsType() {
return SessionIdListParams.class;
}
@Override
protected Collection<ExecutionFond> getExecutionFondsForReport(SessionIdListParams params) {
if (params.getSessionIdList() == null || params.getSessionIdList().isEmpty()) return Collections.emptyList();

View file

@ -1,15 +1,21 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.reports.reports.PeriodParams;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.stream.Collectors;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class PeriodMoneyChangeReportBuilder extends MoneyChangeReportBuilder<PeriodParams> {
public PeriodMoneyChangeReportBuilder(ImdgProvider imdgProvider) {
@ -19,16 +25,14 @@ public class PeriodMoneyChangeReportBuilder extends MoneyChangeReportBuilder<Per
@Override
protected Collection<Registry> getRegistryForReport(PeriodParams params) {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM__, RegistryTradingParams.LM__).build();
return registryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.sql(sql),
pb.greatEqual("clearingDate", params.getStartDate()),
pb.lessEqual("clearingDate", params.getEndDate())
)
);
registries = registries.stream()
.filter(registry -> registry.getRegistryCode().startsWith("CM") || registry.getRegistryCode().startsWith("LM"))
.collect(Collectors.toList());
return registries;
}
@Override
@ -45,4 +49,9 @@ public class PeriodMoneyChangeReportBuilder extends MoneyChangeReportBuilder<Per
return ReportType.PERIOD_MONEY_CHANGE;
}
@Override
public Class<PeriodParams> getParamsType() {
return PeriodParams.class;
}
}

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.reports.reports.EmptyParams;
@ -11,6 +14,8 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class SummaryLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsReportBuilder<EmptyParams> {
public SummaryLiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
super(imdgProvider);
@ -41,4 +46,9 @@ public class SummaryLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsRepo
public ReportType getReportType() {
return ReportType.SUMMARY_LIABILITIES_CLAIMS;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
}

View file

@ -1,16 +1,22 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.stream.Collectors;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class SummaryMoneyChangeReportBuilder extends MoneyChangeReportBuilder<EmptyParams> {
public SummaryMoneyChangeReportBuilder(ImdgProvider imdgProvider) {
super(imdgProvider);
@ -20,18 +26,16 @@ public class SummaryMoneyChangeReportBuilder extends MoneyChangeReportBuilder<Em
protected Collection<Registry> getRegistryForReport(EmptyParams param) {
// todo отсечение по периоду - временный код, пока не решили как передавать в GREP период.
// по изначальной задумке в summary отчет должны включаться все записи.
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM__, RegistryTradingParams.LM__).build();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
LocalDate now = LocalDate.now();
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(
return registryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.sql(sql),
pb.greatEqual("clearingDate", now),
pb.lessEqual("clearingDate", now)
)
);
registries = registries.stream()
.filter(registry -> registry.getRegistryCode().startsWith("CM") || registry.getRegistryCode().startsWith("LM"))
.collect(Collectors.toList());
return registries;
}
@Override
@ -44,4 +48,9 @@ public class SummaryMoneyChangeReportBuilder extends MoneyChangeReportBuilder<Em
return ReportType.SUMMARY_MONEY_CHANGE;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
}

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.bp;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.misc.STrades;
@ -17,6 +20,8 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDateTime;
import java.util.*;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdParam> {
private final Imdg<ExecutionFond> executionFondImdg;
private final Imdg<Company> companyImdg;
@ -52,6 +57,11 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdPara
return ReportType.UNFULFILLED_DEAL_REPORT;
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
@Override
protected void collect(SessionIdParam params) {
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();

View file

@ -23,10 +23,7 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
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
@ -65,6 +62,11 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
return ReportType.KS_REP_CASH_NETTO;
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
@Override
protected void collect(SessionIdParam params) {
LocalDate nowDate = LocalDate.now();
@ -78,14 +80,12 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
pb.or(
pb.equals("accountType", AccountType.Clrn.getKey()),
pb.equals("accountType", AccountType.Info.getKey())
)
),
pb.notNull("settlementDate"),
pb.notNull("groupId")
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
// todo check filter (skip register without log)
Map<PairRegistryId, List<Registry>> registryMap = registries.stream()
.filter(r -> r.getGroupId() != null && r.getSettlementDate() != null)
.collect(Collectors.groupingBy(PairRegistryId::new));
Map<PairRegistryId, List<Registry>> registryMap = registries.stream().collect(Collectors.groupingBy(PairRegistryId::new));
lines = new ArrayList<>(registryMap.size());
for (Map.Entry<PairRegistryId, List<Registry>> entry : registryMap.entrySet()) {
@ -113,8 +113,8 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
continue;
}
if (!tmtRegistry.getAccount().equals(omtRegistry.getAccount()) ||
!tmtRegistry.getTradingCode().equals(omtRegistry.getTradingCode())) {
if (!Objects.equals(tmtRegistry.getAccount(), omtRegistry.getAccount()) ||
!Objects.equals(tmtRegistry.getTradingCode(), omtRegistry.getTradingCode())) {
log.warn("Invalid TM_T and OM_T registry pair, account or tradingCode not equals. Registry pair was skipped");
continue;
}

View file

@ -1,24 +1,33 @@
package ru.spcex.clearing.reports.reports.ks;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyParams> {
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
@ -53,14 +62,20 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
return ReportType.KS_REP_CASH_REGISTER_SUMS;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build();
ImdgPredicate finalPredicate = pb.and(
pb.regex("registryCode", "AM.."),
pb.sql(sql),
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.or(
@ -69,18 +84,11 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
)
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
lines = new ArrayList<>(registries.size());
for (Registry registry : registries) {
try {
Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId());
if (activeCompany == null) {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
activeCompanyForId.put(registry.getCompanyId(), activeCompany);
}
if (!activeCompany) continue;
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String account = registry.getAccount();

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.ks;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.platform.dictionary.RegistryCodeDictionary;
@ -7,19 +10,26 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParams> {
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
@ -56,14 +66,20 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
return ReportType.KS_REP_CASH_REGISTERS;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).build();
ImdgPredicate finalPredicate = pb.and(
pb.regex("registryCode", "AM.T"),
pb.sql(sql),
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.or(
@ -72,20 +88,11 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
)
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
Map<String, String> nameForRegisterCode = new HashMap<>();
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
lines = new ArrayList<>(registries.size());
for (Registry registry : registries) {
try {
Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId());
if (activeCompany == null) {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
activeCompanyForId.put(registry.getCompanyId(), activeCompany);
}
if (!activeCompany) continue;
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String account = registry.getAccount();
@ -93,12 +100,9 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
String date = dateFormatter.format(nowDate);
String registerCode = registry.getRegistryCode();
String registerName = nameForRegisterCode.get(registerCode);
if (registerName == null) {
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode));
registerName = registryCodeDescription != null && registryCodeDescription.getName() != null ? registryCodeDescription.getName() : "";
nameForRegisterCode.put(registerCode, registerName);
}
String registerName = "";
RegistryCodeDictionary registryCodeDictionary = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode));
if (registryCodeDictionary != null) registerName = registryCodeDictionary.getName();
String openBalance = registry.getOpenBalance() != null ? df02Format.format(registry.getOpenBalance()) : "";

View file

@ -1,23 +1,33 @@
package ru.spcex.clearing.reports.reports.ks;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.PairRegistryId;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportType;
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 java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam> {
private final Imdg<Registry> registryImdg;
private final Imdg<Session> sessionImdg;
@ -52,81 +62,72 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
return ReportType.KS_REP_DEPO_NETTO;
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
@Override
protected void collect(SessionIdParam params) {
LocalDate nowDate = LocalDate.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TS_T, RegistryTradingParams.OS_T).build();
ImdgPredicate finalPredicate = pb.and(
pb.equals("sessionId", params.getSessionId()),
pb.equals("clearingDate", nowDate),
pb.regex("registryCode","[T|O]S.T"),
pb.equals("accountType", AccountType.Depo.getKey())
pb.sql(sql),
pb.equals("accountType", AccountType.Depo.getKey()),
pb.notNull("settlementDate"),
pb.notNull("groupId")
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
Map<String, Boolean> registryAlreadySaved = new HashMap<>();
Map<String, Registry> ostRegistries = new HashMap<>();
Map<String, Registry> tstRegistries = new HashMap<>();
for (Registry registry : registries) {
if (registry.getGroupId() == null || registry.getSettlementDate() == null) continue;
registryAlreadySaved.put(registry.getGroupId() + registry.getSettlementDate().toString(), false);
if (registry.getRegistryCode().startsWith("O")) {
Registry existOSTRegistry = ostRegistries.get(registry.getGroupId() + registry.getSettlementDate().toString());
if (existOSTRegistry != null && existOSTRegistry.getBalance() != null) {
log.warn("Duplicated registry OM*T (id = {} and id = {}). Use id = {}",
registry.getId(),
existOSTRegistry,
existOSTRegistry);
} else ostRegistries.put(registry.getGroupId() + registry.getSettlementDate().toString(), registry);
}
if (registry.getRegistryCode().startsWith("T")) {
Registry existTSTRegistry = tstRegistries.get(registry.getGroupId() + registry.getSettlementDate().toString());
if (existTSTRegistry != null && existTSTRegistry.getBalance() != null) {
log.warn("Duplicated registry TM*T (id = {} and id = {}). Use id = {}",
registry.getId(),
existTSTRegistry,
existTSTRegistry);
} else tstRegistries.put(registry.getGroupId() + registry.getSettlementDate().toString(), registry);
}
}
Map<Long, String> createdAtForSessionId = new HashMap<>();
Map<PairRegistryId, List<Registry>> registryMap = registries.stream().collect(Collectors.groupingBy(PairRegistryId::new));
lines = new ArrayList<>(registries.size());
for (Registry registry : registries) {
for (Map.Entry<PairRegistryId, List<Registry>> entry : registryMap.entrySet()) {
PairRegistryId pairRegistryId = entry.getKey();
List<Registry> groupedRegistry = entry.getValue();
try {
if (registry.getGroupId() == null || registry.getSettlementDate() == null) {
log.warn("Registry without GroupId or SettlementDate, id = {}. Skipped", registry.getId());
continue;
}
if (registryAlreadySaved.get(registry.getGroupId() + registry.getSettlementDate().toString())) continue;
Registry tstRegistry = tstRegistries.get(registry.getGroupId() + registry.getSettlementDate().toString());
Registry ostRegistry = ostRegistries.get(registry.getGroupId() + registry.getSettlementDate().toString());
if (!tstRegistry.getTradingCode().equalsIgnoreCase(ostRegistry.getTradingCode()) ||
!tstRegistry.getSessionId().equals(ostRegistry.getSessionId()) ||
!tstRegistry.getAccount().equals(ostRegistry.getAccount())) {
log.warn("Invalid registry OS*T (id = {}) and TS*T (id = {}) registry pair: fields not equal. GroupId = {}, SettlementDate = {}. Skipped",
ostRegistry.getId(),
tstRegistry.getId(),
registry.getSettlementDate(),
registry.getGroupId());
if (groupedRegistry.size() != 2) {
log.warn("Invalid OM_T and TM_T registries for GroupId = {} and SettlementDate = {}. Registries with id = [{}] was skipped",
pairRegistryId.getGroupId(),
pairRegistryId.getSettlementDate(),
groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", "))
);
continue;
}
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String sessionId = String.valueOf(registry.getSessionId());
String sessionDate = createdAtForSessionId.get(registry.getSessionId());
if (sessionDate == null) {
Session session = sessionImdg.getSingleObjectByID(registry.getSessionId());
sessionDate = session != null && session.getCreated() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : "";
createdAtForSessionId.put(registry.getSessionId(), sessionDate);
Registry tstRegistry = null;
Registry ostRegistry = null;
for (Registry registry : groupedRegistry) {
if (RegistryDesignation.O.equalsByKey(registry.getRegistryDesignation())) ostRegistry = registry;
if (RegistryDesignation.T.equalsByKey(registry.getRegistryDesignation())) tstRegistry = registry;
}
String account = registry.getAccount();
String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : "";
if (tstRegistry == null || ostRegistry == null) {
log.warn("Invalid TM_T and OM_T registry pair, {} doubled. Registry pair was skipped", tstRegistry == null ? "OM_T" : "TM_T");
continue;
}
if (!Objects.equals(tstRegistry.getTradingCode(), ostRegistry.getTradingCode()) ||
!Objects.equals(tstRegistry.getAccount(), ostRegistry.getAccount()) ||
!Objects.equals(tstRegistry.getSecuritySymbol(), ostRegistry.getSecuritySymbol())) {
log.warn("Invalid TS_T and OS_T registry pair, account/tradingCode/securityId not equals. Registry pair was skipped");
continue;
}
String firmId = tstRegistry.getTradingCode() != null ? tstRegistry.getTradingCode() : "";
String sessionId = String.valueOf(tstRegistry.getSessionId());
Session session = sessionImdg.getSingleObjectByID(tstRegistry.getSessionId());
String sessionDate = "";
if (session != null && session.getCreated() != null)
sessionDate = dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault()));
String account = tstRegistry.getAccount();
String securityId = tstRegistry.getSecuritySymbol() != null ? tstRegistry.getSecuritySymbol() : "";
BigDecimal tmtBalance = tstRegistry.getBalance() != null ? tstRegistry.getBalance() : BigDecimal.ZERO;
BigDecimal omtBalance = ostRegistry.getBalance() != null ? ostRegistry.getBalance() : BigDecimal.ZERO;
@ -145,9 +146,12 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
line[valueIdx++] = date;
lines.add(line);
registryAlreadySaved.put(registry.getGroupId() + registry.getSettlementDate().toString(), true);
} catch (Throwable e) {
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
log.error(
"Can't create report row for registries (id = [%s]), row was skipped".formatted(
groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", "))
), e
);
}
}
}

View file

@ -1,24 +1,33 @@
package ru.spcex.clearing.reports.reports.ks;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams> {
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
@ -53,32 +62,31 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
return ReportType.KS_REP_DEPO_REGISTER_QUANTITIES;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS__).build();
ImdgPredicate finalPredicate = pb.and(
pb.regex("registryCode", "AS.."),
pb.sql(sql),
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("accountType", AccountType.Depo.getKey())
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
lines = new ArrayList<>(registries.size());
for (Registry registry : registries) {
try {
Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId());
if (activeCompany == null) {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
activeCompanyForId.put(registry.getCompanyId(), activeCompany);
}
if (!activeCompany) continue;
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String account = registry.getAccount();

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.ks;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.platform.dictionary.RegistryCodeDictionary;
@ -7,19 +10,26 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParams> {
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
@ -56,33 +66,31 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
return ReportType.KS_REP_DEPO_REGISTERS;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T).build();
ImdgPredicate finalPredicate = pb.and(
pb.regex("registryCode", "AS.T"),
pb.sql(sql),
pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)),
pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)),
pb.equals("accountType", AccountType.Depo.getKey())
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
Map<String, String> nameForRegisterCode = new HashMap<>();
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
lines = new ArrayList<>(registries.size());
for (Registry registry : registries) {
try {
Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId());
if (activeCompany == null) {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus());
activeCompanyForId.put(registry.getCompanyId(), activeCompany);
}
if (!activeCompany) continue;
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String account = registry.getAccount();
@ -90,12 +98,9 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : "";
String registerCode = registry.getRegistryCode();
String registerName = nameForRegisterCode.get(registerCode);
if (registerName == null) {
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode));
registerName = registryCodeDescription != null && registryCodeDescription.getName() != null ? registryCodeDescription.getName() : "";
nameForRegisterCode.put(registerCode, registerName);
}
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode));
String registerName = "";
if (registryCodeDescription != null) registerName = registryCodeDescription.getName();
String openQuantity = registry.getOpenBalance() != null ? registry.getOpenBalance().toString() : "";

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.ks;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
@ -13,14 +16,14 @@ import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams> {
private final Imdg<Company> companyImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
@ -58,10 +61,12 @@ public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams>
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
Instant instantNow = Instant.now();
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
@Override
protected void collect(EmptyParams params) {
Collection<Company> companies = companyImdg.getCollectionObjectsByFieldValues(Map.of("workflowStatus", WorkflowStatus.Active.getKey()));
lines = new ArrayList<>(companies.size());

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.reports.ks;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
@ -9,13 +12,11 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.platform.enumeration.CoverageStatus;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.ReportType;
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.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.time.LocalDate;
@ -24,6 +25,8 @@ import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
private final Imdg<ExecutionDeposit> executionDepositImdg;
private final Imdg<ExecutionFond> executionFondImdg;
@ -64,6 +67,11 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
return ReportType.KS_REP_TRADES;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
@ -84,7 +92,6 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
Map<Long, String> sessionDateForSessionId = new HashMap<>();
lines = new ArrayList<>(executions.size());
for (ExecutionCommon execution : executions) {
boolean brokenExecution = false;
try {
String sessionId = execution.getSessionId() != null ? String.valueOf(execution.getSessionId()) : "";
@ -141,9 +148,15 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
execution.getExchangeExecutionId(),
execution.getMarket()
);
String sql = RegistryCodeSqlBuilder.getInstance(
RegistryTradingParams.OS_T,
RegistryTradingParams.TS_T,
RegistryTradingParams.OM_T,
RegistryTradingParams.TM_T
).build();
Collection<Registry> registryCollection = registryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.regex("registryCode", "[O|T][S|M].[T]"),
pb.sql(sql),
pb.equals("groupId", groupId)
)
);

View file

@ -39,6 +39,7 @@ public class ReportService extends QueueConsumer implements InitializingBean {
private final UserRoleVerification userRoleVerification;
private final ValidationHelper validationHelper;
private final KafkaSender kafkaSender;
private final Function<ReportRequest, IValidator> reportRequestValidator;
private final Function<ReportRequestWithSessionId, IValidator> reportRequestWithSessionIdValidator;
private final Function<ReportRequestWithSessionIdList, IValidator> reportRequestWithSessionIdListValidator;
@ -46,10 +47,14 @@ public class ReportService extends QueueConsumer implements InitializingBean {
private final Function<LauncherCommandRequest, IValidator> reportRequestGREPValidator;
private final Function<LauncherCommandRequest, IValidator> reportRequestGRETValidator;
private final Function<LauncherCommandRequest, IValidator> reportRequestGREFValidator;
private final Map<ReportType, List<CSVReportBuilder<EmptyParams>>> reportBuildersWithoutParams;
private final Map<ReportType, List<CSVReportBuilder<SessionIdParam>>> reportBuildersWithSessionIdParam;
private final Map<ReportType, List<CSVReportBuilder<SessionIdListParams>>> reportBuildersWithSessionIdListParam;
private final Map<ReportType, List<CSVReportBuilder<PeriodParams>>> reportBuildersWithPeriodParams;
private final Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGREP;
private final Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGREF;
private final Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGRET;
private final File outFolder;
@ -59,6 +64,7 @@ public class ReportService extends QueueConsumer implements InitializingBean {
UserRoleVerification userRoleVerification,
ValidationHelper validationHelper,
ReportsServiceSettings reportsServiceSettings,
@Qualifier("reportBuildersWithoutParams")
Map<ReportType, List<CSVReportBuilder<EmptyParams>>> reportBuildersWithoutParams,
@Qualifier("reportBuildersWithSessionIdParam")
@ -67,6 +73,14 @@ public class ReportService extends QueueConsumer implements InitializingBean {
Map<ReportType, List<CSVReportBuilder<SessionIdListParams>>> reportBuildersWithSessionIdListParam,
@Qualifier("reportBuildersWithPeriodParams")
Map<ReportType, List<CSVReportBuilder<PeriodParams>>> reportBuildersWithPeriodParams,
@Qualifier("reportBuildersForGREP")
Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGREP,
@Qualifier("reportBuildersForGREF")
Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGREF,
@Qualifier("reportBuildersForGRET")
Map<ReportType, List<CSVReportBuilder<?>>> reportBuildersForGRET,
@Qualifier("reportRequestValidator")
Function<ReportRequest, IValidator> reportRequestValidator,
@Qualifier("reportRequestWithSessionIdValidator")
@ -75,12 +89,15 @@ public class ReportService extends QueueConsumer implements InitializingBean {
Function<ReportRequestWithSessionIdList, IValidator> reportRequestWithSessionIdListValidator,
@Qualifier("reportRequestWithPeriodValidator")
Function<ReportRequestWithPeriod, IValidator> reportRequestWithPeriodValidator,
@Qualifier("reportRequestGREP")
@Qualifier("reportRequestGREPValidator")
Function<LauncherCommandRequest, IValidator> reportRequestGREPValidator,
@Qualifier("reportRequestGRET")
@Qualifier("reportRequestGRETValidator")
Function<LauncherCommandRequest, IValidator> reportRequestGRETValidator,
@Qualifier("reportRequestGREF")
Function<LauncherCommandRequest, IValidator> reportRequestGREFValidator) {
@Qualifier("reportRequestGREFValidator")
Function<LauncherCommandRequest, IValidator> reportRequestGREFValidator
) {
super(kafkaQueue, kafkaResponseQueue);
this.userRoleVerification = userRoleVerification;
this.validationHelper = validationHelper;
@ -97,6 +114,9 @@ public class ReportService extends QueueConsumer implements InitializingBean {
this.reportRequestGRETValidator = reportRequestGRETValidator;
this.reportRequestGREFValidator = reportRequestGREFValidator;
this.outFolder = new File(reportsServiceSettings.getReportModuleOut());
this.reportBuildersForGREP = reportBuildersForGREP;
this.reportBuildersForGREF = reportBuildersForGREF;
this.reportBuildersForGRET = reportBuildersForGRET;
assert outFolder.isDirectory();
}
@ -275,94 +295,15 @@ public class ReportService extends QueueConsumer implements InitializingBean {
public RequestInfoUpdate createReportForGREP(BaseRequest<LauncherCommandRequest> userRequest) {
log.debug("GREP task received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return null;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGREPValidator);
if (requestInfoUpdate != null) return null;
Long sessionId = userRequest.getRequestPayload().getSessionId();
logUnknownProperties(userRequest);
int cntErrors = 0;
Map<String, ReportType> outFilenames = new HashMap<>();
Collection<List<CSVReportBuilder<EmptyParams>>> buildersWithoutParams = reportBuildersWithoutParams.values();
for (List<CSVReportBuilder<EmptyParams>> builderList : buildersWithoutParams) {
for (CSVReportBuilder<EmptyParams> builder : builderList) {
File outFile = builder.createReport(new EmptyParams(), outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
}
}
if (sessionId != null) {
Collection<List<CSVReportBuilder<SessionIdParam>>> buildersWithSessionIdParam = reportBuildersWithSessionIdParam.values();
for (List<CSVReportBuilder<SessionIdParam>> builderList : buildersWithSessionIdParam) {
for (CSVReportBuilder<SessionIdParam> builder : builderList) {
// todo возможно, для тасков GRET/GREP/GREF стоит сделать отдельные коллекции с билдерами, чтобы не проверять эти условия
if (
builder.getReportType() == ReportType.OPERATIONAL_MONEY_CHANGE ||
builder.getReportType() == ReportType.OPERATIONAL_LIABILITIES_CLAIMS ||
builder.getReportType() == ReportType.UNFULFILLED_DEAL_REPORT ||
builder.getReportType() == ReportType.EXECUTED_DEAL_REPORT
) {
continue;
}
SessionIdParam sessionIdParam = new SessionIdParam();
sessionIdParam.setSessionId(sessionId);
File outFile = builder.createReport(sessionIdParam, outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
}
}
Collection<List<CSVReportBuilder<SessionIdListParams>>> buildersWithSessionIdListParam = reportBuildersWithSessionIdListParam.values();
for (List<CSVReportBuilder<SessionIdListParams>> builderList : buildersWithSessionIdListParam) {
for (CSVReportBuilder<SessionIdListParams> builder : builderList) {
SessionIdListParams sessionIdListParams = new SessionIdListParams();
sessionIdListParams.setSessionIdList(List.of(sessionId));
File outFile = builder.createReport(sessionIdListParams, outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
}
}
}
LocalDate now = LocalDate.now();
Collection<List<CSVReportBuilder<PeriodParams>>> buildersWithPeriodParams = reportBuildersWithPeriodParams.values();
for (List<CSVReportBuilder<PeriodParams>> builderList : buildersWithPeriodParams) {
for (CSVReportBuilder<PeriodParams> builder : builderList) {
PeriodParams periodParams = new PeriodParams();
periodParams.setStartDate(now);
periodParams.setEndDate(now);
File outFile = builder.createReport(periodParams, outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
}
}
if (cntErrors == 0) log.debug("All reports successfully created. Output files: {}", String.join(", ", outFilenames.keySet()));
else log.debug("Some reports ({}) create failed. Output files: {}", cntErrors, String.join(", ", outFilenames.keySet()));
Long sessionId = userRequest.getRequestPayload().getSessionId();
Map<String, ReportType> outFilenames = createReportsForTask(sessionId, reportBuildersForGREP.values());
sendReportsToGateway(sessionId, outFilenames, "REPORT_KS_TMP");
return null;
@ -370,46 +311,15 @@ public class ReportService extends QueueConsumer implements InitializingBean {
public RequestInfoUpdate createReportForGRET(BaseRequest<LauncherCommandRequest> userRequest) {
log.debug("GRET task received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return null;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGRETValidator);
if (requestInfoUpdate != null) return null;
Long sessionId = userRequest.getRequestPayload().getSessionId();
logUnknownProperties(userRequest);
int cntErrors = 0;
Map<String, ReportType> outFilenames = new HashMap<>();
if (sessionId != null) {
Collection<List<CSVReportBuilder<SessionIdParam>>> buildersWithSessionIdParam = reportBuildersWithSessionIdParam.values();
for (List<CSVReportBuilder<SessionIdParam>> builderList : buildersWithSessionIdParam) {
for (CSVReportBuilder<SessionIdParam> builder : builderList) {
// todo возможно, для тасков GRET/GREP/GREF стоит сделать отдельные коллекции с билдерами, чтобы не проверять эти условия
if (
builder.getReportType() != ReportType.UNFULFILLED_DEAL_REPORT &&
builder.getReportType() != ReportType.EXECUTED_DEAL_REPORT
) {
continue;
}
SessionIdParam sessionIdParam = new SessionIdParam();
sessionIdParam.setSessionId(sessionId);
File outFile = builder.createReport(sessionIdParam, outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
}
}
}
if (cntErrors == 0) log.debug("All reports successfully created. Output files: {}", String.join(", ", outFilenames.keySet()));
else log.debug("Some reports ({}) create failed. Output files: {}", cntErrors, String.join(", ", outFilenames.keySet()));
Long sessionId = userRequest.getRequestPayload().getSessionId();
Map<String, ReportType> outFilenames = createReportsForTask(sessionId, reportBuildersForGRET.values());
sendReportsToGateway(sessionId, outFilenames, null);
return null;
@ -420,55 +330,56 @@ public class ReportService extends QueueConsumer implements InitializingBean {
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return null;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGREFValidator);
if (requestInfoUpdate != null) return null;
Long sessionId = userRequest.getRequestPayload().getSessionId();
logUnknownProperties(userRequest);
int cntErrors = 0;
Long sessionId = userRequest.getRequestPayload().getSessionId();
Map<String, ReportType> outFilenames = createReportsForTask(sessionId, reportBuildersForGREF.values());
sendReportsToGateway(sessionId, outFilenames, "REPORT_KS_FINAL");
return null;
}
private Map<String, ReportType> createReportsForTask(Long sessionId, Collection<List<CSVReportBuilder<?>>> buildersForTask) {
Map<String, ReportType> outFilenames = new HashMap<>();
Collection<List<CSVReportBuilder<EmptyParams>>> buildersWithoutParams = reportBuildersWithoutParams.values();
for (List<CSVReportBuilder<EmptyParams>> builderList : buildersWithoutParams) {
for (CSVReportBuilder<EmptyParams> builder : builderList) {
// todo возможно, для тасков GRET/GREP/GREF стоит сделать отдельные коллекции с билдерами, чтобы не проверять эти условия
if (
builder.getReportType() != ReportType.KS_REP_CASH_REGISTERS &&
builder.getReportType() != ReportType.KS_REP_CASH_REGISTER_SUMS &&
builder.getReportType() != ReportType.KS_REP_DEPO_REGISTERS &&
builder.getReportType() != ReportType.KS_REP_DEPO_REGISTER_QUANTITIES &&
builder.getReportType() != ReportType.KS_REP_TRADES &&
builder.getReportType() != ReportType.KS_REP_FIRM_DETAILS
) {
continue;
}
File outFile = builder.createReport(new EmptyParams(), outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
}
}
if (sessionId != null) {
Collection<List<CSVReportBuilder<SessionIdParam>>> buildersWithSessionIdParam = reportBuildersWithSessionIdParam.values();
for (List<CSVReportBuilder<SessionIdParam>> builderList : buildersWithSessionIdParam) {
for (CSVReportBuilder<SessionIdParam> builder : builderList) {
// todo возможно, для тасков GRET/GREP/GREF стоит сделать отдельные коллекции с билдерами, чтобы не проверять эти условия
if (
builder.getReportType() != ReportType.KS_REP_CASH_NETTO &&
builder.getReportType() != ReportType.KS_REP_DEPO_NETTO
) {
int cntErrors = 0;
LocalDate now = LocalDate.now();
for (List<CSVReportBuilder<?>> builders : buildersForTask) {
for (CSVReportBuilder<?> builder : builders) {
if (builder.getParamsType() == EmptyParams.class) {
File outFile = ((CSVReportBuilder<EmptyParams>) builder).createReport(new EmptyParams(), outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
} else if (builder.getParamsType() == SessionIdParam.class && sessionId != null) {
SessionIdParam sessionIdParam = new SessionIdParam();
sessionIdParam.setSessionId(sessionId);
File outFile = builder.createReport(sessionIdParam, outFolder);
File outFile = ((CSVReportBuilder<SessionIdParam>) builder).createReport(sessionIdParam, outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
} else if (builder.getParamsType() == SessionIdListParams.class && sessionId != null) {
SessionIdListParams sessionIdListParams = new SessionIdListParams();
sessionIdListParams.setSessionIdList(List.of(sessionId));
File outFile = ((CSVReportBuilder<SessionIdListParams>) builder).createReport(sessionIdListParams, outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
continue;
}
outFilenames.put(outFile.getName(), builder.getReportType());
} else if (builder.getParamsType() == PeriodParams.class) {
PeriodParams periodParams = new PeriodParams();
periodParams.setStartDate(now);
periodParams.setEndDate(now);
File outFile = ((CSVReportBuilder<PeriodParams>) builder).createReport(periodParams, outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;
@ -478,12 +389,10 @@ public class ReportService extends QueueConsumer implements InitializingBean {
}
}
}
if (cntErrors == 0) log.debug("All reports successfully created. Output files: {}", String.join(", ", outFilenames.keySet()));
else log.debug("Some reports ({}) create failed. Output files: {}", cntErrors, String.join(", ", outFilenames.keySet()));
sendReportsToGateway(sessionId, outFilenames, "REPORT_KS_FINAL");
return null;
return outFilenames;
}
private void sendReportsToGateway(Long sessionId, Map<String, ReportType> reportsWithReportType, String type) {

View file

@ -779,6 +779,8 @@ public class ReportServiceTest_BP {
testRegistry_1.setAccountId(TEST_MONEY_ACCOUNT_1);
String TEST_REGISTRY_CODE_1 = "CM";
testRegistry_1.setRegistryCode(TEST_REGISTRY_CODE_1);
testRegistry_1.setRegistryDesignation(RegistryDesignation.C.getKey());
testRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
testRegistry_1.setOpenBalance(TEST_OPEN_BALANCE_1);
testRegistry_1.setCloseBalance(TEST_CLOSE_BALANCE_1);
testRegistry_1.setCredit(TEST_CREDIT_1);
@ -797,6 +799,8 @@ public class ReportServiceTest_BP {
testRegistry_2.setAccountId(TEST_MONEY_ACCOUNT_2);
String TEST_REGISTRY_CODE_2 = "CM";
testRegistry_2.setRegistryCode(TEST_REGISTRY_CODE_2);
testRegistry_2.setRegistryDesignation(RegistryDesignation.C.getKey());
testRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
testRegistry_2.setOpenBalance(TEST_OPEN_BALANCE_2);
testRegistry_2.setCloseBalance(TEST_CLOSE_BALANCE_2);
testRegistry_2.setCredit(TEST_CREDIT_2);
@ -810,15 +814,27 @@ public class ReportServiceTest_BP {
testRegistryForCompanyId_2.setTradingClearingRegistry(TEST_TRADING_CLEARING_REGISTRY_2);
testRegistryForCompanyId_2.setUpdated(Instant.now());
tm_tRegistry_1.setRegistryCode("TM_T");
tm_tRegistry_1.setRegistryDesignation(RegistryDesignation.T.getKey());
tm_tRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
tm_tRegistry_1.setRegistryUnit(RegistryUnit.T.getKey());
tm_tRegistry_1.setBalance(BigDecimal.valueOf(779L));
tm_tRegistry_1.setUpdated(Instant.now());
om_tRegistry_1.setRegistryCode("OM_T");
om_tRegistry_1.setRegistryDesignation(RegistryDesignation.O.getKey());
om_tRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
om_tRegistry_1.setRegistryUnit(RegistryUnit.T.getKey());
om_tRegistry_1.setBalance(BigDecimal.valueOf(2L));
om_tRegistry_1.setUpdated(Instant.now());
ts_tRegistry_1.setRegistryCode("TS_T");
ts_tRegistry_1.setRegistryDesignation(RegistryDesignation.T.getKey());
ts_tRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
ts_tRegistry_1.setRegistryUnit(RegistryUnit.T.getKey());
ts_tRegistry_1.setBalance(BigDecimal.valueOf(889L));
ts_tRegistry_1.setUpdated(Instant.now());
os_tRegistry_1.setRegistryCode("OS_T");
os_tRegistry_1.setRegistryDesignation(RegistryDesignation.O.getKey());
os_tRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
os_tRegistry_1.setRegistryUnit(RegistryUnit.T.getKey());
os_tRegistry_1.setBalance(BigDecimal.valueOf(1L));
os_tRegistry_1.setUpdated(Instant.now());
tm_tRegistry_1.setSessionId(TEST_SESSION_ID_1);
@ -826,15 +842,27 @@ public class ReportServiceTest_BP {
ts_tRegistry_1.setSessionId(TEST_SESSION_ID_1);
os_tRegistry_1.setSessionId(TEST_SESSION_ID_1);
tm_tRegistry_2.setRegistryCode("TM_T");
tm_tRegistry_2.setRegistryDesignation(RegistryDesignation.T.getKey());
tm_tRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
tm_tRegistry_2.setRegistryUnit(RegistryUnit.T.getKey());
tm_tRegistry_2.setBalance(BigDecimal.valueOf(779L));
tm_tRegistry_2.setUpdated(Instant.now());
om_tRegistry_2.setRegistryCode("OM_T");
om_tRegistry_2.setRegistryDesignation(RegistryDesignation.O.getKey());
om_tRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
om_tRegistry_2.setRegistryUnit(RegistryUnit.T.getKey());
om_tRegistry_2.setBalance(BigDecimal.valueOf(2L));
om_tRegistry_2.setUpdated(Instant.now());
ts_tRegistry_2.setRegistryCode("TS_T");
ts_tRegistry_2.setRegistryDesignation(RegistryDesignation.T.getKey());
ts_tRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
ts_tRegistry_2.setRegistryUnit(RegistryUnit.T.getKey());
ts_tRegistry_2.setBalance(BigDecimal.valueOf(889L));
ts_tRegistry_2.setUpdated(Instant.now());
os_tRegistry_2.setRegistryCode("OS_T");
os_tRegistry_2.setRegistryDesignation(RegistryDesignation.O.getKey());
os_tRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
os_tRegistry_2.setRegistryUnit(RegistryUnit.T.getKey());
os_tRegistry_2.setBalance(BigDecimal.valueOf(1L));
os_tRegistry_2.setUpdated(Instant.now());
tm_tRegistry_2.setSessionId(TEST_SESSION_ID_2);

View file

@ -128,6 +128,9 @@ public class ReportServiceTest_KS {
Registry registry = new Registry();
registry.setCompanyId(COMPANY_ID);
registry.setRegistryCode("AM_T");
registry.setRegistryDesignation(RegistryDesignation.A.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry.setRegistryUnit(RegistryUnit.T.getKey());
registry.setUpdated(Instant.now());
registry.setTradingCode("TRADING_CODE");
registry.setAccount("ACCOUNT");
@ -169,6 +172,8 @@ public class ReportServiceTest_KS {
Registry registry_1 = new Registry();
registry_1.setCompanyId(COMPANY_ID);
registry_1.setRegistryCode("AM__");
registry_1.setRegistryDesignation(RegistryDesignation.A.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry_1.setUpdated(Instant.now());
registry_1.setTradingCode("TRADING_CODE");
registry_1.setAccount("ACCOUNT");
@ -210,6 +215,9 @@ public class ReportServiceTest_KS {
Registry registry = new Registry();
registry.setCompanyId(COMPANY_ID);
registry.setRegistryCode("AS_T");
registry.setRegistryDesignation(RegistryDesignation.A.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry.setRegistryUnit(RegistryUnit.T.getKey());
registry.setUpdated(Instant.now());
registry.setTradingCode("TRADING_CODE");
registry.setAccount("ACCOUNT");
@ -251,6 +259,8 @@ public class ReportServiceTest_KS {
Registry registry_1 = new Registry();
registry_1.setCompanyId(COMPANY_ID);
registry_1.setRegistryCode("AS__");
registry_1.setRegistryDesignation(RegistryDesignation.A.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_1.setSecuritySymbol("SECURITY_SYMBOL");
registry_1.setUpdated(Instant.now());
registry_1.setTradingCode("TRADING_CODE");
@ -308,6 +318,9 @@ public class ReportServiceTest_KS {
Registry registry = new Registry();
registry.setSessionId(sessionId_2);
registry.setRegistryCode("OM_T");
registry.setRegistryDesignation(RegistryDesignation.O.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry.setRegistryUnit(RegistryUnit.T.getKey());
registry.setGroupId(Long.parseLong("%s%d%s".formatted(dateFormatter_yyMMdd.format(LocalDate.now()), 222, "333")));
registry.setRegistryStatus(RegistryStatus.FAIL.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
@ -365,6 +378,9 @@ public class ReportServiceTest_KS {
registry_1.setGroupId(Long.MAX_VALUE);
registry_1.setClearingDate(LocalDate.now());
registry_1.setRegistryCode("OM_T");
registry_1.setRegistryDesignation(RegistryDesignation.O.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry_1.setRegistryUnit(RegistryUnit.T.getKey());
registry_1.setSessionId(sessionId);
registry_1.setAccount("ACCOUNT");
registry_1.setAccountType(AccountType.Clrn.getKey());
@ -377,6 +393,9 @@ public class ReportServiceTest_KS {
registry_2.setGroupId(Long.MAX_VALUE);
registry_2.setClearingDate(LocalDate.now());
registry_2.setRegistryCode("TM_T");
registry_2.setRegistryDesignation(RegistryDesignation.T.getKey());
registry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
registry_2.setRegistryUnit(RegistryUnit.T.getKey());
registry_2.setSessionId(sessionId);
registry_2.setAccount("ACCOUNT");
registry_2.setAccountType(AccountType.Clrn.getKey());
@ -421,6 +440,9 @@ public class ReportServiceTest_KS {
registry_1.setGroupId(Long.MAX_VALUE);
registry_1.setSettlementDate(LocalDate.now());
registry_1.setRegistryCode("TS_T");
registry_1.setRegistryDesignation(RegistryDesignation.T.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_1.setRegistryUnit(RegistryUnit.T.getKey());
registry_1.setSecuritySymbol("SECURITY_SYMBOL");
registry_1.setSessionId(sessionId);
registry_1.setAccount("ACCOUNT");
@ -434,6 +456,9 @@ public class ReportServiceTest_KS {
registry_2.setGroupId(Long.MAX_VALUE);
registry_2.setSettlementDate(LocalDate.now());
registry_2.setRegistryCode("OS_T");
registry_2.setRegistryDesignation(RegistryDesignation.O.getKey());
registry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_2.setRegistryUnit(RegistryUnit.T.getKey());
registry_2.setSecuritySymbol("SECURITY_SYMBOL");
registry_2.setSessionId(sessionId);
registry_2.setAccount("ACCOUNT");

View file

@ -34,6 +34,8 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation,
public final static RegistryTradingParams DM__;
public final static RegistryTradingParams AM__;
public final static RegistryTradingParams AS__;
public final static RegistryTradingParams CM__;
public final static RegistryTradingParams LM__;
static {
OS_T = new RegistryTradingParams(RegistryDesignation.O,
@ -117,6 +119,14 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation,
RegistryInstrumentType.S,
null,
null);
CM__ = new RegistryTradingParams(RegistryDesignation.C,
RegistryInstrumentType.M,
null,
null);
LM__ = new RegistryTradingParams(RegistryDesignation.L,
RegistryInstrumentType.M,
null,
null);
}
}

View file

@ -40,6 +40,11 @@ public class ImdgPredicateBuilderHazelcast implements ImdgPredicateBuilder {
return new ImdgPredicateHazelcast(Predicates.lessThan(key, cmpValue));
}
@Override
public ImdgPredicate notNull(String key) {
return new ImdgPredicateHazelcast(Predicates.not(Predicates.equal(key, null)));
}
@Override
public ImdgPredicate in(String key, Comparable[] values) {
return new ImdgPredicateHazelcast(Predicates.in(key, values));

View file

@ -6,6 +6,7 @@ public interface ImdgPredicateBuilder {
ImdgPredicate lessEqual(String key, Comparable value);
ImdgPredicate greater(String key, Comparable value);
ImdgPredicate less(String key, Comparable value);
ImdgPredicate notNull(String key);
ImdgPredicate in(String key, Comparable... values);