This commit is contained in:
akulikov 2023-07-07 19:21:07 +03:00
parent 69c5e63158
commit 075591d2ea
65 changed files with 1457 additions and 2265 deletions

View file

@ -3,7 +3,9 @@ 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.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.clearing.reports.reports.bp.*;
import ru.spcex.clearing.reports.reports.ks.*;
import ru.spcex.platform.enumeration.ReportBuilderType;
@ -16,9 +18,7 @@ import java.util.Map;
@ComponentScan(basePackages = "ru.spcex.clearing.reports.reports")
public class ReportBuildersConfig {
@Bean("reportBuildersWithoutParams")
public Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams>>> reportBuildersWithoutParams(
SummaryLiabilitiesClaimsReportBuilder summaryLiabilitiesClaimsReportBuilder,
SummaryMoneyChangeReportBuilder summaryMoneyChangeReportBuilder,
public Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams, ?>>> reportBuildersWithoutParams(
KSRepCashRegistersReportBuilder ksRepCashRegistersReportBuilder,
KSRepCashRegisterSumsReportBuilder ksRepCashRegisterSumsReportBuilder,
KSRepDepoRegistersReportBuilder ksRepDepoRegistersReportBuilder,
@ -26,9 +26,7 @@ public class ReportBuildersConfig {
KSRepTradesReportBuilder ksRepTradesReportBuilder,
KSRepFirmDetailsReportBuilder ksRepFirmDetailsReportBuilder
) {
Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.SUMMARY_LIABILITIES_CLAIMS, List.of(summaryLiabilitiesClaimsReportBuilder));
resultMap.put(ReportBuilderType.SUMMARY_MONEY_CHANGE, List.of(summaryMoneyChangeReportBuilder));
Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams, ?>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTER_SUMS, List.of(ksRepCashRegisterSumsReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_DEPO_REGISTERS, List.of(ksRepDepoRegistersReportBuilder));
@ -39,9 +37,7 @@ public class ReportBuildersConfig {
}
@Bean("reportBuildersWithSessionIdParam")
public Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam>>> reportBuildersWithSessionIdParam(
OperationalLiabilitiesClaimsReportBuilder operationalLiabilitiesClaimsReportBuilder,
OperationalMoneyChangeReportBuilder operationalMoneyChangeReportBuilder,
public Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam, ?>>> reportBuildersWithSessionIdParam(
ExecutedDealReportBuilder_INFTYPE_1 executedDealReportBuilder_inftype_1,
ExecutedDealReportBuilder_INFTYPE_2 executedDealReportBuilder_inftype_2,
ExecutedDealReportBuilder_INFTYPE_3 executedDealReportBuilder_inftype_3,
@ -50,9 +46,7 @@ public class ReportBuildersConfig {
KSRepCashNettoReportBuilder ksRepCashNettoReportBuilder,
KSRepDepoNettoReportBuilder ksRepDepoNettoReportBuilder
) {
Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.OPERATIONAL_LIABILITIES_CLAIMS, List.of(operationalLiabilitiesClaimsReportBuilder));
resultMap.put(ReportBuilderType.OPERATIONAL_MONEY_CHANGE, List.of(operationalMoneyChangeReportBuilder));
Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam, ?>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.EXECUTED_DEAL_REPORT,
List.of(
executedDealReportBuilder_inftype_1,
@ -67,57 +61,8 @@ public class ReportBuildersConfig {
return resultMap;
}
@Bean("reportBuildersWithSessionIdListParam")
public Map<ReportBuilderType, List<CSVReportBuilder<SessionIdListParams>>> reportBuildersWithSessionIdListParams(
PeriodLiabilitiesClaimsReportBuilder periodLiabilitiesClaimsReportBuilder
) {
Map<ReportBuilderType, List<CSVReportBuilder<SessionIdListParams>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.PERIOD_LIABILITIES_CLAIMS, List.of(periodLiabilitiesClaimsReportBuilder));
return resultMap;
}
@Bean("reportBuildersWithPeriodParams")
public Map<ReportBuilderType, List<CSVReportBuilder<PeriodParams>>> reportBuildersWithPeriodParams(
PeriodMoneyChangeReportBuilder periodMoneyChangeReportBuilder
) {
Map<ReportBuilderType, List<CSVReportBuilder<PeriodParams>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.PERIOD_MONEY_CHANGE, List.of(periodMoneyChangeReportBuilder));
return resultMap;
}
@Bean("reportBuildersForGREP")
public Map<ReportBuilderType, 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<ReportBuilderType, List<CSVReportBuilder<?>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.SUMMARY_LIABILITIES_CLAIMS, List.of(summaryLiabilitiesClaimsReportBuilder));
resultMap.put(ReportBuilderType.SUMMARY_MONEY_CHANGE, List.of(summaryMoneyChangeReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTER_SUMS, List.of(ksRepCashRegisterSumsReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_DEPO_REGISTERS, List.of(ksRepDepoRegistersReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_DEPO_REGISTER_QUANTITIES, List.of(ksRepDepoRegisterQuantitiesReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_TRADES, List.of(ksRepTradesReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_FIRM_DETAILS, List.of(ksRepFirmDetailsReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_CASH_NETTO, List.of(ksRepCashNettoReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_DEPO_NETTO, List.of(ksRepDepoNettoReportBuilder));
resultMap.put(ReportBuilderType.PERIOD_LIABILITIES_CLAIMS, List.of(periodLiabilitiesClaimsReportBuilder));
resultMap.put(ReportBuilderType.PERIOD_MONEY_CHANGE, List.of(periodMoneyChangeReportBuilder));
return resultMap;
}
@Bean("reportBuildersForGREF")
public Map<ReportBuilderType, List<CSVReportBuilder<?>>> reportBuildersForGREF(
public Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREP(
KSRepCashRegistersReportBuilder ksRepCashRegistersReportBuilder,
KSRepCashRegisterSumsReportBuilder ksRepCashRegisterSumsReportBuilder,
KSRepDepoRegistersReportBuilder ksRepDepoRegistersReportBuilder,
@ -127,7 +72,30 @@ public class ReportBuildersConfig {
KSRepCashNettoReportBuilder ksRepCashNettoReportBuilder,
KSRepDepoNettoReportBuilder ksRepDepoNettoReportBuilder
) {
Map<ReportBuilderType, List<CSVReportBuilder<?>>> resultMap = new HashMap<>();
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTER_SUMS, List.of(ksRepCashRegisterSumsReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_DEPO_REGISTERS, List.of(ksRepDepoRegistersReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_DEPO_REGISTER_QUANTITIES, List.of(ksRepDepoRegisterQuantitiesReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_TRADES, List.of(ksRepTradesReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_FIRM_DETAILS, List.of(ksRepFirmDetailsReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_CASH_NETTO, List.of(ksRepCashNettoReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_DEPO_NETTO, List.of(ksRepDepoNettoReportBuilder));
return resultMap;
}
@Bean("reportBuildersForGREF")
public Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREF(
KSRepCashRegistersReportBuilder ksRepCashRegistersReportBuilder,
KSRepCashRegisterSumsReportBuilder ksRepCashRegisterSumsReportBuilder,
KSRepDepoRegistersReportBuilder ksRepDepoRegistersReportBuilder,
KSRepDepoRegisterQuantitiesReportBuilder ksRepDepoRegisterQuantitiesReportBuilder,
KSRepTradesReportBuilder ksRepTradesReportBuilder,
KSRepFirmDetailsReportBuilder ksRepFirmDetailsReportBuilder,
KSRepCashNettoReportBuilder ksRepCashNettoReportBuilder,
KSRepDepoNettoReportBuilder ksRepDepoNettoReportBuilder
) {
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTER_SUMS, List.of(ksRepCashRegisterSumsReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_DEPO_REGISTERS, List.of(ksRepDepoRegistersReportBuilder));
@ -140,14 +108,14 @@ public class ReportBuildersConfig {
}
@Bean("reportBuildersForGRET")
public Map<ReportBuilderType, List<CSVReportBuilder<?>>> reportBuildersForGRET(
public Map<ReportBuilderType, 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<ReportBuilderType, List<CSVReportBuilder<?>>> resultMap = new HashMap<>();
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.EXECUTED_DEAL_REPORT,
List.of(
executedDealReportBuilder_inftype_1,

View file

@ -6,13 +6,10 @@ import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithPeriod;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionIdList;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.reports.errors.ReportError;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.clearing.validation.common.rules.EndDtAfterStartDtRule;
import ru.spcex.clearing.validation.common.rules.EnumPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
@ -59,8 +56,6 @@ public class ValidationConfig {
EnumPresentRule.instance("reportId",
ReportRequest::getReportId,
new IEnumKey[]{
ReportBuilderType.SUMMARY_LIABILITIES_CLAIMS,
ReportBuilderType.SUMMARY_MONEY_CHANGE,
ReportBuilderType.KS_REP_CASH_REGISTERS,
ReportBuilderType.KS_REP_CASH_REGISTER_SUMS,
ReportBuilderType.KS_REP_DEPO_REGISTERS,
@ -85,8 +80,6 @@ public class ValidationConfig {
EnumPresentRule.instance("reportId",
ReportRequestWithSessionId::getReportId,
new IEnumKey[]{
ReportBuilderType.OPERATIONAL_LIABILITIES_CLAIMS,
ReportBuilderType.OPERATIONAL_MONEY_CHANGE,
ReportBuilderType.EXECUTED_DEAL_REPORT,
ReportBuilderType.UNFULFILLED_DEAL_REPORT,
ReportBuilderType.KS_REP_CASH_NETTO,
@ -102,57 +95,6 @@ public class ValidationConfig {
};
}
@Bean("reportRequestWithSessionIdListValidator")
public Function<ReportRequestWithSessionIdList, IValidator> reportRequestWithSessionIdListValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return reportRequestWithSessionIdList -> {
ImdgValidationContext<ReportRequestWithSessionIdList> context = new ImdgValidationContext<>();
context.setValidatedObject(reportRequestWithSessionIdList);
return new ValidatorImpl<>(context,
EnumPresentRule.instance("reportId",
ReportRequestWithSessionIdList::getReportId,
new IEnumKey[]{
ReportBuilderType.PERIOD_LIABILITIES_CLAIMS
},
ReportError.WrongFieldValue,
ReportError.RequiredFieldEmpty),
FieldRequiredRule.instance("sessionIdList",
ReportRequestWithSessionIdList::getSessionIdList,
ReportError.RequiredFieldEmpty,
sessionIdList -> {
if (sessionIdList == null || sessionIdList.isEmpty())
return ReportError.WrongFieldValue;
return null;
})
);
};
}
@Bean("reportRequestWithPeriodValidator")
public Function<ReportRequestWithPeriod, IValidator> reportRequestWithPeriodValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return reportRequestWithPeriod -> {
ImdgValidationContext<ReportRequestWithPeriod> context = new ImdgValidationContext<>();
context.setValidatedObject(reportRequestWithPeriod);
return new ValidatorImpl<>(context,
EnumPresentRule.instance("reportId",
ReportRequestWithPeriod::getReportId,
new IEnumKey[]{
ReportBuilderType.PERIOD_MONEY_CHANGE,
},
ReportError.WrongFieldValue,
ReportError.RequiredFieldEmpty),
EndDtAfterStartDtRule.instance("startDate", "endDate",
ReportRequestWithPeriod::getStartDate,
ReportRequestWithPeriod::getEndDate,
ReportError.RequiredFieldEmpty,
ReportError.WrongFieldValue)
);
};
}
// todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту,
// запрос не проверяется: в случае если sessionId не указан отчеты не строятся
@Bean("reportRequestGREPValidator")

View file

@ -2,44 +2,41 @@ package ru.spcex.clearing.reports.reports;
import com.opencsv.CSVWriterBuilder;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.format.datetime.standard.InstantFormatter;
import ru.spcex.platform.enumeration.ReportBuilderType;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.DecimalFormat;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Locale;
/**
* Класс для построения отчетов в формате CSV
*
* @param <P> тип параметров, используемых при построении отчета
*/
public abstract class CSVReportBuilder<P> {
public abstract class CSVReportBuilder<P, R> {
protected static final Logger log = LoggerFactory.getLogger(CSVReportBuilder.class);
protected DecimalFormat df02Format = new DecimalFormat("#0.00");
protected DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
protected DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
protected DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
protected DateTimeFormatter dateFormatter_yyMMdd = DateTimeFormatter.ofPattern("yyMMdd");
protected InstantFormatter instantFormatter = new InstantFormatter();
/**
* Метод получения заголовков для CSV отчета
*/
protected abstract String[] getHeaders();
/**
* Возвращает списком значения CSV отчета. Каждый элемент списка - строка, элемент массива внутри списка - столбец.
*/
protected abstract List<String[]> getLines();
protected abstract List<R> getRows();
/**
* Название отчета, используется для формирования имени отчета (без указания формата)
@ -56,7 +53,9 @@ public abstract class CSVReportBuilder<P> {
/**
* Тип параметров для построения отчетов
*/
public abstract Class<P> getParamsType();
public abstract Class<P> getParamsClass();
public abstract Class<R> getReportClass();
/**
* Формирование отчета на основе параметров
@ -88,16 +87,29 @@ public abstract class CSVReportBuilder<P> {
File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename(params) + ".csv"));
collect(params);
String[] headers = getHeaders();
List<String[]> lines = getLines();
List<R> rows = getRows();
assert headers != null;
assert lines != null;
assert rows != null;
try (ICSVWriter csvWriter = createCsvWriter(reportFile)) {
csvWriter.writeNext(headers, false);
csvWriter.writeAll(lines, true);
} catch (IOException e) {
try (Writer writer = new FileWriter(reportFile)) {
CustomStrategy<R> customStrategy = new CustomStrategy<>();
customStrategy.setType(getReportClass());
StatefulBeanToCsv<R> sbc = new StatefulBeanToCsvBuilder<R>(writer)
.withMappingStrategy(customStrategy)
.withLineEnd("\n")
.withSeparator(',')
.withQuotechar('\"')
.build();
if (!rows.isEmpty()) sbc.write(rows);
else {
// Для записи заголовков в пустой файл
Constructor<R> constructor = getReportClass().getDeclaredConstructor();
R obj = constructor.newInstance();
String[] headers = customStrategy.generateHeader(obj);
writer.write("\"" + String.join("\",\"", headers) + "\"");
}
} catch (Exception e) {
log.error("Can't create report", e);
return null;
}
@ -111,15 +123,37 @@ public abstract class CSVReportBuilder<P> {
return filename;
}
public void setDateFormatter(DateTimeFormatter dateFormatter) {
this.dateFormatter = dateFormatter;
}
static class CustomStrategy<T> extends ColumnPositionMappingStrategy<T> {
@Override
public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
super.generateHeader(bean);
String[] headers = new String[this.getFieldMap().values().size()];
for (BeanField<T, Integer> field : this.getFieldMap().values()) {
CsvBindByPosition positionAnnotation = field.getField().getAnnotation(CsvBindByPosition.class);
CsvBindByName nameAnnotation = field.getField().getAnnotation(CsvBindByName.class);
headers[positionAnnotation.position()] = nameAnnotation.column();
}
return headers;
}
public void setDateTimeFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
@Override
public String[] transmuteBean(T bean) throws CsvFieldAssignmentException, CsvChainedException {
return super.transmuteBean(bean);
}
@Override
protected CsvConverter determineConverter(Field field, Class<?> elementType, String locale, String writeLocale, Class<? extends AbstractCsvConverter> customConverter) throws CsvBadConverterException {
CsvConverter csvConverter = super.determineConverter(field, elementType, locale, writeLocale, customConverter);
if (csvConverter instanceof ConverterNumber && field.getType() == BigDecimal.class) {
csvConverter = new ConverterNumber(BigDecimal.class,
Locale.getDefault().toString(),
Locale.getDefault().toString(),
Locale.getDefault(),
"#0.00",
"#0.00");
}
return csvConverter;
}
public void setTimeFormatter(DateTimeFormatter timeFormatter) {
this.timeFormatter = timeFormatter;
}
}

View file

@ -1,108 +0,0 @@
package ru.spcex.clearing.reports.reports;
import com.opencsv.CSVWriterBuilder;
import com.opencsv.ICSVWriter;
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.platform.enumeration.ReportBuilderType;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
* Класс для построения отчетов в формате CSV
*
* @param <P> тип параметров, используемых при построении отчета
*/
public abstract class CSVReportBuilder_<P, R> {
protected static final Logger log = LoggerFactory.getLogger(CSVReportBuilder_.class);
protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
/**
* Возвращает списком значения CSV отчета. Каждый элемент списка - строка, элемент массива внутри списка - столбец.
*/
protected abstract List<R> getRows();
/**
* Название отчета, используется для формирования имени отчета (без указания формата)
*
* @param params Параметры формирования отчета
*/
protected abstract String getReportFilename(P params);
/**
* Тип отчета по {@link ReportBuilderType}
*/
public abstract ReportBuilderType getReportType();
/**
* Тип параметров для построения отчетов
*/
public abstract Class<P> getParamsClass();
public abstract Class<R> getReportClass();
/**
* Формирование отчета на основе параметров
*
* @param params Параметры формирования отчета
*/
protected abstract void collect(P params);
/**
* Создает CSVWriter. Если требуется изменить параметры выходного CSV файла, этот метод следует переопределить.
*
* @param file Файл отчета
* @return Созданный CSVWriter
*
* 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();
File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename(params) + ".csv"));
collect(params);
List<R> lines = getRows();
assert lines != null;
try (Writer writer = new FileWriter(reportFile)) {
HeaderColumnNameMappingStrategy<R> headerColumnNameMappingStrategy = new HeaderColumnNameMappingStrategy<>();
headerColumnNameMappingStrategy.setType(getReportClass());
StatefulBeanToCsv<R> sbc = new StatefulBeanToCsvBuilder<R>(writer)
.withMappingStrategy(headerColumnNameMappingStrategy)
.withLineEnd("\n")
.withSeparator(',')
.withQuotechar('\"')
.build();
sbc.write(lines);
} catch (Exception e) {
log.error("Can't create report", e);
return null;
}
return reportFile;
}
protected String normalizeFilenameForOS(String filename) {
if (System.getProperty("os.name").toLowerCase().contains("windows"))
return filename.replace(":", "_");
return filename;
}
}

View file

@ -1,27 +0,0 @@
package ru.spcex.clearing.reports.reports;
import java.time.LocalDate;
/**
* Параметры для формирования отчета на период
*/
public class PeriodParams {
private LocalDate startDate;
private LocalDate endDate;
public LocalDate getStartDate() {
return startDate;
}
public void setStartDate(LocalDate startDate) {
this.startDate = startDate;
}
public LocalDate getEndDate() {
return endDate;
}
public void setEndDate(LocalDate endDate) {
this.endDate = endDate;
}
}

View file

@ -1,18 +0,0 @@
package ru.spcex.clearing.reports.reports;
import java.util.List;
/**
* Параметры для формирования отчета по списку SessionId
*/
public class SessionIdListParams {
private List<Long> sessionIdList;
public List<Long> getSessionIdList() {
return sessionIdList;
}
public void setSessionIdList(List<Long> sessionIdList) {
this.sessionIdList = sessionIdList;
}
}

View file

@ -0,0 +1,127 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
public class ExecutedDealReport {
@CsvBindByName(column = "SECURITYID")
@CsvBindByPosition(position = 0)
private String securityId;
@CsvBindByName(column = "TRADENO")
@CsvBindByPosition(position = 1)
private Long tradeNo;
@CsvBindByName(column = "TRADEDATE")
@CsvBindByPosition(position = 2)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate tradeDate;
@CsvBindByName(column = "TRADETIME")
@CsvBindByPosition(position = 3)
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
private Instant tradeTime;
@CsvBindByName(column = "SETTLEDATE")
@CsvBindByPosition(position = 4)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate settleDate;
@CsvBindByName(column = "SETTLECODE")
@CsvBindByPosition(position = 5)
private String settleCode;
@CsvBindByName(column = "PRICE")
@CsvBindByPosition(position = 6)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal price;
@CsvBindByName(column = "QUANTITY")
@CsvBindByPosition(position = 7)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal quantity;
@CsvBindByName(column = "VALUE")
@CsvBindByPosition(position = 8)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal value;
public String getSecurityId() {
return securityId;
}
public void setSecurityId(String securityId) {
this.securityId = securityId;
}
public Long getTradeNo() {
return tradeNo;
}
public void setTradeNo(Long tradeNo) {
this.tradeNo = tradeNo;
}
public LocalDate getTradeDate() {
return tradeDate;
}
public void setTradeDate(LocalDate tradeDate) {
this.tradeDate = tradeDate;
}
public Instant getTradeTime() {
return tradeTime;
}
public void setTradeTime(Instant tradeTime) {
this.tradeTime = tradeTime;
}
public LocalDate getSettleDate() {
return settleDate;
}
public void setSettleDate(LocalDate settleDate) {
this.settleDate = settleDate;
}
public String getSettleCode() {
return settleCode;
}
public void setSettleCode(String settleCode) {
this.settleCode = settleCode;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public BigDecimal getQuantity() {
return quantity;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
}

View file

@ -0,0 +1,88 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
public class KSRepCashNettoReport {
@CsvBindByName(column = "FIRMID")
@CsvBindByPosition(position = 0)
private String firmId;
@CsvBindByName(column = "SESSION_ID")
@CsvBindByPosition(position = 1)
private Long sessionId;
@CsvBindByName(column = "SESSION_DATE")
@CsvBindByPosition(position = 2)
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
private Instant sessionDate;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 3)
private String account;
@CsvBindByName(column = "VALUE")
@CsvBindByPosition(position = 4)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal value;
@CsvBindByName(column = "DATE")
@CsvBindByPosition(position = 5)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate date;
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public Long getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
this.sessionId = sessionId;
}
public Instant getSessionDate() {
return sessionDate;
}
public void setSessionDate(Instant sessionDate) {
this.sessionDate = sessionDate;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
}

View file

@ -0,0 +1,85 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
public class KSRepCashRegisterSumsReport {
@CsvBindByName(column = "FIRMID")
@CsvBindByPosition(position = 0)
private String firmId;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 1)
private String account;
@CsvBindByName(column = "REGISTER_CODE")
@CsvBindByPosition(position = 2)
private String registerCode;
@CsvBindByName(column = "ADD_SUM")
@CsvBindByPosition(position = 3)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal addSum;
@CsvBindByName(column = "ADD_TIME")
@CsvBindByPosition(position = 4)
private LocalTime addTime;
@CsvBindByName(column = "ADD_DATE")
@CsvBindByPosition(position = 5)
private LocalDate addDate;
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getRegisterCode() {
return registerCode;
}
public void setRegisterCode(String registerCode) {
this.registerCode = registerCode;
}
public BigDecimal getAddSum() {
return addSum;
}
public void setAddSum(BigDecimal addSum) {
this.addSum = addSum;
}
public LocalTime getAddTime() {
return addTime;
}
public void setAddTime(LocalTime addTime) {
this.addTime = addTime;
}
public LocalDate getAddDate() {
return addDate;
}
public void setAddDate(LocalDate addDate) {
this.addDate = addDate;
}
}

View file

@ -0,0 +1,137 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
public class KSRepCashRegistersReport {
@CsvBindByName(column = "FIRMID")
@CsvBindByPosition(position = 0)
private String firmId;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 1)
private String account;
@CsvBindByName(column = "DATE")
@CsvBindByPosition(position = 2)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate date;
@CsvBindByName(column = "REGISTER_CODE")
@CsvBindByPosition(position = 3)
private String registerCode;
@CsvBindByName(column = "REGISTER_NAME")
@CsvBindByPosition(position = 4)
private String registerName;
@CsvBindByName(column = "OPEN_BALANCE")
@CsvBindByPosition(position = 5)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal openBalance;
@CsvBindByName(column = "CHANGE_BALANCE")
@CsvBindByPosition(position = 6)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal changeBalance;
@CsvBindByName(column = "ADD_WITHDRAW")
@CsvBindByPosition(position = 7)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal addWithdraw;
@CsvBindByName(column = "CLOSE_BALANCE")
@CsvBindByPosition(position = 8)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal closeBalance;
@CsvBindByName(column = "REMARKS")
@CsvBindByPosition(position = 9)
private String remarks;
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public String getRegisterCode() {
return registerCode;
}
public void setRegisterCode(String registerCode) {
this.registerCode = registerCode;
}
public String getRegisterName() {
return registerName;
}
public void setRegisterName(String registerName) {
this.registerName = registerName;
}
public BigDecimal getOpenBalance() {
return openBalance;
}
public void setOpenBalance(BigDecimal openBalance) {
this.openBalance = openBalance;
}
public BigDecimal getChangeBalance() {
return changeBalance;
}
public void setChangeBalance(BigDecimal changeBalance) {
this.changeBalance = changeBalance;
}
public BigDecimal getAddWithdraw() {
return addWithdraw;
}
public void setAddWithdraw(BigDecimal addWithdraw) {
this.addWithdraw = addWithdraw;
}
public BigDecimal getCloseBalance() {
return closeBalance;
}
public void setCloseBalance(BigDecimal closeBalance) {
this.closeBalance = closeBalance;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
}

View file

@ -0,0 +1,100 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
public class KSRepDepoNettoReport {
@CsvBindByName(column = "FIRMID")
@CsvBindByPosition(position = 0)
private String firmId;
@CsvBindByName(column = "SESSION_ID")
@CsvBindByPosition(position = 1)
private Long sessionId;
@CsvBindByName(column = "SESSION_DATE")
@CsvBindByPosition(position = 2)
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
private Instant sessionDate;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 3)
private String account;
@CsvBindByName(column = "SECURITYID")
@CsvBindByPosition(position = 4)
private String securityId;
@CsvBindByName(column = "VALUE")
@CsvBindByPosition(position = 5)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal value;
@CsvBindByName(column = "DATE")
@CsvBindByPosition(position = 6)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate date;
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public Long getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
this.sessionId = sessionId;
}
public Instant getSessionDate() {
return sessionDate;
}
public void setSessionDate(Instant sessionDate) {
this.sessionDate = sessionDate;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getSecurityId() {
return securityId;
}
public void setSecurityId(String securityId) {
this.securityId = securityId;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
}

View file

@ -0,0 +1,99 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
public class KSRepDepoRegisterQuantitiesReport {
@CsvBindByName(column = "FIRMID")
@CsvBindByPosition(position = 0)
private String firmId;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 1)
private String account;
@CsvBindByName(column = "SECURITYID")
@CsvBindByPosition(position = 2)
private String securityId;
@CsvBindByName(column = "REGISTER_CODE")
@CsvBindByPosition(position = 3)
private String registerCode;
@CsvBindByName(column = "ADD_QUANTITY")
@CsvBindByPosition(position = 4)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal addQuantity;
@CsvBindByName(column = "ADD_TIME")
@CsvBindByPosition(position = 5)
private LocalTime addTime;
@CsvBindByName(column = "ADD_DATE")
@CsvBindByPosition(position = 6)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate addDate;
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getSecurityId() {
return securityId;
}
public void setSecurityId(String securityId) {
this.securityId = securityId;
}
public String getRegisterCode() {
return registerCode;
}
public void setRegisterCode(String registerCode) {
this.registerCode = registerCode;
}
public BigDecimal getAddQuantity() {
return addQuantity;
}
public void setAddQuantity(BigDecimal addQuantity) {
this.addQuantity = addQuantity;
}
public LocalTime getAddTime() {
return addTime;
}
public void setAddTime(LocalTime addTime) {
this.addTime = addTime;
}
public LocalDate getAddDate() {
return addDate;
}
public void setAddDate(LocalDate addDate) {
this.addDate = addDate;
}
}

View file

@ -0,0 +1,149 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
public class KSRepDepoRegistersReport {
@CsvBindByName(column = "FIRMID")
@CsvBindByPosition(position = 0)
private String firmId;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 1)
private String account;
@CsvBindByName(column = "DATE")
@CsvBindByPosition(position = 2)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate date;
@CsvBindByName(column = "SECURITYID")
@CsvBindByPosition(position = 3)
private String securityId;
@CsvBindByName(column = "REGISTER_CODE")
@CsvBindByPosition(position = 4)
private String registerCode;
@CsvBindByName(column = "REGISTER_NAME")
@CsvBindByPosition(position = 5)
private String registerName;
@CsvBindByName(column = "OPEN_QUANTITY")
@CsvBindByPosition(position = 6)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal openQuantity;
@CsvBindByName(column = "CHANGE_QUANTITY")
@CsvBindByPosition(position = 7)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal changeQuantity;
@CsvBindByName(column = "ADD_WITHDRAW_DEPO")
@CsvBindByPosition(position = 8)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal addWithdrawDepo;
@CsvBindByName(column = "CLOSE_QUANTITY")
@CsvBindByPosition(position = 9)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal closeQuantity;
@CsvBindByName(column = "REMARKS")
@CsvBindByPosition(position = 10)
private String remarks;
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public String getSecurityId() {
return securityId;
}
public void setSecurityId(String securityId) {
this.securityId = securityId;
}
public String getRegisterCode() {
return registerCode;
}
public void setRegisterCode(String registerCode) {
this.registerCode = registerCode;
}
public String getRegisterName() {
return registerName;
}
public void setRegisterName(String registerName) {
this.registerName = registerName;
}
public BigDecimal getOpenQuantity() {
return openQuantity;
}
public void setOpenQuantity(BigDecimal openQuantity) {
this.openQuantity = openQuantity;
}
public BigDecimal getChangeQuantity() {
return changeQuantity;
}
public void setChangeQuantity(BigDecimal changeQuantity) {
this.changeQuantity = changeQuantity;
}
public BigDecimal getAddWithdrawDepo() {
return addWithdrawDepo;
}
public void setAddWithdrawDepo(BigDecimal addWithdrawDepo) {
this.addWithdrawDepo = addWithdrawDepo;
}
public BigDecimal getCloseQuantity() {
return closeQuantity;
}
public void setCloseQuantity(BigDecimal closeQuantity) {
this.closeQuantity = closeQuantity;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
}

View file

@ -0,0 +1,95 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import java.time.LocalDate;
public class KSRepFirmDetailsReport {
@CsvBindByName(column = "FIRMID")
@CsvBindByPosition(position = 0)
private String firmId;
@CsvBindByName(column = "PART_INN")
@CsvBindByPosition(position = 1)
private String partInn;
@CsvBindByName(column = "PART_KPP")
@CsvBindByPosition(position = 2)
private String partKpp;
@CsvBindByName(column = "AGREEMENT_NUMBER")
@CsvBindByPosition(position = 3)
private String agreementNumber;
@CsvBindByName(column = "AGREEMENT_DATE")
@CsvBindByPosition(position = 4)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate agreementDate;
@CsvBindByName(column = "AGREEMENT_NAME")
@CsvBindByPosition(position = 5)
private String agreementName;
@CsvBindByName(column = "FIRM_NAME")
@CsvBindByPosition(position = 6)
private String firmName;
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public String getPartInn() {
return partInn;
}
public void setPartInn(String partInn) {
this.partInn = partInn;
}
public String getPartKpp() {
return partKpp;
}
public void setPartKpp(String partKpp) {
this.partKpp = partKpp;
}
public String getAgreementNumber() {
return agreementNumber;
}
public void setAgreementNumber(String agreementNumber) {
this.agreementNumber = agreementNumber;
}
public LocalDate getAgreementDate() {
return agreementDate;
}
public void setAgreementDate(LocalDate agreementDate) {
this.agreementDate = agreementDate;
}
public String getAgreementName() {
return agreementName;
}
public void setAgreementName(String agreementName) {
this.agreementName = agreementName;
}
public String getFirmName() {
return firmName;
}
public void setFirmName(String firmName) {
this.firmName = firmName;
}
}

View file

@ -0,0 +1,149 @@
package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.Instant;
public class KSRepTradesReport {
@CsvBindByName(column = "SESSION_ID")
@CsvBindByPosition(position = 0)
private Long sessionId;
@CsvBindByName(column = "SESSION_DATE")
@CsvBindByPosition(position = 1)
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
private Instant sessionDate;
@CsvBindByName(column = "TR_ID")
@CsvBindByPosition(position = 2)
private Long trId;
@CsvBindByName(column = "FIRM_ID")
@CsvBindByPosition(position = 3)
private String firmId;
@CsvBindByName(column = "TKR")
@CsvBindByPosition(position = 4)
private Long tkr;
@CsvBindByName(column = "CASH_LIABILITY")
@CsvBindByPosition(position = 5)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal cashLiability;
@CsvBindByName(column = "DEPO_LIABILITY")
@CsvBindByPosition(position = 6)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal depoLiability;
@CsvBindByName(column = "TRADE_NUM")
@CsvBindByPosition(position = 7)
private Long tradeNum;
@CsvBindByName(column = "CLASS_CODE")
@CsvBindByPosition(position = 8)
private String classCode;
@CsvBindByName(column = "TRADE_DATE")
@CsvBindByPosition(position = 9)
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
private Instant tradeDate;
@CsvBindByName(column = "STATUS")
@CsvBindByPosition(position = 10)
private String status;
public Long getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
this.sessionId = sessionId;
}
public Instant getSessionDate() {
return sessionDate;
}
public void setSessionDate(Instant sessionDate) {
this.sessionDate = sessionDate;
}
public Long getTrId() {
return trId;
}
public void setTrId(Long trId) {
this.trId = trId;
}
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public Long getTkr() {
return tkr;
}
public void setTkr(Long tkr) {
this.tkr = tkr;
}
public BigDecimal getCashLiability() {
return cashLiability;
}
public void setCashLiability(BigDecimal cashLiability) {
this.cashLiability = cashLiability;
}
public BigDecimal getDepoLiability() {
return depoLiability;
}
public void setDepoLiability(BigDecimal depoLiability) {
this.depoLiability = depoLiability;
}
public Long getTradeNum() {
return tradeNum;
}
public void setTradeNum(Long tradeNum) {
this.tradeNum = tradeNum;
}
public String getClassCode() {
return classCode;
}
public void setClassCode(String classCode) {
this.classCode = classCode;
}
public Instant getTradeDate() {
return tradeDate;
}
public void setTradeDate(Instant tradeDate) {
this.tradeDate = tradeDate;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View file

@ -3,37 +3,34 @@ package ru.spcex.clearing.reports.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
public class UnfulfilledDealReport {
@CsvBindByName(column = "securityId")
@CsvBindByName(column = "SECURITYID")
@CsvBindByPosition(position = 0)
@CsvNumber("#0")
private BigDecimal securityId;
private Long securityId;
@CsvBindByName(column = "tradeNo")
@CsvBindByName(column = "TRADENO")
@CsvBindByPosition(position = 1)
private Long tradeNo;
@CsvBindByName(column = "tradeDate")
@CsvBindByName(column = "TRADEDATE")
@CsvBindByPosition(position = 2)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate tradeDate;
@CsvBindByName(column = "settleCode")
@CsvBindByName(column = "SETTLECODE")
@CsvBindByPosition(position = 3)
private String settleCode;
public BigDecimal getSecurityId() {
public Long getSecurityId() {
return securityId;
}
public void setSecurityId(BigDecimal securityId) {
public void setSecurityId(Long securityId) {
this.securityId = securityId;
}
@ -60,4 +57,5 @@ public class UnfulfilledDealReport {
public void setSettleCode(String settleCode) {
this.settleCode = settleCode;
}
}

View file

@ -5,21 +5,20 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.misc.STrades;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.bean.ExecutedDealReport;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilder<T> {
public abstract class ExecutedDealReportBuilderCommon<P> extends CSVReportBuilder<P, ExecutedDealReport> {
protected final DateTimeFormatter fileNameDateTimeFormatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
protected final Imdg<ExecutionFond> executionFondImdg;
private final Imdg<Company> companyImdg;
@ -29,7 +28,7 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
"securityId", "tradeNo", "tradeDate", "tradeTime",
"settleDate", "settleCode", "price", "quanity", "value"
};
private List<String[]> lines = null;
private List<ExecutedDealReport> lines = null;
public ExecutedDealReportBuilderCommon(ImdgProvider imdgProvider) {
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
@ -38,12 +37,7 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
}
@Override
public String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
protected List<ExecutedDealReport> getRows() {
return lines;
}
@ -52,10 +46,15 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
return ReportBuilderType.EXECUTED_DEAL_REPORT;
}
protected abstract Collection<ExecutionFond> getExecutionFondsForReport(T params);
@Override
public Class<ExecutedDealReport> getReportClass() {
return ExecutedDealReport.class;
}
protected abstract Collection<ExecutionFond> getExecutionFondsForReport(P params);
@Override
protected void collect(T params) {
protected void collect(P params) {
Collection<ExecutionFond> executionFonds = getExecutionFondsForReport(params);
lines = new ArrayList<>(executionFonds.size());
@ -73,41 +72,20 @@ public abstract class ExecutedDealReportBuilderCommon<T> extends CSVReportBuilde
)
);
}
ExecutedDealReport executedDealReport = new ExecutedDealReport();
String securityId = String.valueOf(executionFond.getSecuritySymbol());
String tradeNo = String.valueOf(executionFond.getExchangeExecutionId());
String tradeDate = "";
String tradeTime = "";
String settleDate = "";
if (executionFond.getTradingDate() != null) {
tradeDate = dateFormatter.format(executionFond.getTradingDate());
}
if (executionFond.getExchangeExecutionTime() != null) {
tradeTime = dateFormatter.format(LocalDate.ofInstant(executionFond.getExchangeExecutionTime(), ZoneId.systemDefault()));
}
if (executionFond.getSettlementDate() != null) {
settleDate = dateFormatter.format(executionFond.getSettlementDate());
}
String settleCode = sTrade != null ? sTrade.getSettleCode() : "";
String quantity = executionFond.getQuantity() != null ? String.valueOf(executionFond.getQuantity()) : "";
String value = executionFond.getSettlementAmount() != null ? String.valueOf(executionFond.getSettlementAmount()) : "";
String price = "";
if (executionFond.getSettlementAmount() != null && executionFond.getQuantity() != null) {
price = String.valueOf(executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP));
}
executedDealReport.setSecurityId(executionFond.getSecuritySymbol());
executedDealReport.setTradeNo(executionFond.getExchangeExecutionId());
executedDealReport.setTradeDate(executionFond.getTradingDate());
executedDealReport.setTradeTime(executionFond.getExchangeExecutionTime());
executedDealReport.setSettleDate(executionFond.getSettlementDate());
executedDealReport.setSettleCode(sTrade != null ? sTrade.getSettleCode() : "");
executedDealReport.setQuantity(executionFond.getQuantity());
executedDealReport.setValue(executionFond.getSettlementAmount());
if (executionFond.getSettlementAmount() != null && executionFond.getQuantity() != null)
executedDealReport.setPrice(executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP));
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = securityId;
line[valueIdx++] = tradeNo;
line[valueIdx++] = tradeDate;
line[valueIdx++] = tradeTime;
line[valueIdx++] = settleDate;
line[valueIdx++] = settleCode;
line[valueIdx++] = price;
line[valueIdx++] = quantity;
line[valueIdx++] = value;
lines.add(line);
lines.add(executedDealReport);
} catch (Throwable e) {
log.error("Can't create report row for execution_fond (id = %d), skipped".formatted(executionFond.getId()), e);
}

View file

@ -26,7 +26,7 @@ public class ExecutedDealReportBuilder_INFTYPE_1 extends ExecutedDealReportBuild
}
@Override
public Class<SessionIdParam> getParamsType() {
public Class<SessionIdParam> getParamsClass() {
return SessionIdParam.class;
}

View file

@ -26,7 +26,7 @@ public class ExecutedDealReportBuilder_INFTYPE_2 extends ExecutedDealReportBuild
}
@Override
public Class<SessionIdParam> getParamsType() {
public Class<SessionIdParam> getParamsClass() {
return SessionIdParam.class;
}

View file

@ -26,7 +26,7 @@ public class ExecutedDealReportBuilder_INFTYPE_3 extends ExecutedDealReportBuild
}
@Override
public Class<SessionIdParam> getParamsType() {
public Class<SessionIdParam> getParamsClass() {
return SessionIdParam.class;
}

View file

@ -27,7 +27,7 @@ public class ExecutedDealReportBuilder_INFTYPE_4 extends ExecutedDealReportBuild
}
@Override
public Class<SessionIdParam> getParamsType() {
public Class<SessionIdParam> getParamsClass() {
return SessionIdParam.class;
}

View file

@ -1,296 +0,0 @@
package ru.spcex.clearing.reports.reports.bp;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.platform.enumeration.Allowed;
import ru.spcex.platform.enumeration.Market;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
// todo check typo
public abstract class LiabilitiesClaimsReportBuilder<P> extends CSVReportBuilder<P> {
protected final Imdg<ExecutionFond> executionFondImdg;
protected final Imdg<ExecutionDeposit> executionDepositImdg;
protected final Imdg<Company> companyImdg;
protected final Imdg<Registry> registryImdg;
protected final Imdg<Listing> listingImdg;
protected final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
protected final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
protected final String[] headers = {
"id", "doc_date", "doc_time", "doc_name", "doc_type", "clearingHouse", "firmId", "firName", "session_id",
"clearing_date", "clearing_time", "trdAccId", "account", "depo_account", "currency", "tr_id", "securityId",
"tr_buySell", "tr_date", "tr_execDate", "exec_status", "repaym_date", "tr_price", "nominal", "lot_value",
"tr_lot", "tr_quantity", "tr_value", "tr_accruedint", "accruedint", "tr_clrComm", "tr_exhComm", "cash_liability",
"depo_liability", "cash_netto", "depo_netto"
};
protected List<String[]> lines = null;
public LiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class
);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class
);
}
@Override
public String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
}
protected abstract Collection<ExecutionFond> getExecutionFondsForReport(P params);
protected abstract Collection<ExecutionDeposit> getExecutionDepositsForReport(P params);
@Override
protected void collect(P params) {
Collection<ExecutionFond> executionFonds = getExecutionFondsForReport(params);
Collection<ExecutionDeposit> executionDeposits = getExecutionDepositsForReport(params);
List<ExecutionCommon> executions = new ArrayList<>(executionFonds.size() + executionDeposits.size());
executions.addAll(executionFonds);
executions.addAll(executionDeposits);
Company clearingHouseCompany = companyImdg.getSingleObjectByID(1L);
String clearingHouse = clearingHouseCompany.getFullName();
LocalDate nowDate = LocalDate.now();
LocalTime nowTime = LocalTime.now();
lines = new ArrayList<>(executions.size());
long reportRowId = 0L;
for (ExecutionCommon execution : executions) {
try {
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
if (execution.getSessionId() == null) {
log.warn("On Execution[{}] sessionId was null. Skip in report.", execution.getId());
continue;
}
Registry registry = null;
if (execution.getCompanyId() != null) {
registry = registryImdg.getSingleObjectByFieldValues(Map.of("companyId", execution.getCompanyId()));
}
Collection<Registry> registriesForSessionId = null;
if (execution.getSessionId() != null) {
registriesForSessionId = registryImdg.getCollectionObjectsByFieldValues(
Map.of("sessionId", execution.getSessionId())
);
}
Listing listing = null;
FixedIncomeSecurity fixedIncomeSecurity = null;
if (execution.getSecurityId() != null) {
listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", execution.getSecurityId()));
fixedIncomeSecurity = fixedIncomeSecurityImdg.getSingleObjectByFieldValues(
Map.of("securityId", execution.getSecurityId())
);
}
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(
execution.getTradingClearingRegistryId()
);
if (registry == null) {
log.warn("registry not found for companyId={}", execution.getCompanyId());
}
String id = String.valueOf(reportRowId++);
String docDate = dateFormatter.format(nowDate);
String docTime = timeFormatter.format(nowTime);
String docName = "Отчет об обязательствах/требованиях Участника клиринга";
String docType = "KS_FIRMID_LIABILITIES";
String firmId = String.valueOf(execution.getCompanyId());
String firName = company.getFullName();
String sessionId = String.valueOf(execution.getSessionId());
String clearingDate = dateFormatter.format(execution.getClearingDate());
String clearingTime = dateFormatter.format(execution.getClearingDate());
String trdAccId = registry == null ? null : registry.getTradingClearingRegistry();
String account = String.valueOf(tradingClearingRegistry.getMoneyAccountId());
String depoAccount = String.valueOf(tradingClearingRegistry.getDepoAccountId());
String currency = execution.getSettlementCurrency();
String trId = String.valueOf(execution.getExchangeExecutionId());
String securityId = String.valueOf(execution.getSecurityId());
String trBuySell = "";
if (Side.BUY.equalsByKey(execution.getSide()))
trBuySell = "B";
else if (Side.SELL.equalsByKey(execution.getSide()))
trBuySell = "S";
String trDate = dateFormatter.format(execution.getTradingDate());
String trExecDate = "";
String execStatus = "";
String repaymDate = "";
String trPrice = "";
String nominal = "";
String trQuantity = "";
String trValue = "";
String trAccruedInt = "";
String accruedInt = "";
String cashLiability = "";
String depoLiability = "";
if (execution instanceof ExecutionDeposit executionDeposit) {
trExecDate = dateFormatter.format(executionDeposit.getSecondLegSettlementDate());
if (Market.mkrs.equalsByKey(execution.getMarket())) {
String coverageStatus = executionDeposit.getCoverageStatus();
if (Allowed.ALLOWED.equalsByKey(coverageStatus)) execStatus = "Y";
else if (Allowed.DENIED.equalsByKey(coverageStatus)) execStatus = "N";
else execStatus = "W";
repaymDate = dateFormatter.format(executionDeposit.getSecondLegSettlementDate());
trPrice = String.valueOf(executionDeposit.getPrice());
trValue = String.valueOf(executionDeposit.getFirstLegAmount());
cashLiability = String.valueOf(executionDeposit.getFirstLegAmount());
}
} else if (execution instanceof ExecutionFond executionFond) {
trExecDate = dateFormatter.format(executionFond.getSettlementDate());
if (Market.fond.equalsByKey(execution.getMarket())) {
if (executionFond.getSettlementAmount() != null && executionFond.getQuantity() != null) {
trPrice = String.valueOf(
executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP)
);
}
trQuantity = String.valueOf(executionFond.getQuantity());
if (fixedIncomeSecurity != null) {
nominal = String.valueOf(fixedIncomeSecurity.getNominalValue());
if (executionFond.getQuantity() != null) {
accruedInt = String.valueOf(
fixedIncomeSecurity.getCoupon().divide(executionFond.getQuantity(), RoundingMode.HALF_UP)
);
}
trAccruedInt = String.valueOf(fixedIncomeSecurity.getCoupon());
}
trValue = String.valueOf(executionFond.getSettlementAmount());
cashLiability = String.valueOf(executionFond.getSettlementAmount());
depoLiability = String.valueOf(executionFond.getQuantity());
}
}
String lotValue = "";
if (listing != null) {
lotValue = String.valueOf(listing.getLotSize());
}
String trLot = String.valueOf(execution.getLots());
String trClrComm = "";
String trExhComm = "";
Registry tm_tRegistry = null;
Registry om_tRegistry = null;
Registry ts_tRegistry = null;
Registry os_tRegistry = null;
if (registriesForSessionId != null) {
for (Registry currRegistry : registriesForSessionId) {
String registryCode = currRegistry.getRegistryCode();
if (registryCode.endsWith("T")) {
if (registryCode.startsWith("TM")) {
if (tm_tRegistry != null && tm_tRegistry.getUpdated().isAfter(currRegistry.getUpdated()))
continue;
tm_tRegistry = currRegistry;
}
if (registryCode.startsWith("OM")) {
if (om_tRegistry != null && om_tRegistry.getUpdated().isAfter(currRegistry.getUpdated()))
continue;
om_tRegistry = currRegistry;
}
if (registryCode.startsWith("TS")) {
if (ts_tRegistry != null && ts_tRegistry.getUpdated().isAfter(currRegistry.getUpdated()))
continue;
ts_tRegistry = currRegistry;
}
if (registryCode.startsWith("OS")) {
if (os_tRegistry != null && os_tRegistry.getUpdated().isAfter(currRegistry.getUpdated()))
continue;
os_tRegistry = currRegistry;
}
}
}
}
String cashNetto = "";
if (tm_tRegistry != null && om_tRegistry != null) {
cashNetto = String.valueOf(tm_tRegistry.getBalance().subtract(om_tRegistry.getBalance()));
}
String depoNetto = "";
if (ts_tRegistry != null && os_tRegistry != null) {
depoNetto = String.valueOf(ts_tRegistry.getBalance().subtract(os_tRegistry.getBalance()));
}
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = id;
line[valueIdx++] = docDate;
line[valueIdx++] = docTime;
line[valueIdx++] = docName;
line[valueIdx++] = docType;
line[valueIdx++] = clearingHouse;
line[valueIdx++] = firmId;
line[valueIdx++] = firName;
line[valueIdx++] = sessionId;
line[valueIdx++] = clearingDate;
line[valueIdx++] = clearingTime;
line[valueIdx++] = trdAccId;
line[valueIdx++] = account;
line[valueIdx++] = depoAccount;
line[valueIdx++] = currency;
line[valueIdx++] = trId;
line[valueIdx++] = securityId;
line[valueIdx++] = trBuySell;
line[valueIdx++] = trDate;
line[valueIdx++] = trExecDate;
line[valueIdx++] = execStatus;
line[valueIdx++] = repaymDate;
line[valueIdx++] = trPrice;
line[valueIdx++] = nominal;
line[valueIdx++] = lotValue;
line[valueIdx++] = trLot;
line[valueIdx++] = trQuantity;
line[valueIdx++] = trValue;
line[valueIdx++] = trAccruedInt;
line[valueIdx++] = accruedInt;
line[valueIdx++] = trClrComm;
line[valueIdx++] = trExhComm;
line[valueIdx++] = cashLiability;
line[valueIdx++] = depoLiability;
line[valueIdx++] = cashNetto;
line[valueIdx] = depoNetto;
lines.add(line);
} catch (Throwable e) {
log.error("Can't create report row for execution (id = %d), skipped".formatted(execution.getId()), e);
}
}
}
}

View file

@ -1,163 +0,0 @@
package ru.spcex.clearing.reports.reports.bp;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.platform.enumeration.InOutDirection;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public abstract class MoneyChangeReportBuilder<P> extends CSVReportBuilder<P> {
protected final Imdg<Registry> registryImdg;
protected final Imdg<Company> companyImdg;
protected final Imdg<Listing> listingImdg;
protected final Imdg<Statement> statementImdg;
protected final Imdg<PaymentInstruction> paymentInstructionImdg;
protected final String[] headers = {
"id", "doc_date", "doc_time", "doc_name", "doc_type", "clearingHouse", "firmId", "firName", "trdAccId",
"account", "currency", "registry_code", "registry_name", "open_balance", "change_balance", "add_withdraw",
"close_balance", "remarks", "add_sum", "add_time", "withdraw_sum", "withdraw_time"
};
protected List<String[]> lines = null;
public MoneyChangeReportBuilder(ImdgProvider imdgProvider) {
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
}
@Override
public String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
}
protected abstract Collection<Registry> getRegistryForReport(P param);
@Override
protected void collect(P params) {
Collection<Registry> registries = getRegistryForReport(params);
Company clearingHouseCompany = companyImdg.getSingleObjectByID(1L);
String clearingHouse = clearingHouseCompany.getFullName();
LocalDate nowDate = LocalDate.now();
LocalTime nowTime = LocalTime.now();
lines = new ArrayList<>(registries.size());
long reportRowId = 0L;
for (Registry registry : registries) {
try {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
Listing listing = null;
if (registry.getSecurityId() != null) {
listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", registry.getSecurityId()));
}
Statement statement = null;
if (registry.getCompanyId() != null) {
statement = statementImdg.getSingleObjectByFieldValues(Map.of("addresseeId", registry.getCompanyId()));
}
PaymentInstruction paymentInstruction = null;
if (registry.getPaymentId() != null) {
paymentInstruction = paymentInstructionImdg.getSingleObjectByFieldValues(
Map.of(
"id", registry.getPaymentId(),
"creditLeg_direction", InOutDirection.out.getKey()
)
);
}
String id = String.valueOf(reportRowId++);
String docDate = dateFormatter.format(nowDate);
String docTime = timeFormatter.format(nowTime);
String docName = "Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга";
String docType = "KS_FIRMID_ASSETS";
String firmId = String.valueOf(registry.getCompanyId());
String firName = company.getFullName();
String trdAccId = registry.getTradingClearingRegistry();
String account = String.valueOf(registry.getAccountId());
String currency = listing != null ? listing.getTradingCurrency() : "";
String registryCode = String.valueOf(registry.getId());
String registryName = registry.getRegistryCode();
String openBalance = String.valueOf(registry.getOpenBalance());
String changeBalance = "";
if (registry.getCloseBalance() != null && registry.getOpenBalance() != null) {
changeBalance = String.valueOf(registry.getCloseBalance().subtract(registry.getOpenBalance()));
}
String addWithdraw = "";
if (registry.getCredit() != null) {
if (registry.getDebit() != null) {
addWithdraw = String.valueOf(registry.getCredit().subtract(registry.getDebit()));
} else addWithdraw = String.valueOf(registry.getCredit());
}
String closeBalance = String.valueOf(registry.getCloseBalance());
String remarks = "";
String addSum = String.valueOf(registry.getCredit());
String addTime = "";
if (statement != null && statement.getCreated() != null) {
addTime = dateTimeFormatter.format(LocalDateTime.ofInstant(statement.getCreated(), ZoneId.systemDefault()));
}
String withdrawSum = String.valueOf(registry.getDebit());
String withdrawTime = "";
if (paymentInstruction != null) {
withdrawTime = dateTimeFormatter.format(LocalDateTime.ofInstant(paymentInstruction.getPaymentDate(), ZoneId.systemDefault()));
} else if (registry.getClearingDate() != null) {
withdrawTime = dateTimeFormatter.format(registry.getClearingDate());
}
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = id;
line[valueIdx++] = docDate;
line[valueIdx++] = docTime;
line[valueIdx++] = docName;
line[valueIdx++] = docType;
line[valueIdx++] = clearingHouse;
line[valueIdx++] = firmId;
line[valueIdx++] = firName;
line[valueIdx++] = trdAccId;
line[valueIdx++] = account;
line[valueIdx++] = currency;
line[valueIdx++] = registryCode;
line[valueIdx++] = registryName;
line[valueIdx++] = openBalance;
line[valueIdx++] = changeBalance;
line[valueIdx++] = addWithdraw;
line[valueIdx++] = closeBalance;
line[valueIdx++] = remarks;
line[valueIdx++] = addSum;
line[valueIdx++] = addTime;
line[valueIdx++] = withdrawSum;
line[valueIdx++] = withdrawTime;
lines.add(line);
} catch (Throwable e) {
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
}
}
}
}

View file

@ -1,53 +0,0 @@
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;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.imdg.api.ImdgProvider;
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);
}
@Override
protected Collection<ExecutionFond> getExecutionFondsForReport(SessionIdParam params) {
return executionFondImdg.getCollectionObjectsByFieldValues(
Map.of("sessionId", params.getSessionId())
);
}
@Override
protected Collection<ExecutionDeposit> getExecutionDepositsForReport(SessionIdParam params) {
return executionDepositImdg.getCollectionObjectsByFieldValues(
Map.of("sessionId", params.getSessionId())
);
}
@Override
protected String getReportFilename(SessionIdParam params) {
return "operational_liabilities_claims.%s".formatted(
dateTimeFormatter.format(LocalDateTime.now())
);
}
@Override
public ReportBuilderType getReportType() {
return ReportBuilderType.OPERATIONAL_LIABILITIES_CLAIMS;
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
}

View file

@ -1,43 +0,0 @@
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.ReportBuilderType;
import ru.spcex.platform.imdg.api.ImdgProvider;
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);
}
@Override
protected Collection<Registry> getRegistryForReport(SessionIdParam param) {
return registryImdg.getCollectionObjectsByFieldValues(
Map.of("sessionId", param.getSessionId())
);
}
@Override
protected String getReportFilename(SessionIdParam params) {
return "operational_money_change.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public ReportBuilderType getReportType() {
return ReportBuilderType.OPERATIONAL_MONEY_CHANGE;
}
@Override
public Class<SessionIdParam> getParamsType() {
return SessionIdParam.class;
}
}

View file

@ -1,62 +0,0 @@
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;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
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) {
super(imdgProvider);
}
@Override
protected String getReportFilename(SessionIdListParams params) {
return "period_liabilities_claims.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public ReportBuilderType getReportType() {
return ReportBuilderType.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();
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
// todo OR - временное решение. В изначальном плане была передача списка id сессий, но теперь нужно делать на текущий день
// пока не определятся, что именно им нужно - остается OR, в дальнейшем предикат будет правиться
ImdgPredicate predicate = pb.or(
pb.in("sessionId", params.getSessionIdList().toArray(new Long[0])),
pb.equals("clearingDate", LocalDate.now())
);
return executionFondImdg.getCollectionObjectsByPredicate(predicate);
}
@Override
protected Collection<ExecutionDeposit> getExecutionDepositsForReport(SessionIdListParams params) {
if (params.getSessionIdList() == null || params.getSessionIdList().isEmpty()) return Collections.emptyList();
return executionDepositImdg.getCollectionObjectsByPredicate(
executionDepositImdg.predicateBuilder().in("sessionId", params.getSessionIdList().toArray(new Long[0]))
);
}
}

View file

@ -1,57 +0,0 @@
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.ReportBuilderType;
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;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class PeriodMoneyChangeReportBuilder extends MoneyChangeReportBuilder<PeriodParams> {
public PeriodMoneyChangeReportBuilder(ImdgProvider imdgProvider) {
super(imdgProvider);
}
@Override
protected Collection<Registry> getRegistryForReport(PeriodParams params) {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
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())
)
);
}
@Override
public String getReportFilename(PeriodParams params) {
return "period_money_change.%s-%s.%s".formatted(
dateFormatter.format(params.getStartDate()),
dateFormatter.format(params.getEndDate()),
dateTimeFormatter.format(LocalDateTime.now())
);
}
@Override
public ReportBuilderType getReportType() {
return ReportBuilderType.PERIOD_MONEY_CHANGE;
}
@Override
public Class<PeriodParams> getParamsType() {
return PeriodParams.class;
}
}

View file

@ -1,54 +0,0 @@
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;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
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);
}
@Override
protected Collection<ExecutionFond> getExecutionFondsForReport(EmptyParams params) {
// todo Временное решение. В изначальном плане была передача списка id сессий, но теперь нужно делать на текущий день
// пока не определятся, что именно им нужно - остается OR, в дальнейшем предикат будет правиться
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
return executionFondImdg.getCollectionObjectsByPredicate(pb.equals("clearingDate", LocalDate.now()));
}
@Override
protected Collection<ExecutionDeposit> getExecutionDepositsForReport(EmptyParams params) {
// todo Временное решение. В изначальном плане была передача списка id сессий, но теперь нужно делать на текущий день
// пока не определятся, что именно им нужно - остается OR, в дальнейшем предикат будет правиться
ImdgPredicateBuilder pb = executionDepositImdg.predicateBuilder();
return executionDepositImdg.getCollectionObjectsByPredicate(pb.equals("clearingDate", LocalDate.now()));
}
@Override
protected String getReportFilename(EmptyParams params) {
return "summary_liabilities_claims.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public ReportBuilderType getReportType() {
return ReportBuilderType.SUMMARY_LIABILITIES_CLAIMS;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
}

View file

@ -1,56 +0,0 @@
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.ReportBuilderType;
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;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class SummaryMoneyChangeReportBuilder extends MoneyChangeReportBuilder<EmptyParams> {
public SummaryMoneyChangeReportBuilder(ImdgProvider imdgProvider) {
super(imdgProvider);
}
@Override
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();
return registryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.sql(sql),
pb.greatEqual("clearingDate", now),
pb.lessEqual("clearingDate", now)
)
);
}
@Override
protected String getReportFilename(EmptyParams params) {
return "summary_money_change.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public ReportBuilderType getReportType() {
return ReportBuilderType.SUMMARY_MONEY_CHANGE;
}
@Override
public Class<EmptyParams> getParamsType() {
return EmptyParams.class;
}
}

View file

@ -9,6 +9,7 @@ import ru.clearing.classes.statics.data.misc.STrades;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.clearing.reports.reports.bean.UnfulfilledDealReport;
import ru.spcex.platform.enumeration.Allowed;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.enumeration.WorkflowStatus;
@ -18,18 +19,17 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDateTime;
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 UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdParam> {
public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdParam, UnfulfilledDealReport> {
private final Imdg<ExecutionFond> executionFondImdg;
private final Imdg<Company> companyImdg;
private final Imdg<STrades> sTradesImdg;
private final String[] headers = {
"securityId", "tradeNo", "tradeDate", "settleCode"
};
private List<String[]> lines = null;
public UnfulfilledDealReportBuilder(ImdgProvider imdgProvider) {
executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
@ -37,14 +37,11 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdPara
sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
}
@Override
public String[] getHeaders() {
return headers;
}
private List<UnfulfilledDealReport> rows = null;
@Override
protected List<String[]> getLines() {
return lines;
protected List<UnfulfilledDealReport> getRows() {
return rows;
}
@Override
@ -58,10 +55,15 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdPara
}
@Override
public Class<SessionIdParam> getParamsType() {
public Class<SessionIdParam> getParamsClass() {
return SessionIdParam.class;
}
@Override
public Class<UnfulfilledDealReport> getReportClass() {
return UnfulfilledDealReport.class;
}
@Override
protected void collect(SessionIdParam params) {
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
@ -71,17 +73,11 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdPara
);
Collection<ExecutionFond> executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate);
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
lines = new ArrayList<>(executionFonds.size());
rows = 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 = sTradesImdg.getSingleObjectByFieldValues(
Map.of(
@ -90,18 +86,13 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdPara
)
);
String securityId = String.valueOf(executionFond.getSecurityId());
String tradeNo = String.valueOf(executionFond.getExchangeExecutionId());
String tradeDate = dateFormatter.format(executionFond.getTradingDate());
String settleCode = sTrade != null ? sTrade.getClassCode() : null;
UnfulfilledDealReport unfulfilledDealReport = new UnfulfilledDealReport();
unfulfilledDealReport.setSecurityId(executionFond.getSecurityId());
unfulfilledDealReport.setTradeNo(executionFond.getExchangeExecutionId());
unfulfilledDealReport.setTradeDate(executionFond.getTradingDate());
unfulfilledDealReport.setSettleCode(sTrade != null ? sTrade.getClassCode() : null);
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = securityId;
line[valueIdx++] = tradeNo;
line[valueIdx++] = tradeDate;
line[valueIdx++] = settleCode;
lines.add(line);
rows.add(unfulfilledDealReport);
} catch (Throwable e) {
log.error("Can't create report row for execution_fond (id = %d), skipped".formatted(executionFond.getId()), e);
}

View file

@ -1,107 +0,0 @@
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;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder_;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.clearing.reports.reports.bean.UnfulfilledDealReport;
import ru.spcex.platform.enumeration.Allowed;
import ru.spcex.platform.enumeration.ReportBuilderType;
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 java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class UnfulfilledDealReportBuilder_ extends CSVReportBuilder_<SessionIdParam, UnfulfilledDealReport> {
private final Imdg<ExecutionFond> executionFondImdg;
private final Imdg<Company> companyImdg;
private final Imdg<STrades> sTradesImdg;
public UnfulfilledDealReportBuilder_(ImdgProvider imdgProvider) {
executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
}
private List<UnfulfilledDealReport> rows = null;
@Override
protected List<UnfulfilledDealReport> getRows() {
return rows;
}
@Override
protected String getReportFilename(SessionIdParam params) {
return "unfulfilled_deal_report.%s".formatted(dateTimeFormatter.format(LocalDateTime.now()));
}
@Override
public ReportBuilderType getReportType() {
return ReportBuilderType.UNFULFILLED_DEAL_REPORT;
}
@Override
public Class<SessionIdParam> getParamsClass() {
return SessionIdParam.class;
}
@Override
public Class<UnfulfilledDealReport> getReportClass() {
return UnfulfilledDealReport.class;
}
@Override
protected void collect(SessionIdParam params) {
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
ImdgPredicate predicate = pb.and(
pb.equals("sessionId", params.getSessionId()),
pb.equals("coverageStatus", Allowed.DENIED.getKey())
);
Collection<ExecutionFond> executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate);
Map<Long, Boolean> activeCompanyForId = new HashMap<>();
rows = 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;
STrades sTrade = sTradesImdg.getSingleObjectByFieldValues(
Map.of(
"settleCode", executionFond.getSettlementCode(),
"operation", executionFond.getSide()
)
);
UnfulfilledDealReport unfulfilledDealReport = new UnfulfilledDealReport();
// todo replace to long (example for test)
unfulfilledDealReport.setSecurityId(BigDecimal.valueOf(executionFond.getSecurityId()));
unfulfilledDealReport.setTradeNo(executionFond.getExchangeExecutionId());
unfulfilledDealReport.setTradeDate(executionFond.getTradingDate());
unfulfilledDealReport.setSettleCode(sTrade != null ? sTrade.getClassCode() : null);
rows.add(unfulfilledDealReport);
} catch (Throwable e) {
log.error("Can't create report row for execution_fond (id = %d), skipped".formatted(executionFond.getId()), e);
}
}
}
}

View file

@ -9,6 +9,7 @@ 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.clearing.reports.reports.bean.KSRepCashNettoReport;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryTradingParams;
@ -22,20 +23,16 @@ 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 KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam> {
public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam, KSRepCashNettoReport> {
private final Imdg<Registry> registryImdg;
private final Imdg<Session> sessionImdg;
private final String[] headers = {
"FIRMID", "SESSION_ID", "SESSION_DATE", "ACCOUNT", "VALUE", "DATE"
};
private List<String[]> lines = null;
private List<KSRepCashNettoReport> rows = null;
public KSRepCashNettoReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
@ -43,13 +40,8 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
}
@Override
protected String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
protected List<KSRepCashNettoReport> getRows() {
return rows;
}
@Override
@ -63,10 +55,15 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
}
@Override
public Class<SessionIdParam> getParamsType() {
public Class<SessionIdParam> getParamsClass() {
return SessionIdParam.class;
}
@Override
public Class<KSRepCashNettoReport> getReportClass() {
return KSRepCashNettoReport.class;
}
@Override
protected void collect(SessionIdParam params) {
LocalDate nowDate = LocalDate.now();
@ -87,7 +84,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
Map<PairRegistryId, List<Registry>> registryMap = registries.stream().collect(Collectors.groupingBy(PairRegistryId::new));
lines = new ArrayList<>(registryMap.size());
rows = new ArrayList<>(registryMap.size());
for (Map.Entry<PairRegistryId, List<Registry>> entry : registryMap.entrySet()) {
PairRegistryId pairRegistryId = entry.getKey();
List<Registry> groupedRegistry = entry.getValue();
@ -119,33 +116,20 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
continue;
}
String firmId = tmtRegistry.getTradingCode() != null ? tmtRegistry.getTradingCode() : "";
String sessionId = String.valueOf(tmtRegistry.getSessionId());
Session session = sessionImdg.getSingleObjectByID(tmtRegistry.getSessionId());
String sessionDate = "";
if (session != null && session.getCreated() != null)
sessionDate = dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault()));
String account = tmtRegistry.getAccount();
KSRepCashNettoReport ksRepCashNettoReport = new KSRepCashNettoReport();
ksRepCashNettoReport.setFirmId(tmtRegistry.getTradingCode());
ksRepCashNettoReport.setSessionId(tmtRegistry.getSessionId());
ksRepCashNettoReport.setSessionDate(session != null ? session.getCreated() : null);
ksRepCashNettoReport.setAccount(tmtRegistry.getAccount());
ksRepCashNettoReport.setDate(nowDate);
BigDecimal tmtBalance = tmtRegistry.getBalance() != null ? tmtRegistry.getBalance() : BigDecimal.ZERO;
BigDecimal omtBalance = omtRegistry.getBalance() != null ? omtRegistry.getBalance() : BigDecimal.ZERO;
String value = df02Format.format(tmtBalance.subtract(omtBalance));
String date = dateFormatter.format(nowDate);
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = sessionId;
line[valueIdx++] = sessionDate;
line[valueIdx++] = account;
line[valueIdx++] = value;
line[valueIdx++] = date;
lines.add(line);
ksRepCashNettoReport.setValue(tmtBalance.subtract(omtBalance));
rows.add(ksRepCashNettoReport);
} catch (Throwable e) {
log.error(
"Can't create report row for registries (id = [%s]), row was skipped".formatted(

View file

@ -8,6 +8,7 @@ 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.clearing.reports.reports.bean.KSRepCashRegisterSumsReport;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportBuilderType;
@ -28,14 +29,11 @@ import java.util.List;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyParams> {
public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyParams, KSRepCashRegisterSumsReport> {
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final String[] headers = {
"FIRMID", "ACCOUNT", "REGISTER_CODE", "ADD_SUM", "ADD_TIME", "ADD_DATE"
};
private List<String[]> lines = null;
private List<KSRepCashRegisterSumsReport> rows = null;
public KSRepCashRegisterSumsReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
@ -43,13 +41,8 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
}
@Override
protected String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
protected List<KSRepCashRegisterSumsReport> getRows() {
return rows;
}
@Override
@ -63,10 +56,15 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
}
@Override
public Class<EmptyParams> getParamsType() {
public Class<EmptyParams> getParamsClass() {
return EmptyParams.class;
}
@Override
public Class<KSRepCashRegisterSumsReport> getReportClass() {
return KSRepCashRegisterSumsReport.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
@ -84,43 +82,32 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
)
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
lines = new ArrayList<>(registries.size());
rows = new ArrayList<>(registries.size());
for (Registry registry : registries) {
try {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String account = registry.getAccount();
String registerCode = registry.getRegistryCode();
String addTime = "";
String addDate = dateFormatter.format(nowDate);
// Если есть одновременно registry.credit и registry.debit, записываем две записи по одному registry
String addSum = "";
if (registry.getCredit() != null) {
addSum = df02Format.format(registry.getCredit());
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = account;
line[valueIdx++] = registerCode;
line[valueIdx++] = addSum;
line[valueIdx++] = addTime;
line[valueIdx++] = addDate;
lines.add(line);
KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport();
ksRepCashRegisterSumsReport.setFirmId(registry.getTradingCode());
ksRepCashRegisterSumsReport.setAccount(registry.getAccount());
ksRepCashRegisterSumsReport.setRegisterCode(registry.getRegistryCode());
ksRepCashRegisterSumsReport.setAddDate(nowDate);
ksRepCashRegisterSumsReport.setAddTime(null);
ksRepCashRegisterSumsReport.setAddSum(registry.getCredit());
rows.add(ksRepCashRegisterSumsReport);
}
if (registry.getDebit() != null) {
addSum = "-" + df02Format.format(registry.getDebit());
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = account;
line[valueIdx++] = registerCode;
line[valueIdx++] = addSum;
line[valueIdx++] = addTime;
line[valueIdx++] = addDate;
lines.add(line);
KSRepCashRegisterSumsReport ksRepCashRegisterSumsReport = new KSRepCashRegisterSumsReport();
ksRepCashRegisterSumsReport.setFirmId(registry.getTradingCode());
ksRepCashRegisterSumsReport.setAccount(registry.getAccount());
ksRepCashRegisterSumsReport.setRegisterCode(registry.getRegistryCode());
ksRepCashRegisterSumsReport.setAddDate(nowDate);
ksRepCashRegisterSumsReport.setAddTime(null);
ksRepCashRegisterSumsReport.setAddSum(registry.getDebit().negate());
rows.add(ksRepCashRegisterSumsReport);
}
} catch (Throwable e) {

View file

@ -9,6 +9,7 @@ import ru.clearing.platform.dictionary.RegistryCodeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.bean.KSRepCashRegistersReport;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportBuilderType;
@ -30,15 +31,13 @@ import java.util.Map;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParams> {
public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParams, KSRepCashRegistersReport> {
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final Imdg<RegistryCodeDictionary> registryCodeDictionaryImdg;
private final String[] headers = {
"FIRMID", "ACCOUNT", "DATE", "REGISTER_CODE", "REGISTER_NAME", "OPEN_BALANCE", "CHANGE_BALANCE", "ADD_WITHDRAW", "CLOSE_BALANCE", "REMARKS"
};
private List<String[]> lines = null;
private List<KSRepCashRegistersReport> rows = null;
public KSRepCashRegistersReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
@ -46,14 +45,10 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
registryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class);
}
@Override
protected String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
protected List<KSRepCashRegistersReport> getRows() {
return rows;
}
@Override
@ -67,10 +62,15 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
}
@Override
public Class<EmptyParams> getParamsType() {
public Class<EmptyParams> getParamsClass() {
return EmptyParams.class;
}
@Override
public Class<KSRepCashRegistersReport> getReportClass() {
return KSRepCashRegistersReport.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
@ -88,55 +88,37 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
)
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
lines = new ArrayList<>(registries.size());
rows = new ArrayList<>(registries.size());
for (Registry registry : registries) {
try {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String account = registry.getAccount();
KSRepCashRegistersReport ksRepCashRegistersReport = new KSRepCashRegistersReport();
ksRepCashRegistersReport.setFirmId(registry.getTradingCode());
ksRepCashRegistersReport.setAccount(registry.getAccount());
ksRepCashRegistersReport.setDate(nowDate);
ksRepCashRegistersReport.setRegisterCode(registry.getRegistryCode());
ksRepCashRegistersReport.setOpenBalance(registry.getOpenBalance());
ksRepCashRegistersReport.setCloseBalance(registry.getCloseBalance());
ksRepCashRegistersReport.setRemarks("");
String date = dateFormatter.format(nowDate);
String registerCode = registry.getRegistryCode();
RegistryCodeDictionary registryCodeDictionary = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registry.getRegistryCode()));
if (registryCodeDictionary != null) ksRepCashRegistersReport.setRegisterName(registryCodeDictionary.getName());
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()) : "";
String changeBalance = "";
if (registry.getSettledCredit() != null) {
if (registry.getSettledDebit() != null)
changeBalance = df02Format.format(registry.getSettledCredit().subtract(registry.getSettledDebit()));
else changeBalance = df02Format.format(registry.getSettledCredit());
ksRepCashRegistersReport.setChangeBalance(registry.getSettledCredit().subtract(registry.getSettledDebit()));
else ksRepCashRegistersReport.setChangeBalance(registry.getSettledCredit());
}
String addWithdraw = "";
if (registry.getCredit() != null) {
if (registry.getDebit() != null)
addWithdraw = df02Format.format(registry.getCredit().subtract(registry.getDebit()));
else addWithdraw = df02Format.format(registry.getCredit());
ksRepCashRegistersReport.setAddWithdraw(registry.getCredit().subtract(registry.getDebit()));
else ksRepCashRegistersReport.setAddWithdraw(registry.getCredit());
}
String closeBalance = registry.getCloseBalance() != null ? df02Format.format(registry.getCloseBalance()) : "";
String remarks = "";
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = account;
line[valueIdx++] = date;
line[valueIdx++] = registerCode;
line[valueIdx++] = registerName;
line[valueIdx++] = openBalance;
line[valueIdx++] = changeBalance;
line[valueIdx++] = addWithdraw;
line[valueIdx++] = closeBalance;
line[valueIdx++] = remarks;
lines.add(line);
rows.add(ksRepCashRegistersReport);
} catch (Throwable e) {
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
}

View file

@ -9,6 +9,7 @@ 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.clearing.reports.reports.bean.KSRepDepoNettoReport;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryTradingParams;
@ -22,20 +23,16 @@ 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> {
public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam, KSRepDepoNettoReport> {
private final Imdg<Registry> registryImdg;
private final Imdg<Session> sessionImdg;
private final String[] headers = {
"FIRMID", "SESSION_ID", "SESSION_DATE", "ACCOUNT", "SECURITYID", "VALUE", "DATE"
};
private List<String[]> lines = null;
private List<KSRepDepoNettoReport> rows = null;
public KSRepDepoNettoReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
@ -43,13 +40,8 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
}
@Override
protected String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
protected List<KSRepDepoNettoReport> getRows() {
return rows;
}
@Override
@ -63,10 +55,15 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
}
@Override
public Class<SessionIdParam> getParamsType() {
public Class<SessionIdParam> getParamsClass() {
return SessionIdParam.class;
}
@Override
public Class<KSRepDepoNettoReport> getReportClass() {
return KSRepDepoNettoReport.class;
}
@Override
protected void collect(SessionIdParam params) {
LocalDate nowDate = LocalDate.now();
@ -84,7 +81,7 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
Map<PairRegistryId, List<Registry>> registryMap = registries.stream().collect(Collectors.groupingBy(PairRegistryId::new));
lines = new ArrayList<>(registries.size());
rows = new ArrayList<>(registries.size());
for (Map.Entry<PairRegistryId, List<Registry>> entry : registryMap.entrySet()) {
PairRegistryId pairRegistryId = entry.getKey();
List<Registry> groupedRegistry = entry.getValue();
@ -118,34 +115,21 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
continue;
}
String firmId = tstRegistry.getTradingCode() != null ? tstRegistry.getTradingCode() : "";
String sessionId = String.valueOf(tstRegistry.getSessionId());
KSRepDepoNettoReport ksRepDepoNettoReport = new KSRepDepoNettoReport();
ksRepDepoNettoReport.setFirmId(tstRegistry.getTradingCode());
ksRepDepoNettoReport.setSessionId(tstRegistry.getSessionId());
ksRepDepoNettoReport.setAccount(tstRegistry.getAccount());
ksRepDepoNettoReport.setSecurityId(tstRegistry.getSecuritySymbol());
ksRepDepoNettoReport.setDate(nowDate);
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() : "";
if (session != null) ksRepDepoNettoReport.setSessionDate(session.getCreated());
BigDecimal tmtBalance = tstRegistry.getBalance() != null ? tstRegistry.getBalance() : BigDecimal.ZERO;
BigDecimal omtBalance = ostRegistry.getBalance() != null ? ostRegistry.getBalance() : BigDecimal.ZERO;
String value = df02Format.format(tmtBalance.subtract(omtBalance));
String date = dateFormatter.format(nowDate);
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = sessionId;
line[valueIdx++] = sessionDate;
line[valueIdx++] = account;
line[valueIdx++] = securityId;
line[valueIdx++] = value;
line[valueIdx++] = date;
lines.add(line);
ksRepDepoNettoReport.setValue(tmtBalance.subtract(omtBalance));
rows.add(ksRepDepoNettoReport);
} catch (Throwable e) {
log.error(
"Can't create report row for registries (id = [%s]), row was skipped".formatted(

View file

@ -8,6 +8,7 @@ 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.clearing.reports.reports.bean.KSRepDepoRegisterQuantitiesReport;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportBuilderType;
@ -28,14 +29,11 @@ import java.util.List;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams> {
public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepDepoRegisterQuantitiesReport> {
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final String[] headers = {
"FIRMID", "ACCOUNT", "SECURITYID", "REGISTER_CODE", "ADD_QUANTITY", "ADD_TIME", "ADD_DATE"
};
private List<String[]> lines = null;
private List<KSRepDepoRegisterQuantitiesReport> rows = null;
public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
@ -43,13 +41,8 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
}
@Override
protected String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
protected List<KSRepDepoRegisterQuantitiesReport> getRows() {
return rows;
}
@Override
@ -63,10 +56,15 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
}
@Override
public Class<EmptyParams> getParamsType() {
public Class<EmptyParams> getParamsClass() {
return EmptyParams.class;
}
@Override
public Class<KSRepDepoRegisterQuantitiesReport> getReportClass() {
return KSRepDepoRegisterQuantitiesReport.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
@ -82,46 +80,34 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
lines = new ArrayList<>(registries.size());
rows = new ArrayList<>(registries.size());
for (Registry registry : registries) {
try {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String account = registry.getAccount();
String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : "";
String registerCode = registry.getRegistryCode();
String addTime = "";
String addDate = dateFormatter.format(nowDate);
// Если есть одновременно registry.credit и registry.debit, записываем две записи по одному registry
String addQuantity = "";
if (registry.getCredit() != null) {
addQuantity = df02Format.format(registry.getCredit());
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = account;
line[valueIdx++] = securityId;
line[valueIdx++] = registerCode;
line[valueIdx++] = addQuantity;
line[valueIdx++] = addTime;
line[valueIdx++] = addDate;
lines.add(line);
KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport();
ksRepDepoRegisterQuantitiesReport.setFirmId(registry.getTradingCode());
ksRepDepoRegisterQuantitiesReport.setAccount(registry.getAccount());
ksRepDepoRegisterQuantitiesReport.setSecurityId(registry.getSecuritySymbol());
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registry.getRegistryCode());
ksRepDepoRegisterQuantitiesReport.setAddTime(null);
ksRepDepoRegisterQuantitiesReport.setAddDate(nowDate);
ksRepDepoRegisterQuantitiesReport.setAddQuantity(registry.getCredit());
rows.add(ksRepDepoRegisterQuantitiesReport);
}
if (registry.getDebit() != null) {
addQuantity = "-" + df02Format.format(registry.getDebit());
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = account;
line[valueIdx++] = securityId;
line[valueIdx++] = registerCode;
line[valueIdx++] = addQuantity;
line[valueIdx++] = addTime;
line[valueIdx++] = addDate;
lines.add(line);
KSRepDepoRegisterQuantitiesReport ksRepDepoRegisterQuantitiesReport = new KSRepDepoRegisterQuantitiesReport();
ksRepDepoRegisterQuantitiesReport.setFirmId(registry.getTradingCode());
ksRepDepoRegisterQuantitiesReport.setAccount(registry.getAccount());
ksRepDepoRegisterQuantitiesReport.setSecurityId(registry.getSecuritySymbol());
ksRepDepoRegisterQuantitiesReport.setRegisterCode(registry.getRegistryCode());
ksRepDepoRegisterQuantitiesReport.setAddTime(null);
ksRepDepoRegisterQuantitiesReport.setAddDate(nowDate);
ksRepDepoRegisterQuantitiesReport.setAddQuantity(registry.getDebit().negate());
rows.add(ksRepDepoRegisterQuantitiesReport);
}
} catch (Throwable e) {

View file

@ -9,6 +9,7 @@ import ru.clearing.platform.dictionary.RegistryCodeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.bean.KSRepDepoRegistersReport;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportBuilderType;
@ -30,15 +31,12 @@ import java.util.Map;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParams> {
public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParams, KSRepDepoRegistersReport> {
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final Imdg<RegistryCodeDictionary> registryCodeDictionaryImdg;
private final String[] headers = {
"FIRMID", "ACCOUNT", "DATE", "SECURITYID", "REGISTER_CODE", "REGISTER_NAME", "OPEN_QUANTITY", "CHANGE_QUANTITY", "ADD_WITHDRAW_DEPO", "CLOSE_QUANTITY", "REMARKS"
};
private List<String[]> lines = null;
private List<KSRepDepoRegistersReport> rows = null;
public KSRepDepoRegistersReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
@ -47,13 +45,8 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
}
@Override
protected String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
protected List<KSRepDepoRegistersReport> getRows() {
return rows;
}
@Override
@ -67,10 +60,15 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
}
@Override
public Class<EmptyParams> getParamsType() {
public Class<EmptyParams> getParamsClass() {
return EmptyParams.class;
}
@Override
public Class<KSRepDepoRegistersReport> getReportClass() {
return KSRepDepoRegistersReport.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
@ -86,56 +84,38 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
lines = new ArrayList<>(registries.size());
rows = new ArrayList<>(registries.size());
for (Registry registry : registries) {
try {
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : "";
String account = registry.getAccount();
String date = dateFormatter.format(nowDate);
String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : "";
String registerCode = registry.getRegistryCode();
KSRepDepoRegistersReport ksRepDepoRegistersReport = new KSRepDepoRegistersReport();
ksRepDepoRegistersReport.setFirmId(registry.getTradingCode());
ksRepDepoRegistersReport.setAccount(registry.getAccount());
ksRepDepoRegistersReport.setDate(nowDate);
ksRepDepoRegistersReport.setSecurityId(registry.getSecuritySymbol());
ksRepDepoRegistersReport.setRegisterCode(registry.getRegistryCode());
ksRepDepoRegistersReport.setOpenQuantity(registry.getOpenBalance());
ksRepDepoRegistersReport.setCloseQuantity(registry.getCloseBalance());
ksRepDepoRegistersReport.setRemarks(null);
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode));
String registerName = "";
if (registryCodeDescription != null) registerName = registryCodeDescription.getName();
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registry.getRegistryCode()));
if (registryCodeDescription != null) ksRepDepoRegistersReport.setRegisterName(registryCodeDescription.getName());
String openQuantity = registry.getOpenBalance() != null ? registry.getOpenBalance().toString() : "";
String changeQuantity = "";
if (registry.getSettledCredit() != null) {
if (registry.getSettledDebit() != null)
changeQuantity = registry.getSettledCredit().subtract(registry.getSettledDebit()).toString();
else changeQuantity = registry.getSettledCredit().toString();
ksRepDepoRegistersReport.setChangeQuantity(registry.getSettledCredit().subtract(registry.getSettledDebit()));
else ksRepDepoRegistersReport.setChangeQuantity(registry.getSettledCredit());
}
String addWithdrawDepo = "";
if (registry.getCredit() != null) {
if (registry.getDebit() != null)
addWithdrawDepo = registry.getCredit().subtract(registry.getDebit()).toString();
else addWithdrawDepo = registry.getCredit().toString();
ksRepDepoRegistersReport.setAddWithdrawDepo(registry.getCredit().subtract(registry.getDebit()));
else ksRepDepoRegistersReport.setAddWithdrawDepo(registry.getCredit());
}
String closeQuantity = registry.getCloseBalance() != null ? registry.getCloseBalance().toString() : "";
String remarks = "";
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = account;
line[valueIdx++] = date;
line[valueIdx++] = securityId;
line[valueIdx++] = registerCode;
line[valueIdx++] = registerName;
line[valueIdx++] = openQuantity;
line[valueIdx++] = changeQuantity;
line[valueIdx++] = addWithdrawDepo;
line[valueIdx++] = closeQuantity;
line[valueIdx++] = remarks;
lines.add(line);
rows.add(ksRepDepoRegistersReport);
} catch (Throwable e) {
log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e);
}

View file

@ -9,6 +9,7 @@ import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.bean.KSRepFirmDetailsReport;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.DocumentTypes;
import ru.spcex.platform.enumeration.ReportBuilderType;
@ -24,15 +25,12 @@ import java.util.Map;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams> {
public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams, KSRepFirmDetailsReport> {
private final Imdg<Company> companyImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<ProfileDocument> profileDocumentImdg;
private final String[] headers = {
"FIRMID", "PART_INN", "PART_KPP", "AGREEMENT_NUMBER", "AGREEMENT_DATE", "AGREEMENT_NAME", "FIRM_NAME"
};
private List<String[]> lines = null;
private List<KSRepFirmDetailsReport> rows = null;
public KSRepFirmDetailsReportBuilder(ImdgProvider imdgProvider) {
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
@ -41,13 +39,8 @@ public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams>
}
@Override
protected String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
protected List<KSRepFirmDetailsReport> getRows() {
return rows;
}
@Override
@ -61,26 +54,28 @@ public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams>
}
@Override
public Class<EmptyParams> getParamsType() {
public Class<EmptyParams> getParamsClass() {
return EmptyParams.class;
}
@Override
public Class<KSRepFirmDetailsReport> getReportClass() {
return KSRepFirmDetailsReport.class;
}
@Override
protected void collect(EmptyParams params) {
Collection<Company> companies = companyImdg.getCollectionObjectsByFieldValues(Map.of("workflowStatus", WorkflowStatus.Active.getKey()));
lines = new ArrayList<>(companies.size());
rows = new ArrayList<>(companies.size());
for (Company company : companies) {
try {
String firmId = company.getTradingCode() != null ? company.getTradingCode() : "";
CompanySymbols innCompanySymbol = companySymbolsImdg.getSingleObjectByFieldValues(
Map.of(
"companyId", company.getId(),
"companySymbol", CompanySymbol.INN.getKey()
)
);
String partInn = innCompanySymbol != null && innCompanySymbol.getCompanySymbolValue() != null ? innCompanySymbol.getCompanySymbolValue() : "";
CompanySymbols cppCompanySymbol = companySymbolsImdg.getSingleObjectByFieldValues(
Map.of(
@ -88,7 +83,6 @@ public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams>
"companySymbol", CompanySymbol.CPP.getKey()
)
);
String partKpp = cppCompanySymbol != null && cppCompanySymbol.getCompanySymbolValue() != null ? cppCompanySymbol.getCompanySymbolValue() : "";
ProfileDocument profileDocument = profileDocumentImdg.getSingleObjectByFieldValues(
Map.of(
@ -96,28 +90,20 @@ public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams>
"documentType", DocumentTypes.cntr.getKey()
)
);
String agreementNumber = "";
String agreementDate = "";
String agreementName = "";
KSRepFirmDetailsReport ksRepFirmDetailsReport = new KSRepFirmDetailsReport();
ksRepFirmDetailsReport.setFirmId(company.getTradingCode());
ksRepFirmDetailsReport.setPartInn(innCompanySymbol != null ? innCompanySymbol.getCompanySymbolValue() : null);
ksRepFirmDetailsReport.setPartKpp(cppCompanySymbol != null ? cppCompanySymbol.getCompanySymbolValue() : null);
ksRepFirmDetailsReport.setFirmName(company.getFullName());
if (profileDocument != null) {
agreementNumber = profileDocument.getNumber() != null ? profileDocument.getNumber() : "";
agreementDate = profileDocument.getIssueDate() != null ? dateFormatter.format(profileDocument.getIssueDate()) : "";
agreementName = profileDocument.getName() != null ? profileDocument.getName() : "";
ksRepFirmDetailsReport.setAgreementNumber(profileDocument.getNumber());
ksRepFirmDetailsReport.setAgreementDate(profileDocument.getIssueDate());
ksRepFirmDetailsReport.setAgreementName(profileDocument.getName());
}
String firmName = company.getFullName() != null ? company.getFullName() : "";
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = firmId;
line[valueIdx++] = partInn;
line[valueIdx++] = partKpp;
line[valueIdx++] = agreementNumber;
line[valueIdx++] = agreementDate;
line[valueIdx++] = agreementName;
line[valueIdx++] = firmName;
lines.add(line);
rows.add(ksRepFirmDetailsReport);
} catch (Throwable e) {
log.error("Can't create report row for company (id = %d), skipped".formatted(company.getId()), e);
}

View file

@ -12,6 +12,7 @@ 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.clearing.reports.reports.bean.KSRepTradesReport;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -21,23 +22,21 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepTradesReport> {
private final Imdg<ExecutionDeposit> executionDepositImdg;
private final Imdg<ExecutionFond> executionFondImdg;
private final Imdg<Session> sessionImdg;
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final String[] headers = {
"SESSION_ID", "SESSION_DATE", "TR_ID", "FIRM_ID", "TKR", "CASH_LIABILITY", "DEPO_LIABILITY", "TRADE_NUM", "CLASS_CODE", "TRADE_DATE", "STATUS"
};
private List<String[]> lines = null;
private List<KSRepTradesReport> rows = null;
public KSRepTradesReportBuilder(ImdgProvider imdgProvider) {
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
@ -48,13 +47,8 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
}
@Override
protected String[] getHeaders() {
return headers;
}
@Override
protected List<String[]> getLines() {
return lines;
protected List<KSRepTradesReport> getRows() {
return rows;
}
@Override
@ -68,10 +62,15 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
}
@Override
public Class<EmptyParams> getParamsType() {
public Class<EmptyParams> getParamsClass() {
return EmptyParams.class;
}
@Override
public Class<KSRepTradesReport> getReportClass() {
return KSRepTradesReport.class;
}
@Override
protected void collect(EmptyParams params) {
LocalDate nowDate = LocalDate.now();
@ -88,49 +87,30 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
executions.addAll(executionDeposits);
executions.addAll(executionFonds);
Map<Long, String> tradingCodeForCompanyId = new HashMap<>();
Map<Long, String> sessionDateForSessionId = new HashMap<>();
lines = new ArrayList<>(executions.size());
rows = new ArrayList<>(executions.size());
for (ExecutionCommon execution : executions) {
try {
String sessionId = execution.getSessionId() != null ? String.valueOf(execution.getSessionId()) : "";
KSRepTradesReport ksRepTradesReport = new KSRepTradesReport();
ksRepTradesReport.setSessionId(execution.getSessionId());
ksRepTradesReport.setTrId(execution.getId());
ksRepTradesReport.setTkr(execution.getTradingClearingRegistryId());
String sessionDate = "";
if (execution.getSessionId() != null) {
sessionDate = sessionDateForSessionId.get(execution.getSessionId());
if (sessionDate == null) {
Session session = sessionImdg.getSingleObjectByID(execution.getSessionId());
sessionDate = session != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : "";
sessionDateForSessionId.put(execution.getSessionId(), sessionDate);
}
}
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
ksRepTradesReport.setFirmId(company != null ? company.getTradingCode() : null);
String trId = String.valueOf(execution.getId());
Session session = sessionImdg.getSingleObjectByID(execution.getSessionId());
ksRepTradesReport.setSessionDate(session != null ? session.getCreated() : null);
String firmId = "";
if (execution.getCompanyId() != null) {
firmId = tradingCodeForCompanyId.get(execution.getCompanyId());
if (firmId == null) {
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
firmId = company != null && company.getTradingCode() != null ? company.getTradingCode() : "";
tradingCodeForCompanyId.put(execution.getCompanyId(), firmId);
}
}
String tkr = execution.getTradingClearingRegistryId() != null ? String.valueOf(execution.getTradingClearingRegistryId()) : "";
String cashLiability = "";
String depoLiability = "";
if (execution instanceof ExecutionDeposit executionDeposit) {
cashLiability = executionDeposit.getFirstLegAmount() != null ? df02Format.format(executionDeposit.getFirstLegAmount()) : "";
ksRepTradesReport.setCashLiability(executionDeposit.getFirstLegAmount());
} else if (execution instanceof ExecutionFond executionFond) {
cashLiability = executionFond.getSettlementAmount() != null ? df02Format.format(executionFond.getSettlementAmount()) : "";
depoLiability = executionFond.getQuantity() != null ? executionFond.getQuantity().toString() : "";
ksRepTradesReport.setCashLiability(executionFond.getSettlementAmount());
ksRepTradesReport.setDepoLiability(executionFond.getQuantity());
}
String tradeNum = execution.getExchangeExecutionId() != null ? String.valueOf(execution.getExchangeExecutionId()) : "";
String classCode = "";
String tradeDate = execution.getExchangeExecutionTime() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(execution.getExchangeExecutionTime(), ZoneId.systemDefault())) : "";
ksRepTradesReport.setTradeNum(execution.getExchangeExecutionId());
ksRepTradesReport.setClassCode(null);
ksRepTradesReport.setTradeDate(execution.getExchangeExecutionTime());
String status = "";
if (execution.getCoverageStatus() != null) {
@ -227,22 +207,9 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams> {
}
}
ksRepTradesReport.setStatus(status);
int valueIdx = 0;
String[] line = new String[getHeaders().length];
line[valueIdx++] = sessionId;
line[valueIdx++] = sessionDate;
line[valueIdx++] = trId;
line[valueIdx++] = firmId;
line[valueIdx++] = tkr;
line[valueIdx++] = cashLiability;
line[valueIdx++] = depoLiability;
line[valueIdx++] = tradeNum;
line[valueIdx++] = classCode;
line[valueIdx++] = tradeDate;
line[valueIdx++] = status;
lines.add(line);
rows.add(ksRepTradesReport);
} catch (Throwable e) {
log.error("Can't create report row for execution_%s (id = %d), skipped".formatted(execution instanceof ExecutionFond ? "fond" : "deposit", execution.getId()), e);
}

View file

@ -12,15 +12,15 @@ import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.ReportPart;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendReportRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithPeriod;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionIdList;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.reports.config.element.ReportsServiceSettings;
import ru.spcex.clearing.reports.reports.*;
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
import ru.spcex.clearing.reports.reports.EmptyParams;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.ReportBuilderType;
@ -30,7 +30,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.validation.IValidator;
import java.io.File;
import java.time.LocalDate;
import java.util.*;
import java.util.function.Function;
@ -43,19 +42,15 @@ public class ReportService extends QueueConsumer implements InitializingBean {
private final Function<ReportRequest, IValidator> reportRequestValidator;
private final Function<ReportRequestWithSessionId, IValidator> reportRequestWithSessionIdValidator;
private final Function<ReportRequestWithSessionIdList, IValidator> reportRequestWithSessionIdListValidator;
private final Function<ReportRequestWithPeriod, IValidator> reportRequestWithPeriodValidator;
private final Function<LauncherCommandRequest, IValidator> reportRequestGREPValidator;
private final Function<LauncherCommandRequest, IValidator> reportRequestGRETValidator;
private final Function<LauncherCommandRequest, IValidator> reportRequestGREFValidator;
private final Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams>>> reportBuildersWithoutParams;
private final Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam>>> reportBuildersWithSessionIdParam;
private final Map<ReportBuilderType, List<CSVReportBuilder<SessionIdListParams>>> reportBuildersWithSessionIdListParam;
private final Map<ReportBuilderType, List<CSVReportBuilder<PeriodParams>>> reportBuildersWithPeriodParams;
private final Map<ReportBuilderType, List<CSVReportBuilder<?>>> reportBuildersForGREP;
private final Map<ReportBuilderType, List<CSVReportBuilder<?>>> reportBuildersForGREF;
private final Map<ReportBuilderType, List<CSVReportBuilder<?>>> reportBuildersForGRET;
private final Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams, ?>>> reportBuildersWithoutParams;
private final Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam, ?>>> reportBuildersWithSessionIdParam;
private final Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREP;
private final Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREF;
private final Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGRET;
private final File outFolder;
@ -67,29 +62,21 @@ public class ReportService extends QueueConsumer implements InitializingBean {
ReportsServiceSettings reportsServiceSettings,
@Qualifier("reportBuildersWithoutParams")
Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams>>> reportBuildersWithoutParams,
Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams, ?>>> reportBuildersWithoutParams,
@Qualifier("reportBuildersWithSessionIdParam")
Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam>>> reportBuildersWithSessionIdParam,
@Qualifier("reportBuildersWithSessionIdListParam")
Map<ReportBuilderType, List<CSVReportBuilder<SessionIdListParams>>> reportBuildersWithSessionIdListParam,
@Qualifier("reportBuildersWithPeriodParams")
Map<ReportBuilderType, List<CSVReportBuilder<PeriodParams>>> reportBuildersWithPeriodParams,
Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam, ?>>> reportBuildersWithSessionIdParam,
@Qualifier("reportBuildersForGREP")
Map<ReportBuilderType, List<CSVReportBuilder<?>>> reportBuildersForGREP,
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREP,
@Qualifier("reportBuildersForGREF")
Map<ReportBuilderType, List<CSVReportBuilder<?>>> reportBuildersForGREF,
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREF,
@Qualifier("reportBuildersForGRET")
Map<ReportBuilderType, List<CSVReportBuilder<?>>> reportBuildersForGRET,
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGRET,
@Qualifier("reportRequestValidator")
Function<ReportRequest, IValidator> reportRequestValidator,
@Qualifier("reportRequestWithSessionIdValidator")
Function<ReportRequestWithSessionId, IValidator> reportRequestWithSessionIdValidator,
@Qualifier("reportRequestWithSessionIdListValidator")
Function<ReportRequestWithSessionIdList, IValidator> reportRequestWithSessionIdListValidator,
@Qualifier("reportRequestWithPeriodValidator")
Function<ReportRequestWithPeriod, IValidator> reportRequestWithPeriodValidator,
@Qualifier("reportRequestGREPValidator")
Function<LauncherCommandRequest, IValidator> reportRequestGREPValidator,
@ -105,12 +92,8 @@ public class ReportService extends QueueConsumer implements InitializingBean {
this.kafkaSender = kafkaSender;
this.reportRequestValidator = reportRequestValidator;
this.reportRequestWithSessionIdValidator = reportRequestWithSessionIdValidator;
this.reportRequestWithSessionIdListValidator = reportRequestWithSessionIdListValidator;
this.reportRequestWithPeriodValidator = reportRequestWithPeriodValidator;
this.reportBuildersWithoutParams = reportBuildersWithoutParams;
this.reportBuildersWithSessionIdParam = reportBuildersWithSessionIdParam;
this.reportBuildersWithSessionIdListParam = reportBuildersWithSessionIdListParam;
this.reportBuildersWithPeriodParams = reportBuildersWithPeriodParams;
this.reportRequestGREPValidator = reportRequestGREPValidator;
this.reportRequestGRETValidator = reportRequestGRETValidator;
this.reportRequestGREFValidator = reportRequestGREFValidator;
@ -129,12 +112,6 @@ public class ReportService extends QueueConsumer implements InitializingBean {
callback(ReportRequestWithSessionId.class)
.setFunction(this::createReportForSessionId)
.forDestination(Consts.CREATE_REPORT_FOR_SESSION_ID, callbacks::put);
callback(ReportRequestWithSessionIdList.class)
.setFunction(this::createReportForSessionIdList)
.forDestination(Consts.CREATE_REPORT_FOR_SESSION_ID_LIST, callbacks::put);
callback(ReportRequestWithPeriod.class)
.setFunction(this::createReportForPeriod)
.forDestination(Consts.CREATE_REPORT_FOR_PERIOD, callbacks::put);
callback(LauncherCommandRequest.class)
.setFunction(this::createReportForGREP)
.forDestination(Task.createReport_GREP.topic(), callbacks::put);
@ -161,11 +138,11 @@ public class ReportService extends QueueConsumer implements InitializingBean {
log.debug("Create report type {}...", req.getReportId());
List<CSVReportBuilder<EmptyParams>> builders = reportBuildersWithoutParams.get(
List<CSVReportBuilder<EmptyParams, ?>> builders = reportBuildersWithoutParams.get(
IEnumKey.getEnumByKey(ReportBuilderType.class, req.getReportId())
);
List<String> outFilenames = new ArrayList<>();
for (CSVReportBuilder<EmptyParams> builder : builders) {
for (CSVReportBuilder<EmptyParams, ?> builder : builders) {
File outFile = builder.createReport(new EmptyParams(), outFolder);
if (outFile == null) continue;
outFilenames.add(outFile.getAbsolutePath());
@ -196,11 +173,11 @@ public class ReportService extends QueueConsumer implements InitializingBean {
log.debug("Create report type {}...", req.getReportId());
List<CSVReportBuilder<SessionIdParam>> builders = reportBuildersWithSessionIdParam.get(
List<CSVReportBuilder<SessionIdParam, ?>> builders = reportBuildersWithSessionIdParam.get(
IEnumKey.getEnumByKey(ReportBuilderType.class, req.getReportId())
);
List<String> outFilenames = new ArrayList<>();
for (CSVReportBuilder<SessionIdParam> builder : builders) {
for (CSVReportBuilder<SessionIdParam, ?> builder : builders) {
SessionIdParam sessionIdParam = new SessionIdParam();
sessionIdParam.setSessionId(req.getSessionId());
File outFile = builder.createReport(sessionIdParam, outFolder);
@ -219,81 +196,6 @@ public class ReportService extends QueueConsumer implements InitializingBean {
return null;
}
public RequestInfoUpdate createReportForSessionIdList(BaseRequest<ReportRequestWithSessionIdList> userRequest) {
log.debug("ReportRequestWithSessionIdList received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return null;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestWithSessionIdListValidator);
if (requestInfoUpdate != null) return null;
ReportRequestWithSessionIdList req = userRequest.getRequestPayload();
logUnknownProperties(userRequest);
log.debug("Create report type {}...", req.getReportId());
List<CSVReportBuilder<SessionIdListParams>> builders = reportBuildersWithSessionIdListParam.get(
IEnumKey.getEnumByKey(ReportBuilderType.class, req.getReportId())
);
List<String> outFilenames = new ArrayList<>();
for (CSVReportBuilder<SessionIdListParams> builder : builders) {
SessionIdListParams sessionIdListParams = new SessionIdListParams();
sessionIdListParams.setSessionIdList(req.getSessionIdList());
File outFile = builder.createReport(sessionIdListParams, outFolder);
if (outFile == null) continue;
outFilenames.add(outFile.getAbsolutePath());
}
int outFilesCnt = outFilenames.size();
if (outFilesCnt == 0) {
log.error("Create report {} failed, see log", req.getReportId());
} else if (outFilesCnt < builders.size()) {
log.error("Create some error for {} failed, see log", req.getReportId());
} else {
log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames));
}
return null;
}
public RequestInfoUpdate createReportForPeriod(BaseRequest<ReportRequestWithPeriod> userRequest) {
log.debug("ReportRequestWithPeriod received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return null;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestWithPeriodValidator);
if (requestInfoUpdate != null) return null;
ReportRequestWithPeriod req = userRequest.getRequestPayload();
logUnknownProperties(userRequest);
log.debug("Create report type {}...", req.getReportId());
List<CSVReportBuilder<PeriodParams>> builders = reportBuildersWithPeriodParams.get(
IEnumKey.getEnumByKey(ReportBuilderType.class, req.getReportId())
);
List<String> outFilenames = new ArrayList<>();
for (CSVReportBuilder<PeriodParams> builder : builders) {
PeriodParams periodParams = new PeriodParams();
periodParams.setStartDate(req.getStartDate());
periodParams.setEndDate(req.getEndDate());
File outFile = builder.createReport(periodParams, outFolder);
if (outFile == null) continue;
outFilenames.add(outFile.getAbsolutePath());
}
int outFilesCnt = outFilenames.size();
if (outFilesCnt == 0) {
log.error("Create report {} failed, see log", req.getReportId());
} else if (outFilesCnt < builders.size()) {
log.error("Create some error for {} failed, see log", req.getReportId());
} else {
log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames));
}
return null;
}
public RequestInfoUpdate createReportForGREP(BaseRequest<LauncherCommandRequest> userRequest) {
log.debug("GREP task received");
@ -342,45 +244,23 @@ public class ReportService extends QueueConsumer implements InitializingBean {
return null;
}
private Map<String, ReportBuilderType> createReportsForTask(Long sessionId, Collection<List<CSVReportBuilder<?>>> buildersForTask) {
private Map<String, ReportBuilderType> createReportsForTask(Long sessionId, Collection<List<CSVReportBuilder<?, ?>>> buildersForTask) {
Map<String, ReportBuilderType> outFilenames = new HashMap<>();
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);
for (List<CSVReportBuilder<?, ?>> builders : buildersForTask) {
for (CSVReportBuilder<?, ?> builder : builders) {
if (builder.getParamsClass() == 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) {
} else if (builder.getParamsClass() == SessionIdParam.class && sessionId != null) {
SessionIdParam sessionIdParam = new SessionIdParam();
sessionIdParam.setSessionId(sessionId);
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);
File outFile = ((CSVReportBuilder<SessionIdParam, ?>) builder).createReport(sessionIdParam, outFolder);
if (outFile == null) {
log.warn("Something wrong, report type: {}", builder.getReportType().getKey());
cntErrors++;

View file

@ -1,211 +0,0 @@
package ru.spcex.clearing.reports.services;
import com.opencsv.CSVParser;
import com.opencsv.CSVParserBuilder;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import com.opencsv.exceptions.CsvValidationException;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.STrades;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.clearing.platform.dictionary.RegistryCodeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.config.BeanConfiguration;
import ru.spcex.clearing.reports.config.ReportBuildersConfig;
import ru.spcex.clearing.reports.config.TestConfig;
import ru.spcex.clearing.reports.config.validation.ValidationConfig;
import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.clearing.reports.reports.bp.UnfulfilledDealReportBuilder_;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.Allowed;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
BeanConfiguration.class,
ValidationConfig.class,
ReportService.class,
ImdgTestConfig.class,
KafkaTestConfig.class,
ReportBuildersConfig.class,
TestConfig.class
})
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class PrototypeTest {
private static File outFolder;
private Imdg<Registry> registryImdg;
private Imdg<Company> companyImdg;
private Imdg<RegistryCodeDictionary> registryCodeDictionaryImdg;
private Imdg<ExecutionDeposit> executionDepositImdg;
private Imdg<ExecutionFond> executionFondImdg;
private Imdg<Session> sessionImdg;
private Imdg<CompanySymbols> companySymbolsImdg;
private Imdg<ProfileDocument> profileDocumentImdg;
private Long COMPANY_ID;
private Imdg<Listing> listingImdg;
private Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private Imdg<PaymentInstruction> paymentInstructionImdg;
private Imdg<Statement> statementImdg;
private Imdg<STrades> sTradeImdg;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider imdgProvider;
@Autowired
private UnfulfilledDealReportBuilder_ reportBuilder;
@BeforeAll
public static void createTestFolder() {
outFolder = new File("out");
outFolder.mkdir();
}
@AfterAll
public static void deleteTestFolder() throws IOException {
FileUtils.deleteDirectory(outFolder);
}
@Test
@Order(1)
public void test() throws IOException, CsvValidationException {
clearTestDir();
Company company = new Company();
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
Long id = companyImdg.insert(company);
Session session = new Session();
Long sessionId = sessionImdg.insert(session);
ExecutionFond executionFond = new ExecutionFond();
executionFond.setSessionId(sessionId);
executionFond.setCompanyId(id);
executionFond.setCoverageStatus(Allowed.DENIED.getKey());
executionFond.setSettlementCode("SETCODE");
executionFond.setSide(Side.SELL.getKey());
STrades sTrades = new STrades();
sTrades.setSettleCode("SETCODE");
sTrades.setOperation(Side.SELL.getKey());
sTrades.setClassCode("test-class-code");
sTradeImdg.insert(sTrades);
executionFond.setSecurityId(3007L);
executionFond.setExchangeExecutionId(777L);
executionFond.setTradingDate(LocalDate.of(2023, 6, 20));
executionFondImdg.insert(executionFond);
SessionIdParam sessionIdParam = new SessionIdParam();
sessionIdParam.setSessionId(sessionId);
File outFile = reportBuilder.createReport(sessionIdParam, outFolder);
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/unfulfilled_deal_report_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Collections.emptyList());
}
private void compareCSVFiles(File expectedFile, File actualFile, List<String> columnsForSkip) throws IOException, CsvValidationException {
if (columnsForSkip == null) columnsForSkip = Collections.emptyList();
CSVParser csvParser = new CSVParserBuilder().withSeparator(',').withQuoteChar('\"').build();
CSVReader expectedCSVReader = new CSVReaderBuilder(new FileReader(expectedFile)).withCSVParser(csvParser).build();
CSVReader actualCSVReader = new CSVReaderBuilder(new FileReader(actualFile)).withCSVParser(csvParser).build();
Map<String, Integer> expectedValueForColumn = new HashMap<>();
Map<String, Integer> actualValueForColumn = new HashMap<>();
String[] expectedHeaders = expectedCSVReader.readNext();
String[] actualHeaders = actualCSVReader.readNext();
assertEquals(expectedHeaders.length, actualHeaders.length);
for (int headerIdx = 0; headerIdx < expectedHeaders.length; headerIdx++) {
String expectedHeader = expectedHeaders[headerIdx];
String actualHeader = actualHeaders[headerIdx];
if (!columnsForSkip.contains(expectedHeader)) expectedValueForColumn.put(expectedHeader, headerIdx);
if (!columnsForSkip.contains(actualHeader)) actualValueForColumn.put(actualHeader, headerIdx);
}
do {
String[] expectedLines = expectedCSVReader.readNext();
String[] actualLines = actualCSVReader.readNext();
if (expectedLines == null || actualLines == null) {
if (expectedLines == null && actualLines == null) {
break;
}
Assertions.fail("expected and actual lines not equal");
}
for (String expectedHeader : expectedValueForColumn.keySet()) {
int expectedIdx = expectedValueForColumn.get(expectedHeader);
int actualIdx = actualValueForColumn.get(expectedHeader);
String expected = expectedLines[expectedIdx];
String actual = actualLines[actualIdx];
assertEquals(expected, actual, expectedHeader);
}
} while (true);
expectedCSVReader.close();
actualCSVReader.close();
}
@PostConstruct
private void init() {
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
registryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
Company company = new Company();
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
company.setTradingCode("TRADING_CODE");
COMPANY_ID = companyImdg.insert(company);
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
}
private void clearTestDir() throws IOException {
FileUtils.deleteDirectory(outFolder);
outFolder.mkdir();
}
}

View file

@ -26,10 +26,7 @@ import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithPeriod;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionIdList;
import ru.spcex.clearing.reports.config.BeanConfiguration;
import ru.spcex.clearing.reports.config.ReportBuildersConfig;
import ru.spcex.clearing.reports.config.TestConfig;
@ -176,193 +173,6 @@ public class ReportServiceTest_BP {
@Test
@Order(1)
public void createReportTest_OPERATIONAL_LIABILITIES_CLAIMS() throws IOException, CsvValidationException {
clearTestDir();
final Long oldSessionIdDeposit = testExecutionDeposit.getSessionId();
final Long oldSessionIdFond = testExecutionFond.getSessionId();
ReportRequestWithSessionId reportRequestWithSessionId = new ReportRequestWithSessionId();
reportRequestWithSessionId.setReportId(ReportBuilderType.OPERATIONAL_LIABILITIES_CLAIMS.getKey());
reportRequestWithSessionId.setSessionId(TEST_SESSION_ID_1);
testExecutionDeposit.setSessionId(TEST_SESSION_ID_1);
testExecutionFond.setSessionId(TEST_SESSION_ID_1);
executionDepositImdg.update(testExecutionDeposit);
executionFondImdg.update(testExecutionFond);
String jsonString = TestUtils.getJsonStringForSystem(reportRequestWithSessionId, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
Consts.CREATE_REPORT_FOR_SESSION_ID,
reportRequestWithSessionIdCnt++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/operational_liabilities_claims_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date"));
testExecutionDeposit.setSessionId(oldSessionIdDeposit);
testExecutionFond.setSessionId(oldSessionIdFond);
executionDepositImdg.update(testExecutionDeposit);
executionFondImdg.update(testExecutionFond);
outFile.delete();
}
@Test
@Order(2)
public void createReportTest_PERIOD_LIABILITIES_CLAIMS() throws CsvValidationException, IOException {
clearTestDir();
ReportRequestWithSessionIdList reportRequestWithPeriod = new ReportRequestWithSessionIdList();
reportRequestWithPeriod.setReportId(ReportBuilderType.PERIOD_LIABILITIES_CLAIMS.getKey());
reportRequestWithPeriod.setSessionIdList(Arrays.asList(testExecutionDeposit.getSessionId(), testExecutionFond.getSessionId()));
String jsonString = TestUtils.getJsonStringForSystem(reportRequestWithPeriod, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
Consts.CREATE_REPORT_FOR_SESSION_ID_LIST,
reportRequestWithSessionIdListCnt++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/period_liabilities_claims_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date"));
outFile.delete();
}
@Test
@Order(3)
public void createReportTest_SUMMARY_LIABILITIES_CLAIMS() throws CsvValidationException, IOException {
clearTestDir();
ReportRequest reportRequest = new ReportRequest();
reportRequest.setReportId(ReportBuilderType.SUMMARY_LIABILITIES_CLAIMS.getKey());
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
Consts.CREATE_REPORT,
reportRequestCnt++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/summary_liabilities_claims_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date"));
outFile.delete();
}
@Test
@Order(4)
public void createReportTest_OPERATIONAL_MONEY_CHANGE() throws CsvValidationException, IOException {
clearTestDir();
final Long oldRegistrySessionId_1 = testRegistry_1.getSessionId();
final Long oldRegistrySessionId_2 = testRegistry_2.getSessionId();
testRegistry_1.setSessionId(TEST_SESSION_ID_3);
testRegistry_2.setSessionId(TEST_SESSION_ID_3);
registryImdg.update(testRegistry_1);
registryImdg.update(testRegistry_2);
ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId();
reportRequest.setReportId(ReportBuilderType.OPERATIONAL_MONEY_CHANGE.getKey());
reportRequest.setSessionId(TEST_SESSION_ID_3);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
Consts.CREATE_REPORT_FOR_SESSION_ID,
reportRequestWithSessionIdCnt++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/operational_money_change_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time"));
testRegistry_1.setSessionId(oldRegistrySessionId_1);
testRegistry_2.setSessionId(oldRegistrySessionId_2);
registryImdg.update(testRegistry_1);
registryImdg.update(testRegistry_2);
outFile.delete();
}
@Test
@Order(5)
public void createReportTest_PERIOD_MONEY_CHANGE() throws CsvValidationException, IOException {
clearTestDir();
ReportRequestWithPeriod reportRequest = new ReportRequestWithPeriod();
reportRequest.setReportId(ReportBuilderType.PERIOD_MONEY_CHANGE.getKey());
reportRequest.setStartDate(TEST_START_CLEARING_DATE);
reportRequest.setEndDate(TEST_END_CLEARING_DATE);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
Consts.CREATE_REPORT_FOR_PERIOD,
reportRequestWithPeriodCnt++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/period_money_change_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time"));
outFile.delete();
}
@Test
@Order(6)
public void createReportTest_SUMMARY_MONEY_CHANGE() throws CsvValidationException, IOException {
clearTestDir();
ReportRequest reportRequest = new ReportRequest();
reportRequest.setReportId(ReportBuilderType.SUMMARY_MONEY_CHANGE.getKey());
TestUtils.clearAllInImdg(registryImdg);
registryImdg.insert(testRegistry_1);
registryImdg.insert(testRegistry_2);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(),
Consts.CREATE_REPORT,
reportRequestCnt++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/summary_money_change_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time"));
registryImdg.insert(testRegistryForCompanyId_1);
registryImdg.insert(testRegistryForCompanyId_2);
registryImdg.insert(tm_tRegistry_1);
registryImdg.insert(om_tRegistry_1);
registryImdg.insert(ts_tRegistry_1);
registryImdg.insert(os_tRegistry_1);
registryImdg.insert(tm_tRegistry_2);
registryImdg.insert(om_tRegistry_2);
registryImdg.insert(ts_tRegistry_2);
registryImdg.insert(os_tRegistry_2);
registryImdg.insert(testRegistry_1);
registryImdg.insert(testRegistry_2);
outFile.delete();
}
@Test
@Order(7)
public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_1() throws CsvValidationException, IOException {
clearTestDir();
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile());
@ -397,7 +207,7 @@ public class ReportServiceTest_BP {
File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_1"))[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_1_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate"));
compareCSVFiles(expectedFile, outFile, Arrays.asList("TRADEDATE", "TRADETIME", "SETTLEDATE"));
for (File file : outFolder.listFiles()) {
if (!outFile.getName().equalsIgnoreCase(file.getName())) {
@ -414,7 +224,7 @@ public class ReportServiceTest_BP {
}
@Test
@Order(8)
@Order(2)
public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_2() throws CsvValidationException, IOException {
clearTestDir();
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile());
@ -449,7 +259,7 @@ public class ReportServiceTest_BP {
File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_2"))[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_2_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate"));
compareCSVFiles(expectedFile, outFile, Arrays.asList("TRADEDATE", "TRADETIME", "SETTLEDATE"));
for (File file : outFolder.listFiles()) {
if (!outFile.getName().equalsIgnoreCase(file.getName())) {
@ -466,7 +276,7 @@ public class ReportServiceTest_BP {
}
@Test
@Order(9)
@Order(3)
public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_3() throws CsvValidationException, IOException {
clearTestDir();
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile());
@ -498,7 +308,7 @@ public class ReportServiceTest_BP {
File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_3"))[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_3_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate"));
compareCSVFiles(expectedFile, outFile, Arrays.asList("TRADEDATE", "TRADETIME", "SETTLEDATE"));
for (File file : outFolder.listFiles()) {
if (!outFile.getName().equalsIgnoreCase(file.getName())) {
@ -515,7 +325,7 @@ public class ReportServiceTest_BP {
}
@Test
@Order(10)
@Order(4)
public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_4() throws CsvValidationException, IOException {
clearTestDir();
File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile());
@ -548,7 +358,7 @@ public class ReportServiceTest_BP {
File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_4"))[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_4_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate"));
compareCSVFiles(expectedFile, outFile, Arrays.asList("TRADEDATE", "TRADETIME", "SETTLEDATE"));
for (File file : outFolder.listFiles()) {
if (!outFile.getName().equalsIgnoreCase(file.getName())) {
@ -565,7 +375,7 @@ public class ReportServiceTest_BP {
}
@Test
@Order(11)
@Order(5)
public void createReportTest_UNFULFILLED_DEAL_REPORT() throws IOException, CsvValidationException {
clearTestDir();
@ -598,7 +408,7 @@ public class ReportServiceTest_BP {
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/unfulfilled_deal_report_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate"));
compareCSVFiles(expectedFile, outFile, Arrays.asList("TRADEDATE"));
testExecutionFond.setSessionId(oldExecutionFondSessionId);
testExecutionFond.setCoverageStatus(oldExecutionFondCoverageStatus);

View file

@ -18,15 +18,9 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.STrades;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.clearing.platform.dictionary.RegistryCodeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -85,12 +79,6 @@ public class ReportServiceTest_KS {
private Imdg<ProfileDocument> profileDocumentImdg;
private Long COMPANY_ID;
private Imdg<Listing> listingImdg;
private Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private Imdg<PaymentInstruction> paymentInstructionImdg;
private Imdg<Statement> statementImdg;
private Imdg<STrades> sTradeImdg;
@Autowired
private ReportService reportService;
@Autowired

View file

@ -1,2 +1,2 @@
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
"test-security-symbol-1","777","20.06.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777"
"SECURITYID","TRADENO","TRADEDATE","TRADETIME","SETTLEDATE","SETTLECODE","PRICE","QUANTITY","VALUE"
"test-security-symbol-1","777","27.06.2023","25.08.1994T01:22:57","07.07.2023","test-settle-code","1000.00","7777.00","7777777.00"

1 securityId SECURITYID tradeNo TRADENO tradeDate TRADEDATE tradeTime TRADETIME settleDate SETTLEDATE settleCode SETTLECODE price PRICE quanity QUANTITY value VALUE
2 test-security-symbol-1 test-security-symbol-1 777 777 20.06.2023 27.06.2023 25.08.1994 25.08.1994T01:22:57 30.06.2023 07.07.2023 test-settle-code test-settle-code 1000 1000.00 7777 7777.00 7777777 7777777.00

View file

@ -1,2 +1,2 @@
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
"test-security-symbol-1","777","30.06.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777"
"SECURITYID","TRADENO","TRADEDATE","TRADETIME","SETTLEDATE","SETTLECODE","PRICE","QUANTITY","VALUE"
"test-security-symbol-1","777","07.07.2023","25.08.1994T01:22:57","07.07.2023","test-settle-code","1000.00","7777.00","7777777.00"

1 securityId SECURITYID tradeNo TRADENO tradeDate TRADEDATE tradeTime TRADETIME settleDate SETTLEDATE settleCode SETTLECODE price PRICE quanity QUANTITY value VALUE
2 test-security-symbol-1 test-security-symbol-1 777 777 30.06.2023 07.07.2023 25.08.1994 25.08.1994T01:22:57 30.06.2023 07.07.2023 test-settle-code test-settle-code 1000 1000.00 7777 7777.00 7777777 7777777.00

View file

@ -1,2 +1,2 @@
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
"test-security-symbol-1","777","10.07.2023","25.08.1994","10.07.2023","test-settle-code","1000","7777","7777777"
"SECURITYID","TRADENO","TRADEDATE","TRADETIME","SETTLEDATE","SETTLECODE","PRICE","QUANTITY","VALUE"
"test-security-symbol-1","777","17.07.2023","25.08.1994T01:22:57","17.07.2023","test-settle-code","1000.00","7777.00","7777777.00"

1 securityId SECURITYID tradeNo TRADENO tradeDate TRADEDATE tradeTime TRADETIME settleDate SETTLEDATE settleCode SETTLECODE price PRICE quanity QUANTITY value VALUE
2 test-security-symbol-1 test-security-symbol-1 777 777 10.07.2023 17.07.2023 25.08.1994 25.08.1994T01:22:57 10.07.2023 17.07.2023 test-settle-code test-settle-code 1000 1000.00 7777 7777.00 7777777 7777777.00

View file

@ -1,2 +1,2 @@
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
"test-security-symbol-1","777","10.07.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777"
"SECURITYID","TRADENO","TRADEDATE","TRADETIME","SETTLEDATE","SETTLECODE","PRICE","QUANTITY","VALUE"
"test-security-symbol-1","777","17.07.2023","25.08.1994T01:22:57","07.07.2023","test-settle-code","1000.00","7777.00","7777777.00"

1 securityId SECURITYID tradeNo TRADENO tradeDate TRADEDATE tradeTime TRADETIME settleDate SETTLEDATE settleCode SETTLECODE price PRICE quanity QUANTITY value VALUE
2 test-security-symbol-1 test-security-symbol-1 777 777 10.07.2023 17.07.2023 25.08.1994 25.08.1994T01:22:57 30.06.2023 07.07.2023 test-settle-code test-settle-code 1000 1000.00 7777 7777.00 7777777 7777777.00

View file

@ -1 +1 @@
securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value
"SECURITYID","TRADENO","TRADEDATE","TRADETIME","SETTLEDATE","SETTLECODE","PRICE","QUANITY","VALUE"

1 securityId SECURITYID tradeNo TRADENO tradeDate TRADEDATE tradeTime TRADETIME settleDate SETTLEDATE settleCode SETTLECODE price PRICE quanity QUANITY value VALUE

View file

@ -1,3 +0,0 @@
id,doc_date,doc_time,doc_name,doc_type,clearingHouse,firmId,firName,session_id,clearing_date,clearing_time,trdAccId,account,depo_account,currency,tr_id,securityId,tr_buySell,tr_date,tr_execDate,exec_status,repaym_date,tr_price,nominal,lot_value,tr_lot,tr_quantity,tr_value,tr_accruedint,accruedint,tr_clrComm,tr_exhComm,cash_liability,depo_liability,cash_netto,depo_netto
"0","16.05.2023","20:45:22","Отчет об обязательствах/требованиях Участника клиринга","KS_FIRMID_LIABILITIES","COMPANY_HOUSE","1007","test-company-fullname-1","10007","16.04.2023","16.04.2023","test-trading-clearing-registry-1","11","13","test-settlement-currency-1","777","3007","S","06.05.2023","24.04.2023","","","1000","333","12","777","7777","7777777","3333","0","","","7777777","7777","777","888"
"1","16.05.2023","20:45:25","Отчет об обязательствах/требованиях Участника клиринга","KS_FIRMID_LIABILITIES","COMPANY_HOUSE","1008","test-company-fullname-2","10007","06.04.2023","06.04.2023","test-trading-clearing-registry-2","12","14","test-settlement-currency-2","888","3008","B","26.04.2023","14.05.2023","Y","14.05.2023","88","","34","888","","1","","","","","1","","777","888"
1 id doc_date doc_time doc_name doc_type clearingHouse firmId firName session_id clearing_date clearing_time trdAccId account depo_account currency tr_id securityId tr_buySell tr_date tr_execDate exec_status repaym_date tr_price nominal lot_value tr_lot tr_quantity tr_value tr_accruedint accruedint tr_clrComm tr_exhComm cash_liability depo_liability cash_netto depo_netto
2 0 16.05.2023 20:45:22 Отчет об обязательствах/требованиях Участника клиринга KS_FIRMID_LIABILITIES COMPANY_HOUSE 1007 test-company-fullname-1 10007 16.04.2023 16.04.2023 test-trading-clearing-registry-1 11 13 test-settlement-currency-1 777 3007 S 06.05.2023 24.04.2023 1000 333 12 777 7777 7777777 3333 0 7777777 7777 777 888
3 1 16.05.2023 20:45:25 Отчет об обязательствах/требованиях Участника клиринга KS_FIRMID_LIABILITIES COMPANY_HOUSE 1008 test-company-fullname-2 10007 06.04.2023 06.04.2023 test-trading-clearing-registry-2 12 14 test-settlement-currency-2 888 3008 B 26.04.2023 14.05.2023 Y 14.05.2023 88 34 888 1 1 777 888

View file

@ -1,3 +0,0 @@
id,doc_date,doc_time,doc_name,doc_type,clearingHouse,firmId,firName,trdAccId,account,currency,registry_code,registry_name,open_balance,change_balance,add_withdraw,close_balance,remarks,add_sum,add_time,withdraw_sum,withdraw_time
"0","17.05.2023","12:10:51","Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга","KS_FIRMID_ASSETS","COMPANY_HOUSE","1007","test-company-fullname-1","test-trading-clearing-registry-1","11","test-trading-currency-1","999","CM","3","777","700000","780","","777777","17.05.2023T12:10:50","77777","17.05.2023T12:10:50"
"1","17.05.2023","12:10:51","Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга","KS_FIRMID_ASSETS","COMPANY_HOUSE","1008","test-company-fullname-2","test-trading-clearing-registry-2","12","test-trading-currency-2","666","CM","2","888","900000","890","","999999","17.05.2023T12:10:50","99999","17.05.2023T12:10:50"
1 id doc_date doc_time doc_name doc_type clearingHouse firmId firName trdAccId account currency registry_code registry_name open_balance change_balance add_withdraw close_balance remarks add_sum add_time withdraw_sum withdraw_time
2 0 17.05.2023 12:10:51 Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга KS_FIRMID_ASSETS COMPANY_HOUSE 1007 test-company-fullname-1 test-trading-clearing-registry-1 11 test-trading-currency-1 999 CM 3 777 700000 780 777777 17.05.2023T12:10:50 77777 17.05.2023T12:10:50
3 1 17.05.2023 12:10:51 Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга KS_FIRMID_ASSETS COMPANY_HOUSE 1008 test-company-fullname-2 test-trading-clearing-registry-2 12 test-trading-currency-2 666 CM 2 888 900000 890 999999 17.05.2023T12:10:50 99999 17.05.2023T12:10:50

View file

@ -1,3 +0,0 @@
id,doc_date,doc_time,doc_name,doc_type,clearingHouse,firmId,firName,session_id,clearing_date,clearing_time,trdAccId,account,depo_account,currency,tr_id,securityId,tr_buySell,tr_date,tr_execDate,exec_status,repaym_date,tr_price,nominal,lot_value,tr_lot,tr_quantity,tr_value,tr_accruedint,accruedint,tr_clrComm,tr_exhComm,cash_liability,depo_liability,cash_netto,depo_netto
"0","17.05.2023","10:51:13","Отчет об обязательствах/требованиях Участника клиринга","KS_FIRMID_LIABILITIES","COMPANY_HOUSE","1007","test-company-fullname-1","10007","17.04.2023","17.04.2023","test-trading-clearing-registry-1","11","13","test-settlement-currency-1","777","3007","S","07.05.2023","25.04.2023","","","1000","333","12","777","7777","7777777","3333","0","","","7777777","7777","777","888"
"1","17.05.2023","10:51:13","Отчет об обязательствах/требованиях Участника клиринга","KS_FIRMID_LIABILITIES","COMPANY_HOUSE","1008","test-company-fullname-2","10008","07.04.2023","07.04.2023","test-trading-clearing-registry-2","12","14","test-settlement-currency-2","888","3008","B","27.04.2023","15.05.2023","Y","15.05.2023","88","","34","888","","1","","","","","1","","777","888"
1 id doc_date doc_time doc_name doc_type clearingHouse firmId firName session_id clearing_date clearing_time trdAccId account depo_account currency tr_id securityId tr_buySell tr_date tr_execDate exec_status repaym_date tr_price nominal lot_value tr_lot tr_quantity tr_value tr_accruedint accruedint tr_clrComm tr_exhComm cash_liability depo_liability cash_netto depo_netto
2 0 17.05.2023 10:51:13 Отчет об обязательствах/требованиях Участника клиринга KS_FIRMID_LIABILITIES COMPANY_HOUSE 1007 test-company-fullname-1 10007 17.04.2023 17.04.2023 test-trading-clearing-registry-1 11 13 test-settlement-currency-1 777 3007 S 07.05.2023 25.04.2023 1000 333 12 777 7777 7777777 3333 0 7777777 7777 777 888
3 1 17.05.2023 10:51:13 Отчет об обязательствах/требованиях Участника клиринга KS_FIRMID_LIABILITIES COMPANY_HOUSE 1008 test-company-fullname-2 10008 07.04.2023 07.04.2023 test-trading-clearing-registry-2 12 14 test-settlement-currency-2 888 3008 B 27.04.2023 15.05.2023 Y 15.05.2023 88 34 888 1 1 777 888

View file

@ -1,3 +0,0 @@
id,doc_date,doc_time,doc_name,doc_type,clearingHouse,firmId,firName,trdAccId,account,currency,registry_code,registry_name,open_balance,change_balance,add_withdraw,close_balance,remarks,add_sum,add_time,withdraw_sum,withdraw_time
"0","17.05.2023","12:18:01","Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга","KS_FIRMID_ASSETS","COMPANY_HOUSE","1007","test-company-fullname-1","test-trading-clearing-registry-1","11","test-trading-currency-1","999","CM","3","777","700000","780","","777777","17.05.2023T12:18:01","77777","17.05.2023T12:18:01"
"1","17.05.2023","12:18:01","Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга","KS_FIRMID_ASSETS","COMPANY_HOUSE","1008","test-company-fullname-2","test-trading-clearing-registry-2","12","test-trading-currency-2","666","CM","2","888","900000","890","","999999","17.05.2023T12:18:01","99999","17.05.2023T12:18:01"
1 id doc_date doc_time doc_name doc_type clearingHouse firmId firName trdAccId account currency registry_code registry_name open_balance change_balance add_withdraw close_balance remarks add_sum add_time withdraw_sum withdraw_time
2 0 17.05.2023 12:18:01 Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга KS_FIRMID_ASSETS COMPANY_HOUSE 1007 test-company-fullname-1 test-trading-clearing-registry-1 11 test-trading-currency-1 999 CM 3 777 700000 780 777777 17.05.2023T12:18:01 77777 17.05.2023T12:18:01
3 1 17.05.2023 12:18:01 Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга KS_FIRMID_ASSETS COMPANY_HOUSE 1008 test-company-fullname-2 test-trading-clearing-registry-2 12 test-trading-currency-2 666 CM 2 888 900000 890 999999 17.05.2023T12:18:01 99999 17.05.2023T12:18:01

View file

@ -1,3 +0,0 @@
id,doc_date,doc_time,doc_name,doc_type,clearingHouse,firmId,firName,session_id,clearing_date,clearing_time,trdAccId,account,depo_account,currency,tr_id,securityId,tr_buySell,tr_date,tr_execDate,exec_status,repaym_date,tr_price,nominal,lot_value,tr_lot,tr_quantity,tr_value,tr_accruedint,accruedint,tr_clrComm,tr_exhComm,cash_liability,depo_liability,cash_netto,depo_netto
0,"17.05.2023","10:58:08","Отчет об обязательствах/требованиях Участника клиринга","KS_FIRMID_LIABILITIES","COMPANY_HOUSE","1007","test-company-fullname-1","10007","17.04.2023","17.04.2023","test-trading-clearing-registry-1","11","13","test-settlement-currency-1","777","3007","S","07.05.2023","25.04.2023","","","1000","333","12","777","7777","7777777","3333","0","","","7777777","7777","777","888"
1,"17.05.2023","10:58:08","Отчет об обязательствах/требованиях Участника клиринга","KS_FIRMID_LIABILITIES","COMPANY_HOUSE","1008","test-company-fullname-2","10008","07.04.2023","07.04.2023","test-trading-clearing-registry-2","12","14","test-settlement-currency-2","888","3008","B","27.04.2023","15.05.2023",Y,"15.05.2023","88","","34","888","","1","","","","","1","","777","888"
1 id doc_date doc_time doc_name doc_type clearingHouse firmId firName session_id clearing_date clearing_time trdAccId account depo_account currency tr_id securityId tr_buySell tr_date tr_execDate exec_status repaym_date tr_price nominal lot_value tr_lot tr_quantity tr_value tr_accruedint accruedint tr_clrComm tr_exhComm cash_liability depo_liability cash_netto depo_netto
2 0 17.05.2023 10:58:08 Отчет об обязательствах/требованиях Участника клиринга KS_FIRMID_LIABILITIES COMPANY_HOUSE 1007 test-company-fullname-1 10007 17.04.2023 17.04.2023 test-trading-clearing-registry-1 11 13 test-settlement-currency-1 777 3007 S 07.05.2023 25.04.2023 1000 333 12 777 7777 7777777 3333 0 7777777 7777 777 888
3 1 17.05.2023 10:58:08 Отчет об обязательствах/требованиях Участника клиринга KS_FIRMID_LIABILITIES COMPANY_HOUSE 1008 test-company-fullname-2 10008 07.04.2023 07.04.2023 test-trading-clearing-registry-2 12 14 test-settlement-currency-2 888 3008 B 27.04.2023 15.05.2023 Y 15.05.2023 88 34 888 1 1 777 888

View file

@ -1,3 +0,0 @@
id,doc_date,doc_time,doc_name,doc_type,clearingHouse,firmId,firName,trdAccId,account,currency,registry_code,registry_name,open_balance,change_balance,add_withdraw,close_balance,remarks,add_sum,add_time,withdraw_sum,withdraw_time
"0","17.05.2023","12:25:42","Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга","KS_FIRMID_ASSETS","COMPANY_HOUSE","1007","test-company-fullname-1","test-trading-clearing-registry-1","11","test-trading-currency-1","999","CM","3","777","700000","780","","777777","17.05.2023T12:25:42","77777","17.05.2023T12:25:42"
"1","17.05.2023","12:25:42","Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга","KS_FIRMID_ASSETS","COMPANY_HOUSE","1008","test-company-fullname-2","test-trading-clearing-registry-2","12","test-trading-currency-2","666","CM","2","888","900000","890","","999999","17.05.2023T12:25:42","99999","17.05.2023T12:25:42"
1 id doc_date doc_time doc_name doc_type clearingHouse firmId firName trdAccId account currency registry_code registry_name open_balance change_balance add_withdraw close_balance remarks add_sum add_time withdraw_sum withdraw_time
2 0 17.05.2023 12:25:42 Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга KS_FIRMID_ASSETS COMPANY_HOUSE 1007 test-company-fullname-1 test-trading-clearing-registry-1 11 test-trading-currency-1 999 CM 3 777 700000 780 777777 17.05.2023T12:25:42 77777 17.05.2023T12:25:42
3 1 17.05.2023 12:25:42 Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга KS_FIRMID_ASSETS COMPANY_HOUSE 1008 test-company-fullname-2 test-trading-clearing-registry-2 12 test-trading-currency-2 666 CM 2 888 900000 890 999999 17.05.2023T12:25:42 99999 17.05.2023T12:25:42

View file

@ -1,2 +1,2 @@
FIRMID,SESSION_ID,SESSION_DATE,ACCOUNT,VALUE,DATE
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","22,22","30.06.2023"
"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","VALUE","DATE"
"TRADING_CODE","2","19.01.1970T23:49:58","ACCOUNT","22.22","07.07.2023"

1 FIRMID SESSION_ID SESSION_DATE ACCOUNT VALUE DATE
2 TRADING_CODE 2 20.01.1970T02:49:58 19.01.1970T23:49:58 ACCOUNT 22,22 22.22 30.06.2023 07.07.2023

View file

@ -1,2 +1,2 @@
FIRMID,ACCOUNT,DATE,REGISTER_CODE,REGISTER_NAME,OPEN_BALANCE,CHANGE_BALANCE,ADD_WITHDRAW,CLOSE_BALANCE,REMARKS
"TRADING_CODE","ACCOUNT","30.06.2023","AM_T","AM_T_NAME","77,78","66,67","66,67","11,11",""
"FIRMID","ACCOUNT","DATE","REGISTER_CODE","REGISTER_NAME","OPEN_BALANCE","CHANGE_BALANCE","ADD_WITHDRAW","CLOSE_BALANCE","REMARKS"
"TRADING_CODE","ACCOUNT","07.07.2023","AM_T","AM_T_NAME","77.78","66.67","66.67","11.11",""

1 FIRMID ACCOUNT DATE REGISTER_CODE REGISTER_NAME OPEN_BALANCE CHANGE_BALANCE ADD_WITHDRAW CLOSE_BALANCE REMARKS
2 TRADING_CODE ACCOUNT 30.06.2023 07.07.2023 AM_T AM_T_NAME 77,78 77.78 66,67 66.67 66,67 66.67 11,11 11.11

View file

@ -1,3 +1,3 @@
FIRMID,ACCOUNT,REGISTER_CODE,ADD_SUM,ADD_TIME,ADD_DATE
"TRADING_CODE","ACCOUNT","AM__","44,44","","04.07.2023"
"TRADING_CODE","ACCOUNT","AM__","-22,22","","04.07.2023"
"FIRMID","ACCOUNT","REGISTER_CODE","ADD_SUM","ADD_TIME","ADD_DATE"
"TRADING_CODE","ACCOUNT","AM__","44.44","","2023-07-07"
"TRADING_CODE","ACCOUNT","AM__","-22.22","","2023-07-07"

1 FIRMID ACCOUNT REGISTER_CODE ADD_SUM ADD_TIME ADD_DATE
2 TRADING_CODE ACCOUNT AM__ 44,44 44.44 04.07.2023 2023-07-07
3 TRADING_CODE ACCOUNT AM__ -22,22 -22.22 04.07.2023 2023-07-07

View file

@ -1,2 +1,2 @@
FIRMID,SESSION_ID,SESSION_DATE,ACCOUNT,SECURITYID,VALUE,DATE
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","SECURITY_SYMBOL","22,22","30.06.2023"
"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","SECURITYID","VALUE","DATE"
"TRADING_CODE","2","19.01.1970T23:49:58","ACCOUNT","SECURITY_SYMBOL","22.22","07.07.2023"

1 FIRMID SESSION_ID SESSION_DATE ACCOUNT SECURITYID VALUE DATE
2 TRADING_CODE 2 20.01.1970T02:49:58 19.01.1970T23:49:58 ACCOUNT SECURITY_SYMBOL 22,22 22.22 30.06.2023 07.07.2023

View file

@ -1,2 +1,2 @@
FIRMID,ACCOUNT,DATE,SECURITYID,REGISTER_CODE,REGISTER_NAME,OPEN_QUANTITY,CHANGE_QUANTITY,ADD_WITHDRAW_DEPO,CLOSE_QUANTITY,REMARKS
"TRADING_CODE","ACCOUNT","30.06.2023","","AS_T","AS_T_NAME","77.777777777","66.66666668","66.66666668","11.11111111",""
"FIRMID","ACCOUNT","DATE","SECURITYID","REGISTER_CODE","REGISTER_NAME","OPEN_QUANTITY","CHANGE_QUANTITY","ADD_WITHDRAW_DEPO","CLOSE_QUANTITY","REMARKS"
"TRADING_CODE","ACCOUNT","07.07.2023","","AS_T","AS_T_NAME","77.78","66.67","66.67","11.11",""

1 FIRMID ACCOUNT DATE SECURITYID REGISTER_CODE REGISTER_NAME OPEN_QUANTITY CHANGE_QUANTITY ADD_WITHDRAW_DEPO CLOSE_QUANTITY REMARKS
2 TRADING_CODE ACCOUNT 30.06.2023 07.07.2023 AS_T AS_T_NAME 77.777777777 77.78 66.66666668 66.67 66.66666668 66.67 11.11111111 11.11

View file

@ -1,3 +1,3 @@
FIRMID,ACCOUNT,SECURITYID,REGISTER_CODE,ADD_QUANTITY,ADD_TIME,ADD_DATE
"TRADING_CODE","ACCOUNT","SECURITY_SYMBOL","AS__","44,44","","04.07.2023"
"TRADING_CODE","ACCOUNT","SECURITY_SYMBOL","AS__","-22,22","","04.07.2023"
"FIRMID","ACCOUNT","SECURITYID","REGISTER_CODE","ADD_QUANTITY","ADD_TIME","ADD_DATE"
"TRADING_CODE","ACCOUNT","SECURITY_SYMBOL","AS__","44.44","","07.07.2023"
"TRADING_CODE","ACCOUNT","SECURITY_SYMBOL","AS__","-22.22","","07.07.2023"

1 FIRMID ACCOUNT SECURITYID REGISTER_CODE ADD_QUANTITY ADD_TIME ADD_DATE
2 TRADING_CODE ACCOUNT SECURITY_SYMBOL AS__ 44,44 44.44 04.07.2023 07.07.2023
3 TRADING_CODE ACCOUNT SECURITY_SYMBOL AS__ -22,22 -22.22 04.07.2023 07.07.2023

View file

@ -1,2 +1,2 @@
FIRMID,PART_INN,PART_KPP,AGREEMENT_NUMBER,AGREEMENT_DATE,AGREEMENT_NAME,FIRM_NAME
"FIRMID","PART_INN","PART_KPP","AGREEMENT_NUMBER","AGREEMENT_DATE","AGREEMENT_NAME","FIRM_NAME"
"TRADING_CODE","INN___","CPP____","NUMBER","01.01.1999","NAME","FULL_NAME"

1 FIRMID PART_INN PART_KPP AGREEMENT_NUMBER AGREEMENT_DATE AGREEMENT_NAME FIRM_NAME
2 TRADING_CODE INN___ CPP____ NUMBER 01.01.1999 NAME FULL_NAME

View file

@ -1,3 +1,3 @@
SESSION_ID,SESSION_DATE,TR_ID,FIRM_ID,TKR,CASH_LIABILITY,DEPO_LIABILITY,TRADE_NUM,CLASS_CODE,TRADE_DATE,STATUS
"3","20.01.1970T07:09:07","6","TRADING_CODE","666","8888,89","","222","","20.01.1970T02:49:58","3"
"2","20.01.1970T15:54:43","4","TRADING_CODE","666","8888,89","123.456789","222","","20.01.1970T02:49:58","1"
"SESSION_ID","SESSION_DATE","TR_ID","FIRM_ID","TKR","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS"
"3","20.01.1970T04:09:07","6","TRADING_CODE","666","8888.89","","222","","19.01.1970T23:49:58","3"
"2","20.01.1970T12:54:43","4","TRADING_CODE","666","8888.89","123.46","222","","19.01.1970T23:49:58","1"

1 SESSION_ID SESSION_DATE TR_ID FIRM_ID TKR CASH_LIABILITY DEPO_LIABILITY TRADE_NUM CLASS_CODE TRADE_DATE STATUS
2 3 20.01.1970T07:09:07 20.01.1970T04:09:07 6 TRADING_CODE 666 8888,89 8888.89 222 20.01.1970T02:49:58 19.01.1970T23:49:58 3
3 2 20.01.1970T15:54:43 20.01.1970T12:54:43 4 TRADING_CODE 666 8888,89 8888.89 123.456789 123.46 222 20.01.1970T02:49:58 19.01.1970T23:49:58 1

View file

@ -7,12 +7,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
* todo сделать для них dictionary
*/
public enum ReportBuilderType implements IEnumKey {
OPERATIONAL_LIABILITIES_CLAIMS("operational-liabilities-claims"),
OPERATIONAL_MONEY_CHANGE("operational-money-change"),
SUMMARY_LIABILITIES_CLAIMS("summary-liabilities-claims"),
SUMMARY_MONEY_CHANGE("summary-money-change"),
PERIOD_LIABILITIES_CLAIMS("period-liabilities-claims"),
PERIOD_MONEY_CHANGE("period-money-change"),
EXECUTED_DEAL_REPORT("executed-deal-report"),
UNFULFILLED_DEAL_REPORT("unfulfilled-deal-report"),
KS_REP_CASH_REGISTERS("ks_rep_cash_registers"),
@ -23,8 +17,6 @@ public enum ReportBuilderType implements IEnumKey {
KS_REP_CASH_NETTO("ks_rep_cash_netto"),
KS_REP_DEPO_NETTO("ks_rep_depo_netto"),
KS_REP_FIRM_DETAILS("ks_rep_firm_details"),
SIMPLE_REPORT("simple_report")
;
private final String key;

View file

@ -11,6 +11,7 @@ public enum ReportType implements IEnumKey {
PFX65("PFX65"),
REPORT_KS_TMP("REPORT_KS_TMP"),
REPORT_KS_FINAL("REPORT_KS_FINAL"),
;
private final String key;

View file

@ -86,8 +86,6 @@ public interface Consts {
String CREATE_NOTIFICATION_NTCR = "create-notification-ntcr";
String CREATE_NOTIFICATION_NCMP = "create-notification-ncmp";
String CREATE_REPORT_FOR_SESSION_ID = "create-report-for-session-id";
String CREATE_REPORT_FOR_SESSION_ID_LIST = "create-report-for-session-id-list";
String CREATE_REPORT_FOR_PERIOD = "create-report-for-period";
String CREATE_REPORT_FOR_REGISTRY = "create-report-for-registry";
String ACCOUNT_NEW_SDF01 = "account-new-sdf01";