some fixes and tests

This commit is contained in:
akulikov 2023-05-16 21:26:24 +03:00
parent 47fbbabb1b
commit 94ab971af1
20 changed files with 525 additions and 67 deletions

View file

@ -101,6 +101,16 @@
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-validation</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>test-clearing</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View file

@ -7,6 +7,7 @@ import org.springframework.context.annotation.Scope;
import ru.spcex.clearing.reports.errors.ReportError;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.platform.enumeration.UserRole;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
@ -24,4 +25,9 @@ public class BeanConfiguration {
return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, ReportError.UserVerifyDenial);
}
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public RequestHelper requestHelper(IMessageResolver messageResolver) {
return new RequestHelper(messageResolver, ReportError.InternalError);
}
}

View file

@ -18,7 +18,7 @@ import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
public class ReportsServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaConsumerSettings kafkaConsumer;
// private KafkaProducerSettings kafkaProducer;
private KafkaProducerSettings kafkaProducer;
private String reportModuleOut;
public HazelcastClientParams getHazelcast() {
@ -37,13 +37,13 @@ public class ReportsServiceSettings {
this.kafkaConsumer = kafkaConsumer;
}
// public KafkaProducerSettings getKafkaProducer() {
// return kafkaProducer;
// }
//
// public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
// this.kafkaProducer = kafkaProducer;
// }
public KafkaProducerSettings getKafkaProducer() {
return kafkaProducer;
}
public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
this.kafkaProducer = kafkaProducer;
}
public String getReportModuleOut() {
return reportModuleOut;

View file

@ -36,7 +36,7 @@ public abstract class CSVReportBuilder<P> {
protected abstract List<String[]> getLines();
/**
* Название отчета, используется для формирования имени отчета
* Название отчета, используется для формирования имени отчета (без указания формата)
*
* @param params Параметры формирования отчета
*/
@ -67,15 +67,14 @@ public abstract class CSVReportBuilder<P> {
CSVWriterBuilder csvWriterBuilder = new CSVWriterBuilder(writer)
.withLineEnd("\n")
.withSeparator(',')
.withQuoteChar('\'')
.withEscapeChar('\"');
.withQuoteChar('\"');
return csvWriterBuilder.build();
}
public File createReport(P params, File outFolder) {
assert outFolder != null && outFolder.isDirectory();
File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename(params)));
File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename(params) + ".csv"));
collect(params);
String[] headers = getHeaders();
@ -85,11 +84,11 @@ public abstract class CSVReportBuilder<P> {
assert lines != null;
try (ICSVWriter csvWriter = createCsvWriter(reportFile)) {
csvWriter.writeNext(headers);
csvWriter.writeNext(headers, false);
csvWriter.writeAll(lines, true);
} catch (IOException e) {
// todo check it
e.printStackTrace();
log.error("Can't create report", e);
return null;
}
return reportFile;

View file

@ -2,8 +2,6 @@ package ru.spcex.clearing.reports.reports;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter;
import java.time.LocalDate;
@ -15,12 +13,12 @@ public abstract class ReportWithPeriod extends AbstractReport {
@XStreamAsAttribute
@XStreamAlias("startDate")
@XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
protected LocalDate startDate;
@XStreamAsAttribute
@XStreamAlias("endDate")
@XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
protected LocalDate endDate;

View file

@ -18,7 +18,8 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.math.RoundingMode;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@ -35,7 +36,7 @@ public abstract class LiabilitiesClaimsReportBuilder<P> extends CSVReportBuilder
protected final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
protected final String[] headers = {
"id", "doc_date", "doc_time", "doc_type", "clearingHouse", "firmId", "firName", "session_id",
"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",
@ -83,7 +84,9 @@ public abstract class LiabilitiesClaimsReportBuilder<P> extends CSVReportBuilder
Company clearingHouseCompany = companyImdg.getSingleObjectByID(1L);
String clearingHouse = clearingHouseCompany.getFullName();
Instant now = Instant.now();
LocalDate nowDate = LocalDate.now();
LocalTime nowTime = LocalTime.now();
lines = new ArrayList<>(executions.size());
for (ExecutionCommon execution : executions) {
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
@ -102,8 +105,8 @@ public abstract class LiabilitiesClaimsReportBuilder<P> extends CSVReportBuilder
);
String id = String.valueOf(execution.getId());
String docDate = dateFormatter.format(now);
String docTime = timeFormatter.format(now);
String docDate = dateFormatter.format(nowDate);
String docTime = timeFormatter.format(nowTime);
String docName = "Отчет об обязательствах/требованиях Участника клиринга";
String docType = "KS_FIRMID_LIABILITIES";
String firmId = String.valueOf(execution.getCompanyId());

View file

@ -6,7 +6,7 @@ import ru.spcex.clearing.reports.reports.SessionIdParam;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Map;
@ -31,7 +31,9 @@ public class OperationalLiabilitiesClaimsReportBuilder extends LiabilitiesClaims
@Override
protected String getReportFilename(SessionIdParam params) {
return "operational_liabilities_claims.%s".formatted(Instant.now());
return "operational_liabilities_claims.%s".formatted(
dateTimeFormatter.format(LocalDateTime.now())
);
}
@Override

View file

@ -2,11 +2,8 @@ package ru.spcex.clearing.reports.reports.bt.bt_13;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.reports.ReportId;
import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter;
import ru.spcex.clearing.reports.xml_test.FormattedLocalTimeConverter;
import java.time.LocalDate;
import java.time.LocalDateTime;
@ -22,7 +19,7 @@ public class ReportDOCIN extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("date")
@XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
private final LocalDate date;
/**
@ -30,7 +27,7 @@ public class ReportDOCIN extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("time")
@XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
private final LocalTime time;
@XStreamAlias("rows")

View file

@ -2,11 +2,8 @@ package ru.spcex.clearing.reports.reports.bt.bt_13;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.reports.ReportId;
import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter;
import ru.spcex.clearing.reports.xml_test.FormattedLocalTimeConverter;
import java.time.LocalDate;
import java.time.LocalDateTime;
@ -22,7 +19,7 @@ public class ReportDOCOUT extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("date")
@XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
private final LocalDate date;
/**
@ -30,7 +27,7 @@ public class ReportDOCOUT extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("time")
@XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
private final LocalTime time;
@XStreamAlias("rows")

View file

@ -2,11 +2,8 @@ package ru.spcex.clearing.reports.reports.bt.bt_16_5;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.reports.ReportId;
import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter;
import ru.spcex.clearing.reports.xml_test.FormattedLocalTimeConverter;
import java.time.LocalDate;
import java.time.LocalDateTime;
@ -26,7 +23,7 @@ public class ReportINACCNT extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("date")
@XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"})
private final LocalDate date;
/**
@ -34,7 +31,7 @@ public class ReportINACCNT extends AbstractReport {
*/
@XStreamAsAttribute
@XStreamAlias("time")
@XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"})
private final LocalTime time;
@XStreamAlias("rows")

View file

@ -18,11 +18,10 @@ import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.reports.config.element.ReportsServiceSettings;
import ru.spcex.clearing.reports.reports.*;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.ReportType;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import java.io.File;
@ -32,10 +31,9 @@ import java.util.function.Function;
@Service
public class ReportService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final IMessageResolver messageResolver;
private final UserRoleVerification userRoleVerification;
private final ValidationHelper validationHelper;
private final RequestHelper requestHelper;
private final Function<ReportRequest, IValidator> reportRequestValidator;
private final Function<ReportRequestWithSessionId, IValidator> reportRequestWithSessionIdValidator;
private final Function<ReportRequestWithSessionIdList, IValidator> reportRequestWithSessionIdListValidator;
@ -49,10 +47,9 @@ public class ReportService extends QueueConsumer implements InitializingBean {
public ReportService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaResponseQueue,
ImdgProvider imdgProvider,
IMessageResolver messageResolver,
UserRoleVerification userRoleVerification,
ValidationHelper validationHelper,
RequestHelper requestHelper,
ReportsServiceSettings reportsServiceSettings,
@Qualifier("reportBuildersWithoutParams")
Map<ReportType, CSVReportBuilder<EmptyParams>> reportBuildersWithoutParams,
@ -71,10 +68,9 @@ public class ReportService extends QueueConsumer implements InitializingBean {
@Qualifier("reportRequestWithPeriodValidator")
Function<ReportRequestWithPeriod, IValidator> reportRequestWithPeriodValidator) {
super(kafkaQueue, kafkaResponseQueue);
this.imdgProvider = imdgProvider;
this.messageResolver = messageResolver;
this.userRoleVerification = userRoleVerification;
this.validationHelper = validationHelper;
this.requestHelper = requestHelper;
this.reportRequestValidator = reportRequestValidator;
this.reportRequestWithSessionIdValidator = reportRequestWithSessionIdValidator;
this.reportRequestWithSessionIdListValidator = reportRequestWithSessionIdListValidator;
@ -97,10 +93,11 @@ public class ReportService extends QueueConsumer implements InitializingBean {
.forDestination(Consts.DESTINATION_CREATE_REPORT_FOR_SESSION_ID, callbacks::put);
callback(ReportRequestWithSessionIdList.class)
.setFunction(this::createReportForSessionIdList)
.forDestination(Consts.DESTINATION_CREATE_REPORT_FOR_SESSION_ID, callbacks::put);
.forDestination(Consts.DESTINATION_CREATE_REPORT_FOR_SESSION_ID_LIST, callbacks::put);
callback(ReportRequestWithPeriod.class)
.setFunction(this::createReportForPeriod)
.forDestination(Consts.DESTINATION_CREATE_REPORT_FOR_PERIOD, callbacks::put);
init();
}
public RequestInfoUpdate createReport(BaseRequest<ReportRequest> userRequest) {
@ -118,6 +115,8 @@ public class ReportService extends QueueConsumer implements InitializingBean {
IEnumKey.getEnumByKey(ReportType.class, req.getReportId())
);
File outFile = builder.createReport(new EmptyParams(), outFolder);
if (outFile == null) {
}
log.debug("Report {} successfully created. Output file: {}", req.getReportId(), outFile.getAbsolutePath());
return null;

View file

@ -1,4 +1,6 @@
reports-service.hazelcast.cluster-members=127.0.0.1:5701
reports-service.hazelcast.login=dev
reports-service.hazelcast.password=dev-pass
reports-service.kafka-consumer.bootstrap-servers=localhost:9092
reports-service.kafka-consumer.group-id=dev-group-balance-service
@ -8,16 +10,11 @@ reports-service.kafka-consumer.auto-offset-reset=latest
reports-service.kafka-consumer.linger-ms=1
reports-service.kafka-consumer.buffer-memory=33554432
#reports-service.kafka-producer.bootstrap-servers=localhost:9092
#reports-service.kafka-producer.acks=all
#reports-service.kafka-producer.retries=0
#reports-service.kafka-producer.batch-size=16384
#reports-service.kafka-producer.linger-ms=1
#reports-service.kafka-producer.buffer-memory=33554432
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.kafka-producer.bootstrap-servers=localhost:9092
reports-service.kafka-producer.acks=all
reports-service.kafka-producer.retries=0
reports-service.kafka-producer.batch-size=16384
reports-service.kafka-producer.linger-ms=1
reports-service.kafka-producer.buffer-memory=33554432
reports-service.ReportModuleOut=./report_out

View file

@ -0,0 +1,17 @@
package ru.spcex.clearing.reports.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.clearing.reports.config.element.ReportsServiceSettings;
@Configuration
public class TestConfig {
@Bean
public ReportsServiceSettings reportsServiceSettings() {
ReportsServiceSettings reportsServiceSettings = new ReportsServiceSettings();
reportsServiceSettings.setReportModuleOut("out");
return reportsServiceSettings;
}
}

View file

@ -0,0 +1,429 @@
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.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.MockProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.mock.mockito.SpyBean;
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.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.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId;
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.test.TestUtils;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.*;
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.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.*;
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
})
public class ReportServiceTest {
private Imdg<ExecutionFond> executionFondImdg;
private Imdg<ExecutionDeposit> executionDepositImdg;
private Imdg<Company> companyImdg;
private Imdg<Registry> registryImdg;
private Imdg<Listing> listingImdg;
private Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final ExecutionFond testExecutionFond = new ExecutionFond();
private final ExecutionDeposit testExecutionDeposit = new ExecutionDeposit();
private final Company testCompany_1 = new Company();
private final Company testCompany_2 = new Company();
private final Company testCompanyHouse = new Company();
private final Registry testRegistryForCompanyId_1 = new Registry();
private final Registry testRegistryForCompanyId_2 = new Registry();
private final Registry tm_tRegistry_1 = new Registry();
private final Registry om_tRegistry_1 = new Registry();
private final Registry ts_tRegistry_1 = new Registry();
private final Registry os_tRegistry_1 = new Registry();
private final Registry tm_tRegistry_2 = new Registry();
private final Registry om_tRegistry_2 = new Registry();
private final Registry ts_tRegistry_2 = new Registry();
private final Registry os_tRegistry_2 = new Registry();
private final Listing testListing_1 = new Listing();
private final Listing testListing_2 = new Listing();
private final FixedIncomeSecurity testFixedIncomeSecurity_1 = new FixedIncomeSecurity();
private final FixedIncomeSecurity testFixedIncomeSecurity_2 = new FixedIncomeSecurity();
private final TradingClearingRegistry testTradingClearingRegistry_1 = new TradingClearingRegistry();
private final TradingClearingRegistry testTradingClearingRegistry_2 = new TradingClearingRegistry();
private static File outFolder;
@Autowired
private ReportService reportService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider imdgProvider;
@Captor
private ArgumentCaptor<ProducerRecord> producerRecord;
@SpyBean
private MockProducer<String, Object> producer;
@BeforeAll
public static void createTestFolder() {
outFolder = new File("out");
outFolder.mkdir();
}
@AfterAll
public static void deleteTestFolder() throws IOException {
FileUtils.deleteDirectory(outFolder);
}
@Test
public void createReportTest_OPERATIONAL_LIABILITIES_CLAIMS() throws InterruptedException, IOException, CsvValidationException {
final Long oldSessionIdDeposit = testExecutionDeposit.getSessionId();
final Long oldSessionIdFond = testExecutionFond.getSessionId();
ReportRequestWithSessionId reportRequestWithSessionId = new ReportRequestWithSessionId();
reportRequestWithSessionId.setReportId(ReportType.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.DESTINATION_CREATE_REPORT_FOR_SESSION_ID,
0,
0,
jsonString);
TestUtils.waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord);
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("operational_liabilities_claims_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time"));
System.out.println("hello");
testExecutionDeposit.setSessionId(oldSessionIdDeposit);
testExecutionFond.setSessionId(oldSessionIdFond);
executionDepositImdg.update(testExecutionDeposit);
executionFondImdg.update(testExecutionFond);
outFile.delete();
}
public 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);
}
} while (true);
expectedCSVReader.close();
actualCSVReader.close();
}
@PostConstruct
private void init() {
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
testExecutionFond.setExchangeExecutionId(TEST_EXCHANGE_EXECUTION_ID_1);
testExecutionFond.setExchangeExecutionTime(TEST_EXCHANGE_EXECUTION_TIME_1);
testExecutionFond.setTradingDate(TEST_TRADING_DATE_1);
testExecutionFond.setTradingClearingRegistryId(TEST_TRADING_CLEARING_REGISTRY_ID_1);
testExecutionFond.setMarket(TEST_MARKET_1);
testExecutionFond.setPrice(TEST_PRICE_1);
testExecutionFond.setLots(TEST_LOTS_1);
testExecutionFond.setQuantity(TEST_QUANTITY_1);
testExecutionFond.setInterestAmount(TEST_INTEREST_AMOUNT_1);
testExecutionFond.setSide(TEST_SIDE_1);
testExecutionFond.setSettlementCurrency(TEST_SETTLEMENT_CURRENCY_1);
testExecutionFond.setCompanyId(TEST_COMPANY_ID_1);
testExecutionFond.setDuration(TEST_DURATION_1);
testExecutionFond.setSecurityFullName(TEST_SECURITY_FULL_NAME_1);
testExecutionFond.setSecuritySymbol(TEST_SECURITY_SYMBOL_1);
testExecutionFond.setSecurityId(TEST_SECURITY_ID_1);
testExecutionFond.setCounterPartyId(TEST_COUNTER_PARTY_ID_1);
testExecutionFond.setCoverageStatus(TEST_COVERAGE_STATUS_1);
testExecutionFond.setSessionId(TEST_SESSION_ID_1);
testExecutionFond.setClearingDate(TEST_CLEARING_DATE_1);
testExecutionFond.setExchangeOrderId(TEST_EXCHANGE_ORDER_ID);
testExecutionFond.setSettlementAmount(TEST_SETTLEMENT_AMOUNT);
testExecutionFond.setComment(TEST_COMMENT);
testExecutionFond.setClientCodeId(TEST_CLIENT_CODE_ID);
testExecutionFond.setSettlementCode(TEST_SETTLEMENT_CODE);
testExecutionFond.setSettlementDate(TEST_SETTLEMENT_DATE);
testExecutionFond.setExchangeExecutionMicroseconds(TEST_EXCHANGE_EXECUTION_MICROSECONDS);
testExecutionDeposit.setExchangeExecutionId(TEST_EXCHANGE_EXECUTION_ID_2);
testExecutionDeposit.setExchangeExecutionTime(TEST_EXCHANGE_EXECUTION_TIME_2);
testExecutionDeposit.setTradingDate(TEST_TRADING_DATE_2);
testExecutionDeposit.setTradingClearingRegistryId(TEST_TRADING_CLEARING_REGISTRY_ID_2);
testExecutionDeposit.setMarket(TEST_MARKET_2);
testExecutionDeposit.setPrice(TEST_PRICE_2);
testExecutionDeposit.setLots(TEST_LOTS_2);
testExecutionDeposit.setQuantity(TEST_QUANTITY_2);
testExecutionDeposit.setInterestAmount(TEST_INTEREST_AMOUNT_2);
testExecutionDeposit.setSide(TEST_SIDE_2);
testExecutionDeposit.setSettlementCurrency(TEST_SETTLEMENT_CURRENCY_2);
testExecutionDeposit.setCompanyId(TEST_COMPANY_ID_2);
testExecutionDeposit.setDuration(TEST_DURATION_2);
testExecutionDeposit.setSecurityFullName(TEST_SECURITY_FULL_NAME_2);
testExecutionDeposit.setSecuritySymbol(TEST_SECURITY_SYMBOL_2);
testExecutionDeposit.setSecurityId(TEST_SECURITY_ID_2);
testExecutionDeposit.setCounterPartyId(TEST_COUNTER_PARTY_ID_2);
testExecutionDeposit.setCoverageStatus(TEST_COVERAGE_STATUS_2);
testExecutionDeposit.setSessionId(TEST_SESSION_ID_2);
testExecutionDeposit.setClearingDate(TEST_CLEARING_DATE_2);
testExecutionDeposit.setFirstLegAmount(TEST_FIRST_LEG_AMOUNT);
testExecutionDeposit.setSecondLegAmount(TEST_SECOND_LEG_AMOUNT);
testExecutionDeposit.setFirstLegSettlementDate(TEST_FIRST_LEG_SETTLEMENT_DATE);
testExecutionDeposit.setSecondLegSettlementDate(TEST_SECOND_LEG_SETTLEMENT_DATE);
testExecutionDeposit.setFirstLegSettlementCode(TEST_FIRST_LEG_SETTLEMENT_CODE);
testExecutionDeposit.setSecondLegSettlementCode(TEST_SECOND_LEG_SETTLEMENT_CODE);
testExecutionDeposit.setContract(TEST_CONTRACT);
executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
executionFondImdg.insert(testExecutionFond);
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
executionDepositImdg.insert(testExecutionDeposit);
testCompany_1.setWorkflowStatus(WorkflowStatus.Active.getKey());
testCompany_1.setId(TEST_COMPANY_ID_1);
testCompany_1.setFullName(TEST_COMPANY_FULLNAME_1);
testCompany_2.setWorkflowStatus(WorkflowStatus.Active.getKey());
testCompany_2.setId(TEST_COMPANY_ID_2);
testCompany_2.setFullName(TEST_COMPANY_FULLNAME_2);
testCompanyHouse.setId(1L);
testCompanyHouse.setFullName("COMPANY_HOUSE");
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
companyImdg.insert(testCompany_1);
companyImdg.insert(testCompany_2);
companyImdg.insert(testCompanyHouse);
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
testRegistryForCompanyId_1.setCompanyId(TEST_COMPANY_ID_1);
testRegistryForCompanyId_1.setTradingClearingRegistry(TEST_TRADING_CLEARING_REGISTRY_1);
testRegistryForCompanyId_2.setCompanyId(TEST_COMPANY_ID_2);
testRegistryForCompanyId_2.setTradingClearingRegistry(TEST_TRADING_CLEARING_REGISTRY_2);
registryImdg.insert(testRegistryForCompanyId_1);
registryImdg.insert(testRegistryForCompanyId_2);
tm_tRegistry_1.setRegistryCode("TM_T");
tm_tRegistry_1.setBalance(BigDecimal.valueOf(779L));
om_tRegistry_1.setRegistryCode("OM_T");
om_tRegistry_1.setBalance(BigDecimal.valueOf(2L));
ts_tRegistry_1.setRegistryCode("TS_T");
ts_tRegistry_1.setBalance(BigDecimal.valueOf(889L));
os_tRegistry_1.setRegistryCode("OS_T");
os_tRegistry_1.setBalance(BigDecimal.valueOf(1L));
tm_tRegistry_1.setSessionId(TEST_SESSION_ID_1);
om_tRegistry_1.setSessionId(TEST_SESSION_ID_1);
ts_tRegistry_1.setSessionId(TEST_SESSION_ID_1);
os_tRegistry_1.setSessionId(TEST_SESSION_ID_1);
tm_tRegistry_2.setRegistryCode("TM_T");
tm_tRegistry_2.setBalance(BigDecimal.valueOf(779L));
om_tRegistry_2.setRegistryCode("OM_T");
om_tRegistry_2.setBalance(BigDecimal.valueOf(2L));
ts_tRegistry_2.setRegistryCode("TS_T");
ts_tRegistry_2.setBalance(BigDecimal.valueOf(889L));
os_tRegistry_2.setRegistryCode("OS_T");
os_tRegistry_2.setBalance(BigDecimal.valueOf(1L));
tm_tRegistry_2.setSessionId(TEST_SESSION_ID_2);
om_tRegistry_2.setSessionId(TEST_SESSION_ID_2);
ts_tRegistry_2.setSessionId(TEST_SESSION_ID_2);
os_tRegistry_2.setSessionId(TEST_SESSION_ID_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);
listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
testListing_1.setSecurityId(TEST_SECURITY_ID_1);
testListing_1.setLotSize(TEST_LOT_SIZE_1);
testListing_2.setSecurityId(TEST_SECURITY_ID_2);
testListing_2.setLotSize(TEST_LOT_SIZE_2);
listingImdg.insert(testListing_1);
listingImdg.insert(testListing_2);
testFixedIncomeSecurity_1.setSecurityId(TEST_SECURITY_ID_1);
testFixedIncomeSecurity_1.setNominalValue(TEST_NOMINAL_1);
testFixedIncomeSecurity_1.setCoupon(TEST_COUPON_1);
testFixedIncomeSecurity_2.setSecurityId(TEST_SECURITY_ID_2);
testFixedIncomeSecurity_2.setNominalValue(TEST_NOMINAL_2);
testFixedIncomeSecurity_2.setCoupon(TEST_COUPON_2);
fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
fixedIncomeSecurityImdg.insert(testFixedIncomeSecurity_1);
fixedIncomeSecurityImdg.insert(testFixedIncomeSecurity_2);
tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
testTradingClearingRegistry_1.setId(TEST_TRADING_CLEARING_REGISTRY_ID_1);
testTradingClearingRegistry_1.setMoneyAccountId(TEST_MONEY_ACCOUNT_1);
testTradingClearingRegistry_1.setDepoAccountId(TEST_DEPO_ACCOUNT_1);
tradingClearingRegistryImdg.insert(testTradingClearingRegistry_1);
testTradingClearingRegistry_2.setId(TEST_TRADING_CLEARING_REGISTRY_ID_2);
testTradingClearingRegistry_2.setMoneyAccountId(TEST_MONEY_ACCOUNT_2);
testTradingClearingRegistry_2.setDepoAccountId(TEST_DEPO_ACCOUNT_2);
tradingClearingRegistryImdg.insert(testTradingClearingRegistry_2);
}
private final Long TEST_EXCHANGE_EXECUTION_ID_1 = 777L;
private final Long TEST_EXCHANGE_EXECUTION_ID_2 = 888L;
private final Instant TEST_EXCHANGE_EXECUTION_TIME_1 = Instant.ofEpochMilli(777777777777L);
private final Instant TEST_EXCHANGE_EXECUTION_TIME_2 = Instant.ofEpochMilli(888888888888L);
private final LocalDate TEST_TRADING_DATE_1 = LocalDate.now().minus(10, ChronoUnit.DAYS);
private final LocalDate TEST_TRADING_DATE_2 = LocalDate.now().minus(20, ChronoUnit.DAYS);
private final Long TEST_TRADING_CLEARING_REGISTRY_ID_1 = 777L;
private final Long TEST_TRADING_CLEARING_REGISTRY_ID_2 = 888L;
private final String TEST_MARKET_1 = Market.fond.getKey();
private final String TEST_MARKET_2 = Market.mkrs.getKey();
private final BigDecimal TEST_PRICE_1 = BigDecimal.valueOf(77L);
private final BigDecimal TEST_PRICE_2 = BigDecimal.valueOf(88L);
private final BigDecimal TEST_LOTS_1 = BigDecimal.valueOf(777L);
private final BigDecimal TEST_LOTS_2 = BigDecimal.valueOf(888L);
private final BigDecimal TEST_QUANTITY_1 = BigDecimal.valueOf(7777L);
private final BigDecimal TEST_QUANTITY_2 = BigDecimal.valueOf(8888L);
private final BigDecimal TEST_INTEREST_AMOUNT_1 = BigDecimal.valueOf(77777L);
private final BigDecimal TEST_INTEREST_AMOUNT_2 = BigDecimal.valueOf(88888L);
private final String TEST_SIDE_1 = Side.SELL.getKey();
private final String TEST_SIDE_2 = Side.BUY.getKey();
private final String TEST_SETTLEMENT_CURRENCY_1 = "test-settlement-currency-1";
private final String TEST_SETTLEMENT_CURRENCY_2 = "test-settlement-currency-2";
private final Long TEST_COMPANY_ID_1 = 1007L;
private final Long TEST_COMPANY_ID_2 = 1008L;
private final String TEST_COMPANY_FULLNAME_1 = "test-company-fullname-1";
private final String TEST_COMPANY_FULLNAME_2 = "test-company-fullname-2";
private final Long TEST_DURATION_1 = 2007L;
private final Long TEST_DURATION_2 = 2008L;
private final String TEST_SECURITY_FULL_NAME_1 = "test-security-full-name-1";
private final String TEST_SECURITY_FULL_NAME_2 = "test-security-full-name-2";
private final String TEST_SECURITY_SYMBOL_1 = "test-security-symbol-1";
private final String TEST_SECURITY_SYMBOL_2 = "test-security-symbol-2";
private final Long TEST_SECURITY_ID_1 = 3007L;
private final Long TEST_SECURITY_ID_2 = 3008L;
private final Long TEST_COUNTER_PARTY_ID_1 = 4007L;
private final Long TEST_COUNTER_PARTY_ID_2 = 4008L;
private final String TEST_COVERAGE_STATUS_1 = Allowed.ALLOWED.getKey();
private final String TEST_COVERAGE_STATUS_2 = Allowed.DENIED.getKey();
private final Long TEST_SESSION_ID_1 = 10007L;
private final Long TEST_SESSION_ID_2 = 10008L;
private final LocalDate TEST_CLEARING_DATE_1 = LocalDate.now().minus(30, ChronoUnit.DAYS);
private final LocalDate TEST_CLEARING_DATE_2 = LocalDate.now().minus(40, ChronoUnit.DAYS);
private final Long TEST_EXCHANGE_ORDER_ID = 20007L;
private final BigDecimal TEST_SETTLEMENT_AMOUNT = BigDecimal.valueOf(7777777L);
private final String TEST_COMMENT = "test-comment";
private final Long TEST_CLIENT_CODE_ID = 222222L;
private final String TEST_SETTLEMENT_CODE = "test-settlement-code";
private final LocalDate TEST_SETTLEMENT_DATE = LocalDate.now().minus(22, ChronoUnit.DAYS);
private final Instant TEST_EXCHANGE_EXECUTION_MICROSECONDS = Instant.now().minus(777L, ChronoUnit.SECONDS);
private final BigDecimal TEST_FIRST_LEG_AMOUNT = BigDecimal.valueOf(1L);
private final BigDecimal TEST_SECOND_LEG_AMOUNT = BigDecimal.valueOf(2L);
private final LocalDate TEST_FIRST_LEG_SETTLEMENT_DATE = LocalDate.now().minus(1, ChronoUnit.DAYS);
private final LocalDate TEST_SECOND_LEG_SETTLEMENT_DATE = LocalDate.now().minus(2, ChronoUnit.DAYS);
private final String TEST_FIRST_LEG_SETTLEMENT_CODE = "test-first-leg-settlement-code";
private final String TEST_SECOND_LEG_SETTLEMENT_CODE = "test-second-leg-settlement-code";
private final String TEST_CONTRACT = "test_contract";
private final String TEST_TRADING_CLEARING_REGISTRY_1 = "test-trading-clearing-registry-1";
private final String TEST_TRADING_CLEARING_REGISTRY_2 = "test-trading-clearing-registry-2";
private final BigDecimal TEST_LOT_SIZE_1 = BigDecimal.valueOf(12L);
private final BigDecimal TEST_LOT_SIZE_2 = BigDecimal.valueOf(34L);
private final BigDecimal TEST_NOMINAL_1 = BigDecimal.valueOf(333L);
private final BigDecimal TEST_NOMINAL_2 = BigDecimal.valueOf(444L);
private final BigDecimal TEST_COUPON_1 = BigDecimal.valueOf(3333L);
private final BigDecimal TEST_COUPON_2 = BigDecimal.valueOf(4444L);
private final Long TEST_MONEY_ACCOUNT_1 = 11L;
private final Long TEST_MONEY_ACCOUNT_2 = 12L;
private final Long TEST_DEPO_ACCOUNT_1 = 13L;
private final Long TEST_DEPO_ACCOUNT_2 = 14L;
}

View file

@ -0,0 +1,3 @@
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
"1","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"
"2","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","N","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 1 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 2 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 N 14.05.2023 88 34 888 1 1 777 888

View file

@ -102,6 +102,10 @@ public class TestUtils {
return getJsonBaseRequest(accountRequest, id, ActionType.DELETE);
}
public static <T> String getJsonStringForSystem(T request, long id) {
return getJsonBaseRequest(request, id, ActionType.SYSTEM);
}
private static <T> String getJsonBaseRequest(T accountRequest, long id, ActionType actionType) {
BaseRequest<T> baseRequest = new BaseRequest<>();
baseRequest.setRequestPayload(accountRequest);

View file

@ -12,7 +12,7 @@ public class ReportRequest {
* см. {@link ReportType}
*/
@JsonProperty
protected String reportId;
public String reportId;
public String getReportId() {
return reportId;

View file

@ -15,12 +15,12 @@ public class ReportRequestWithPeriod extends ReportRequest {
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
protected LocalDate startDate;
public LocalDate startDate;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
protected LocalDate endDate;
public LocalDate endDate;
public LocalDate getStartDate() {
return startDate;

View file

@ -10,7 +10,7 @@ public class ReportRequestWithSessionId extends ReportRequest {
* Идентификатор сессии
*/
@JsonProperty
protected Long sessionId;
public Long sessionId;
public Long getSessionId() {
return sessionId;

View file

@ -12,7 +12,7 @@ public class ReportRequestWithSessionIdList extends ReportRequest {
* Идентификатор сессии
*/
@JsonProperty
protected List<Long> sessionId;
public List<Long> sessionId;
public List<Long> getSessionIdList() {
return sessionId;