ExecutedDealReport, OperationalLiabilitiesClaimsReport, OperationalMoneyChangeReport, UnfulfilledDealReport
This commit is contained in:
parent
6c78081607
commit
c3a1cc41de
10 changed files with 736 additions and 143 deletions
|
|
@ -0,0 +1,115 @@
|
|||
package ru.spcex.clearing.reports.reports;
|
||||
|
||||
import com.opencsv.CSVWriterBuilder;
|
||||
import com.opencsv.ICSVWriter;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Класс для построения отчетов в формате CSV
|
||||
*
|
||||
* @param <P> тип параметров, используемых при построении отчета
|
||||
*/
|
||||
public abstract class CSVReportBuilder<P> {
|
||||
protected static final Logger log = LoggerFactory.getLogger(CSVReportBuilder.class);
|
||||
|
||||
protected DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
|
||||
protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
|
||||
protected DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
|
||||
|
||||
/**
|
||||
* Метод получения заголовков для CSV отчета
|
||||
*/
|
||||
protected abstract String[] getHeaders();
|
||||
|
||||
/**
|
||||
* Возвращает списком значения CSV отчета. Каждый элемент списка - строка, элемент массива внутри списка - столбец.
|
||||
*/
|
||||
protected abstract List<String[]> getLines();
|
||||
|
||||
/**
|
||||
* Название отчета, используется для формирования имени отчета
|
||||
*
|
||||
* @param params Параметры формирования отчета
|
||||
*/
|
||||
protected abstract String getReportFilename(P params);
|
||||
|
||||
/**
|
||||
* Тип отчета по {@link ReportType}
|
||||
*/
|
||||
protected abstract ReportType getReportType();
|
||||
|
||||
/**
|
||||
* Формирование отчета на основе параметров
|
||||
*
|
||||
* @param params Параметры формирования отчета
|
||||
*/
|
||||
protected abstract void collect(P params);
|
||||
|
||||
/**
|
||||
* Создает CSVWriter. Если требуется изменить параметры выходного CSV файла, этот метод следует переопределить.
|
||||
*
|
||||
* @param file Файл отчета
|
||||
* @return Созданный CSVWriter
|
||||
*
|
||||
* todo check it
|
||||
*/
|
||||
protected ICSVWriter createCsvWriter(File file) throws IOException {
|
||||
Writer writer = new FileWriter(file);
|
||||
CSVWriterBuilder csvWriterBuilder = new CSVWriterBuilder(writer)
|
||||
.withLineEnd("\n")
|
||||
.withSeparator(',')
|
||||
.withQuoteChar('\'')
|
||||
.withEscapeChar('\"');
|
||||
return csvWriterBuilder.build();
|
||||
}
|
||||
|
||||
public File createReport(P params, File outFolder) {
|
||||
assert outFolder != null && outFolder.isDirectory();
|
||||
|
||||
File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename(params)));
|
||||
|
||||
collect(params);
|
||||
String[] headers = getHeaders();
|
||||
List<String[]> lines = getLines();
|
||||
|
||||
assert headers != null;
|
||||
assert lines != null;
|
||||
|
||||
try (ICSVWriter csvWriter = createCsvWriter(reportFile)) {
|
||||
csvWriter.writeNext(headers);
|
||||
csvWriter.writeAll(lines, true);
|
||||
} catch (IOException e) {
|
||||
// todo check it
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return reportFile;
|
||||
}
|
||||
|
||||
protected String normalizeFilenameForOS(String filename) {
|
||||
if (System.getProperty("os.name").toLowerCase().contains("windows"))
|
||||
return filename.replace(":", "_");
|
||||
return filename;
|
||||
}
|
||||
|
||||
public void setDateFormatter(DateTimeFormatter dateFormatter) {
|
||||
this.dateFormatter = dateFormatter;
|
||||
}
|
||||
|
||||
public void setDateTimeFormatter(DateTimeFormatter dateTimeFormatter) {
|
||||
this.dateTimeFormatter = dateTimeFormatter;
|
||||
}
|
||||
|
||||
public void setTimeFormatter(DateTimeFormatter timeFormatter) {
|
||||
this.timeFormatter = timeFormatter;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
package ru.spcex.clearing.reports.reports;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* Параметры для формирования отчета на период
|
||||
*/
|
||||
public class PeriodParams {
|
||||
private LocalDate startDate;
|
||||
private LocalDate endDate;
|
||||
|
||||
public LocalDate getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public void setStartDate(LocalDate startDate) {
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package ru.spcex.clearing.reports.reports;
|
||||
|
||||
/**
|
||||
* Параметры для формирования отчета по SessionId
|
||||
*/
|
||||
public class SessionIdParam {
|
||||
private Long sessionId;
|
||||
|
||||
public Long getSessionId() {
|
||||
return sessionId;
|
||||
}
|
||||
|
||||
public void setSessionId(Long sessionId) {
|
||||
this.sessionId = sessionId;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
package ru.spcex.clearing.reports.reports.bp;
|
||||
|
||||
import ru.spcex.clearing.reports.reports.ReportId;
|
||||
import ru.spcex.clearing.reports.reports.ReportWithPeriod;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public class ExecutedDealReport extends ReportWithPeriod {
|
||||
|
||||
private final String[] headers = {
|
||||
"id", "securityId", "tradeNo", "tradeDate", "tradeTime", "settleDate", "settleCode", "price", "quanity", "value"
|
||||
};
|
||||
|
||||
public ExecutedDealReport(LocalDate startDate, LocalDate endDate) {
|
||||
super(ReportId.EXECUTED_DEAL_REPORT,
|
||||
"0.0.1",
|
||||
"BP",
|
||||
"Реестр сделок, принятых на клиринг",
|
||||
startDate,
|
||||
endDate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReportName(LocalDateTime reportDateTime) {
|
||||
return "executed_deal_report.%s-%s.%s".formatted(
|
||||
DATE_FORMATTER.format(startDate),
|
||||
DATE_FORMATTER.format(endDate),
|
||||
DATE_TIME_FORMATTER.format(reportDateTime)
|
||||
);
|
||||
}
|
||||
|
||||
public String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
public record InfoExecutedDeal(String id, String securityId, String tradeNo, String tradeDate, String tradeTime,
|
||||
String settleDate, String settleCode, String price, String quanity, String value) {
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
package ru.spcex.clearing.reports.reports.bp;
|
||||
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionFond;
|
||||
import ru.clearing.classes.statics.data.misc.STrades;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.SessionIdParam;
|
||||
import ru.spcex.platform.enumeration.Allowed;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ExecutedDealReportBuilder extends CSVReportBuilder<SessionIdParam> {
|
||||
private final Imdg<ExecutionFond> executionFondImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<STrades> sTradesImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"id", "securityId", "tradeNo", "tradeDate", "tradeTime",
|
||||
"settleDate", "settleCode", "price", "quanity", "value"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public ExecutedDealReportBuilder(ImdgProvider imdgProvider) {
|
||||
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
||||
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
this.sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(SessionIdParam params) {
|
||||
return "executed_deal_report.%s".formatted(LocalDateTime.now());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReportType getReportType() {
|
||||
return ReportType.EXECUTED_DEAL_REPORT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(SessionIdParam params) {
|
||||
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
|
||||
ImdgPredicate predicate = pb.and(
|
||||
pb.equals("sessionId", params.getSessionId()),
|
||||
pb.equals("coverageStatus", Allowed.DENIED.getKey())
|
||||
);
|
||||
Collection<ExecutionFond> executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate);
|
||||
|
||||
lines = new ArrayList<>(executionFonds.size());
|
||||
for (ExecutionFond executionFond : executionFonds) {
|
||||
Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
|
||||
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
|
||||
STrades sTrade = sTradesImdg.getSingleObjectByFieldValues(
|
||||
Map.of(
|
||||
"tradeNum", executionFond.getExchangeExecutionId(),
|
||||
"operation", executionFond.getSide()
|
||||
)
|
||||
);
|
||||
|
||||
String id = String.valueOf(executionFond.getId());
|
||||
String securityId = String.valueOf(executionFond.getSecurityId());
|
||||
String tradeNo = String.valueOf(executionFond.getExchangeExecutionId());
|
||||
String tradeDate = dateFormatter.format(executionFond.getTradingDate());
|
||||
String tradeTime = dateFormatter.format(executionFond.getCreated());
|
||||
String settleDate = dateFormatter.format(executionFond.getSettlementDate());
|
||||
String settleCode = sTrade != null ? sTrade.getSettleCode() : "";
|
||||
String quantity = String.valueOf(executionFond.getQuantity());
|
||||
String value = String.valueOf(executionFond.getSettlementAmount());
|
||||
String price = String.valueOf(executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP));
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = id;
|
||||
line[valueIdx++] = securityId;
|
||||
line[valueIdx++] = tradeNo;
|
||||
line[valueIdx++] = tradeDate;
|
||||
line[valueIdx++] = tradeTime;
|
||||
line[valueIdx++] = settleDate;
|
||||
line[valueIdx++] = settleCode;
|
||||
line[valueIdx++] = price;
|
||||
line[valueIdx++] = quantity;
|
||||
line[valueIdx++] = value;
|
||||
lines.add(line);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
package ru.spcex.clearing.reports.reports.bp;
|
||||
|
||||
import ru.spcex.clearing.reports.reports.ReportId;
|
||||
import ru.spcex.clearing.reports.reports.ReportWithPeriod;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
// todo check typo
|
||||
public class OperationalLiabilitiesClaimsReport extends ReportWithPeriod {
|
||||
|
||||
private final String[] headers = {
|
||||
"id", "doc_date", "doc_time", "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"
|
||||
};
|
||||
|
||||
public OperationalLiabilitiesClaimsReport(LocalDate startDate, LocalDate endDate) {
|
||||
super(ReportId.OPERATIONAL_LIABILITIES_CLAIMS,
|
||||
"0.0.1",
|
||||
"BP2",
|
||||
"Операционный отчет. Отчет об обязательствах",
|
||||
startDate,
|
||||
endDate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReportName(LocalDateTime reportDateTime) {
|
||||
return "operational_liabilities_claims.%s-%s.%s".formatted(
|
||||
DATE_FORMATTER.format(startDate),
|
||||
DATE_FORMATTER.format(endDate),
|
||||
DATE_TIME_FORMATTER.format(reportDateTime)
|
||||
);
|
||||
}
|
||||
|
||||
public String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
public record InfoOperationalLiabilitiesClaims(String id, String docDate, String docTime, String docName,
|
||||
String docType, String clearingHouse, String firmId, String firName,
|
||||
String sessionId, String clearingDate, String clearingTime,
|
||||
String trdAccId, String account, String depoAccount, String currency,
|
||||
String trId, String securityId, String trBuySell, String trDate,
|
||||
String trExecDate, String execStatus, String repaymDate, String trPrice,
|
||||
String nominal, String lotValue, String trLot, String trQuantity,
|
||||
String trValue, String trAccruedInt, String accruedInt, String trClrComm,
|
||||
String trExhComm, String cashLiability, String depoLiability,
|
||||
String cashNetto, String depoNetto) {
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,263 @@
|
|||
package ru.spcex.clearing.reports.reports.bp;
|
||||
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionFond;
|
||||
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
|
||||
import ru.clearing.classes.statics.data.misc.Listing;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.SessionIdParam;
|
||||
import ru.spcex.platform.enumeration.Market;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
import ru.spcex.platform.enumeration.Side;
|
||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
|
||||
import java.math.RoundingMode;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
// todo check typo
|
||||
public class OperationalLiabilitiesClaimsReportBuilder extends CSVReportBuilder<SessionIdParam> {
|
||||
private final Imdg<ExecutionFond> executionFondImdg;
|
||||
private final Imdg<ExecutionDeposit> executionDepositImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Listing> listingImdg;
|
||||
private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
|
||||
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
|
||||
|
||||
private final String[] headers = {
|
||||
"id", "doc_date", "doc_time", "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"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
public OperationalLiabilitiesClaimsReportBuilder(ImdgProvider imdgProvider) {
|
||||
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
||||
this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
|
||||
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
|
||||
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(
|
||||
IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class
|
||||
);
|
||||
this.tradingClearingRegistryImdg = imdgProvider.getImdg(
|
||||
IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(SessionIdParam params) {
|
||||
return "operational_liabilities_claims.%s".formatted(LocalDateTime.now());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReportType getReportType() {
|
||||
return ReportType.OPERATIONAL_LIABILITIES_CLAIMS;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(SessionIdParam params) {
|
||||
ImdgPredicate executionFondPredicate = executionFondImdg
|
||||
.predicateBuilder()
|
||||
.equals("sessionId", params.getSessionId());
|
||||
Collection<ExecutionFond> executionFonds = executionFondImdg.getCollectionObjectsByPredicate(executionFondPredicate);
|
||||
|
||||
ImdgPredicate executionDepositPredicate = executionDepositImdg
|
||||
.predicateBuilder()
|
||||
.equals("sessionId", params.getSessionId());
|
||||
Collection<ExecutionDeposit> executionDeposits = executionDepositImdg.getCollectionObjectsByPredicate(executionDepositPredicate);
|
||||
|
||||
List<ExecutionCommon> executions = new ArrayList<>(executionFonds.size() + executionDeposits.size());
|
||||
executions.addAll(executionFonds);
|
||||
executions.addAll(executionDeposits);
|
||||
|
||||
Company clearingHouseCompany = companyImdg.getSingleObjectByID(1L);
|
||||
String clearingHouse = clearingHouseCompany.getFullName();
|
||||
|
||||
Instant now = Instant.now();
|
||||
lines = new ArrayList<>(executions.size());
|
||||
for (ExecutionCommon execution : executions) {
|
||||
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
|
||||
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
|
||||
|
||||
Registry registry = registryImdg.getSingleObjectByFieldValues(Map.of("companyId", execution.getCompanyId()));
|
||||
Collection<Registry> registriesForSessionId = registryImdg.getCollectionObjectsByFieldValues(
|
||||
Map.of("sessionId", execution.getSessionId())
|
||||
);
|
||||
Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", execution.getSecurityId()));
|
||||
FixedIncomeSecurity fixedIncomeSecurity = fixedIncomeSecurityImdg.getSingleObjectByFieldValues(
|
||||
Map.of("securityId", execution.getSecurityId())
|
||||
);
|
||||
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(
|
||||
execution.getTradingClearingRegistryId()
|
||||
);
|
||||
|
||||
String id = String.valueOf(execution.getId());
|
||||
String docDate = dateFormatter.format(now);
|
||||
String docTime = timeFormatter.format(now);
|
||||
String docName = "Отчет об обязательствах/требованиях Участника клиринга";
|
||||
String docType = "KS_FIRMID_LIABILITIES";
|
||||
String firmId = String.valueOf(execution.getCompanyId());
|
||||
String firName = company.getFullName();
|
||||
String sessionId = String.valueOf(execution.getSessionId());
|
||||
String clearingDate = dateFormatter.format(execution.getClearingDate());
|
||||
String trdAccId = registry.getTradingClearingRegistry();
|
||||
String account = String.valueOf(tradingClearingRegistry.getMoneyAccountId());
|
||||
String depoAccount = String.valueOf(tradingClearingRegistry.getDepoAaccountId());
|
||||
String currency = execution.getSettlementCurrency();
|
||||
String trId = String.valueOf(execution.getExchangeExecutionId());
|
||||
String securityId = String.valueOf(execution.getSecurityId());
|
||||
|
||||
String trBuySell = "";
|
||||
if (Side.BUY.equalsByKey(execution.getSide()))
|
||||
trBuySell = "B";
|
||||
else if (Side.SELL.equalsByKey(execution.getSide()))
|
||||
trBuySell = "S";
|
||||
String trDate = dateFormatter.format(execution.getTradingDate());
|
||||
|
||||
String trExecDate = "";
|
||||
String execStatus = "";
|
||||
String repaymDate = "";
|
||||
String trPrice = "";
|
||||
String nominal = "";
|
||||
String trQuantity = "";
|
||||
String trValue = "";
|
||||
String trAccruedInt = "";
|
||||
String accruedInt = "";
|
||||
String cashLiability = "";
|
||||
String depoLiability = "";
|
||||
if (execution instanceof ExecutionDeposit executionDeposit) {
|
||||
trExecDate = dateFormatter.format(executionDeposit.getSecondLegSettlementDate());
|
||||
if (Market.mkrs.equalsByKey(execution.getMarket())) {
|
||||
execStatus = "Y";
|
||||
repaymDate = dateFormatter.format(executionDeposit.getSecondLegSettlementDate());
|
||||
trPrice = String.valueOf(executionDeposit.getPrice());
|
||||
trValue = String.valueOf(executionDeposit.getFirstLegAmount());
|
||||
cashLiability = String.valueOf(executionDeposit.getFirstLegAmount());
|
||||
}
|
||||
} else if (execution instanceof ExecutionFond executionFond) {
|
||||
trExecDate = dateFormatter.format(executionFond.getSettlementDate());
|
||||
if (Market.fond.equalsByKey(execution.getMarket())) {
|
||||
trPrice = String.valueOf(
|
||||
executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP)
|
||||
);
|
||||
trQuantity = String.valueOf(executionFond.getQuantity());
|
||||
nominal = String.valueOf(fixedIncomeSecurity.getNominalValue());
|
||||
trValue = String.valueOf(executionFond.getSettlementAmount());
|
||||
trAccruedInt = String.valueOf(fixedIncomeSecurity.getCoupon());
|
||||
accruedInt = String.valueOf(
|
||||
fixedIncomeSecurity.getCoupon().divide(executionFond.getQuantity(), RoundingMode.HALF_UP)
|
||||
);
|
||||
cashLiability = String.valueOf(executionFond.getSettlementAmount());
|
||||
depoLiability = String.valueOf(executionFond.getQuantity());
|
||||
}
|
||||
}
|
||||
|
||||
String lotValue = String.valueOf(listing.getLotSize());
|
||||
String trLot = String.valueOf(execution.getLots());
|
||||
String trClrComm = "";
|
||||
String trExhComm = "";
|
||||
|
||||
Registry tm_tRegistry = null;
|
||||
Registry om_tRegistry = null;
|
||||
Registry ts_tRegistry = null;
|
||||
Registry os_tRegistry = null;
|
||||
for (Registry currRegistry : registriesForSessionId) {
|
||||
String registryCode = currRegistry.getRegistryCode();
|
||||
if (registryCode.endsWith("T")) {
|
||||
if (registryCode.startsWith("TM")) {
|
||||
if (tm_tRegistry != null && tm_tRegistry.getUpdatedAt().isAfter(currRegistry.getUpdatedAt())) continue;
|
||||
tm_tRegistry = currRegistry;
|
||||
}
|
||||
if (registryCode.startsWith("OM")) {
|
||||
if (om_tRegistry != null && om_tRegistry.getUpdatedAt().isAfter(currRegistry.getUpdatedAt())) continue;
|
||||
om_tRegistry = currRegistry;
|
||||
}
|
||||
if (registryCode.startsWith("TS")) {
|
||||
if (ts_tRegistry != null && ts_tRegistry.getUpdatedAt().isAfter(currRegistry.getUpdatedAt())) continue;
|
||||
ts_tRegistry = currRegistry;
|
||||
}
|
||||
if (registryCode.startsWith("OS")) {
|
||||
if (os_tRegistry != null && os_tRegistry.getUpdatedAt().isAfter(currRegistry.getUpdatedAt())) continue;
|
||||
os_tRegistry = currRegistry;
|
||||
}
|
||||
}
|
||||
}
|
||||
String cashNetto = "";
|
||||
if (tm_tRegistry != null && om_tRegistry != null) {
|
||||
cashNetto = String.valueOf(tm_tRegistry.getBalance().subtract(om_tRegistry.getBalance()));
|
||||
}
|
||||
|
||||
String depoNetto = "";
|
||||
if (ts_tRegistry != null && os_tRegistry != null) {
|
||||
depoNetto = String.valueOf(ts_tRegistry.getBalance().subtract(os_tRegistry.getBalance()));
|
||||
}
|
||||
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = id;
|
||||
line[valueIdx++] = docDate;
|
||||
line[valueIdx++] = docTime;
|
||||
line[valueIdx++] = docName;
|
||||
line[valueIdx++] = docType;
|
||||
line[valueIdx++] = clearingHouse;
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = firName;
|
||||
line[valueIdx++] = sessionId;
|
||||
line[valueIdx++] = clearingDate;
|
||||
line[valueIdx++] = trdAccId;
|
||||
line[valueIdx++] = account;
|
||||
line[valueIdx++] = depoAccount;
|
||||
line[valueIdx++] = currency;
|
||||
line[valueIdx++] = trId;
|
||||
line[valueIdx++] = securityId;
|
||||
line[valueIdx++] = trBuySell;
|
||||
line[valueIdx++] = trDate;
|
||||
line[valueIdx++] = trExecDate;
|
||||
line[valueIdx++] = execStatus;
|
||||
line[valueIdx++] = repaymDate;
|
||||
line[valueIdx++] = trPrice;
|
||||
line[valueIdx++] = nominal;
|
||||
line[valueIdx++] = lotValue;
|
||||
line[valueIdx++] = trLot;
|
||||
line[valueIdx++] = trQuantity;
|
||||
line[valueIdx++] = trValue;
|
||||
line[valueIdx++] = trAccruedInt;
|
||||
line[valueIdx++] = accruedInt;
|
||||
line[valueIdx++] = trClrComm;
|
||||
line[valueIdx++] = trExhComm;
|
||||
line[valueIdx++] = cashLiability;
|
||||
line[valueIdx++] = depoLiability;
|
||||
line[valueIdx++] = cashNetto;
|
||||
line[valueIdx] = depoNetto;
|
||||
lines.add(line);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,49 +1,148 @@
|
|||
package ru.spcex.clearing.reports.reports.bp;
|
||||
|
||||
import ru.spcex.clearing.reports.reports.ReportId;
|
||||
import ru.spcex.clearing.reports.reports.ReportWithPeriod;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.misc.Listing;
|
||||
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.classes.statics.data.statement.Statement;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.PeriodParams;
|
||||
import ru.spcex.platform.enumeration.InOutDirection;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class OperationalMoneyChangeReport extends ReportWithPeriod {
|
||||
|
||||
public class OperationalMoneyChangeReport extends CSVReportBuilder<PeriodParams> {
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<Listing> listingImdg;
|
||||
private final Imdg<Statement> statementImdg;
|
||||
private final Imdg<PaymentInstruction> paymentInstructionImdg;
|
||||
private final String[] headers = {
|
||||
"id", "doc_date", "doc_time", "doc_name", "doc_type", "clearingHouse", "firmId", "firName", "trdAccId",
|
||||
"account", "currency", "registry_code", "registry_name", "open_balance", "change_balance", "add_withdraw",
|
||||
"close_balance", "remarks", "add_sum", "add_time", "withdraw_sum", "withdraw_time"
|
||||
};
|
||||
private List<String[]> lines = null;
|
||||
|
||||
|
||||
public OperationalMoneyChangeReport(LocalDate startDate, LocalDate endDate) {
|
||||
super(ReportId.OPERATIONAL_MONEY_CHANGE,
|
||||
"0.0.1",
|
||||
"BP3",
|
||||
"Операционный отчет. Отчет о денежных средствах",
|
||||
startDate,
|
||||
endDate);
|
||||
public OperationalMoneyChangeReport(ImdgProvider imdgProvider) {
|
||||
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
|
||||
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
|
||||
this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReportName(LocalDateTime reportDateTime) {
|
||||
return "operational_money_change.%s-%s.%s".formatted(
|
||||
DATE_FORMATTER.format(startDate),
|
||||
DATE_FORMATTER.format(endDate),
|
||||
DATE_TIME_FORMATTER.format(reportDateTime)
|
||||
);
|
||||
}
|
||||
|
||||
public String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
public record InfoOperationalMoneyChangeReport(String id, String docDate, String docTime, String docName,
|
||||
String docType, String clearingHouse, String firmId, String firName,
|
||||
String trdAccId, String account, String currency, String registryCode,
|
||||
String registryName, String openBalance, String changeBalance,
|
||||
String addWithdraw, String closeBalance, String remarks, String addSum,
|
||||
String addTime, String withdrawSum, String withdrawTime) {
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(PeriodParams params) {
|
||||
return "operational_money_change.%s-%s.%s".formatted(
|
||||
dateFormatter.format(params.getStartDate()),
|
||||
dateFormatter.format(params.getEndDate()),
|
||||
dateTimeFormatter.format(LocalDateTime.now())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReportType getReportType() {
|
||||
return ReportType.OPERATIONAL_MONEY_CHANGE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(PeriodParams params) {
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(
|
||||
pb.and(
|
||||
pb.greatEqual("clearingDate", params.getStartDate()),
|
||||
pb.lessEqual("clearingDate", params.getEndDate())
|
||||
)
|
||||
);
|
||||
|
||||
Company clearingHouseCompany = companyImdg.getSingleObjectByID(1L);
|
||||
String clearingHouse = clearingHouseCompany.getFullName();
|
||||
|
||||
Instant now = Instant.now();
|
||||
lines = new ArrayList<>(registries.size());
|
||||
for (Registry registry : registries) {
|
||||
Company company = companyImdg.getSingleObjectByID(registry.getCompanyId());
|
||||
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
|
||||
|
||||
Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", registry.getSecurityId()));
|
||||
Statement statement = statementImdg.getSingleObjectByFieldValues(Map.of("addresseeId", registry.getCompanyId()));
|
||||
PaymentInstruction paymentInstruction = paymentInstructionImdg.getSingleObjectByFieldValues(
|
||||
Map.of(
|
||||
"id", registry.getPaymentId(),
|
||||
"creditLegDirection", InOutDirection.out.getKey()
|
||||
)
|
||||
);
|
||||
|
||||
String id = String.valueOf(registry.getId());
|
||||
String docDate = dateFormatter.format(now);
|
||||
String docTime = timeFormatter.format(now);
|
||||
String docName = "Отчет об изменении суммы денежных средств и (или) количества иного имущества Участника клиринга";
|
||||
String docType = "KS_FIRMID_ASSETS";
|
||||
String firmId = String.valueOf(registry.getCompanyId());
|
||||
String firName = company.getFullName();
|
||||
String trdAccId = registry.getTradingClearingRegistry();
|
||||
String account = String.valueOf(registry.getAccountId()); // todo *
|
||||
String currency = listing.getTradingCurrency(); // todo *
|
||||
String registryCode = String.valueOf(registry.getId());
|
||||
String registryName = registry.getFullName(); // todo *
|
||||
String openBalance = String.valueOf(registry.getOpenBalance());
|
||||
String changeBalance = String.valueOf(registry.getCloseBalance().subtract(registry.getOpenBalance()));
|
||||
String addWithdraw = String.valueOf(registry.getCredit().subtract(registry.getDebit()));
|
||||
String closeBalance = String.valueOf(registry.getCloseBalance());
|
||||
String remarks = "";
|
||||
String addSum = String.valueOf(registry.getCredit());
|
||||
String addTime = dateTimeFormatter.format(statement.getCreated());
|
||||
String withdrawSum = String.valueOf(registry.getDebit());
|
||||
String withdrawTime = dateTimeFormatter.format(paymentInstruction.getPaymentDate());
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = id;
|
||||
line[valueIdx++] = docDate;
|
||||
line[valueIdx++] = docTime;
|
||||
line[valueIdx++] = docName;
|
||||
line[valueIdx++] = docTime;
|
||||
line[valueIdx++] = clearingHouse;
|
||||
line[valueIdx++] = firmId;
|
||||
line[valueIdx++] = firName;
|
||||
line[valueIdx++] = trdAccId;
|
||||
line[valueIdx++] = account;
|
||||
line[valueIdx++] = currency;
|
||||
line[valueIdx++] = registryCode;
|
||||
line[valueIdx++] = registryName;
|
||||
line[valueIdx++] = openBalance;
|
||||
line[valueIdx++] = changeBalance;
|
||||
line[valueIdx++] = addWithdraw;
|
||||
line[valueIdx++] = closeBalance;
|
||||
line[valueIdx++] = remarks;
|
||||
line[valueIdx++] = addSum;
|
||||
line[valueIdx++] = addTime;
|
||||
line[valueIdx++] = withdrawSum;
|
||||
line[valueIdx++] = withdrawTime;
|
||||
lines.add(line);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,39 +1,95 @@
|
|||
package ru.spcex.clearing.reports.reports.bp;
|
||||
|
||||
import ru.spcex.clearing.reports.reports.ReportId;
|
||||
import ru.spcex.clearing.reports.reports.ReportWithPeriod;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionFond;
|
||||
import ru.clearing.classes.statics.data.misc.STrades;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.reports.reports.CSVReportBuilder;
|
||||
import ru.spcex.clearing.reports.reports.SessionIdParam;
|
||||
import ru.spcex.platform.enumeration.Allowed;
|
||||
import ru.spcex.platform.enumeration.ReportType;
|
||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public class UnfulfilledDealReport extends ReportWithPeriod {
|
||||
import java.time.Instant;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class UnfulfilledDealReport extends CSVReportBuilder<SessionIdParam> {
|
||||
private final Imdg<ExecutionFond> executionFondImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<STrades> sTradesImdg;
|
||||
private final String[] headers = {
|
||||
"id", "securityId", "tradeNo", "tradeDate", "settleCode"
|
||||
};
|
||||
private final List<String[]> lines = null;
|
||||
|
||||
public UnfulfilledDealReport(LocalDate startDate, LocalDate endDate) {
|
||||
super(ReportId.UNFULFILLED_DEAL_REPORT,
|
||||
"0.0.1",
|
||||
"BP",
|
||||
"Реестр сделок, принятых на клиринг",
|
||||
startDate,
|
||||
endDate);
|
||||
public UnfulfilledDealReport(ImdgProvider imdgProvider) {
|
||||
executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
||||
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReportName(LocalDateTime reportDateTime) {
|
||||
return "unfulfilled_deal_report.%s-%s.%s".formatted(
|
||||
DATE_FORMATTER.format(startDate),
|
||||
DATE_FORMATTER.format(endDate),
|
||||
DATE_TIME_FORMATTER.format(reportDateTime)
|
||||
);
|
||||
}
|
||||
|
||||
public String[] getHeaders() {
|
||||
return headers;
|
||||
}
|
||||
|
||||
public record InfoUnfulfilledDealReport(String id, String securityId, String tradeNo, String tradeDate, String settleCode) {
|
||||
@Override
|
||||
protected List<String[]> getLines() {
|
||||
return lines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReportFilename(SessionIdParam params) {
|
||||
return "unfulfilled_deal_report.%s".formatted(
|
||||
dateTimeFormatter.format(Instant.now())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReportType getReportType() {
|
||||
return ReportType.UNFULFILLED_DEAL_REPORT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collect(SessionIdParam params) {
|
||||
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
|
||||
ImdgPredicate predicate = pb.and(
|
||||
pb.equals("sessionId", params.getSessionId()),
|
||||
pb.equals("coverageStatus", Allowed.DENIED.getKey())
|
||||
);
|
||||
Collection<ExecutionFond> executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate);
|
||||
|
||||
for (ExecutionFond executionFond : executionFonds) {
|
||||
Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
|
||||
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
|
||||
STrades sTrade = sTradesImdg.getSingleObjectByFieldValues(
|
||||
Map.of(
|
||||
"settleCode", executionFond.getSettlementCode(),
|
||||
"operation", executionFond.getSide()
|
||||
)
|
||||
);
|
||||
|
||||
String id = String.valueOf(executionFond.getId());
|
||||
String securityId = String.valueOf(executionFond.getSecurityId());
|
||||
String tradeNo = String.valueOf(executionFond.getExchangeExecutionId());
|
||||
String tradeDate = dateFormatter.format(executionFond.getTradingDate());
|
||||
String settleCode = sTrade != null ? sTrade.getClassCode() : null;
|
||||
|
||||
int valueIdx = 0;
|
||||
String[] line = new String[getHeaders().length];
|
||||
line[valueIdx++] = id;
|
||||
line[valueIdx++] = securityId;
|
||||
line[valueIdx++] = tradeNo;
|
||||
line[valueIdx++] = tradeDate;
|
||||
line[valueIdx++] = settleCode;
|
||||
lines.add(line);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,9 @@ package ru.spcex.platform.enumeration;
|
|||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
|
||||
public enum Market implements IEnumKey {
|
||||
mkrs("MKRS");
|
||||
mkrs("MKRS"),
|
||||
fond("FOND"),
|
||||
;
|
||||
|
||||
private final String key;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue