http://jira.mfd.msk:8088/browse/CLS-608 executionRegisterReport
This commit is contained in:
parent
ed3c08cdeb
commit
227e76a5ce
7 changed files with 444 additions and 13 deletions
|
|
@ -0,0 +1,211 @@
|
||||||
|
package ru.spcex.clearing.registry.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 ExecutionRegisterReport implements CSVReport {
|
||||||
|
@CsvBindByName(column = "Наименование биржи")
|
||||||
|
@CsvBindByPosition(position = 0)
|
||||||
|
private String clearingOrganization;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Дата заключения сделки")
|
||||||
|
@CsvBindByPosition(position = 1)
|
||||||
|
@CsvDate(value = "dd.MM.yyyy")
|
||||||
|
private LocalDate tradingDate;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Дата исполнения")
|
||||||
|
@CsvBindByPosition(position = 2)
|
||||||
|
@CsvDate(value = "dd.MM.yyyy")
|
||||||
|
private LocalDate settlementDate;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Идентификационный номер сделки в Торговой системе")
|
||||||
|
@CsvBindByPosition(position = 3)
|
||||||
|
private Long exchangeExecutionId;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Время заключения сделки в Торговой системе")
|
||||||
|
@CsvBindByPosition(position = 4)
|
||||||
|
@CsvDate(value = "HH:mm:ss")
|
||||||
|
private LocalTime exchangeExecutionTime;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Код БИ")
|
||||||
|
@CsvBindByPosition(position = 5)
|
||||||
|
private String security;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Дата возврата")
|
||||||
|
@CsvBindByPosition(position = 6)
|
||||||
|
@CsvDate(value = "dd.MM.yyyy")
|
||||||
|
private LocalDate refundDate;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Код УК - продавца")
|
||||||
|
@CsvBindByPosition(position = 7)
|
||||||
|
private String sellerCode;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Наименование УК - продавца")
|
||||||
|
@CsvBindByPosition(position = 8)
|
||||||
|
private String seller;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "ТКР продавца")
|
||||||
|
@CsvBindByPosition(position = 9)
|
||||||
|
private String sellerTkr;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Клиринговый код покупателя")
|
||||||
|
@CsvBindByPosition(position = 10)
|
||||||
|
private String buyerCode;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Наименование компании-покупателя")
|
||||||
|
@CsvBindByPosition(position = 11)
|
||||||
|
private String buyer;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Торгово-клиринговый регистр покупателя")
|
||||||
|
@CsvBindByPosition(position = 12)
|
||||||
|
private String buyerTkr;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Сумма сделки")
|
||||||
|
@CsvBindByPosition(position = 13)
|
||||||
|
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
|
||||||
|
private BigDecimal amount;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Количество ценных бумаг")
|
||||||
|
@CsvBindByPosition(position = 14)
|
||||||
|
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
|
||||||
|
private BigDecimal quantity;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "Статус")
|
||||||
|
@CsvBindByPosition(position = 15)
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
|
||||||
|
public String getClearingOrganization() {
|
||||||
|
return clearingOrganization;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClearingOrganization(String clearingOrganization) {
|
||||||
|
this.clearingOrganization = clearingOrganization;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getTradingDate() {
|
||||||
|
return tradingDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTradingDate(LocalDate tradingDate) {
|
||||||
|
this.tradingDate = tradingDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getSettlementDate() {
|
||||||
|
return settlementDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSettlementDate(LocalDate settlementDate) {
|
||||||
|
this.settlementDate = settlementDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getExchangeExecutionId() {
|
||||||
|
return exchangeExecutionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExchangeExecutionId(Long exchangeExecutionId) {
|
||||||
|
this.exchangeExecutionId = exchangeExecutionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalTime getExchangeExecutionTime() {
|
||||||
|
return exchangeExecutionTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExchangeExecutionTime(LocalTime exchangeExecutionTime) {
|
||||||
|
this.exchangeExecutionTime = exchangeExecutionTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSecurity() {
|
||||||
|
return security;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSecurity(String security) {
|
||||||
|
this.security = security;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getRefundDate() {
|
||||||
|
return refundDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRefundDate(LocalDate refundDate) {
|
||||||
|
this.refundDate = refundDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSellerCode() {
|
||||||
|
return sellerCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSellerCode(String sellerCode) {
|
||||||
|
this.sellerCode = sellerCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSeller() {
|
||||||
|
return seller;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSeller(String seller) {
|
||||||
|
this.seller = seller;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSellerTkr() {
|
||||||
|
return sellerTkr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSellerTkr(String sellerTkr) {
|
||||||
|
this.sellerTkr = sellerTkr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBuyerCode() {
|
||||||
|
return buyerCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBuyerCode(String buyerCode) {
|
||||||
|
this.buyerCode = buyerCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBuyer() {
|
||||||
|
return buyer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBuyer(String buyer) {
|
||||||
|
this.buyer = buyer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBuyerTkr() {
|
||||||
|
return buyerTkr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBuyerTkr(String buyerTkr) {
|
||||||
|
this.buyerTkr = buyerTkr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getAmount() {
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAmount(BigDecimal amount) {
|
||||||
|
this.amount = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getQuantity() {
|
||||||
|
return quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuantity(BigDecimal quantity) {
|
||||||
|
this.quantity = quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,117 @@
|
||||||
|
package ru.spcex.clearing.registry.reports.builders;
|
||||||
|
|
||||||
|
import ru.clearing.classes.statics.data.company.Company;
|
||||||
|
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||||
|
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.platform.dictionary.AllowedDictionary;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.registry.reports.bean.ExecutionRegisterReport;
|
||||||
|
import ru.spcex.platform.enumeration.CompanySymbol;
|
||||||
|
import ru.spcex.platform.enumeration.MoneyFlowSide;
|
||||||
|
import ru.spcex.platform.enumeration.Side;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
|
import java.time.LocalTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ExecutionRegisterReportBuilder extends CSVReportBuilder<ExecutionRegisterReport, ExecutionCommon> {
|
||||||
|
private final static DateTimeFormatter yyyyMMddFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
|
||||||
|
|
||||||
|
private final Imdg<Company> companyImdg;
|
||||||
|
private final Imdg<CompanySymbols> companySymbolsImdg;
|
||||||
|
private final Imdg<AllowedDictionary> allowedDictionaryImdg;
|
||||||
|
|
||||||
|
public ExecutionRegisterReportBuilder(ImdgProvider imdgProvider) {
|
||||||
|
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
|
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
||||||
|
allowedDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AllowedDictionary, AllowedDictionary.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String reportName() {
|
||||||
|
return "Реестр договоров";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<ExecutionRegisterReport> getReportClass() {
|
||||||
|
return ExecutionRegisterReport.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ExecutionRegisterReport toRow(ExecutionCommon input) {
|
||||||
|
ExecutionRegisterReport entity = new ExecutionRegisterReport();
|
||||||
|
|
||||||
|
entity.setClearingOrganization("СПВБ");
|
||||||
|
entity.setTradingDate(input.getTradingDate());
|
||||||
|
entity.setExchangeExecutionId(input.getExchangeExecutionId());
|
||||||
|
|
||||||
|
if (input.getSide() != null && input.getCompanyId() != null && input.getCounterPartyId() != null) {
|
||||||
|
CompanySymbols companySymbolsByCompanyId = companySymbolsImdg.getFirstObjectByFieldValues(
|
||||||
|
Map.of(
|
||||||
|
"companySymbol", CompanySymbol.CLRC.getKey(),
|
||||||
|
"companyId", input.getCompanyId()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
CompanySymbols companySymbolsByCounterPartyId = companySymbolsImdg.getFirstObjectByFieldValues(
|
||||||
|
Map.of(
|
||||||
|
"companySymbol", CompanySymbol.CLRC.getKey(),
|
||||||
|
"companyId", input.getCounterPartyId()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
Company companyByCounterPartyId = companyImdg.getSingleObjectByID(input.getCounterPartyId());
|
||||||
|
Company companyByCompanyId = companyImdg.getSingleObjectByID(input.getCompanyId());
|
||||||
|
|
||||||
|
if (Arrays.asList(Side.BUY.getKey(), MoneyFlowSide.BUY.getKey()).contains(input.getSide().toUpperCase())) {
|
||||||
|
if (companyByCounterPartyId != null) {
|
||||||
|
entity.setSeller(companyByCounterPartyId.getShortName());
|
||||||
|
entity.setBuyer(companyByCounterPartyId.getShortName());
|
||||||
|
}
|
||||||
|
entity.setSellerCode(companySymbolsByCounterPartyId.getCompanySymbolValue());
|
||||||
|
entity.setSellerTkr(input.getCounterPartyTradingClearingRegistry());
|
||||||
|
entity.setBuyerCode(companySymbolsByCompanyId.getCompanySymbolValue());
|
||||||
|
entity.setBuyerTkr(input.getPartyTradingClearingRegistry());
|
||||||
|
}
|
||||||
|
if (Arrays.asList(Side.SELL.getKey(), MoneyFlowSide.SELL.getKey()).contains(input.getSide().toUpperCase())) {
|
||||||
|
if (companyByCompanyId != null) {
|
||||||
|
entity.setSeller(companyByCompanyId.getShortName());
|
||||||
|
entity.setBuyer(companyByCompanyId.getShortName());
|
||||||
|
}
|
||||||
|
entity.setSellerCode(companySymbolsByCompanyId.getCompanySymbolValue());
|
||||||
|
entity.setSeller(input.getPartyTradingClearingRegistry());
|
||||||
|
entity.setBuyerCode(companySymbolsByCounterPartyId.getCompanySymbolValue());
|
||||||
|
entity.setBuyerTkr(input.getCounterPartyTradingClearingRegistry());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.getExchangeExecutionTime() != null)
|
||||||
|
entity.setExchangeExecutionTime(LocalTime.from(input.getExchangeExecutionTime().atZone(ZoneId.systemDefault())));
|
||||||
|
|
||||||
|
if (input instanceof ExecutionDeposit deposit) {
|
||||||
|
entity.setSettlementDate(deposit.getFirstLegSettlementDate());
|
||||||
|
entity.setSecurity(deposit.getContract());
|
||||||
|
entity.setRefundDate(deposit.getSecondLegSettlementDate());
|
||||||
|
entity.setAmount(deposit.getFirstLegAmount());
|
||||||
|
} else if (input instanceof ExecutionFond fond) {
|
||||||
|
entity.setSettlementDate(fond.getSettlementDate());
|
||||||
|
entity.setSecurity(fond.getSecuritySymbol());
|
||||||
|
entity.setAmount(fond.getSettlementAmount());
|
||||||
|
entity.setQuantity(fond.getQuantity());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.getCoverageStatus() != null) {
|
||||||
|
AllowedDictionary allowed = allowedDictionaryImdg.getFirstObjectByFieldValues(
|
||||||
|
Map.of("code", input.getCoverageStatus())
|
||||||
|
);
|
||||||
|
if (allowed != null) entity.setStatus(allowed.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -64,7 +64,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme
|
||||||
Producer<String, Object> kafkaProducer,
|
Producer<String, Object> kafkaProducer,
|
||||||
ImdgProvider imdgProvider,
|
ImdgProvider imdgProvider,
|
||||||
Function<Map<String, ?>, IValidator> fieldValuesValidator,
|
Function<Map<String, ?>, IValidator> fieldValuesValidator,
|
||||||
@Qualifier("reportOutDir") File outFolder,
|
@Qualifier("reportOutDir") File outFolder,
|
||||||
RegistryServiceSettings settings,
|
RegistryServiceSettings settings,
|
||||||
SFTPReportsConfig.ReportsGateway reportsSftpGateway) {
|
SFTPReportsConfig.ReportsGateway reportsSftpGateway) {
|
||||||
super(kafkaQueue, kafkaProducer);
|
super(kafkaQueue, kafkaProducer);
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.clearing.classes.statics.data.account.Account;
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||||
|
|
@ -17,6 +18,10 @@ import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
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.QueueConsumer;
|
||||||
|
import ru.spcex.clearing.registry.config.SFTPReportsConfig;
|
||||||
|
import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings;
|
||||||
|
import ru.spcex.clearing.registry.reports.ReportUtils;
|
||||||
|
import ru.spcex.clearing.registry.reports.builders.ExecutionRegisterReportBuilder;
|
||||||
import ru.spcex.clearing.registry.util.PreClearMap;
|
import ru.spcex.clearing.registry.util.PreClearMap;
|
||||||
import ru.spcex.platform.enumeration.CompanySymbol;
|
import ru.spcex.platform.enumeration.CompanySymbol;
|
||||||
import ru.spcex.platform.enumeration.MoneyFlowSide;
|
import ru.spcex.platform.enumeration.MoneyFlowSide;
|
||||||
|
|
@ -26,12 +31,11 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
import ru.spcex.platform.utils.validation.IValidator;
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import static ru.spcex.clearing.imdg.IMDGDistributedNames.*;
|
import static ru.spcex.clearing.imdg.IMDGDistributedNames.*;
|
||||||
|
|
@ -50,11 +54,22 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
|
||||||
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
|
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
|
||||||
private final PreClearMap<ExecutionRegister> preClearMap;
|
private final PreClearMap<ExecutionRegister> preClearMap;
|
||||||
|
|
||||||
|
private final ExecutionRegisterReportBuilder reportBuilder;
|
||||||
|
private final File outFolder;
|
||||||
|
private final RegistryServiceSettings settings;
|
||||||
|
|
||||||
|
private final SFTPReportsConfig.ReportsGateway reportsSftpGateway;
|
||||||
|
private final boolean deleteAfterSend;
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public ExecutionRegisterService(Consumer<String, Object> kafkaQueue,
|
public ExecutionRegisterService(Consumer<String, Object> kafkaQueue,
|
||||||
Producer<String, Object> kafkaProducer,
|
Producer<String, Object> kafkaProducer,
|
||||||
ImdgProvider imdgProvider,
|
ImdgProvider imdgProvider,
|
||||||
Function<Map<String, ?>, IValidator> fieldValuesValidator) {
|
Function<Map<String, ?>, IValidator> fieldValuesValidator,
|
||||||
|
@Qualifier("reportOutDir") File outFolder,
|
||||||
|
RegistryServiceSettings settings,
|
||||||
|
SFTPReportsConfig.ReportsGateway reportsSftpGateway) {
|
||||||
super(kafkaQueue, kafkaProducer);
|
super(kafkaQueue, kafkaProducer);
|
||||||
this.executionRegisterMap = imdgProvider.getImdg(Map_ExecutionRegister, ExecutionRegister.class);
|
this.executionRegisterMap = imdgProvider.getImdg(Map_ExecutionRegister, ExecutionRegister.class);
|
||||||
this.companySymbolsMap = imdgProvider.getImdg(Map_CompanySymbols, CompanySymbols.class);
|
this.companySymbolsMap = imdgProvider.getImdg(Map_CompanySymbols, CompanySymbols.class);
|
||||||
|
|
@ -63,6 +78,11 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
|
||||||
this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
||||||
this.accountImdg = imdgProvider.getImdg(Map_Account, Account.class);
|
this.accountImdg = imdgProvider.getImdg(Map_Account, Account.class);
|
||||||
this.fieldValuesValidator = fieldValuesValidator;
|
this.fieldValuesValidator = fieldValuesValidator;
|
||||||
|
this.settings = settings;
|
||||||
|
this.reportsSftpGateway = reportsSftpGateway;
|
||||||
|
this.outFolder = outFolder;
|
||||||
|
reportBuilder = new ExecutionRegisterReportBuilder(imdgProvider);
|
||||||
|
deleteAfterSend = settings.getReportsStore().isDeleteAfterSend();
|
||||||
preClearMap = PreClearMap.instanceForInstantField(executionRegisterMap, "created");
|
preClearMap = PreClearMap.instanceForInstantField(executionRegisterMap, "created");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,6 +102,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
|
||||||
}
|
}
|
||||||
|
|
||||||
public void executionRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
|
public void executionRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
|
||||||
|
boolean csvMode = settings.isCsvMode();
|
||||||
LocalDate localDateNow = LocalDate.now();
|
LocalDate localDateNow = LocalDate.now();
|
||||||
log.debug("ExecutionRegisterNewRequest received");
|
log.debug("ExecutionRegisterNewRequest received");
|
||||||
Collection<ExecutionFond> collectionFond = executionFondMap.getCollectionObjectsByFieldValues(
|
Collection<ExecutionFond> collectionFond = executionFondMap.getCollectionObjectsByFieldValues(
|
||||||
|
|
@ -96,13 +117,21 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
|
||||||
));
|
));
|
||||||
log.debug("Found {} ExecutionFond and {} ExecutionDeposit on clearingDate={}",
|
log.debug("Found {} ExecutionFond and {} ExecutionDeposit on clearingDate={}",
|
||||||
collectionFond.size(), collectionDeposit.size(), localDateNow);
|
collectionFond.size(), collectionDeposit.size(), localDateNow);
|
||||||
preClearMap.preClearMap();
|
if (!csvMode) preClearMap.preClearMap();
|
||||||
|
List<ExecutionCommon> executionCommonForReport = new ArrayList<>();
|
||||||
collectionFond.forEach(x -> {
|
collectionFond.forEach(x -> {
|
||||||
insertExecutionRegister(true, x);
|
if (!csvMode) insertExecutionRegister(true, x);
|
||||||
|
else executionCommonForReport.add(x);
|
||||||
});
|
});
|
||||||
collectionDeposit.forEach(x -> {
|
collectionDeposit.forEach(x -> {
|
||||||
insertExecutionRegister(false, x);
|
if (!csvMode) insertExecutionRegister(false, x);
|
||||||
|
else executionCommonForReport.add(x);
|
||||||
});
|
});
|
||||||
|
if (csvMode) {
|
||||||
|
File reportFile = reportBuilder.buildReport(executionCommonForReport, outFolder);
|
||||||
|
ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend);
|
||||||
|
}
|
||||||
|
|
||||||
log.debug("successfully processed...");
|
log.debug("successfully processed...");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package ru.spcex.clearing.registry.service;
|
package ru.spcex.clearing.registry.service;
|
||||||
|
|
||||||
|
import com.opencsv.exceptions.CsvValidationException;
|
||||||
import org.apache.kafka.clients.consumer.MockConsumer;
|
import org.apache.kafka.clients.consumer.MockConsumer;
|
||||||
import org.apache.kafka.clients.producer.Producer;
|
import org.apache.kafka.clients.producer.Producer;
|
||||||
import org.junit.jupiter.api.MethodOrderer;
|
import org.junit.jupiter.api.MethodOrderer;
|
||||||
|
|
@ -7,6 +8,7 @@ import org.junit.jupiter.api.Order;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.TestMethodOrder;
|
import org.junit.jupiter.api.TestMethodOrder;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
|
@ -19,7 +21,10 @@ import ru.clearing.classes.statics.data.register.ExecutionRegister;
|
||||||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
||||||
|
import ru.spcex.clearing.registry.config.SFTPTestConfig;
|
||||||
|
import ru.spcex.clearing.registry.config.TestConfig;
|
||||||
import ru.spcex.clearing.registry.config.ValidationConfig;
|
import ru.spcex.clearing.registry.config.ValidationConfig;
|
||||||
|
import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings;
|
||||||
import ru.spcex.clearing.test.TestUtils;
|
import ru.spcex.clearing.test.TestUtils;
|
||||||
import ru.spcex.clearing.test.config.ImdgTestConfig;
|
import ru.spcex.clearing.test.config.ImdgTestConfig;
|
||||||
import ru.spcex.clearing.test.config.KafkaTestConfig;
|
import ru.spcex.clearing.test.config.KafkaTestConfig;
|
||||||
|
|
@ -30,12 +35,14 @@ import ru.spcex.platform.enumeration.Task;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.ZoneOffset;
|
import java.time.ZoneOffset;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
|
@ -46,9 +53,11 @@ import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
ExecutionRegisterService.class,
|
ExecutionRegisterService.class,
|
||||||
ImdgTestConfig.class,
|
ImdgTestConfig.class,
|
||||||
KafkaTestConfig.class,
|
KafkaTestConfig.class,
|
||||||
|
TestConfig.class,
|
||||||
|
SFTPTestConfig.class
|
||||||
})
|
})
|
||||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||||
class ExecutionRegisterServiceTest {
|
class ExecutionRegisterServiceTest implements InitializingBean {
|
||||||
LocalDate TRADING_DATE = LocalDate.of(2020, 1, 1);
|
LocalDate TRADING_DATE = LocalDate.of(2020, 1, 1);
|
||||||
Instant EXCHANGE_EXECUTION_TIME = LocalDate.of(2020, 1, 1).atStartOfDay().toInstant(ZoneOffset.UTC);
|
Instant EXCHANGE_EXECUTION_TIME = LocalDate.of(2020, 1, 1).atStartOfDay().toInstant(ZoneOffset.UTC);
|
||||||
Long COUNTER_PARTY_ID = 888L;
|
Long COUNTER_PARTY_ID = 888L;
|
||||||
|
|
@ -89,6 +98,9 @@ class ExecutionRegisterServiceTest {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ExecutionRegisterService executionRegisterService;
|
private ExecutionRegisterService executionRegisterService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RegistryServiceSettings settings;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@Qualifier("hazelcastServiceTest")
|
@Qualifier("hazelcastServiceTest")
|
||||||
private ImdgProvider imdgProvider;
|
private ImdgProvider imdgProvider;
|
||||||
|
|
@ -97,8 +109,13 @@ class ExecutionRegisterServiceTest {
|
||||||
@Qualifier("mockProducer")
|
@Qualifier("mockProducer")
|
||||||
private Producer<String, Object> producer;
|
private Producer<String, Object> producer;
|
||||||
|
|
||||||
@PostConstruct
|
@Autowired
|
||||||
private void init() {
|
@Qualifier("reportOutDir")
|
||||||
|
private File outFolder;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterPropertiesSet() throws Exception {
|
||||||
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
|
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
|
||||||
|
|
||||||
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
|
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
|
||||||
|
|
@ -147,9 +164,56 @@ class ExecutionRegisterServiceTest {
|
||||||
companySymbolsImdg.insert(companySymbolsForCounterPartyId);
|
companySymbolsImdg.insert(companySymbolsForCounterPartyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(3)
|
||||||
|
void executionRegisterNewForClearingDate_CSV() throws IOException, CsvValidationException {
|
||||||
|
ReportTestUtils.resetDir(outFolder);
|
||||||
|
boolean oldCsvMode = settings.isCsvMode();
|
||||||
|
settings.setCsvMode(true);
|
||||||
|
|
||||||
|
ExecutionFond executionFond = new ExecutionFond();
|
||||||
|
executionFond.setClearingDate(LocalDate.now());
|
||||||
|
executionFond.setTradingDate(TRADING_DATE);
|
||||||
|
executionFond.setExchangeExecutionId(EXCHANGE_EXECUTION_ID);
|
||||||
|
executionFond.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME);
|
||||||
|
executionFond.setSecurityId(SECURITY_ID);
|
||||||
|
executionFond.setSettlementAmount(SETTLEMENT_AMOUNT);
|
||||||
|
executionFond.setQuantity(QUANTITY);
|
||||||
|
executionFond.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID);
|
||||||
|
executionFond.setTradingClearingRegistryId(TKR_FOR_TKR_ID);
|
||||||
|
executionFond.setCompanyId(COMPANY_ID);
|
||||||
|
executionFond.setCounterPartyId(COUNTER_PARTY_ID);
|
||||||
|
executionFond.setSide(Side.SELL.getKey());
|
||||||
|
executionFond.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR);
|
||||||
|
executionFond.setPartyTradingClearingRegistry(PARTY_TKR);
|
||||||
|
executionFondImdg.insert(executionFond);
|
||||||
|
|
||||||
|
LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest();
|
||||||
|
|
||||||
|
String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L);
|
||||||
|
|
||||||
|
TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(),
|
||||||
|
Task.createRegistry_ECNR.topic(),
|
||||||
|
requestCount++,
|
||||||
|
0,
|
||||||
|
jsonString);
|
||||||
|
|
||||||
|
TestUtils.waitingSendAndCheckRecord(0L, producer);
|
||||||
|
|
||||||
|
File outFile = outFolder.listFiles()[0];
|
||||||
|
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/execution_register_expected.csv").getFile());
|
||||||
|
ReportTestUtils.compareCSVFiles(expectedFile, outFile, List.of());
|
||||||
|
|
||||||
|
executionFondImdg.delete(executionFond);
|
||||||
|
settings.setCsvMode(oldCsvMode);
|
||||||
|
ReportTestUtils.deleteDir(outFolder);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Order(2)
|
@Order(2)
|
||||||
void executionRegisterNewForClearingDate() {
|
void executionRegisterNewForClearingDate() {
|
||||||
|
boolean oldCsvMode = settings.isCsvMode();
|
||||||
|
settings.setCsvMode(false);
|
||||||
|
|
||||||
ExecutionFond executionFond = new ExecutionFond();
|
ExecutionFond executionFond = new ExecutionFond();
|
||||||
executionFond.setClearingDate(LocalDate.now());
|
executionFond.setClearingDate(LocalDate.now());
|
||||||
|
|
@ -201,11 +265,16 @@ class ExecutionRegisterServiceTest {
|
||||||
assertEquals(executionRegister.getClearingDate(), LocalDate.now());
|
assertEquals(executionRegister.getClearingDate(), LocalDate.now());
|
||||||
|
|
||||||
executionFondImdg.delete(executionFond);
|
executionFondImdg.delete(executionFond);
|
||||||
|
|
||||||
|
settings.setCsvMode(oldCsvMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Order(1)
|
@Order(1)
|
||||||
void executionRegisterNewFromRequest() {
|
void executionRegisterNewFromRequest() {
|
||||||
|
boolean oldCsvMode = settings.isCsvMode();
|
||||||
|
settings.setCsvMode(false);
|
||||||
|
|
||||||
ExecutionDeposit executionDeposit = new ExecutionDeposit();
|
ExecutionDeposit executionDeposit = new ExecutionDeposit();
|
||||||
executionDeposit.setClearingDate(LocalDate.now());
|
executionDeposit.setClearingDate(LocalDate.now());
|
||||||
executionDeposit.setTradingDate(TRADING_DATE);
|
executionDeposit.setTradingDate(TRADING_DATE);
|
||||||
|
|
@ -256,5 +325,8 @@ class ExecutionRegisterServiceTest {
|
||||||
assertEquals(executionRegister.getClearingDate(), LocalDate.now());
|
assertEquals(executionRegister.getClearingDate(), LocalDate.now());
|
||||||
|
|
||||||
executionDepositImdg.delete(executionDeposit);
|
executionDepositImdg.delete(executionDeposit);
|
||||||
|
|
||||||
|
settings.setCsvMode(oldCsvMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
"Номер распоряжения","Дата распоряжения","Время формирования","Номер торгового банковского/клирингового счета списания","Наименование владельца счета списания","Код владельца счета списания","Номер торгового банковского/клирингового счета зачисления","Наименование владельца счета зачисления","Код владельца счета зачисления","Код ЦБ","Количество ЦБ"
|
"Номер распоряжения","Дата распоряжения","Время формирования","Номер торгового банковского/клирингового счета списания","Наименование владельца счета списания","Код владельца счета списания","Номер торгового банковского/клирингового счета зачисления","Наименование владельца счета зачисления","Код владельца счета зачисления","Код ЦБ","Количество ЦБ"
|
||||||
"1","29.12.2023",,,,,,,,,"1.00"
|
"1","29.12.2023",,,,,,,,,"1"
|
||||||
|
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
"Наименование биржи","Дата заключения сделки","Дата исполнения","Идентификационный номер сделки в Торговой системе","Время заключения сделки в Торговой системе","Код БИ","Дата возврата","Код УК - продавца","Наименование УК - продавца","ТКР продавца","Клиринговый код покупателя","Наименование компании-покупателя","Торгово-клиринговый регистр покупателя","Сумма сделки","Количество ценных бумаг","Статус"
|
||||||
|
"СПВБ","01.01.2020",,"777","03:00:00",,,"COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID","PARTY_TKR",,"COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID",,"COUNTER_PARTY_TKR","777.00","888.00",
|
||||||
|
Loading…
Add table
Reference in a new issue