report-service merge report_25_26_29: first test of CLS-25 CLS-26, пока запуск из консоли

This commit is contained in:
AKurakin 2022-12-26 18:59:29 +03:00
commit 9230dfb3b7
43 changed files with 897 additions and 159 deletions

View file

@ -11,7 +11,7 @@ import java.time.LocalDate;
/**
* Шапка для отчётов, содержащих startDate и endDate
*/
public class ReportWithPeriod extends AbstractReport {
public abstract class ReportWithPeriod extends AbstractReport {
@XStreamAsAttribute
@XStreamAlias("startDate")

View file

@ -1,18 +1,43 @@
package ru.spcex.clearing.reports;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import ru.spcex.clearing.reports.services.ReportDataCollector;
import ru.spcex.clearing.reports.services.ReportsService;
import ru.spcex.clearing.reports.services.builders.XMLReportBuilder;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.LocalDate;
import java.util.Map;
@SpringBootApplication
public class ReportsServiceApplication {
public static void main(String[] args) {
try {
SpringApplicationBuilder builder = new SpringApplicationBuilder(ReportsServiceApplication.class);
builder.run(args);
ConfigurableApplicationContext context = builder.run(args);
//todo это тест. Переписать код:
Logger log = LoggerFactory.getLogger(ReportsServiceApplication.class);
ImdgProvider imdg = context.getBean(ImdgProvider.class);
log.info("Wait IMDG...");
imdg.waitAvailable();
log.info("Run generate report.");
Map<String, ReportDataCollector> allReports = context.getBeansOfType(ReportDataCollector.class);
log.info("Report types: {}", allReports);
for (ReportDataCollector collector:allReports.values()) {
log.info("Make report {}", collector);
XMLReportBuilder xmlReportBuilder = new XMLReportBuilder(collector.getReportClass(), collector);
LocalDate date2 = LocalDate.now();
LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1);
xmlReportBuilder.createReport(date1, date2);
}
} catch (Throwable e) {
LoggerFactory.getLogger(ReportsServiceApplication.class).error("DBF-Loader start failed: {} -> {}", e.getClass().getSimpleName(), e.getMessage());
LoggerFactory.getLogger(ReportsServiceApplication.class).error("Report-service start failed: {} -> {}", e.getClass().getSimpleName(), ExceptionUtils.getStackTrace(e));
System.exit(-1);
}
ReportsService reportsService = new ReportsService();

View file

@ -3,18 +3,19 @@ package ru.spcex.clearing.reports.config.element;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
//import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings;
//import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
/**
* Параметр запуска: XMLReportBuilder
* --spring.config.location=E:/MFD_GIT_REPO/clearing/clearing-parent/reports-service/src/main/resources
*
*/
@Component
@PropertySource("file:${spring.config.location}/application.properties")
//todo for test @PropertySource("classpath:application.properties")
@ConfigurationProperties("reports-service")
public class ReportsServiceSettings {
private HazelcastClientParams hazelcast;
// private KafkaConsumerSettings kafkaConsumer;
// private KafkaProducerSettings kafkaProducer;
private String reportModuleOut;
public HazelcastClientParams getHazelcast() {
return hazelcast;
@ -24,19 +25,12 @@ public class ReportsServiceSettings {
this.hazelcast = hazelcast;
}
// public KafkaConsumerSettings getKafkaConsumer() {
// return kafkaConsumer;
// }
//
// public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) {
// this.kafkaConsumer = kafkaConsumer;
// }
//
// public KafkaProducerSettings getKafkaProducer() {
// return kafkaProducer;
// }
//
// public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
// this.kafkaProducer = kafkaProducer;
// }
public String getReportModuleOut() {
return reportModuleOut;
}
public void setReportModuleOut(String reportModuleOut) {
this.reportModuleOut = reportModuleOut;
}
}

View file

@ -3,10 +3,15 @@ package ru.spcex.clearing.reports.reports;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* Общая шапка (атрибуты) для всех отчетов
*/
public abstract class AbstractReport {
protected static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy");
protected static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
@XStreamAsAttribute
@XStreamAlias("version")
@ -28,4 +33,6 @@ public abstract class AbstractReport {
this.name = name;
}
abstract public String getReportName(LocalDateTime reportDateTime);
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("netPositionBank")
public class ReportPA_BT2_B extends ReportWithPeriod {
@ -93,6 +94,15 @@ public class ReportPA_BT2_B extends ReportWithPeriod {
this.total = new Total(claimsAmount, liabilitiesAmount, paymentAmount);
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPPA.BT12.2.B.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
@XStreamAlias("total")
public static class Total {
@XStreamAlias("claimsAmount")

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("netPositionInitiator")
public class ReportPA_BT2_IV extends ReportWithPeriod {
@ -93,6 +94,15 @@ public class ReportPA_BT2_IV extends ReportWithPeriod {
this.total = new Total(claimsAmount, liabilitiesAmount, paymentAmount);
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPPA.BT12.2.IV.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
@XStreamAlias("total")
public static class Total {
@XStreamAlias("claimsAmount")

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.reports.AbstractReport;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@XStreamAlias("incomingDocuments")
@ -91,4 +92,10 @@ public class Report_BT13_11 extends AbstractReport {
this.inDocumentJournalReceiptDate = inDocumentJournalReceiptDate;
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "DOCIN.%s".formatted(
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.reports.AbstractReport;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@XStreamAlias("outgoingDocuments")
@ -119,4 +120,11 @@ public class Report_BT13_12 extends AbstractReport {
this.outDocumentJournalDossierNumber = outDocumentJournalDossierNumber;
this.outDocumentJournalPostDate = outDocumentJournalPostDate;
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "DOCOUT.%s".formatted(
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.reports.AbstractReport;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@XStreamAlias("accountBalanceInfo")
@ -69,4 +70,11 @@ public class Report_BT16_5 extends AbstractReport {
this.accountBalanceCloseAmount = accountBalanceCloseAmount;
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "INACCNT.%s.%s".formatted(
companyClearingCode,
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.reports.ReportWithClearingStatus;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ -76,4 +77,13 @@ public class ReportBR_0420315_P1 extends ReportWithClearingStatus {
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420315.P1.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearedLiabilitiesTotal")
public class ReportBR_0420315_P2 extends ReportWithPeriod {
@ -68,4 +69,13 @@ public class ReportBR_0420315_P2 extends ReportWithPeriod {
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420315.P2.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ -89,4 +90,13 @@ public class ReportBR_0420317 extends ReportWithPeriod {
this.relationComment = relationComment;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420317.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.reports.ReportWithClearingStatus;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ -114,4 +115,13 @@ public class ReportBR_0420318 extends ReportWithClearingStatus {
this.liabilitiesClaimsAssetsFullNames = liabilitiesClaimsAssetsFullNames;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420318.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.reports.ReportWithClearingStatus;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ -90,4 +91,13 @@ public class ReportBR_0420314_P1 extends ReportWithClearingStatus {
this.liabilitiesClaimsAssetsLiabilitiesQuantity = liabilitiesClaimsAssetsLiabilitiesQuantity;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420314.P1.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ -83,4 +84,13 @@ public class ReportBR_0420314_P2 extends ReportWithPeriod {
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420314.P2.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage1")
public class ReportBR_0420312_P1 extends ReportWithPeriod {
@ -87,4 +88,13 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod {
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р1-1.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage10")
public class ReportBR_0420312_P10 extends ReportWithPeriod {
@ -37,4 +38,13 @@ public class ReportBR_0420312_P10 extends ReportWithPeriod {
this.liabilitiesAmount = liabilitiesAmount;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р3-3.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage2")
public class ReportBR_0420312_P2 extends ReportWithPeriod {
@ -45,4 +46,13 @@ public class ReportBR_0420312_P2 extends ReportWithPeriod {
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р1-2.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage3")
public class ReportBR_0420312_P3 extends ReportWithPeriod {
@ -46,4 +47,12 @@ public class ReportBR_0420312_P3 extends ReportWithPeriod {
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р1-3.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage4")
public class ReportBR_0420312_P4 extends ReportWithPeriod {
@ -38,4 +39,12 @@ public class ReportBR_0420312_P4 extends ReportWithPeriod {
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р1-4.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage5")
public class ReportBR_0420312_P5 extends ReportWithPeriod {
@ -37,4 +38,13 @@ public class ReportBR_0420312_P5 extends ReportWithPeriod {
this.liabilitiesAmount = liabilitiesAmount;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р1-5.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage6")
public class ReportBR_0420312_P6 extends ReportWithPeriod {
@ -37,4 +38,13 @@ public class ReportBR_0420312_P6 extends ReportWithPeriod {
this.liabilitiesAmount = liabilitiesAmount;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р1-6.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage7")
public class ReportBR_0420312_P7 extends ReportWithPeriod {
@ -37,4 +38,13 @@ public class ReportBR_0420312_P7 extends ReportWithPeriod {
this.liabilitiesAmount = liabilitiesAmount;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р1-7.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage8")
public class ReportBR_0420312_P8 extends ReportWithPeriod {
@ -85,4 +86,13 @@ public class ReportBR_0420312_P8 extends ReportWithPeriod {
this.clearingMemberCategoryClearingMemberCategory = clearingMemberCategoryClearingMemberCategory;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return " REPBR.0420312_р3-1.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import ru.spcex.clearing.reports.ReportWithPeriod;
import java.time.LocalDate;
import java.time.LocalDateTime;
@XStreamAlias("clearingCoverage9")
public class ReportBR_0420312_P9 extends ReportWithPeriod {
@ -61,4 +62,13 @@ public class ReportBR_0420312_P9 extends ReportWithPeriod {
this.liabilitiesClaimsAssetsLiabilities = liabilitiesClaimsAssetsLiabilities;
}
}
@Override
public String getReportName(LocalDateTime reportDateTime) {
return "REPBR.0420312_р3-2.%s-%s.%s".formatted(
DATE_FORMATTER.format(startDate),
DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(reportDateTime)
);
}
}

View file

@ -15,6 +15,11 @@ import java.util.stream.Collectors;
/**
* Сервис для работы с DOCX файлами
* Читает шаблон .docx и во всех текстовых элементах меняет переданные ключи на соответствующие им значения
* Пример ключа по умолчанию: ${ключ}
*
* При использовании нового шаблона, необходимо отредактировать docx документ так, чтобы ключ содержался в одном
* элементе. Для этого нужно вырезать ключ и в это же место вставить его как текст, без форматирования. Если нужно,
* идентификатору потом можно установить стиль, который будет применён к вставляемой строке.
*/
public class DOCXService {
/**

View file

@ -4,8 +4,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.clearing.reports.reports.AbstractReport;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.List;
@ -20,22 +22,37 @@ public abstract class ReportDataCollector<T extends AbstractReport> {
* T extends ReportWithPeriod
* @return
*/
abstract public List<T> collectReportWithPeriod(LocalDate startDate, LocalDate endDate);
abstract public T collectReportWithPeriod(LocalDate startDate, LocalDate endDate);
// /**
// * T extends ReportWithClearingStatus
// * @param startDate
// * @param endDate
// * @return
// */
// abstract public List<T> collectReportWithClearingStatus(LocalDate startDate, LocalDate endDate, String clearingStatus);
/**
* T extends ReportWithClearingStatus
* @param startDate
* @param endDate
* @return
*/
abstract public List<T> collectReportWithClearingStatus(LocalDate startDate, LocalDate endDate, String clearingStatus);
/**
*
* todo убрать метод, он уже лишний
* @param startDate
* @param endDate
* @param dateTimeNow LocalDateTime.now()
* @return
*/
abstract public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow);
@Deprecated
public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) {
throw new IllegalArgumentException("deprecated");
}
abstract public Class<T> getReportClass();
protected String toString(Long val) {
if (val == null) return null;
return val.toString();
}
protected String toString(Instant val) {
if (val == null) return null;
return DATE_TIME_FORMATTER.format(val.atZone(ZoneId.systemDefault()));
}
}

View file

@ -0,0 +1,16 @@
package ru.spcex.clearing.reports.services.builders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.clearing.reports.reports.AbstractReport;
import java.io.File;
import java.io.IOException;
public abstract class DOCXReportBuilder<R extends AbstractReport> extends FileReportBuilder<R> {
private final Logger log = LoggerFactory.getLogger(getClass());
protected DOCXReportBuilder(Class<R> reportClass, File templateResource) throws IOException {
super(reportClass);
}
}

View file

@ -0,0 +1,12 @@
package ru.spcex.clearing.reports.services.builders;
import ru.spcex.clearing.reports.reports.AbstractReport;
public abstract class FileReportBuilder<R extends AbstractReport> {
protected final Class<R> reportClass;
protected FileReportBuilder(Class<R> reportClass) {
this.reportClass = reportClass;
}
}

View file

@ -0,0 +1,51 @@
package ru.spcex.clearing.reports.services.builders;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.naming.NoNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.services.ReportDataCollector;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class XMLReportBuilder<R extends AbstractReport> extends FileReportBuilder<R> {
private final Logger log = LoggerFactory.getLogger(getClass());
protected final XStream xStream;
protected final ReportDataCollector<R> collector;
public XMLReportBuilder(Class<R> reportClass, ReportDataCollector<R> collector) {
super(reportClass);
this.collector = collector;
this.xStream = new XStream(new XppDriver(new NoNameCoder()));
xStream.processAnnotations(reportClass);
}
public File createReport(LocalDate startDate, LocalDate endDate) throws IOException {
R report = collector.collectReportWithPeriod(startDate, endDate);
String reportName = report.getReportName(LocalDateTime.now());
if (System.getProperty("os.name").toLowerCase().contains("windows")) reportName = reportName.replace(":", "_");
String reportFileName = reportName + ".xml";
File reportFile = new File(reportFileName);
if (reportFile.exists()) {
if (reportFile.isFile()) {
log.warn("Файл {} существует и будет перезаписан", reportFileName);
boolean deleteOk = reportFile.delete();
if (!deleteOk) throw new IOException("Не удалось удалить файл " + reportFileName);
} else throw new IOException(reportFileName + " существует, но не является файлом");
}
try (FileOutputStream fos = new FileOutputStream(reportFile)) {
xStream.toXML(report, fos);
}
return reportFile;
}
}

View file

@ -0,0 +1,143 @@
package ru.spcex.clearing.reports.services.collector;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.generated.ClearingMemberCategory;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets;
import ru.clearing.platform.dictionary.ClearingStatusDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P1;
import ru.spcex.clearing.reports.services.ReportDataCollector;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.ClearingStatus;
import ru.spcex.platform.enumeration.Market;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@Component
public class Bt17_1_P1_collector extends ReportDataCollector<ReportBR_0420315_P1> {
protected static final List<String> ALLOW_CLEARING_MEMBER_CATEGORY = Arrays.asList(ClearingCategory.I.getKey(), ClearingCategory.V.getKey());
protected static final String ALLOW_CLEARING_STATUS = ClearingStatus.OK.getKey();
private Imdg<Company> companyImdg;
private Imdg<LiabilitiesClaimsAssets> liabilitiesClaimsAssetsImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<ClearingStatusDictionary> clearingStatusDictionaryImdg;
private Imdg<Listing> listingImdg;
@Autowired
public Bt17_1_P1_collector(ImdgProvider imdgProvider) {
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class);
clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class);
listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
}
/**
* @param onMarket Market.mkrs.getKey()
* @param securityId liability.getSecurityId()
* @return
*/
protected Listing findListing(Market onMarket, Long securityId) {
Map qParam = new HashMap<>();
qParam.put("market", onMarket.getKey());
qParam.put("securityId", securityId);
return listingImdg.getSingleObjectByFieldValues(qParam);
}
@Override
public ReportBR_0420315_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
if (startDate.isAfter(endDate)) {
throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")");
}
ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate,
"BR",
"I,V", // cmc.getClearingMemberCategory()
ALLOW_CLEARING_STATUS //clearingStatus.getCode() "OK"
);
ClearingStatusDictionary allowClearingStatus = clearingStatusDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", ALLOW_CLEARING_STATUS));
if (allowClearingStatus == null) {
throw new IllegalStateException("ClearingStatusDictionary with code=\"" + ALLOW_CLEARING_STATUS + "\" not fount");
}
final Long allowClearingStatusId = allowClearingStatus.getId(); // "OK"
String ql = String.format("'%s' <= refundDate and refundDate <= '%s' and clearingStatus=%s",
startDate, endDate, allowClearingStatusId);
Collection<LiabilitiesClaimsAssets> liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql);
Map<Long, List<LiabilitiesClaimsAssets>> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId);
for (Map.Entry<Long, List<LiabilitiesClaimsAssets>> companyEntry : indexByCompany.entrySet()) {
final Long companyId = companyEntry.getKey();
List<LiabilitiesClaimsAssets> liabilitiesOfCompany = companyEntry.getValue();
Company company = companyImdg.getSingleObjectByID(companyId);
if (company != null) {
ClearingMemberCategory cmc = clearingMemberCategoryImdg.getSingleObjectByFieldValues(Map.of("companyId", companyId));
String checkCategory = cmc == null ? null : cmc.getClearingMemberCategory();
if (!ALLOW_CLEARING_MEMBER_CATEGORY.contains(checkCategory)) {
// фильтруются <> I, V
log.trace("Filtered company[{}] ClearingMemberCategory[{}].ClearingMemberCategory={}",
companyId, cmc == null ? null : cmc.getId(), checkCategory);
continue;
}
HashSet<String> onMarket = new HashSet<>();
long contractorQty;
double liabilitiesAmount = 0;
{
HashSet<String> collectedToSumm = new HashSet<>(); // чтобы дважды не посчитать 1 и тот же контракт
HashSet<Long> onMarketSecurity=new HashSet<>();
for (LiabilitiesClaimsAssets lContract : liabilitiesOfCompany) {
if (!onMarketSecurity.contains(lContract.getSecurityId())) {
Listing listing = findListing(Market.mkrs, lContract.getSecurityId());
if (listing!= null) {
onMarket.add(listing.getMarket());
}
onMarketSecurity.add(lContract.getSecurityId());
}
if (lContract.getPrice() != null && StringUtils.isNotEmpty(lContract.getContract())
&& !collectedToSumm.contains(lContract.getContract())) {
collectedToSumm.add(lContract.getContract());
liabilitiesAmount += lContract.getLiabilitiesQuantity().doubleValue();
}
}
contractorQty = collectedToSumm.size();
}
String onMarketString = StringUtils.join(onMarket, ",");
if (onMarket.size() != 1) { // Сейчас по коду ожидается один listing.market="MKRS" но потом могут быть несколько
log.warn("Market for companyId[{}]: {}", companyId, onMarketString);
}
ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1(company.getId().toString(),
company.getFullName(),
onMarketString,
String.valueOf(contractorQty),
String.valueOf(liabilitiesAmount));
reportBR_0420315_p1.getRows().add(info_0420315_p1);
}
}
return reportBR_0420315_p1;
}
@Override
public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) {
return String.format("REPBR.0420315.P1.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(dateTimeNow));
}
@Override
public Class<ReportBR_0420315_P1> getReportClass() {
return ReportBR_0420315_P1.class;
}
}

View file

@ -0,0 +1,66 @@
package ru.spcex.clearing.reports.services.collector;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P2;
import ru.spcex.clearing.reports.services.ReportDataCollector;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
@Component
public class Bt17_1_P2_collector extends ReportDataCollector<ReportBR_0420315_P2> {
private Imdg<LiabilitiesClaimsAssets> liabilitiesClaimsAssetsImdg;
@Autowired
public Bt17_1_P2_collector(ImdgProvider imdgProvider) {
liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class);
}
@Override
public ReportBR_0420315_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
if (startDate.isAfter(endDate)) {
throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")");
}
String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", startDate, endDate);
Collection<LiabilitiesClaimsAssets> liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql);
long contractorQty;
double liabilitiesAmount = 0;
{
HashSet<String> collectedToSumm = new HashSet<>();
for (LiabilitiesClaimsAssets lContract : liabilities) {
if (lContract.getPrice() != null && StringUtils.isNotEmpty(lContract.getContract())
&& !collectedToSumm.contains(lContract.getContract())) {
collectedToSumm.add(lContract.getContract());
liabilitiesAmount += lContract.getLiabilitiesQuantity().doubleValue();
}
}
contractorQty = collectedToSumm.size();
}
ReportBR_0420315_P2 reportBR_0420315_p2 = new ReportBR_0420315_P2(startDate, endDate,
"BR",
String.valueOf(contractorQty),
String.valueOf(liabilitiesAmount));
return reportBR_0420315_p2;
}
@Override
public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) {
return String.format("REPBR.0420315.P2.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(dateTimeNow));
}
@Override
public Class<ReportBR_0420315_P2> getReportClass() {
return ReportBR_0420315_P2.class;
}
}

View file

@ -1,104 +0,0 @@
package ru.spcex.clearing.reports.services.collector;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.generated.ClearingMemberCategory;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets;
import ru.clearing.platform.dictionary.ClearingStatusDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P1;
import ru.spcex.clearing.reports.services.ReportDataCollector;
import ru.spcex.platform.enumeration.ClearingStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
@Component
public class Bt17_1_collector extends ReportDataCollector<ReportBR_0420315_P1> {
private Imdg<Company> companyImdg;
private Imdg<LiabilitiesClaimsAssets> liabilitiesClaimsAssetsImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<ClearingStatusDictionary> clearingStatusDictionaryImdg;
private Imdg<Listing> listingImdg;
@Autowired
public Bt17_1_collector(ImdgProvider imdgProvider) {
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class);
clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class);
listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
}
@Override
public List<ReportBR_0420315_P1> collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
if (startDate.isAfter(endDate)) {
throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")");
}
List<ReportBR_0420315_P1> result = new ArrayList<>();
String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", startDate, endDate);
Collection<LiabilitiesClaimsAssets> liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql);
for (LiabilitiesClaimsAssets liability : liabilities) {
final Long companyId = liability.getCompanyId();
Company company = companyImdg.getSingleObjectByID(companyId);
if (company != null) {
ClearingMemberCategory cmc = clearingMemberCategoryImdg.getSingleObjectByFieldValues(Map.of("companyId", companyId));
if (cmc == null || !Arrays.asList("I", "V", "I,V").contains(cmc.getClearingMemberCategory())) {
//todo уточнить фильтр need filter by I, V?
log.trace("Filtered ClearingMemberCategory[{}].ClearingMemberCategory={}",
cmc == null ? null : cmc.getId(), cmc == null ? null : cmc.getClearingMemberCategory());
continue;
}
ClearingStatusDictionary clearingStatus = clearingStatusDictionaryImdg.getSingleObjectByID(liability.getClearingStatus());
if (clearingStatus == null || !ClearingStatus.OK.getKey().equals(clearingStatus.getCode())) {
continue;
}
ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate,
"BR",
cmc.getClearingMemberCategory(),
clearingStatus.getCode());
Listing listing;
{
Map qParam = new HashMap<>();
qParam.put("market", "MKRS"); // todo use const
qParam.put("securityId", liability.getSecurityId());
listing = listingImdg.getSingleObjectByFieldValues(qParam);
}
// liability.getPrice()// todo как там с учётом валют это делать?
Integer contractorQty = StringUtils.isEmpty(liability.getContract()) ? 0 : 1; // todo то суммировать надо. Связь похоже много к 1. // liability.getContract() В данное поле необходимо записать общее количество исполненных договоров, шт. элемент contract из бизнес-объекта liabilitiesClaimsAssets
BigDecimal liabilitiesAmount = liability.getPrice() == null ? BigDecimal.ZERO : liability.getPrice(); // todo как правильно считать?
ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1("companyId",
company.getFullName(),
listing == null ? null : listing.getMarket(),
contractorQty.toString(),
liabilitiesAmount.toString());
reportBR_0420315_p1.getRows().add(info_0420315_p1);
result.add(reportBR_0420315_p1);
}
}
return result;
}
@Override
public List<ReportBR_0420315_P1> collectReportWithClearingStatus(LocalDate startDate, LocalDate endDate, String clearingStatus) {
throw new IllegalStateException("clearingStatus not supported by this class");
}
@Override
public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) {
return String.format("REPBR.0420315.P1.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(dateTimeNow));
}
}

View file

@ -0,0 +1,82 @@
package ru.spcex.clearing.reports.services.collector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.bt_17_2.ReportBR_0420317;
import ru.spcex.clearing.reports.services.ReportDataCollector;
import ru.spcex.platform.enumeration.DocumentTypes;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
@Component
public class Bt17_2_collector extends ReportDataCollector<ReportBR_0420317> {
private Imdg<Company> companyImdg;
private Imdg<Relation> relationImdg;
private Imdg<CompanySymbols> companySymbolsImdg;
@Autowired
public Bt17_2_collector(ImdgProvider imdgProvider) {
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
}
@Override
public ReportBR_0420317 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
if (startDate.isAfter(endDate)) {
throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")");
}
String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate);
// todo обговорить про updatedAt updated, todo enum MKR
Collection<Relation> relations = relationImdg.getCollectionObjectsBySQL(ql);
ReportBR_0420317 reportBR_0420317 = new ReportBR_0420317(startDate, endDate, "BR");
for (Relation relation: relations) {
Company company = relation.getConsumerId() == null ? null : companyImdg.getSingleObjectByID(relation.getConsumerId());
if (company == null) {
log.warn("Company.id={} not found for relation.id={}", relation.getConsumerId(), relation.getId());
continue;
}
CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of(
"companySymbol", DocumentTypes.inn.getKey(),// ИНН или TIN участника клиринга
"companyId", company.getId()
));
ReportBR_0420317.Info_0420317 info_0420317 = new ReportBR_0420317.Info_0420317(
company.getClearingCode(),
toString(relation.getSupplierId()),
relation.getService(),
relation.getServiceStatus(),
toString(relation.getUpdated()),
company.getFullName(),
companySymbol == null ? null : companySymbol.getCompanySymbolValue(),
company.getProfile().getCountryCode(),
relation.getComment()
);
reportBR_0420317.getRows().add(info_0420317);
}
return reportBR_0420317;
}
@Override
public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) {
return String.format("REPBR.0420317.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(dateTimeNow));
}
@Override
public Class<ReportBR_0420317> getReportClass() {
return ReportBR_0420317.class;
}
}

View file

@ -0,0 +1,69 @@
package ru.spcex.clearing.reports.services.collector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.reports.bt_17_2.ReportBR_0420317;
import ru.spcex.clearing.reports.reports.bt_17_5.ReportBR_0420312_P1;
import ru.spcex.clearing.reports.services.ReportDataCollector;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Map;
@Component
public class Bt17_5_P1_collector extends ReportDataCollector<ReportBR_0420312_P1> {
private Imdg<Company> companyImdg;
private Imdg<Relation> relationImdg;
private Imdg<CompanySymbols> companySymbolsImdg;
@Autowired
public Bt17_5_P1_collector(ImdgProvider imdgProvider) {
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
}
@Override
public ReportBR_0420312_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
if (startDate.isAfter(endDate)) {
throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")");
}
// TODO ВСЁ по CLS-29...
String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate);
// todo обговорить про updatedAt updated, todo enum MKR
Collection<Relation> relations = relationImdg.getCollectionObjectsBySQL(ql);
ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(LocalDate.now(),
LocalDate.now(),
"companyClearingCode",
"BR",
"liabilitesClaimsAssetsCompanyId",
"liabilitesClaimsAssetsFullName",
"companySymbolCode",
"companySymbolValue",
"companyInfoCountryCode",
"clearingMemberCategory");
return reportBR_0420312P1;
}
@Override
public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) {
return String.format("REPBR.0420312_р1-1.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate),
DATE_TIME_FORMATTER.format(dateTimeNow));
}
@Override
public Class<ReportBR_0420312_P1> getReportClass() {
return ReportBR_0420312_P1.class;
}
}

View file

@ -0,0 +1,33 @@
package ru.spcex.clearing.reports.services.collector;
import ru.spcex.platform.classes.base.interfaces.WithId;
import java.util.*;
import java.util.function.Function;
public class MapUtil {
public static <K, V extends WithId> Map<K, V> index(Collection<V> from, Function<V, K> indexFieldExtractor) {
Map<K, V> index = new HashMap<>();
for (V obj : from) {
K key = indexFieldExtractor.apply(obj);
V exist = index.put(key, obj);
if (exist != null) {
throw new IllegalStateException(String.format("%s with id=%s,%s has duplicate key=\"{}\"",
exist.getClass().getSimpleName(), exist.getId(), obj.getId(), key
));
}
}
return index;
}
public static <K, V extends WithId> Map<K, List<V>> indexList(Collection<V> from, Function<V, K> indexFieldExtractor) {
Map<K, List<V>> index = new HashMap<>();
for (V obj : from) {
K key = indexFieldExtractor.apply(obj);
List<V> lst = index.computeIfAbsent(key, (_key_) -> new ArrayList<>());
lst.add(obj);
}
return index;
}
}

View file

@ -2,6 +2,7 @@ server.port=8080
server.servlet.context-path=/reports_service
spring.main.web-application-type=servlet
reports-service.hazelcast.cluster-members=127.0.0.1:5701
reports-service.hazelcast.cluster-members=127.0.0.1:5701,10.200.200.181:5701
reports-service.hazelcast.login=dev
reports-service.hazelcast.password=dev-pass
reports-service.ReportModuleOut=./report_out

View file

@ -0,0 +1,45 @@
package ru.spcex.clearing.reports.services;
import org.junit.jupiter.api.Test;
import ru.spcex.clearing.reports.reports.AbstractReport;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import static org.junit.jupiter.api.Assertions.*;
class ReportDataCollectorTest extends ReportDataCollector {
@Test
void testToString() {
ReportDataCollectorTest instance = new ReportDataCollectorTest();
assertEquals(null, instance.toString((Long)null));
assertEquals("1", instance.toString((Long)1L));
assertEquals("1230", instance.toString((Long)1230L));
}
@Test
void testToString1() {
ReportDataCollectorTest instance = new ReportDataCollectorTest();
assertEquals(null, instance.toString((Instant)null));
Instant val = Instant.ofEpochMilli(1672058774338L);
assertEquals("26.12.2022T15:46:14", instance.toString(val)); // msk timezone
}
@Override
public AbstractReport collectReportWithPeriod(LocalDate startDate, LocalDate endDate) {
throw new IllegalStateException("test");
}
@Override
public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) {
throw new IllegalStateException("test");
}
@Override
public Class<AbstractReport> getReportClass() {
return AbstractReport.class;
}
}

View file

@ -2,7 +2,7 @@ package ru.spcex.clearing.reports.services.impl;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import ru.spcex.clearing.reports.services.collector.Bt17_1_collector;
import ru.spcex.clearing.reports.services.collector.Bt17_1_P1_collector;
import java.time.LocalDate;
import java.time.LocalDateTime;
@ -13,7 +13,7 @@ class Bt17_1_collectorTest {
@Test
void getFileName() {
Bt17_1_collector collector = Mockito.mock(Bt17_1_collector.class);
Bt17_1_P1_collector collector = Mockito.mock(Bt17_1_P1_collector.class);
Mockito.when(collector.getFileName(Mockito.any(),Mockito.any(),Mockito.any())).thenCallRealMethod();
String str = collector.getFileName(LocalDate.of(2020,1,1),

View file

@ -0,0 +1,27 @@
package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey;
/**
* CLEARING_CATEGORY_DICTIONARY
*/
public enum ClearingCategory implements IEnumKey {
C("C"), // Категория «Ц» - Банк России
B("B"), // Категория «Б» - Кредитная организация ДР
F("F"), // Категория «Ф» - Участник рынка РЦБ
I("I"), // Категория «И» - Инициатор по ТБС
V("V"), // Категория «В» - Инициатор по ТКС
T("T"), // Категория «Т» - Участник товарного рынка
K("K"); // Категория «К» - Участник клиринга - Контроллер
private final String key;
ClearingCategory(String key) {
this.key = key;
}
@Override
public String getKey() {
return key;
}
}

View file

@ -0,0 +1,39 @@
package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey;
/**
* DOCUMENT_TYPE_DICTIONARY
*/
public enum DocumentTypes implements IEnumKey {
pasp("PASP"), // Паспорт
icrt("ICRT"), // Удостоверение личности
prxy("PRXY"), // Доверенность
cntr("CNTR"), // Договор клиринга
regs("REGS"), // Регистрация
form("FORM"), // Анкета участника
ogrn("OGRN"), // ОГРН
licb("LICB"), // Банковская лицензия
licp("LICP"), // Лицензия проф. участника
plac("PLAC"), // Регистрация по месту пребывания
inn("INN"), // ИНН
cio("CIO"), // КИО
licr("LICR"), // Брокерская лицензия
fin("FIN"), // Финансовая отчетность
trst("TRST"), // Полномочия должностных лиц
pmkr("PMKR"), // Распоряжение на списание МКР
taut("TAUT"), // Допуск к торгам
edoc("EDOC"), // Договор об электронном взаимодействии
xcnt("XCNT"); // Документ о расторжении Договора клиринга
private final String key;
DocumentTypes(String key) {
this.key = key;
}
@Override
public String getKey() {
return key;
}
}

View file

@ -1,18 +1,18 @@
package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum Market implements IEnumKey {
mkrs("MKRS");
private final String key;
Market(String key) {
this.key = key;
}
@Override
public String getKey() {
return key;
}
}
package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum Market implements IEnumKey {
mkrs("MKRS");
private final String key;
Market(String key) {
this.key = key;
}
@Override
public String getKey() {
return key;
}
}

View file

@ -135,6 +135,15 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
return searchResult;
}
@Override
public Collection<T> getCollectionObjectsBySQL(String paramString) {
SqlPredicate sqlPredicate = new SqlPredicate(paramString);
Set<Map.Entry<Long, T>> found = map.entrySet(sqlPredicate);
List<T> result = new ArrayList<>(found.size());
for (Map.Entry<Long, T> entry : found) result.add(entry.getValue());
return result;
}
@Override
public Long nextIDSequenceFor() {
return idGenerator.newId();